From 4042a9bb41cbb0b185274e9859f78f264d980669 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 16 May 2011 11:41:30 -0700 Subject: [PATCH 0001/2207] Update features with WMS support --- features.html | 299 +++++++++++++++++++++++++------------------------- 1 file changed, 150 insertions(+), 149 deletions(-) diff --git a/features.html b/features.html index 53fa9acf9d1..00b78bac39d 100644 --- a/features.html +++ b/features.html @@ -1,150 +1,151 @@ - - - - Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Features - - - - - - - - - - - - - - - - - - - - - - - -
-

Leaflet

-

A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

- - - -

Leaflet features

- -

Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being flexible enough to be easily extended by writing third-party plugins.

- -

- - -

- -
-
-

Available map layers

-
    -
  • Tile layers
  • -
  • Polylines, polygons, circles
  • -
  • Markers
  • -
  • Popups
  • -
  • Image overlays
  • -
  • GeoJSON
  • -
- -

Interaction features

-

On desktop browsers

-
    -
  • Drag panning
  • -
  • Scroll wheel zoom
  • -
  • Double click zoom
  • -
  • Shift-drag zoom to bounding box
  • -
-

On mobile browsers (iOS, Android)

-
    -
  • Touch-drag panning
  • -
  • Multi-touch zoom (iOS only)
  • -
  • Double tap zoom
  • -
  • Panning inertia
  • -
-
- -
-

Visual features

-
    -
  • Panning animation
  • -
  • Zooming animation on modern browsers (except IE)
  • -
  • Smooth continuous zoom on iOS
  • -
  • Tile and popup fade animation
  • -
  • Very nice default design for markers and popups
  • -
- -

Customization features

-
    -
  • Pure CSS3 popups for easy restyling
  • - -
  • A simple interface for implementing custom map layers
  • -
  • The same for custom map controls
  • -
  • Ability to implement custom map projections
  • -
- -

Performance features

-
    -
  • Hardware acceleration on iOS makes it feel as smooth as native apps
  • -
  • Smart polyline/polygon rendering makes it responsive even when displaying objects with thousands of points
  • -
  • Modular build system allows you to reduce the size of the library by leaving out the code you don't need
  • -
-
- -
-

Map controls

-
    -
  • Zoom buttons
  • -
  • Attribution
  • -
  • Zoom slider
  • -
  • Layer switcher
  • - -
- -

Browser support

-

On desktop

-
    -
  • Firefox 3.6+
  • -
  • Chrome
  • -
  • Safari 5+
  • -
  • IE 7–9
  • -
  • IE 6 (not perfect but accessible)
  • -
-

On mobile

-
    -
  • Safari for iOS 3/4+
  • -
  • WebKit for Android 2.2+
  • -
-
-
- -

If you find some feature really missing in Leaflet, please submit it to the issue tracker.

- - -
- -

© 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

-
- - Fork me on GitHub - - - - + + + + Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Features + + + + + + + + + + + + + + + + + + + + + + + +
+

Leaflet

+

A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

+ + + +

Leaflet features

+ +

Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being flexible enough to be easily extended by writing third-party plugins.

+ +

+ + +

+ +
+
+

Available map layers

+
    +
  • Tile layers
  • +
  • Polylines, polygons, circles
  • +
  • Markers
  • +
  • Popups
  • +
  • Image overlays
  • +
  • WMS layers
  • +
  • GeoJSON
  • +
+ +

Interaction features

+

On desktop browsers

+
    +
  • Drag panning
  • +
  • Scroll wheel zoom
  • +
  • Double click zoom
  • +
  • Shift-drag zoom to bounding box
  • +
+

On mobile browsers (iOS, Android)

+
    +
  • Touch-drag panning
  • +
  • Multi-touch zoom (iOS only)
  • +
  • Double tap zoom
  • +
  • Panning inertia
  • +
+
+ +
+

Visual features

+
    +
  • Panning animation
  • +
  • Zooming animation on modern browsers (except IE)
  • +
  • Smooth continuous zoom on iOS
  • +
  • Tile and popup fade animation
  • +
  • Very nice default design for markers and popups
  • +
+ +

Customization features

+
    +
  • Pure CSS3 popups for easy restyling
  • + +
  • A simple interface for implementing custom map layers
  • +
  • The same for custom map controls
  • +
  • Ability to implement custom map projections
  • +
+ +

Performance features

+
    +
  • Hardware acceleration on iOS makes it feel as smooth as native apps
  • +
  • Smart polyline/polygon rendering makes it responsive even when displaying objects with thousands of points
  • +
  • Modular build system allows you to reduce the size of the library by leaving out the code you don't need
  • +
+
+ +
+

Map controls

+
    +
  • Zoom buttons
  • +
  • Attribution
  • +
  • Zoom slider
  • +
  • Layer switcher
  • + +
+ +

Browser support

+

On desktop

+
    +
  • Firefox 3.6+
  • +
  • Chrome
  • +
  • Safari 5+
  • +
  • IE 7–9
  • +
  • IE 6 (not perfect but accessible)
  • +
+

On mobile

+
    +
  • Safari for iOS 3/4+
  • +
  • WebKit for Android 2.2+
  • +
+
+
+ +

If you find some feature really missing in Leaflet, please submit it to the issue tracker.

+ + +
+ +

© 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

+
+ + Fork me on GitHub + + + + \ No newline at end of file From 201d4ca3066bbaf1488cd77afeec2bd9803cb4e5 Mon Sep 17 00:00:00 2001 From: Mourner Date: Wed, 18 May 2011 12:15:05 +0300 Subject: [PATCH 0002/2207] changelog link --- download.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.html b/download.html index 5cfd5421b37..40632b8b7f1 100644 --- a/download.html +++ b/download.html @@ -43,7 +43,7 @@

Download Leaflet

Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system.

-

Download Leaflet edge (zip)

+

Download Leaflet edge (zip) — Changelog

From c8c18fc7790c8abe77850a466290b9039f054269 Mon Sep 17 00:00:00 2001 From: Mourner Date: Wed, 18 May 2011 14:02:56 +0300 Subject: [PATCH 0003/2207] L.Icon documentation --- reference.html | 73 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index d2d03303946..b2db9f7fc5e 100644 --- a/reference.html +++ b/reference.html @@ -82,7 +82,7 @@

Basic types

  • LatLngBounds
  • Point
  • Bounds
  • -
  • Icon
  • +
  • Icon
  • Controls

    @@ -89,22 +91,13 @@

    Controls

  • Zoom
  • Attribution
  • -
    - -
    +

    Utility

    -->
    +
    +

    Interfaces

    + +

    @@ -367,6 +369,11 @@

    Events

    LocationEvent Fired when geolocation (using locate or locateAndSetView method) went successfully. + + locationerror + ErrorEvent + Fired when geolocation (using locate or locateAndSetView method) failed. + @@ -399,17 +406,17 @@

    Methods that modify map state

    Decreases the zoom of the map by 1. - fitBounds( <LatLngBounds> bounds ) + fitBounds( <LatLngBounds> bounds ) this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. - panTo( <LatLng> latlng ) + panTo( <LatLnglatlng ) this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. - panBy( <Point> point ) + panBy( <Pointpoint ) this Pans the map by a given number of pixels (animated). @@ -419,9 +426,18 @@

    Methods that modify map state

    Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. - locate( <Boolean> noAutoFitBounds? ) + locate() + this + Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. + + + locateAndSetView( <Number> maxZoom ) this - Tries to locate the user using Geolocation API and zooms the map if successful, firing locationfound (with location data) or locationerror event. Set noAutoFitBounds to true if you don't want the map view to be set automatically (false by default). + The same as locate method, but it automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). You can optionally specify the maximum zoom of the view. @@ -935,6 +951,77 @@

    Options

    If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. + + + +

    L.TileLayer.WMS

    + +

    Used to display WMS services as tile layers on the map. Extends TileLayer, implements ILayer interface.

    + +

    Usage example

    + +
    var nexrad = new L.TileLayer.WMS("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
    +	layers: 'nexrad-n0r-900913',
    +	format: 'image/png',
    +	transparent: true,
    +	attribution: "Weather data © 2011 IEM Nexrad"
    +});
    + +

    Constructor

    + + + + + + + + + + +
    ConstructorDescription
    L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS optionsoptions )Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    + +

    Options

    + +

    Includes all TileLayer options and additionally:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefault valueDescription
    layersString-(required) Comma-separated list of WMS layers to show.
    stylesStringComma-separated list of WMS styles.
    formatStringimage/jpegWMS image format (use 'image/png' for layers with transparency).
    transparentBooleanfalseIf true, the WMS service will return images with transparency.
    versionString1.1.1Version of the WMS service to use.
    @@ -1146,7 +1233,7 @@

    Constructor

    L.Circle

    -

    A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    +

    A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    Constructor

    @@ -1157,11 +1244,28 @@

    Constructor

    L.Circle( <LatLnglatlng, <Number> radius, <Path optionsoptions? ) - Instantiates a polygon object given an geographical point, a radius in pixels and optionally an options object. + Instantiates a circle object given a geographical point, a radius in meters and optionally an options object. +

    L.CircleMarker

    + +

    A circle of a fixed size with radius specified in pixels. Extends Circe. Use Map#addLayer to add it to the map.

    + +

    Constructor

    + + + + + + + + + + +
    ConstructorDescription
    L.CircleMarker( <LatLnglatlng, <Number> radius, <Path optionsoptions? )Instantiates a circle marker given a geographical point, a radius in pixels and optionally an options object.
    +

    L.LatLng

    @@ -1746,6 +1850,26 @@

    LocationEvent

    +

    ErrorEvent

    + + + + + + + + + + + + + + + + + +
    propertytypedescription
    messageStringError message.
    codeNumberError code (if applicable).
    +

    LayerEvent

    From 41a84e44ea5a270c4d7007978cd6c70045a3e3a3 Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 19 May 2011 17:29:37 +0300 Subject: [PATCH 0007/2207] update geolocation example --- examples/mobile-example.html | 9 ++++++--- examples/mobile.html | 13 ++++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/mobile-example.html b/examples/mobile-example.html index 24ba6f96adb..3bd91670c4b 100644 --- a/examples/mobile-example.html +++ b/examples/mobile-example.html @@ -38,15 +38,18 @@ map.locateAndSetView(); function onLocationFound(e) { + var radius = e.accuracy / 2; + var marker = new L.Marker(e.latlng); map.addLayer(marker); + marker.bindPopup("You are within " + radius + " meters from this point").openPopup(); - marker.bindPopup("You are within " + (e.accuracy/2) + " meters from this point").openPopup(); + var circle = new L.Circle(e.latlng, radius); + map.addLayer(circle); } function onLocationError(e) { - alert("Geolocation error: " + e.message); - map.fitWorld(); + alert(e.message); } diff --git a/examples/mobile.html b/examples/mobile.html index a74472dfd30..d22ee729fdf 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -76,19 +76,23 @@

    Initializing the map

    Geolocation

    -

    Leaflet has a very handy shortcut for zooming the map view to the detected location, replacing the usual setView method in the code:

    +

    Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

    -
    map.locateAndSetView();
    +
    map.locateAndSetView(16);
    -

    Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

    +

    Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

    map.on('locationfound', onLocationFound);
     		
     function onLocationFound(e) {
    +	var radius = e.accuracy / 2;
    +
     	var marker = new L.Marker(e.latlng);
     	map.addLayer(marker);
    +	marker.bindPopup("You are within " + radius + " meters from this point").openPopup();
     	
    -	marker.bindPopup("You are within " + (e.accuracy / 2) + " meters from this point").openPopup();
    +	var circle = new L.Circle(e.latlng, radius);
    +	map.addLayer(circle);	
     }

    Excellent! But it would also be nice to show an error message if the geolocation failed:

    @@ -97,7 +101,6 @@

    Geolocation

    function onLocationError(e) { alert(e.message); - map.fitWorld(); }

    Now the example is complete — try it on your mobile phone: View the full example →

    From e932016bada5279d5309b1b31037c2ede7aa820e Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 19 May 2011 17:39:47 +0300 Subject: [PATCH 0008/2207] map/marker dragstart/drag/dragend event docs --- reference.html | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/reference.html b/reference.html index da7f81504ef..7b6f6aa1774 100644 --- a/reference.html +++ b/reference.html @@ -349,6 +349,21 @@

    Events

    + + + + + + + + + + + + + + + + + + + + + + + +
    Event Fired when the view of the map ends changed (e.g. user stopped dragging the map).
    dragstartEvent + Fired when the user starts dragging the map.
    dragEvent + Fired repeatedly while the user drags the map.
    dragendEvent + Fired when the user stops dragging the map.
    zoomend Event @@ -726,6 +741,21 @@

    Events

    Event Fired when the user double-clicks (or double-taps) the marker.
    dragstartEvent + Fired when the user starts dragging the marker.
    dragEvent + Fired repeatedly while the user drags the marker.
    dragendEvent + Fired when the user stops dragging the marker.

    Methods

    From 2e459e734e9f23bcea1c7f6f527a96aa9c629566 Mon Sep 17 00:00:00 2001 From: Mourner Date: Fri, 20 May 2011 16:37:35 +0300 Subject: [PATCH 0009/2207] add Opera to the list of supported browsers --- features.html | 1 + 1 file changed, 1 insertion(+) diff --git a/features.html b/features.html index 00b78bac39d..2b296ca9264 100644 --- a/features.html +++ b/features.html @@ -121,6 +121,7 @@

    On desktop

  • Firefox 3.6+
  • Chrome
  • Safari 5+
  • +
  • Opera 11.11+
  • IE 7–9
  • IE 6 (not perfect but accessible)
  • From 1c2696eeafb7a5aed7e46d7c8c371f6ff8b57abc Mon Sep 17 00:00:00 2001 From: Mourner Date: Mon, 23 May 2011 12:26:27 +0300 Subject: [PATCH 0010/2207] fix map occasionally breaking while zooming on iOS, fixes #32 --- CHANGELOG.md | 1 + dist/leaflet.js | 8 ++++---- src/map/ext/Map.ZoomAnimation.js | 9 +++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e37063b0d65..37cae1992da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Leaflet Changelog * Improved geolocation error handling: better error messages, explicit timeout, set world view on locateAndSetView failure. [#61](https://github.com/CloudMade/Leaflet/issues/61) * Fixed a bug where paths would not appear in IE8. * Fixed a bug where zooming is broken if the map contains a polygon and you zoom to an area where it's not visible. [#47](https://github.com/CloudMade/Leaflet/issues/47) + * Fixed a bug where map would occasionally break while multi-touch-zooming on iOS. [#32] * Fixed a bug where closed polylines would not appear on the map. * Fixed incorrect zoom animation & popup styling in Opera 11.11. * Fixed a bug where double click zoom wouldn't work if popup is opened on map click diff --git a/dist/leaflet.js b/dist/leaflet.js index d90a9a5eee5..7a4bbb7dac1 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -92,8 +92,8 @@ this._clearTileBgTimer=setTimeout(L.Util.bind(this._clearTileBg,this),500)},_get "timeout";if(this._setViewOnLocate)this.fitWorld(),this._setViewOnLocate=!1;this.fire("locationerror",{code:a,message:"Geolocation error: "+b+"."})},_handleGeolocationResponse:function(a){var b=180*a.coords.accuracy/4E7,c=b*2,d=a.coords.latitude,e=a.coords.longitude,f=new L.LatLng(d-b,e-c);b=new L.LatLng(d+b,e+c);f=new L.LatLngBounds(f,b);if(this._setViewOnLocate)b=Math.min(this.getBoundsZoom(f),this._maxLocateZoom),this.setView(f.getCenter(),b),this._setViewOnLocate=!1;this.fire("locationfound", {latlng:new L.LatLng(d,e),bounds:f,accuracy:a.coords.accuracy})}});L.Map.include({openPopup:function(a){this.closePopup();this._popup=a;return this.addLayer(a)},closePopup:function(){this._popup&&this.removeLayer(this._popup);return this}});L.Map.include(!L.Transition||!L.Transition.implemented()?{}:{setView:function(a,b,c){b=this._limitZoom(b);var d=this._zoom!=b;if(this._loaded&&!c&&this._layers&&(c=this._getNewTopLeftPoint(a).subtract(this._getTopLeftPoint()),d?this._zoomToIfCenterInView&&this._zoomToIfCenterInView(a,b,c):this._panByIfClose(c)))return this;this._resetView(a,b);return this},panBy:function(a){if(!this._panTransition)this._panTransition=new L.Transition(this._mapPane,{duration:0.3}),this._panTransition.on("step",this._onPanTransitionStep, this),this._panTransition.on("end",this._onPanTransitionEnd,this);this.fire(this,"movestart");this._panTransition.run({position:L.DomUtil.getPosition(this._mapPane).subtract(a)});return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){this.fire("moveend")},_panByIfClose:function(a){if(this._offsetIsWithinView(a))return this.panBy(a),!0;return!1},_offsetIsWithinView:function(a,b){var c=b||1,d=this.getSize();return Math.abs(a.x)<=d.x*c&&Math.abs(a.y)<=d.y*c}});L.Map.include(!L.DomUtil.TRANSITION?{}:{_zoomToIfCenterInView:function(a,b,c){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var d=Math.pow(2,b-this._zoom);c=c.divideBy(1-1/d);if(!this._offsetIsWithinView(c,1))return!1;this._mapPane.className+=" leaflet-zoom-anim";c=this.containerPointToLayerPoint(this.getSize().divideBy(2)).add(c);this._prepareTileBg();this._runAnimation(a,b,d,c);return!0},_runAnimation:function(a,b,c,d){this._animatingZoom=!0;this._animateToCenter=a;this._animateToZoom= -b;a=L.DomUtil.TRANSFORM;if(L.Browser.gecko||window.opera)this._tileBg.style[a]+=" translate(0,0)";L.Browser.android?(this._tileBg.style[a+"Origin"]=d.x+"px "+d.y+"px",c="scale("+c+")"):c=L.DomUtil.getScaleString(c,d);L.Util.falseFn(this._tileBg.offsetWidth);d={};d[a]=this._tileBg.style[a]+" "+c;this._tileBg.transition.run(d)},_prepareTileBg:function(){if(!this._tileBg)this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),this._tileBg.style.zIndex=1;var a=this._tilePane,b=this._tileBg;b.innerHTML= -"";b.style[L.DomUtil.TRANSFORM]="";b.style.display="none";b.empty=!0;a.empty=!1;this._tilePane=this._panes.tilePane=b;this._tileBg=a;if(!this._tileBg.transition)this._tileBg.transition=new L.Transition(this._tileBg,{duration:0.3,easing:"cubic-bezier(0.25,0.1,0.25,0.75)"}),this._tileBg.transition.on("end",this._onZoomTransitionEnd,this);this._removeExcessiveBgTiles()},_removeExcessiveBgTiles:function(){for(var a=[].slice.call(this._tileBg.getElementsByTagName("img")),b=this._container.getBoundingClientRect(), -c=0,d=a.length;c=b.right||e.top>=b.bottom||e.bottom<=b.top)a[c].src="",a[c].parentNode.removeChild(a[c])}},_onZoomTransitionEnd:function(){this._restoreTileFront();L.Util.falseFn(this._tileBg.offsetWidth);this._resetView(this._animateToCenter,this._animateToZoom,!0);this._mapPane.className=this._mapPane.className.replace(" leaflet-zoom-anim","");this._animatingZoom=!1},_restoreTileFront:function(){this._tilePane.style.display= -"";this._tilePane.style.zIndex=2;this._tileBg.style.zIndex=1},_clearTileBg:function(){if(!this._animatingZoom)this._tileBg.innerHTML=""}});L.Map.include({addControl:function(a){a.onAdd(this);var b=a.getPosition(),c=this._controlCorners[b];a=a.getContainer();L.DomUtil.addClass(a,"leaflet-control");b.indexOf("bottom")!=-1?c.insertBefore(a,c.firstChild):c.appendChild(a);return this},removeControl:function(){var a=this._controlCorners[control.getPosition()],b=control.getContainer();a.removeChild(b);if(control.onRemove)control.onRemove(this);return this},_initControlPos:function(){var a=this._controlCorners={},b=L.DomUtil.create("div","leaflet-control-container", +b;a=L.DomUtil.TRANSFORM;if(L.Browser.gecko||window.opera)this._tileBg.style[a]+=" translate(0,0)";L.Browser.android?(this._tileBg.style[a+"Origin"]=d.x+"px "+d.y+"px",c="scale("+c+")"):c=L.DomUtil.getScaleString(c,d);L.Util.falseFn(this._tileBg.offsetWidth);d={};d[a]=this._tileBg.style[a]+" "+c;this._tileBg.transition.run(d)},_prepareTileBg:function(){if(!this._tileBg)this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),this._tileBg.style.zIndex=1;var a=this._tilePane,b=this._tileBg;b.style[L.DomUtil.TRANSFORM]= +"";b.style.visibility="hidden";b.empty=!0;a.empty=!1;this._tilePane=this._panes.tilePane=b;this._tileBg=a;if(!this._tileBg.transition)this._tileBg.transition=new L.Transition(this._tileBg,{duration:0.3,easing:"cubic-bezier(0.25,0.1,0.25,0.75)"}),this._tileBg.transition.on("end",this._onZoomTransitionEnd,this);this._removeExcessiveBgTiles()},_removeExcessiveBgTiles:function(){for(var a=[].slice.call(this._tileBg.getElementsByTagName("img")),b=this._container.getBoundingClientRect(),c=0,d=a.length;c< +d;c++){var e=a[c].getBoundingClientRect();if(!a[c].complete||e.right<=b.left||e.left>=b.right||e.top>=b.bottom||e.bottom<=b.top)a[c].src="",a[c].parentNode.removeChild(a[c])}},_onZoomTransitionEnd:function(){this._restoreTileFront();L.Util.falseFn(this._tileBg.offsetWidth);this._resetView(this._animateToCenter,this._animateToZoom,!0);this._mapPane.className=this._mapPane.className.replace(" leaflet-zoom-anim","");this._animatingZoom=!1},_restoreTileFront:function(){this._tilePane.innerHTML="";this._tilePane.style.visibility= +"";this._tilePane.style.zIndex=2;this._tileBg.style.zIndex=1},_clearTileBg:function(){if(!this._animatingZoom&&!this.touchZoom._zooming)this._tileBg.innerHTML=""}});L.Map.include({addControl:function(a){a.onAdd(this);var b=a.getPosition(),c=this._controlCorners[b];a=a.getContainer();L.DomUtil.addClass(a,"leaflet-control");b.indexOf("bottom")!=-1?c.insertBefore(a,c.firstChild):c.appendChild(a);return this},removeControl:function(){var a=this._controlCorners[control.getPosition()],b=control.getContainer();a.removeChild(b);if(control.onRemove)control.onRemove(this);return this},_initControlPos:function(){var a=this._controlCorners={},b=L.DomUtil.create("div","leaflet-control-container", this._container);L.Browser.mobileWebkit&&(b.className+=" leaflet-big-buttons");a.topLeft=L.DomUtil.create("div","leaflet-top leaflet-left",b);a.topRight=L.DomUtil.create("div","leaflet-top leaflet-right",b);a.bottomLeft=L.DomUtil.create("div","leaflet-bottom leaflet-left",b);a.bottomRight=L.DomUtil.create("div","leaflet-bottom leaflet-right",b)}}); diff --git a/src/map/ext/Map.ZoomAnimation.js b/src/map/ext/Map.ZoomAnimation.js index 5b0f1b3a51f..0d0e0112f32 100644 --- a/src/map/ext/Map.ZoomAnimation.js +++ b/src/map/ext/Map.ZoomAnimation.js @@ -66,9 +66,9 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : { tileBg = this._tileBg; // prepare the background pane to become the main tile pane - tileBg.innerHTML = ''; + //tileBg.innerHTML = ''; tileBg.style[L.DomUtil.TRANSFORM] = ''; - tileBg.style.display = 'none'; + tileBg.style.visibility = 'hidden'; // tells tile layers to reinitialize their containers tileBg.empty = true; @@ -118,13 +118,14 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : { }, _restoreTileFront: function() { - this._tilePane.style.display = ''; + this._tilePane.innerHTML = ''; + this._tilePane.style.visibility = ''; this._tilePane.style.zIndex = 2; this._tileBg.style.zIndex = 1; }, _clearTileBg: function() { - if (!this._animatingZoom) { + if (!this._animatingZoom && !this.touchZoom._zooming) { this._tileBg.innerHTML = ''; } } From 0221151957c8ac0a6d24e209528962fddd7b404d Mon Sep 17 00:00:00 2001 From: Mourner Date: Wed, 25 May 2011 19:11:45 +0300 Subject: [PATCH 0011/2207] new polyline methods docs --- reference.html | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 7b6f6aa1774..255af9b21f7 100644 --- a/reference.html +++ b/reference.html @@ -1240,12 +1240,38 @@

    Options

    false Disabled polyline clipping. + + +

    Methods

    + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addLatLng( <LatLnglatlng )thisAdds a given point to the polyline.
    setLatLngs( <LatLng[]> latlngs )thisReplaces all the points in the polyline with the given array of geographical points.
    spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLnglatlng1?, <LatLnglatlng2?, … )LatLng[]Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any).
    +

    L.Polygon

    -

    A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

    +

    A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

    Constructor

    @@ -1260,6 +1286,8 @@

    Constructor

    +

    Polygon the same options and methods as Polyline.

    +

    L.Circle

    From 716c5d1727bc9a018f0cd158b17855576b563e4b Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 26 May 2011 11:58:58 +0300 Subject: [PATCH 0012/2207] update bounds/latlngbounds docs --- reference.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reference.html b/reference.html index 255af9b21f7..c7d6dbdcb2e 100644 --- a/reference.html +++ b/reference.html @@ -1482,6 +1482,11 @@

    Methods

    Boolean Returns true if the rectangle contains the given one. + + contains( <LatLnglatlng ) + Boolean + Returns true if the rectangle contains the given point. + @@ -1643,6 +1648,11 @@

    Methods

    Boolean Returns true if the rectangle contains the given one. + + contains( <Pointpoint ) + Boolean + Returns true if the rectangle contains the given point. + From d8b008148a878aea90ab913eb285a71cde1b53b3 Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 26 May 2011 12:03:29 +0300 Subject: [PATCH 0013/2207] Marker setLatLng docs --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index c7d6dbdcb2e..d4530ba0692 100644 --- a/reference.html +++ b/reference.html @@ -771,6 +771,11 @@

    Methods

    LatLng Returns the current geographical position of the marker. + + setLatLng(<LatLnglatlng ) + this + Changes the marker position to the given point. + bindPopup( <String> htmlContent, <Popup optionsoptions? ) this From df3bd4f3dc338deef9a34f494bd7fda17e30e7ea Mon Sep 17 00:00:00 2001 From: Mourner Date: Mon, 30 May 2011 15:13:43 +0300 Subject: [PATCH 0014/2207] TileLayer.Canvas docs --- reference.html | 51 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index d4530ba0692..ad6e95de7e7 100644 --- a/reference.html +++ b/reference.html @@ -66,6 +66,7 @@

    Raster layers

    Vector layers

    @@ -973,6 +974,12 @@

    Options

    '' e.g. "© CloudMade" — the string used by the attribution control, describes the layer data. + + scheme + String + 'xyz' + Either 'xyz' or 'tms', affects tile numbering (TMS servers use inverse Y axis numbering). + unloadInvisibleTiles Boolean @@ -1057,7 +1064,49 @@

    Options

    Version of the WMS service to use. - + + + +

    L.TileLayer.Canvas

    + +

    Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer, implements ILayer interface.

    + +

    Usage example

    + +
    var canvasTiles = new L.TileLayer.Canvas();
    +		
    +canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
    +	var ctx = canvas.getContext('2d');
    +	// draw something on the tile canvas
    +}
    + +

    Constructor

    + + + + + + + + + + +
    ConstructorDescription
    L.TileLayer.Canvas( <TileLayer optionsoptions? )Instantiates a Canvas tile layer object given an options object (optionally).
    + +

    Methods

    + + + + + + + + + + + + +
    MethodReturnsDescription
    drawTile( <HTMLCanvasElement> canvas, <PointtilePoint, <Number> zoom )thisYou need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom.

    L.ImageOverlay

    From 46545bd93c7678e4df8c0ddb5478a95d66af6c0c Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 31 May 2011 00:51:48 +0300 Subject: [PATCH 0015/2207] crs option --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index d2d03303946..3be75ea1440 100644 --- a/reference.html +++ b/reference.html @@ -192,6 +192,12 @@

    Options

    [] Layers that will be added to the map initially. + + crs + L.CRS.* + new L.CRS.EPSG3857() + Coordinate Reference System to use. Don't change this if you're not sure what it means. Currently supported: EPSG:3587 (Spherical Mercator), EPSG:4326 (Plate Carree). + dragging Boolean From 357273d95264b5a36f4eb98c361d1240ce6fc145 Mon Sep 17 00:00:00 2001 From: Mourner Date: Tue, 31 May 2011 12:45:36 +0300 Subject: [PATCH 0016/2207] CRS docs --- reference.html | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 12514db7a2e..d6c958024a5 100644 --- a/reference.html +++ b/reference.html @@ -197,9 +197,9 @@

    Options

    crs - L.CRS.* - new L.CRS.EPSG3857() - Coordinate Reference System to use. Don't change this if you're not sure what it means. Currently supported: EPSG:3587 (Spherical Mercator), EPSG:4326 (Plate Carree). + CRS + L.CRS.EPSG3857 + Coordinate Reference System to use. Don't change this if you're not sure what it means. dragging @@ -399,6 +399,30 @@

    Events

    +

    Projections

    + +

    You can specify different CRS for map to use through its crs option. Here's the list of available CRS:

    + + + + + + + + + + + + + + + + + + +
    CRSData
    L.CRS.EPSG3857EPSG:3857 (Spherical Mercator), used by most of commercial map providers (CloudMade, Google, Yahoo, Bing, etc.).
    L.CRS.EPSG4326EPSG:4326 (Plate Carree), very popular among GIS enthusiasts.
    L.CRS.EPSG3395EPSG:4326 (Mercator), used by some map providers.
    + +

    Methods that modify map state

    From 87ab22177c46985d646fafaf027280e6f3043028 Mon Sep 17 00:00:00 2001 From: Mourner Date: Tue, 31 May 2011 12:48:02 +0300 Subject: [PATCH 0017/2207] update CRS docs --- reference.html | 100 ++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/reference.html b/reference.html index d6c958024a5..b3a2b03ca33 100644 --- a/reference.html +++ b/reference.html @@ -46,6 +46,8 @@

    Map

  • Options
  • Properties
  • Events
  • +
  • Projections
  • +
  • Panes
  • Map methods

      @@ -197,7 +199,7 @@

      Options

    - + @@ -399,7 +401,7 @@

    Events

    crsCRSCRS L.CRS.EPSG3857 Coordinate Reference System to use. Don't change this if you're not sure what it means.
    -

    Projections

    +

    Projections

    You can specify different CRS for map to use through its crs option. Here's the list of available CRS:

    @@ -423,6 +425,55 @@

    Projections

    +

    Map panes

    + +

    An object literal that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    mapPaneHTMLElementPane that contains all other map panes.
    tilePaneHTMLElementPane for tile layers.
    objectsPaneHTMLElementPane that contains all the panes except tile pane.
    shadowPaneHTMLElementPane for overlay shadows (e.g. marker shadows).
    overlayPaneHTMLElementPane for overlays like polylines and polygons.
    markerPaneHTMLElementPane for marker icons.
    popupPaneHTMLElementPane for popups.
    + + +

    Methods that modify map state

    @@ -654,52 +705,7 @@

    Other methods

    -

    Map panes

    - -

    An object literal that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyTypeDescription
    mapPaneHTMLElementPane that contains all other map panes.
    tilePaneHTMLElementPane for tile layers.
    objectsPaneHTMLElementPane that contains all the panes except tile pane.
    shadowPaneHTMLElementPane for overlay shadows (e.g. marker shadows).
    overlayPaneHTMLElementPane for overlays like polylines and polygons.
    markerPaneHTMLElementPane for marker icons.
    popupPaneHTMLElementPane for popups.

    L.Marker

    From 8ec5cff4e13ee3b7848e788b31ba879a693c8ad8 Mon Sep 17 00:00:00 2001 From: Mourner Date: Wed, 1 Jun 2011 16:50:18 +0300 Subject: [PATCH 0018/2207] fix typo --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 42a97dc19c7..df9412fb8ba 100644 --- a/index.html +++ b/index.html @@ -70,7 +70,7 @@

    Basic usage example

    // create a CloudMade tile layer
     var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
     	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
    -	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution}),
    +	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
     
     // initialize the map on the "map" div
     var map = new L.Map('map');
    
    From e447bbb12586879d6e3a06872522bf3863092d38 Mon Sep 17 00:00:00 2001
    From: Mourner 
    Date: Tue, 7 Jun 2011 16:27:12 +0300
    Subject: [PATCH 0019/2207] fix non-async canvas tile layers
    
    ---
     dist/leaflet.js                    | 2 +-
     src/layer/tile/TileLayer.Canvas.js | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/dist/leaflet.js b/dist/leaflet.js
    index 13c5a1bc41d..d9e141da6b3 100644
    --- a/dist/leaflet.js
    +++ b/dist/leaflet.js
    @@ -42,7 +42,7 @@ b)),c=new L.Bounds(c,a);this._addTilesFromCenterOut(c);this.options.unloadInvisi
     _getTilePos:function(a){var b=this._map.getPixelOrigin();return a.multiplyBy(this.options.tileSize).subtract(b)},getTileUrl:function(a,b){return this._url.replace("{s}",this.options.subdomains[(a.x+a.y)%this.options.subdomains.length]).replace("{z}",b).replace("{x}",a.x).replace("{y}",a.y)},_createTileProto:function(){this._tileImg=L.DomUtil.create("img","leaflet-tile");this._tileImg.galleryimg="no";var a=this.options.tileSize;this._tileImg.style.width=a+"px";this._tileImg.style.height=a+"px"},_createTile:function(){var a=
     this._tileImg.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;a.onload=this._tileOnLoad;a.onerror=this._tileOnError;a.src=this.getTileUrl(b,c)},_tileOnLoad:function(){var a=this._layer;this.className+=" leaflet-tile-loaded";a.fire("tileload",{tile:this,url:this.src});a._tilesToLoad--;a._tilesToLoad||a.fire("load")},_tileOnError:function(){var a=this._layer;a.fire("tileerror",{tile:this,url:this.src});if(a=a.options.errorTileUrl)this.src=
     a}});L.TileLayer.WMS=L.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(a,b){this._url=a;this.wmsParams=L.Util.extend({},this.defaultWmsParams);this.wmsParams.width=this.wmsParams.height=this.options.tileSize;for(var c in b)this.options.hasOwnProperty(c)||(this.wmsParams[c]=b[c]);L.Util.setOptions(this,b)},onAdd:function(a){this.wmsParams[parseFloat(this.wmsParams.version)>=1.3?"crs":"srs"]=a.options.crs.code;
    -L.TileLayer.prototype.onAdd.call(this,a)},getTileUrl:function(a){var b=this.options.tileSize,a=a.multiplyBy(b),b=a.add(new L.Point(b,b)),a=this._map.unproject(a,this._zoom,!0),b=this._map.unproject(b,this._zoom,!0),a=this._map.options.crs.project(a),b=this._map.options.crs.project(b),b=[a.x,b.y,b.x,a.y].join(",");return this._url+L.Util.getParamString(this.wmsParams)+"&bbox="+b}});L.TileLayer.Canvas=L.TileLayer.extend({options:{async:!1},initialize:function(a){L.Util.setOptions(this,a)},_createTileProto:function(){this._canvasProto=L.DomUtil.create("canvas","leaflet-tile");var a=this.options.tileSize;this._canvasProto.width=a;this._canvasProto.height=a},_createTile:function(){var a=this._canvasProto.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;this.drawTile(a,b,c);this.options.async||this.tileDrawn()},drawTile:function(){},
    +L.TileLayer.prototype.onAdd.call(this,a)},getTileUrl:function(a){var b=this.options.tileSize,a=a.multiplyBy(b),b=a.add(new L.Point(b,b)),a=this._map.unproject(a,this._zoom,!0),b=this._map.unproject(b,this._zoom,!0),a=this._map.options.crs.project(a),b=this._map.options.crs.project(b),b=[a.x,b.y,b.x,a.y].join(",");return this._url+L.Util.getParamString(this.wmsParams)+"&bbox="+b}});L.TileLayer.Canvas=L.TileLayer.extend({options:{async:!1},initialize:function(a){L.Util.setOptions(this,a)},_createTileProto:function(){this._canvasProto=L.DomUtil.create("canvas","leaflet-tile");var a=this.options.tileSize;this._canvasProto.width=a;this._canvasProto.height=a},_createTile:function(){var a=this._canvasProto.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;this.drawTile(a,b,c);this.options.async||this.tileDrawn(a)},drawTile:function(){},
     tileDrawn:function(a){this._tileOnLoad.call(a)}});L.ImageOverlay=L.Class.extend({includes:L.Mixin.Events,initialize:function(a,b){this._url=a;this._bounds=b},onAdd:function(a){this._map=a;this._image||this._initImage();a.getPanes().overlayPane.appendChild(this._image);a.on("viewreset",this._reset,this);this._reset()},onRemove:function(a){a.getPanes().overlayPane.removeChild(this._image);a.off("viewreset",this._reset,this)},_initImage:function(){this._image=L.DomUtil.create("img","leaflet-image-layer");this._image.style.visibility="hidden";L.Util.extend(this._image,
     {galleryimg:"no",onselectstart:L.Util.falseFn,onmousemove:L.Util.falseFn,onload:this._onImageLoad,src:this._url})},_reset:function(){var a=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),b=this._map.latLngToLayerPoint(this._bounds.getSouthEast()).subtract(a);L.DomUtil.setPosition(this._image,a);this._image.style.width=b.x+"px";this._image.style.height=b.y+"px"},_onImageLoad:function(){this.style.visibility=""}});L.Popup=L.Class.extend({includes:L.Mixin.Events,options:{maxWidth:300,autoPan:!0,closeButton:!0,offset:new L.Point(0,2),autoPanPadding:new L.Point(5,5)},initialize:function(a){L.Util.setOptions(this,a)},onAdd:function(a){this._map=a;this._container||this._initLayout();this._updateContent();this._container.style.opacity="0";this._map._panes.popupPane.appendChild(this._container);this._map.on("viewreset",this._updatePosition,this);if(this._map.options.closePopupOnClick)this._map.on("preclick",this._close,
     this);this._update();this._container.style.opacity="1";this._opened=!0},onRemove:function(a){a._panes.popupPane.removeChild(this._container);a.off("viewreset",this._updatePosition,this);a.off("click",this._close,this);this._container.style.opacity="0";this._opened=!1},setLatLng:function(a){this._latlng=a;this._opened&&this._update();return this},setContent:function(a){this._content=a;this._opened&&this._update();return this},_close:function(){this._opened&&this._map.removeLayer(this)},_initLayout:function(){this._container=
    diff --git a/src/layer/tile/TileLayer.Canvas.js b/src/layer/tile/TileLayer.Canvas.js
    index d714215786a..08bbaae2534 100644
    --- a/src/layer/tile/TileLayer.Canvas.js
    +++ b/src/layer/tile/TileLayer.Canvas.js
    @@ -27,7 +27,7 @@ L.TileLayer.Canvas = L.TileLayer.extend({
     		this.drawTile(tile, tilePoint, zoom);
     		
     		if (!this.options.async) {
    -			this.tileDrawn();
    +			this.tileDrawn(tile);
     		}
     	},
     	
    
    From 5d2c204cc4687f24bd6f428120d81d3fa16aaf0e Mon Sep 17 00:00:00 2001
    From: Mourner 
    Date: Wed, 8 Jun 2011 15:48:34 +0300
    Subject: [PATCH 0020/2207] update link in copyright notice
    
    ---
     src/Leaflet.js | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/src/Leaflet.js b/src/Leaflet.js
    index bbdd3b86c12..aef4136d802 100644
    --- a/src/Leaflet.js
    +++ b/src/Leaflet.js
    @@ -1,7 +1,7 @@
     /**
      * @preserve Copyright (c) 2010-2011, CloudMade, Vladimir Agafonkin
    - * Leaflet is a BSD-licensed JavaScript library for map display and interaction.
    - * See http://cloudmade.github.com/Leaflet/ for more information.
    + * Leaflet is a modern BSD-licensed JavaScript library for interactive maps. 
    + * See http://leaflet.cloudmade.com for more information.
      */
     
     var L = {
    
    From 50c7e92e091fb9629c3c0294df6805cf872abc74 Mon Sep 17 00:00:00 2001
    From: Mourner 
    Date: Wed, 8 Jun 2011 19:32:14 +0300
    Subject: [PATCH 0021/2207] fix webkit memory leak, closes #107
    
    ---
     dist/leaflet.js             | 6 +++---
     src/layer/tile/TileLayer.js | 1 +
     2 files changed, 4 insertions(+), 3 deletions(-)
    
    diff --git a/dist/leaflet.js b/dist/leaflet.js
    index d9e141da6b3..29cf42af91b 100644
    --- a/dist/leaflet.js
    +++ b/dist/leaflet.js
    @@ -1,7 +1,7 @@
     /*
      Copyright (c) 2010-2011, CloudMade, Vladimir Agafonkin
    - Leaflet is a BSD-licensed JavaScript library for map display and interaction.
    - See http://cloudmade.github.com/Leaflet/ for more information.
    + Leaflet is a modern BSD-licensed JavaScript library for interactive maps. 
    + See http://leaflet.cloudmade.com for more information.
     */
     var L={VERSION:"0.2",ROOT_URL:function(){for(var a=document.getElementsByTagName("script"),b=/^(.*\/)leaflet-?([\w-]*)\.js.*$/,c=0,d=a.length;c1.0E-7&&--h>0;)i=f*Math.sin(g)
     this._reset,this);if(this.options.updateWhenIdle)a.on("moveend",this._update,this);else this._limitedUpdate=L.Util.limitExecByInterval(this._update,100,this),a.on("move",this._limitedUpdate,this);this._reset();this._update()},onRemove:function(){this._map.getPanes().tilePane.removeChild(this._container);this._container=null;this._map.off("viewreset",this._reset,this);this.options.updateWhenIdle?this._map.off("moveend",this._update,this):this._map.off("move",this._limitedUpdate,this)},getAttribution:function(){return this.options.attribution},
     _initContainer:function(){var a=this._map.getPanes().tilePane;if(!this._container||a.empty)this._container=L.DomUtil.create("div","leaflet-layer",a),this.options.opacity<1&&L.DomUtil.setOpacity(this._container,this.options.opacity)},_reset:function(){this._tiles={};this._initContainer();this._container.innerHTML=""},_update:function(){var a=this._map.getPixelBounds(),b=this.options.tileSize,c=new L.Point(Math.floor(a.min.x/b),Math.floor(a.min.y/b)),a=new L.Point(Math.floor(a.max.x/b),Math.floor(a.max.y/
     b)),c=new L.Bounds(c,a);this._addTilesFromCenterOut(c);this.options.unloadInvisibleTiles&&this._removeOtherTiles(c)},_addTilesFromCenterOut:function(a){for(var b=[],c=a.getCenter(),d=a.min.y;d<=a.max.y;d++)for(var e=a.min.x;e<=a.max.x;e++)e+":"+d in this._tiles||b.push(new L.Point(e,d));b.sort(function(a,b){return a.distanceTo(c)-b.distanceTo(c)});this._tilesToLoad=b.length;a=0;for(d=this._tilesToLoad;aa.max.x||ba.max.y))this._tiles[d].parentNode==this._container&&this._container.removeChild(this._tiles[d]),delete this._tiles[d]},_addTile:function(a){var b=this._getTilePos(a),c=this._map.getZoom(),d=a.x+":"+a.y,e=1<=e)){var f=this._createTile();L.DomUtil.setPosition(f,b);this._tiles[d]=f;if(this.options.scheme=="tms")a.y=e-a.y-1;this._loadTile(f,a,c);this._container.appendChild(f)}},
    +(b=d.split(":"),c=parseInt(b[0],10),b=parseInt(b[1],10),ca.max.x||ba.max.y))this._tiles[d].src="",this._tiles[d].parentNode==this._container&&this._container.removeChild(this._tiles[d]),delete this._tiles[d]},_addTile:function(a){var b=this._getTilePos(a),c=this._map.getZoom(),d=a.x+":"+a.y,e=1<=e)){var f=this._createTile();L.DomUtil.setPosition(f,b);this._tiles[d]=f;if(this.options.scheme=="tms")a.y=e-a.y-1;this._loadTile(f,a,c);this._container.appendChild(f)}},
     _getTilePos:function(a){var b=this._map.getPixelOrigin();return a.multiplyBy(this.options.tileSize).subtract(b)},getTileUrl:function(a,b){return this._url.replace("{s}",this.options.subdomains[(a.x+a.y)%this.options.subdomains.length]).replace("{z}",b).replace("{x}",a.x).replace("{y}",a.y)},_createTileProto:function(){this._tileImg=L.DomUtil.create("img","leaflet-tile");this._tileImg.galleryimg="no";var a=this.options.tileSize;this._tileImg.style.width=a+"px";this._tileImg.style.height=a+"px"},_createTile:function(){var a=
     this._tileImg.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;a.onload=this._tileOnLoad;a.onerror=this._tileOnError;a.src=this.getTileUrl(b,c)},_tileOnLoad:function(){var a=this._layer;this.className+=" leaflet-tile-loaded";a.fire("tileload",{tile:this,url:this.src});a._tilesToLoad--;a._tilesToLoad||a.fire("load")},_tileOnError:function(){var a=this._layer;a.fire("tileerror",{tile:this,url:this.src});if(a=a.options.errorTileUrl)this.src=
     a}});L.TileLayer.WMS=L.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(a,b){this._url=a;this.wmsParams=L.Util.extend({},this.defaultWmsParams);this.wmsParams.width=this.wmsParams.height=this.options.tileSize;for(var c in b)this.options.hasOwnProperty(c)||(this.wmsParams[c]=b[c]);L.Util.setOptions(this,b)},onAdd:function(a){this.wmsParams[parseFloat(this.wmsParams.version)>=1.3?"crs":"srs"]=a.options.crs.code;
    diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js
    index bf8ef8e5093..db3ae3f44ae 100644
    --- a/src/layer/tile/TileLayer.js
    +++ b/src/layer/tile/TileLayer.js
    @@ -139,6 +139,7 @@ L.TileLayer = L.Class.extend({
     				
     				// remove tile if it's out of bounds
     				if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {
    +					this._tiles[key].src = '';
     					if (this._tiles[key].parentNode == this._container) {
     						this._container.removeChild(this._tiles[key]);
     					}
    
    From 7081349c626c9a168b50fbe3f8b808a82bb1655e Mon Sep 17 00:00:00 2001
    From: Mourner 
    Date: Wed, 8 Jun 2011 19:34:11 +0300
    Subject: [PATCH 0022/2207] update changelog
    
    ---
     CHANGELOG.md | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index b1f0a18c341..b9e1cf51e89 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -40,6 +40,7 @@ Leaflet Changelog
      * Fixed a bug where map div with `position: absolute` is reset to `relative`. [#100](https://github.com/CloudMade/Leaflet/issues/100) 
      * Fixed a bug that caused an error when trying to add a marker without shadow in its icon.
      * Fixed a bug where popup content would not update on `setContent` call. [#94](https://github.com/CloudMade/Leaflet/issues/94)
    + * Fixed memory leak in webkit when unloading tiles, thanks to [@Scalar4eg](https://github.com/Scalar4eg). [#107](https://github.com/CloudMade/Leaflet/issues/107)
      * Fixed incorrect zoom animation & popup styling in Opera 11.11.
      * Fixed a bug where double click zoom wouldn't work if popup is opened on map click
      * Fixed a bug with click propagation on popup close button. [#99](https://github.com/CloudMade/Leaflet/issues/99)
    
    From e0313befea6a42cd50195f4661f029f583fb1946 Mon Sep 17 00:00:00 2001
    From: mourner 
    Date: Fri, 10 Jun 2011 20:22:44 +0300
    Subject: [PATCH 0023/2207] placeholders for docs
    
    ---
     reference.html | 19 +++++++++++++++++--
     1 file changed, 17 insertions(+), 2 deletions(-)
    
    diff --git a/reference.html b/reference.html
    index b3a2b03ca33..9a4bd77ad4b 100644
    --- a/reference.html
    +++ b/reference.html
    @@ -75,12 +75,20 @@ 

    Vector layers

    +

    Other layers

    +

    Basic types

    +
    + -

    Utility

    From da6204c8cfbc346cdb44ca7585c25f40ffe53a22 Mon Sep 17 00:00:00 2001 From: mourner Date: Fri, 10 Jun 2011 22:02:00 +0300 Subject: [PATCH 0024/2207] multipolyline and multipolygon docs --- reference.html | 66 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/reference.html b/reference.html index 9a4bd77ad4b..abe4ebcc420 100644 --- a/reference.html +++ b/reference.html @@ -75,9 +75,9 @@

    Vector layers

    @@ -1294,10 +1294,24 @@

    Constants

    +

    Methods

    + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup( <String> htmlContent, <Popup optionsoptions? )thisBinds a popup with a particular HTML content to a click on this path.
    +

    L.Polyline

    -

    A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    +

    A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    Usage example

    // create a red polyline from an arrays of LatLng points
    @@ -1349,6 +1363,8 @@ 

    Options

    Methods

    +

    You can use Path methods and additionally the following methods:

    + @@ -1374,6 +1390,25 @@

    Methods

    +

    L.MultiPolyline

    + +

    Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

    + +

    Constructor

    + +
    Method
    + + + + + + + + +
    ConstructorDescription
    L.MultiPolyline( <LatLng[][]> latlngs, <Polyline optionsoptions? )Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
    + + +

    L.Polygon

    A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

    @@ -1386,14 +1421,35 @@

    Constructor

    Description - L.Polygon( <LatLng[]> latlngs, <Polyline optionsoptions? ) - Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). + L.Polygon( <LatLng[]> latlngs, <Polyline optionsoptions? ) + Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.

    Polygon the same options and methods as Polyline.

    + +

    L.MultiPolygon

    + +

    Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

    + +

    Constructor

    + + + + + + + + + + +
    ConstructorDescription
    L.MultiPolygon( <LatLng[][]> latlngs, <Polyline optionsoptions? )Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
    + + + +

    L.Circle

    A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    From b6e222f815aa6bac9766228f5415a992729e013a Mon Sep 17 00:00:00 2001 From: mourner Date: Mon, 13 Jun 2011 22:15:43 +0300 Subject: [PATCH 0025/2207] Fixed regression related to global map variable, closes #117 --- dist/leaflet.js | 2 +- src/layer/marker/Marker.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/leaflet.js b/dist/leaflet.js index 13115fab244..9bb3cc38966 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -54,7 +54,7 @@ this._container);this._tip=L.DomUtil.create("div","leaflet-popup-tip",this._tipC "px";this._container.style.left=this._containerLeft+"px"},_adjustPan:function(){if(this.options.autoPan){var a=this._container.offsetHeight,b=this._map.layerPointToContainerPoint(new L.Point(this._containerLeft,-a-this._containerBottom)),c=new L.Point(0,0),d=this.options.autoPanPadding,e=this._map.getSize();if(b.x<0)c.x=b.x-d.x;if(b.x+this._containerWidth>e.x)c.x=b.x+this._containerWidth-e.x+d.x;if(b.y<0)c.y=b.y-d.y;if(b.y+a>e.y)c.y=b.y+a-e.y+d.y;(c.x||c.y)&&this._map.panBy(c)}},_onCloseButtonClick:function(a){this._close(); L.DomEvent.stop(a)}});L.Icon=L.Class.extend({iconUrl:L.ROOT_URL+"images/marker.png",shadowUrl:L.ROOT_URL+"images/marker-shadow.png",iconSize:new L.Point(25,41),shadowSize:new L.Point(41,41),iconAnchor:new L.Point(13,41),popupAnchor:new L.Point(0,-33),initialize:function(a){if(a)this.iconUrl=a},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(a){var b=this[a+"Size"],c=this[a+"Url"],d=this._createImg(c);if(!c)return null;d.className="leaflet-marker-"+ a;d.style.marginLeft=-this.iconAnchor.x+"px";d.style.marginTop=-this.iconAnchor.y+"px";if(b)d.style.width=b.x+"px",d.style.height=b.y+"px";return d},_createImg:function(a){var b;L.Browser.ie6?(b=document.createElement("div"),b.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+a+'")'):(b=document.createElement("img"),b.src=a);return b}});L.Marker=L.Class.extend({includes:L.Mixin.Events,options:{icon:new L.Icon,title:"",clickable:!0,draggable:!1},initialize:function(a,b){L.Util.setOptions(this,b);this._latlng=a},onAdd:function(a){this._map=a;this._initIcon();a.on("viewreset",this._reset,this);this._reset()},onRemove:function(a){this._removeIcon();a.off("viewreset",this._reset,this)},getLatLng:function(){return this._latlng},setLatLng:function(a){this._latlng=a;this._reset()},setIcon:function(a){this._removeIcon();this._icon=this._shadow= -null;this.options.icon=a;this._initIcon()},_initIcon:function(){if(!this._icon){this._icon=this.options.icon.createIcon();if(this.options.title)this._icon.title=this.options.title;this._initInteraction()}if(!this._shadow)this._shadow=this.options.icon.createShadow();map._panes.markerPane.appendChild(this._icon);this._shadow&&map._panes.shadowPane.appendChild(this._shadow)},_removeIcon:function(){map._panes.markerPane.removeChild(this._icon);this._shadow&&map._panes.shadowPane.removeChild(this._shadow)}, +null;this.options.icon=a;this._initIcon()},_initIcon:function(){if(!this._icon){this._icon=this.options.icon.createIcon();if(this.options.title)this._icon.title=this.options.title;this._initInteraction()}if(!this._shadow)this._shadow=this.options.icon.createShadow();this._map._panes.markerPane.appendChild(this._icon);this._shadow&&this._map._panes.shadowPane.appendChild(this._shadow)},_removeIcon:function(){map._panes.markerPane.removeChild(this._icon);this._shadow&&map._panes.shadowPane.removeChild(this._shadow)}, _reset:function(){var a=this._map.latLngToLayerPoint(this._latlng).round();L.DomUtil.setPosition(this._icon,a);this._shadow&&L.DomUtil.setPosition(this._shadow,a);this._icon.style.zIndex=a.y},_initInteraction:function(){if(this.options.clickable){this._icon.className+=" leaflet-clickable";L.DomEvent.addListener(this._icon,"click",this._onMouseClick,this);for(var a=["dblclick","mousedown","mouseover","mouseout"],b=0;b Date: Mon, 13 Jun 2011 15:15:43 -0600 Subject: [PATCH 0026/2207] Adding options to L.Map.locate that follows the PositionOptions spec for the W3C Geolocation API. You can now pass "enableHighAccuracy" and "maximumAge" to get fresh, accurate positions. --- reference.html | 4 ++-- src/map/ext/Map.Geolocation.js | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/reference.html b/reference.html index abe4ebcc420..2dc4936a477 100644 --- a/reference.html +++ b/reference.html @@ -538,9 +538,9 @@

    Methods that modify map state

    Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. - locate() + locate( <Object> options? ) this - Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. From 21f39ded2d914e73152bff3b7ec33c232db19632 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 15 Jun 2011 23:33:37 -0600 Subject: [PATCH 0029/2207] Adding "setLatLng" documentation for L.Circle. --- reference.html | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index d53136a63e5..72dc97483fc 100644 --- a/reference.html +++ b/reference.html @@ -1465,7 +1465,23 @@

    Constructor

    L.Circle( <LatLnglatlng, <Number> radius, <Path optionsoptions? ) Instantiates a circle object given a geographical point, a radius in meters and optionally an options object. - + + +

    Methods

    + + + + + + + + + + + + +
    MethodReturnsDescription
    setLatLng( <LatLnglatlng )thisSets the position of a circle to a new location.
    +

    L.CircleMarker

    From fa07ec9c11eb19b5cbb5b280d8e7d6638b2528bc Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 15 Jun 2011 23:39:57 -0600 Subject: [PATCH 0030/2207] Adding "setLatLng" documentation for L.CircleMarker. I'm assuming this will work because CircleMarker extends Circle --- reference.html | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 72dc97483fc..b81d59caac0 100644 --- a/reference.html +++ b/reference.html @@ -1499,9 +1499,24 @@

    Constructor

    L.CircleMarker( <LatLnglatlng, <Number> radius, <Path optionsoptions? ) Instantiates a circle marker given a geographical point, a radius in pixels and optionally an options object. - + +

    Methods

    + + + + + + + + + + + + +
    MethodReturnsDescription
    setLatLng( <LatLnglatlng )thisSets the position of a circle marker to a new location.
    +

    L.GeoJSON

    From 6e27aeddb5521e899ebc22743b85f898cae8103d Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 16 Jun 2011 15:00:51 +0300 Subject: [PATCH 0031/2207] CSS cleanup (thanks to CSSLint) --- dist/leaflet.css | 29 +++++++++++++++++------------ dist/leaflet.ie.css | 4 ++++ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 40235dc3ad1..b47c502d5ad 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -25,6 +25,7 @@ .leaflet-marker-shadow { -moz-user-select: none; -webkit-user-select: none; + user-select: none; } .leaflet-marker-icon, .leaflet-marker-shadow { @@ -81,7 +82,6 @@ .leaflet-control { float: left; clear: both; - display: inline; } .leaflet-right .leaflet-control { float: right; @@ -103,9 +103,9 @@ padding: 5px; background: rgba(0, 0, 0, 0.25); - border-radius: 7px; -moz-border-radius: 7px; -webkit-border-radius: 7px; + border-radius: 7px; } .leaflet-control-zoom a { display: block; @@ -115,9 +115,9 @@ background-repeat: no-repeat; background-color: rgba(255, 255, 255, 0.75); - border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; + border-radius: 4px; } .leaflet-control-zoom a:hover { background-color: #fff; @@ -143,6 +143,8 @@ background-color: rgba(255, 255, 255, 0.7); + -moz-box-shadow: 0 0 7px #ccc; + -webkit-box-shadow: 0 0 7px #ccc; box-shadow: 0 0 7px #ccc; } @@ -156,20 +158,22 @@ -moz-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear; transition: opacity 0.2s linear; -} + } .leaflet-fade-anim .leaflet-tile-loaded { opacity: 1; -} + } .leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; -moz-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear; - opacity: 0; -} + transition: opacity 0.2s linear; + } .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { opacity: 1; -} + } .leaflet-zoom-anim .leaflet-tile { -webkit-transition: none; @@ -215,15 +219,15 @@ -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); + transform: rotate(45deg); } .leaflet-popup-close-button { position: absolute; top: 9px; right: 9px; - width: 8px; - height: 8px; - padding: 1px; + width: 10px; + height: 10px; overflow: hidden; } @@ -247,8 +251,9 @@ } .leaflet-popup-content-wrapper, .leaflet-popup-tip { background: white; + box-shadow: 0 1px 10px #888; - -moz-box-shadow: 0 1px 10px #888; + -moz-box-shadow: 0 1px 10px #888; -webkit-box-shadow: 0 1px 14px #999; } .leaflet-popup-content-wrapper { diff --git a/dist/leaflet.ie.css b/dist/leaflet.ie.css index 9accbe84687..141a16f5f91 100644 --- a/dist/leaflet.ie.css +++ b/dist/leaflet.ie.css @@ -11,6 +11,10 @@ display: inline-block; position: absolute; } + +.leaflet-control { + display: inline; + } .leaflet-popup-tip { width: 21px; From 1e7e732ad90a9f2fbc4faf3d4520a956e1e26e13 Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 16 Jun 2011 15:01:19 +0300 Subject: [PATCH 0032/2207] Revert "CSS cleanup (thanks to CSSLint)" This reverts commit 6e27aeddb5521e899ebc22743b85f898cae8103d --- dist/leaflet.css | 29 ++++++++++++----------------- dist/leaflet.ie.css | 4 ---- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index b47c502d5ad..40235dc3ad1 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -25,7 +25,6 @@ .leaflet-marker-shadow { -moz-user-select: none; -webkit-user-select: none; - user-select: none; } .leaflet-marker-icon, .leaflet-marker-shadow { @@ -82,6 +81,7 @@ .leaflet-control { float: left; clear: both; + display: inline; } .leaflet-right .leaflet-control { float: right; @@ -103,9 +103,9 @@ padding: 5px; background: rgba(0, 0, 0, 0.25); + border-radius: 7px; -moz-border-radius: 7px; -webkit-border-radius: 7px; - border-radius: 7px; } .leaflet-control-zoom a { display: block; @@ -115,9 +115,9 @@ background-repeat: no-repeat; background-color: rgba(255, 255, 255, 0.75); + border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; - border-radius: 4px; } .leaflet-control-zoom a:hover { background-color: #fff; @@ -143,8 +143,6 @@ background-color: rgba(255, 255, 255, 0.7); - -moz-box-shadow: 0 0 7px #ccc; - -webkit-box-shadow: 0 0 7px #ccc; box-shadow: 0 0 7px #ccc; } @@ -158,22 +156,20 @@ -moz-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear; transition: opacity 0.2s linear; - } +} .leaflet-fade-anim .leaflet-tile-loaded { opacity: 1; - } +} .leaflet-fade-anim .leaflet-popup { - opacity: 0; - -webkit-transition: opacity 0.2s linear; -moz-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; - } + opacity: 0; +} .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { opacity: 1; - } +} .leaflet-zoom-anim .leaflet-tile { -webkit-transition: none; @@ -219,15 +215,15 @@ -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); - transform: rotate(45deg); } .leaflet-popup-close-button { position: absolute; top: 9px; right: 9px; - width: 10px; - height: 10px; + width: 8px; + height: 8px; + padding: 1px; overflow: hidden; } @@ -251,9 +247,8 @@ } .leaflet-popup-content-wrapper, .leaflet-popup-tip { background: white; - box-shadow: 0 1px 10px #888; - -moz-box-shadow: 0 1px 10px #888; + -moz-box-shadow: 0 1px 10px #888; -webkit-box-shadow: 0 1px 14px #999; } .leaflet-popup-content-wrapper { diff --git a/dist/leaflet.ie.css b/dist/leaflet.ie.css index 141a16f5f91..9accbe84687 100644 --- a/dist/leaflet.ie.css +++ b/dist/leaflet.ie.css @@ -11,10 +11,6 @@ display: inline-block; position: absolute; } - -.leaflet-control { - display: inline; - } .leaflet-popup-tip { width: 21px; From 090eff81e2a0d28455731b34b4a74b1dfcec8361 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 16 Jun 2011 13:19:29 -0600 Subject: [PATCH 0033/2207] Updating CricleMarker documentation (radius passed in path options object). --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index b81d59caac0..04be5f39994 100644 --- a/reference.html +++ b/reference.html @@ -1496,8 +1496,8 @@

    Constructor

    Description - L.CircleMarker( <LatLnglatlng, <Number> radius, <Path optionsoptions? ) - Instantiates a circle marker given a geographical point, a radius in pixels and optionally an options object. + L.CircleMarker( <LatLnglatlng, <Path optionsoptions? ) + Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object. From f2c32b9e2ae573c9bddb8524f1a06c4f8b56dd12 Mon Sep 17 00:00:00 2001 From: mourner Date: Fri, 17 Jun 2011 01:56:11 +0300 Subject: [PATCH 0034/2207] add google analytics code --- download.html | 17 +++++++++++++++++ examples.html | 17 +++++++++++++++++ examples/custom-icons.html | 17 +++++++++++++++++ examples/mobile.html | 17 +++++++++++++++++ examples/quick-start.html | 17 +++++++++++++++++ features.html | 17 +++++++++++++++++ index.html | 19 ++++++++++++++++++- reference.html | 17 +++++++++++++++++ 8 files changed, 137 insertions(+), 1 deletion(-) diff --git a/download.html b/download.html index 40632b8b7f1..c21c6512d33 100644 --- a/download.html +++ b/download.html @@ -73,5 +73,22 @@

    Building a custom version of Leaflet

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + \ No newline at end of file diff --git a/examples.html b/examples.html index 2b0f26105e5..27d3341103a 100644 --- a/examples.html +++ b/examples.html @@ -91,5 +91,22 @@

    OOP in Leaflet

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + \ No newline at end of file diff --git a/examples/custom-icons.html b/examples/custom-icons.html index 8bad7dd7caa..9f82a3a1dd9 100644 --- a/examples/custom-icons.html +++ b/examples/custom-icons.html @@ -148,5 +148,22 @@

    Using icons in markers

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + \ No newline at end of file diff --git a/examples/mobile.html b/examples/mobile.html index d22ee729fdf..4fc6065b1b7 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -118,5 +118,22 @@

    Geolocation

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + \ No newline at end of file diff --git a/examples/quick-start.html b/examples/quick-start.html index 31b230656dc..cb4f16cd068 100644 --- a/examples/quick-start.html +++ b/examples/quick-start.html @@ -277,5 +277,22 @@

    Dealing with events

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + \ No newline at end of file diff --git a/features.html b/features.html index 2b296ca9264..00e5777f2b1 100644 --- a/features.html +++ b/features.html @@ -147,6 +147,23 @@

    On mobile

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + \ No newline at end of file diff --git a/index.html b/index.html index df9412fb8ba..73fd42a3cec 100644 --- a/index.html +++ b/index.html @@ -100,7 +100,24 @@

    Contributing to Leaflet

    + + + \ No newline at end of file diff --git a/reference.html b/reference.html index 04be5f39994..349c9c4ed00 100644 --- a/reference.html +++ b/reference.html @@ -2327,5 +2327,22 @@

    IHandler

    hljs.tabReplace = ' '; hljs.initHighlightingOnLoad(); + + From e1034aa5dc6180cfc6f24d6fee92441d365d6cdf Mon Sep 17 00:00:00 2001 From: mourner Date: Fri, 17 Jun 2011 02:09:56 +0300 Subject: [PATCH 0035/2207] update features --- features.html | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/features.html b/features.html index 00e5777f2b1..d64e4815f5e 100644 --- a/features.html +++ b/features.html @@ -58,7 +58,9 @@

    Available map layers

  • Popups
  • Image overlays
  • WMS layers
  • -
  • GeoJSON
  • +
  • GeoJSON
  • +
  • KML
  • +
  • GeoRSS
  • Interaction features

    @@ -82,7 +84,7 @@

    On mobile browsers (iOS, Android)

    Visual features

    • Panning animation
    • -
    • Zooming animation on modern browsers (except IE)
    • +
    • Zooming animation on modern browsers (except IE)
    • Smooth continuous zoom on iOS
    • Tile and popup fade animation
    • Very nice default design for markers and popups
    • @@ -94,12 +96,13 @@

      Customization features

    • A simple interface for implementing custom map layers
    • The same for custom map controls
    • -
    • Ability to implement custom map projections
    • +
    • Custom map projections (with EPSG:4326, EPSG:3857 and EPSG:3395 out of the box)

    Performance features

    • Hardware acceleration on iOS makes it feel as smooth as native apps
    • +
    • Clever tricks to make panning and zooming really smooth
    • Smart polyline/polygon rendering makes it responsive even when displaying objects with thousands of points
    • Modular build system allows you to reduce the size of the library by leaving out the code you don't need
    @@ -129,13 +132,16 @@

    On mobile

    • Safari for iOS 3/4+
    • WebKit for Android 2.2+
    • +
    • Windows Phone 7
    • +
    • Firefox for Android

    If you find some feature really missing in Leaflet, please submit it to the issue tracker.

    - +

    * Grayed out features are in the roadmap and coming soon.

    +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    From ec9c6f93c87772d9943c28c9b4c58469464940b4 Mon Sep 17 00:00:00 2001 From: Mourner Date: Fri, 17 Jun 2011 14:04:48 +0300 Subject: [PATCH 0036/2207] add twitter follow button --- download.html | 7 +++++-- examples.html | 7 +++++-- features.html | 7 +++++-- index.html | 7 +++++-- reference.html | 7 +++++-- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/download.html b/download.html index c21c6512d33..31cf05c8a2d 100644 --- a/download.html +++ b/download.html @@ -46,8 +46,11 @@

    Download Leaflet

    Download Leaflet edge (zip) — Changelog

    - - + + + + +

    Including Leaflet on your page

    diff --git a/examples.html b/examples.html index 27d3341103a..814b9f21304 100644 --- a/examples.html +++ b/examples.html @@ -44,8 +44,11 @@

    Leaflet examples

    Every example here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers.

    - - + + + + +


    diff --git a/features.html b/features.html index d64e4815f5e..4445822506b 100644 --- a/features.html +++ b/features.html @@ -44,8 +44,11 @@

    Leaflet features

    Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being flexible enough to be easily extended by writing third-party plugins.

    - - + + + + +

    diff --git a/index.html b/index.html index 73fd42a3cec..891b5c58147 100644 --- a/index.html +++ b/index.html @@ -46,8 +46,11 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    It is built from the ground up to work efficiently and smoothly on both platforms, utilizing cutting-edge technologies included in HTML5. Its top priorities are usability, performance, small size, A-grade browser support, flexibility and easy to use API. The OOP-based code of the library is designed to be modular, extensible and very easy to understand. Find out more on the features page.

    - - + + + + +

    Basic usage example

    diff --git a/reference.html b/reference.html index 349c9c4ed00..9f4552164f6 100644 --- a/reference.html +++ b/reference.html @@ -149,8 +149,11 @@

    Misc


    - - + + + + +

    L.Map

    From d61849cf9da8c274f9603d92e1aa046b1a3377f4 Mon Sep 17 00:00:00 2001 From: Mourner Date: Fri, 17 Jun 2011 16:42:57 +0300 Subject: [PATCH 0037/2207] parse string coordinates in GeoJSON, closes #136 --- dist/leaflet.js | 3 ++- src/layer/GeoJSON.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dist/leaflet.js b/dist/leaflet.js index 5f3d6ba4c6b..93abbdde245 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -75,7 +75,8 @@ for(d=c=0;c Date: Fri, 17 Jun 2011 19:28:27 +0300 Subject: [PATCH 0038/2207] layergroup and featuregroup docs --- reference.html | 123 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 9f4552164f6..e332ccb03ac 100644 --- a/reference.html +++ b/reference.html @@ -85,8 +85,8 @@

    Vector layers

    Other layers

    Basic types

    @@ -1519,6 +1519,125 @@

    Methods

    + + +

    L.LayerGroup

    + +

    Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

    + +
    var group = new L.LayerGroup();
    +
    +group.addLayer(marker1);
    +group.addLayer(marker2);
    +group.addLayer(polyline);
    +		
    +map.addLayer(group);
    + +

    Constructor

    + + + + + + + + + + +
    ConstructorDescription
    L.LayerGroup( <ILayer[]> layers? )Create a layer group, optionally given an initial set of layers.
    + +

    Methods

    + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    addLayer( <ILayerlayer )thisAdds a given layer to the group.
    removeLayer( <ILayerlayer )thisRemoves a given layer from the group.
    clearLayers()thisRemoves all the layers from the group.
    + + + +

    L.FeatureGroup

    + +

    Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

    + +
    var group = new L.FeatureGroup([marker1, marker2, polyline]);
    +
    +group.bindPopup('Hello world!');
    +
    +group.on('click', function() { 
    +	alert('Clicked on a group!'); 
    +});
    +		
    +map.addLayer(group);
    + +

    Constructor

    + + + + + + + + + + +
    ConstructorDescription
    L.FeatureGroup( <IFeature[]> layers? )Create a layer group, optionally given an initial set of layers.
    + +

    Methods

    + +

    Has all LayerGroup methods and additionally:

    + + + + + + + + + + + + +
    MethodReturnsDescription
    bindPopup( <String> htmlContent, <Popup optionsoptions? )thisBinds a popup with a particular HTML content to a click on any layer from the group.
    + +

    Events

    + +

    You can subscribe to the following events using these methods.

    + + + + + + + + + + + + + + + +
    EventDataDescription
    clickEvent + Fired when the user clicks (or taps) on the group.
    dblclickEvent + Fired when the user double-clicks (or double-taps) on the group.

    L.GeoJSON

    From 157e5f058f35292659236660a65b08bdd36dd373 Mon Sep 17 00:00:00 2001 From: Mourner Date: Fri, 17 Jun 2011 19:45:04 +0300 Subject: [PATCH 0039/2207] initial geojson example work --- examples/geojson-example.html | 55 +++++++++++++++++++++++++++++++++++ examples/geojson-sample.js | 50 +++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 examples/geojson-example.html create mode 100644 examples/geojson-sample.js diff --git a/examples/geojson-example.html b/examples/geojson-example.html new file mode 100644 index 00000000000..9b361788f79 --- /dev/null +++ b/examples/geojson-example.html @@ -0,0 +1,55 @@ + + + + Leaflet debug page + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/examples/geojson-sample.js b/examples/geojson-sample.js new file mode 100644 index 00000000000..24ecf05002e --- /dev/null +++ b/examples/geojson-sample.js @@ -0,0 +1,50 @@ +var geojsonSample = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [102.0, 0.5] + }, + "properties": { + "prop0": "value0", + "color": "blue" + } + }, + + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]] + }, + "properties": { + "color": "red", + "prop1": 0.0 + } + }, + + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]] + }, + "properties": { + "color": "green", + "prop1": { + "this": "that" + } + } + }, + + { + "type": "Feature", + "geometry": { + "type": "MultiPolygon", + "coordinates": [[[[100.0, 1.5], [100.5, 1.5], [100.5, 2.0], [100.0, 2.0], [100.0, 1.5]]], [[[100.5, 2.0], [100.5, 2.5], [101.0, 2.5], [101.0, 2.0], [100.5, 2.0]]]] + } + } + ] +}; \ No newline at end of file From 6d6caa4fd1cc4767dc50967aa5d4fb4d8e8c8814 Mon Sep 17 00:00:00 2001 From: Mourner Date: Fri, 17 Jun 2011 19:54:37 +0300 Subject: [PATCH 0040/2207] update download links --- download.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/download.html b/download.html index 31cf05c8a2d..7bba7b7fe36 100644 --- a/download.html +++ b/download.html @@ -43,7 +43,14 @@

    Download Leaflet

    Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system.

    -

    Download Leaflet edge (zip) — Changelog

    +

    + Download Leaflet 0.2 (zip, stable)
    + Download Leaflet master (zip, development version) +

    + +

    + View Changelog +

    From 5e0d9a7bd2125ea479471a7f8ee819240a4ab505 Mon Sep 17 00:00:00 2001 From: mourner Date: Sat, 18 Jun 2011 13:37:55 +0300 Subject: [PATCH 0041/2207] update download link to 0.2.1 --- download.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.html b/download.html index 7bba7b7fe36..c17a2a86f59 100644 --- a/download.html +++ b/download.html @@ -44,7 +44,7 @@

    Download Leaflet

    Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system.

    - Download Leaflet 0.2 (zip, stable)
    + Download Leaflet 0.2.1 (zip, stable)
    Download Leaflet master (zip, development version)

    From cbe6df25189c96bfd7315c1f469002882415b3f7 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 22 Jun 2011 09:00:10 -0600 Subject: [PATCH 0042/2207] Adding minZoom/maxZoom documentation for Map. --- reference.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/reference.html b/reference.html index e332ccb03ac..84587a591a4 100644 --- a/reference.html +++ b/reference.html @@ -274,6 +274,18 @@

    Options

    Boolean depends Whether the tile fade animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android. + + + minZoom + Number + 0 + Minimum zoom level of map. This overrides any minZoom set on a layer. + + + maxZoom + Number + 18 + Maximum zoom level of map. This overrides any maxZoom set on a layer. From b0ac337d440a69eb28e77cfbcadb52b57669e9fb Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 23 Jun 2011 14:03:02 +0300 Subject: [PATCH 0043/2207] minor docs update, closes #145 --- reference.html | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/reference.html b/reference.html index 84587a591a4..65b3331d4dc 100644 --- a/reference.html +++ b/reference.html @@ -215,6 +215,18 @@

    Options

    [] Layers that will be added to the map initially. + + minZoom + Number + 0 + Minimum zoom level of the map. Overrides any minZoom set on map layers. + + + maxZoom + Number + 18 + Maximum zoom level of the map. This overrides any maxZoom set on map layers. + crs CRS @@ -275,17 +287,11 @@

    Options

    depends Whether the tile fade animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android. - - minZoom - Number - 0 - Minimum zoom level of map. This overrides any minZoom set on a layer. - - - maxZoom - Number - 18 - Maximum zoom level of map. This overrides any maxZoom set on a layer. + + closePopupOnClick + Boolean + true + Set it to false if you don't want popups to close when user clicks the map. @@ -932,12 +938,6 @@ true Controls the presense of a close button in the popup. - - closeMapOnClick - Boolean - true - Set it to false if you don't want the popup to close when user clicks the map. - offset Point From 6dbb8dcef2d294dd8af8e9acf404e419d8aee67d Mon Sep 17 00:00:00 2001 From: Mourner Date: Thu, 23 Jun 2011 14:27:43 +0300 Subject: [PATCH 0044/2207] use documentFragment when adding tiles, closes #152 --- dist/leaflet.js | 10 +++++----- src/layer/tile/TileLayer.js | 22 +++++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/dist/leaflet.js b/dist/leaflet.js index 673f1c7c924..62b2b576c5f 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -40,13 +40,13 @@ a=a.getNorthEast()):d=a;return d.lat>=b.lat&&a.lat<=c.lat&&d.lng>=b.lng&&a.lng<= g=Math.PI/2-2*Math.atan(d),h=15,j=0.1;Math.abs(j)>1.0E-7&&--h>0;)j=f*Math.sin(g),j=Math.PI/2-2*Math.atan(d*Math.pow((1-j)/(1+j),0.5*f))-g,g+=j;return new L.LatLng(g*c,e,b)}};L.CRS={latLngToPoint:function(a,b){return this.transformation._transform(this.projection.project(a),b)},pointToLatLng:function(a,b,c){return this.projection.unproject(this.transformation.untransform(a,b),c)},project:function(a){return this.projection.project(a)}};L.CRS.EPSG3857=L.Util.extend({},L.CRS,{code:"EPSG:3857",projection:L.Projection.SphericalMercator,transformation:new L.Transformation(0.5/Math.PI,0.5,-0.5/Math.PI,0.5),project:function(a){return this.projection.project(a).multiplyBy(6378137)}});L.CRS.EPSG900913=L.Util.extend({},L.CRS.EPSG3857,{code:"EPSG:900913"});L.CRS.EPSG4326=L.Util.extend({},L.CRS,{code:"EPSG:4326",projection:L.Projection.LonLat,transformation:new L.Transformation(1/360,0.5,-1/360,0.5)});L.CRS.EPSG3395=L.Util.extend({},L.CRS,{code:"EPSG:3395",projection:L.Projection.Mercator,transformation:function(){var a=L.Projection.Mercator;return new L.Transformation(0.5/(Math.PI*a.R_MAJOR),0.5,-0.5/(Math.PI*a.R_MINOR),0.5)}()});L.LayerGroup=L.Class.extend({initialize:function(a){this._layers={};if(a)for(var b=0,c=a.length;ba.max.x||ba.max.y))this._tiles[d].src="",this._tiles[d].parentNode==this._container&&this._container.removeChild(this._tiles[d]),delete this._tiles[d]},_addTile:function(a){var b= -this._getTilePos(a),c=this._map.getZoom(),d=a.x+":"+a.y,e=1<=e)){var f=this._createTile();L.DomUtil.setPosition(f,b);this._tiles[d]=f;if(this.options.scheme=="tms")a.y=e-a.y-1;this._loadTile(f,a,c);this._container.appendChild(f)}},_getTilePos:function(a){var b=this._map.getPixelOrigin();return a.multiplyBy(this.options.tileSize).subtract(b)},getTileUrl:function(a,b){return this._url.replace("{s}",this.options.subdomains[(a.x+a.y)%this.options.subdomains.length]).replace("{z}", -b).replace("{x}",a.x).replace("{y}",a.y)},_createTileProto:function(){this._tileImg=L.DomUtil.create("img","leaflet-tile");this._tileImg.galleryimg="no";var a=this.options.tileSize;this._tileImg.style.width=a+"px";this._tileImg.style.height=a+"px"},_createTile:function(){var a=this._tileImg.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;a.onload=this._tileOnLoad;a.onerror=this._tileOnError;a.src=this.getTileUrl(b,c)},_tileOnLoad:function(){var a= -this._layer;this.className+=" leaflet-tile-loaded";a.fire("tileload",{tile:this,url:this.src});a._tilesToLoad--;a._tilesToLoad||a.fire("load")},_tileOnError:function(){var a=this._layer;a.fire("tileerror",{tile:this,url:this.src});if(a=a.options.errorTileUrl)this.src=a}});L.TileLayer.WMS=L.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(a,b){this._url=a;this.wmsParams=L.Util.extend({},this.defaultWmsParams);this.wmsParams.width=this.wmsParams.height=this.options.tileSize;for(var c in b)this.options.hasOwnProperty(c)||(this.wmsParams[c]=b[c]);L.Util.setOptions(this,b)},onAdd:function(a){this.wmsParams[parseFloat(this.wmsParams.version)>=1.3?"crs":"srs"]=a.options.crs.code; +b.push(new L.Point(e,d));b.sort(function(a,b){return a.distanceTo(c)-b.distanceTo(c)});a=document.createDocumentFragment();this._tilesToLoad=b.length;d=0;for(e=this._tilesToLoad;da.max.x||ba.max.y))this._tiles[d].src="",this._tiles[d].parentNode==this._container&& +this._container.removeChild(this._tiles[d]),delete this._tiles[d]},_addTile:function(a,b){var c=this._getTilePos(a),d=this._map.getZoom(),e=a.x+":"+a.y,f=1<=f)){var g=this._createTile();L.DomUtil.setPosition(g,c);this._tiles[e]=g;if(this.options.scheme=="tms")a.y=f-a.y-1;this._loadTile(g,a,d);b.appendChild(g)}},_getTilePos:function(a){var b=this._map.getPixelOrigin();return a.multiplyBy(this.options.tileSize).subtract(b)},getTileUrl:function(a, +b){return this._url.replace("{s}",this.options.subdomains[(a.x+a.y)%this.options.subdomains.length]).replace("{z}",b).replace("{x}",a.x).replace("{y}",a.y)},_createTileProto:function(){this._tileImg=L.DomUtil.create("img","leaflet-tile");this._tileImg.galleryimg="no";var a=this.options.tileSize;this._tileImg.style.width=a+"px";this._tileImg.style.height=a+"px"},_createTile:function(){var a=this._tileImg.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer= +this;a.onload=this._tileOnLoad;a.onerror=this._tileOnError;a.src=this.getTileUrl(b,c)},_tileOnLoad:function(){var a=this._layer;this.className+=" leaflet-tile-loaded";a.fire("tileload",{tile:this,url:this.src});a._tilesToLoad--;a._tilesToLoad||a.fire("load")},_tileOnError:function(){var a=this._layer;a.fire("tileerror",{tile:this,url:this.src});if(a=a.options.errorTileUrl)this.src=a}});L.TileLayer.WMS=L.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(a,b){this._url=a;this.wmsParams=L.Util.extend({},this.defaultWmsParams);this.wmsParams.width=this.wmsParams.height=this.options.tileSize;for(var c in b)this.options.hasOwnProperty(c)||(this.wmsParams[c]=b[c]);L.Util.setOptions(this,b)},onAdd:function(a){this.wmsParams[parseFloat(this.wmsParams.version)>=1.3?"crs":"srs"]=a.options.crs.code; L.TileLayer.prototype.onAdd.call(this,a)},getTileUrl:function(a){var b=this.options.tileSize,a=a.multiplyBy(b),b=a.add(new L.Point(b,b)),a=this._map.unproject(a,this._zoom,!0),b=this._map.unproject(b,this._zoom,!0),a=this._map.options.crs.project(a),b=this._map.options.crs.project(b),b=[a.x,b.y,b.x,a.y].join(",");return this._url+L.Util.getParamString(this.wmsParams)+"&bbox="+b}});L.TileLayer.Canvas=L.TileLayer.extend({options:{async:!1},initialize:function(a){L.Util.setOptions(this,a)},_createTileProto:function(){this._canvasProto=L.DomUtil.create("canvas","leaflet-tile");var a=this.options.tileSize;this._canvasProto.width=a;this._canvasProto.height=a},_createTile:function(){var a=this._canvasProto.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;this.drawTile(a,b,c);this.options.async||this.tileDrawn(a)},drawTile:function(){}, tileDrawn:function(a){this._tileOnLoad.call(a)}});L.ImageOverlay=L.Class.extend({includes:L.Mixin.Events,initialize:function(a,b){this._url=a;this._bounds=b},onAdd:function(a){this._map=a;this._image||this._initImage();a.getPanes().overlayPane.appendChild(this._image);a.on("viewreset",this._reset,this);this._reset()},onRemove:function(a){a.getPanes().overlayPane.removeChild(this._image);a.off("viewreset",this._reset,this)},_initImage:function(){this._image=L.DomUtil.create("img","leaflet-image-layer");this._image.style.visibility="hidden";L.Util.extend(this._image, {galleryimg:"no",onselectstart:L.Util.falseFn,onmousemove:L.Util.falseFn,onload:this._onImageLoad,src:this._url})},_reset:function(){var a=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),b=this._map.latLngToLayerPoint(this._bounds.getSouthEast()).subtract(a);L.DomUtil.setPosition(this._image,a);this._image.style.width=b.x+"px";this._image.style.height=b.y+"px"},_onImageLoad:function(){this.style.visibility=""}});L.Popup=L.Class.extend({includes:L.Mixin.Events,options:{maxWidth:300,autoPan:!0,closeButton:!0,offset:new L.Point(0,2),autoPanPadding:new L.Point(5,5)},initialize:function(a){L.Util.setOptions(this,a)},onAdd:function(a){this._map=a;this._container||this._initLayout();this._updateContent();this._container.style.opacity="0";this._map._panes.popupPane.appendChild(this._container);this._map.on("viewreset",this._updatePosition,this);if(this._map.options.closePopupOnClick)this._map.on("preclick",this._close, diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 68072ee9cfd..3d78feddd6a 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -14,7 +14,7 @@ L.TileLayer = L.Class.extend({ attribution: '', opacity: 1, scheme: 'xyz', - noWrap: false, + noWrap: false, unloadInvisibleTiles: L.Browser.mobileWebkit, updateWhenIdle: L.Browser.mobileWebkit @@ -45,7 +45,7 @@ L.TileLayer = L.Class.extend({ if (this.options.updateWhenIdle) { map.on('moveend', this._update, this); } else { - this._limitedUpdate = L.Util.limitExecByInterval(this._update, 100, this); + this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); map.on('move', this._limitedUpdate, this); } @@ -140,10 +140,14 @@ L.TileLayer = L.Class.extend({ return a.distanceTo(center) - b.distanceTo(center); }); + var fragment = document.createDocumentFragment(); + this._tilesToLoad = queue.length; for (var k = 0, len = this._tilesToLoad; k < len; k++) { - this._addTile(queue[k]); + this._addTile(queue[k], fragment); } + + this._container.appendChild(fragment); }, _removeOtherTiles: function(bounds) { @@ -167,16 +171,16 @@ L.TileLayer = L.Class.extend({ } }, - _addTile: function(tilePoint) { + _addTile: function(tilePoint, container) { var tilePos = this._getTilePos(tilePoint), zoom = this._map.getZoom(), - key = tilePoint.x + ':' + tilePoint.y; + key = tilePoint.x + ':' + tilePoint.y, + tileLimit = (1 << zoom); // wrap tile coordinates - var tileLimit = (1 << zoom); if (!this.options.noWrap) { - tilePoint.x = ((tilePoint.x % tileLimit) + tileLimit) % tileLimit; - } + tilePoint.x = ((tilePoint.x % tileLimit) + tileLimit) % tileLimit; + } if (tilePoint.y < 0 || tilePoint.y >= tileLimit) { return; } // create tile @@ -191,7 +195,7 @@ L.TileLayer = L.Class.extend({ this._loadTile(tile, tilePoint, zoom); - this._container.appendChild(tile); + container.appendChild(tile); }, _getTilePos: function(tilePoint) { From c0d20fcda77edb629b75ebd714ab72e63edb4a60 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 23 Jun 2011 22:42:56 -0600 Subject: [PATCH 0045/2207] Adding docs for map.getBounds() --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index 65b3331d4dc..fa3c21ddc38 100644 --- a/reference.html +++ b/reference.html @@ -601,6 +601,11 @@

    Methods that get map state

    getMaxZoom() Number Returns the maximum zoom level of the map. + + + getBounds() + LatLngBounds + Returns the LatLngBounds of the current map view. getBoundsZoom( <LatLngBounds> bounds ) From e6c8d1b12c0fbb1f384c677e44bdf50469f2b757 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 5 Jul 2011 21:19:08 -0600 Subject: [PATCH 0046/2207] Adding setStyle docs for Path. --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index fa3c21ddc38..40e18f41e3e 100644 --- a/reference.html +++ b/reference.html @@ -1325,6 +1325,11 @@

    Methods

    bindPopup( <String> htmlContent, <Popup optionsoptions? ) this Binds a popup with a particular HTML content to a click on this path. + + + setStyle( <Path optionsobject) + this + Changes the appearance of a Path based on the options in the Path options object. From 9912457cfdf2b2c2df52d7737045d225fb8aa2b5 Mon Sep 17 00:00:00 2001 From: Mourner Date: Wed, 13 Jul 2011 15:10:13 +0300 Subject: [PATCH 0047/2207] minor docs update, update features --- examples.html | 4 ++++ features.html | 6 ++++-- reference.html | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/examples.html b/examples.html index 814b9f21304..e22b123a9a3 100644 --- a/examples.html +++ b/examples.html @@ -69,6 +69,10 @@

    Markers With Custom Icons

    In this pretty example, you'll learn how to easily define your own icons for use by the markers you put on the map.


    +

    Layer Groups and Layers Control

    +

    A tutorial on how to manage groups of layers and use the layer switching control.

    +
    +

    Custom Controls

    A brief tutorial on implementing custom map controls.


    diff --git a/features.html b/features.html index 4445822506b..8c038f371c7 100644 --- a/features.html +++ b/features.html @@ -95,7 +95,7 @@

    Visual features

    Customization features

      -
    • Pure CSS3 popups for easy restyling
    • +
    • Pure CSS3 popups and controls for easy restyling
    • A simple interface for implementing custom map layers
    • The same for custom map controls
    • @@ -117,7 +117,7 @@

      Map controls

    • Zoom buttons
    • Attribution
    • Zoom slider
    • -
    • Layer switcher
    • +
    • Layer switcher
    @@ -135,6 +135,8 @@

    On mobile

    • Safari for iOS 3/4+
    • WebKit for Android 2.2+
    • +
    • webOS browser
    • +
    • Blackberry 6+
    • Windows Phone 7
    • Firefox for Android
    diff --git a/reference.html b/reference.html index 40e18f41e3e..8b9eb8ec7d5 100644 --- a/reference.html +++ b/reference.html @@ -101,6 +101,7 @@

    Controls

    From 2d41ad1e7267434536cf2d203447953b4ba24576 Mon Sep 17 00:00:00 2001 From: Mourner Date: Wed, 20 Jul 2011 14:11:23 +0300 Subject: [PATCH 0048/2207] update build with Layers control --- build/Makefile | 1 + build/build.bat | 1 + dist/leaflet.js | 52 +++++++++++++++++++++++++++---------------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/build/Makefile b/build/Makefile index 22d65483e92..fc4adb0b1f7 100644 --- a/build/Makefile +++ b/build/Makefile @@ -56,6 +56,7 @@ --js ../src/control/Control.js \ --js ../src/control/Control.Zoom.js \ --js ../src/control/Control.Attribution.js \ + --js ../src/control/Control.Layers.js \ --js ../src/map/Map.js \ --js ../src/map/ext/Map.Geolocation.js \ --js ../src/map/ext/Map.Popup.js \ diff --git a/build/build.bat b/build/build.bat index 5e98956573d..18646aef626 100644 --- a/build/build.bat +++ b/build/build.bat @@ -61,6 +61,7 @@ java -jar ../lib/closure-compiler/compiler.jar ^ --js ../src/control/Control.js ^ --js ../src/control/Control.Zoom.js ^ --js ../src/control/Control.Attribution.js ^ +--js ../src/control/Control.Layers.js ^ --js ../src/map/Map.js ^ --js ../src/map/ext/Map.Geolocation.js ^ --js ../src/map/ext/Map.Popup.js ^ diff --git a/dist/leaflet.js b/dist/leaflet.js index 949f2f11436..500d939d7aa 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -12,7 +12,7 @@ L.Mixin.Events={addEventListener:function(a,b,c){var d=this._leaflet_events=this b){if(this.hasEventListeners(a)){for(var c=L.Util.extend({type:a,target:this},b),d=this._leaflet_events[a].slice(),e=0,f=d.length;e=this.min.x&&a.x<=this.max.x&&b.y>=this.min.y&&a.y<=this.max.y}});L.Transformation=L.Class.extend({initialize:function(a,b,c,d){this._a=a;this._b=b;this._c=c;this._d=d},transform:function(a,b){return this._transform(a.clone(),b)},_transform:function(a,b){b=b||1;a.x=b*(this._a*a.x+this._b);a.y=b*(this._c*a.y+this._d);return a},untransform:function(a,b){b=b||1;return new L.Point((a.x/b-this._b)/this._a,(a.y/b-this._d)/this._c)}});L.LineUtil={simplify:function(a,b){if(!b)return a.slice();a=this.reducePoints(a,b);return a=this.simplifyDP(a,b)},pointToSegmentDistance:function(a,b,c){return Math.sqrt(this._sqPointToSegmentDist(a,b,c))},simplifyDP:function(a,b){for(var c=0,d=0,e=b*b,f=1,g=a.length,h;fc&&(d=f,c=h);return c>=e?(c=a.slice(0,d),d=a.slice(d),g=this.simplifyDP(c,b).slice(0,g-2),d=this.simplifyDP(d,b),g.concat(d)):[a[0],a[g-1]]},reducePoints:function(a,b){for(var c= +a instanceof L.Bounds?(b=a.min,a=a.max):b=a;return b.x>=this.min.x&&a.x<=this.max.x&&b.y>=this.min.y&&a.y<=this.max.y}});L.Transformation=L.Class.extend({initialize:function(a,b,c,d){this._a=a;this._b=b;this._c=c;this._d=d},transform:function(a,b){return this._transform(a.clone(),b)},_transform:function(a,b){b=b||1;a.x=b*(this._a*a.x+this._b);a.y=b*(this._c*a.y+this._d);return a},untransform:function(a,b){b=b||1;return new L.Point((a.x/b-this._b)/this._a,(a.y/b-this._d)/this._c)}});L.LineUtil={simplify:function(a,b){if(!b)return a.slice();a=this.reducePoints(a,b);return a=this.simplifyDP(a,b)},pointToSegmentDistance:function(a,b,c){return Math.sqrt(this._sqPointToSegmentDist(a,b,c))},simplifyDP:function(a,b){for(var c=0,d=0,e=b*b,f=1,g=a.length,h;fc&&(d=f,c=h);return c>=e?(c=a.slice(0,d),d=a.slice(d),g=this.simplifyDP(c,b).slice(0,g-2),d=this.simplifyDP(d,b),g.concat(d)):[a[0],a[g-1]]},reducePoints:function(a,b){for(var c= [a[0]],d=b*b,e=1,f=0,g=a.length;eb.max.x&&(c|=2);a.yb.max.y&&(c|=8);return c},_sqDist:function(a,b){var c=b.x-a.x,d=b.y-a.y;return c*c+d*d},_sqPointToSegmentDist:function(a,b,c){var d=c.x-b.x,e=c.y-b.y;if(!d&&!e)return this._sqDist(a,b);var f=((a.x-b.x)*d+(a.y-b.y)*e)/this._sqDist(b,c);if(f< 0)return this._sqDist(a,b);if(f>1)return this._sqDist(a,c);b=new L.Point(b.x+d*f,b.y+e*f);return this._sqDist(a,b)}};L.PolyUtil={};L.PolyUtil.clipPolygon=function(a,b){var c,d=[1,4,2,8],e,f,g,h,j,k,l=L.LineUtil;e=0;for(j=a.length;e=b.lat&&a.lat<=c.lat&&d.lng>=b.lng&&a.lng<=c.lng}});L.Projection={};L.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(a){var b=L.LatLng.DEG_TO_RAD,c=this.MAX_LATITUDE,d=a.lng*b,a=Math.max(Math.min(c,a.lat),-c)*b,a=Math.log(Math.tan(Math.PI/4+a/2));return new L.Point(d,a)},unproject:function(a,b){var c=L.LatLng.RAD_TO_DEG;return new L.LatLng((2*Math.atan(Math.exp(a.y))-Math.PI/2)*c,a.x*c,b)}};L.Projection.LonLat={project:function(a){return new L.Point(a.lng,a.lat)},unproject:function(a,b){return new L.LatLng(a.y,a.x,b)}};L.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(a){var b=L.LatLng.DEG_TO_RAD,c=this.MAX_LATITUDE,d=this.R_MAJOR,e=a.lng*b*d,a=Math.max(Math.min(c,a.lat),-c)*b,b=this.R_MINOR/d,b=Math.sqrt(1-b*b),c=b*Math.sin(a),c=Math.pow((1-c)/(1+c),b*0.5),a=-d*Math.log(Math.tan(0.5*(Math.PI*0.5-a))/c);return new L.Point(e,a)},unproject:function(a,b){for(var c=L.LatLng.RAD_TO_DEG,d=this.R_MAJOR,e=a.x*c/d,f=this.R_MINOR/d,f=Math.sqrt(1-f*f),d=Math.exp(-a.y/d), g=Math.PI/2-2*Math.atan(d),h=15,j=0.1;Math.abs(j)>1.0E-7&&--h>0;)j=f*Math.sin(g),j=Math.PI/2-2*Math.atan(d*Math.pow((1-j)/(1+j),0.5*f))-g,g+=j;return new L.LatLng(g*c,e,b)}};L.CRS={latLngToPoint:function(a,b){return this.transformation._transform(this.projection.project(a),b)},pointToLatLng:function(a,b,c){return this.projection.unproject(this.transformation.untransform(a,b),c)},project:function(a){return this.projection.project(a)}};L.CRS.EPSG3857=L.Util.extend({},L.CRS,{code:"EPSG:3857",projection:L.Projection.SphericalMercator,transformation:new L.Transformation(0.5/Math.PI,0.5,-0.5/Math.PI,0.5),project:function(a){return this.projection.project(a).multiplyBy(6378137)}});L.CRS.EPSG900913=L.Util.extend({},L.CRS.EPSG3857,{code:"EPSG:900913"});L.CRS.EPSG4326=L.Util.extend({},L.CRS,{code:"EPSG:4326",projection:L.Projection.LonLat,transformation:new L.Transformation(1/360,0.5,-1/360,0.5)});L.CRS.EPSG3395=L.Util.extend({},L.CRS,{code:"EPSG:3395",projection:L.Projection.Mercator,transformation:function(){var a=L.Projection.Mercator;return new L.Transformation(0.5/(Math.PI*a.R_MAJOR),0.5,-0.5/(Math.PI*a.R_MINOR),0.5)}()});L.LayerGroup=L.Class.extend({initialize:function(a){this._layers={};if(a)for(var b=0,c=a.length;ba.max.x||ba.max.y)){if(!L.Browser.android)this._tiles[d].src="";this._tiles[d].parentNode==this._container&&this._container.removeChild(this._tiles[d]);delete this._tiles[d]}}, -_addTile:function(a,b){var c=this._getTilePos(a),d=this._map.getZoom(),e=a.x+":"+a.y,f=1<=f)){var g=this._createTile();L.DomUtil.setPosition(g,c);this._tiles[e]=g;if(this.options.scheme=="tms")a.y=f-a.y-1;this._loadTile(g,a,d);b.appendChild(g)}},_getTilePos:function(a){var b=this._map.getPixelOrigin();return a.multiplyBy(this.options.tileSize).subtract(b)},getTileUrl:function(a,b){return this._url.replace("{s}",this.options.subdomains[(a.x+ -a.y)%this.options.subdomains.length]).replace("{z}",b).replace("{x}",a.x).replace("{y}",a.y)},_createTileProto:function(){this._tileImg=L.DomUtil.create("img","leaflet-tile");this._tileImg.galleryimg="no";var a=this.options.tileSize;this._tileImg.style.width=a+"px";this._tileImg.style.height=a+"px"},_createTile:function(){var a=this._tileImg.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;a.onload=this._tileOnLoad;a.onerror=this._tileOnError; -a.src=this.getTileUrl(b,c)},_tileOnLoad:function(){var a=this._layer;this.className+=" leaflet-tile-loaded";a.fire("tileload",{tile:this,url:this.src});a._tilesToLoad--;a._tilesToLoad||a.fire("load")},_tileOnError:function(){var a=this._layer;a.fire("tileerror",{tile:this,url:this.src});if(a=a.options.errorTileUrl)this.src=a}});L.TileLayer.WMS=L.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(a,b){this._url=a;this.wmsParams=L.Util.extend({},this.defaultWmsParams);this.wmsParams.width=this.wmsParams.height=this.options.tileSize;for(var c in b)this.options.hasOwnProperty(c)||(this.wmsParams[c]=b[c]);L.Util.setOptions(this,b)},onAdd:function(a){this.wmsParams[parseFloat(this.wmsParams.version)>=1.3?"crs":"srs"]=a.options.crs.code; +setOpacity:function(a){this.options.opacity=a;this._setOpacity(a);if(L.Browser.webkit)for(i in this._tiles)this._tiles[i].style.webkitTransform+=" translate(0,0)"},_setOpacity:function(a){a<1&&L.DomUtil.setOpacity(this._container,a)},_initContainer:function(a){var b=this._map.getPanes().tilePane,c=b.firstChild;if(!this._container||b.empty)this._container=L.DomUtil.create("div","leaflet-layer"),a&&c?b.insertBefore(this._container,c):b.appendChild(this._container),this._setOpacity(this.options.opacity)}, +_reset:function(){this._tiles={};this._initContainer();this._container.innerHTML=""},_update:function(){var a=this._map.getPixelBounds(),b=this.options.tileSize,c=new L.Point(Math.floor(a.min.x/b),Math.floor(a.min.y/b)),a=new L.Point(Math.floor(a.max.x/b),Math.floor(a.max.y/b)),c=new L.Bounds(c,a);this._addTilesFromCenterOut(c);this.options.unloadInvisibleTiles&&this._removeOtherTiles(c)},_addTilesFromCenterOut:function(a){for(var b=[],c=a.getCenter(),d=a.min.y;d<=a.max.y;d++)for(var e=a.min.x;e<= +a.max.x;e++)e+":"+d in this._tiles||b.push(new L.Point(e,d));b.sort(function(a,b){return a.distanceTo(c)-b.distanceTo(c)});a=document.createDocumentFragment();this._tilesToLoad=b.length;d=0;for(e=this._tilesToLoad;da.max.x||ba.max.y)){if(!L.Browser.android)this._tiles[d].src= +"";this._tiles[d].parentNode==this._container&&this._container.removeChild(this._tiles[d]);delete this._tiles[d]}},_addTile:function(a,b){var c=this._getTilePos(a),d=this._map.getZoom(),e=a.x+":"+a.y,f=1<=f)){var g=this._createTile();L.DomUtil.setPosition(g,c);this._tiles[e]=g;if(this.options.scheme=="tms")a.y=f-a.y-1;this._loadTile(g,a,d);b.appendChild(g)}},_getTilePos:function(a){var b=this._map.getPixelOrigin();return a.multiplyBy(this.options.tileSize).subtract(b)}, +getTileUrl:function(a,b){return this._url.replace("{s}",this.options.subdomains[(a.x+a.y)%this.options.subdomains.length]).replace("{z}",b).replace("{x}",a.x).replace("{y}",a.y)},_createTileProto:function(){this._tileImg=L.DomUtil.create("img","leaflet-tile");this._tileImg.galleryimg="no";var a=this.options.tileSize;this._tileImg.style.width=a+"px";this._tileImg.style.height=a+"px"},_createTile:function(){var a=this._tileImg.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a, +b,c){a._layer=this;a.onload=this._tileOnLoad;a.onerror=this._tileOnError;a.src=this.getTileUrl(b,c)},_tileOnLoad:function(){var a=this._layer;this.className+=" leaflet-tile-loaded";a.fire("tileload",{tile:this,url:this.src});a._tilesToLoad--;a._tilesToLoad||a.fire("load")},_tileOnError:function(){var a=this._layer;a.fire("tileerror",{tile:this,url:this.src});if(a=a.options.errorTileUrl)this.src=a}});L.TileLayer.WMS=L.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(a,b){this._url=a;this.wmsParams=L.Util.extend({},this.defaultWmsParams);this.wmsParams.width=this.wmsParams.height=this.options.tileSize;for(var c in b)this.options.hasOwnProperty(c)||(this.wmsParams[c]=b[c]);L.Util.setOptions(this,b)},onAdd:function(a){this.wmsParams[parseFloat(this.wmsParams.version)>=1.3?"crs":"srs"]=a.options.crs.code; L.TileLayer.prototype.onAdd.call(this,a)},getTileUrl:function(a){var b=this.options.tileSize,a=a.multiplyBy(b),b=a.add(new L.Point(b,b)),a=this._map.unproject(a,this._zoom,!0),b=this._map.unproject(b,this._zoom,!0),a=this._map.options.crs.project(a),b=this._map.options.crs.project(b),b=[a.x,b.y,b.x,a.y].join(",");return this._url+L.Util.getParamString(this.wmsParams)+"&bbox="+b}});L.TileLayer.Canvas=L.TileLayer.extend({options:{async:!1},initialize:function(a){L.Util.setOptions(this,a)},_createTileProto:function(){this._canvasProto=L.DomUtil.create("canvas","leaflet-tile");var a=this.options.tileSize;this._canvasProto.width=a;this._canvasProto.height=a},_createTile:function(){var a=this._canvasProto.cloneNode(!1);a.onselectstart=a.onmousemove=L.Util.falseFn;return a},_loadTile:function(a,b,c){a._layer=this;this.drawTile(a,b,c);this.options.async||this.tileDrawn(a)},drawTile:function(){}, tileDrawn:function(a){this._tileOnLoad.call(a)}});L.ImageOverlay=L.Class.extend({includes:L.Mixin.Events,initialize:function(a,b){this._url=a;this._bounds=b},onAdd:function(a){this._map=a;this._image||this._initImage();a.getPanes().overlayPane.appendChild(this._image);a.on("viewreset",this._reset,this);this._reset()},onRemove:function(a){a.getPanes().overlayPane.removeChild(this._image);a.off("viewreset",this._reset,this)},_initImage:function(){this._image=L.DomUtil.create("img","leaflet-image-layer");this._image.style.visibility="hidden";L.Util.extend(this._image, {galleryimg:"no",onselectstart:L.Util.falseFn,onmousemove:L.Util.falseFn,onload:this._onImageLoad,src:this._url})},_reset:function(){var a=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),b=this._map.latLngToLayerPoint(this._bounds.getSouthEast()).subtract(a);L.DomUtil.setPosition(this._image,a);this._image.style.width=b.x+"px";this._image.style.height=b.y+"px"},_onImageLoad:function(){this.style.visibility=""}});L.Popup=L.Class.extend({includes:L.Mixin.Events,options:{maxWidth:300,autoPan:!0,closeButton:!0,offset:new L.Point(0,2),autoPanPadding:new L.Point(5,5)},initialize:function(a){L.Util.setOptions(this,a)},onAdd:function(a){this._map=a;this._container||this._initLayout();this._updateContent();this._container.style.opacity="0";this._map._panes.popupPane.appendChild(this._container);this._map.on("viewreset",this._updatePosition,this);if(this._map.options.closePopupOnClick)this._map.on("preclick",this._close, @@ -92,22 +92,28 @@ b=new L.Point(Math.min(b.x,this._startLayerPoint.x),Math.min(b.y,this._startLaye this._map.layerPointToLatLng(a)))}});L.Handler.MarkerDrag=L.Handler.extend({initialize:function(a){this._marker=a},enable:function(){if(!this._enabled){if(!this._draggable)this._draggable=new L.Draggable(this._marker._icon,this._marker._icon),this._draggable.on("dragstart",this._onDragStart,this),this._draggable.on("drag",this._onDrag,this),this._draggable.on("dragend",this._onDragEnd,this);this._draggable.enable();this._enabled=!0}},disable:function(){if(this._enabled)this._draggable.disable(),this._enabled=!1},moved:function(){return this._draggable&& this._draggable._moved},_onDragStart:function(){this._marker.closePopup();this._marker.fire("movestart");this._marker.fire("dragstart")},_onDrag:function(){var a=L.DomUtil.getPosition(this._marker._icon);this._marker._shadow&&L.DomUtil.setPosition(this._marker._shadow,a);this._marker._latlng=this._marker._map.layerPointToLatLng(a);this._marker.fire("move");this._marker.fire("drag")},_onDragEnd:function(){this._marker.fire("moveend");this._marker.fire("dragend")}});L.Control={};L.Control.Position={TOP_LEFT:"topLeft",TOP_RIGHT:"topRight",BOTTOM_LEFT:"bottomLeft",BOTTOM_RIGHT:"bottomRight"};L.Control.Zoom=L.Class.extend({onAdd:function(a){this._map=a;this._container=L.DomUtil.create("div","leaflet-control-zoom");this._zoomInButton=this._createButton("Zoom in","leaflet-control-zoom-in",this._map.zoomIn,this._map);this._zoomOutButton=this._createButton("Zoom out","leaflet-control-zoom-out",this._map.zoomOut,this._map);this._container.appendChild(this._zoomInButton);this._container.appendChild(this._zoomOutButton)},getContainer:function(){return this._container},getPosition:function(){return L.Control.Position.TOP_LEFT}, _createButton:function(a,b,c,d){var e=document.createElement("a");e.href="#";e.title=a;e.className=b;L.DomEvent.disableClickPropagation(e);L.DomEvent.addListener(e,"click",L.DomEvent.preventDefault);L.DomEvent.addListener(e,"click",c,d);return e}});L.Control.Attribution=L.Class.extend({onAdd:function(a){this._container=L.DomUtil.create("div","leaflet-control-attribution");this._map=a;this._prefix='Powered by Leaflet';this._attributions={};this._update()},getPosition:function(){return L.Control.Position.BOTTOM_RIGHT},getContainer:function(){return this._container},setPrefix:function(a){this._prefix=a},addAttribution:function(a){a&&(this._attributions[a]=!0,this._update())},removeAttribution:function(a){a&& -(delete this._attributions[a],this._update())},_update:function(){if(this._map){var a=[],b;for(b in this._attributions)this._attributions.hasOwnProperty(b)&&a.push(b);b=[];this._prefix&&b.push(this._prefix);a.length&&b.push(a.join(", "));this._container.innerHTML=b.join(" — ")}}});L.Map=L.Class.extend({includes:L.Mixin.Events,options:{crs:L.CRS.EPSG3857||L.CRS.EPSG4326,scale:function(a){return 256*(1< Date: Sun, 14 Aug 2011 22:36:05 -0600 Subject: [PATCH 0049/2207] Fix geojson-options link --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 8b9eb8ec7d5..1817e904c7f 100644 --- a/reference.html +++ b/reference.html @@ -1684,7 +1684,7 @@

    Constructor

    Description - L.GeoJSON( <Object> geojson?, <GeoJSON optionsoptions? ) + L.GeoJSON( <Object> geojson?, <GeoJSON optionsoptions? ) Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it with addGeoJSON method) and an options object. From 9fb1d7d1e4fbb5ed74bb55eaf8e19873330d4e03 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Sun, 14 Aug 2011 22:44:20 -0600 Subject: [PATCH 0050/2207] Adding "getLatLngs" method documentation for L.Polyline. --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index 1817e904c7f..6337c0173f0 100644 --- a/reference.html +++ b/reference.html @@ -1406,6 +1406,11 @@

    Methods

    setLatLngs( <LatLng[]> latlngs ) this Replaces all the points in the polyline with the given array of geographical points. + + + getLatLngs() + LatLng[] + Returns an array of the points in the path. spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLnglatlng1?, <LatLnglatlng2?, … ) From 8acab197f9bed4ef5e8e3bc099dba565e31bb986 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Sun, 14 Aug 2011 22:49:56 -0600 Subject: [PATCH 0051/2207] Adding "getBounds" method documentation for L.Path. --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index 6337c0173f0..c3da9a3ca27 100644 --- a/reference.html +++ b/reference.html @@ -1331,6 +1331,11 @@

    Methods

    setStyle( <Path optionsobject) this Changes the appearance of a Path based on the options in the Path options object. + + + getBounds() + LatLngBounds + Returns the LatLngBounds of the path. From f04412b4e31966e102c0fcd86827da805fd3055e Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 16 Aug 2011 14:44:04 -0600 Subject: [PATCH 0052/2207] Adding "getBounds" documentation for Polyline. --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index c3da9a3ca27..d4c23192407 100644 --- a/reference.html +++ b/reference.html @@ -1421,6 +1421,11 @@

    Methods

    spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLnglatlng1?, <LatLnglatlng2?, … ) LatLng[] Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). + + + getBounds() + LatLngBounds + Returns the LatLngBounds of the polyline. From 833fee53bbb6cfae5f398c4e46956cd78ec83811 Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 20 Sep 2011 17:20:00 +0300 Subject: [PATCH 0053/2207] update highlight.js and leaflet build --- dist/leaflet.js | 2 +- docs/highlight/highlight.pack.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/leaflet.js b/dist/leaflet.js index d49d589179c..9c5610d61be 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -17,7 +17,7 @@ a.slice(d),g=this.simplifyDP(c,b).slice(0,g-2),d=this.simplifyDP(d,b),g.concat(d b]},_getEdgeIntersection:function(a,b,c,d){var e=b.x-a.x,b=b.y-a.y,f=d.min,d=d.max;if(c&8)return new L.Point(a.x+e*(d.y-a.y)/b,d.y);else if(c&4)return new L.Point(a.x+e*(f.y-a.y)/b,f.y);else if(c&2)return new L.Point(d.x,a.y+b*(d.x-a.x)/e);else if(c&1)return new L.Point(f.x,a.y+b*(f.x-a.x)/e)},_getBitCode:function(a,b){var c=0;a.xb.max.x&&(c|=2);a.yb.max.y&&(c|=8);return c},_sqDist:function(a,b){var c=b.x-a.x,d=b.y-a.y;return c*c+d*d},_sqClosestPointOnSegment:function(a, b,c){var d=c.x-b.x,e=c.y-b.y,f=b;if(d||e){var g=((a.x-b.x)*d+(a.y-b.y)*e)/this._sqDist(b,c);g>1?f=c:g>0&&(f=new L.Point(b.x+d*g,b.y+e*g))}f._sqDist=this._sqDist(a,f);return f},_sqPointToSegmentDist:function(a,b,c){return this._sqClosestPointOnSegment(a,b,c)._sqDist}};L.PolyUtil={};L.PolyUtil.clipPolygon=function(a,b){var c,d=[1,4,2,8],e,f,g,h,j,k,l=L.LineUtil;e=0;for(j=a.length;e0&&c<=h;f=b}}function e(){if(g)j.type="dblclick",b(j),f=null}var f,g=!1,h=250,j;a["_leaflet_touchstart"+c]=d;a["_leaflet_touchend"+c]=e;a.addEventListener("touchstart",d,!1);a.addEventListener("touchend",e,!1)},removeDoubleTapListener:function(a,b){a.removeEventListener(a,a["_leaflet_touchstart"+b],!1);a.removeEventListener(a,a["_leaflet_touchend"+b], !1)}});L.DomUtil={get:function(a){return typeof a=="string"?document.getElementById(a):a},getStyle:function(a,b){var c=a.style[b];!c&&a.currentStyle&&(c=a.currentStyle[b]);if(!c||c=="auto")c=(c=document.defaultView.getComputedStyle(a,null))?c[b]:null;return c=="auto"?null:c},getViewportOffset:function(a){var b=0,c=0,d=a,e=document.body;do if(b+=d.offsetTop||0,c+=d.offsetLeft||0,d.offsetParent==e&&L.DomUtil.getStyle(d,"position")=="absolute")break;while(d=d.offsetParent);d=a;do{if(d===e)break;b-=d.scrollTop|| diff --git a/docs/highlight/highlight.pack.js b/docs/highlight/highlight.pack.js index 9c01de2ac89..076cfecc736 100644 --- a/docs/highlight/highlight.pack.js +++ b/docs/highlight/highlight.pack.js @@ -1 +1 @@ -var hljs=new function(){var p={};var a={};function n(c){return c.replace(/&/gm,"&").replace(//gm,">")}function k(s,r){if(!s){return false}for(var c=0;c"}function B(C){return""}while(z.length||A.length){var w=v().splice(0,1)[0];x+=n(y.substr(s,w.offset-s));s=w.offset;if(w.event=="start"){x+=t(w.node);u.push(w.node)}else{if(w.event=="stop"){var r=u.length;do{r--;var c=u[r];x+=B(c)}while(c!=w.node);u.splice(r,1);while(r'+n(M[0])+""}else{O+=n(M[0])}R=Q.lR.lastIndex;M=Q.lR.exec(N)}O+=n(N.substr(R,N.length-R));return O}function L(r,N){if(N.subLanguage&&a[N.subLanguage]){var M=g(N.subLanguage,r);u+=M.keyword_count;C+=M.r;return M.value}else{return G(r,N)}}function J(N,r){var M=N.nM?"":'';if(N.rB){s+=M;N.buffer=""}else{if(N.eB){s+=n(r)+M;N.buffer=""}else{s+=M;N.buffer=r}}D[D.length]=N}function F(M,O,R){var P=D[D.length-1];if(R){s+=L(P.buffer+M,P);return false}var S=A(O,P);if(S){s+=L(P.buffer+M,P);J(S,O);C+=S.r;return S.rB}var r=x(D.length-1,O);if(r){var T=P.nM?"":"";if(P.rE){s+=L(P.buffer+M,P)+T}else{if(P.eE){s+=L(P.buffer+M,P)+T+n(O)}else{s+=L(P.buffer+M+O,P)+T}}while(r>1){T=D[D.length-2].nM?"":"";s+=T;r--;D.length--}var Q=D[D.length-1];D.length--;D[D.length-1].buffer="";if(Q.starts){for(var N=0;N1){throw"Illegal"}return{language:K,r:C,keyword_count:u,value:s}}catch(H){if(H=="Illegal"){return{language:null,r:0,keyword_count:0,value:n(E)}}else{throw H}}}function i(){function r(y,x){if(y.compiled){return}if(y.b){y.bR=e(x,"^"+y.b)}if(y.e){y.eR=e(x,"^"+y.e)}if(y.i){y.iR=e(x,"^(?:"+y.i+")")}if(y.r==undefined){y.r=1}if(!y.displayClassName){y.displayClassName=y.cN}if(!y.cN){y.nM=true}for(var w in y.k){if(!y.k.hasOwnProperty(w)){continue}if(y.k[w] instanceof Object){y.keywordGroups=y.k}else{y.keywordGroups={keyword:y.k}}break}y.sm=[];if(y.c){for(var v=0;vz.keyword_count+z.r){z=w}if(w.keyword_count+w.r>y.keyword_count+y.r){z=y;y=w}}}var u=v.className;if(!u.match(y.language)){u=u?(u+" "+y.language):y.language}var c=d(v);if(c.length){var s=document.createElement("pre");s.innerHTML=y.value;y.value=m(c,d(s),C)}if(A){y.value=y.value.replace(/^((<[^>]+>|\t)+)/gm,function(D,G,F,E){return G.replace(/\t/g,A)})}if(r){y.value=y.value.replace(/\n/g,"
    ")}if(/MSIE [678]/.test(navigator.userAgent)&&v.tagName=="CODE"&&v.parentNode.tagName=="PRE"){var s=v.parentNode;var x=document.createElement("div");x.innerHTML="
    "+y.value+"
    ";v=x.firstChild.firstChild;x.firstChild.cN=s.cN;s.parentNode.replaceChild(x.firstChild,s)}else{v.innerHTML=y.value}v.className=u;v.dataset={};v.dataset.result={language:y.language,kw:y.keyword_count,re:y.r};if(z&&z.language){v.dataset.second_best={language:z.language,kw:z.keyword_count,re:z.r}}}function l(){if(l.called){return}l.called=true;f();if(arguments.length){for(var c=0;c|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:["escape"],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:["escape"],r:0};this.BE={cN:"escape",b:"\\\\.",e:this.IMR,nM:true,r:0};this.CLCM={cN:"comment",b:"//",e:"$",r:0};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NUMBER_MODE={cN:"number",b:this.NR,e:this.IMR,r:0};this.CNM={cN:"number",b:this.CNR,e:this.IMR,r:0};this.inherit=function(c,t){var s={};for(var r in c){s[r]=c[r]}if(t){for(var r in t){s[r]=t[r]}}return s}}();var initHighlightingOnLoad=hljs.initHighlightingOnLoad;(function(){var d="[A-Za-z0-9\\._:-]+";var k={cN:"pi",b:"<\\?",e:"\\?>",r:10};var i={cN:"doctype",b:"",r:10};var j={cN:"comment",b:""};var g={cN:"tag",b:"",c:["title","tag_internal"]};var e={cN:"title",b:d,e:hljs.IMR};var b={cN:"tag_internal",b:hljs.IMR,eW:true,nM:true,c:["attribute","value_container"],r:0};var f={cN:"attribute",b:d,e:hljs.IMR,r:0};var a={cN:"value_container",b:'="',rB:true,e:'"',nM:true,c:[{cN:"value",b:'"',eW:true}]};var c={cN:"value_container",b:"='",rB:true,e:"'",nM:true,c:[{cN:"value",b:"'",eW:true}]};hljs.LANGUAGES.xml={dM:{c:["pi","doctype","comment","cdata","tag"]},cI:true,m:[{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},k,i,j,g,hljs.inherit(e,{r:1.75}),b,f,a,c]};var h={code:1,kbd:1,font:1,noscript:1,style:1,img:1,title:1,menu:1,tt:1,tr:1,param:1,li:1,tfoot:1,th:1,input:1,td:1,dl:1,blockquote:1,fieldset:1,big:1,dd:1,abbr:1,optgroup:1,dt:1,button:1,isindex:1,p:1,small:1,div:1,dir:1,em:1,frame:1,meta:1,sub:1,bdo:1,label:1,acronym:1,sup:1,body:1,basefont:1,base:1,br:1,address:1,strong:1,legend:1,ol:1,script:1,caption:1,s:1,col:1,h2:1,h3:1,h1:1,h6:1,h4:1,h5:1,table:1,select:1,noframes:1,span:1,area:1,dfn:1,strike:1,cite:1,thead:1,head:1,option:1,form:1,hr:1,"var":1,link:1,b:1,colgroup:1,ul:1,applet:1,del:1,iframe:1,pre:1,frameset:1,ins:1,tbody:1,html:1,samp:1,map:1,object:1,a:1,xmlns:1,center:1,textarea:1,i:1,q:1,u:1,section:1,nav:1,article:1,aside:1,hgroup:1,header:1,footer:1,figure:1,figurecaption:1,time:1,mark:1,wbr:1,embed:1,video:1,audio:1,source:1,canvas:1,datalist:1,keygen:1,output:1,progress:1,meter:1,details:1,summary:1,command:1};hljs.LANGUAGES.html={dM:{c:["comment","pi","doctype","vbscript","tag"]},cI:true,m:[{cN:"tag",b:"",l:[hljs.IR],k:{style:1},c:["tag_internal"],starts:"css"},{cN:"tag",b:"",l:[hljs.IR],k:{script:1},c:["tag_internal"],starts:"javascript"},{cN:"css",e:"",rE:true,subLanguage:"css"},{cN:"javascript",e:"<\/script>",rE:true,subLanguage:"javascript"},{cN:"vbscript",b:"<%",e:"%>",subLanguage:"vbscript"},j,k,i,hljs.inherit(g),hljs.inherit(e,{l:[hljs.IR],k:h,}),hljs.inherit(b),f,a,c,{cN:"value_container",b:"=",e:hljs.IMR,c:[{cN:"unquoted_value",displayClassName:"value",b:"[^\\s/>]+",e:hljs.IMR}]}]}})();hljs.LANGUAGES.javascript={dM:{l:[hljs.UIR],c:["string","comment","number","regexp_container","function"],k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}}},m:[hljs.CLCM,hljs.CBLCLM,hljs.CNM,hljs.ASM,hljs.QSM,hljs.BE,{cN:"regexp_container",b:"("+hljs.RSR+"|case|return|throw)\\s*",e:hljs.IMR,nM:true,l:[hljs.IR],k:{"return":1,"throw":1,"case":1},c:["comment",{cN:"regexp",b:"/.*?[^\\\\/]/[gim]*",e:hljs.IMR}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",l:[hljs.UIR],k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*",e:hljs.IMR},{cN:"params",b:"\\(",e:"\\)",c:["string","comment"]}]}]};hljs.LANGUAGES.css={dM:{c:["at_rule","id","class","attr_selector","pseudo","rules","comment"],k:hljs.HTML_TAGS,l:[hljs.IR],i:"="},cI:true,m:[{cN:"at_rule",b:"@",e:"[{;]",eE:true,l:[hljs.IR],k:{"import":1,page:1,media:1,charset:1,"font-face":1},c:["function","string","number","pseudo"]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",e:hljs.IMR},{cN:"class",b:"\\.[A-Za-z0-9_-]+",e:hljs.IMR,r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+",e:hljs.IMR},{cN:"rules",b:"{",e:"}",c:[{cN:"rule",b:"[A-Z\\_\\.\\-]+\\s*:",e:";",eW:true,l:["[A-Za-z-]+"],k:{"play-during":1,"counter-reset":1,"counter-increment":1,"min-height":1,quotes:1,"border-top":1,pitch:1,font:1,pause:1,"list-style-image":1,"border-width":1,cue:1,"outline-width":1,"border-left":1,elevation:1,richness:1,"speech-rate":1,"border-bottom":1,"border-spacing":1,background:1,"list-style-type":1,"text-align":1,"page-break-inside":1,orphans:1,"page-break-before":1,"text-transform":1,"line-height":1,"padding-left":1,"font-size":1,right:1,"word-spacing":1,"padding-top":1,"outline-style":1,bottom:1,content:1,"border-right-style":1,"padding-right":1,"border-left-style":1,"voice-family":1,"background-color":1,"border-bottom-color":1,"outline-color":1,"unicode-bidi":1,"max-width":1,"font-family":1,"caption-side":1,"border-right-width":1,"pause-before":1,"border-top-style":1,color:1,"border-collapse":1,"border-bottom-width":1,"float":1,height:1,"max-height":1,"margin-right":1,"border-top-width":1,speak:1,"speak-header":1,top:1,"cue-before":1,"min-width":1,width:1,"font-variant":1,"border-top-color":1,"background-position":1,"empty-cells":1,direction:1,"border-right":1,visibility:1,padding:1,"border-style":1,"background-attachment":1,overflow:1,"border-bottom-style":1,cursor:1,margin:1,display:1,"border-left-width":1,"letter-spacing":1,"vertical-align":1,clip:1,"border-color":1,"list-style":1,"padding-bottom":1,"pause-after":1,"speak-numeral":1,"margin-left":1,widows:1,border:1,"font-style":1,"border-left-color":1,"pitch-range":1,"background-repeat":1,"table-layout":1,"margin-bottom":1,"speak-punctuation":1,"font-weight":1,"border-right-color":1,"page-break-after":1,position:1,"white-space":1,"text-indent":1,"background-image":1,volume:1,stress:1,outline:1,clear:1,"z-index":1,"text-decoration":1,"margin-top":1,azimuth:1,"cue-after":1,left:1,"list-style-position":1},c:[{cN:"value",b:hljs.IMR,eW:true,eE:true,c:["function","number","hexcolor","string","important","comment"]}]},"comment"],i:"[^\\s]"},hljs.CBLCLM,{cN:"number",b:hljs.NR,e:hljs.IMR},{cN:"hexcolor",b:"\\#[0-9A-F]+",e:hljs.IMR},{cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{cN:"params",b:hljs.IMR,eW:true,eE:true,c:["number","string"]}]},{cN:"important",b:"!important",e:hljs.IMR},hljs.ASM,hljs.QSM,hljs.BE]}; \ No newline at end of file +var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
    ")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
    "+w.value+"
    ";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/.*?[^\\\\/]/[gim]*"}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@font-face",l:"[a-z-]+",k:{"font-face":1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"",rE:true,sL:"css"}},{cN:"tag",b:"",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},a]}]}}}(); \ No newline at end of file From ddd0fd16d7842eedb911aa0f257d3dd1e40a47ac Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 20 Sep 2011 22:50:47 -0600 Subject: [PATCH 0054/2207] debug page for geojson was broken. Missing "color" property for MultiPolygon. --- debug/geojson/geojson-sample.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/debug/geojson/geojson-sample.js b/debug/geojson/geojson-sample.js index 24ecf05002e..811bfbd953e 100644 --- a/debug/geojson/geojson-sample.js +++ b/debug/geojson/geojson-sample.js @@ -44,6 +44,9 @@ var geojsonSample = { "geometry": { "type": "MultiPolygon", "coordinates": [[[[100.0, 1.5], [100.5, 1.5], [100.5, 2.0], [100.0, 2.0], [100.0, 1.5]]], [[[100.5, 2.0], [100.5, 2.5], [101.0, 2.5], [101.0, 2.0], [100.5, 2.0]]]] + }, + "properties": { + "color": "#ff7800" } } ] From f0957521344f42b853c80ec8bc5cb90cc686a851 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 21 Sep 2011 00:08:12 -0600 Subject: [PATCH 0055/2207] Getting started with a GeoJSON example page. --- examples.html | 5 + examples/geojson-example.html | 67 ++++---- examples/geojson-sample.js | 50 ------ examples/geojson.html | 139 ++++++++++++++++ examples/sample-geojson.js | 293 ++++++++++++++++++++++++++++++++++ 5 files changed, 464 insertions(+), 90 deletions(-) delete mode 100644 examples/geojson-sample.js create mode 100644 examples/geojson.html create mode 100644 examples/sample-geojson.js diff --git a/examples.html b/examples.html index e22b123a9a3..d41997c524e 100644 --- a/examples.html +++ b/examples.html @@ -67,6 +67,11 @@

    Leaflet on Mobile

    Markers With Custom Icons

    In this pretty example, you'll learn how to easily define your own icons for use by the markers you put on the map.

    +
    + + +

    Using GeoJSON with Leaflet

    +

    Blah Blah Blah. GeoJSON. Blah Blah Blah.


    Layer Groups and Layers Control

    diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 9b361788f79..c9cb497f851 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -1,55 +1,42 @@ - Leaflet debug page - - - + Leaflet GeoJSON example - + + - + + +
    -
    - - - - \ No newline at end of file diff --git a/examples/geojson-sample.js b/examples/geojson-sample.js deleted file mode 100644 index 24ecf05002e..00000000000 --- a/examples/geojson-sample.js +++ /dev/null @@ -1,50 +0,0 @@ -var geojsonSample = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [102.0, 0.5] - }, - "properties": { - "prop0": "value0", - "color": "blue" - } - }, - - { - "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]] - }, - "properties": { - "color": "red", - "prop1": 0.0 - } - }, - - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]] - }, - "properties": { - "color": "green", - "prop1": { - "this": "that" - } - } - }, - - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [[[[100.0, 1.5], [100.5, 1.5], [100.5, 2.0], [100.0, 2.0], [100.0, 1.5]]], [[[100.5, 2.0], [100.5, 2.5], [101.0, 2.5], [101.0, 2.0], [100.5, 2.0]]]] - } - } - ] -}; \ No newline at end of file diff --git a/examples/geojson.html b/examples/geojson.html new file mode 100644 index 00000000000..3deca67ee92 --- /dev/null +++ b/examples/geojson.html @@ -0,0 +1,139 @@ + + + + Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Leaflet on Mobile Example + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Leaflet

    +

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    + + + +

    ← Back to the list of examples

    +

    Using GeoJSON with Leaflet

    + +

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON.

    + +

    View example →

    + +

    Preparing the page

    + +

    First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

    + +
    body {
    +	padding: 0;
    +	margin: 0;
    +}
    +html, body, #map {
    +	height: 100%;
    +}
    + +

    Also, we need to tell the mobile browser to disable scaling of the page and set it to its actual size by placing the following line in the head section:

    + +
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    + +

    Initializing the map

    + +

    We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

    + +
    var map = new L.Map('map');
    +	
    +var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
    +	cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    +	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
    +
    +map.addLayer(cloudmade);
    + +

    Geolocation

    + +

    Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

    + +
    map.locateAndSetView(16);
    + +

    Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

    + +
    map.on('locationfound', onLocationFound);
    +		
    +function onLocationFound(e) {
    +	var radius = e.accuracy / 2;
    +
    +	var marker = new L.Marker(e.latlng);
    +	map.addLayer(marker);
    +	marker.bindPopup("You are within " + radius + " meters from this point").openPopup();
    +	
    +	var circle = new L.Circle(e.latlng, radius);
    +	map.addLayer(circle);	
    +}
    + +

    Excellent! But it would also be nice to show an error message if the geolocation failed:

    + +
    map.on('locationerror', onLocationError);
    +		
    +function onLocationError(e) {
    +	alert(e.message);
    +}
    + +

    Now the example is complete — try it on your mobile phone: View the full example →

    + +

    Next steps would be to take a look at the detailed documentation and browse other examples.

    + +
    + +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +
    + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js new file mode 100644 index 00000000000..0657bd99cb0 --- /dev/null +++ b/examples/sample-geojson.js @@ -0,0 +1,293 @@ +var free_bus = { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -104.9872612953186, + 39.74136172336104 + ], + [ + -104.9872076511383, + 39.74132459919613 + ], + [ + -104.987154006958, + 39.74127097536707 + ], + [ + -104.98713791370392, + 39.741176102336496 + ], + [ + -104.98712182044983, + 39.7410647294818 + ], + [ + -104.9871164560318, + 39.74098223095487 + ], + [ + -104.98707354068755, + 39.7409533564471 + ], + [ + -104.9869179725647, + 39.74096160630769 + ], + [ + -104.98688042163849, + 39.74099460574021 + ], + [ + -104.9868643283844, + 39.74104410485933 + ], + [ + -104.98688578605652, + 39.74110597870824 + ], + [ + -104.98693406581877, + 39.7411389780716 + ], + [ + -104.98726665973663, + 39.74137409807824 + ], + [ + -104.98783528804779, + 39.74183608592994 + ], + [ + -104.9886828660965, + 39.74249606320252 + ], + [ + -104.98956263065338, + 39.74318078294193 + ], + [ + -104.99041557312012, + 39.74383249781977 + ], + [ + -104.99128460884093, + 39.74450483012657 + ], + [ + -104.9921590089798, + 39.745181280550725 + ], + [ + -104.99301731586455, + 39.74583710114599 + ], + [ + -104.99392926692963, + 39.746534161476056 + ], + [ + -104.99477684497833, + 39.74719821830812 + ], + [ + -104.99564051628113, + 39.74785401970543 + ], + [ + -104.996520280838, + 39.74853043724829 + ], + [ + -104.99739468097687, + 39.74920684815003 + ], + [ + -104.99827444553374, + 39.74989562559743 + ], + [ + -104.99917566776276, + 39.75054727696244 + ], + [ + -105.00002861022949, + 39.7512112951138 + ], + [ + -105.00090301036835, + 39.751875306864676 + ], + [ + -105.0020295381546, + 39.75273727530449 + ], + [ + -105.00257134437561, + 39.753298167635116 + ], + [ + -105.00342428684235, + 39.75393741435492 + ], + [ + -105.00234067440032, + 39.75481172929469 + ], + [ + -105.00259280204773, + 39.75499318949525 + ], + [ + -105.00265181064606, + 39.75501793403101 + ], + [ + -105.00271081924438, + 39.75501793403101 + ], + [ + -105.00313997268677, + 39.75488596307089 + ], + [ + -105.0033438205719, + 39.754799356990866 + ], + [ + -105.0033974647522, + 39.7547622400661 + ], + [ + -105.00344038009644, + 39.75471687490865 + ], + [ + -105.00349938869476, + 39.754617896279655 + ], + [ + -105.00351548194885, + 39.75455603456428 + ], + [ + -105.00353157520293, + 39.75450654515198 + ], + [ + -105.00342965126036, + 39.753941538508016 + ] + ] + }, + "properties": { + "name": "16th Street Free Bus", + "popup_content": "This is the 16th street free bus in Denver, a good way to cross town." + }, + "id": 1 +}; + +var bicycle_rental = { + "type": "FeatureCollection", + "features": [ + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9998241, + 39.7471494 + ] + }, + "type": "Feature", + "properties": { + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + }, + "id": 51 + }, + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9983545, + 39.7502833 + ] + }, + "type": "Feature", + "properties": { + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + }, + "id": 52 + }, + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9963919, + 39.7444271 + ] + }, + "type": "Feature", + "properties": { + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + }, + "id": 54 + }, + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9960754, + 39.7498956 + ] + }, + "type": "Feature", + "properties": { + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + }, + "id": 55 + }, + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9933717, + 39.7477264 + ] + }, + "type": "Feature", + "properties": { + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + }, + "id": 57 + }, + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9913392, + 39.7432392 + ] + }, + "type": "Feature", + "properties": { + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + }, + "id": 58 + }, + { + "geometry": { + "type": "Point", + "coordinates": [ + -104.9788452, + 39.6933755 + ] + }, + "type": "Feature", + "properties": { + "name": "Denver B-cycle" + }, + "id": 74 + } + ] +}; \ No newline at end of file From a86ea1a8c3be9220ac8ec7528216d3dac6a96fda Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 21 Sep 2011 22:50:23 -0600 Subject: [PATCH 0056/2207] Adding GeoJSON MultiPolygon (one with a donut hole) to example. --- examples/geojson-example.html | 3 +- examples/sample-geojson.js | 55 +++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index c9cb497f851..6d7d089b180 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -35,7 +35,8 @@ map.addLayer( geojson_layer ); geojson_layer.addGeoJSON( free_bus ); - geojson_layer.addGeoJSON( bicycle_rental ); + geojson_layer.addGeoJSON( bicycle_rental ); + geojson_layer.addGeoJSON( campus ); diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js index 0657bd99cb0..d16c3b84420 100644 --- a/examples/sample-geojson.js +++ b/examples/sample-geojson.js @@ -285,9 +285,60 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "name": "Denver B-cycle" + "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 74 } ] -}; \ No newline at end of file +}; + +var campus = { + "type": "Feature", + "properties": { + "popup_content": "This is the Auraria West Campus" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-105.00432014465332, 39.74732195489861], + [-105.00715255737305, 39.74620006835170], + [-105.00921249389647, 39.74468219277038], + [-105.01067161560059, 39.74362625960105], + [-105.01195907592773, 39.74290029616054], + [-105.00989913940431, 39.74078835902781], + [-105.00758171081543, 39.74059036160317], + [-105.00346183776855, 39.74059036160317], + [-105.00097274780272, 39.74059036160317], + [-105.00062942504881, 39.74072235994946], + [-105.00020027160645, 39.74191033368865], + [-105.00071525573731, 39.74276830198601], + [-105.00097274780272, 39.74369225589818], + [-105.00097274780272, 39.74461619742136], + [-105.00123023986816, 39.74534214278395], + [-105.00183105468751, 39.74613407445653], + [-105.00432014465332, 39.74732195489861] + ],[ + [-105.00361204147337, 39.74354376414072], + [-105.00301122665405, 39.74278480127163], + [-105.00221729278564, 39.74316428375108], + [-105.00283956527711, 39.74390674342741], + [-105.00361204147337, 39.74354376414072] + ] + ],[ + [ + [-105.00942707061768, 39.73989736613708], + [-105.00942707061768, 39.73910536278566], + [-105.00685214996338, 39.73923736397631], + [-105.00384807586671, 39.73910536278566], + [-105.00174522399902, 39.73903936209552], + [-105.00041484832764, 39.73910536278566], + [-105.00041484832764, 39.73979836621592], + [-105.00535011291504, 39.73986436617916], + [-105.00942707061768, 39.73989736613708] + ] + ] + ] + } +}; From 6bfe2a6a41a058499bf4246ff57fbd56f5e2c20c Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 21 Sep 2011 23:05:00 -0600 Subject: [PATCH 0057/2207] Styling the GeoJSON features a bit. Styles are based on a "style" object in the GeoJSON properties. --- examples/geojson-example.html | 3 +++ examples/sample-geojson.js | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 6d7d089b180..005c72f9e1a 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -30,6 +30,9 @@ popup_content += e.properties.popup_content; } e.layer.bindPopup( popup_content ); + if ( e.properties && e.properties.style ) { + e.layer.setStyle( e.properties.style ); + } } ); map.addLayer( geojson_layer ); diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js index d16c3b84420..d537af5e220 100644 --- a/examples/sample-geojson.js +++ b/examples/sample-geojson.js @@ -183,6 +183,11 @@ var free_bus = { }, "properties": { "name": "16th Street Free Bus", + "style": { + color: "#004070", + weight: 4, + opacity: 0.9 + }, "popup_content": "This is the 16th street free bus in Denver, a good way to cross town." }, "id": 1 @@ -295,7 +300,14 @@ var bicycle_rental = { var campus = { "type": "Feature", "properties": { - "popup_content": "This is the Auraria West Campus" + "popup_content": "This is the Auraria West Campus", + "style": { + weight: 2, + color: "#999", + opacity: 1, + fillColor: "#B0DE5C", + fillOpacity: 0.8 + } }, "geometry": { "type": "MultiPolygon", From f813568a2d73a250240899bc52a971b309ee3eb6 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 27 Sep 2011 19:20:16 -0600 Subject: [PATCH 0058/2207] More progress on geojson example. --- examples/baseball-marker.png | Bin 0 -> 1315 bytes examples/geojson-example.html | 48 ++++++++++- examples/geojson.html | 153 +++++++++++++++++++++------------- examples/sample-geojson.js | 11 +++ 4 files changed, 148 insertions(+), 64 deletions(-) create mode 100644 examples/baseball-marker.png diff --git a/examples/baseball-marker.png b/examples/baseball-marker.png new file mode 100644 index 0000000000000000000000000000000000000000..187492b913b41c8b2b00b8c387ebee617e893f13 GIT binary patch literal 1315 zcmV+;1>E|HP)xsENr${1d!3av=$sI&Zu) zG0_kbg$ox(1~e#2fW$Gj!N9_Pbd0Tx(w_G8hZjBPtnE2H?PNU3H*eqfoagy|-{*ba zoIXN6p9i43yW0WS0H-=SSXs*eIUo(>1_lN)075>W*T|iKONCPvU|S*boGKs<$STqU z0|OZ$6bfnNBH&d=7cV9QGLQfk)iJH@(xsC7g1u8$R+zZN!u|eE^=A&q6sKMc_D)@C z+q?~r=)vt4s|I_Ph~p6@eYCPONHkGkUU;Qu^vINTOu-f zkLaT*ghX>;tn$7n)+2emnjWprYz_)%tpU+pUv=mA9^59I&G5mSKjC$4;OF7@5wKVF zD~hdiYK5j(yC7H>{(Y7Fqt4TKoNM|1(jk;wlDYY5*84Ugx~-3*$ZRFVORM&Zn4F$K z$)q{D_eVU=we$^j(b@J1A9tQ%gSUgpnF&jOn@N@o0tCTkipQ}iN>-t#<0Na`8~N^X zh^idB(US6Mri+ zyj@;Q529lL9Pb(epl_&4e-@Xc3{U??pkWW^N52B#X*`BkTKgOV%F^Ut*T%lqWBUAf z*AU-ce47vV{etLh(ARr9zUJKU7d%Z*uv%!US%9$!1xE>{=k9aq&Z&}}A3Jcqgj_S9 zw4Jn)GQ=oGxfxbssfm)gw7L$v-9;o4qi?8-&kkHb5NzCz{>~0xs3c>#e3oSTi6MrS zRjnAiy-*W@K!8Xj!Z#NW>d$sIzf&{O{}xbefj~h29f?Ft-w_01Sprt-dk;XK9JyTX z#S2I#lcwv^Dj$lXJf8poTUEpsVzf5wF$8O0f2eAVssgO8kOn2Auz$;O-DfU-SN8>2 zSXij}8kz{GvxF?C0BH1V20+QmoFDyC_us$ea~7XIsp$XQ0v^vlDoOvy%vm1A$MyNH zmLAJERR!3EI!mM#nPA(e`ui8}oB|-0e5eu^(mXdmW9nanfK?TdP8BMAowTLI$LVl! z`A(lc54Ig+;mNFNj7kFZ%WJneD?$<*@ku*$=UdZf0q{3%<^KHApXrW`M_5(oHjPna zIZZ&O2*^pfVg}@t%xrvAk1#lPf<|u(4fQQ0g2rbrkW!3s*>YNUi+9eqvo>;^t z)FFv$4C(T^3!mBIFJs$=*8y0!x|PAP6NK;ekx~*g*0*36mUbLZ#E2&rwW+Lf=7dlv z9+-guic} zBi!%bO=)daZceMT=h|4@zFptbewaY>OC{uy=rDhc{7Sgr|C+i>?VO7Rn78LvrV4XW zs1r#QadU5b51ZD%48XrL|8RBW4B>u%he{q-A!|gHtg3(tBBWsN)b)Ms?*Z_~$Z2io zah5?|vj7tjURA_3Ks)m|h2pB2d|3j@M2IT1i=L*C`owa`mo1=3gjST=Rn@LodO73( Z{{cKA=3m()Hbwvd002ovPDHLkV1ndPe7pbv literal 0 HcmV?d00001 diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 005c72f9e1a..f9747d6de7c 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -7,6 +7,7 @@ + @@ -19,10 +20,39 @@ cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade', cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution}); - map.setView(new L.LatLng(39.74402223643582, -104.99264717102051), 14) + map.setView(new L.LatLng(39.74738794765598, -105.00002861022949), 14) .addLayer(cloudmade); + + var BaseballIcon = L.Icon.extend({ + iconUrl: 'baseball-marker.png', + shadowUrl: null, + iconSize: new L.Point(32, 37), + shadowSize: null, + iconAnchor: new L.Point(14, 37), + popupAnchor: new L.Point(2, -32) + }); - var geojson_layer = new L.GeoJSON(); + var geojson_layer = new L.GeoJSON( null, { + pointToLayer: function ( latlng ) { + return new L.CircleMarker( latlng, { + radius: 8, + fillColor: "#ff7800", + color: "#000", + weight: 1, + opacity: 1, + fillOpacity: 0.8 + } ); + + } + } ); + + var another_geojson_layer = new L.GeoJSON( coors_field, { + pointToLayer: function ( latlng ) { + return new L.Marker( latlng, { + icon: new BaseballIcon() + } ); + } + } ); geojson_layer.on( "featureparse", function( e ) { var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; @@ -35,11 +65,21 @@ } } ); - map.addLayer( geojson_layer ); + another_geojson_layer.on( "featureparse", function ( e ) { + var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + if ( e.properties && e.properties.popup_content ) { + popup_content += e.properties.popup_content; + } + e.layer.bindPopup( popup_content ); + } ); + + map.addLayer( geojson_layer ).addLayer( another_geojson_layer ); geojson_layer.addGeoJSON( free_bus ); geojson_layer.addGeoJSON( bicycle_rental ); - geojson_layer.addGeoJSON( campus ); + geojson_layer.addGeoJSON( campus ); + + another_geojson_layer.addGeoJSON( coors_field ); diff --git a/examples/geojson.html b/examples/geojson.html index 3deca67ee92..0b88f66411f 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -42,70 +42,103 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    ← Back to the list of examples

    Using GeoJSON with Leaflet

    -

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON.

    +

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

    View example →

    -

    Preparing the page

    - -

    First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

    - -
    body {
    -	padding: 0;
    -	margin: 0;
    -}
    -html, body, #map {
    -	height: 100%;
    -}
    +

    About GeoJSON

    + +

    According to http://geojson.org:

    + +
    GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
    + +

    Leaflet supports all of the GeoJSON types above but Features and FeatureCollections allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

    + +

    The GeoJSON layer

    + +

    GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

    + +
    var geojson_layer = new L.GeoJSON();
    +
    +map.addLayer( geojson_layer );
    + +

    This creates an empty GeoJSON layer that we can easily add vectors to.

    + +
    var a_geojson_feature = {
    +    "type": "Feature",
    +    "properties": {
    +        "name": "Coors Field",
    +        "amenity": "Baseball Stadium"
    +    },
    +    "geometry": {
    +        "type": "Point",
    +        "coordinates": [-104.99404, 39.75621]
    +    }
    +};
    +
    +geojson_layer.addGeoJSON( a_geojson_feature );
    + +

    We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

    + +
    var a_geojson_feature = {
    +    "type": "Feature",
    +    "properties": {
    +        "name": "Coors Field",
    +        "amenity": "Baseball Stadium"
    +    },
    +    "geometry": {
    +        "type": "Point",
    +        "coordinates": [-104.99404, 39.75621]
    +    }
    +};
    +        
    +var geojson_layer = new L.GeoJSON( a_geojson_feature );
    +
    +map.addLayer( geojson_layer );
    + +

    Popups

    + +

    We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popup_content" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

    + +
    geojson_layer.on( "featureparse", function ( e ) {
    +    if ( e.properties && e.properties.popup_content ) {
    +        e.layer.bindPopup( e.properties.popup_content );
    +    }
    +} );
    + +

    Styling Features

    -

    Also, we need to tell the mobile browser to disable scaling of the page and set it to its actual size by placing the following line in the head section:

    - -
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    - -

    Initializing the map

    - -

    We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

    - -
    var map = new L.Map('map');
    -	
    -var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
    -	cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    -	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
    -
    -map.addLayer(cloudmade);
    - -

    Geolocation

    - -

    Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

    - -
    map.locateAndSetView(16);
    - -

    Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

    - -
    map.on('locationfound', onLocationFound);
    -		
    -function onLocationFound(e) {
    -	var radius = e.accuracy / 2;
    -
    -	var marker = new L.Marker(e.latlng);
    -	map.addLayer(marker);
    -	marker.bindPopup("You are within " + radius + " meters from this point").openPopup();
    -	
    -	var circle = new L.Circle(e.latlng, radius);
    -	map.addLayer(circle);	
    -}
    - -

    Excellent! But it would also be nice to show an error message if the geolocation failed:

    - -
    map.on('locationerror', onLocationError);
    -		
    -function onLocationError(e) {
    -	alert(e.message);
    -}
    - -

    Now the example is complete — try it on your mobile phone: View the full example →

    - -

    Next steps would be to take a look at the detailed documentation and browse other examples.

    +

    We can also listen to the featureparse event to style our LineString and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

    + +
    var free_bus = {
    +    "type": "Feature",
    +    "geometry": {
    +        "type": "LineString",
    +        "coordinates": [
    +            [-104.98726, 39.74136],
    +            [-104.98720, 39.74132],
    +            [-104.98715, 39.74127],
    +            [-104.98713, 39.74117],
    +            [-104.98712, 39.74106], ...
    +        ]
    +    },
    +    "properties": {
    +        "name": "16th Street Free Bus",
    +        "style": {
    +            "color": "#004070",
    +            "weight": 4,
    +            "opacity": 0.9
    +        },
    +        "popup_content": "This is the 16th street free bus ..."
    +    }
    +};
    + +
    geojson_layer.on( "featureparse", function ( e ) {
    +	if ( e.properties && e.properties.style && e.layer.setStyle ) {
    +	    // The setStyle method isn't available for Points. More on that later ...
    +		e.layer.setStyle( e.properties.style );
    +	}
    +} );

    diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js index d537af5e220..f96f8b4fc51 100644 --- a/examples/sample-geojson.js +++ b/examples/sample-geojson.js @@ -354,3 +354,14 @@ var campus = { ] } }; + +var coors_field = { + "type": "Feature", + "properties": { + "popup_content": "Coors Field" + }, + "geometry": { + "type": "Point", + "coordinates": [-104.99404191970824, 39.756213909328125] + } +}; From e18e1fa7a24b92bb949f4a2a6ce047bbc8d5739c Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 27 Sep 2011 23:38:05 -0600 Subject: [PATCH 0059/2207] Adding image for main examples page. --- docs/images/geojson.png | Bin 0 -> 30839 bytes examples.html | 4 +- examples/geojson-example.html | 1 - examples/geojson.html | 106 ++++++++++++++++++++++++++++++++-- 4 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 docs/images/geojson.png diff --git a/docs/images/geojson.png b/docs/images/geojson.png new file mode 100644 index 0000000000000000000000000000000000000000..06de11419f5b162c4d5e5fc895574ae63dbb7279 GIT binary patch literal 30839 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 With Custom Icons
    -

    Using GeoJSON with Leaflet

    -

    Blah Blah Blah. GeoJSON. Blah Blah Blah.

    +

    Using GeoJSON with Leaflet

    +

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.


    Layer Groups and Layers Control

    diff --git a/examples/geojson-example.html b/examples/geojson-example.html index f9747d6de7c..238c12f9b5f 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -42,7 +42,6 @@ opacity: 1, fillOpacity: 0.8 } ); - } } ); diff --git a/examples/geojson.html b/examples/geojson.html index 0b88f66411f..37962c9aad0 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -44,6 +44,79 @@

    Using GeoJSON with Leaflet

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

    +
    + + + +

    View example →

    About GeoJSON

    @@ -52,7 +125,7 @@

    About GeoJSON

    GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
    -

    Leaflet supports all of the GeoJSON types above but Features and FeatureCollections allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

    +

    Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

    The GeoJSON layer

    @@ -62,13 +135,14 @@

    The GeoJSON layer

    map.addLayer( geojson_layer );
    -

    This creates an empty GeoJSON layer that we can easily add vectors to.

    +

    This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

    var a_geojson_feature = {
         "type": "Feature",
         "properties": {
             "name": "Coors Field",
    -        "amenity": "Baseball Stadium"
    +        "amenity": "Baseball Stadium",
    +        "popup_content": "This is where the Rockies play!"
         },
         "geometry": {
             "type": "Point",
    @@ -84,7 +158,8 @@ 

    The GeoJSON layer

    "type": "Feature", "properties": { "name": "Coors Field", - "amenity": "Baseball Stadium" + "amenity": "Baseball Stadium", + "popup_content": "This is where the Rockies play!" }, "geometry": { "type": "Point", @@ -132,13 +207,34 @@

    Styling Features

    "popup_content": "This is the 16th street free bus ..." } };
    + +

    To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer ( e.layer ) in our featureparse event listener.

    geojson_layer.on( "featureparse", function ( e ) {
     	if ( e.properties && e.properties.style && e.layer.setStyle ) {
     	    // The setStyle method isn't available for Points. More on that later ...
     		e.layer.setStyle( e.properties.style );
     	}
    -} );
    +} );
    + +

    Styling Points

    + +

    Points are handled differently than LineStrings and Polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

    + +
    var geojson_layer = new L.GeoJSON( null, {
    +    pointToLayer: function ( latlng ) {
    +        return new L.CircleMarker( latlng, {
    +            radius: 8,
    +            fillColor: "#ff7800",
    +            color: "#000",
    +            weight: 1,
    +            opacity: 1,
    +            fillOpacity: 0.8
    +        } );
    +    }
    +} );
    + +

    View the example page to see how to use custom markers.


    From fc96f08dfa6f345848ed02e2690168a8eacdb3b3 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Wed, 28 Sep 2011 09:24:36 -0600 Subject: [PATCH 0060/2207] GeoJSON examples complete. --- examples/geojson-example.html | 25 ++++++++++++++++++++++--- examples/geojson.html | 16 ++++++++++++++-- examples/sample-geojson.js | 25 +++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 238c12f9b5f..9076fb929a2 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -53,32 +53,51 @@ } } ); + var light_rail_geojson_layer = new L.GeoJSON(); + geojson_layer.on( "featureparse", function( e ) { var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + if ( e.geometryType == "Point" ) { + popup_content += "

    This GeoJSON Point has been transformed into a CircleMarker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; + } if ( e.properties && e.properties.popup_content ) { popup_content += e.properties.popup_content; } e.layer.bindPopup( popup_content ); - if ( e.properties && e.properties.style ) { + if ( e.properties && e.properties.style && e.layer.setStyle ) { e.layer.setStyle( e.properties.style ); } } ); another_geojson_layer.on( "featureparse", function ( e ) { var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + popup_content += "

    This GeoJSON Point has been transformed into a custom Marker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; + if ( e.properties && e.properties.popup_content ) { + popup_content += e.properties.popup_content; + } + e.layer.bindPopup( popup_content ); + } ); + + light_rail_geojson_layer.on( "featureparse", function ( e ) { + var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + popup_content += "

    This is the default look of a GeoJSON Point.

    "; if ( e.properties && e.properties.popup_content ) { popup_content += e.properties.popup_content; } e.layer.bindPopup( popup_content ); } ); - map.addLayer( geojson_layer ).addLayer( another_geojson_layer ); + map.addLayer( geojson_layer ) + .addLayer( another_geojson_layer ) + .addLayer( light_rail_geojson_layer ); geojson_layer.addGeoJSON( free_bus ); geojson_layer.addGeoJSON( bicycle_rental ); geojson_layer.addGeoJSON( campus ); - another_geojson_layer.addGeoJSON( coors_field ); + another_geojson_layer.addGeoJSON( coors_field ); + + light_rail_geojson_layer.addGeoJSON( light_rail_stop ); diff --git a/examples/geojson.html b/examples/geojson.html index 37962c9aad0..37aea9986c4 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -212,7 +212,7 @@

    Styling Features

    geojson_layer.on( "featureparse", function ( e ) {
     	if ( e.properties && e.properties.style && e.layer.setStyle ) {
    -	    // The setStyle method isn't available for Points. More on that later ...
    +	    // The setStyle method isn't available for Points. More on that below ...
     		e.layer.setStyle( e.properties.style );
     	}
     } );
    @@ -221,6 +221,8 @@

    Styling Points

    Points are handled differently than LineStrings and Polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

    +

    Here we're using a CircleMarker:

    +
    var geojson_layer = new L.GeoJSON( null, {
         pointToLayer: function ( latlng ) {
             return new L.CircleMarker( latlng, {
    @@ -234,7 +236,17 @@ 

    Styling Points

    } } );
    -

    View the example page to see how to use custom markers.

    +

    And here's an example of using a custom Marker:

    + +
    var geojson_layer = new L.GeoJSON( null, {
    +    pointToLayer: function ( latlng ) {
    +        return new L.Marker( latlng, {
    +            icon: new MyCustomIcon()
    +        } );
    +    }
    +} );
    + +

    View the example page to view in detail what all is possible with the GeoJSON layer.


    diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js index f96f8b4fc51..a5564a1cf37 100644 --- a/examples/sample-geojson.js +++ b/examples/sample-geojson.js @@ -193,6 +193,31 @@ var free_bus = { "id": 1 }; +var light_rail_stop = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "popup_content": "18th & California Light Rail Stop" + }, + "geometry": { + "type": "Point", + "coordinates": [-104.98999178409576, 39.74683938093904] + } + },{ + "type": "Feature", + "properties": { + "popup_content": "20th & Welton Light Rail Stop" + }, + "geometry": { + "type": "Point", + "coordinates": [-104.98689115047453, 39.747924136466565] + } + } + ] +}; + var bicycle_rental = { "type": "FeatureCollection", "features": [ From e71e42fd3e1ec422d929826b916d6b30ef3932ab Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 29 Sep 2011 08:30:48 -0600 Subject: [PATCH 0061/2207] Changing JavaScript coding convention. --- examples/geojson-example.html | 86 ++++++++++++------------ examples/geojson.html | 122 +++++++++++++++++----------------- examples/sample-geojson.js | 32 ++++----- 3 files changed, 120 insertions(+), 120 deletions(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 9076fb929a2..1924bcba9cf 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -32,72 +32,72 @@ popupAnchor: new L.Point(2, -32) }); - var geojson_layer = new L.GeoJSON( null, { - pointToLayer: function ( latlng ) { - return new L.CircleMarker( latlng, { + var geojsonLayer = new L.GeoJSON(null, { + pointToLayer: function (latlng){ + return new L.CircleMarker(latlng, { radius: 8, fillColor: "#ff7800", color: "#000", weight: 1, opacity: 1, fillOpacity: 0.8 - } ); + }); } - } ); + }); - var another_geojson_layer = new L.GeoJSON( coors_field, { - pointToLayer: function ( latlng ) { - return new L.Marker( latlng, { + var anotherGeojsonLayer = new L.GeoJSON(coorsField, { + pointToLayer: function (latlng){ + return new L.Marker(latlng, { icon: new BaseballIcon() - } ); + }); } - } ); + }); - var light_rail_geojson_layer = new L.GeoJSON(); + var lightRailGeojsonLayer = new L.GeoJSON(); - geojson_layer.on( "featureparse", function( e ) { - var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - if ( e.geometryType == "Point" ) { - popup_content += "

    This GeoJSON Point has been transformed into a CircleMarker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; + geojsonLayer.on("featureparse", function(e){ + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + if (e.geometryType == "Point"){ + popupContent += "

    This GeoJSON Point has been transformed into a CircleMarker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; } - if ( e.properties && e.properties.popup_content ) { - popup_content += e.properties.popup_content; + if (e.properties && e.properties.popupContent){ + popupContent += e.properties.popupContent; } - e.layer.bindPopup( popup_content ); - if ( e.properties && e.properties.style && e.layer.setStyle ) { - e.layer.setStyle( e.properties.style ); + e.layer.bindPopup(popupContent); + if (e.properties && e.properties.style && e.layer.setStyle){ + e.layer.setStyle(e.properties.style); } - } ); + }); - another_geojson_layer.on( "featureparse", function ( e ) { - var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - popup_content += "

    This GeoJSON Point has been transformed into a custom Marker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; - if ( e.properties && e.properties.popup_content ) { - popup_content += e.properties.popup_content; + anotherGeojsonLayer.on("featureparse", function (e){ + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + popupContent += "

    This GeoJSON Point has been transformed into a custom Marker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; + if (e.properties && e.properties.popupContent){ + popupContent += e.properties.popupContent; } - e.layer.bindPopup( popup_content ); - } ); + e.layer.bindPopup(popupContent); + }); - light_rail_geojson_layer.on( "featureparse", function ( e ) { - var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - popup_content += "

    This is the default look of a GeoJSON Point.

    "; - if ( e.properties && e.properties.popup_content ) { - popup_content += e.properties.popup_content; + lightRailGeojsonLayer.on("featureparse", function (e){ + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + popupContent += "

    This is the default look of a GeoJSON Point.

    "; + if (e.properties && e.properties.popupContent){ + popupContent += e.properties.popupContent; } - e.layer.bindPopup( popup_content ); - } ); + e.layer.bindPopup(popupContent); + }); - map.addLayer( geojson_layer ) - .addLayer( another_geojson_layer ) - .addLayer( light_rail_geojson_layer ); + map.addLayer(geojsonLayer) + .addLayer(anotherGeojsonLayer) + .addLayer(lightRailGeojsonLayer); - geojson_layer.addGeoJSON( free_bus ); - geojson_layer.addGeoJSON( bicycle_rental ); - geojson_layer.addGeoJSON( campus ); + geojsonLayer.addGeoJSON(freeBus); + geojsonLayer.addGeoJSON(bicycleRental); + geojsonLayer.addGeoJSON(campus); - another_geojson_layer.addGeoJSON( coors_field ); + anotherGeojsonLayer.addGeoJSON(coorsField); - light_rail_geojson_layer.addGeoJSON( light_rail_stop ); + lightRailGeojsonLayer.addGeoJSON(lightRailStop); diff --git a/examples/geojson.html b/examples/geojson.html index 37aea9986c4..65aec629e93 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -66,54 +66,54 @@

    Using GeoJSON with Leaflet

    popupAnchor: new L.Point(2, -32) }); - var geojson_layer = new L.GeoJSON( null, { - pointToLayer: function ( latlng ) { - return new L.CircleMarker( latlng, { + var geojsonLayer = new L.GeoJSON(null, { + pointToLayer: function (latlng){ + return new L.CircleMarker(latlng, { radius: 8, fillColor: "#ff7800", color: "#000", weight: 1, opacity: 1, fillOpacity: 0.8 - } ); + }); } - } ); + }); - var another_geojson_layer = new L.GeoJSON( coors_field, { - pointToLayer: function ( latlng ) { - return new L.Marker( latlng, { + var anotherGeojsonLayer = new L.GeoJSON(coorsField, { + pointToLayer: function (latlng){ + return new L.Marker(latlng, { icon: new BaseballIcon() - } ); + }); } - } ); + }); - geojson_layer.on( "featureparse", function( e ) { - var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - if ( e.properties && e.properties.popup_content ) { - popup_content += e.properties.popup_content; + geojsonLayer.on("featureparse", function(e){ + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + if (e.properties && e.properties.popupContent){ + popupContent += e.properties.popupContent; } - e.layer.bindPopup( popup_content ); - if ( e.properties && e.properties.style ) { - e.layer.setStyle( e.properties.style ); + e.layer.bindPopup(popupContent); + if (e.properties && e.properties.style){ + e.layer.setStyle(e.properties.style); } - } ); + }); - another_geojson_layer.on( "featureparse", function ( e ) { - var popup_content = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - if ( e.properties && e.properties.popup_content ) { - popup_content += e.properties.popup_content; + anotherGeojsonLayer.on("featureparse", function (e){ + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + if (e.properties && e.properties.popupContent){ + popupContent += e.properties.popupContent; } - e.layer.bindPopup( popup_content ); - } ); + e.layer.bindPopup(popupContent); + }); - map.addLayer( geojson_layer ).addLayer( another_geojson_layer ); + map.addLayer(geojsonLayer).addLayer(anotherGeojsonLayer); - geojson_layer.addGeoJSON( free_bus ); - geojson_layer.addGeoJSON( bicycle_rental ); - geojson_layer.addGeoJSON( campus ); + geojsonLayer.addGeoJSON(freeBus); + geojsonLayer.addGeoJSON(bicycleRental); + geojsonLayer.addGeoJSON(campus); - another_geojson_layer.addGeoJSON( coors_field ); + anotherGeojsonLayer.addGeoJSON(coorsField); @@ -131,18 +131,18 @@

    The GeoJSON layer

    GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

    -
    var geojson_layer = new L.GeoJSON();
    +		
    var geojsonLayer = new L.GeoJSON();
     
    -map.addLayer( geojson_layer );
    +map.addLayer(geojsonLayer);

    This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

    -
    var a_geojson_feature = {
    +        
    var geojsonFeature = {
         "type": "Feature",
         "properties": {
             "name": "Coors Field",
             "amenity": "Baseball Stadium",
    -        "popup_content": "This is where the Rockies play!"
    +        "popupContent": "This is where the Rockies play!"
         },
         "geometry": {
             "type": "Point",
    @@ -150,16 +150,16 @@ 

    The GeoJSON layer

    } }; -geojson_layer.addGeoJSON( a_geojson_feature );
    +geojsonLayer.addGeoJSON(geojsonFeature);

    We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

    -
    var a_geojson_feature = {
    +        
    var geojsonFeature = {
         "type": "Feature",
         "properties": {
             "name": "Coors Field",
             "amenity": "Baseball Stadium",
    -        "popup_content": "This is where the Rockies play!"
    +        "popupContent": "This is where the Rockies play!"
         },
         "geometry": {
             "type": "Point",
    @@ -167,25 +167,25 @@ 

    The GeoJSON layer

    } }; -var geojson_layer = new L.GeoJSON( a_geojson_feature ); +var geojsonLayer = new L.GeoJSON(geojsonFeature); -map.addLayer( geojson_layer );
    +map.addLayer(geojsonLayer);

    Popups

    -

    We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popup_content" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

    +

    We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

    -
    geojson_layer.on( "featureparse", function ( e ) {
    -    if ( e.properties && e.properties.popup_content ) {
    -        e.layer.bindPopup( e.properties.popup_content );
    +        
    geojsonLayer.on("featureparse", function (e){
    +    if (e.properties && e.properties.popupContent){
    +        e.layer.bindPopup(e.properties.popupContent);
         }
    -} );
    +});

    Styling Features

    We can also listen to the featureparse event to style our LineString and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

    -
    var free_bus = {
    +		
    var freeBus = {
         "type": "Feature",
         "geometry": {
             "type": "LineString",
    @@ -204,18 +204,18 @@ 

    Styling Features

    "weight": 4, "opacity": 0.9 }, - "popup_content": "This is the 16th street free bus ..." + "popupContent": "This is the 16th street free bus ..." } };
    -

    To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer ( e.layer ) in our featureparse event listener.

    +

    To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

    -
    geojson_layer.on( "featureparse", function ( e ) {
    -	if ( e.properties && e.properties.style && e.layer.setStyle ) {
    +		
    geojsonLayer.on("featureparse", function (e){
    +	if (e.properties && e.properties.style && e.layer.setStyle){
     	    // The setStyle method isn't available for Points. More on that below ...
    -		e.layer.setStyle( e.properties.style );
    +		e.layer.setStyle(e.properties.style);
     	}
    -} );
    +});

    Styling Points

    @@ -223,28 +223,28 @@

    Styling Points

    Here we're using a CircleMarker:

    -
    var geojson_layer = new L.GeoJSON( null, {
    -    pointToLayer: function ( latlng ) {
    -        return new L.CircleMarker( latlng, {
    +        
    var geojsonLayer = new L.GeoJSON(null, {
    +    pointToLayer: function (latlng){
    +        return new L.CircleMarker(latlng, {
                 radius: 8,
                 fillColor: "#ff7800",
                 color: "#000",
                 weight: 1,
                 opacity: 1,
                 fillOpacity: 0.8
    -        } );
    +        });
         }
    -} );
    +});

    And here's an example of using a custom Marker:

    -
    var geojson_layer = new L.GeoJSON( null, {
    -    pointToLayer: function ( latlng ) {
    -        return new L.Marker( latlng, {
    +        
    var geojsonLayer = new L.GeoJSON(null, {
    +    pointToLayer: function (latlng){
    +        return new L.Marker(latlng, {
                 icon: new MyCustomIcon()
    -        } );
    +        });
         }
    -} );
    +});

    View the example page to view in detail what all is possible with the GeoJSON layer.

    @@ -265,7 +265,7 @@

    Styling Points

    _gaq.push([ '_setAccount', 'UA-4147697-4' ]); _gaq.push([ '_trackPageview' ]); - (function() { + (function(){ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js index a5564a1cf37..131a7d6372b 100644 --- a/examples/sample-geojson.js +++ b/examples/sample-geojson.js @@ -1,4 +1,4 @@ -var free_bus = { +var freeBus = { "type": "Feature", "geometry": { "type": "LineString", @@ -188,18 +188,18 @@ var free_bus = { weight: 4, opacity: 0.9 }, - "popup_content": "This is the 16th street free bus in Denver, a good way to cross town." + "popupContent": "This is the 16th street free bus in Denver, a good way to cross town." }, "id": 1 }; -var light_rail_stop = { +var lightRailStop = { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { - "popup_content": "18th & California Light Rail Stop" + "popupContent": "18th & California Light Rail Stop" }, "geometry": { "type": "Point", @@ -208,7 +208,7 @@ var light_rail_stop = { },{ "type": "Feature", "properties": { - "popup_content": "20th & Welton Light Rail Stop" + "popupContent": "20th & Welton Light Rail Stop" }, "geometry": { "type": "Point", @@ -218,7 +218,7 @@ var light_rail_stop = { ] }; -var bicycle_rental = { +var bicycleRental = { "type": "FeatureCollection", "features": [ { @@ -231,7 +231,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 51 }, @@ -245,7 +245,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 52 }, @@ -259,7 +259,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 54 }, @@ -273,7 +273,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 55 }, @@ -287,7 +287,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 57 }, @@ -301,7 +301,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 58 }, @@ -315,7 +315,7 @@ var bicycle_rental = { }, "type": "Feature", "properties": { - "popup_content": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" + "popupContent": "This is a B-Cycle Station. Come pick up a bike and pay by the hour. What a deal!" }, "id": 74 } @@ -325,7 +325,7 @@ var bicycle_rental = { var campus = { "type": "Feature", "properties": { - "popup_content": "This is the Auraria West Campus", + "popupContent": "This is the Auraria West Campus", "style": { weight: 2, color: "#999", @@ -380,10 +380,10 @@ var campus = { } }; -var coors_field = { +var coorsField = { "type": "Feature", "properties": { - "popup_content": "Coors Field" + "popupContent": "Coors Field" }, "geometry": { "type": "Point", From b22102841d85ed377232b68fbc460efd5a29796d Mon Sep 17 00:00:00 2001 From: mourner Date: Fri, 30 Sep 2011 13:34:06 +0300 Subject: [PATCH 0062/2207] Minor geojson example edits --- examples/geojson-example.html | 157 +++++++------- examples/geojson.html | 385 +++++++++++++++++----------------- 2 files changed, 266 insertions(+), 276 deletions(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 1924bcba9cf..26e0a2f6322 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -6,8 +6,8 @@ - - + + @@ -20,83 +20,82 @@ cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade', cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution}); - map.setView(new L.LatLng(39.74738794765598, -105.00002861022949), 14) - .addLayer(cloudmade); - - var BaseballIcon = L.Icon.extend({ - iconUrl: 'baseball-marker.png', - shadowUrl: null, - iconSize: new L.Point(32, 37), - shadowSize: null, - iconAnchor: new L.Point(14, 37), - popupAnchor: new L.Point(2, -32) - }); - - var geojsonLayer = new L.GeoJSON(null, { - pointToLayer: function (latlng){ - return new L.CircleMarker(latlng, { - radius: 8, - fillColor: "#ff7800", - color: "#000", - weight: 1, - opacity: 1, - fillOpacity: 0.8 - }); - } - }); - - var anotherGeojsonLayer = new L.GeoJSON(coorsField, { - pointToLayer: function (latlng){ - return new L.Marker(latlng, { - icon: new BaseballIcon() - }); - } - }); - - var lightRailGeojsonLayer = new L.GeoJSON(); - - geojsonLayer.on("featureparse", function(e){ - var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - if (e.geometryType == "Point"){ - popupContent += "

    This GeoJSON Point has been transformed into a CircleMarker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; - } - if (e.properties && e.properties.popupContent){ - popupContent += e.properties.popupContent; - } - e.layer.bindPopup(popupContent); - if (e.properties && e.properties.style && e.layer.setStyle){ - e.layer.setStyle(e.properties.style); - } - }); - - anotherGeojsonLayer.on("featureparse", function (e){ - var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - popupContent += "

    This GeoJSON Point has been transformed into a custom Marker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; - if (e.properties && e.properties.popupContent){ - popupContent += e.properties.popupContent; - } - e.layer.bindPopup(popupContent); - }); - - lightRailGeojsonLayer.on("featureparse", function (e){ - var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; - popupContent += "

    This is the default look of a GeoJSON Point.

    "; - if (e.properties && e.properties.popupContent){ - popupContent += e.properties.popupContent; - } - e.layer.bindPopup(popupContent); - }); - - map.addLayer(geojsonLayer) - .addLayer(anotherGeojsonLayer) - .addLayer(lightRailGeojsonLayer); - - geojsonLayer.addGeoJSON(freeBus); - geojsonLayer.addGeoJSON(bicycleRental); - geojsonLayer.addGeoJSON(campus); - - anotherGeojsonLayer.addGeoJSON(coorsField); - + map.setView(new L.LatLng(39.747, -105), 14).addLayer(cloudmade); + + var BaseballIcon = L.Icon.extend({ + iconUrl: 'baseball-marker.png', + shadowUrl: null, + iconSize: new L.Point(32, 37), + shadowSize: null, + iconAnchor: new L.Point(14, 37), + popupAnchor: new L.Point(2, -32) + }); + + var geojsonLayer = new L.GeoJSON(null, { + pointToLayer: function (latlng){ + return new L.CircleMarker(latlng, { + radius: 8, + fillColor: "#ff7800", + color: "#000", + weight: 1, + opacity: 1, + fillOpacity: 0.8 + }); + } + }); + + var anotherGeojsonLayer = new L.GeoJSON(coorsField, { + pointToLayer: function (latlng){ + return new L.Marker(latlng, { + icon: new BaseballIcon() + }); + } + }); + + var lightRailGeojsonLayer = new L.GeoJSON(); + + geojsonLayer.on("featureparse", function (e) { + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + if (e.geometryType == "Point") { + popupContent += "

    This GeoJSON Point has been transformed into a CircleMarker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; + } + if (e.properties && e.properties.popupContent) { + popupContent += e.properties.popupContent; + } + e.layer.bindPopup(popupContent); + if (e.properties && e.properties.style && e.layer.setStyle) { + e.layer.setStyle(e.properties.style); + } + }); + + anotherGeojsonLayer.on("featureparse", function (e) { + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + popupContent += "

    This GeoJSON Point has been transformed into a custom Marker by passing a pointToLayer function in the GeoJSON options when instantiating the GeoJSON layer. View source for details.

    "; + if (e.properties && e.properties.popupContent) { + popupContent += e.properties.popupContent; + } + e.layer.bindPopup(popupContent); + }); + + lightRailGeojsonLayer.on("featureparse", function (e) { + var popupContent = "

    I started out as a GeoJSON " + e.geometryType + ", but now I'm a Leaflet vector!

    "; + popupContent += "

    This is the default look of a GeoJSON Point.

    "; + if (e.properties && e.properties.popupContent) { + popupContent += e.properties.popupContent; + } + e.layer.bindPopup(popupContent); + }); + + map.addLayer(geojsonLayer) + .addLayer(anotherGeojsonLayer) + .addLayer(lightRailGeojsonLayer); + + geojsonLayer.addGeoJSON(freeBus); + geojsonLayer.addGeoJSON(bicycleRental); + geojsonLayer.addGeoJSON(campus); + + anotherGeojsonLayer.addGeoJSON(coorsField); + lightRailGeojsonLayer.addGeoJSON(lightRailStop); diff --git a/examples/geojson.html b/examples/geojson.html index 65aec629e93..9be65cf6b34 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -42,211 +42,202 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    ← Back to the list of examples

    Using GeoJSON with Leaflet

    -

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

    +

    GeoJSON is becoming a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

    -
    - - - - -

    View example →

    +
    + + + + +

    View example on a separate page →

    + +

    About GeoJSON

    + +

    According to http://geojson.org:

    + +
    GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
    + +

    Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

    -

    About GeoJSON

    - -

    According to http://geojson.org:

    - -
    GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
    - -

    Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

    -

    The GeoJSON layer

    GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

    -
    var geojsonLayer = new L.GeoJSON();
    -
    -map.addLayer(geojsonLayer);
    - -

    This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

    - -
    var geojsonFeature = {
    -    "type": "Feature",
    -    "properties": {
    -        "name": "Coors Field",
    -        "amenity": "Baseball Stadium",
    -        "popupContent": "This is where the Rockies play!"
    -    },
    -    "geometry": {
    -        "type": "Point",
    -        "coordinates": [-104.99404, 39.75621]
    -    }
    -};
    -
    -geojsonLayer.addGeoJSON(geojsonFeature);
    - -

    We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

    - -
    var geojsonFeature = {
    -    "type": "Feature",
    -    "properties": {
    -        "name": "Coors Field",
    -        "amenity": "Baseball Stadium",
    -        "popupContent": "This is where the Rockies play!"
    -    },
    -    "geometry": {
    -        "type": "Point",
    -        "coordinates": [-104.99404, 39.75621]
    -    }
    -};
    -        
    -var geojsonLayer = new L.GeoJSON(geojsonFeature);
    -
    -map.addLayer(geojsonLayer);
    - -

    Popups

    - -

    We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

    - -
    geojsonLayer.on("featureparse", function (e){
    -    if (e.properties && e.properties.popupContent){
    -        e.layer.bindPopup(e.properties.popupContent);
    -    }
    -});
    - +
    var geojsonLayer = new L.GeoJSON();
    +
    +map.addLayer(geojsonLayer);
    + +

    This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

    + +
    var geojsonFeature = {
    +    "type": "Feature",
    +    "properties": {
    +        "name": "Coors Field",
    +        "amenity": "Baseball Stadium",
    +        "popupContent": "This is where the Rockies play!"
    +    },
    +    "geometry": {
    +        "type": "Point",
    +        "coordinates": [-104.99404, 39.75621]
    +    }
    +};
    +
    +geojsonLayer.addGeoJSON(geojsonFeature);
    + +

    We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

    + +
    var geojsonLayer = new L.GeoJSON(geojsonFeature);
    +
    +map.addLayer(geojsonLayer);
    + +

    Popups

    + +

    We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

    + +
    geojsonLayer.on("featureparse", function (e) {
    +    if (e.properties && e.properties.popupContent){
    +        e.layer.bindPopup(e.properties.popupContent);
    +    }
    +});
    + +

    Make sure to do this before adding GeoJSON objects through the addGeoJSON method.

    +

    Styling Features

    -

    We can also listen to the featureparse event to style our LineString and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

    - -
    var freeBus = {
    -    "type": "Feature",
    -    "geometry": {
    -        "type": "LineString",
    -        "coordinates": [
    -            [-104.98726, 39.74136],
    -            [-104.98720, 39.74132],
    -            [-104.98715, 39.74127],
    -            [-104.98713, 39.74117],
    -            [-104.98712, 39.74106], ...
    -        ]
    -    },
    -    "properties": {
    -        "name": "16th Street Free Bus",
    -        "style": {
    -            "color": "#004070",
    -            "weight": 4,
    -            "opacity": 0.9
    -        },
    -        "popupContent": "This is the 16th street free bus ..."
    -    }
    -};
    - -

    To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

    - -
    geojsonLayer.on("featureparse", function (e){
    -	if (e.properties && e.properties.style && e.layer.setStyle){
    -	    // The setStyle method isn't available for Points. More on that below ...
    -		e.layer.setStyle(e.properties.style);
    -	}
    -});
    - -

    Styling Points

    - -

    Points are handled differently than LineStrings and Polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

    - -

    Here we're using a CircleMarker:

    - -
    var geojsonLayer = new L.GeoJSON(null, {
    -    pointToLayer: function (latlng){
    -        return new L.CircleMarker(latlng, {
    -            radius: 8,
    -            fillColor: "#ff7800",
    -            color: "#000",
    -            weight: 1,
    -            opacity: 1,
    -            fillOpacity: 0.8
    -        });
    -    }
    -});
    - -

    And here's an example of using a custom Marker:

    - -
    var geojsonLayer = new L.GeoJSON(null, {
    -    pointToLayer: function (latlng){
    -        return new L.Marker(latlng, {
    -            icon: new MyCustomIcon()
    -        });
    -    }
    -});
    - -

    View the example page to view in detail what all is possible with the GeoJSON layer.

    +

    We can also listen to the featureparse event to style our Polyline and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

    + +
    var freeBus = {
    +    "type": "Feature",
    +    "geometry": {
    +        "type": "LineString",
    +        "coordinates": [
    +            [-104.98726, 39.74136],
    +            [-104.98720, 39.74132],
    +            [-104.98715, 39.74127],
    +            [-104.98713, 39.74117],
    +            [-104.98712, 39.74106], ...
    +        ]
    +    },
    +    "properties": {
    +        "name": "16th Street Free Bus",
    +        "style": {
    +            "color": "#004070",
    +            "weight": 4,
    +            "opacity": 0.9
    +        },
    +        "popupContent": "This is the 16th street free bus ..."
    +    }
    +};
    + +

    To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

    + +
    geojsonLayer.on("featureparse", function (e){
    +	if (e.properties && e.properties.style && e.layer.setStyle){
    +	    // The setStyle method isn't available for Points. More on that below ...
    +		e.layer.setStyle(e.properties.style);
    +	}
    +});
    + +

    Styling Points

    + +

    Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

    + +

    Here we're using a CircleMarker:

    + +
    var geojsonMarkerOptions = {
    +	radius: 8,
    +	fillColor: "#ff7800",
    +	color: "#000",
    +	weight: 1,
    +	opacity: 1,
    +	fillOpacity: 0.8
    +};
    +
    +var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
    +    pointToLayer: function (latlng) {
    +        return new L.CircleMarker(latlng, geojsonMarkerOptions);
    +    }
    +});
    + +

    And here's an example of using a custom Marker:

    + +
    var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
    +    pointToLayer: function (latlng) {
    +        return new L.Marker(latlng, {
    +            icon: new MyCustomIcon()
    +        });
    +    }
    +});
    + +

    View the example page to see in detail what is possible with the GeoJSON layer.


    From 7fc9ff1202fd13021fad2f4b32a417f181ecdeff Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 4 Oct 2011 00:38:27 -0600 Subject: [PATCH 0063/2207] Adding Path clickable option documentation. --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index d4c23192407..a4b6cb2c4d8 100644 --- a/reference.html +++ b/reference.html @@ -1262,6 +1262,12 @@

    Options

    Number 0.2 Fill opacity. + + + clickable + Boolean + true + If false, the vector will not emit mouse events and will act as a part of the underlying map. From 3cfe5d78977a0ffb9a58b0a78e6e7253ecf86d31 Mon Sep 17 00:00:00 2001 From: mourner Date: Wed, 5 Oct 2011 16:27:02 +0300 Subject: [PATCH 0064/2207] update docs for locate-related methods --- reference.html | 196 ++++++++++++++++++++++++++++++------------------- 1 file changed, 121 insertions(+), 75 deletions(-) diff --git a/reference.html b/reference.html index a4b6cb2c4d8..877e61d402c 100644 --- a/reference.html +++ b/reference.html @@ -287,7 +287,7 @@

    Options

    Boolean depends Whether the tile fade animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android. - + closePopupOnClick Boolean @@ -560,18 +560,19 @@

    Methods that modify map state

    Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. - locate( <Object> options? ) + locate( <Locate optionsoptions? ) + this + Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details. + + + locateAndSetView( <Number> maxZoom, <Locate optionsoptions?) this - Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. Options are PositionOptions from the W3C Geolocation API. + Automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});. - locateAndSetView( <Number> maxZoom ) + stopLocate() this - The same as locate method, but it automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). You can optionally specify the maximum zoom of the view. + Stops watching location previously initiated by map.locate({watch: true}). @@ -602,11 +603,11 @@

    Methods that get map state

    getMaxZoom() Number Returns the maximum zoom level of the map. - - - getBounds() - LatLngBounds - Returns the LatLngBounds of the current map view. + + + getBounds() + LatLngBounds + Returns the LatLngBounds of the current map view. getBoundsZoom( <LatLngBounds> bounds ) @@ -746,8 +747,53 @@

    Other methods

    Returns an object with different map panes (to render overlays in). - - + +

    Locate options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionTypeDefaultDescription
    watchBooleanfalseIf true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method.
    setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to detection accuracy.
    maxZoomNumberInfinityThe maximum zoom for automatic view setting when using `setView` option.
    timeoutNumber10000Number of millisecond to wait for a response from geolocation before firing a locationerror event.
    maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.

    L.Marker

    @@ -1262,12 +1308,12 @@

    Options

    Number 0.2 Fill opacity. - - - clickable - Boolean - true - If false, the vector will not emit mouse events and will act as a part of the underlying map. + + + clickable + Boolean + true + If false, the vector will not emit mouse events and will act as a part of the underlying map. @@ -1332,16 +1378,16 @@

    Methods

    bindPopup( <String> htmlContent, <Popup optionsoptions? ) this Binds a popup with a particular HTML content to a click on this path. - - - setStyle( <Path optionsobject) - this - Changes the appearance of a Path based on the options in the Path options object. - - - getBounds() - LatLngBounds - Returns the LatLngBounds of the path. + + + setStyle( <Path optionsobject) + this + Changes the appearance of a Path based on the options in the Path options object. + + + getBounds() + LatLngBounds + Returns the LatLngBounds of the path. @@ -1417,21 +1463,21 @@

    Methods

    setLatLngs( <LatLng[]> latlngs ) this Replaces all the points in the polyline with the given array of geographical points. - - - getLatLngs() - LatLng[] - Returns an array of the points in the path. + + + getLatLngs() + LatLng[] + Returns an array of the points in the path. spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLnglatlng1?, <LatLnglatlng2?, … ) LatLng[] Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). - - - getBounds() - LatLngBounds - Returns the LatLngBounds of the polyline. + + + getBounds() + LatLngBounds + Returns the LatLngBounds of the polyline. @@ -1512,23 +1558,23 @@

    Constructor

    L.Circle( <LatLnglatlng, <Number> radius, <Path optionsoptions? ) Instantiates a circle object given a geographical point, a radius in meters and optionally an options object. - - -

    Methods

    - - - - - - - - - - - - -
    MethodReturnsDescription
    setLatLng( <LatLnglatlng )thisSets the position of a circle to a new location.
    - + + +

    Methods

    + + + + + + + + + + + + +
    MethodReturnsDescription
    setLatLng( <LatLnglatlng )thisSets the position of a circle to a new location.
    +

    L.CircleMarker

    @@ -1546,21 +1592,21 @@

    Constructor

    L.CircleMarker( <LatLnglatlng, <Path optionsoptions? ) Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object. - + -

    Methods

    - - - - - - - - - - - - +

    Methods

    + +
    MethodReturnsDescription
    setLatLng( <LatLnglatlng )thisSets the position of a circle marker to a new location.
    + + + + + + + + + +
    MethodReturnsDescription
    setLatLng( <LatLnglatlng )thisSets the position of a circle marker to a new location.
    @@ -1682,7 +1728,7 @@

    Events

    Fired when the user double-clicks (or double-taps) on the group. - +

    L.GeoJSON

    @@ -2511,4 +2557,4 @@

    IHandler

    })(); - + From d0d6b0815e9d7904cd93da49ab225dca98c70585 Mon Sep 17 00:00:00 2001 From: mourner Date: Wed, 5 Oct 2011 16:29:36 +0300 Subject: [PATCH 0065/2207] docs minor cleanup --- reference.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reference.html b/reference.html index 877e61d402c..55c5894b349 100644 --- a/reference.html +++ b/reference.html @@ -560,12 +560,12 @@

    Methods that modify map state

    Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. - locate( <Locate optionsoptions? ) + locate( <Locate optionsoptions? ) this Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details. - locateAndSetView( <Number> maxZoom, <Locate optionsoptions?) + locateAndSetView( <Number> maxZoom?, <Locate optionsoptions?) this Automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});. @@ -1374,17 +1374,17 @@

    Methods

    Returns Description - + bindPopup( <String> htmlContent, <Popup optionsoptions? ) this Binds a popup with a particular HTML content to a click on this path. - + setStyle( <Path optionsobject) this Changes the appearance of a Path based on the options in the Path options object. - + getBounds() LatLngBounds Returns the LatLngBounds of the path. @@ -1663,7 +1663,7 @@

    Methods

    -

    L.FeatureGroup

    +

    L.FeatureGroup

    Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

    From 3974c6ce58886f8ecd6228931be3da841d749fb5 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 13 Oct 2011 14:31:50 -0400 Subject: [PATCH 0066/2207] Layers Control example. --- examples/layers-control-example.html | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 examples/layers-control-example.html diff --git a/examples/layers-control-example.html b/examples/layers-control-example.html new file mode 100644 index 00000000000..d852b2d6322 --- /dev/null +++ b/examples/layers-control-example.html @@ -0,0 +1,45 @@ + + + + Leaflet Layers Control Example + + + + + + +
    + + + + + \ No newline at end of file From 9050757253a02062a58d54753e5f4730640a657d Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 13 Oct 2011 19:08:21 -0400 Subject: [PATCH 0067/2207] Adding Layers Control example page and image to link from main examples page. --- docs/images/layers-control.png | Bin 0 -> 20262 bytes examples.html | 5 +- examples/layers-control-example.html | 6 +- examples/layers-control.html | 146 +++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 5 deletions(-) create mode 100644 docs/images/layers-control.png create mode 100644 examples/layers-control.html diff --git a/docs/images/layers-control.png b/docs/images/layers-control.png new file mode 100644 index 0000000000000000000000000000000000000000..4da42b2e21a87ddad7562b650b604b0101cb927d GIT binary patch literal 20262 zcmXt8V{jzg7M$3&jol<0+qSKZZQHhOY;4=+CfV4w?Kj_#SE)&=CaIY_C+GI*)7=pY za^eWExUc{K06|hhL<#sa4*0Nvh6H|3zh=S(0APhJgoPC(g@uXj9qmjltW5v__q7~l zH;trcOup@B6C^dEm7DrB>i_^LSrzmcvSuN2BETRR8C767Bpg-^9Rnp>LUkx`5mq86 zd@rB6%}g*dTq{adhvSN9qqNz_^ZN4gefhoXIQ#fx#$y)A9|e^%;i%9Oz^N3%!?i*b zCoeHH-t7;HA+ZBajC?dXUpm_CBWD(l`(X{7&f3zxzQLFkPHA=dw2_x0xA#y7Y~wr5P+5Pqzx>v|yr ztRKjxFbAaBX<1}w631XNGw=Wa?(1Ct7YBd*@zKHVk?FDZ^}}%Cm(`6ODIdx0_E%Rl zC^!IFZuWXj@9=O5%zhN4&ZXC?TpO^a1~A`#)n#6X$=8DY>-iex!SNwLm|LJQ#zTM) z3kP>eVOY@3upha9!tFrEk@+6MnszesqCmnyHbJ($#}{h>Zu>oEm7(xOp+S{pej_pPp$>3 zdD6Pi_X-3w3Q=R;6(HbyPZx~~mjFOEV`1`m1^|+JU*iO5KmgNe#rpt2*9o>xSu&Q) z2s8j7k{|H1P7n&dAHAv%F}t6js}Bp*08&H%p1h9-SqSpLA0M^=J5>-zrH^X`ytxhx zHy(iQD3M7_?l-GC@~@?2gV6oij#9;4OZAjF>6%BeF}JF*%??5$qqRi$HrB z5pLv2zSEpD3zDvXYN6E}ZWAG|e@kKMob-u{Gr%V@*2sU35z#by)j%gYOjJKY1DA3X z)96rxRV|Lyh(Lqg6$7s?*WenO95l)w?E?CDF!F$PV0^r|hKz=A8N~%z6KV&vI!sV7 z;{X+DQki@cg(vFkkh>vQeY}QP73CEPAxSR9Zz@DIy(9^8#PP%fIam^kcqU0WNh^tU z3A$qCV!nA~i)JsFrna;4&AR4G;y z{zLFTc}zkX`4x)O<+=Z$E5f<*v?OivT@~n+!^+WETrw%9voM7xi|L9M|7Kd4Sv;H5 zpE`HIYz7gEru|Kuw>p73Jw6S3aDzt(MF<*|Fr>z@!tuf>#csu+&yXpBSV+qlQ(;(U z!pksAM@qL-)%f}J(;FjU0yTvzMJ>fQ<+wsc)k&3q(W3%RrBW5C^0%5#iI{4m!hSi- zKg`O-ast)Pa<-ZoB{!uwg;_oEQ?!5hjyc4WT7R zHL!D9t8`gI?S|J28CQsRJXd-z8D(Lo3ezgn1k;=&hiMSRk@}q*&ed$G8Il=<88138 zI)1wPCCh5lYTs)1HP5x4HN#8COU%pjwQCpq9Dy9#oJTGju4fmR4z>=(j*yOZm)SGE z1*3D1Q<%qzN5s?3Iq^rEhoVQUv+JenIU;rj7HGD39BW1nqnoLCqZ6xii?+F&;N3Em zN%M|`A@ia+$s(#Y%BwK5eO7lYKGP~Ye8Vc1Et3r^9s@%QruE{X;^BjyAJfTJnWi0c zO$*LbQ)9FnRV!8F7qOg+*;cs*J*!>oA2A_+M6-vbqS&HFQ`b_xCm~X0Q=hBS)%esr z)E?EAt0b3n&S}qWmej2k@YJ*5v$(P*Tgs}ls)t;&Y_`$&(Bpp0|9DikU1PlXxPZOL zynwvqd@^{Vc(Qq#C78lTC0OEi=Js}UcA0Xuw(mMG-enmqA1WU_RX4*kD{#uWXT>U! zj-NzLb4|liwkeG)waxRKOgY58>X>g{cr425%-X14wfVO>#XIa%`7Zk_3vXO^koQ{f z;pSOm&tYmmr!=c{;6DDC{5U+B@BoUiw^oye4lmr(k>| ze4u%rd0{;zJ*3;bJ!HO1z8StyAGz<`Z8j!=xSDFX{}^!bdlBO-&WBU;2!oOdYgvoj7AP~8F4VQGQ=CP?*w{moynYi zkg1aDY*cf&QP_@kbUHJc>&BzWsu}Oi5t5FY*1&%lL@cC0k1c;#YAZ{Cb{Cu#A}`ug z7*nWN-`Xa{lX#S)mh!~0$?YTjW*#ap<}$(zBdBHt~Ew_Ud%Mj$s`lGgs84RHJ~1DMMdI z*OqCE z+G>73u~PJ^?5oOZUh2f!j`q~$^cKAzJ#5z2wxn7oF3%;-i_dMVo;7=GrMfKz7ypLd zAXMYs#vJ15*+^|U7kFAe#!fd)PfUZc8n9k!PqkF7-xaVGJ$dH%=}xMBR#&$6tWvHm z^=`U(-6IAOU~q3;Ctq|m)3~c!b&L8u+Rk4EZpPsn;&t>M`EIs}yU7pd#(Dkmf_f6Y zKDTtXv)-uf?QMXuQDTcBl;E;I%<{Ke%eu^TYqr<=i8vs5*iW@x;_bDsa8fWcxG^}r zo#EH|2z@T$K{LrzEmWRuTZ(0zRpU6e!cn?Ss$_1pKFao@;glr>I0H$R7(_xAN5 zFloQkxHLCMj-U5m#)ikU%twZmuA*+Ynec2bKbG^AOsn4W`2E&#obFAR{R8Q<;W|aD zbTw}cueh)M=dMJpw%xhO^W>#EPmS|~>^b+`^@87yZn*R$IzV z{5Fb?#~0V9ODs3oE13;l&p7wmkDj&9GpIMDGry*&o(4u2Hg4qOKVa-rJIo>X~()>$dBT?a^+c4C)VoFNOQLH>1(gzw*y~ z$KGEb^v}Wf@BW+=C_q*TX(%l&0{H&#E5Exm3HS_*y@aL{004*f-vb1YnT-v663SUp zRupO-76B6lvgT-e82}&#NQwxmxUXI4y1A>UzWMfQm&_K2ktZvF!N{J<*13s-sGHFF z*L3tYS8ck`S#37!*Al~?8LEQ^m|%#42zp)@3xL8{B#l3`Kl}Fbn_k&7XP_&%ZR#F- z97&oU^*rZ#&9onTZ@;q|nu@*uhWEF(uGM4w9>yklB01$|tKGYo{{EmjQilg%-khH= zFFW*vXEZPQvePP$^uGMjPtOQH!CGzkW{cihe$y+judnxMjE45@C0bluL)*8(P(*+E{CaT<{evL_4yn(UkuO3TZ;X>jzI#hWBwleg@bckQ z(13f*Z`wz)USHu!*TdI_-@55c!^F&7P+|G8@ohzK8alY^Pt3AeRxCjd8ua&HAz*ka z-UP?C6)%uD-)JLB&st z%uosP0ky0c(p?4~1O$zCZ_Zzt94NDV&-j?rdcjbkTM)I|F?A)+Ai|Ux&u?xEXy+yS zYgRR)zP@}PzWh~cG(3dzd*E;5SI245b1ZbHpd=J{Zl-c?;OESkzGA{uR?g8Bm*E#fJPS$Aea2Bf)QCrjE@Lb&lWOhP*(y%-1WRFPCa%SA|3TB zRPQ!OU~W1R2XQ>M7LjhSp#h`qE7EGmnaiQL0v53p?T3X0$9=X_A3&%;p|SJ@s}f<@ z6|Q$Xj!ZmO0DYK}JEUjgeBE*H*(N3`*;)++1^BKqlxXQ0hTDo9_@UI1#*M3)7eSIO zbW-W{|6*;<(-{Ey)Ubzcmyy+3?8=f3jE;_uWnEqPCKMFdOx_$y3-fiBua5W?Wqp-) z(*mPSJRkM5kKmvzvQc`Yw3&)$-2Tr`-hqwsoM1tr@W9vSaJbRGSnbAJZ?&bUT!f9u zAWe|yl3)A5-}LV5`%A_eA0^3de-t`U0HC0(EbQUoaXU^4Ez|%bQePjb7j|}b#xe+Q z@ad-5Pw)?&Py8_+6%X{^Q)0)J_0I`Vl=SQ_}%eftkh-oeO- z3|M~=QWOz%h^seGwybIN2oVicRVHioYM4KC<%8dj@F)q(=ONqI?6&eEBKQ#^(17Q& zML5c&2y)3la>=*rIl3I2^73-pNJF#~-Fc|5lR`9zlXn9xEnK=!&mXQAYXPC5kj`UQ z0zOf1LW?R4PTo(HS$`rbrS@D_AY9m#}QUmS0xn7g5T z%Ea;hD?<@^gXHNa%>;GJrQ^EbJ3h+c{L{s7tljoxc}SN4mevh1EO0N*Pb!#EZi42df*Mw^X}7 z(8mcOgR3m63970(U;M3)V902rBS31k=V3~kk(|oq#j~6806TW$hf8zG^Uuc&Ec|h6 zq$(RSc`#71*8I}rh+x`v!<8*Zg^Py=geBnVE?l`gT+WxOWa-91=`3QZ$C18mqgSoP z^7wp!CySYwkZRNU6<)X!y&(DXzNxr^J4cT8cNeyv-#zOUt~axs#5EGAL0&8PthGB% z?W`xk^M(h~1kGd?ymMisA1&x@Tt5S|h+^>IZl6&ce`tu_uYv1#`QfsQ-J8k)%27D- zJ`+bn;b~Kz#wQb*93BXt_otBc%g_=F=&->#s6wMrHPw|=N(V31O+8St>)xs=+O|zw zVBsVZ(Xq5qhk_}O;}aDZxU#y;$4R-$_a*p9y7^f}c=S!38;|cbb>)Uzv()x)b_Y+= z7f_@`0!l32LZTg|nVRWW!8vS!9aCaar$Kw;+3o$UN7z^5f_Hmd&}t;0g@TJ=*M$a6 zj9gDU)|BrJv$c5(LMh*oZP#@x_HTK4^!eGI10INRN#n^9$E}q%-;(Jo>5PEl($b>B zLQu6zR)+!d?pXboIqGU_?&g0l7aAz`U6$E*L(YW zuWk1u+z#(Htwk*@YFJaii&a)3#i$vpwawQqx&GipZWx{SXcYa;eBX;vR7>7Kn^Z`R zzEG@6okTx3&6}Az=qm3A7Sy$fiGZR@Q$lZFsaphn$^f=cY6OB?%z{kfYsaj1PGjZH5 z6Z0}GWjihZ#UBqqg0FTv?KTYk5?FsP634hU5R0g>P)(okw5)#J((+)uF46GR5^8aZ z>zTFY)Rj+^{(=b(Vn6|!M2r_53NIP2u*)0$5Y6H|b_!5cP1-{{OnB;w!$?X^4Mo6X z+lhU@9=fUOZ`%*XGr*LArUnU8Og2cNErV;n?aS=#x4JV}nzYL=tAj>BKyY}=1%!i& z60r^fa7`ctiKjl_EwjD8)mOYZ!ehk!UBbxReJo&pQ<8_SgsY*fh}~+Aqmx zIT3z!o_wBB=%NtcD=2)$nCbQ_(a<#mKOO>yD>t0je@E4uL7UFHUW0>eKW0YQJc#KS z*aI+VNii#y&4$Y}x^3?PUiOY#*gER=tmta_j#a$iOBzAKP4{fizk2K*i#E#hnN54x z&~P$vpus`o$zgzeD2vTzVB%W+_D=QOV{jyfnx6hR9slnT=&qZW!$P)A+e2uhLQUrF zR-nnp<}rU7k?c!@;QN;j#8jmt`FbZTw%Dn*;F5v9<6@e1Qk3F2*CZi zr~6~PH1BqXU>yJu4GFRTQ(OofK3Qyb{U5W(B-pUG7o1KnI{{44fqk7%7l$~ty))t! zh(-Mi;nUh|l-jz9Pc98%O{W_XTOC`o<0Di(Hk!1U8r5o%-9VN!zH9$C@sD&Fbv2R_ zITnk#EIA_xxKOg_JR{7p`RV2X*Jx0^25oX~uH5fhtY^MEvj^GJ7z-cYsF83i+|e{2 zRN{DP*S$*N?fE1ty?o{wo}gUs4;W;{jhLZJ*P@07)CyEVY|4t~O5;YYxs?-=)^%AJ zeC(fRLgr%=qD2P-1F!eDYhcTB*{9EnlFgC7K0D^!FcQk5^Z7Htv%RifUrq+w0seRM zK5ZX&+w%cnhY#bWM4*6A(|HkC2r%dC&u0>JScBa?QD{go_rqo!cek0Wm(et7hs!1l z@_32o4JWEIJf4SnxLL)x-0qW9?eB1VYCz>;sx^k>Pnwp3f@W#T7%S}pg>cje;;7-k zjyEn2V?5(T>LGC(QCzFyI@~;;iV8}K0@Qz9dC?cB;2^*{xNSH=;e*h8eg#`7u>M(f zsZNBr#`F`pf2JL%X5S2rz>@zmL2%IkC#sdU?9cYgjF3#6G z>l(xXq?v`x`?Rp6;HWoyE$nqAp1fagX}x;~%5tH==^|GPMhrT3sf;q8J}8AP0`4Xd zFiI3UTPhHZ08Nk*_(K(5A)p%ZS5!pQ3k?2F?m>b!KTH@$s0pb#^ zc{rRLt$;w#eE8s(RJQMg1v)(B4-k16Asjr2=3t|>m^r))$BvU-aiWsTtd=No=<}jyrcA^ehgs{v?Wk-8zZ7OmK#vsYC&_B!D9E zUWui<^No%i->N1gqej@kR^N#Or}JKf>DgaFG1o`fvt`z9n33~GQq+grI+UV1t7TVs zB2LI=R#tSxupein{lIg<03d<{ffTJ@9~r*RHp~#PYab4X=f@WC)Z$7>PM#Of^OiYZ zt`Zft;YFvIx1J}r6@*Em*jgU#u)$$eQCD9U8Ew?6*68)+CG`4W+|YXQnrJ+(gN#Yf zkPVDz@p8SD<~H41c;*W!v6wcuCfmirQ~Y$w3f9}x+h+uFJ9p2wg%|5Dvo^mW-4lb^ zQh!|IfZ!M9-S~@-qugF2%|j`k@7CkLwSN5WJh>d&mgaCkQn}URgZCo=I!lJ~f)ih$ zLRO$ec_1Ov)A@W2V=xR!nw-Jo_^F!ZdH>b=Yy}ET9yhWgC}pK{4=?&;nE>lI3rHe4 z=oC1qYv(4AtphP$QC1eg%+z#X|F+MX4cMw=6s#Bsw(Rrs^EagLvHB+R~`k8f&C1 zaW)X(a#I=^X)kZNT8`BC7*3I zQ|D^+{Qmu0QhMzNJBcSP7(okNm_mlG)0moG0|kWmyzh@h%V>2TK_&aWasoMIO|J7V z&*vY(VzhbHy9P zM1QcXx6?j5-)G2eiAZq1?;`OH;~_+n3B*yG3ltm1^NB`ohNR>+-n2IqI~#C6a4Pg*1T|5FSEvIfyix1$RkyF4DJ@f_?8gWq9>YK5HUFe{fP$!#oYjuCgI; zbbS4QqqlVBhY=eUX+>j8x6_a3jz-dFjy7mE54Gr54MFQdUfWzA<>E^$U`K%lCx!;C z)#`)=Yj_tjp}Vqyiq$GS4}3iNSC0lRxMS=XxfKj44@OHVouoR_R?Id?ZqSw^N9Fsn z3*~#1V&>p+9f6&}8jOcQ501JAo~qkmAbTk`waSIny6sFO$9>82Z*j5SfZOJltD<7S zw6Q=wj}OoXTuzap^IKX{lNehhX_vj>+5UWUMd!=U=`%<`ArS(X<0hwBxwAY~5nPr+ z>Qb--k$=Hw#96X+TGbs?zc*Y9dqLs_K+#nNb2@(|5X7waMyDH}6$9~ftJ}-rTljgw z!o$eI`->BrTCiwG9CI#uGuOx6Wj(9S@h+w9AyInw);${3Flw1mPDxY|IYNXQH3A6# zBVJ@hAdDFw@yXH=KBX2LLkGyrnhH||va4>=I4 zP`MZh=>}%|zHoVx_d9s9Q{G?xmc8I)x)7$hz>}x(79-nxopNHWV6$4^xfuaqkW~>O5NLJuPsXA-yh{X^p20kM0y96Bc7k^r)ctKaL%o0MRd~W z!!K@h?M)xp-*-<{JPPO#I5;>8su-rL!D|Y1BB=Xfikk6t+sc7WQ!EF^$5i`nnb5Nq zH7v$|Oa#$~j4b1+Bh9U?hrT!Opbiu;ZLhot(A5ftb0tUvX~%BFyxqMAnW;~-{rNXP zsfN^|^XO>B_^;1vdl4IlqibGuQD8#^L^vG&5_df=X@`$%I=rtWEtKw;_wr(90YGiL zFEPue+#hbkP$ER~Ei97)J`FY@yB_A5WvzA3*=;QEkafHU5j36$BimBFE+5%`H!_W=%ooEwyOP4vGcH}Zr4vQeDpRO*7!u6vGAEl0xLP7H8zk8-o>L8012C|; z@5q_TcEx%%mu%$WDPx*}%s#azm2rxEl1am8!*`Y-K9F>i?dF?$0G2uSEQJ&X-al{c z4mFA`;;Qqw=Vi%gCs?aX4lYxylL4sMnVXyUohTNKU%DoZ?i;kOPs?@Ygd!33Po@Fc z>M4&D!OCSiqZM0=wH6crJvR6UD(wB=eqqg2le-sC9+NW_-^0T+_rnQ{?9^1TPS>kp zBD-!3>92a^U5VhDjx)=S{T6Kv)d6^aU$@O`kE?eg2EdoWpsAeGs`<^|-8#)`fWNj~ zZxCVI^=~eX-~H05w5E#a7Dri)>G=+-E_AcsAIeL*Ve9KqbkKjv0s68FV}|uZ1cme& zED^Bs)P>xs`~ue(@9}z@x0F}fuh5}!gt0VKdi?aDV#V3-*WO&g(+3ltq^BM)`5u#``T^ubaQZNc$$K}5#0Aq=MW6T+c+-c(QlL5tNrseq+LA%~D(1J9LhXN)mO-lo_azty;4+XwcTJR@JRq7k^{6+JF@Q{0R%^ zRj?f~cr!A!OwCM|gzdku+jr$d;e6IMcd}TDjKpuxPmCNW$S>Pv4639fhmQFaM2&1> zY%;e)66E5969HNvKL@DNYKA?;fST)+C&`eZ{I|4RP%syDI@>KEjp-}+n!`oLOoo?7 zuOU#H=gXB^trHV8>}5ZJb4-elNTf{EG;vQ3s~lMAmqDTgUz51IPG`NEOD@! znWKY8ZKVw6!bj}le3zxwX^OwXxf6G8a1jxJ!Cv%Chd|?_eTBEOWZS#Aukl|^hzw%& z^@l)(uuSvxptX?>ont|8adBbDnzja#fJjn9##?F{nkXpIvpeAa0TdklJ_fIE*DFgL zgdahW{q4yEyEgD?-)$+by5KZEW^0LIKvh&lb#>`Z6%j;+3iJVdwOARe4xbSFBeBDJ z-%soh*Xq!M=s>&yb~`Z{E5t(H3(X`Z9$(h;57>8vfdfgbz3SHOks^7XAcIfOp#!Pi z^tb#Fn12m;6@}C)s;Z)yCH+9YgAGp!tHrN{VQeZTFJJl!ceH?KH#_hMR$55i%nmA* zAK`hOOz_}x2usU%gAs%8L}GH}S{P|b-~JitQ00rsx>&Xa?k#_+DAbxO{ymT|t>-rr|m)Yj0&%>7vlO`>B zmW(}@u0zbi`MtqZdcFHje;D~OCt)?w>n^ASZ!@NIVm;UbdtY0`S zPESG}Zhb)dSkR%Ao zXgSxXPC};ldyo$Qu}Dn={g3Ih)4u~`J#YzSRZRFTQ1eVT;*3)LBroQBUi#Gn-{1` zNV^(VdO>wJy&~v1_LCDbo3gNa`XEDqY~{md!PI3W+Rk0tYNM`eRa%%bF)`V1x-1)f ze|>Uzzc3sg9vbWoMF6qfHCe_Oa=3-W=%l8Qx+95`Tyn3nROSzn+P6R28`dsxeTzx* zDWn!uOm6#BP*qJNhY_2mf9nJYqVF%y^~Q~xfg_`f8b~HeJeMzdl(Mz_as6YGfEr`o zVes$xo`jtptAY01(mo4Zt3gmIwMLZxC?%s-U*SpMgVK-3a?k}C{_6#EF3=|zRc8AI zb_AX%#;Qa&NH`3sprr(I6%nNZRZPO@;U{%C)o=5!V5KY@Zp=gmLK91-g1S27kdP3` zxH&IA#v^UJQobJ@&S$~DlDJq=cpt3D-`J^IfTM@?w|J__paZ;Q;$Ej@AxbAikwqsc z(q0mkgZ=sWIq*sYji)Sz@yiHb^GZe$a3Hx!`|W|_<#si^J;D<%HVlVi$YT^j9$p4d z*w3u}Td>#HhtcEC*m}JO0Wl0L2ofn^*gCMV0uYNRA)Ub$>(o`RSpd6 zO_;QBTVErFS&x~^8Tr;`uzAeVzj2~aL{|i21b~{1ENIPrA{ud#j!T2;t(&b4@1%c} za40<+g{5TB{*ESq5>RR0U)6nGC{{U`OjFv2EkhkiT3#WAfq~Ivx6KD0BuEZ>jo1wq$N(M0i0jwTZU z&6b6L#CK0Tg@Q);oDSWKYrgjzxE{U~?&WE?+CzM~f702v>o`2EV9S?K(XMs6(F2#R z_?(>0n(E?i?O5NhvolLFkXOCW`6RdIlpSKlBLm*T{QCL?;R0kAAfJo~Ld`7U-wh6j z7Q07Yr>y^*SyDfFI1u;>camk-)2}DCF^D-QL&AzrBok$Rxo5FlLY7=&Vcfc&kdpF8J~wa3<18&2 zMHJ=n@li!rchlF5VLxA8Rkh!+zVFa+n6=7Ca(!-|kunM9&!0c;PtC_SS%p!GJ7*w8 z%4tB#ug2(f%zd)d%ng)LLxIkR4<(Doo69sQJw4K|G&syC3c}`0a=%$diZScchz~sv z0xKdIV3&ym1OJvfGB5xPYGlwv_m{fPqBJHk{ixD1;iKlRX=WVXil5gT%tM3A=qtf& zw4J&b=W+LEUcTau!CH!Pd~R;+)n+FdH#1ryd4YHw;fbTPpmQ^JZB6R|Xzsva(fW@Y2NFYT zG`KTD`!AdZFPuhGexeM!vy{?KroYc{11-!D+DRZuu;;+PJqTCJLIBDH>8w_mPZwK3 zR`0(f!b=49i~1iBS7V!5@#?D#DQfaO31B^+Lx-(LMv1)tQ_i-0-t-qEG14E`tTY-u zSv{YxVt~GlJJWyWp*@#@8%O@JlrvXO-TEc)-G)1zj)3Lww`LPwU|AtR1Om4PZK^w} zy-}bgU8?5d@ng$s!GC^LdAiZ>lsw-j3t&ILeEKplPfSi4)NAOoWz{=;dUELg`f$26 zq9=|jb7}0pC@EM#}8PCfwjfT+qp2J zz5QAKk!vU!;aFC@pF}SHs1gFQb%@NZy+KLhaiX?ih}5gSMD)DhJa?V0qH3;eKu>yN zV&bOs{dzQWaUd<)@c&tWN<}?&sJQhQpxIbdQ-cUJ&fgCw>u>I7>&>2Rjg5`O@z{vT$iT9eYDY_ne1geTRqMF%HQo->G&ubDfc9ec*u6W? zN{@|p7Pxt#?lkpEYl|x79o^;bZ>Ww$U zAFtGB>uGE@YvAfquivrHve1tfA`&9<~pMFw=5eA*R!@11C(|A$t>n1WhxcN<;!Ai3e zRSZ5WY=HuFWZ_Py$)x?wj$m;~$=(C=Y_uG%VzFHsUC`uV;U7KUh+8Z@8K-R@^;z!d zT{7{)qcIeGYMMb&G^)MJ)y9O>OsUGAZ^A+G==}EUo+x{25g^=RGg_hp)e@k!3+{lX*SS4D zB_(7UkKJ&fSTZ>+O*|$h=D#AD7#k~;%H^2vhavzkFOcUBmN6RHAFY}RM~Kv!?+R(q zVm4@1H+d{jCKK^Uu(GnsW^cm?oCbJqJiI7fRDijvRjzpV3BPaT-}bhH8qMa3(RX(z zL>tdP9On)~9On?EeY#%I^-C6sD;1UU@mVrzlYZ9u^2VwV*h-2qzWo3igSTY|YD(oN zqpVRgylS(7n61@{tHP(rzl?4+XlD2IS3%C^$j-9RE`A6A6bR z2#bnBRBN>-x?ZgWB>z+SIPG~qNx{++k&=SNM}%^8bYgTqVbJRJAbYyl46^9_XURW?EU|%_ME~k>c2MVaM^bor%k@Txx}Fb)x{eEl&*vjQ zkOL8V9-tum=XgEM9q0K4(qn$3?T^NdM$Pg|JMq8xyI!wB3IfqEkluVS)W!W|Zj`}d zPozrolQ&VOaNiLUt(J)Wk{)c~Z8z+$S)4APEzup+gDf36uQV2l zAS!uqGj#683up(H^WcKKym-)P5FxKuArOs$Ug@iDr;>>Yg~q~Pps2KR>6)yrqJMBQ zht1MZWYY$sztd_sEDr1+sPV%k(SG%@OQ+4hO|RE^3?kKW&)@EDaHexwArg8Vkm#@& zpxXAFnnvUBLHm85FlTc;kz22~K*;ldvhY6N(Tq(@_3>l+1USv`5-sF;z|JJYUu^c^ z*iC!joi9}j=kbM%w@faz&<(XzQ(_A)s!)<{cU*QhP^F5-M=x{@XA*mKtHNmT< zsPedEtp}5 zM6t{A`m(|XiYWMUR0BXWfDRLwW75sq1Ckv+gTKViW8(qD(D;a9`&G`syoM(Rx;^lY z0VUt~^?I^Uc!G(3{rJK9Y+l#SoX0!q(1<}rs}AViLK3$f3!ay3n%6(?zEEazZs<9D z8Ix9c2CdrBN-Q*ykp*O8eOS^Q^2YZ#vKYph`C>Z1 z{vq|(1=7^CfwHQqdhhx7&}v;!bK3)O%75j0pHkSH81L^z(Fc}@=|2$4mOU(Ini()h zgZn>x45>eNM2{TB4tz8Ww;hdGkxViv>6ZU%6qk2CUqYZ%6ch7=e7xG^ep@vTq@66b zzy$)@7vJ->`&;|z%V)%bxyTywzxPc~4F*PRpj?a*re-9$y6il-xGan=0v-s$E0Phc zfsutBCoJ}jPD(177`v3p&=z_&bIK*A-k4N3dGr1$p4X(0OrraO1`bSUi7J*sK>dU+ z46kXo7;}PVd3|;pQ0^f}+j2*0V45lpoj0(w&J<)pM=X*a#V@1Xc|FeiL!U-F@}B1n zq?#QDGo5w|n#ZxD4R$@lZM#%E`Z0KaC@7pKR>S68usoNx^6O2-OHS!xlyIhk`*+{{^3DCxOZkP-iwKB?Sij{{2&tNE~u(s>2<= z106Lw(~g3YXOSmQ#W(-avc6-xR#lU>CGHBFU#b%`P?&3-Ame^}-)@}h9}lY*h#HX_ z1n4*)&uMcil|#RIXK<@;)Dw00_^|5h3yPtKPs$8)E3D{_Llkd>~aDO=20>jF7Llld_nS9;! zQgoFw1NJRMj+3KC6gBlv+G3E;D1nBMFa$yo_6>X9t#npAzphhLV_-22m6+T;TP)@o z49(YrtXNc)e-wNPU&w$bh@?uACT&h}9y=FExWv2gru6?+i5c7lb|7LWm>_F#KJGy} z6CV3DGd5|&L1IqXnc^%(r?f<}2r!TcR8@d8;ZGGctjqOQ4seORdRntqK*OI%?C5N9 zx+Cu>P?|zW*|cR}y>#6~V7)THd3b+`IHgzkYi(4i3W=OIrQ=iWY(rB zV~+&%wOe)AafpMgEE~B{#c;?lz5l`&S>VD1{vASitZJMsJg@BpMrL&8tx3%@M@EWO zA=y>d8qNM21uNEUNpif{R`M(k!U*LgjuUd-!N|j8;?Vj_`2jx;kP3G)uU5V`AnQiJ zNis8+3>*X$$qo=+^Xnm_tOEo2E<9{KOf&QeS zL4k*y>-KtX3s^wzTee=6VffMH36FZFNze|$LQIea#i&cqs4f>JX@v?GY?kjHJ~Hx+a^02~S}4lm z+YpT@x8m0=wo!WO!%4?!TiK`wb_y>#t`)Qu3PbE#12rYLh13-Mb-Y2M%!+a|*1ei{ zK<+B9gXvtkMB^XB)!geHxVHkq!BDU)#+GI3WV9xz%MRBj5WbrZZSa2#+F+zuk`gYa-s!GoXjtjx^MV`meZ zvG9n&U|qL;n7=By{b|H?W>#mcRlKZr>p0>qp|hGK1@+5{H26B|fu`qtLMv z-nFq-f7}2v3S3}cB6)owwJgJ>MHb1Yb?5riy*~AAo2xDr&{3tG#Fx%nFzuCe+wg?S zaT?)tzrSR^UCBH>IhqQSWGDz?g%i!_o}0@RmuorKQf@Mt0*Y!sTF~37etq~%hpp(g zV{J0sEAH|||C~ih1V`blL4+0ytjn@FfMH{+F9s&;tl98{Ly}A(tpe(1)ZUR~)n`cG+SHI8lxvDqLKRVmcIWUW?3H!i$!a3pagz|Q=SMyA-qEYAr8j_ z=+{qQL~zjLIg%vhR_!uJU5H9kgaQd@uZkyOR8i;I3&_q@$OMsKqaOx%LWGW***ZGP zLWRT*t8K38`q>fDNSE<9pFs8qp0v_&=-{t-Ynz&sXmr_jFsUAyrVx^tMQRb}^*N zrONH0M6vo33v_AsFCuj#78u@sMwe^|!Tj_@fFk<1LR4_{FEU9gdElNLg+uF{cyi@+ zEjB)5_%(UsMZKB5RE3|Q?5cm1+gg8jW2xhDh*0(nS?_jkX}#4GB7fM7lYT95cWGZMIcYEV#?yiR&~0CRx*lS$`W+12&v!_5T{eu*w+Dgl(NP?W@`HO1kCE&Q6_>We z+LL>{>{Ra9k4Pd=m|H<$63~Dynu@)v51}FLclH;k+t{f9@cJ2f*>i zt-}(`E4%Lpo&XKX-+f5&6M^smE6+E;^YLsLxRzJ9D}Nn;I>C|SiY|P=$p+}l0P?pQn7KUJ|dxs!B&+ebs zyb(N}FC%>kAZJz(v$Ll;IXdoHXeucyzji-wkD|@;3cA5}q8K%Z)p75UB*dCp$3sMz z2$o>A%I&y(K`uhVUh!QX>@4?Q7e)NJ<2R1(GEc6+_NKWCU3S>incR&Me<) zbml)VMwB!GQx_uf<%@Eyjark#F>!k>gmFSLbVe)@#_Zz?E6T!-i2U9l6&MBg!0UG3 zIfbfo22x{#xJJhE_Yeim1t%hQ9EMKgBD>0-(Tkkx-J|bL7_8s+B<)2#l+%zbzp$f7 z7nhg!-|%X}n1@5ebG?HJJ0AF=&v_yH?HRUAd56a~gKUML=X0B0Iw?-HRuCXI;qvPe zX+hW_&OeaJ8Gj6JfUd9or1_*N`NY<$cZA^o+*p8a7k(M^x0+jD1p6wn*fd;^oJu5~ z^Lpp+=a1|i_*YrFH$hV)LX2!K+i0+lmS17nMBX>Tda^eeLSY;zrs$ztYxlrx> zQzlTiq2G@B3YYcT>LUI^<&1mG?(&11K&j%TM*C_Ar!)sdzNj?Ae=$`-$`oV<7p{e; z8L|!;xmsHaMRqqFmn6#A)L#M}91|SntB$CmWPnl|1eCM_G|E^^Bqn}Owe9>*_n4>B z&oDfpZ%nl}KahpQKH5$9foprEC+NE$zAq^PNkf1J;z8Ps8`a@fcduh8Yz}<@Vf!Pa z^Tj`uD@eC&1*r{X?LRmGcOO1e9CA&HbaJ$bGepC$BhfMG@%~jG`LM~ozBjO}o6j#I zhNgA>HD`S|nZzm6ahY6yD6AZJ5T=V$eO5K4m?XTf*grPChOq=>F%!6ud3(o2U))2U zoEB~?!nIfKXn1EW`fJJMZD$je$gm+m2~E37e<4&g4J|qyS;C+HfXr_tj#eBJ-;~>U zJQ(9$tssa7kLnSB__4<`d67UwFf3Q++Nr3i1b%gf)>1N!Be&%OwG7QIbe5WwSj0<%03LT*Wh&5DhmBz;=4-j`KsOA1;of z+I_RC4I-Dkapy_ac;Qt9NDG}PHpE1c!P8X@SN5kkguD`nh%f&{7fKZ#_c{{@8&dh!C0VN2(#`Xl7_G$1cE7ZD{4(IRn|>kB9l2{JTL zd!qo3hw%Gf#>BL(<^r=MNDv@kVfmMsv;94sGWHbQbLZV~I-O`}XfT@Q={S-kQL;QZ z0bc;QS9gObNbz&?2%k5WJC6V{S`_w}IF4VU zwfjE>W906nyH`C(IbCuw^U0YgC@7%D#>QwGkeElI(XXSGG^{PMk%<`nvmgmg_f`Sq zOmV`Mkpi|8WI-mCqZz;?(S)4r9IB)m2%-Q%67=>_5+mkux9wL<+Zcn}3JDinbRoa- z${Q#sC_rOlBkM_y45{QeL4eY89LGN!oraDFqkmyGnE?XAT3GiriTgd+WGnj&G35WM zw*87}?!&BW+0spaxCxO+1U{b+;cz%8Tl)RSV9e&|pWx~v*~{9zW&@tU5-<+Cld zG|@ZoSIqHY66IC^kYe6?Y_r*tvB2$OBioBX3n3xQOp+wQZnuL3LP!l8SDt8k6H$hu zDr~V>;EiU%pjMummg=|via8EU%M5cMKy462)RN%T4ko!hlQ2Gk>~=d?Ks0wDnvyoM zAR!WoBwFzko!i?C`ZKCzzhc^tNhV}V$6F@(r`+CjK`mNS3Q>+HmRmz-rHKTDm2i`s z%E!{K_R2`VVp^R*O+*GES%hW6JHC7wj%hO@F-bXrRxz;xZh!!UqAO24`cu&qbh75M zUA5t(Pd-9wYHG9d7^@q%)wW+TKMh9sDf9CFn3tj`$VksX1PbayZipntS0sfMbhdXy zPiHqQU%4E9zyE(Kt^Y6erI$>KS0jo2W#e}V96@}g_^B|)Sv~%&3$d`|OL!IE(eyXW z>{I->q}O;}yI~#g-MyD(Sx&}Z{N!!>71MNlj2OMHIvH~PQsQ?Bdm{bR82$HfIE)L= zzW`w=j5S9#kX5wAkI`78EK3HB=rn|8&z(&+n~hXe{n^|0D~6inV>V(0w4KxDSaaYU zH%8MmWM*gKytB{87yFm6s%b2ca5Q%giF|V27~Z~P2XEWHjm>8BzpQQlE{tI{;AEeV z_d1DLKaA&1a{i>(5zxGTcCvS(di=9t{C+>qI^!(3(Lh_>JIErM2^=l|7*a#jFQt$& zgf#lcKmS1%i>0Mx)W4YfIbMt*JciQK)5+)clDod1%w{tQqDY#i#ou~3G!XSSZs$8* zq{VDDlg(x$lgUJ}1fu$RFMdn$jE@zW{ZB#$k2~RdU`sirKQEoP1)^sOuOnT6c-mm z6h*xE?z?cgT=8;P4yO|t85x}5VG$(>6U_37StTg3T3$OcQ5-V{hKNT=k`M?4aLv`% z@HIDHi}LP=Dch0>1~Y*usD>~sYY;x#JC7DFTF6tTOd+4om&lO*Tkq$`V)Q{uNlD?a zmo7yp9HwipyDpCT^y81QdDAAGcE%YL3I=)4o;{S6osHjIdMRFb_F0ZZA`m5src9fL z8Lzy;ilR_jS{g=;8G~hCe@&XI@`Ot+q15zr96WFUxw*MqR#F0DCWq6BC5spHz!OiT z>LW+s^ZBrE?_L@^ZX9>X&u?-+LZSrSk}q{D8`iGHJ9Fk>?6`5b{jR%EUt5a>^X6f~#EH1$?z?g5&>6c%kQ>RWi^PF>V&UxqIx~WsiB+D?FOxV74 zEBf{CPp*^{TKd&j=-j0Xswyi90Cw)!0h`SRlgWgXl$6BOG9=!8_uUV+737bmvEA)T z3~;O%Q50Da1d5dlpkOe_eGB_y?q}~&s+@v?l%5>XBGClatRc;uii5sGy!FryI{lQ> zU`+S+bKZ|J@wc7~Ns6_d40W`A%ysmMqbLdwJn=+)`tirKYsU@{5sw}_mLlOW3VQcO zMrJ0y{pK6qw`UJ!W@VwUu#i?RU(Rb*ug0JuLulZ@fmr_Ccf5YxIvO!*6n3cGgg z!b#)CahEP#C=!XF^3Wmb)w?(6=H+3_rcLyl%Pzx??b~_Ru3coc+0d_le?-Dz^eQOe zg!p!*y1F{;U!4Od8Ag_6mL!P+fq38{+iW&`_St7NW5(-vdF)dhVTJUfwjv2=P`rH0 zvU}*o=`V2KzI`c{{`P0j=_3dND~f`$vNAeSRRtDI%&d^zYDMqf1+ZGJ&@|1MRphv` zacG*xHk%EiC{iF0fZc9qMTy4j`+UBr7XlH7LLstRt-N!`4yvrIf#+64uS87TseYxx_SjmdssXZy06f=r( zNe&zd*U*~%>o9Tr1kx>Ab(M|)00c})L_t*UKiB=}zXbvTG&D5eNL3X_OjlMvOS>TVS-vGojlNu{V8@780f&f)j;cz<9 zr?3!#KmcB^7wH)p=+(P7JdKTr)xBtv<&;{f6qqavelpt@8BWqJA?{y^X=rG`B@-?| zabqc!`VT-Br1*^o)F2H^?+d$T#kTF+^z5xaYuktjzMw)!yi6t40r)~1G}frJI*8IE zelUsp!T-{J)3cC-qALmMC7{Bg5TWHdqd%%`LTjdYW1+J4n(vPX)53R*Sf!Zm-MVAs z&=LGa$r2ERcx{Ym35^Ur-h`cff_0?Xpjgx0b|5CuAJw}+psZ7pCD zCc{rMK0=ZU8to`8c^Ceqm{!gHg20-l@rCDJh#l3tIS|d{!H95OZfm!NWCDT^iP1VKwJ~z*xvPUupMop z+D=KGl(|1EJG+^got>G7#bN=Yu&t5x6z=G`-$Jj&I15~U*0LB33%-IZdV~-Nf*yv$A%x@L;;aWL9Q6BrOsCV@a?hur>wPfm?uojOJ@kR^Uog9f zV>_^H3$f07x{T(Ew&P(n4^h{5z3+Mow7loF%S2;=cM=P}FMarkers With Custom Icons

    Using GeoJSON with Leaflet

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.


    - -

    Layer Groups and Layers Control

    + + +

    Layer Groups and Layers Control

    A tutorial on how to manage groups of layers and use the layer switching control.


    diff --git a/examples/layers-control-example.html b/examples/layers-control-example.html index d852b2d6322..f0b2aa84fed 100644 --- a/examples/layers-control-example.html +++ b/examples/layers-control-example.html @@ -28,16 +28,16 @@ map.setView(new L.LatLng(39.7346, -104.9894), 10).addLayer(minimal).addLayer(motorways); - baseMaps = { + var baseMaps = { "Minimal": minimal, "Night View": midnightCommander }; - overlayMaps = { + var overlayMaps = { "Motorways": motorways }; - layersControl = new L.Control.Layers(baseMaps, overlayMaps); + var layersControl = new L.Control.Layers(baseMaps, overlayMaps); map.addControl(layersControl); diff --git a/examples/layers-control.html b/examples/layers-control.html new file mode 100644 index 00000000000..022e7e0f1c7 --- /dev/null +++ b/examples/layers-control.html @@ -0,0 +1,146 @@ + + + + Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Layers Control Example + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Leaflet

    +

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    + + + +

    ← Back to the list of examples

    +

    Layers Control

    + +

    This guide will show to add a simple layers control to your map that will control the visibility of base maps and overlays.

    + +
    + + +

    View example on a separate page →

    + +

    The first steps are to create a map and some layers, and to add at least one of those layers to the map. The minimal and midnightCommander layers will be our base layers and motorways will be an overlay. Only one base layer should be added but multiple overlays can be added initially.

    + +
    var map = new L.Map('map');
    +		
    +var minimalUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/22677/256/{z}/{x}/{y}.png',
    +	minimalAttribution = 'Minimal Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    +	minimal = new L.TileLayer(minimalUrl, {maxZoom: 18, attribution: minimalAttribution});
    +			
    +var midnightCommanderUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/999/256/{z}/{x}/{y}.png',
    +	midnightCommanderAttribution = 'Night View Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    +	midnightCommander = new L.TileLayer(midnightCommanderUrl, {maxZoom: 18, attribution: midnightCommanderAttribution});
    +			
    +var motorwaysUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/46561/256/{z}/{x}/{y}.png',
    +	motorwaysAttribution = 'Motorways Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    +	motorways = new L.TileLayer(motorwaysUrl, {maxZoom: 18, attribution: motorwaysAttribution});
    +		
    +map.setView(new L.LatLng(39.7346, -104.9894), 10).addLayer(minimal).addLayer(motorways);
    + +

    Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are very simple objects with simple key/value pairs. The key is what sets the text for the layer in the control ( "Night View" ). The corresponding value is just a reference to the layer ( midnightCommander ).

    + +
    var baseMaps = {
    +	"Minimal": minimal,
    +	"Night View": midnightCommander
    +};
    +		
    +var overlayMaps = {
    +    "Motorways": motorways
    +};
    + + +

    Now, all that's left to do is to create a Layers Control and add it to the map. The first parameter passed when creating the layers control is the base layers object. The second, and optional, parameter is the overlays object.

    + +
    var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
    +		
    +map.addControl(layersControl);
    + +
    + +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +
    + + Fork me on GitHub + + + + + + \ No newline at end of file From e6e3e9bfc43f632a09d45ed2298559ca12694276 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 13 Oct 2011 19:17:22 -0400 Subject: [PATCH 0068/2207] Added a sentence about base layers being mutually exclusive. --- examples/layers-control.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/layers-control.html b/examples/layers-control.html index 022e7e0f1c7..972c30ae326 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -42,7 +42,7 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    ← Back to the list of examples

    Layers Control

    -

    This guide will show to add a simple layers control to your map that will control the visibility of base maps and overlays.

    +

    This guide will show to add a simple layers control to your map that will control the visibility of base maps and overlays. Base layers are mutually exclusive, so only one is visble at a time while any number of overlays can be visible at any given time.

    - \ No newline at end of file diff --git a/examples/layers-control.html b/examples/layers-control.html index 972c30ae326..b0dba4ced4d 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -45,7 +45,27 @@

    Layers Control

    This guide will show to add a simple layers control to your map that will control the visibility of base maps and overlays. Base layers are mutually exclusive, so only one is visble at a time while any number of overlays can be visible at any given time.

    -

    View example on a separate page →

    -

    The first steps are to create a map and some layers, and to add at least one of those layers to the map. The minimal and midnightCommander layers will be our base layers and motorways will be an overlay. Only one base layer should be added but multiple overlays can be added initially.

    +

    The first steps are to create a map and some layers, and to add at least one of those layers to the map. The minimal and midnightCommander layers will be our base layers. citiesLayer and motorways will be overlays. Only one base layer should be added but multiple overlays can be added initially. The citiesLayer is a LayerGroup which makes it very easy to add lots of markers, linestrings or polygons to the map and easily remove all of them by unchecking the layer in the layers control.

    var map = new L.Map('map');
     		
    @@ -93,8 +122,11 @@ 

    Layers Control

    var motorwaysUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/46561/256/{z}/{x}/{y}.png', motorwaysAttribution = 'Motorways Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade', motorways = new L.TileLayer(motorwaysUrl, {maxZoom: 18, attribution: motorwaysAttribution}); + +var citiesLayer = new L.LayerGroup(); +// Create some markers. Add them to citiesLayer. View source to see in detail. -map.setView(new L.LatLng(39.7346, -104.9894), 10).addLayer(minimal).addLayer(motorways);
    +map.setView(new L.LatLng(39.7346, -104.9894), 10).addLayer(minimal).addLayer(motorways).addLayer(citiesLayer);

    Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are very simple objects with simple key/value pairs. The key is what sets the text for the layer in the control ( "Night View" ). The corresponding value is just a reference to the layer ( midnightCommander ).

    @@ -104,7 +136,8 @@

    Layers Control

    }; var overlayMaps = { - "Motorways": motorways + "Motorways": motorways, + "Cities": citiesLayer }; From 39f90699f7e424183d0f5bdecd21bcabce24e956 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 27 Oct 2011 16:37:48 +0300 Subject: [PATCH 0072/2207] clean up and rewrite the layers example --- examples/layers-control-example.html | 96 +++++-------- examples/layers-control.html | 203 ++++++++++++++------------- 2 files changed, 145 insertions(+), 154 deletions(-) diff --git a/examples/layers-control-example.html b/examples/layers-control-example.html index fe46f9e05f6..9532d7e8e72 100644 --- a/examples/layers-control-example.html +++ b/examples/layers-control-example.html @@ -11,64 +11,46 @@
    - \ No newline at end of file diff --git a/examples/layers-control.html b/examples/layers-control.html index b0dba4ced4d..3a77747d6e6 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -40,113 +40,122 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    ← Back to the list of examples

    -

    Layers Control

    +

    Layer Groups and Layers Control

    -

    This guide will show to add a simple layers control to your map that will control the visibility of base maps and overlays. Base layers are mutually exclusive, so only one is visble at a time while any number of overlays can be visible at any given time.

    +

    This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

    -

    View example on a separate page →

    + +

    Layer Groups

    + +

    Lets suppose you have a bunch of layers you want to combine into a group to handle them as one in your code:

    + +
    var littletonMarker = new L.Marker(new L.LatLng(39.61, -105.02)).bindPopup("This is Littleton, CO."),
    +	denverMarker = new L.Marker(new L.LatLng(39.74, -104.99)).bindPopup("This is Denver, CO."),
    +	auroraMarker = new L.Marker(new L.LatLng(39.73, -104.8)).bindPopup("This is Aurora, CO."),
    +	goldenMarker = new L.Marker(new L.LatLng(39.77, -105.23)).bindPopup("This is Golden, CO.");
    + +

    Instead of adding them directly to the map, you can do the following, using the LayerGroup class:

    + +
    var citiesLayer = new L.LayerGroup();
    +
    +citiesLayer.addLayer(littletonMarker)
    +           .addLayer(denverMarker)
    +           .addLayer(auroraMarker)
    +           .addLayer(goldenMarker);
    +
    +map.addLayer(citiesLayer);
    + +

    Easy enough! Now you have citiesLayer that combines your city markers into one layer you can add or remove from the map at once.

    + +

    Layers Control

    + +

    Leaflet has a nice little control that allows your users control what layers they want to see on your map. In addition to showing you how to use it, we'll show another handy use for layer groups.

    + +

    There are two types of layers — base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays — all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off — a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map:

    + +
    var cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
    +	cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution};
    +
    +var minimalUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/22677/256/{z}/{x}/{y}.png',
    +	minimal = new L.TileLayer(minimalUrl, cloudmadeOptions);
    +
    +var midnightCommanderUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/999/256/{z}/{x}/{y}.png',
    +	midnightCommander = new L.TileLayer(midnightCommanderUrl, cloudmadeOptions);
    +
    +var motorwaysUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/46561/256/{z}/{x}/{y}.png',
    +	motorways = new L.TileLayer(motorwaysUrl, cloudmadeOptions);
    +
    +var map = new L.Map('map', {
    +	center: new L.LatLng(39.73, -104.99),
    +	zoom: 10,
    +	layers: [minimal, motorways, citiesLayer]
    +});
    + +

    Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are just simple objects with key/value pairs. The key is what sets the text for the layer in the control (e.g. "Night View"). The corresponding value is a reference to the layer (e.g. midnightCommander).

    -

    The first steps are to create a map and some layers, and to add at least one of those layers to the map. The minimal and midnightCommander layers will be our base layers. citiesLayer and motorways will be overlays. Only one base layer should be added but multiple overlays can be added initially. The citiesLayer is a LayerGroup which makes it very easy to add lots of markers, linestrings or polygons to the map and easily remove all of them by unchecking the layer in the layers control.

    - -
    var map = new L.Map('map');
    -		
    -var minimalUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/22677/256/{z}/{x}/{y}.png',
    -	minimalAttribution = 'Minimal Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    -	minimal = new L.TileLayer(minimalUrl, {maxZoom: 18, attribution: minimalAttribution});
    -			
    -var midnightCommanderUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/999/256/{z}/{x}/{y}.png',
    -	midnightCommanderAttribution = 'Night View Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    -	midnightCommander = new L.TileLayer(midnightCommanderUrl, {maxZoom: 18, attribution: midnightCommanderAttribution});
    -			
    -var motorwaysUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/46561/256/{z}/{x}/{y}.png',
    -	motorwaysAttribution = 'Motorways Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    -	motorways = new L.TileLayer(motorwaysUrl, {maxZoom: 18, attribution: motorwaysAttribution});
    -
    -var citiesLayer = new L.LayerGroup();
    -// Create some markers. Add them to citiesLayer. View source to see in detail.
    -		
    -map.setView(new L.LatLng(39.7346, -104.9894), 10).addLayer(minimal).addLayer(motorways).addLayer(citiesLayer);
    +
    var baseMaps = {
    +	"Minimal": minimal,
    +	"Night View": midnightCommander
    +};
     		
    -		

    Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are very simple objects with simple key/value pairs. The key is what sets the text for the layer in the control ( "Night View" ). The corresponding value is just a reference to the layer ( midnightCommander ).

    - -
    var baseMaps = {
    -	"Minimal": minimal,
    -	"Night View": midnightCommander
    -};
    -		
    -var overlayMaps = {
    -    "Motorways": motorways,
    -    "Cities": citiesLayer
    +var overlayMaps = {
    +    "Motorways": motorways,
    +    "Cities": citiesLayer
     };
    - - -

    Now, all that's left to do is to create a Layers Control and add it to the map. The first parameter passed when creating the layers control is the base layers object. The second, and optional, parameter is the overlays object.

    - -
    var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
    -		
    -map.addControl(layersControl);
    + +

    Now, all that's left to do is to create a Layers Control and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional — for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing null as the first argument.

    + +
    var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
    +		
    +map.addControl(layersControl);
    + +

    Now lets view the result on a separate page →

    +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    From e38ca2cc06bf5c09fd2cc78045161fb971b41347 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 27 Oct 2011 17:30:57 +0300 Subject: [PATCH 0073/2207] make layers control example simpler --- examples/layers-control.html | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/examples/layers-control.html b/examples/layers-control.html index 3a77747d6e6..9201a3fa67a 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -59,16 +59,12 @@

    Layer Groups and Layers Control

    citiesLayer.addLayer(goldenMarker); var cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade', - cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution}; + cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution}, + cloudmadeUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png'; - var minimalUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/22677/256/{z}/{x}/{y}.png', - minimal = new L.TileLayer(minimalUrl, cloudmadeOptions); - - var midnightCommanderUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/999/256/{z}/{x}/{y}.png', - midnightCommander = new L.TileLayer(midnightCommanderUrl, cloudmadeOptions); - - var motorwaysUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/46561/256/{z}/{x}/{y}.png', - motorways = new L.TileLayer(motorwaysUrl, cloudmadeOptions); + var minimal = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 22677}), + midnightCommander = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 999}), + motorways = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 46561}); var map = new L.Map('map', {center: new L.LatLng(39.73, -104.99), zoom: 10, layers: [minimal, motorways, citiesLayer]}); @@ -117,17 +113,13 @@

    Layers Control

    There are two types of layers — base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays — all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off — a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map:

    -
    var cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
    +		
    var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/{styleId}/256/{z}/{x}/{y}.png',
    +	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
     	cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution};
     
    -var minimalUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/22677/256/{z}/{x}/{y}.png',
    -	minimal = new L.TileLayer(minimalUrl, cloudmadeOptions);
    -
    -var midnightCommanderUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/999/256/{z}/{x}/{y}.png',
    -	midnightCommander = new L.TileLayer(midnightCommanderUrl, cloudmadeOptions);
    -
    -var motorwaysUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/46561/256/{z}/{x}/{y}.png',
    -	motorways = new L.TileLayer(motorwaysUrl, cloudmadeOptions);
    +var minimal = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 22677}),
    +	midnightCommander = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 999}),
    +	motorways = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 46561});
     
     var map = new L.Map('map', {
     	center: new L.LatLng(39.73, -104.99),
    
    From 9a456b14e338fbd6cb69551f9d956bc28226287b Mon Sep 17 00:00:00 2001
    From: mourner 
    Date: Thu, 27 Oct 2011 17:39:05 +0300
    Subject: [PATCH 0074/2207] cleanup
    
    ---
     examples/layers-control-example.html | 14 +++++---------
     1 file changed, 5 insertions(+), 9 deletions(-)
    
    diff --git a/examples/layers-control-example.html b/examples/layers-control-example.html
    index 9532d7e8e72..59846036411 100644
    --- a/examples/layers-control-example.html
    +++ b/examples/layers-control-example.html
    @@ -25,16 +25,12 @@
     		citiesLayer.addLayer(goldenMarker);
     
     		var cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
    -			cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution};
    +				cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution},
    +				cloudmadeUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png';
     
    -		var minimalUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/22677/256/{z}/{x}/{y}.png',
    -			minimal = new L.TileLayer(minimalUrl, cloudmadeOptions);
    -
    -		var midnightCommanderUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/999/256/{z}/{x}/{y}.png',
    -			midnightCommander = new L.TileLayer(midnightCommanderUrl, cloudmadeOptions);
    -
    -		var motorwaysUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/46561/256/{z}/{x}/{y}.png',
    -			motorways = new L.TileLayer(motorwaysUrl, cloudmadeOptions);
    +		var minimal = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 22677}),
    +			midnightCommander = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 999}),
    +			motorways = new L.TileLayer(cloudmadeUrl, cloudmadeOptions, {styleId: 46561});
     
     		var map = new L.Map('map', {center: new L.LatLng(39.73, -104.99), zoom: 10, layers: [minimal, motorways, citiesLayer]});
     
    
    From d432e562b53185f97004d6eeccbd5b77cac6c4d2 Mon Sep 17 00:00:00 2001
    From: mourner 
    Date: Fri, 28 Oct 2011 15:18:03 +0300
    Subject: [PATCH 0075/2207] compatibility notice
    
    ---
     examples/layers-control.html | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/examples/layers-control.html b/examples/layers-control.html
    index 9201a3fa67a..285bdf59d9c 100644
    --- a/examples/layers-control.html
    +++ b/examples/layers-control.html
    @@ -43,6 +43,7 @@ 

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    Layer Groups and Layers Control

    This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

    +

    Note: this only works in the latest (master) version of Leaflet.

    + + +

    +

    Download Leaflet

    - +

    Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system.

    Download Leaflet 0.2.1 (zip, stable)
    Download Leaflet master (zip, development version)

    - +

    View Changelog

    - -

    - - - - - -

    - +

    Including Leaflet on your page

    Place the contents of the dist folder somewhere in your directory tree and include it in the head section of your HTML with the following code:

    -
    <!-- Leaflet CSS --> 
    +		
    <!-- Leaflet CSS -->
     <link rel="stylesheet" href="<path_to_dist>/leaflet.css" />
     <!--[if lte IE 8]><link rel="stylesheet" href="<path_to_dist>/leaflet.ie.css" /><![endif]-->
     
     <!-- Leaflet JavaScript -->
     <script src="<path_to_dist>/leaflet.js"></script>
    - +

    Building a custom version of Leaflet

    Open build/build.html page from the download package, check the components you want to see in your build and then follow the instructions there.

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/examples.html b/examples.html index 8f54c81438d..3bc6ef7256a 100644 --- a/examples.html +++ b/examples.html @@ -2,11 +2,11 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Examples - + - + - + @@ -28,37 +28,40 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - -

    Leaflet examples

    - -

    Every example here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers.

    - +

    + + + - + - - + +

    - + +

    Leaflet examples

    + +

    Every example here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers.

    +
    - +

    Leaflet Quick Start Guide

    A simple step-by-step guide that will quickly get you started with Leaflet basics, including setting up a Leaflet map (with CloudMade tiles) on your page, working with markers, polylines and popups, and dealing with events.

    - +
    - +

    Leaflet on Mobile

    In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

    @@ -67,13 +70,13 @@

    Leaflet on Mobile

    Markers With Custom Icons

    In this pretty example, you'll learn how to easily define your own icons for use by the markers you put on the map.

    -
    - - -

    Using GeoJSON with Leaflet

    -

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.


    - + + +

    Using GeoJSON with Leaflet

    +

    In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

    +
    +

    Layer Groups and Layers Control

    A tutorial on how to manage groups of layers and use the layer switching control.

    @@ -92,18 +95,18 @@

    OOP in Leaflet


    More examples coming soon!

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/features.html b/features.html index 8c038f371c7..89d6c2af830 100644 --- a/features.html +++ b/features.html @@ -2,11 +2,11 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Features - + - + - + @@ -28,29 +28,32 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - -

    Leaflet features

    - -

    Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being flexible enough to be easily extended by writing third-party plugins.

    - +

    + + + - + - - + +

    +

    Leaflet features

    + +

    Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being flexible enough to be easily extended by writing third-party plugins.

    +

    Available map layers

    @@ -65,8 +68,8 @@

    Available map layers

  • KML
  • GeoRSS
  • - -

    Interaction features

    + +

    Interaction features

    On desktop browsers

    • Drag panning
    • @@ -81,8 +84,8 @@

      On mobile browsers (iOS, Android)

    • Double tap zoom
    • Panning inertia
    -
    - +
    +

    Visual features

      @@ -92,7 +95,7 @@

      Visual features

    • Tile and popup fade animation
    • Very nice default design for markers and popups
    - +

    Customization features

    • Pure CSS3 popups and controls for easy restyling
    • @@ -108,9 +111,9 @@

      Performance features

    • Clever tricks to make panning and zooming really smooth
    • Smart polyline/polygon rendering makes it responsive even when displaying objects with thousands of points
    • Modular build system allows you to reduce the size of the library by leaving out the code you don't need
    • -
    +
    - +

    Map controls

      @@ -120,7 +123,7 @@

      Map controls

    • Layer switcher
    - +

    Browser support

    On desktop

      @@ -142,22 +145,22 @@

      On mobile

    - +

    If you find some feature really missing in Leaflet, please submit it to the issue tracker.

    * Grayed out features are in the roadmap and coming soon.

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/index.html b/index.html index 891b5c58147..2c490029b70 100644 --- a/index.html +++ b/index.html @@ -2,21 +2,21 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - + - + - + - + - + @@ -29,46 +29,51 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - - -

    Leaflet is a modern, lightweight BSD-licensed JavaScript library for making tile-based interactive maps for both desktop and mobile web browsers, developed by CloudMade to form the core of its next generation JavaScript API.

    -

    It is built from the ground up to work efficiently and smoothly on both platforms, utilizing cutting-edge technologies included in HTML5. Its top priorities are usability, performance, small size, A-grade browser support, flexibility and easy to use API. The OOP-based code of the library is designed to be modular, extensible and very easy to understand. Find out more on the features page.

    - + +

    + + + - + + - - + +

    - + + +

    Leaflet is a modern, lightweight BSD-licensed JavaScript library for making tile-based interactive maps for both desktop and mobile web browsers, developed by CloudMade to form the core of its next generation JavaScript API.

    +

    It is built from the ground up to work efficiently and smoothly on both platforms, utilizing cutting-edge technologies included in HTML5. Its top priorities are usability, performance, small size, A-grade browser support, flexibility and easy to use API. The OOP-based code of the library is designed to be modular, extensible and very easy to understand. Find out more on the features page.

    +

    Basic usage example

    - +

    Here we create a map with a CloudMade tile layer, add a marker and bind a popup with some text to it:

    // create a CloudMade tile layer
     var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
    @@ -92,14 +97,14 @@ 

    Basic usage example

    Contributing to Leaflet

    The project is hosted on GitHub, waiting for your contributions — just send your pull requests to Vladimir Agafonkin (Leaflet maintainer). Let's make the best library for maps that can possibly exist!

    -

    You can also help the project a lot by reporting bugs and discussing features on the issues page or tweeting to @LeafletJS. - +

    You can also help the project a lot by reporting bugs and discussing features on the issues page or tweeting to @LeafletJS. +


    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + - \ No newline at end of file + diff --git a/reference.html b/reference.html index 539b766b72a..f659a2f9f84 100644 --- a/reference.html +++ b/reference.html @@ -2,9 +2,9 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Documentation - + - + @@ -26,17 +26,30 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - + +

    + + + + + + + + +

    + +
    +

    Map

    @@ -140,32 +153,23 @@

    Interfaces

  • IProjection
  • ICRS
  • - +

    Misc

    - -
    -

    - - - - - -

    L.Map

    - +

    The central class of the API — it is used to create a map on a page and manipulate it.

    - +

    Usage example

    - -
    // initialize the map on the "map" div with a given center and zoom 
    +
    +		
    // initialize the map on the "map" div with a given center and zoom
     var map = new L.Map('map', {
    -	center: new L.LatLng(51.505, -0.09), 
    +	center: new L.LatLng(51.505, -0.09),
     	zoom: 13
     });
     
    @@ -175,9 +179,9 @@ 

    Usage example

    // add the CloudMade layer to the map map.addLayer(cloudmade);
    - +

    Constructor

    - + @@ -188,9 +192,9 @@

    Constructor

    Constructor Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.
    - +

    Options

    - + @@ -295,17 +299,17 @@

    Options

    Option Set it to false if you don't want popups to close when user clicks the map.
    - +

    Properties

    - +

    Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

    - +
    map.doubleClickZoom.disable();
    - +

    You can also access default map controls like attribution control through map properties:

    - +
    map.attributionControl.addAttribution("Earthquake data &copy; GeoNames");
    - + @@ -343,12 +347,12 @@

    Properties

    Property Attribution control.
    - - + +

    Events

    - +

    You can subscribe to the following events using these methods.

    - + @@ -445,12 +449,12 @@

    Events

    Event PopupEvent Fired when a popup is closed (using closePopup method).
    - - + +

    Projections

    - +

    You can specify different CRS for map to use through its crs option. Here's the list of available CRS:

    - + @@ -469,12 +473,12 @@

    Projections

    CRS EPSG:4326 (Mercator), used by some map providers.
    - - + +

    Map panes

    - +

    An object literal that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

    - + @@ -517,11 +521,11 @@

    Map panes

    Property Pane for popups.
    - - - + + +

    Methods that modify map state

    - + @@ -586,7 +590,7 @@

    Methods that modify map state

    Method

    Methods that get map state

    - + @@ -644,9 +648,9 @@

    Methods that get map state

    Method Returns an object for accessing different panes of the map (tile pane, marker pane, etc.).
    - +

    Methods for layers and controls

    - + @@ -658,7 +662,7 @@

    Methods for layers and controls

    - + @@ -680,10 +684,10 @@

    Methods for layers and controls

    addLayer( <ILayer> layer ) this Removes the given layer from the map.
    openPopup( <Popuppopup ) this Removes the given control from the map.
    - - + +

    Conversion methods

    - + @@ -736,9 +740,9 @@

    Conversion methods

    Method Projects the given pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).
    - +

    Other methods

    - + @@ -803,18 +807,18 @@

    Locate options

    Method Enables high accuracy, see description in the W3C spec.
    - - + +

    L.Marker

    - +

    Used to put markers on the map.

    - +

    Usage example

    var marker = new L.Marker(latlng);
     map.addLayer(marker);
    - +

    Constructor

    - + @@ -825,9 +829,9 @@

    Constructor

    Constructor Instantiates a Marker object given a geographical point and optionally an options object.
    - +

    Options

    - + @@ -854,11 +858,11 @@

    Options

    Option Whether the marker is draggable with mouse/touch or not.
    - +

    Events

    - +

    You can subscribe to the following events using these methods.

    - + @@ -891,9 +895,9 @@

    Events

    Event Fired when the user stops dragging the marker.
    - +

    Methods

    - + @@ -921,13 +925,13 @@

    Methods

    Method Opens the popup previously bound by the bindPopup method.
    - +

    Interaction handlers

    - +

    Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

    - +
    marker.dragging.disable();
    - + @@ -940,27 +944,27 @@

    Interaction handlers

    Property Marker dragging handler (by both mouse and touch).
    - - - + + + - +

    Used to open popups in certain places of the map. Use Map#openPopup to open popups while making sure that only one popup is open at one time (recommended for usability), or use Map#addLayer to open as many as you want.

    - +

    Usage example

    If you want to just bind a popup to marker click and then open it, it's really easy:

    marker.bindPopup(popupContent).openPopup();

    Path overlays like polylines also have a bindPopup method. Here's a more complicated way to open a popup on a map:

    -
    var popupContent = '<p>Hello world!<br />This is a nice popup.</p>', 
    +		
    var popupContent = '<p>Hello world!<br />This is a nice popup.</p>',
     	popup = new L.Popup();
     
     popup.setLatLng(latlng);
     popup.setContent(popupContent);
     
     map.openPopup(popup);
    - +

    Constructor

    - + @@ -971,9 +975,9 @@

    Constructor

    Constructor Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers.
    - + - + @@ -1006,9 +1010,9 @@
    Option The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays.
    - +

    Methods

    - + @@ -1026,20 +1030,20 @@

    Methods

    Method Sets the HTML content of the popup.
    - - - + + +

    L.TileLayer

    - +

    Used to load and display tile layers on the map, implements ILayer interface.

    - +

    Usage example

    - +
    var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
     	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18});
    - +

    Constructor

    - + @@ -1050,14 +1054,14 @@

    Constructor

    Constructor Instantiates a tile layer object given a URL template and optionally an options object.
    - +

    URL template

    A string of the following form:

    'http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png'
    -

    {s} means one of the randomly chosen subdomains (their range is specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

    +

    {s} means one of the randomly chosen subdomains (their range is specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

    Options

    - + @@ -1070,7 +1074,7 @@

    Options

    - + @@ -1120,24 +1124,24 @@

    Options

    Option Number 0 Minimum zoom number.
    maxZoom Number If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false.
    - - - + + +

    L.TileLayer.WMS

    - +

    Used to display WMS services as tile layers on the map. Extends TileLayer, implements ILayer interface.

    - +

    Usage example

    - +
    var nexrad = new L.TileLayer.WMS("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
     	layers: 'nexrad-n0r-900913',
     	format: 'image/png',
     	transparent: true,
     	attribution: "Weather data © 2011 IEM Nexrad"
     });
    - +

    Constructor

    - + @@ -1148,11 +1152,11 @@

    Constructor

    Constructor Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
    - +

    Options

    - +

    Includes all TileLayer options and additionally:

    - + @@ -1165,7 +1169,7 @@

    Options

    - + @@ -1191,24 +1195,24 @@

    Options

    Option String - (required) Comma-separated list of WMS layers to show.
    styles String Version of the WMS service to use.
    - - - + + +

    L.TileLayer.Canvas

    - +

    Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer, implements ILayer interface.

    - +

    Usage example

    - +
    var canvasTiles = new L.TileLayer.Canvas();
    -		
    +
     canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
     	var ctx = canvas.getContext('2d');
     	// draw something on the tile canvas
     }
    - +

    Constructor

    - + @@ -1219,9 +1223,9 @@

    Constructor

    Constructor Instantiates a Canvas tile layer object given an options object (optionally).
    - +

    Methods

    - + @@ -1237,20 +1241,20 @@

    Methods

    L.ImageOverlay

    - +

    Used to load and display a single image over specific bounds of the map, implements ILayer interface.

    - +

    Usage example

    - +
    var imageBounds = new L.LatLngBounds(
     		new L.LatLng(40.712216,-74.22655),
     		new L.LatLng(40.773941,-74.12544));
    -		
    +
     var image = new L.ImageOverlay(
     		"http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg", imageBounds);
    - +

    Constructor

    - +
    Method
    @@ -1261,13 +1265,13 @@

    Constructor

    Constructor Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to.
    - - + +

    L.Path

    An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. - +

    Options

    @@ -1325,11 +1329,11 @@

    Options

    If false, the vector will not emit mouse events and will act as a part of the underlying map.
    - +

    Events

    - +

    You can subscribe to the following events using these methods.

    - + @@ -1347,7 +1351,7 @@

    Events

    Event Fired when the user double-clicks (or double-taps) the object.
    - +

    Constants

    @@ -1375,7 +1379,7 @@

    Constants

    How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.
    - +

    Methods

    @@ -1398,13 +1402,13 @@

    Methods

    -
    LatLngBounds Returns the LatLngBounds of the path.
    - - + + +

    L.Polyline

    - +

    A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    - +

    Usage example

    // create a red polyline from an arrays of LatLng points
     var polyline = new L.Polyline(latlngs, {color: 'red'});
    @@ -1414,9 +1418,9 @@ 

    Usage example

    // add the polyline to the map map.addLayer(polyline);
    - +

    Constructor

    - + @@ -1427,11 +1431,11 @@

    Constructor

    Constructor Instantiates a polyline object given an array of geographical points and optionally an options object.
    - +

    Options

    - +

    You can use Path options and additionally the following options:

    - + @@ -1451,12 +1455,12 @@

    Options

    -
    Option false Disabled polyline clipping.
    +

    Methods

    - +

    You can use Path methods and additionally the following methods:

    - + @@ -1489,15 +1493,15 @@

    Methods

    Method Returns the LatLngBounds of the polyline.
    - - - + + +

    L.MultiPolyline

    - +

    Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

    - +

    Constructor

    - + @@ -1508,15 +1512,15 @@

    Constructor

    Constructor Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
    - - - + + +

    L.Polygon

    - +

    A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

    - +

    Constructor

    - + @@ -1527,17 +1531,17 @@

    Constructor

    Constructor Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.
    - +

    Polygon the same options and methods as Polyline.

    - - - + + +

    L.MultiPolygon

    - +

    Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

    - +

    Constructor

    - + @@ -1548,16 +1552,16 @@

    Constructor

    Constructor Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
    - - - - + + + +

    L.Circle

    - +

    A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

    - +

    Constructor

    - + @@ -1568,9 +1572,9 @@

    Constructor

    Constructor Instantiates a circle object given a geographical point, a radius in meters and optionally an options object.
    - +

    Methods

    - + @@ -1583,15 +1587,15 @@

    Methods

    Method Sets the position of a circle to a new location.
    - - - + + +

    L.CircleMarker

    - +

    A circle of a fixed size with radius specified in pixels. Extends Circe. Use Map#addLayer to add it to the map.

    - +

    Constructor

    - + @@ -1602,9 +1606,9 @@

    Constructor

    Constructor Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.
    - +

    Methods

    - + @@ -1617,23 +1621,23 @@

    Methods

    Method Sets the position of a circle marker to a new location.
    - - - + + +

    L.LayerGroup

    - +

    Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

    - +
    var group = new L.LayerGroup();
     
     group.addLayer(marker1);
     group.addLayer(marker2);
     group.addLayer(polyline);
    -		
    +
     map.addLayer(group);
    - +

    Constructor

    - + @@ -1644,9 +1648,9 @@

    Constructor

    Constructor Create a layer group, optionally given an initial set of layers.
    - +

    Methods

    - + @@ -1669,25 +1673,25 @@

    Methods

    Method Removes all the layers from the group.
    - - - + + +

    L.FeatureGroup

    - +

    Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

    - +
    var group = new L.FeatureGroup([marker1, marker2, polyline]);
     
     group.bindPopup('Hello world!');
     
    -group.on('click', function() { 
    -	alert('Clicked on a group!'); 
    +group.on('click', function() {
    +	alert('Clicked on a group!');
     });
    -		
    +
     map.addLayer(group);
    - +

    Constructor

    - + @@ -1698,11 +1702,11 @@

    Constructor

    Constructor Create a layer group, optionally given an initial set of layers.
    - +

    Methods

    - +

    Has all LayerGroup methods and additionally:

    - + @@ -1715,11 +1719,11 @@

    Methods

    Method Binds a popup with a particular HTML content to a click on any layer from the group.
    - +

    Events

    - +

    You can subscribe to the following events using these methods.

    - + @@ -1737,23 +1741,23 @@

    Events

    Event Fired when the user double-clicks (or double-taps) on the group.
    - - + +

    L.GeoJSON

    - +

    Represents a GeoJSON layer. Allows you to parse GeoJSON data and display on the map. Extends LayerGroup.

    - +
    var geojson = new L.GeoJSON();
     
     geojson.on('featureparse', function(e) {
     	// do something with e.layer depending on e.properties
     });
     geojson.addGeoJSON(geojsonObj);
    -		
    +
     map.addLayer(geojson);
    - +

    Constructor

    - + @@ -1764,9 +1768,9 @@

    Constructor

    Constructor Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it with addGeoJSON method) and an options object.
    - +

    Options

    - + @@ -1781,12 +1785,12 @@

    Options

    Option Function of the form (LatLng)->ILayer that will be used for creating layers for GeoJSON points (if not specified, markers will be created).
    - - + +

    Events

    - +

    You can subscribe to the following events using these methods.

    - + @@ -1799,11 +1803,11 @@

    Events

    Event Fired before an object converted from a GeoJSON feature is added to the map. This event can be used to add interaction or change styling of objects depending on feature properties.
    - - - + + +

    Methods

    - + @@ -1816,9 +1820,9 @@

    Methods

    Method Adds a GeoJSON object to the layer.
    - +

    Static methods

    - + @@ -1841,17 +1845,17 @@

    Static methods

    Method Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default).
    - - - - + + + +

    L.LatLng

    - +

    Represents a geographical point with a certain latitude and longitude.

    var latlng = new L.LatLng(50.5, 30.5);
    - +

    Constructor

    - + @@ -1862,9 +1866,9 @@

    Constructor

    Constructor Creates a LatLng object with the given latitude and longitude. Wraps longitude to lie between -180 and 180 and clamps longitude between -90 and 90 by default — you can disable this with the noWrap argument.
    - +

    Properties

    - + @@ -1882,9 +1886,9 @@

    Properties

    Property Longitude in degrees.
    - +

    Methods

    - + @@ -1902,9 +1906,9 @@

    Methods

    Method Returns a string representation of the point (for debugging purposes).
    - +

    Constants

    - + @@ -1931,19 +1935,19 @@

    Constants

    Constant Max margin of error for the equality check.
    - - - - + + + +

    L.LatLngBounds

    - +

    Represents a rectangular geographical area on a map.

    var southWest = new L.LatLng(40.712,-74.227),
     	northEast = new L.LatLng(40.774,-74.125),
     	bounds = new L.LatLngBounds(southWest, northEast);
    - +

    Constructor

    - + @@ -1958,9 +1962,9 @@

    Constructor

    Constructor Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
    - +

    Methods

    - + @@ -2008,16 +2012,16 @@

    Methods

    Method Returns true if the rectangle contains the given point.
    - - - + + +

    L.Point

    - +

    Represents a point with x and y coordinates in pixels. - +

    Constructor

    - + @@ -2100,16 +2104,16 @@

    Methods

    Constructor
    - +

    L.Bounds

    - +

    Represents a rectangular area in pixel coordinates.

    var p1 = new L.Point(10, 10),
     	p2 = new L.Point(40, 60),
     	bounds = new L.Bounds(p1, p2);
    - +

    Constructor

    - + @@ -2124,9 +2128,9 @@

    Constructor

    Constructor Creates a Bounds object defined by the points it contains.
    - +

    Properties

    - + @@ -2144,9 +2148,9 @@

    Properties

    Property The bottom right corner of the rectangle.
    - +

    Methods

    - + @@ -2174,12 +2178,12 @@

    Methods

    Method Returns true if the rectangle contains the given point.
    - - + +

    L.Icon

    - +

    Represents an icon to provide when creating a marker. If you want to create your own icon, you need to extend this class like this:

    - +
    var MyIcon = L.Icon.extend({
     	iconUrl: 'my-icon.png',
     	shadowUrl: 'my-icon-shadow.png',
    @@ -2194,7 +2198,7 @@ 

    L.Icon

    var marker = new L.Marker(marker, {icon: icon});

    Properties

    - + @@ -2232,9 +2236,9 @@

    Properties

    Property The point from which the marker popup opens, relative to the anchor point.
    - +

    Constructor

    - + @@ -2245,13 +2249,13 @@

    Constructor

    Constructor Creates an icon instance. You can optionally pass an iconUrl that will replace the default one (useful for creating many similar markers that only differ in the icon image).
    - - - + + +

    L.Control.Zoom

    - +

    A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Implements IControl interface.

    - +

    Constructor

    @@ -2263,13 +2267,13 @@

    Constructor

    Creates a zoom control.
    - - - + + +

    L.Control.Attribution

    - +

    The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Implements IControl interface.

    - +

    Constructor

    @@ -2281,7 +2285,7 @@

    Constructor

    Creates an attribution control.
    - +

    Methods

    @@ -2305,19 +2309,19 @@

    Methods

    Removes an attribution text.
    - - + +

    Events methods

    - +

    A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

    Example

    - +
    map.on('click', function(e) {
     	alert(e.latlng);
     });
    - +

    Methods

    @@ -2364,17 +2368,17 @@

    Methods

    Event objects

    - +

    Event object is an object that you recieve as an argument in a listener function when some event is fired, containing useful information about that event. For example:

    - +
    map.on('click', function(e) {
     	alert(e.latlng); // e is an event object (MouseEvent in this case)
    -});
    - +}); +

    Event

    - +

    The base event object. All other event objects contain these properties too.

    - +
    @@ -2392,9 +2396,9 @@

    Event

    property The object that fired the event.
    - +

    MouseEvent

    - + @@ -2412,9 +2416,9 @@

    MouseEvent

    property Pixel coordinates of the point where the mouse event occured relative to the map layer.
    - +

    LocationEvent

    - + @@ -2437,9 +2441,9 @@

    LocationEvent

    property Accuracy of location in meters.
    - +

    ErrorEvent

    - + @@ -2457,7 +2461,7 @@

    ErrorEvent

    property Error code (if applicable).
    - +

    LayerEvent

    @@ -2474,7 +2478,7 @@

    LayerEvent

    GeoJSON event

    - + @@ -2502,7 +2506,7 @@

    GeoJSON event

    property GeoJSON ID of the feature (if present).
    - + @@ -2520,12 +2524,12 @@ - - + +

    IHandler

    An interface implemented by interaction handlers.

    - +
    @@ -2550,18 +2554,18 @@

    IHandler

    Method
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + -

    Here we create a map with a CloudMade tile layer, add a marker and bind a popup with some text to it:

    -
    // create a CloudMade tile layer
    -var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
    -	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
    -	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
    -
    -// initialize the map on the "map" div
    +		

    Here we create a map with tiles of our choice, add a marker and bind a popup with some text to it:

    +
    // initialize the map on the "map" div
     var map = new L.Map('map');
     
    -// set the map view to a given center and zoom and add the CloudMade layer
    -map.setView(new L.LatLng(51.505, -0.09), 13).addLayer(cloudmade);
    +// create a CloudMade tile layer (or use other provider of your choice)
    +var cloudmade = new L.TileLayer('http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png', {
    +	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
    +	maxZoom: 18
    +});
    +
    +// add the CloudMade layer to the map set the view to a given center and zoom
    +map.addLayer(cloudmade).setView(new L.LatLng(51.505, -0.09), 13);
     
     // create a marker in the given location and add it to the map
     var marker = new L.Marker(new L.LatLng(51.5, -0.09));
    @@ -97,7 +98,7 @@ 

    Basic usage example

    Contributing to Leaflet

    The project is hosted on GitHub, waiting for your contributions — just send your pull requests to Vladimir Agafonkin (Leaflet maintainer). Let's make the best library for maps that can possibly exist!

    -

    You can also help the project a lot by reporting bugs and discussing features on the issues page or tweeting to @LeafletJS. +

    You can also help the project a lot by reporting bugs and discussing features on the issues page, tweeting to @LeafletJS or joining the Leaflet mailing list.


    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    diff --git a/reference.html b/reference.html index ddfcd59a7b3..fcbfc238ba9 100644 --- a/reference.html +++ b/reference.html @@ -1,4 +1,5 @@ + Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Documentation From 3466fb95c6adf4ba4bf56eeb4a31cf6879446c19 Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 14 Feb 2012 17:02:29 +0200 Subject: [PATCH 0086/2207] better mobile look of the pages --- download.html | 2 + examples.html | 2 + examples/custom-icons-example.html | 20 ++-- examples/custom-icons.html | 84 +++++++------- examples/geojson-example.html | 36 +++--- examples/geojson.html | 100 ++++++++--------- examples/layers-control-example.html | 6 +- examples/layers-control.html | 60 +++++----- examples/mobile-example.html | 26 ++--- examples/mobile.html | 78 ++++++------- examples/quick-start-example.html | 38 ++++--- examples/quick-start.html | 158 ++++++++++++++------------- features.html | 2 + index.html | 6 +- reference.html | 2 + 15 files changed, 323 insertions(+), 297 deletions(-) diff --git a/download.html b/download.html index 50e7c785601..39229bb42bb 100644 --- a/download.html +++ b/download.html @@ -7,6 +7,8 @@ + + diff --git a/examples.html b/examples.html index 3bc6ef7256a..7268fa45946 100644 --- a/examples.html +++ b/examples.html @@ -7,6 +7,8 @@ + + diff --git a/examples/custom-icons-example.html b/examples/custom-icons-example.html index 98699e8001e..8fdbd2d02b8 100644 --- a/examples/custom-icons-example.html +++ b/examples/custom-icons-example.html @@ -3,7 +3,9 @@ Leaflet Quick Start Guide Example - + + + @@ -13,13 +15,13 @@ - \ No newline at end of file + diff --git a/examples/custom-icons.html b/examples/custom-icons.html index 9f82a3a1dd9..90e7d3e5775 100644 --- a/examples/custom-icons.html +++ b/examples/custom-icons.html @@ -2,11 +2,13 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Markers With Custom Icons Example - + - + - + + + @@ -28,33 +30,33 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - +

    ← Back to the list of examples

    Markers With Custom Icons

    - +

    In this example, you'll learn how to easily define your own icons for use by the markers you put on the map.

    - +
    - + - +

    View example on a separate page →

    - +

    Preparing the images

    - +

    To make a custom icon, we usually need two images — the actual icon image and the image of its shadow. For this example, we took the Leaflet logo and created four images out of it — 3 leaf images of different colors and one shadow image for the three:

    - +

    - +

    The white area in the images is actually transparent, and they are saved in the PNG24 format. Notice there's some excessive area on the left of the shadow image — its cropped in such way that if you align the icon and the shadow images on top of each other, the top left corners are in the same spot.

    - +

    Defining an icon class

    - +

    The default marker icons in Leaflet are defined by the L.Icon class. Its instance (new L.Icon()) is then set by default in the L.Marker options. So how do we define our own icon class? Inherit from L.Icon! It's really easy in Leaflet:

    - +
    var LeafIcon = L.Icon.extend({
     	iconUrl: '../docs/images/leaf-green.png',
     	shadowUrl: '../docs/images/leaf-shadow.png',
    @@ -108,23 +110,23 @@ 

    Defining an icon class

    });

    Now we've defined a green leaf icon class. The iconSize and shadowSize properties are the sizes of the corresponding images in pixels, the iconAnchor property is the coordinates of the "tip" of our icon, and the popupAnchor property points to a point from which a marker popup would open relative to the iconAnchor point.

    - +

    Using icons in markers

    To use our newly created icon class in a marker, we need to create an instance of that class and pass it to the marker constructor in the options:

    - +
    var greenIcon = new LeafIcon(),
     	marker = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon});
    - +

    Awesome, it works! But what about the orange and the red ones? You could repeat the whole process above for each of them, but there's a much easier way. Notice that these icons would have the same properties except for one — the iconUrl. Because it's a frequent case, the L.Icon constructor has an optional argument — an iconUrl to replace the defined one. Let's see:

    - +
    var greenIcon = new LeafIcon(),
     	redIcon = new LeafIcon('../docs/images/leaf-red.png'),
     	orangeIcon = new LeafIcon('../docs/images/leaf-orange.png');
     
    - +

    Now we can use all the three icons:

    - +
    var marker1 = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon}),
     	marker2 = new L.Marker(new L.LatLng(51.495, -0.083), {icon: redIcon}),
     	marker3 = new L.Marker(new L.LatLng(51.49, -0.1), {icon: orangeIcon});
    @@ -134,20 +136,20 @@ 

    Using icons in markers

    marker3.bindPopup("I am an orange leaf."); map.addLayer(marker1).addLayer(marker2).addLayer(marker3);
    - +

    That's all. Now take a look at the full example, the L.Icon docs, or browse other examples.

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 26e0a2f6322..81f8c3a73e4 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -2,10 +2,12 @@ Leaflet GeoJSON example - + + + - + @@ -15,13 +17,13 @@ - \ No newline at end of file + diff --git a/examples/geojson.html b/examples/geojson.html index 9be65cf6b34..b8848ec450c 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -2,11 +2,13 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Leaflet on Mobile Example - + + + - + - + @@ -28,35 +30,35 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - +

    ← Back to the list of examples

    Using GeoJSON with Leaflet

    - +

    GeoJSON is becoming a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

    - +
    - + - +

    View example on a separate page →

    - +

    About GeoJSON

    According to http://geojson.org:

    - +
    GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
    - +

    Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

    - +

    The GeoJSON layer

    - +

    GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

    - +
    var geojsonLayer = new L.GeoJSON();
     
     map.addLayer(geojsonLayer);

    This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

    - +
    var geojsonFeature = {
         "type": "Feature",
         "properties": {
    @@ -151,17 +153,17 @@ 

    The GeoJSON layer

    }; geojsonLayer.addGeoJSON(geojsonFeature);
    - +

    We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

    - +
    var geojsonLayer = new L.GeoJSON(geojsonFeature);
     
     map.addLayer(geojsonLayer);

    Popups

    - +

    We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

    - +
    geojsonLayer.on("featureparse", function (e) {
         if (e.properties && e.properties.popupContent){
             e.layer.bindPopup(e.properties.popupContent);
    @@ -173,7 +175,7 @@ 

    Popups

    Styling Features

    We can also listen to the featureparse event to style our Polyline and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

    - +
    var freeBus = {
         "type": "Feature",
         "geometry": {
    @@ -198,7 +200,7 @@ 

    Styling Features

    };

    To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

    - +
    geojsonLayer.on("featureparse", function (e){
     	if (e.properties && e.properties.style && e.layer.setStyle){
     	    // The setStyle method isn't available for Points. More on that below ...
    @@ -207,11 +209,11 @@ 

    Styling Features

    });

    Styling Points

    - +

    Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

    - +

    Here we're using a CircleMarker:

    - +
    var geojsonMarkerOptions = {
     	radius: 8,
     	fillColor: "#ff7800",
    @@ -228,7 +230,7 @@ 

    Styling Points

    });

    And here's an example of using a custom Marker:

    - +
    var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
         pointToLayer: function (latlng) {
             return new L.Marker(latlng, {
    @@ -238,18 +240,18 @@ 

    Styling Points

    });

    View the example page to see in detail what is possible with the GeoJSON layer.

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/examples/layers-control-example.html b/examples/layers-control-example.html index 59846036411..9c96e62d561 100644 --- a/examples/layers-control-example.html +++ b/examples/layers-control-example.html @@ -3,7 +3,9 @@ Leaflet Layers Control Example - + + + @@ -49,4 +51,4 @@ map.addControl(layersControl); - \ No newline at end of file + diff --git a/examples/layers-control.html b/examples/layers-control.html index 285bdf59d9c..082edee1b26 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -2,11 +2,13 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Layers Control Example - + - + - + + + @@ -28,23 +30,23 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - +

    ← Back to the list of examples

    Layer Groups and Layers Control

    - +

    This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

    Note: this only works in the latest (master) version of Leaflet.

    - +
    - +

    View example on a separate page →

    Layer Groups

    @@ -129,37 +131,37 @@

    Layers Control

    });

    Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are just simple objects with key/value pairs. The key is what sets the text for the layer in the control (e.g. "Night View"). The corresponding value is a reference to the layer (e.g. midnightCommander).

    - +
    var baseMaps = {
     	"Minimal": minimal,
     	"Night View": midnightCommander
     };
    -		
    +
     var overlayMaps = {
         "Motorways": motorways,
         "Cities": citiesLayer
     };
    - +

    Now, all that's left to do is to create a Layers Control and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional — for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing null as the first argument.

    - +
    var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
    -		
    +
     map.addControl(layersControl);

    Now lets view the result on a separate page →


    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/examples/mobile-example.html b/examples/mobile-example.html index 3bd91670c4b..345f0b7fb6c 100644 --- a/examples/mobile-example.html +++ b/examples/mobile-example.html @@ -2,12 +2,12 @@ Leaflet mobile example - - - + + + - + +
    - \ No newline at end of file + diff --git a/examples/mobile.html b/examples/mobile.html index 4fc6065b1b7..f2cf2cf6559 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -2,11 +2,11 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Leaflet on Mobile Example - + - + - + @@ -28,28 +28,28 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - +

    ← Back to the list of examples

    Leaflet on Mobile

    - +

    In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

    - +

    View example →

    - +

    Preparing the page

    - +

    First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

    - +
    body {
     	padding: 0;
     	margin: 0;
    @@ -58,66 +58,66 @@ 

    Preparing the page

    height: 100%; }
    -

    Also, we need to tell the mobile browser to disable scaling of the page and set it to its actual size by placing the following line in the head section:

    - -
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    - +

    Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the head section:

    + +
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    +

    Initializing the map

    - +

    We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

    - +
    var map = new L.Map('map');
    -	
    +
     var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
     	cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
     	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
     
     map.addLayer(cloudmade);
    - +

    Geolocation

    - +

    Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

    - +
    map.locateAndSetView(16);
    - +

    Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

    - +
    map.on('locationfound', onLocationFound);
    -		
    +
     function onLocationFound(e) {
     	var radius = e.accuracy / 2;
     
     	var marker = new L.Marker(e.latlng);
     	map.addLayer(marker);
     	marker.bindPopup("You are within " + radius + " meters from this point").openPopup();
    -	
    +
     	var circle = new L.Circle(e.latlng, radius);
    -	map.addLayer(circle);	
    +	map.addLayer(circle);
     }

    Excellent! But it would also be nice to show an error message if the geolocation failed:

    - +
    map.on('locationerror', onLocationError);
    -		
    +
     function onLocationError(e) {
     	alert(e.message);
     }

    Now the example is complete — try it on your mobile phone: View the full example →

    - +

    Next steps would be to take a look at the detailed documentation and browse other examples.

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/examples/quick-start-example.html b/examples/quick-start-example.html index 65b2501fe1b..85ccdd70d7b 100644 --- a/examples/quick-start-example.html +++ b/examples/quick-start-example.html @@ -3,7 +3,9 @@ Leaflet Quick Start Guide Example - + + + @@ -13,50 +15,50 @@ - \ No newline at end of file + diff --git a/examples/quick-start.html b/examples/quick-start.html index cb4f16cd068..d56eafcc62b 100644 --- a/examples/quick-start.html +++ b/examples/quick-start.html @@ -2,11 +2,13 @@ Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Quick Start Guide - + - + - + + + @@ -28,101 +30,101 @@

    Leaflet

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    - + - +

    ← Back to the list of examples

    Leaflet Quick Start Guide

    - +

    This step-by-step guide will quickly get you started on Leaflet basics, including setting up a Leaflet map, working with markers, polylines and popups, and dealing with events.

    - +
    - +

    View example on a separate page →

    - +

    Preparing your page

    - +

    Before writing any code for the map, you need to do the following preparation steps on your page:

    - +
    1. Include Leaflet CSS files in the head section of your document:
      <link rel="stylesheet" href="leaflet/leaflet.css" />
       <!--[if lte IE 8]><link rel="stylesheet" href="leaflet/leaflet.ie.css" /><![endif]-->
    2. - +
    3. Include Leaflet JavaScript file somewhere on the page (preferably before body close tag):
      <script src="leaflet/leaflet.js"></script>
    4. - +
    5. Put a div element with a certain id where you want your map to be and make sure it has defined width and height:
      <div id="map" style="height: 200px"></div> <!-- width equals available horizontal space by default -->
    - +

    Now you're ready to initialize the map and do some stuff with it.

    - - + +

    Setting up the map

    - +
    - +

    Let's create a map instance, set its view to the center of London and add a pretty CloudMade tile layer to it. First we'll initialize the map:

    - +
    var map = new L.Map('map');

    By default (as we didn't pass any options when creating the map instance), all mouse and touch interactions on the map are enabled, and it has zoom and attribution controls.

    @@ -141,40 +143,40 @@

    Setting up the map

    Make sure this code is below both the map div and leaflet.js inclusion, or in a window.load or document.ready event handler.

    Markers, circles and polygons

    - +

    Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker:

    - +
    var markerLocation = new L.LatLng(51.5, -0.09);
     
     var marker = new L.Marker(markerLocation);
     map.addLayer(marker);

    Adding a circle is the same (except for specifying the radius in meters), but lets configure it by passing options as a third argument when creating the object (the second argument is the radius in pixels):

    - +
    var circleLocation = new L.LatLng(51.508, -0.11),
     	circleOptions = {
    -		color: 'red', 
    -		fillColor: '#f03', 
    +		color: 'red',
    +		fillColor: '#f03',
     		fillOpacity: 0.5
     	};
    -	
    +
     var circle = new L.Circle(circleLocation, 500, circleOptions);
     map.addLayer(circle);
    @@ -189,94 +191,94 @@

    Markers, circles and polygons

    Working with popups

    - +
    - +

    Popups are usually used when you want to attach some information to a particular object on a map. Leaflet has a very handy shortcut for this:

    - +
    marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
     circle.bindPopup("I am a circle.");
     polygon.bindPopup("I am a polygon.");
    - +

    Try clicking on our objects. The bindPopup method attaches a popup with the specified HTML content to your marker so the popup appears when you click on the object, and the openPopup method (for markers only) immediately opens the attached popup.

    - +

    You can also use popups as layers (when you need something more than attching a popup to an object):

    - +
    var popup = new L.Popup();
     
     popup.setLatLng(new L.LatLng(51.5, -0.09));
     popup.setContent("I am a standalone popup.");
    -		
    +
     map.openPopup(popup);
    - +

    Here we use openPopup instead of addLayer because it handles automatic closing of a previously opened popup when opening a new one which is good for usability.

    - - + +

    Dealing with events

    - +

    Every time something happens in Leaflet, e.g. user clicks on a marker or map zoom changes, the corresponding object sends an event which you can subscribe to with a function. It allows you to react to user interaction:

    map.on('click', onMapClick);
    -		
    +
     function onMapClick(e) {
     	alert("You clicked the map at " + e.latlng);
     }
    - +

    Each object has its own set of events — see documentation for details. The first argument of the listener function is an event object — it contains useful information about the event that happened. For example, map click event object (e in the example above) has latlng property which is a location at which the click occured.

    - +

    Lets improve our example by using a popup instead of an alert and formatting the location string:

    - +
    map.on('click', onMapClick);
    -		
    +
     var popup = new L.Popup();
    -		
    +
     function onMapClick(e) {
     	var latlngStr = '(' + e.latlng.lat.toFixed(3) + ', ' + e.latlng.lng.toFixed(3) + ')';
    -			
    +
     	popup.setLatLng(e.latlng);
     	popup.setContent("You clicked the map at " + latlngStr);
    -	
    +
     	map.openPopup(popup);
     }

    Try clicking on the map and you will see the coordinates in a popup. View the full example →

    Now you've learned Leaflet basics and can start building map apps straight away! Don't forget to take a look at the detailed documentation or other examples.

    - +
    - +

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    - + Fork me on GitHub - + + - \ No newline at end of file + diff --git a/features.html b/features.html index 765822ab2d7..0925503230f 100644 --- a/features.html +++ b/features.html @@ -7,6 +7,8 @@ + + diff --git a/index.html b/index.html index ef6413f2116..2942334bd7e 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,8 @@ + + @@ -55,8 +57,8 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    -

    Leaflet is a modern, lightweight open-source JavaScript library for making tile-based interactive maps for both desktop and mobile web browsers, developed by CloudMade to form the core of its next generation JavaScript API. Weighting just about 21kb of gzipped JS code, it still has all the features you will ever need for you web mapping needs while providing a fast, smooth, pleasant user experience.

    -

    It is built from the ground up to work efficiently and smoothly on both desktop and mobile platforms like iOS and Android, utilizing cutting-edge technologies included in HTML5 and CSS3, focusing on usability, performance, small size, A-grade browser support, flexibility and easy to use API. The OOP-based code of the library is designed to be modular, extensible and very easy to understand.

    +

    Leaflet is a modern, lightweight open-source JavaScript library for interactive maps for desktop and mobile web browsers, developed by CloudMade to form the core of its next generation JavaScript API. Weighting just about 21kb of gzipped JS code, it still has all the features you will ever need for you web mapping needs while providing a fast, smooth, pleasant user experience.

    +

    It is built from the ground up to work efficiently and smoothly on both desktop and mobile platforms like iOS and Android, utilizing cutting-edge technologies included in HTML5 and CSS3, focusing on usability, performance, small size, A-grade browser support, flexibility and easy to use API. The OOP-based code of the library is designed to be modular, extensible and very easy to understand.

    Basic usage example

    diff --git a/reference.html b/reference.html index fcbfc238ba9..d9f90bb882a 100644 --- a/reference.html +++ b/reference.html @@ -6,6 +6,8 @@ + + From 9ba1fcc2ca00cb4f69b86f65e26822da86adf652 Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 14 Feb 2012 17:27:47 +0200 Subject: [PATCH 0087/2207] update download link to 0.3.1 --- download.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.html b/download.html index 39229bb42bb..02846b947a6 100644 --- a/download.html +++ b/download.html @@ -57,7 +57,7 @@

    Download Leaflet

    Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system.

    - Download Leaflet 0.3 (zip, stable)
    + Download Leaflet 0.3.1 (zip, stable, 14.02.2012)
    Download Leaflet master (zip, development version)

    From 66aa85a970c6ff0d1f2cfaf5ec7d4165047a1dda Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 14 Feb 2012 11:05:42 -0700 Subject: [PATCH 0088/2207] Happy New Year\! --- download.html | 2 +- examples.html | 2 +- features.html | 2 +- index.html | 2 +- reference.html | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/download.html b/download.html index 02846b947a6..9b1432a08ac 100644 --- a/download.html +++ b/download.html @@ -79,7 +79,7 @@

    Building a custom version of Leaflet


    -

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +

    © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

    Fork me on GitHub diff --git a/examples.html b/examples.html index 7268fa45946..8319d88b416 100644 --- a/examples.html +++ b/examples.html @@ -100,7 +100,7 @@

    OOP in Leaflet


    -

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +

    © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

    Fork me on GitHub diff --git a/features.html b/features.html index 0925503230f..b72fe816c29 100644 --- a/features.html +++ b/features.html @@ -154,7 +154,7 @@

    On mobile


    -

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +

    © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

    Fork me on GitHub diff --git a/index.html b/index.html index 2942334bd7e..8b0a84562f6 100644 --- a/index.html +++ b/index.html @@ -103,7 +103,7 @@

    Contributing to Leaflet

    You can also help the project a lot by reporting bugs and discussing features on the issues page, tweeting to @LeafletJS or joining the Leaflet mailing list.


    -

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +

    © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

    Fork me on GitHub diff --git a/reference.html b/reference.html index d9f90bb882a..e883b7698d9 100644 --- a/reference.html +++ b/reference.html @@ -1146,7 +1146,7 @@

    Usage example

    layers: 'nexrad-n0r-900913', format: 'image/png', transparent: true, - attribution: "Weather data © 2011 IEM Nexrad" + attribution: "Weather data © 2012 IEM Nexrad" });

    Constructor

    @@ -2668,7 +2668,7 @@

    IHandler


    -

    © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

    +

    © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

    Fork me on GitHub From e2200764a4977ea18017a4b14be082e17d947fd0 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Tue, 14 Feb 2012 11:09:26 -0700 Subject: [PATCH 0089/2207] Adding LatLngBounds equals method documentation. --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index e883b7698d9..54ed7a4b017 100644 --- a/reference.html +++ b/reference.html @@ -2034,6 +2034,11 @@

    Methods

    intersects( <LatLngBoundsotherBounds ) Boolean Returns true if the rectangle intersects the given bounds. + + + equals( <LatLngBoundsotherBounds ) + Boolean + Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. From a7968ba2366e4be4bc9641b16e76be7cbae6ec20 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 16 Feb 2012 22:38:41 -0700 Subject: [PATCH 0090/2207] Documenting LatLngBounds.toBBoxString method. Closes #414. --- reference.html | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/reference.html b/reference.html index 54ed7a4b017..f4c1f1ce4cf 100644 --- a/reference.html +++ b/reference.html @@ -2034,11 +2034,16 @@

    Methods

    intersects( <LatLngBoundsotherBounds ) Boolean Returns true if the rectangle intersects the given bounds. - - - equals( <LatLngBoundsotherBounds ) - Boolean - Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. + + + equals( <LatLngBoundsotherBounds ) + Boolean + Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. + + + toBBoxString() + String + Returns a string with bounding box coordinates in a "southwest_lng,southwest_lat,northeast_lng,northeast_lat" format. Useful for sending requests to web services that return geo data. From 4a3444c810e9671f8b6900060b9d5180293db939 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 16 Feb 2012 22:51:54 -0700 Subject: [PATCH 0091/2207] Documenting setRadius method for Circle and CircleMarker. Addresses #349. --- reference.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index f4c1f1ce4cf..7d179bc9a29 100644 --- a/reference.html +++ b/reference.html @@ -1600,13 +1600,18 @@

    Methods

    this Sets the position of a circle to a new location. + + setRadius( <Number> radius ) + this + Sets the radius of a circle. Units are in meters. +

    L.CircleMarker

    -

    A circle of a fixed size with radius specified in pixels. Extends Circe. Use Map#addLayer to add it to the map.

    +

    A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

    Constructor

    @@ -1634,6 +1639,11 @@

    Methods

    this Sets the position of a circle marker to a new location. + + setRadius( <Number> radius ) + this + Sets the radius of a circle marker. Units are in meters. + From b89daef135a3bf4b1f361e9f54e13ce76c8be872 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Fri, 17 Feb 2012 07:06:32 -0700 Subject: [PATCH 0092/2207] Pixels for unit of radius in CircleMarker. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 7d179bc9a29..815ab94a236 100644 --- a/reference.html +++ b/reference.html @@ -1642,7 +1642,7 @@

    Methods

    setRadius( <Number> radius ) this - Sets the radius of a circle marker. Units are in meters. + Sets the radius of a circle marker. Units are in pixels. From a9f5a4a1ac206ee843523edb5c9d1650eb8fe572 Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 21 Feb 2012 17:14:40 +0200 Subject: [PATCH 0093/2207] Add UserVoice widget to all pages --- download.html | 9 +++++++++ examples.html | 9 +++++++++ examples/custom-icons.html | 9 +++++++++ examples/geojson.html | 9 +++++++++ examples/layers-control.html | 9 +++++++++ examples/mobile.html | 9 +++++++++ examples/quick-start.html | 9 +++++++++ features.html | 9 +++++++++ index.html | 9 +++++++++ reference.html | 9 +++++++++ 10 files changed, 90 insertions(+) diff --git a/download.html b/download.html index 9b1432a08ac..0484b10d611 100644 --- a/download.html +++ b/download.html @@ -105,5 +105,14 @@

    Building a custom version of Leaflet

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/examples.html b/examples.html index 8319d88b416..c1e47d2471c 100644 --- a/examples.html +++ b/examples.html @@ -126,5 +126,14 @@

    OOP in Leaflet

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/examples/custom-icons.html b/examples/custom-icons.html index 90e7d3e5775..bc2de538c75 100644 --- a/examples/custom-icons.html +++ b/examples/custom-icons.html @@ -167,5 +167,14 @@

    Using icons in markers

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/examples/geojson.html b/examples/geojson.html index b8848ec450c..e2bc16d172d 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -269,5 +269,14 @@

    Styling Points

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/examples/layers-control.html b/examples/layers-control.html index 082edee1b26..6e3fbc1aa89 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -179,5 +179,14 @@

    Layers Control

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/examples/mobile.html b/examples/mobile.html index f2cf2cf6559..02c32bb2379 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -135,5 +135,14 @@

    Geolocation

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/examples/quick-start.html b/examples/quick-start.html index d56eafcc62b..a9b6554d26c 100644 --- a/examples/quick-start.html +++ b/examples/quick-start.html @@ -296,5 +296,14 @@

    Dealing with events

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/features.html b/features.html index b72fe816c29..6994a7b7340 100644 --- a/features.html +++ b/features.html @@ -180,6 +180,15 @@

    On mobile

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/index.html b/index.html index 8b0a84562f6..7de25d66ff9 100644 --- a/index.html +++ b/index.html @@ -129,6 +129,15 @@

    Contributing to Leaflet

    s.parentNode.insertBefore(ga, s); })(); + + diff --git a/reference.html b/reference.html index 815ab94a236..19b834df0f4 100644 --- a/reference.html +++ b/reference.html @@ -2714,5 +2714,14 @@

    IHandler

    s.parentNode.insertBefore(ga, s); })(); + + From caf5ac938c63ee9c0731c2b25be9a27ecca85fae Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 21 Feb 2012 17:27:15 +0200 Subject: [PATCH 0094/2207] Change some links on the main page --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 7de25d66ff9..b584ab44cf2 100644 --- a/index.html +++ b/index.html @@ -100,7 +100,7 @@

    Basic usage example

    Contributing to Leaflet

    The project is hosted on GitHub, waiting for your contributions — just send your pull requests to Vladimir Agafonkin (Leaflet maintainer). Let's make the best library for maps that can possibly exist!

    -

    You can also help the project a lot by reporting bugs and discussing features on the issues page, tweeting to @LeafletJS or joining the Leaflet mailing list. +

    You can also help the project a lot by reporting bugs on the GitHub issues page, showing your support for your favorite feature suggestions on Leaflet UserVoice page, tweeting to @LeafletJS or joining the Leaflet mailing list.


    © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

    From 4e496be4ce86814e9ee0184f52b48ae8c6407431 Mon Sep 17 00:00:00 2001 From: mourner Date: Sat, 25 Feb 2012 12:18:00 +0200 Subject: [PATCH 0095/2207] add CDN links on the download page --- download.html | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/download.html b/download.html index 0484b10d611..1931cb4e91e 100644 --- a/download.html +++ b/download.html @@ -52,28 +52,31 @@

    A Modern, Lightweight Open-Source JavaScript Library for Interac

    + +

    Using a hosted version of Leaflet

    + +

    The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the head section of your HTML:

    +
    <link rel="stylesheet" href="http://code.leafletjs.com/leaflet-0.3.1/leaflet.css" />
    +<!--[if lte IE 8]>
    +	<link rel="stylesheet" href="http://code.leafletjs.com/leaflet-0.3.1/leaflet.ie.css" />
    +<![endif]-->
    +
    +<script src="http://code.leafletjs.com/leaflet-0.3.1/leaflet.js"></script>
    + +

    Download Leaflet

    -

    Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system.

    +

    Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system. The production files (included the same way as in the code above) are in the dist folder.

    - Download Leaflet 0.3.1 (zip, stable, 14.02.2012)
    - Download Leaflet master (zip, development version) + Download Leaflet 0.3.1 stable (February 14, 2012)
    + Download Leaflet 0.4 master (in-progress version)

    View Changelog

    -

    Including Leaflet on your page

    -

    Place the contents of the dist folder somewhere in your directory tree and include it in the head section of your HTML with the following code:

    -
    <!-- Leaflet CSS -->
    -<link rel="stylesheet" href="<path_to_dist>/leaflet.css" />
    -<!--[if lte IE 8]><link rel="stylesheet" href="<path_to_dist>/leaflet.ie.css" /><![endif]-->
    -
    -<!-- Leaflet JavaScript -->
    -<script src="<path_to_dist>/leaflet.js"></script>
    -

    Building a custom version of Leaflet

    Open build/build.html page from the download package, check the components you want to see in your build and then follow the instructions there.

    From f0e2e02ebaad2f92f42eed6f8a6d739333fa3ce7 Mon Sep 17 00:00:00 2001 From: mourner Date: Sat, 25 Feb 2012 12:46:14 +0200 Subject: [PATCH 0096/2207] update features page --- docs/css/screen.css | 4 ++++ features.html | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 6006b2ea4a4..45ea124ea84 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -251,3 +251,7 @@ h3 span { font-size: 12px; color: #777; } + +.last ul { + margin-right: 0; +} \ No newline at end of file diff --git a/features.html b/features.html index 6994a7b7340..28d82c09eed 100644 --- a/features.html +++ b/features.html @@ -61,14 +61,12 @@

    Leaflet features

    Available map layers

    • Tile layers
    • -
    • Polylines, polygons, circles
    • +
    • Vector layers: polylines, polygons, circles, circle markers
    • Markers
    • Popups
    • Image overlays
    • WMS layers
    • GeoJSON
    • -
    • KML
    • -
    • GeoRSS

    Interaction features

    @@ -84,7 +82,11 @@

    On mobile browsers (iOS, Android)

  • Touch-drag panning
  • Multi-touch zoom (iOS only)
  • Double tap zoom
  • + +

    Other features

    +
    • Panning inertia
    • +
    • Vector layers editing
    @@ -95,7 +97,7 @@

    Visual features

  • Zooming animation on modern browsers (except IE)
  • Smooth continuous zoom on iOS
  • Tile and popup fade animation
  • -
  • Very nice default design for markers and popups
  • +
  • Very nice default design for markers, popups and other map controls
  • Customization features

    @@ -109,10 +111,10 @@

    Customization features

    Performance features

      -
    • Hardware acceleration on iOS makes it feel as smooth as native apps
    • +
    • Hardware acceleration on iOS (and other modern browsers) makes it feel as smooth as native apps
    • Clever tricks to make panning and zooming really smooth
    • Smart polyline/polygon rendering makes it responsive even when displaying objects with thousands of points
    • -
    • Modular build system allows you to reduce the size of the library by leaving out the code you don't need
    • +
    • Modular design and a build system allow you to reduce the size of the library by leaving out the code you don't need
    @@ -121,9 +123,8 @@

    Map controls

    • Zoom buttons
    • Attribution
    • -
    • Zoom slider
    • Layer switcher
    • - +
    • Scale

    Browser support

    @@ -140,15 +141,14 @@

    On mobile

    • Safari for iOS 3/4/5+
    • WebKit for Android 2.2+, 3.1+, 4+
    • -
    • webOS browser
    • -
    • Blackberry 6+
    • +
    • Other webkit-based browsers (webOS, Blackberry 6+, etc.)
    • Windows Phone 7
    • Firefox for Android
    -

    If you find some feature really missing in Leaflet, please submit it to the issue tracker.

    +

    If you find some feature really missing in Leaflet, please vote for it on the Leaflet UserVoice page.

    * Grayed out features are in the roadmap and coming soon.

    From d76a0d7a5fe211c5c5fff9c911e74891701b7b19 Mon Sep 17 00:00:00 2001 From: mourner Date: Sat, 25 Feb 2012 13:03:29 +0200 Subject: [PATCH 0097/2207] update quick start example --- examples/quick-start.html | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/examples/quick-start.html b/examples/quick-start.html index a9b6554d26c..8590eb8da4e 100644 --- a/examples/quick-start.html +++ b/examples/quick-start.html @@ -49,7 +49,7 @@

    Leaflet Quick Start Guide

    -

    Here we create a map with tiles of our choice, add a marker and bind a popup with some text to it:

    +

    Here we create a map with tiles of our choice, add a marker and bind a popup with some text to it:

    // initialize the map on the "map" div
     var map = new L.Map('map');
     
    -// create a CloudMade tile layer (or use other provider of your choice)
    -var cloudmade = new L.TileLayer('http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png', {
    +// create a CloudMade tile layer with style #997 (or use other provider of your choice)
    +var cloudmade = new L.TileLayer('http://{s}.tile.cloudmade.com/[your-API-key]/997/256/{z}/{x}/{y}.png', {
     	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
     	maxZoom: 18
     });
    diff --git a/reference.html b/reference.html
    index 340378cb9b5..c82dcad8e1a 100644
    --- a/reference.html
    +++ b/reference.html
    @@ -1,7 +1,7 @@
     
     
     
    -	Leaflet - a modern, lightweight JavaScript library for interactive maps by CloudMade - Documentation
    +	Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Documentation
     
     	
     
    @@ -27,12 +27,12 @@
     
     	

    Leaflet

    -

    A Modern, Lightweight Open-Source JavaScript Library for Interactive Maps by CloudMade

    +

    An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

    ← Back to the list of examples

    diff --git a/examples/mobile.html b/examples/mobile.html index bb71e3c6f82..13fc3231b73 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -35,8 +35,8 @@

    An Open-Source JavaScript Library for Mobile-Friendly Interactiv
  • Tutorials
  • Documentation
  • Download
  • -
  • -
  • GitHub Repo
  • +
  • +
  • GitHub
  • ← Back to the list of examples

    diff --git a/examples/quick-start.html b/examples/quick-start.html index 4d60233a429..eda71280298 100644 --- a/examples/quick-start.html +++ b/examples/quick-start.html @@ -37,8 +37,8 @@

    An Open-Source JavaScript Library for Mobile-Friendly Interactiv
  • Tutorials
  • Documentation
  • Download
  • -
  • -
  • GitHub Repo
  • +
  • +
  • GitHub
  • ← Back to the list of examples

    diff --git a/features.html b/features.html index 68fb654d591..6798a48c255 100644 --- a/features.html +++ b/features.html @@ -37,20 +37,33 @@

    An Open-Source JavaScript Library for Mobile-Friendly Interactiv
  • Tutorials
  • Documentation
  • Download
  • -
  • -
  • GitHub Repo
  • +
  • +
  • GitHub
  • -

    - - +

    Leaflet features

    diff --git a/index.html b/index.html index 20cc2620d5a..2e15674c66e 100644 --- a/index.html +++ b/index.html @@ -4,9 +4,13 @@ Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade + + + + @@ -39,26 +43,38 @@

    An Open-Source JavaScript Library for Mobile-Friendly Interactiv
  • Tutorials
  • Documentation
  • Download
  • -
  • -
  • GitHub Repo
  • +
  • +
  • GitHub
  • -

    - - +

    -

    Leaflet is a modern, lightweight open-source JavaScript library for mobile-friendly interactive maps. It is developed by Vladimir Agafonkin of CloudMade with a team of dedicated contributors. Weighing just about 25 KB of gzipped JS code, it still has all the features most developers ever need for online maps, while providing a fast, pleasant user experience.

    -

    It is built from the ground up to work efficiently and smoothly on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, A-grade browser support and an easy-to-use API with convention over configuration. The OOP-based code of the library is designed to be modular, extensible and very easy to understand.

    +

    Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by Vladimir Agafonkin of CloudMade with a team of dedicated contributors. Weighing just about 25 KB of gzipped JS code, it still has all the features most developers ever need for online maps, while providing a smooth, pleasant user experience.

    +

    It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, A-grade browser support and a simple API with convention over configuration. The OOP-based code of the library is designed to be modular, extensible and very easy to understand.

    Basic usage example

    @@ -77,20 +93,20 @@

    Basic usage example

    Here we create a map with tiles of our choice, add a marker and bind a popup with some text to it:

    -
    // initialize the map on the "map" div, set the view to a given place and zoom
    -var map = L.map('map')
    -	.setView([51.505, -0.09], 13);
     
    -// add a CloudMade tile layer with style #997 (or use other provider of your choice)
    +		
    +		
    +		
    // create a map in the "map" div, set the view to a given place and zoom
    +var map = L.map('map').setView([51.505, -0.09], 13);
    +
    +// add a CloudMade tile layer with style #997
     L.tileLayer('http://{s}.tile.cloudmade.com/[API-key]/997/256/{z}/{x}/{y}.png', {
    -	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
    +	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
     }).addTo(map);
     
     // add a marker in the given location, attach some popup content to it and open the popup
    -L.marker([51.5, -0.09])
    -	.addTo(map)
    -	.bindPopup("A pretty CSS3 popup.<br />Easily customizable.")
    -	.openPopup();
    +L.marker([51.5, -0.09]).addTo(map) + .bindPopup('A pretty CSS3 popup. <br> Easily customizable.').openPopup();

    DOM utility

    @@ -3174,8 +3174,169 @@

    L.Browser

    +

    L.Util

    +

    Utility functions.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    extend(<Object> src)ObjectMerge src properties into dest
    bind(<Function> fn, <Object> obj)FunctionReturn a function which calls function fn with scope obj.
    stamp(<Object> obj)StringApplies a unique key to the object and returns that key.
    requestAnimFrame()
    cancelAnimFrame()
    limitExecByInterval(<Function> fn, <Number> time, <??> context)
    falseFn()FunctionReturns a function which always returns false.
    formatNum(<Number> num, <Number> digits)NumberReturns the number num rounded to digits decimals.
    splitWords(<String> str)String[]Splits the string on spaces and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectSet the options in options in obj, return the options of obj afterwards.
    getParamString(<Object> obj)StringConvert a map in to a parameter string.
    template(<String> str, <Object> data)StringApplies the values of the data map to a template like "{a}, {b}, {c}".
    emptyImageUrlStringString containing a base64 encoded empty gif image.
    + +

    L.DomUtil

    +

    Utility functions to work with the DOM tree.

    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodReturnsDescription
    get(<String> id)HTMLElementReturns an element reference by its id.
    getStyle(<HTMLElement> el, <String> style)StringReturns the value for a certain style attribute on an element.
    getViewportOffset(<HTMLElement> el)PointReturns the offset to the viewport for the requested element.
    create(<String> tagName, <String> className, <HTMLElement> container)HTMLElementCreates an element with tagName, sets the className and appends it to container.
    disableTextSelection()-
    enableTextSelection()-
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element has name in the class attribute.
    addClass(<HTMLElement> el, <String> name)-Adds name to the elements class attribute.
    removeClass(<HTMLElement> el, <String> name)-Removes name from the elements class attribute.
    setOpacity(<HTMLElement> el, <Number> value)-Set the opacity of element.
    testProp(<String[]> props)mixed
    getTranslateString(<Point> point)StringReturns a CSS translate string to move by the offset provided requested point.
    getScaleString(<Number> scale, <Point> origin)StringReturns a CSS scale string to scale
    setPosition(<HTMLElement> el, <Point> origin, <Boolean> disable3D?)-
    getPosition(<HTMLElement> el)PointReturns the point for an element positioned by setPosition().
    +

    IHandler

    An interface implemented by interaction handlers.

    From 10adb5a7d00ac49578311149f21a29c7f167c41d Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Tue, 10 Jul 2012 23:30:39 +0200 Subject: [PATCH 0137/2207] Fixing (I think most) documentation issues mentioned in #793 + some other small changes. --- reference.html | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/reference.html b/reference.html index dc0b76e57d9..0a839b787b6 100644 --- a/reference.html +++ b/reference.html @@ -3183,9 +3183,9 @@

    L.Util

    Description - extend(<Object> src) + extend(<Object> dest, <Object> src...) Object - Merge src properties into dest + Merge the properties of (multiple) src object properties into dest and returns dest. bind(<Function> fn, <Object> obj) @@ -3197,6 +3197,9 @@

    L.Util

    String Applies a unique key to the object and returns that key. + - limitExecByInterval(<Function> fn, <Number> time, <??> context) - - + limitExecByInterval(<Function> fn, <Number> time, <Object> context) + Function + Returns a wrapper around a function that makes sure it's called not more often than a certain interval, but as fast as possible otherwise. falseFn() Function - Returns a function which always returns false. + Returns a function which always returns false. formatNum(<Number> num, <Number> digits) Number - Returns the number num rounded to digits decimals. + Returns the number num rounded to digits decimals. splitWords(<String> str) @@ -3231,17 +3235,17 @@

    L.Util

    setOptions(<Object> obj, <Object> options) Object - Set the options in options in obj, return the options of obj afterwards. + Set the options in options in obj, return the options of obj afterwards. getParamString(<Object> obj) String - Convert a map in to a parameter string. + Convert a map in to a parameter string, including a question mark symbol. Example: {a: "foo", b: "bar"} translates to ?a=foo&b=bar. template(<String> str, <Object> data) String - Applies the values of the data map to a template like "{a}, {b}, {c}". + Applies the values of the data map to a template like "{a}, {b}, {c}". @@ -3278,42 +3282,42 @@

    L.DomUtil

    create(<String> tagName, <String> className, <HTMLElement> container) HTMLElement - Creates an element with tagName, sets the className and appends it to container. + Creates an element with tagName, sets the className and appends it to container. disableTextSelection() - - + Make sure text cannot be selected, for example during dragging. enableTextSelection() - - + Makes text selection possible again. hasClass(<HTMLElement> el, <String> name) Boolean - Returns true if the element has name in the class attribute. + Returns true if the element has name in the class attribute. addClass(<HTMLElement> el, <String> name) - - Adds name to the elements class attribute. + Adds name to the elements class attribute. removeClass(<HTMLElement> el, <String> name) - - Removes name from the elements class attribute. + Removes name from the elements class attribute. setOpacity(<HTMLElement> el, <Number> value) - - Set the opacity of element. + Set the opacity of an element. testProp(<String[]> props) mixed - + Goes through the array and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. getTranslateString(<Point> point) @@ -3323,17 +3327,17 @@

    L.DomUtil

    getScaleString(<Number> scale, <Point> origin) String - Returns a CSS scale string to scale + Returns a CSS scale string to scale an element. - setPosition(<HTMLElement> el, <Point> origin, <Boolean> disable3D?) + setPosition(<HTMLElement> el, <Point> point, <Boolean> disable3D?) - - + Sets the position of an element to position point. Uses CSS transformations if disable3D is true. getPosition(<HTMLElement> el) Point - Returns the point for an element positioned by setPosition(). + Returns the point for an element positioned by setPosition(). Note that it does not work on elements not previously positioned with setPosition() From fe3ef98c49a7b453e55fc047528919adc0454e58 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Jul 2012 11:53:01 +0300 Subject: [PATCH 0138/2207] minor updates to #793 --- reference.html | 69 ++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/reference.html b/reference.html index 0a839b787b6..b5f5f3d24a1 100644 --- a/reference.html +++ b/reference.html @@ -3255,8 +3255,10 @@

    L.Util

    +

    L.DomUtil

    -

    Utility functions to work with the DOM tree.

    + +

    Utility functions to work with the DOM tree, used by Leaflet internally.

    @@ -3265,29 +3267,29 @@

    L.DomUtil

    - + - + - - - + + + - + - - - + + + - + @@ -3295,51 +3297,52 @@

    L.DomUtil

    - - - + + + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - + - + - + - +
    Description
    get(<String> id)get( <String or HTMLElement> id ) HTMLElementReturns an element reference by its id.Returns an element with the given id if a string was passed, or just returns the element if it was passed directly.
    getStyle(<HTMLElement> el, <String> style)StringReturns the value for a certain style attribute on an element.getStyle( <HTMLElement> el, <String> style )StringReturns the value for a certain style attribute on an element, including computed values or values set through CSS.
    getViewportOffset(<HTMLElement> el)getViewportOffset( <HTMLElement> el ) Point Returns the offset to the viewport for the requested element.
    create(<String> tagName, <String> className, <HTMLElement> container)HTMLElementCreates an element with tagName, sets the className and appends it to container.create( <String> tagName, <String> className, <HTMLElement> container? )HTMLElementCreates an element with tagName, sets the className, and optionally appends it to container element.
    disableTextSelection() -Make sure text cannot be selected, for example during dragging.Makes sure text cannot be selected, for example during dragging.
    enableTextSelection() Makes text selection possible again.
    hasClass(<HTMLElement> el, <String> name)BooleanReturns true if the element has name in the class attribute.hasClass( <HTMLElement> el, <String> name )BooleanReturns true if the element class attribute contains name.
    addClass(<HTMLElement> el, <String> name)addClass( <HTMLElement> el, <String> name ) -Adds name to the elements class attribute.Adds name to the element's class attribute.
    removeClass(<HTMLElement> el, <String> name)removeClass( <HTMLElement> el, <String> name ) -Removes name from the elements class attribute.Removes name from the element's class attribute.
    setOpacity(<HTMLElement> el, <Number> value)setOpacity( <HTMLElement> el, <Number> value ) -Set the opacity of an element.Set the opacity of an element (including old IE support). Value must be from 0 to 1.
    testProp(<String[]> props)mixedGoes through the array and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform.testProp( <String[]> props )String or falseGoes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform.
    getTranslateString(<Point> point)StringReturns a CSS translate string to move by the offset provided requested point.getTranslateString( <Point> point )StringReturns a CSS transform string to move an element by the offset provided in the given point.
    getScaleString(<Number> scale, <Point> origin)StringReturns a CSS scale string to scale an element.getScaleString( <Number> scale, <Point> origin )StringReturns a CSS transform string to scale an element (with the given scale origin).
    setPosition(<HTMLElement> el, <Point> point, <Boolean> disable3D?)setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? ) -Sets the position of an element to position point. Uses CSS transformations if disable3D is true.Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true.
    getPosition(<HTMLElement> el)getPosition( <HTMLElement> el ) PointReturns the point for an element positioned by setPosition(). Note that it does not work on elements not previously positioned with setPosition()Returns the coordinates of an element previously positioned with setPosition.
    +

    IHandler

    An interface implemented by interaction handlers.

    From 97f5bcc9d0c4b434fdcced074d42c3e9c355c3bc Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Jul 2012 14:33:56 +0300 Subject: [PATCH 0139/2207] update highlight.js to latest version --- docs/css/screen.css | 19 ++++ docs/highlight/LICENSE | 24 ++++ docs/highlight/highlight.pack.js | 2 +- docs/highlight/styles/ascetic.css | 44 ------- docs/highlight/styles/brown_paper.css | 103 ----------------- docs/highlight/styles/brown_papersq.png | Bin 18198 -> 0 bytes docs/highlight/styles/dark.css | 100 ---------------- docs/highlight/styles/default.css | 52 ++++++--- docs/highlight/styles/far.css | 114 ------------------- docs/highlight/styles/github.css | 20 +++- docs/highlight/styles/idea.css | 117 ------------------- docs/highlight/styles/ir_black.css | 102 ----------------- docs/highlight/styles/magula.css | 117 ------------------- docs/highlight/styles/school_book.css | 109 ------------------ docs/highlight/styles/school_book.png | Bin 486 -> 0 bytes docs/highlight/styles/sunburst.css | 145 ------------------------ docs/highlight/styles/vs.css | 79 ------------- docs/highlight/styles/zenburn.css | 112 ------------------ 18 files changed, 93 insertions(+), 1166 deletions(-) create mode 100644 docs/highlight/LICENSE delete mode 100644 docs/highlight/styles/ascetic.css delete mode 100644 docs/highlight/styles/brown_paper.css delete mode 100644 docs/highlight/styles/brown_papersq.png delete mode 100644 docs/highlight/styles/dark.css delete mode 100644 docs/highlight/styles/far.css delete mode 100644 docs/highlight/styles/idea.css delete mode 100644 docs/highlight/styles/ir_black.css delete mode 100644 docs/highlight/styles/magula.css delete mode 100644 docs/highlight/styles/school_book.css delete mode 100644 docs/highlight/styles/school_book.png delete mode 100644 docs/highlight/styles/sunburst.css delete mode 100644 docs/highlight/styles/vs.css delete mode 100644 docs/highlight/styles/zenburn.css diff --git a/docs/css/screen.css b/docs/css/screen.css index bb265084f06..72c001303a9 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -274,4 +274,23 @@ h3 a { .twitter-follow-button { margin-left: -9px; +} + +table td { + color: #666; +} +table td:first-child { + color: #777; +} +table td:last-child { + color: black; +} + +table td code i { + color: black; +} + +table td code b { + color: black; + font-weight: normal; } \ No newline at end of file diff --git a/docs/highlight/LICENSE b/docs/highlight/LICENSE new file mode 100644 index 00000000000..422deb7350f --- /dev/null +++ b/docs/highlight/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2006, Ivan Sagalaev +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of highlight.js nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/highlight/highlight.pack.js b/docs/highlight/highlight.pack.js index 076cfecc736..d1532b30d48 100644 --- a/docs/highlight/highlight.pack.js +++ b/docs/highlight/highlight.pack.js @@ -1 +1 @@ -var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
    ")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
    "+w.value+"
    ";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/.*?[^\\\\/]/[gim]*"}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@font-face",l:"[a-z-]+",k:{"font-face":1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"",rE:true,sL:"css"}},{cN:"tag",b:"",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},a]}]}}}(); \ No newline at end of file +var hljs=new function(){function m(p){return p.replace(/&/gm,"&").replace(/"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("")}while(p!=v.node);s.splice(r,1);while(r'+N[0]+""}else{r+=N[0]}P=Q.lR.lastIndex;N=Q.lR.exec(M)}return r+M.substr(P)}function B(M,N){var r;if(N.sL==""){r=g(M)}else{r=d(N.sL,M)}if(N.r>0){y+=r.keyword_count;C+=r.r}return''+r.value+""}function K(r,M){if(M.sL&&e[M.sL]||M.sL==""){return B(r,M)}else{return G(r,M)}}function J(N,r){var M=N.cN?'':"";if(N.rB){z+=M;N.buffer=""}else{if(N.eB){z+=m(r)+M;N.buffer=""}else{z+=M;N.buffer=r}}p.push(N);C+=N.r}function H(O,N,R){var S=p[p.length-1];if(R){z+=K(S.buffer+O,S);return false}var Q=s(N,S);if(Q){z+=K(S.buffer+O,S);J(Q,N);return Q.rB}var M=w(p.length-1,N);if(M){var P=S.cN?"":"";if(S.rE){z+=K(S.buffer+O,S)+P}else{if(S.eE){z+=K(S.buffer+O,S)+P+m(N)}else{z+=K(S.buffer+O+N,S)+P}}while(M>1){P=p[p.length-2].cN?"":"";z+=P;M--;p.length--}var r=p[p.length-1];p.length--;p[p.length-1].buffer="";if(r.starts){J(r.starts,"")}return S.rE}if(x(N,S)){throw"Illegal"}}var F=e[D];var p=[F.dM];var C=0;var y=0;var z="";try{var t,v=0;F.dM.buffer="";do{t=q(E,v);var u=H(t[0],t[1],t[2]);v+=t[0].length;if(!u){v+=t[1].length}}while(!t[2]);return{r:C,keyword_count:y,value:z,language:D}}catch(I){if(I=="Illegal"){return{r:0,keyword_count:0,value:m(E)}}else{throw I}}}function g(t){var p={keyword_count:0,r:0,value:m(t)};var r=p;for(var q in e){if(!e.hasOwnProperty(q)){continue}var s=d(q,t);s.language=q;if(s.keyword_count+s.r>r.keyword_count+r.r){r=s}if(s.keyword_count+s.r>p.keyword_count+p.r){r=p;p=s}}if(r.language){p.second_best=r}return p}function i(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"
    ")}return r}function n(t,w,r){var x=h(t,r);var v=a(t);var y,s;if(v=="no-highlight"){return}if(v){y=d(v,x)}else{y=g(x);v=y.language}var q=c(t);if(q.length){s=document.createElement("pre");s.innerHTML=y.value;y.value=k(q,c(s),x)}y.value=i(y.value,w,r);var u=t.className;if(!u.match("(\\s|^)(language-)?"+v+"(\\s|$)")){u=u?(u+" "+v):v}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){s=t.parentNode;var p=document.createElement("div");p.innerHTML="
    "+y.value+"
    ";t=p.firstChild.firstChild;p.firstChild.cN=s.cN;s.parentNode.replaceChild(p.firstChild,s)}else{t.innerHTML=y.value}t.className=u;t.result={language:v,kw:y.keyword_count,re:y.r};if(y.second_best){t.second_best={language:y.second_best.language,kw:y.second_best.keyword_count,re:y.second_best.r}}}function o(){if(o.called){return}o.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(r,s){var p={};for(var q in r){p[q]=r[q]}if(s){for(var q in s){p[q]=s[q]}}return p}}();hljs.LANGUAGES.javascript=function(a){return{dM:{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",bWK:true,e:"{",k:"function",c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[a.CLCM,a.CBLCLM],i:"[\"'\\(]"}],i:"\\[|%"}]}}}(hljs);hljs.LANGUAGES.css=function(a){var b={cN:"function",b:a.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[a.NM,a.ASM,a.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:"import page media charset",c:[b,a.ASM,a.QSM,a.NM]},{cN:"tag",b:a.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},b]}]}}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{dM:{c:d,k:e,i:"\\S"}}}(hljs); \ No newline at end of file diff --git a/docs/highlight/styles/ascetic.css b/docs/highlight/styles/ascetic.css deleted file mode 100644 index 9faef268768..00000000000 --- a/docs/highlight/styles/ascetic.css +++ /dev/null @@ -1,44 +0,0 @@ -/* - -Original style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -pre code { - display: block; padding: 0.5em; - background: white; color: black; -} - -pre .string, -pre .tag .value, -pre .filter .argument, -pre .addition, -pre .change, -pre .apache .tag, -pre .apache .cbracket, -pre .nginx .built_in, -pre .tex .formula { - color: #888; -} - -pre .comment, -pre .template_comment, -pre .shebang, -pre .doctype, -pre .pi, -pre .javadoc, -pre .deletion, -pre .apache .sqbracket { - color: #CCC; -} - -pre .keyword, -pre .tag .title, -pre .ini .title, -pre .winutils, -pre .flow, -pre .lisp .title, -pre .apache .tag, -pre .tex .command { - font-weight: bold; -} diff --git a/docs/highlight/styles/brown_paper.css b/docs/highlight/styles/brown_paper.css deleted file mode 100644 index 8cd343a0ee4..00000000000 --- a/docs/highlight/styles/brown_paper.css +++ /dev/null @@ -1,103 +0,0 @@ -/* - -Brown Paper style from goldblog.com.ua (c) Zaripov Yura - -*/ - -pre code { - display: block; padding: 0.5em; - background:#b7a68e url(./brown_papersq.png); -} - -pre .keyword, -pre .literal, -pre .change, -pre .winutils, -pre .flow, -pre .lisp .title, -pre .tex .special { - color:#005599; - font-weight:bold; -} - -pre code, -pre .ruby .subst, -pre .tag .keyword { - color: #363C69; -} - -pre .string, -pre .function .title, -pre .class .title, -pre .ini .title, -pre .tag .value, -pre .css .rules .value, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .ruby .instancevar, -pre .ruby .class .parent, -pre .built_in, -pre .sql .aggregate, -pre .django .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .javadoc, -pre .ruby .string, -pre .django .filter .argument, -pre .smalltalk .localvars, -pre .smalltalk .array, -pre .attr_selector, -pre .pseudo, -pre .addition, -pre .stream, -pre .envvar, -pre .apache .tag, -pre .apache .cbracket, -pre .tex .number { - color: #2C009F; -} - -pre .comment, -pre .java .annotation, -pre .python .decorator, -pre .template_comment, -pre .pi, -pre .doctype, -pre .deletion, -pre .shebang, -pre .apache .sqbracket, -pre .nginx .built_in, -pre .tex .formula { - color: #802022; -} - -pre .keyword, -pre .literal, -pre .css .id, -pre .phpdoc, -pre .function .title, -pre .class .title, -pre .vbscript .built_in, -pre .sql .aggregate, -pre .rsl .built_in, -pre .smalltalk .class, -pre .xml .tag .title, -pre .diff .header, -pre .chunk, -pre .winutils, -pre .bash .variable, -pre .lisp .title, -pre .apache .tag, -pre .tex .command { - font-weight: bold; -} - -pre .html .css, -pre .html .javascript, -pre .html .vbscript, -pre .tex .formula { - opacity: 0.8; -} diff --git a/docs/highlight/styles/brown_papersq.png b/docs/highlight/styles/brown_papersq.png deleted file mode 100644 index 3813903dbf9fa7b1fb5bd11d9534c06667d9056f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18198 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
    G3S-EN>9CM!{YB*|;6wg-K3V?)eR((z#1 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 diff --git a/docs/highlight/styles/dark.css b/docs/highlight/styles/dark.css deleted file mode 100644 index a5ad0ae46ea..00000000000 --- a/docs/highlight/styles/dark.css +++ /dev/null @@ -1,100 +0,0 @@ -/* - -Dark style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -pre code { - display: block; padding: 0.5em; - background: #444; -} - -pre .keyword, -pre .literal, -pre .change, -pre .winutils, -pre .flow, -pre .lisp .title, -pre .tex .special { - color: white; -} - -pre code, -pre .ruby .subst { - color: #DDD; -} - -pre .string, -pre .function .title, -pre .class .title, -pre .ini .title, -pre .tag .value, -pre .css .rules .value, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .ruby .instancevar, -pre .ruby .class .parent, -pre .built_in, -pre .sql .aggregate, -pre .django .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .javadoc, -pre .ruby .string, -pre .django .filter .argument, -pre .smalltalk .localvars, -pre .smalltalk .array, -pre .attr_selector, -pre .pseudo, -pre .addition, -pre .stream, -pre .envvar, -pre .apache .tag, -pre .apache .cbracket, -pre .tex .command { - color: #D88; -} - -pre .comment, -pre .java .annotation, -pre .python .decorator, -pre .template_comment, -pre .pi, -pre .doctype, -pre .deletion, -pre .shebang, -pre .apache .sqbracket, -pre .tex .formula { - color: #777; -} - -pre .keyword, -pre .literal, -pre .css .id, -pre .phpdoc, -pre .function .title, -pre .class .title, -pre .vbscript .built_in, -pre .sql .aggregate, -pre .rsl .built_in, -pre .smalltalk .class, -pre .xml .tag .title, -pre .diff .header, -pre .chunk, -pre .winutils, -pre .bash .variable, -pre .lisp .title, -pre .apache .tag, -pre .tex .special { - font-weight: bold; -} - -pre .html .css, -pre .html .javascript, -pre .html .vbscript, -pre .tex .formula { - opacity: 0.5; -} diff --git a/docs/highlight/styles/default.css b/docs/highlight/styles/default.css index e9b18e55727..8717dd4ced3 100644 --- a/docs/highlight/styles/default.css +++ b/docs/highlight/styles/default.css @@ -1,4 +1,4 @@ -/* +/* Original style from softwaremaniacs.org (c) Ivan Sagalaev @@ -12,7 +12,8 @@ pre code { pre code, pre .ruby .subst, pre .tag .title, -pre .lisp .title { +pre .lisp .title, +pre .nginx .title { color: black; } @@ -40,7 +41,9 @@ pre .bash .variable, pre .apache .tag, pre .apache .cbracket, pre .tex .command, -pre .tex .special { +pre .tex .special, +pre .erlang_repl .function_or_atom, +pre .markdown .header { color: #800; } @@ -48,7 +51,8 @@ pre .comment, pre .annotation, pre .template_comment, pre .diff .header, -pre .chunk { +pre .chunk, +pre .markdown .blockquote { color: #888; } @@ -58,7 +62,10 @@ pre .regexp, pre .literal, pre .smalltalk .symbol, pre .smalltalk .char, -pre .change { +pre .go .constant, +pre .change, +pre .markdown .bullet, +pre .markdown .link_url { color: #080; } @@ -79,14 +86,12 @@ pre .envvar, pre .shebang, pre .apache .sqbracket, pre .nginx .built_in, -pre .tex .formula { - color: #88F; -} - -pre .javadoctag, -pre .phpdoc, -pre .yardoctag { - font-weight: bold; +pre .tex .formula, +pre .erlang_repl .reserved, +pre .input_number, +pre .markdown .link_label, +pre .vhdl .attribute { + color: #88F } pre .keyword, @@ -95,21 +100,34 @@ pre .phpdoc, pre .title, pre .built_in, pre .aggregate, +pre .css .tag, +pre .javadoctag, +pre .phpdoc, +pre .yardoctag, pre .smalltalk .class, pre .winutils, pre .bash .variable, pre .apache .tag, -pre .tex .command { +pre .go .typename, +pre .tex .command, +pre .markdown .strong, +pre .request, +pre .status { font-weight: bold; } +pre .markdown .emphasis { + font-style: italic; +} + pre .nginx .built_in { font-weight: normal; } -pre .html .css, -pre .html .javascript, -pre .html .vbscript, +pre .coffeescript .javascript, +pre .xml .css, +pre .xml .javascript, +pre .xml .vbscript, pre .tex .formula { opacity: 0.5; } diff --git a/docs/highlight/styles/far.css b/docs/highlight/styles/far.css deleted file mode 100644 index bb16fb3cc07..00000000000 --- a/docs/highlight/styles/far.css +++ /dev/null @@ -1,114 +0,0 @@ -/* - -FAR Style (c) MajestiC - -*/ - -pre code { - display: block; padding: 0.5em; - background: #000080; -} - -pre code, -.ruby .subst { - color: #0FF; -} - -pre .string, -pre .ruby .string, -pre .function .title, -pre .class .title, -pre .ini .title, -pre .tag .value, -pre .css .rules .value, -pre .css .rules .value .number, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .built_in, -pre .sql .aggregate, -pre .django .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .addition, -pre .apache .tag, -pre .apache .cbracket, -pre .tex .command { - color: #FF0; -} - -pre .keyword, -pre .css .id, -pre .function .title, -pre .class .title, -pre .ini .title, -pre .vbscript .built_in, -pre .sql .aggregate, -pre .rsl .built_in, -pre .smalltalk .class, -pre .xml .tag .title, -pre .winutils, -pre .flow, -pre .lisp .title, -pre .change, -pre .envvar, -pre .bash .variable, -pre .tex .special { - color: #FFF; -} - -pre .comment, -pre .phpdoc, -pre .javadoc, -pre .java .annotation, -pre .template_comment, -pre .deletion, -pre .apache .sqbracket, -pre .tex .formula { - color: #888; -} - -pre .number, -pre .date, -pre .regexp, -pre .literal, -pre .smalltalk .symbol, -pre .smalltalk .char { - color: #0F0; -} - -pre .python .decorator, -pre .django .filter .argument, -pre .smalltalk .localvars, -pre .smalltalk .array, -pre .attr_selector, -pre .pseudo, -pre .xml .pi, -pre .diff .header, -pre .chunk, -pre .shebang, -pre .nginx .built_in { - color: #008080; -} - -pre .keyword, -pre .css .id, -pre .function .title, -pre .class .title, -pre .ini .title, -pre .vbscript .built_in, -pre .sql .aggregate, -pre .rsl .built_in, -pre .smalltalk .class, -pre .xml .tag .title, -pre .winutils, -pre .flow, -pre .lisp .title, -pre .apache .tag, -pre .nginx .built_in, -pre .tex .command, -pre .tex .special { - font-weight: bold; -} diff --git a/docs/highlight/styles/github.css b/docs/highlight/styles/github.css index 7fcc57889f6..a4f7deb78e4 100644 --- a/docs/highlight/styles/github.css +++ b/docs/highlight/styles/github.css @@ -23,17 +23,20 @@ pre .css .rule .keyword, pre .winutils, pre .javascript .title, pre .lisp .title, -pre .subst { +pre .nginx .title, +pre .subst, +pre .request, +pre .status { color: #000; font-weight: bold } -pre .number, +code .number, pre .hexcolor { color: #40a070 } -pre .string, +code .string, pre .tag .value, pre .phpdoc, pre .tex .formula { @@ -53,15 +56,19 @@ pre .subst { } pre .class .title, +pre .haskell .type, +pre .vhdl .literal, pre .tex .command { color: #458; font-weight: bold } +code .literal { + color: #333; +} pre .tag, -pre .css .keyword, -pre .html .keyword, pre .tag .title, +pre .rules .property, pre .django .tag .keyword { color: #000080; font-weight: normal @@ -88,7 +95,8 @@ pre .ruby .symbol .string, pre .ruby .symbol .keyword, pre .ruby .symbol .keymethods, pre .lisp .keyword, -pre .tex .special { +pre .tex .special, +pre .input_number { color: #990073 } diff --git a/docs/highlight/styles/idea.css b/docs/highlight/styles/idea.css deleted file mode 100644 index 68ab1420cfd..00000000000 --- a/docs/highlight/styles/idea.css +++ /dev/null @@ -1,117 +0,0 @@ -/* - -Intellij Idea-like styling (c) Vasily Polovnyov - -*/ - -pre code { - display: block; padding: 0.5em; - color: #000; - background: #fff; -} - -pre .subst, -pre .title { - font-weight: normal; - color: #000; -} - -pre .comment, -pre .template_comment, -pre .javadoc, -pre .diff .header { - color: #808080; - font-style: italic; -} - -pre .annotation, -pre .decorator, -pre .preprocessor, -pre .doctype, -pre .pi, -pre .chunk, -pre .shebang, -pre .apache .cbracket { - color: #808000; -} - -pre .tag, -pre .pi { - background: #efefef; -} - -pre .tag .title, -pre .id, -pre .attr_selector, -pre .pseudo, -pre .literal, -pre .keyword, -pre .hexcolor, -pre .css .function, -pre .ini .title, -pre .css .class, -pre .list .title, -pre .tex .command { - font-weight: bold; - color: #000080; -} - -pre .attribute, -pre .rules .keyword, -pre .number, -pre .date, -pre .regexp, -pre .tex .special { - font-weight: bold; - color: #0000ff; -} - -pre .number, -pre .regexp { - font-weight: normal; -} - -pre .string, -pre .value, -pre .filter .argument, -pre .css .function .params, -pre .apache .tag { - color: #008000; - font-weight: bold; -} - -pre .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .char, -pre .tex .formula { - color: #000; - background: #d0eded; - font-style: italic; -} - -pre .phpdoc, -pre .yardoctag, -pre .javadoctag { - text-decoration: underline; -} - -pre .variable, -pre .envvar, -pre .apache .sqbracket, -pre .nginx .built_in { - color: #660e7a; -} - -pre .addition { - background: #baeeba; -} - -pre .deletion { - background: #ffc8bd; -} - -pre .diff .change { - background: #bccff9; -} diff --git a/docs/highlight/styles/ir_black.css b/docs/highlight/styles/ir_black.css deleted file mode 100644 index 8b6f0775536..00000000000 --- a/docs/highlight/styles/ir_black.css +++ /dev/null @@ -1,102 +0,0 @@ -/* - IR_Black style (c) Vasily Mikhailitchenko -*/ - -pre code { - display: block; padding: 0.5em; - background: #000; color: #f8f8f8; -} - -pre .shebang, -pre .comment, -pre .template_comment, -pre .javadoc { - color: #7c7c7c; -} - -pre .keyword, -pre .tag, -pre .ruby .function .keyword, -pre .tex .command { - color: #96CBFE; -} - -pre .function .keyword, -pre .sub .keyword, -pre .method, -pre .list .title { - color: #FFFFB6; -} - -pre .string, -pre .tag .value, -pre .cdata, -pre .filter .argument, -pre .attr_selector, -pre .apache .cbracket, -pre .date { - color: #A8FF60; -} - -pre .subst { - color: #DAEFA3; -} - -pre .regexp { - color: #E9C062; -} - -pre .function .title, -pre .sub .identifier, -pre .pi, -pre .decorator, -pre .ini .title, -pre .tex .special { - color: #FFFFB6; -} - -pre .class .title, -pre .constant, -pre .smalltalk .class, -pre .javadoctag, -pre .yardoctag, -pre .phpdoc, -pre .nginx .built_in { - color: #FFFFB6; -} - -pre .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .number, -pre .variable, -pre .vbscript, -pre .literal { - color: #C6C5FE; -} - -pre .css .keyword { - color: #96CBFE; -} - -pre .css .rule .keyword, -pre .css .id { - color: #FFFFB6; -} - -pre .css .class { - color: #FFF; -} - -pre .hexcolor { - color: #C6C5FE; -} - -pre .number { - color:#FF73FD; -} - -pre .tex .formula { - opacity: 0.7; -} diff --git a/docs/highlight/styles/magula.css b/docs/highlight/styles/magula.css deleted file mode 100644 index 0f235e80fc2..00000000000 --- a/docs/highlight/styles/magula.css +++ /dev/null @@ -1,117 +0,0 @@ -/* -Description: Magula style for highligh.js -Author: Ruslan Keba -Website: http://rukeba.com/ -Version: 1.0 -Date: 2009-01-03 -Music: Aphex Twin / Xtal -*/ - -pre code { - display: block; padding: 0.5em; - background-color: #f4f4f4; -} - -pre code, -pre .ruby .subst, -pre .lisp .title { - color: black; -} - -pre .string, -pre .title, -pre .parent, -pre .tag .value, -pre .rules .value, -pre .rules .value .number, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .instancevar, -pre .aggregate, -pre .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .addition, -pre .flow, -pre .stream, -pre .bash .variable, -pre .apache .cbracket { - color: #050; -} - -pre .comment, -pre .annotation, -pre .template_comment, -pre .diff .header, -pre .chunk { - color: #777; -} - -pre .number, -pre .date, -pre .regexp, -pre .literal, -pre .smalltalk .symbol, -pre .smalltalk .char, -pre .change, -pre .tex .special { - color: #800; -} - -pre .label, -pre .javadoc, -pre .ruby .string, -pre .decorator, -pre .filter .argument, -pre .localvars, -pre .array, -pre .attr_selector, -pre .pseudo, -pre .pi, -pre .doctype, -pre .deletion, -pre .envvar, -pre .shebang, -pre .apache .sqbracket, -pre .nginx .built_in, -pre .tex .formula { - color: #00e; -} - -pre .keyword, -pre .id, -pre .phpdoc, -pre .title, -pre .built_in, -pre .aggregate, -pre .smalltalk .class, -pre .winutils, -pre .bash .variable, -pre .apache .tag, -pre .xml .tag, -pre .xml .title, -pre .tex .command { - font-weight: bold; - color: navy; -} - -pre .nginx .built_in { - font-weight: normal; -} - -pre .html .css, -pre .html .javascript, -pre .html .vbscript, -pre .tex .formula { - opacity: 0.5; -} - -/* --- */ -pre .apache .tag { - font-weight: bold; - color: blue; -} - diff --git a/docs/highlight/styles/school_book.css b/docs/highlight/styles/school_book.css deleted file mode 100644 index 54e8937cb08..00000000000 --- a/docs/highlight/styles/school_book.css +++ /dev/null @@ -1,109 +0,0 @@ -/* - -School Book style from goldblog.com.ua (c) Zaripov Yura - -*/ - -pre code { - display: block; padding: 15px 0.5em 0.5em 30px; - font-size: 11px !important; - line-height:16px !important; -} - -pre{ - background:#f6f6ae url(./school_book.png); - border-top: solid 2px #d2e8b9; - border-bottom: solid 1px #d2e8b9; -} - -pre .keyword, -pre .literal, -pre .change, -pre .winutils, -pre .flow, -pre .lisp .title, -pre .tex .special { - color:#005599; - font-weight:bold; -} - -pre code, -pre .ruby .subst, -pre .tag .keyword { - color: #3E5915; -} - -pre .string, -pre .function .title, -pre .class .title, -pre .ini .title, -pre .tag .value, -pre .css .rules .value, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .ruby .instancevar, -pre .ruby .class .parent, -pre .built_in, -pre .sql .aggregate, -pre .django .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .javadoc, -pre .ruby .string, -pre .django .filter .argument, -pre .smalltalk .localvars, -pre .smalltalk .array, -pre .attr_selector, -pre .pseudo, -pre .addition, -pre .stream, -pre .envvar, -pre .apache .tag, -pre .apache .cbracket, -pre .nginx .built_in, -pre .tex .command { - color: #2C009F; -} - -pre .comment, -pre .java .annotation, -pre .python .decorator, -pre .template_comment, -pre .pi, -pre .doctype, -pre .deletion, -pre .shebang, -pre .apache .sqbracket { - color: #E60415; -} - -pre .keyword, -pre .literal, -pre .css .id, -pre .phpdoc, -pre .function .title, -pre .class .title, -pre .vbscript .built_in, -pre .sql .aggregate, -pre .rsl .built_in, -pre .smalltalk .class, -pre .xml .tag .title, -pre .diff .header, -pre .chunk, -pre .winutils, -pre .bash .variable, -pre .lisp .title, -pre .apache .tag, -pre .tex .command { - font-weight: bold; -} - -pre .html .css, -pre .html .javascript, -pre .html .vbscript, -pre .tex .formula { - opacity: 0.5; -} diff --git a/docs/highlight/styles/school_book.png b/docs/highlight/styles/school_book.png deleted file mode 100644 index 956e9790a0e2c079b3d568348ff3accd1d9cac30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0y~yV7?7x3vjRjNjAS6Ga$v1?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|R4)r;B4q#jQ7Ycl#YS5MfK$ z?b^fh#qmaEhFDxvyThwfhdfkOPApt1lr{NA;Vr%uzxJuVIyzm(ed_8_-0$LLU})H&o5Re&aDemE>EG#(|F^t9_pa-H z_Mf?rMVrs}-M?S|?ZdY@c6s41zy8~}@a{v&#Ea7V)wJ$+#K|u$5UvWCdFLwGac}6w{_s*=8A6L7Rfc|9gboFyt I=akR{0OLZ+qyPW_ diff --git a/docs/highlight/styles/sunburst.css b/docs/highlight/styles/sunburst.css deleted file mode 100644 index c07aaaf70ba..00000000000 --- a/docs/highlight/styles/sunburst.css +++ /dev/null @@ -1,145 +0,0 @@ -/* - -Sunburst-like style (c) Vasily Polovnyov - -*/ - -pre code { - display: block; padding: 0.5em; - font: 1em / 1.3em 'Lucida Console', 'courier new', monospace; - background: #000; color: #f8f8f8; -} - -pre .comment, -pre .template_comment, -pre .javadoc { - color: #aeaeae; - font-style: italic; -} - -pre .keyword, -pre .ruby .function .keyword { - color: #E28964; -} - -pre .function .keyword, -pre .sub .keyword, -pre .method, -pre .list .title { - color: #99CF50; -} - -pre .string, -pre .tag .value, -pre .cdata, -pre .filter .argument, -pre .attr_selector, -pre .apache .cbracket, -pre .date, -pre .tex .command { - color: #65B042; -} - -pre .subst { - color: #DAEFA3; -} - -pre .regexp { - color: #E9C062; -} - -pre .function .title, -pre .sub .identifier, -pre .pi, -pre .tag, -pre .tag .keyword, -pre .decorator, -pre .ini .title, -pre .shebang { - color: #89BDFF; -} - -pre .class .title, -pre .smalltalk .class, -pre .javadoctag, -pre .yardoctag, -pre .phpdoc { - text-decoration: underline; -} - -pre .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .number { - color: #3387CC; -} - -pre .params, -pre .variable { - color: #3E87E3; -} - -pre .css .keyword, -pre .pseudo, -pre .tex .special { - color: #CDA869; -} - -pre .css .class { - color: #9B703F; -} - -pre .rules .keyword { - color: #C5AF75; -} - -pre .rules .value { - color: #CF6A4C; -} - -pre .css .id { - color: #8B98AB; -} - -pre .annotation, -pre .apache .sqbracket, -pre .nginx .built_in { - color: #9B859D; -} - -pre .preprocessor { - color: #8996A8; -} - -pre .hexcolor, -pre .css .value .number { - color: #DD7B3B; -} - -pre .css .function { - color: #DAD085; -} - -pre .diff .header, -pre .chunk, -pre .tex .formula { - background-color: #0E2231; - color: #F8F8F8; - font-style: italic; -} - -pre .diff .change { - background-color: #4A410D; - color: #F8F8F8; -} - -pre .addition { - background-color: #253B22; - color: #F8F8F8; -} - -pre .deletion { - background-color: #420E09; - color: #F8F8F8; -} diff --git a/docs/highlight/styles/vs.css b/docs/highlight/styles/vs.css deleted file mode 100644 index a5c8be8614c..00000000000 --- a/docs/highlight/styles/vs.css +++ /dev/null @@ -1,79 +0,0 @@ -/* - -Visual Studio-like style based on original C# coloring by Jason Diamond - -*/ -pre code { - display: block; padding: 0.5em; -} - -pre .comment, -pre .annotation, -pre .template_comment, -pre .diff .header, -pre .chunk, -pre .apache .cbracket { - color: rgb(0, 128, 0); -} - -pre .keyword, -pre .id, -pre .title, -pre .built_in, -pre .aggregate, -pre .smalltalk .class, -pre .winutils, -pre .bash .variable, -pre .tex .command { - color: rgb(0, 0, 255); -} - -pre .string, -pre .title, -pre .parent, -pre .tag .value, -pre .rules .value, -pre .rules .value .number, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .instancevar, -pre .aggregate, -pre .template_tag, -pre .django .variable, -pre .addition, -pre .flow, -pre .stream, -pre .apache .tag, -pre .date, -pre .tex .formula { - color: rgb(163, 21, 21); -} - -pre .ruby .string, -pre .decorator, -pre .filter .argument, -pre .localvars, -pre .array, -pre .attr_selector, -pre .pseudo, -pre .pi, -pre .doctype, -pre .deletion, -pre .envvar, -pre .shebang, -pre .preprocessor, -pre .userType, -pre .apache .sqbracket, -pre .nginx .built_in, -pre .tex .special { - color: rgb(43, 145, 175); -} - -pre .phpdoc, -pre .javadoc, -pre .xmlDocTag { - color: rgb(128, 128, 128); -} - diff --git a/docs/highlight/styles/zenburn.css b/docs/highlight/styles/zenburn.css deleted file mode 100644 index cac08b587ec..00000000000 --- a/docs/highlight/styles/zenburn.css +++ /dev/null @@ -1,112 +0,0 @@ -/* - -Zenburn style from voldmar.ru (c) Vladimir Epifanov -based on dark.css by Ivan Sagalaev - -*/ - -pre code { - display: block; padding: 0.5em; - background: #3F3F3F; - color: #DCDCDC; -} - -pre .keyword, -pre .tag, -pre .django .tag, -pre .django .keyword, -pre .css .class, -pre .css .id, -pre .lisp .title { - color: #E3CEAB; -} - -pre .django .template_tag, -pre .django .variable, -pre .django .filter .argument { - color: #DCDCDC; -} - -pre .number, -pre .date { - color: #8CD0D3; -} - -pre .dos .envvar, -pre .dos .stream, -pre .variable, -pre .apache .sqbracket { - color: #EFDCBC; -} - -pre .dos .flow, -pre .diff .change, -pre .python .exception, -pre .python .built_in, -pre .literal, -pre .tex .special { - color: #EFEFAF; -} - -pre .diff .chunk, -pre .ruby .subst { - color: #8F8F8F; -} - -pre .dos .keyword, -pre .python .decorator, -pre .class .title, -pre .function .title, -pre .ini .title, -pre .diff .header, -pre .ruby .class .parent, -pre .apache .tag, -pre .nginx .built_in, -pre .tex .command { - color: #efef8f; -} - -pre .dos .winutils, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .ruby .string, -pre .ruby .instancevar { - color: #DCA3A3; -} - -pre .diff .deletion, -pre .string, -pre .tag .value, -pre .preprocessor, -pre .built_in, -pre .sql .aggregate, -pre .javadoc, -pre .smalltalk .class, -pre .smalltalk .localvars, -pre .smalltalk .array, -pre .css .rules .value, -pre .attr_selector, -pre .pseudo, -pre .apache .cbracket, -pre .tex .formula { - color: #CC9393; -} - -pre .shebang, -pre .diff .addition, -pre .comment, -pre .java .annotation, -pre .template_comment, -pre .pi, -pre .doctype { - color: #7F9F7F; -} - -pre .html .css, -pre .html .javascript, -pre .tex .formula { - opacity: 0.5; -} - From 3b625cef8fbd91566895fc9704d2b5743ff1a6c2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Jul 2012 14:34:39 +0300 Subject: [PATCH 0140/2207] lots of styling and some corrections to #793 --- reference.html | 946 +++++++++++++++++++++++++------------------------ 1 file changed, 491 insertions(+), 455 deletions(-) diff --git a/reference.html b/reference.html index b5f5f3d24a1..cb89d284748 100644 --- a/reference.html +++ b/reference.html @@ -211,7 +211,7 @@

    Constructor

    Description - L.Map( <HTMLElement|String> id, <Map options> options? ) + L.Map( <HTMLElement|String> id, <Map options> options? ) Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below. @@ -226,123 +226,123 @@

    Options

    Description - center + center LatLng - null + null Initial geographical center of the map. - zoom + zoom Number - null + null Initial map zoom. - layers + layers ILayer[] [] Layers that will be added to the map initially. - minZoom + minZoom Number - 0 + 0 Minimum zoom level of the map. Overrides any minZoom set on map layers. - maxZoom + maxZoom Number - 18 + 18 Maximum zoom level of the map. This overrides any maxZoom set on map layers. - maxBounds + maxBounds LatLngBounds - null + null When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view, and also not allowing to zoom out to a view that's larger than the given bounds (depending on the map size). To set the restriction dynamically, use setMaxBounds method - crs + crs CRS L.CRS.EPSG3857 Coordinate Reference System to use. Don't change this if you're not sure what it means. - dragging + dragging Boolean - true + true Whether the map be draggable with mouse/touch or not. - touchZoom + touchZoom Boolean - true + true Whether the map can be zoomed by touch-dragging with two fingers. - scrollWheelZoom + scrollWheelZoom Boolean - true + true Whether the map can be zoomed by using the mouse wheel. - doubleClickZoom + doubleClickZoom Boolean - true + true Whether the map can be zoomed in by double clicking on it. - boxZoom + boxZoom Boolean - true + true Whether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift. - zoomControl + zoomControl Boolean - true + true Whether the zoom control is added to the map by default. - attributionControl + attributionControl Boolean - true + true Whether the attribution control is added to the map by default. - trackResize + trackResize Boolean - true + true Whether the map automatically handles browser window resize to update itself. - fadeAnimation + fadeAnimation Boolean depends Whether the tile fade animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android. - zoomAnimation + zoomAnimation Boolean depends Whether the tile zoom animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android. - markerZoomAnimation + markerZoomAnimation Boolean depends Whether markers animate their zoom with the zoom animation, if disabled they will disappear for the length of the animation. By default it's enabled in all browsers that support CSS3 Transitions except Android. - closePopupOnClick + closePopupOnClick Boolean - true + true Set it to false if you don't want popups to close when user clicks the map. - worldCopyJump + worldCopyJump Boolean - true + true With this option enabled, the map tracks when you pan to another "copy" of the world and moves all overlays like markers and vector layers there. @@ -359,122 +359,122 @@

    Events

    Description - click + click MouseEvent Fired when the user clicks (or taps) the map. - dblclick + dblclick MouseEvent Fired when the user double-clicks (or double-taps) the map. - mousedown + mousedown MouseEvent Fired when the user pushes the mouse button on the map. - mouseenter + mouseenter MouseEvent Fired when the mouse enters the map. - mouseleave + mouseleave MouseEvent Fired when the mouse leaves the map. - mousemove + mousemove MouseEvent Fired while the mouse moves over the map. - contextmenu + contextmenu MouseEvent Fired when the user pushes the right mouse button on the map. - preclick + preclick MouseEvent Fired before mouse click on the map (sometimes useful when you want something to happen on click before any existing click handlers start running). - load + load Event Fired when the map is initialized (when its center and zoom are set for the first time). - viewreset + viewreset Event Fired when the map needs to redraw its content (this usually happens on map zoom or load). Very useful for creating custom overlays. - movestart + movestart Event Fired when the view of the map starts changing (e.g. user starts dragging the map). - move + move Event Fired on any movement of the map view. - moveend + moveend Event Fired when the view of the map ends changed (e.g. user stopped dragging the map). - dragstart + dragstart Event Fired when the user starts dragging the map. - drag + drag Event Fired repeatedly while the user drags the map. - dragend + dragend Event Fired when the user stops dragging the map. - zoomstart + zoomstart Event Fired when the map zoom is about to change (e.g. before zoom animation). - zoomend + zoomend Event Fired when the map zoom changes. - layeradd + layeradd LayerEvent Fired when a new layer is added to the map. - layerremove + layerremove LayerEvent Fired when some layer is removed from the map. - locationfound + locationfound LocationEvent Fired when geolocation (using locate or locateAndSetView method) went successfully. - locationerror + locationerror ErrorEvent Fired when geolocation (using locate or locateAndSetView method) failed. - popupopen + popupopen PopupEvent Fired when a popup is opened (using openPopup method). - popupclose + popupclose PopupEvent Fired when a popup is closed (using closePopup method). @@ -490,74 +490,74 @@

    Methods that modify map state

    Description - setView( <LatLng> center, <Number> zoom, <Boolean>forceReset? ) + setView( <LatLng> center, <Number> zoom, <Boolean>forceReset? ) this Sets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default). - setZoom( <Number> zoom ) + setZoom( <Number> zoom ) this Sets the zoom of the map. - zoomIn() + zoomIn() this Increases the zoom of the map by 1. - zoomOut() + zoomOut() this Decreases the zoom of the map by 1. - fitBounds( <LatLngBounds> bounds ) + fitBounds( <LatLngBounds> bounds ) this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. - fitWorld() + fitWorld() this Sets a map view that mostly contains the whole world with the maximum zoom level possible. - panTo( <LatLng> latlng ) + panTo( <LatLng> latlng ) this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. - panInsideBounds( <LatLngBounds> bounds ) + panInsideBounds( <LatLngBounds> bounds ) this Pans the map to the closest view that would lie inside the given bounds (if it's not already). - panBy( <Point> point) + panBy( <Point> point ) this Pans the map by a given number of pixels (animated). - invalidateSize() + invalidateSize() this Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. - setMaxBounds( <LatLngBounds> bounds ) + setMaxBounds( <LatLngBounds> bounds ) this Restricts the map view to the given bounds (see map maxBounds option). - locate( <Locate options> options? ) + locate( <Locate options> options? ) this Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details. - locateAndSetView( <Number> maxZoom?, <Locate options> options? ) + locateAndSetView( <Number> maxZoom?, <Locate options> options? ) this - Automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});. + Automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});. - stopLocate() + stopLocate() this - Stops watching location previously initiated by map.locate({watch: true}). + Stops watching location previously initiated by map.locate({watch: true}). @@ -570,47 +570,47 @@

    Methods that get map state

    Description - getCenter() + getCenter() LatLng Returns the geographical center of the map view. - getZoom() + getZoom() Number Returns the current zoom of the map view. - getMinZoom() + getMinZoom() Number Returns the minimum zoom level of the map. - getMaxZoom() + getMaxZoom() Number Returns the maximum zoom level of the map. - getBounds() + getBounds() LatLngBounds Returns the LatLngBounds of the current map view. - getBoundsZoom( <LatLngBounds> bounds, <Boolean> inside? ) + getBoundsZoom( <LatLngBounds> bounds, <Boolean> inside? ) Number Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. - getSize() + getSize() Point Returns the current size of the map container. - getPixelBounds() + getPixelBounds() Bounds Returns the bounds of the current map view in projected pixel coordinates (sometimes useful in layer and overlay implementations). - getPixelOrigin() + getPixelOrigin() Point Returns the projected pixel coordinates of the top left point of the map layer (useful in custom layer and overlay implementations). @@ -620,38 +620,38 @@

    Methods for layers and controls

    - + - + - + - + - + - + - + @@ -667,47 +667,47 @@

    Conversion methods

    - + - + - + - + - + - + - + - + - + @@ -722,12 +722,12 @@

    Other methods

    - + - + @@ -743,39 +743,39 @@

    Locate options

    - + - - + + - + - - + + - + - + - + - + - + - + - + - +
    addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? )addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? ) this Adds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers).
    removeLayer( <ILayer> layer )removeLayer( <ILayer> layer ) this Removes the given layer from the map.
    hasLayer( <ILayer> layer )hasLayer( <ILayer> layer ) Boolean Returns true if the given layer is currently added to the map.
    openPopup( <Popup> popup )openPopup( <Popup> popup ) this Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).
    closePopup()closePopup() this Closes the popup opened with openPopup.
    addControl( <IControl> control )addControl( <IControl> control ) this Adds the given control to the map.
    removeControl( <IControl> control )removeControl( <IControl> control ) this Removes the given control from the map.
    Description
    latLngToLayerPoint( <LatLng> latlng )latLngToLayerPoint( <LatLng> latlng ) Point Returns the map layer point that corresponds to the given geographical coordinates (useful for placing overlays on the map).
    layerPointToLatLng( <Point> point )layerPointToLatLng( <Point> point ) LatLng Returns the geographical coordinates of a given map layer point.
    mouseEventToContainerPoint( <MouseEvent> event )mouseEventToContainerPoint( <MouseEvent> event ) Point Returns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object.
    mouseEventToLayerPoint( <MouseEvent> event )mouseEventToLayerPoint( <MouseEvent> event ) Point Returns the pixel coordinates of a mouse click relative to the map layer given its event object.
    mouseEventToLatLng( <MouseEvent> event )mouseEventToLatLng( <MouseEvent> event ) LatLng Returns the geographical coordinates of the point the mouse clicked on given the click's event object.
    containerPointToLayerPoint( <Point> point )containerPointToLayerPoint( <Point> point ) Point Converts the point relative to the map container to a point relative to the map layer.
    layerPointToContainerPoint( <Point> point )layerPointToContainerPoint( <Point> point ) Point Converts the point relative to the map layer to a point relative to the map container.
    project( <LatLng> latlng, <Number> zoom? )project( <LatLng> latlng, <Number> zoom? ) Point Projects the given geographical coordinates to pixel coordinates for the given zoom level (current zoom level by default).
    unproject( <Point> point, <Number> zoom? )unproject( <Point> point, <Number> zoom? ) LatLng Projects the given pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).
    Description
    getContainer()getContainer() HTMLElement Returns the container element of the map.
    getPanes()getPanes() MapPanes Returns an object with different map panes (to render overlays in).
    Description
    watchwatch BooleanfalseIf true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method.falseIf true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method.
    setViewsetView BooleanfalseIf true, automatically sets the map view to the user location with respect to detection accuracy.falseIf true, automatically sets the map view to the user location with respect to detection accuracy.
    maxZoommaxZoom NumberInfinityInfinity The maximum zoom for automatic view setting when using `setView` option.
    timeouttimeout Number1000010000 Number of millisecond to wait for a response from geolocation before firing a locationerror event.
    maximumAgemaximumAge Number00 Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, locate will return a cached location.
    enableHighAccuracyenableHighAccuracy Booleanfalsefalse Enables high accuracy, see description in the W3C spec.
    @@ -798,37 +798,37 @@

    Properties

    Description - dragging + dragging IHandler Map dragging handler (by both mouse and touch). - touchZoom + touchZoom IHandler Touch zoom handler. - doubleClickZoom + doubleClickZoom IHandler Double click zoom handler. - scrollWheelZoom + scrollWheelZoom IHandler Scroll wheel zoom handler. - boxZoom + boxZoom IHandler Box (shift-drag with mouse) zoom handler. - zoomControl + zoomControl Control.Zoom Zoom control. - attributionControl + attributionControl Control.Attribution Attribution control. @@ -869,37 +869,37 @@

    Map panes

    Description - mapPane + mapPane HTMLElement Pane that contains all other map panes. - tilePane + tilePane HTMLElement Pane for tile layers. - objectsPane + objectsPane HTMLElement Pane that contains all the panes except tile pane. - shadowPane + shadowPane HTMLElement Pane for overlay shadows (e.g. marker shadows). - overlayPane + overlayPane HTMLElement Pane for overlays like polylines and polygons. - markerPane + markerPane HTMLElement Pane for marker icons. - popupPane + popupPane HTMLElement Pane for popups. @@ -922,7 +922,7 @@

    Constructor

    Description - L.Marker( <LatLng> latlng, <Marker options> options? ) + L.Marker( <LatLng> latlng, <Marker options> options? ) Instantiates a Marker object given a geographical point and optionally an options object. @@ -937,33 +937,33 @@

    Options

    Description - icon + icon L.Icon L.Icon Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. - clickable + clickable Boolean - true - If false, the marker will not emit mouse events and will act as a part of the underlying map. + true + If false, the marker will not emit mouse events and will act as a part of the underlying map. - draggable + draggable Boolean - false + false Whether the marker is draggable with mouse/touch or not. - title + title String - + '' Text for the browser tooltip that appear on marker hover (no tooltip by default). - zIndexOffset + zIndexOffset Number - 0 + 0 By default, marker images zIndex is set automatically based on its latitude. You this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). @@ -979,42 +979,42 @@

    Events

    Description - click + click MouseEvent Fired when the user clicks (or taps) the marker. - dblclick + dblclick MouseEvent Fired when the user double-clicks (or double-taps) the marker. - mousedown + mousedown MouseEvent Fired when the user pushes the mouse button on the marker. - mouseover + mouseover MouseEvent Fired when the mouse enters the marker. - mouseout + mouseout MouseEvent Fired when the mouse leaves the marker. - dragstart + dragstart Event Fired when the user starts dragging the marker. - drag + drag Event Fired repeatedly while the user drags the marker. - dragend + dragend Event Fired when the user stops dragging the marker. @@ -1029,42 +1029,42 @@

    Methods

    Description - getLatLng() + getLatLng() LatLng Returns the current geographical position of the marker. - setLatLng( <LatLng> latlng ) + setLatLng( <LatLng> latlng ) this Changes the marker position to the given point. - setIcon( <Icon> icon ) + setIcon( <Icon> icon ) this Changes the marker icon. - setZIndexOffset( <Number> offset ) + setZIndexOffset( <Number> offset ) this Changes the zIndex offset of the marker. - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( <String> htmlContent, <Popup options> options? ) this Binds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method. - unbindPopup() + unbindPopup() this Unbinds the popup previously bound to the marker with bindPopup. - openPopup() + openPopup() this Opens the popup previously bound by the bindPopup method. - closePopup() + closePopup() this Closes the bound popup of the marker if it's opened. @@ -1084,7 +1084,7 @@

    Interaction handlers

    dragging - IHandler + IHandler Marker dragging handler (by both mouse and touch). @@ -1115,7 +1115,7 @@

    Constructor

    Description - L.Popup( <Popup options> options?, <object> source? ) + L.Popup( <Popup options> options?, <object> source? ) Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers. @@ -1130,39 +1130,39 @@ Description - maxWidth + maxWidth Number - 300 + 300 Max width of the popup. - maxWidth + maxWidth Number - 50 + 50 Min width of the popup. - autoPan + autoPan Boolean - true - Set it to false if you don't want the map to do panning animation to fit the opened popup. + true + Set it to false if you don't want the map to do panning animation to fit the opened popup. - closeButton + closeButton Boolean - true + true Controls the presense of a close button in the popup. - offset + offset Point - Point(0, 0) + Point(0, 0) The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays. - autoPanPadding + autoPanPadding Point - Point(5, 5) + Point(5, 5) The margin between the popup and the edges of the map view after autopanning was performed. @@ -1176,12 +1176,12 @@

    Methods

    Description - setLatLng( <LatLng> latlng ) + setLatLng( <LatLng> latlng ) this Sets the geographical point where the popup will open. - setContent( <String> htmlContent ) + setContent( <String> htmlContent ) this Sets the HTML content of the popup. @@ -1206,7 +1206,7 @@

    Constructor

    Description - L.TileLayer( <String> urlTemplate, <TileLayer options> options? ) + L.TileLayer( <String> urlTemplate, <TileLayer options> options? ) Instantiates a tile layer object given a URL template and optionally an options object. @@ -1233,93 +1233,93 @@

    Options

    Description - minZoom + minZoom Number - 0 + 0 Minimum zoom number. - maxZoom + maxZoom Number - 18 + 18 Maximum zoom number. - tileSize + tileSize Number - 256 + 256 Tile size (width and height in pixels, assuming tiles are square). - subdomains + subdomains String or String[] - 'abc' + 'abc' Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings. - errorTileUrl + errorTileUrl String - '' + '' URL to the tile image to show in place of the tile that failed to load. - attribution + attribution String - '' + '' e.g. "© CloudMade" — the string used by the attribution control, describes the layer data. - scheme - String - 'xyz' - Either 'xyz' or 'tms', affects tile numbering (TMS servers use inverse Y axis numbering). + tms + Boolean + false + If true, inverses Y axis numbering for tiles (turn this on for TMS services). - continuousWorld + continuousWorld Boolean - false + false If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). - noWrap + noWrap Boolean - false + false If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. - zoomOffset + zoomOffset Number - 0 + 0 The zoom number used in tile URLs will be offset with this value. - zoomReverse + zoomReverse Boolean - false + false If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) - opacity + opacity Number - 1.0 + 1.0 The opacity of the tile layer. - unloadInvisibleTiles + unloadInvisibleTiles Boolean depends If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. - updateWhenIdle + updateWhenIdle Boolean depends If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. - reuseTiles + reuseTiles Boolean - false + false If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. @@ -1333,12 +1333,12 @@

    Methods

    Description - setOpacity( <Number> opacity ) + setOpacity( <Number> opacity ) this Changes the opacity of the tile layer. - redraw() + redraw() - Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas @@ -1367,7 +1367,7 @@

    Constructor

    Description - L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS options> options ) + L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS options> options ) Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object. @@ -1384,33 +1384,33 @@

    Options

    Description - layers + layers String - - + '' (required) Comma-separated list of WMS layers to show. - styles + styles String - + '' Comma-separated list of WMS styles. - format + format String - image/jpeg - WMS image format (use 'image/png' for layers with transparency). + 'image/jpeg' + WMS image format (use 'image/png' for layers with transparency). - transparent + transparent Boolean - false - If true, the WMS service will return images with transparency. + false + If true, the WMS service will return images with transparency. - version + version String - 1.1.1 + '1.1.1' Version of the WMS service to use. @@ -1438,7 +1438,7 @@

    Constructor

    Description - L.TileLayer.Canvas( <TileLayer options> options? ) + L.TileLayer.Canvas( <TileLayer options> options? ) Instantiates a Canvas tile layer object given an options object (optionally). @@ -1452,12 +1452,12 @@

    Methods

    Description - drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, <Number> zoom ) + drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, <Number> zoom ) this You need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom. - redraw() + redraw() - Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas @@ -1485,7 +1485,7 @@

    Constructor

    Description - L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds ) + L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds ) Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to. @@ -1505,52 +1505,52 @@

    Options

    Description - stroke + stroke Boolean - true + true Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. - color + color String - '#03f' + '#03f' Stroke color. - weight + weight Number - 5 + 5 Stroke width in pixels. - opacity + opacity Number - 0.5 + 0.5 Stroke opacity. - fill + fill Boolean depends Whether to fill the path with color. Set it to false to disable filling on polygons or circles. - fillColor + fillColor String same as color Fill color. - fillOpacity + fillOpacity Number - 0.2 + 0.2 Fill opacity. - clickable + clickable Boolean - true - If false, the vector will not emit mouse events and will act as a part of the underlying map. + true + If false, the vector will not emit mouse events and will act as a part of the underlying map. @@ -1565,27 +1565,27 @@

    Events

    Description - click + click MouseEvent Fired when the user clicks (or taps) the object. - dblclick + dblclick MouseEvent Fired when the user double-clicks (or double-taps) the object. - mousedown + mousedown MouseEvent Fired when the user pushes the mouse button on the object. - mouseover + mouseover MouseEvent Fired when the mouse enters the object. - mouseout + mouseout MouseEvent Fired when the mouse leaves the object. @@ -1615,12 +1615,12 @@

    Constants

    L.Path.CANVAS Boolean depends - True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. + True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. L.Path.CLIP_PADDING Number - 0.5 for SVG
    0.02 for VML + 0.5 for SVG
    0.02 for VML How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance. @@ -1633,17 +1633,17 @@

    Methods

    Description - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( <String> htmlContent, <Popup options> options? ) this Binds a popup with a particular HTML content to a click on this path. - setStyle( <Path options> object ) + setStyle( <Path options> object ) this Changes the appearance of a Path based on the options in the Path options object. - getBounds() + getBounds() LatLngBounds Returns the LatLngBounds of the path. @@ -1672,7 +1672,7 @@

    Constructor

    Description - L.Polyline( <LatLng[]> latlngs, <Polyline options> options? ) + L.Polyline( <LatLng[]> latlngs, <Polyline options> options? ) Instantiates a polyline object given an array of geographical points and optionally an options object. @@ -1689,15 +1689,15 @@

    Options

    Description - smoothFactor + smoothFactor Number - 1.0 + 1.0 How much to simplify the polyline on each zoom level. More means better performance and smoother look, and less means more accurate representation. - noClip + noClip Boolean - false + false Disabled polyline clipping. @@ -1713,27 +1713,27 @@

    Methods

    Description - addLatLng( <LatLng> latlng ) + addLatLng( <LatLng> latlng ) this Adds a given point to the polyline. - setLatLngs( <LatLng[]> latlngs ) + setLatLngs( <LatLng[]> latlngs ) this Replaces all the points in the polyline with the given array of geographical points. - getLatLngs() + getLatLngs() LatLng[] Returns an array of the points in the path. - spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng1?, <LatLng> latlng2?, … ) + spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng1?, <LatLng> latlng2?, … ) LatLng[] Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). - getBounds() + getBounds() LatLngBounds Returns the LatLngBounds of the polyline. @@ -1753,7 +1753,7 @@

    Constructor

    Description - L.MultiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) + L.MultiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object. @@ -1772,7 +1772,7 @@

    Constructor

    Description - L.Polygon( <LatLng[]> latlngs, <Polyline options> options? ) + L.Polygon( <LatLng[]> latlngs, <Polyline options> options? ) Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. @@ -1793,7 +1793,7 @@

    Constructor

    Description - L.MultiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) + L.MultiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline). @@ -1828,7 +1828,7 @@

    Constructor

    Description - L.Rectangle( <LatLngBounds> bounds, <Path options> options? ) + L.Rectangle( <LatLngBounds> bounds, <Path options> options? ) Instantiates a rectangle object with the given geographical bounds and optionally an options object. @@ -1844,7 +1844,7 @@

    Methods

    Description - setBounds( <LatLngBounds> bounds ) + setBounds( <LatLngBounds> bounds ) this Redraws the rectangle with the passed bounds. @@ -1863,7 +1863,7 @@

    Constructor

    Description - L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? ) + L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? ) Instantiates a circle object given a geographical point, a radius in meters and optionally an options object. @@ -1877,22 +1877,22 @@

    Methods

    Description - getLatLng() + getLatLng() LatLng Returns the current geographical position of the circle. - getRadius() + getRadius() Number Returns the current radius of a circle. Units are in meters. - setLatLng( <LatLng> latlng ) + setLatLng( <LatLng> latlng ) this Sets the position of a circle to a new location. - setRadius( <Number> radius ) + setRadius( <Number> radius ) this Sets the radius of a circle. Units are in meters. @@ -1912,7 +1912,7 @@

    Constructor

    Description - L.CircleMarker( <LatLng> latlng, <Path options> options? ) + L.CircleMarker( <LatLng> latlng, <Path options> options? ) Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object. @@ -1926,12 +1926,12 @@

    Methods

    Description - setLatLng( <LatLng> latlng ) + setLatLng( <LatLng> latlng ) this Sets the position of a circle marker to a new location. - setRadius( <Number> radius ) + setRadius( <Number> radius ) this Sets the radius of a circle marker. Units are in pixels. @@ -1959,7 +1959,7 @@

    Constructor

    Description - L.LayerGroup( <ILayer[]> layers? ) + L.LayerGroup( <ILayer[]> layers? ) Create a layer group, optionally given an initial set of layers. @@ -1973,17 +1973,17 @@

    Methods

    Description - addLayer( <ILayer> layer ) + addLayer( <ILayer> layer ) this Adds a given layer to the group. - removeLayer( <ILayer> layer ) + removeLayer( <ILayer> layer ) this Removes a given layer from the group. - clearLayers() + clearLayers() this Removes all the layers from the group. @@ -2013,7 +2013,7 @@

    Constructor

    Description - L.FeatureGroup( <IFeature[]> layers? ) + L.FeatureGroup( <IFeature[]> layers? ) Create a layer group, optionally given an initial set of layers. @@ -2029,12 +2029,12 @@

    Methods

    Description - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( <String> htmlContent, <Popup options> options? ) this Binds a popup with a particular HTML content to a click on any layer from the group. - getBounds() + getBounds() LatLngBounds Returns the LatLngBounds of the Feature Group. @@ -2051,22 +2051,22 @@

    Events

    Description - click + click MouseEvent Fired when the user clicks (or taps) the group. - dblclick + dblclick MouseEvent Fired when the user double-clicks (or double-taps) the group. - mouseover + mouseover MouseEvent Fired when the mouse enters the group. - mouseout + mouseout MouseEvent Fired when the mouse leaves the group. @@ -2094,7 +2094,7 @@

    Constructor

    Description - L.GeoJSON( <Object> geojson?, <GeoJSON options> options? ) + L.GeoJSON( <Object> geojson?, <GeoJSON options> options? ) Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it with addGeoJSON method) and an options object. @@ -2109,9 +2109,9 @@

    Options

    Description - pointToLayer + pointToLayer Function - null + null Function of the form (LatLng) -> ILayer that will be used for creating layers for GeoJSON points (if not specified, markers will be created). @@ -2128,7 +2128,7 @@

    Events

    Description - featureparse + featureparse GeoJSONEvent Fired before an object converted from a GeoJSON feature is added to the map. This event can be used to add interaction or change styling of objects depending on feature properties. @@ -2145,7 +2145,7 @@

    Methods

    Description - addGeoJSON( <Object> geojson ) + addGeoJSON( <Object> geojson ) Boolean Adds a GeoJSON object to the layer. @@ -2160,17 +2160,17 @@

    Static methods

    Description - geometryToLayer( <Object> geojson, <Function> pointToLayer? ) + geometryToLayer( <Object> geojson, <Function> pointToLayer? ) ILayer Creates a layer from a given GeoJSON geometry. - coordsToLatlng( <Array> coords, <Boolean> reverse? ) + coordsToLatlng( <Array> coords, <Boolean> reverse? ) LatLng Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). - coordsToLatlngs( <Array> coords, <Number> levelsDeep?, <Boolean> reverse? ) + coordsToLatlngs( <Array> coords, <Number> levelsDeep?, <Boolean> reverse? ) Array Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). @@ -2192,7 +2192,7 @@

    Constructor

    Description - L.LatLng( <Number> latitude, <Number> longitude, <Boolean> noWrap? ) + L.LatLng( <Number> latitude, <Number> longitude, <Boolean> noWrap? ) Creates an object representing a geographical point with the given latitude and longitude. Wraps longitude to lie between -180 and 180 and clamps longitude between -90 and 90 by default — you can disable this with the noWrap argument. @@ -2206,12 +2206,12 @@

    Properties

    Description - lat + lat Number Latitude in degrees. - lng + lng Number Longitude in degrees. @@ -2226,17 +2226,17 @@

    Methods

    Description - distanceTo( <LatLng> otherLatlng ) + distanceTo( <LatLng> otherLatlng ) Number Returns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia - equals( <LatLng> otherLatlng ) + equals( <LatLng> otherLatlng ) Boolean - Returns true if the given LatLng point is at the same position (within a small margin of error). + Returns true if the given LatLng point is at the same position (within a small margin of error). - toString() + toString() String Returns a string representation of the point (for debugging purposes). @@ -2252,21 +2252,21 @@

    Constants

    Description - DEG_TO_RAD + DEG_TO_RAD Number - Math.PI / 180 + Math.PI / 180 A multiplier for converting degrees into radians. - RAD_TO_DEG + RAD_TO_DEG Number - 180 / Math.PI + 180 / Math.PI A multiplier for converting radians into degrees. - MAX_MARGIN + MAX_MARGIN Number - 1.0E-9 + 1.0E-9 Max margin of error for the equality check. @@ -2289,11 +2289,11 @@

    Constructor

    Description - L.LatLngBounds( <LatLng> southWest, <LatLng> northEast ) + L.LatLngBounds( <LatLng> southWest, <LatLng> northEast ) Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle. - L.LatLngBounds( <LatLng[]> latlngs ) + L.LatLngBounds( <LatLng[]> latlngs ) Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds. @@ -2307,57 +2307,57 @@

    Methods

    Description - extend( <LatLng|LatLngBounds> latlng ) + extend( <LatLng|LatLngBounds> latlng ) this Extends the bounds to contain the given point or bounds. - getSouthWest() + getSouthWest() LatLng Returns the south-west point of the bounds. - getNorthEast() + getNorthEast() LatLng Returns the north-east point of the bounds. - getNorthWest() + getNorthWest() LatLng Returns the north-west point of the bounds. - getSouthEast() + getSouthEast() LatLng Returns the south-east point of the bounds. - getCenter() + getCenter() LatLng Returns the center point of the bounds. - contains( <LatLngBounds> otherBounds ) + contains( <LatLngBounds> otherBounds ) Boolean Returns true if the rectangle contains the given one. - contains( <LatLng> latlng ) + contains( <LatLng> latlng ) Boolean Returns true if the rectangle contains the given point. - intersects( <LatLngBounds> otherBounds ) + intersects( <LatLngBounds> otherBounds ) Boolean Returns true if the rectangle intersects the given bounds. - equals( <LatLngBounds> otherBounds ) + equals( <LatLngBounds> otherBounds ) Boolean Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. - toBBoxString() + toBBoxString() String Returns a string with bounding box coordinates in a "southwest_lng,southwest_lat,northeast_lng,northeast_lat" format. Useful for sending requests to web services that return geo data. @@ -2378,7 +2378,7 @@

    Constructor

    Description - L.Point( <Number> x, <Number> y, <Boolean> round? ) + L.Point( <Number> x, <Number> y, <Boolean> round? ) Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. @@ -2392,12 +2392,12 @@

    Properties

    Description - x + x Number The x coordinate. - y + y Number The y coordinate. @@ -2412,42 +2412,42 @@

    Methods

    Description - add( <Point> otherPoint ) + add( <Point> otherPoint ) Point Returns the result of addition of the current and the given points. - subtract( <Point> otherPoint ) + subtract( <Point> otherPoint ) Point Returns the result of subtraction of the given point from the current. - multiplyBy( <Number> number ) + multiplyBy( <Number> number ) Point Returns the result of multiplication of the current point by the given number. - divideBy( <Number> number, <Boolean> round? ) + divideBy( <Number> number, <Boolean> round? ) Point Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. - distanceTo( <Point> otherPoint ) + distanceTo( <Point> otherPoint ) Number Returns the distance between the current and the given points. - clone() + clone() Point Returns a copy of the current point. - round() + round() Point Returns a copy of the current point with rounded coordinates. - toString() + toString() String Returns a string representation of the point for debugging purposes. @@ -2470,11 +2470,11 @@

    Constructor

    Description - L.Bounds( <Point> topLeft, <Point> bottomRight ) + L.Bounds( <Point> topLeft, <Point> bottomRight ) Creates a Bounds object from two coordinates (usually top-left and bottom-right corners). - L.LatLngBounds( <Point[]> points ) + L.LatLngBounds( <Point[]> points ) Creates a Bounds object defined by the points it contains. @@ -2488,12 +2488,12 @@

    Properties

    Description - min + min Point The top left corner of the rectangle. - max + max Point The bottom right corner of the rectangle. @@ -2508,27 +2508,27 @@

    Methods

    Description - extend( <Point> point ) + extend( <Point> point ) - Extends the bounds to contain the given point. - getCenter() + getCenter() Point Returns the center point of the bounds. - contains( <Bounds> otherBounds ) + contains( <Bounds> otherBounds ) Boolean Returns true if the rectangle contains the given one. - contains( <Point> point ) + contains( <Point> point ) Boolean Returns true if the rectangle contains the given point. - intersects( <Bounds> otherBounds ) + intersects( <Bounds> otherBounds ) Boolean Returns true if the rectangle intersects the given bounds. @@ -2560,7 +2560,7 @@

    Constructor

    Description - L.Icon( <Icon properties> props ) + L.Icon( <Icon properties> props ) Creates an icon instance with the given properties. @@ -2574,37 +2574,37 @@

    Properties

    Description - iconUrl + iconUrl String (required) The URL to the icon image (absolute or relative to your script path). - iconSize + iconSize Point Size of the icon image in pixels. - iconAnchor + iconAnchor Point The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location. - shadowUrl + shadowUrl String The URL to the icon shadow image. If shadowUrl is null then no shadow image will be created. - shadowSize + shadowSize Point Size of the shadow image in pixels. - shadowOffset + shadowOffset Point Position of the shadow relative to the icon ((0, 0) by default) - popupAnchor + popupAnchor Point The point from which the marker popup opens, relative to the anchor point. @@ -2623,7 +2623,7 @@

    Constructor

    Description - L.Control.Zoom() + L.Control.Zoom() Creates a zoom control. @@ -2641,7 +2641,7 @@

    Constructor

    Description - L.Control.Attribution() + L.Control.Attribution() Creates an attribution control. @@ -2654,17 +2654,17 @@

    Methods

    Description - setPrefix( <String> prefix ) + setPrefix( <String> prefix ) - Sets the string before the attributions ("Powered by Leaflet" by default). - addAttribution( <String> text ) + addAttribution( <String> text ) - Adds an attribution text (e.g. "Vector data &copy; CloudMade"). - removeAttribution( <String> text ) + removeAttribution( <String> text ) - Removes an attribution text. @@ -2696,7 +2696,7 @@

    Constructor

    Description - L.Control.Layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? ) + L.Control.Layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? ) Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. @@ -2709,17 +2709,17 @@

    Methods

    Description - addBaseLayer( <ILayer> layer, <String> name ) + addBaseLayer( <ILayer> layer, <String> name ) this Adds a base layer (radio button entry) with the given name to the control. - addOverlay( <ILayer> layer, <String> name ) + addOverlay( <ILayer> layer, <String> name ) this Adds an overlay (checkbox entry) with the given name to the control. - removeLayer( <ILayer> layer ) + removeLayer( <ILayer> layer ) this Remove the given layer from the control. @@ -2735,10 +2735,10 @@

    Options

    Description - collapsed + collapsed Boolean - true - If true, the control will be collapsed into an icon and expanded on mouse hover or touch. + true + If true, the control will be collapsed into an icon and expanded on mouse hover or touch. @@ -2756,7 +2756,7 @@

    Layer Config

    Events methods

    -

    A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

    +

    A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

    Example

    @@ -2779,37 +2779,37 @@

    Methods

    Description - addEventListener( <String> type, <Function> fn, <Object> context? ) + addEventListener( <String> type, <Function> fn, <Object> context? ) this Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). - removeEventListener( <String> type, <Function> fn, <Object> context? ) + removeEventListener( <String> type, <Function> fn, <Object> context? ) this Removes a previously added listener function. - on( … ) + on( … ) this Alias to addEventListener. - off( … ) + off( … ) this Alias to removeEventListener. - hasEventListeners( <String> type ) + hasEventListeners( <String> type ) Boolean - Returns true if a particular event type has some listeners attached to it. + Returns true if a particular event type has some listeners attached to it. - fireEvent( <String> type, <Object> data? ) + fireEvent( <String> type, <Object> data? ) this Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. - fire( … ) + fire( … ) this Alias to fireEvent. @@ -2835,12 +2835,12 @@

    Event

    description - type + type String - The event type (e.g. "click"). + The event type (e.g. 'click'). - target + target Object The object that fired the event. @@ -2855,12 +2855,12 @@

    MouseEvent

    description - latlng + latlng LatLng The geographical point where the mouse event occured. - layerPoint + layerPoint Point Pixel coordinates of the point where the mouse event occured relative to the map layer. @@ -2875,17 +2875,17 @@

    LocationEvent

    description - latlng + latlng LatLng Detected geographical location of the user. - bounds + bounds LatLngBounds Geographical bounds of the area user is located in (with respect to the accuracy of location). - accuracy + accuracy Number Accuracy of location in meters. @@ -2900,12 +2900,12 @@

    ErrorEvent

    description - message + message String Error message. - code + code Number Error code (if applicable). @@ -2920,7 +2920,7 @@

    LayerEvent

    description - layer + layer ILayer The layer that was added or removed. @@ -2935,22 +2935,22 @@

    GeoJSON event

    description - layer + layer ILayer The layer for the GeoJSON feature that is being added to the map. - properties + properties Object GeoJSON properties of the feature. - geometryType + geometryType String GeoJSON geometry type of the feature. - id + id String GeoJSON ID of the feature (if present). @@ -2965,7 +2965,7 @@ description - popup + popup Popup The popup that was opened or closed. @@ -3028,7 +3028,7 @@

    Inheritance

    var a = new MyChildClass(); a.greet('Jason'); // alerts "Yo, bro Jason!"
    -

    Options

    +

    Options

    options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

    @@ -3086,7 +3086,7 @@

    Includes

    You can also do such includes in runtime with the include method:

    -
    MyClass.include(MyMixin);
    +
    MyClass.include(MyMixin);

    Statics

    @@ -3118,64 +3118,69 @@

    L.Browser

    description - ie + ie Boolean true for all old Internet Explorer versions (6-8). - ie6 + ie6 Boolean true for Internet Explorer 6. - webkit + webkit Boolean true for webkit-based browsers like Chrome and Safari (including mobile versions). - webkit3d + webkit3d Boolean true for webkit-based browsers that support CSS 3D transformations. - gecko + gecko Boolean true for Gecko-based browsers like Firefox and Mozilla. - opera + opera Boolean true for Opera. - android + android Boolean true for Android mobile browser. - mobile + mobile Boolean true for modern mobile browsers (including iOS Safari and different Android browsers). - mobileWebkit + mobileWebkit Boolean true for mobile webkit-based browsers. - mobileOpera + mobileOpera Boolean true for mobile Opera. - touch + touch Boolean true for all browsers on touch devices. +

    L.Util

    -

    Utility functions.

    + +

    Various utility functions, used by Leaflet internally.

    + +

    Methods

    + @@ -3183,83 +3188,94 @@

    L.Util

    - - - + + + - - - + + + - - + + - - - - + + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - +
    Method Description
    extend(<Object> dest, <Object> src...)ObjectMerge the properties of (multiple) src object properties into dest and returns dest.extend( <Object> dest, <Object> src?.. )ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter.
    bind(<Function> fn, <Object> obj)FunctionReturn a function which calls function fn with scope obj.bind( <Function> fn, <Object> obj )FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code).
    stamp(<Object> obj)Stringstamp( <Object> obj )String Applies a unique key to the object and returns that key.
    limitExecByInterval(<Function> fn, <Number> time, <Object> context)FunctionReturns a wrapper around a function that makes sure it's called not more often than a certain interval, but as fast as possible otherwise.limitExecByInterval( <Function> fn, <Number> time, <Object> context? )FunctionReturns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called.
    falseFn()FunctionfalseFn()Function Returns a function which always returns false.
    formatNum(<Number> num, <Number> digits)NumberformatNum( <Number> num, <Number> digits )Number Returns the number num rounded to digits decimals.
    splitWords(<String> str)String[]Splits the string on spaces and returns the array of parts.splitWords( <String> str )String[]Trims and splits the string on whitespace and returns the array of parts.
    setOptions(<Object> obj, <Object> options)ObjectSet the options in options in obj, return the options of obj afterwards.setOptions( <Object> obj, <Object> options )ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options.
    getParamString(<Object> obj)StringConvert a map in to a parameter string, including a question mark symbol. Example: {a: "foo", b: "bar"} translates to ?a=foo&b=bar.getParamString( <Object> obj )StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'.
    template(<String> str, <Object> data)StringApplies the values of the data map to a template like "{a}, {b}, {c}".template( <String> str, <Object> data )StringSimple templating facility, creates a string by applying the values of the data object of a form {a: 'foo', b: 'bar', ...} to a template string of the form 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'.
    + +

    Properties

    + + - - - + + + + + + + +
    emptyImageUrlStringString containing a base64 encoded empty gif image.PropertyTypeDescription
    emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. Used as a hack to free memory from unused images on WebKit-powered mobile devices (by setting image src to this string).
    +

    L.DomUtil

    Utility functions to work with the DOM tree, used by Leaflet internally.

    +

    Methods

    + @@ -3267,82 +3283,102 @@

    L.DomUtil

    - - + + - + - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - +
    Method Description
    get( <String or HTMLElement> id )HTMLElementget( <String or HTMLElement> id )HTMLElement Returns an element with the given id if a string was passed, or just returns the element if it was passed directly.
    getStyle( <HTMLElement> el, <String> style )getStyle( <HTMLElement> el, <String> style ) String Returns the value for a certain style attribute on an element, including computed values or values set through CSS.
    getViewportOffset( <HTMLElement> el )PointgetViewportOffset( <HTMLElement> el )Point Returns the offset to the viewport for the requested element.
    create( <String> tagName, <String> className, <HTMLElement> container? )create( <String> tagName, <String> className, <HTMLElement> container? ) HTMLElement Creates an element with tagName, sets the className, and optionally appends it to container element.
    disableTextSelection()disableTextSelection() - Makes sure text cannot be selected, for example during dragging.
    enableTextSelection()enableTextSelection() - Makes text selection possible again.
    hasClass( <HTMLElement> el, <String> name )hasClass( <HTMLElement> el, <String> name ) Boolean Returns true if the element class attribute contains name.
    addClass( <HTMLElement> el, <String> name )addClass( <HTMLElement> el, <String> name ) - Adds name to the element's class attribute.
    removeClass( <HTMLElement> el, <String> name )removeClass( <HTMLElement> el, <String> name ) - Removes name from the element's class attribute.
    setOpacity( <HTMLElement> el, <Number> value )setOpacity( <HTMLElement> el, <Number> value ) - Set the opacity of an element (including old IE support). Value must be from 0 to 1.
    testProp( <String[]> props )String or falsetestProp( <String[]> props )String or false Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform.
    getTranslateString( <Point> point )getTranslateString( <Point> point ) StringReturns a CSS transform string to move an element by the offset provided in the given point.Returns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers.
    getScaleString( <Number> scale, <Point> origin )getScaleString( <Number> scale, <Point> origin ) String Returns a CSS transform string to scale an element (with the given scale origin).
    setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? )setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? ) - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true.
    getPosition( <HTMLElement> el )getPosition( <HTMLElement> el ) Point Returns the coordinates of an element previously positioned with setPosition.
    +

    Properties

    + + + + + + + + + + + + + + + + + +
    PropertyTypeDescription
    TRANSITIONStringVendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit).
    TRANSFORMStringVendor-prefixed transform style name.
    +

    IHandler

    An interface implemented by interaction handlers.

    @@ -3354,19 +3390,19 @@

    IHandler

    Description - enable() + enable() - Enables the handler. - disable() + disable() - Disables the handler. - enabled() + enabled() Boolean - Returns true if the handler is enabled. + Returns true if the handler is enabled. From 8fd1ee8d53c01b3f10348991d4fbcc667a030bca Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Jul 2012 14:47:00 +0300 Subject: [PATCH 0141/2207] update docs toc --- reference.html | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/reference.html b/reference.html index cb89d284748..cf8db7c7d21 100644 --- a/reference.html +++ b/reference.html @@ -134,6 +134,7 @@

    Controls

  • Zoom
  • Attribution
  • Layers
  • +
  • Scale
  • @@ -147,8 +148,9 @@

    Utility

  • Class
  • Browser
  • Util
  • - +
  • Transformation
  • +
  • LineUtil
  • +
  • PolyUtil
  • DOM utility

    -

    Interfaces

    @@ -175,14 +173,14 @@

    Interfaces

    Misc


    -

    This reference reflects Leaflet 0.4. You can find docs for the in-progress master version in reference.html of gh-pages-master branch.

    +

    This reference reflects Leaflet 0.4. You can find docs for the in-progress master version in reference.html of gh-pages-master branch.
    Grayed out things are not yet documented but planned to be.

    L.Map

    From a08d7bcb6ecaec4f244b1e7ea3cd2124ea714747 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Jul 2012 14:51:24 +0300 Subject: [PATCH 0142/2207] bring cdn links back! --- download.html | 10 +++++----- examples/quick-start.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/download.html b/download.html index 3cb5cbb6fce..5f98f239cb6 100644 --- a/download.html +++ b/download.html @@ -66,15 +66,15 @@

    Download Leaflet

    View Changelog

    -

    Including Leaflet on your web page

    +

    Using a hosted version of Leaflet

    -

    After downloading Leaflet and extracting the contents of the dist folder somewhere in your project directory, place this code in the head section of your HTML:

    -
    <link rel="stylesheet" href="[path-to-dist]/leaflet.css" />
    +		

    The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the head section of your HTML:

    +
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.css" />
     <!--[if lte IE 8]>
    -	<link rel="stylesheet" href="[path-to-dist]/leaflet.ie.css" />
    +	<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.ie.css" />
     <![endif]-->
     
    -<script src="[path-to-dist]/leaflet.js"></script>
    +<script src="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.js"></script>

    Building a custom version of Leaflet

    Open build/build.html page from the download package, check the components you want to see in your build and then follow the instructions there.

    diff --git a/examples/quick-start.html b/examples/quick-start.html index 4d60233a429..e7500df26ec 100644 --- a/examples/quick-start.html +++ b/examples/quick-start.html @@ -100,14 +100,14 @@

    Preparing your page

    1. Download Leaflet and put the contents of the dist folder somewhere in your project directory
    2. Include Leaflet CSS files in the head section of your document: -
      <link rel="stylesheet" href="[path-to-dist]/leaflet.css" />
      +			
      <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.css" />
       <!--[if lte IE 8]>
      -	<link rel="stylesheet" href="[path-to-dist]/leaflet.ie.css" />
      +	<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.ie.css" />
       <![endif]-->
    3. Include Leaflet JavaScript file somewhere on the page (preferably before body close tag): -
      <script src="[path-to-dist]/leaflet.js"></script>
    4. +
      <script src="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.js"></script>
       
       			
    5. Put a div element with a certain id where you want your map to be (making sure it has defined height):
      <div id="map" style="height: 200px"></div>
    6. From 5fec0c5c37b951e9d0d39851da5ef6df3930ae48 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 12 Jul 2012 01:00:34 +0300 Subject: [PATCH 0143/2207] more docs cleanup --- docs/css/screen.css | 4 +++- examples/custom-icons-example.html | 30 ++++++++++++------------------ reference.html | 12 ++++++------ 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 72c001303a9..14e29bd27db 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -100,7 +100,9 @@ th { background:/*#e5ecf9;*/ #f3f3f3; } th, td { - padding: 4px 5px; + padding: 6px 8px; + vertical-align: top; + line-height: 1.4; } diff --git a/examples/custom-icons-example.html b/examples/custom-icons-example.html index edac752f3ed..cb6c521a61f 100644 --- a/examples/custom-icons-example.html +++ b/examples/custom-icons-example.html @@ -14,22 +14,21 @@ diff --git a/reference.html b/reference.html index cf8db7c7d21..1fd4813dd46 100644 --- a/reference.html +++ b/reference.html @@ -262,7 +262,7 @@

      Options

      crs CRS - L.CRS.EPSG3857 + L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means. @@ -488,7 +488,7 @@

      Methods that modify map state

      Description - setView( <LatLng> center, <Number> zoom, <Boolean>forceReset? ) + setView( <LatLng> center, <Number> zoom, <Boolean> forceReset? ) this Sets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default). @@ -937,8 +937,8 @@

      Options

      icon L.Icon - L.Icon - Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. + * + Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default. clickable @@ -1726,7 +1726,7 @@

      Methods

      Returns an array of the points in the path. - spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng1?, <LatLng> latlng2?, … ) + spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng?, … ) LatLng[] Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). @@ -3247,7 +3247,7 @@

      Methods

      template( <String> str, <Object> data ) String - Simple templating facility, creates a string by applying the values of the data object of a form {a: 'foo', b: 'bar', ...} to a template string of the form 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'. + Simple templating facility, creates a string by applying the values of the data object of a form {a: 'foo', b: 'bar', …} to a template string of the form 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'. From 4994095ff2f99d9b1f546a29a3cb98d195a2cc74 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 12 Jul 2012 01:18:00 +0300 Subject: [PATCH 0144/2207] docs styling tweaks --- docs/css/screen.css | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 14e29bd27db..e293ea6ed02 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -95,15 +95,24 @@ pre code a:hover { table { border-collapse: collapse; + box-shadow: 0 3px 15px #f0f0f0; } th { - background:/*#e5ecf9;*/ #f3f3f3; + background-color: #f3f3f3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#e7e7e7)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #f3f3f3, #e7e7e7); /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #f3f3f3, #e7e7e7); /* FF3.6+ */ + background-image: -o-linear-gradient(top, #f3f3f3, #e7e7e7); /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #f3f3f3, #e7e7e7); } th, td { padding: 6px 8px; vertical-align: top; - line-height: 1.4; + /*line-height: 1.4;*/ } +td { + /*border-right: 1px solid #eee;*/ +} .nav { From ec30171f4fc4106214630fc985b57a0a000dad7a Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 12 Jul 2012 01:21:04 +0300 Subject: [PATCH 0145/2207] minor tweaks --- docs/css/screen.css | 20 ++++++++++---------- reference.html | 18 +++++++++--------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index e293ea6ed02..b969a4456fd 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -87,23 +87,23 @@ code { -webkit-box-shadow: 0 0 15px #ddd; } pre code a { - text-decoration: none; - } + text-decoration: none; + } pre code a:hover { - text-decoration: underline; - } + text-decoration: underline; + } table { border-collapse: collapse; box-shadow: 0 3px 15px #f0f0f0; } th { - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#e7e7e7)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #f3f3f3, #e7e7e7); /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, #f3f3f3, #e7e7e7); /* FF3.6+ */ - background-image: -o-linear-gradient(top, #f3f3f3, #e7e7e7); /* Opera 11.10+ */ - background-image: linear-gradient(to bottom, #f3f3f3, #e7e7e7); + background-color: #f3f3f3; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#e7e7e7)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #f3f3f3, #e7e7e7); /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #f3f3f3, #e7e7e7); /* FF3.6+ */ + background-image: -o-linear-gradient(top, #f3f3f3, #e7e7e7); /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #f3f3f3, #e7e7e7); } th, td { padding: 6px 8px; diff --git a/reference.html b/reference.html index 1fd4813dd46..4aafc9ab2a8 100644 --- a/reference.html +++ b/reference.html @@ -220,7 +220,7 @@

      Options

      Option Type - Default value + Default Description @@ -931,7 +931,7 @@

      Options

      Option Type - Default value + Default Description @@ -1124,7 +1124,7 @@ Option Type - Default value + Default Description @@ -1227,7 +1227,7 @@

      Options

      Option Type - Default value + Default Description @@ -1378,7 +1378,7 @@

      Options

      Option Type - Default value + Default Description @@ -1499,7 +1499,7 @@

      Options

      Option Type - Default value + Default Description @@ -1683,7 +1683,7 @@

      Options

      Option Type - Default value + Default Description @@ -2103,7 +2103,7 @@

      Options

      Option Type - Default value + Default Description @@ -2729,7 +2729,7 @@

      Options

      Option Type - Default value + Default Description From 8769c43b3b4f78e729e87031e7b09040970c4d75 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 12 Jul 2012 01:29:44 +0300 Subject: [PATCH 0146/2207] fix link color on examples --- docs/css/screen.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index b969a4456fd..a048d491631 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -250,7 +250,7 @@ a.nodocs { h3 span { color: #888; } -h3 a { +h3.alt a { color: #888; } From 73cf121a2ab8ef207311e04c019181889d8fde73 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 12 Jul 2012 01:32:00 +0300 Subject: [PATCH 0147/2207] add missing heading in docs --- reference.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reference.html b/reference.html index 4aafc9ab2a8..816ca8d88a7 100644 --- a/reference.html +++ b/reference.html @@ -203,6 +203,8 @@

      Usage example

      Constructor

      + + @@ -617,6 +619,11 @@

      Methods that get map state

      Methods for layers and controls

      Constructor
      + + + + + From eb9c1bfc4ffe18414c8b938bf7217f63b90b1bad Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 12 Jul 2012 11:22:58 +0300 Subject: [PATCH 0148/2207] tweak docs col widths to make it nicer --- docs/css/screen.css | 18 ++++- reference.html | 188 ++++++++++++++++++++++---------------------- 2 files changed, 111 insertions(+), 95 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index a048d491631..8fa47ea4b13 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -106,7 +106,7 @@ th { background-image: linear-gradient(to bottom, #f3f3f3, #e7e7e7); } th, td { - padding: 6px 8px; + padding: 8px 10px; vertical-align: top; /*line-height: 1.4;*/ } @@ -304,4 +304,20 @@ table td code i { table td code b { color: black; font-weight: normal; +} + +th.width250 { + width: 250px; +} +th.width200 { + width: 200px; +} +th.width300 { + width: 300px; +} +th.width100 { + width: 100px; +} +th.minwidth { + width: 1px; } \ No newline at end of file diff --git a/reference.html b/reference.html index 816ca8d88a7..455070408d9 100644 --- a/reference.html +++ b/reference.html @@ -207,7 +207,7 @@

      Constructor

      MethodReturnsDescription
      addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? ) this
      - + @@ -667,7 +667,7 @@

      Conversion methods

      ConstructorConstructor Description
      - + @@ -682,39 +682,39 @@

      Conversion methods

      - + - + - + - - - - + + + - - - + + + - + - + - + - + - + - +
      MethodMethod Returns Description
      Returns the geographical coordinates of a given map layer point.
      mouseEventToContainerPoint( <MouseEvent> event )containerPointToLayerPoint( <Point> point ) PointReturns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object.Converts the point relative to the map container to a point relative to the map layer.
      mouseEventToLayerPoint( <MouseEvent> event )layerPointToContainerPoint( <Point> point ) PointReturns the pixel coordinates of a mouse click relative to the map layer given its event object. + Converts the point relative to the map layer to a point relative to the map container.
      mouseEventToLatLng( <MouseEvent> event )LatLngReturns the geographical coordinates of the point the mouse clicked on given the click's event object.project( <LatLng> latlng, <Number> zoom? )PointProjects the given geographical coordinates to absolute pixel coordinates for the given zoom level (current zoom level by default).
      containerPointToLayerPoint( <Point> point )PointConverts the point relative to the map container to a point relative to the map layer.unproject( <Point> point, <Number> zoom? )LatLngProjects the given absolute pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).
      layerPointToContainerPoint( <Point> point )mouseEventToContainerPoint( <MouseEvent> event ) PointConverts the point relative to the map layer to a point relative to the map container.Returns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object.
      project( <LatLng> latlng, <Number> zoom? )mouseEventToLayerPoint( <MouseEvent> event ) PointProjects the given geographical coordinates to pixel coordinates for the given zoom level (current zoom level by default).Returns the pixel coordinates of a mouse click relative to the map layer given its event object.
      unproject( <Point> point, <Number> zoom? )mouseEventToLatLng( <MouseEvent> event ) LatLngProjects the given pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).Returns the geographical coordinates of the point the mouse clicked on given the click's event object.
      @@ -798,8 +798,8 @@

      Properties

      - - + + @@ -869,8 +869,8 @@

      Map panes

      PropertyTypePropertyType Description
      - - + + @@ -923,7 +923,7 @@

      Constructor

      PropertyTypePropertyType Description
      - + @@ -979,8 +979,8 @@

      Events

      ConstructorConstructor Description
      - - + + @@ -1083,8 +1083,8 @@

      Interaction handlers

      EventDataEventData Description
      - - + + @@ -1176,8 +1176,8 @@

      Methods

      PropertyTypePropertyType Description
      - - + + @@ -1207,7 +1207,7 @@

      Constructor

      MethodReturnsMethodReturns Description
      - + @@ -1368,7 +1368,7 @@

      Constructor

      ConstructorConstructor Description
      - + @@ -1383,9 +1383,9 @@

      Options

      ConstructorConstructor Description
      - - - + + + @@ -1439,7 +1439,7 @@

      Constructor

      OptionTypeDefaultOptionTypeDefault Description
      - + @@ -1486,7 +1486,7 @@

      Constructor

      ConstructorConstructor Description
      - + @@ -1506,7 +1506,7 @@

      Options

      - + @@ -1565,8 +1565,8 @@

      Events

      ConstructorConstructor Description
      Option TypeDefaultDefault Description
      - - + + @@ -1596,7 +1596,7 @@

      Events

      EventDataEventData Description
      -

      Constants

      +

      Properties

      @@ -1633,7 +1633,7 @@

      Constants

      Methods

      Constant
      - + @@ -1673,7 +1673,7 @@

      Constructor

      MethodMethod Returns Description
      - + @@ -1713,7 +1713,7 @@

      Methods

      ConstructorConstructor Description
      - + @@ -1829,7 +1829,7 @@

      Constructor

      MethodMethod Returns Description
      - + @@ -1844,7 +1844,7 @@

      Methods

      ConstructorConstructor Description
      - + @@ -1877,8 +1877,8 @@

      Methods

      MethodMethod Returns Description
      - - + + @@ -1913,7 +1913,7 @@

      Constructor

      MethodReturnsMethodReturns Description
      - + @@ -1926,8 +1926,8 @@

      Methods

      ConstructorConstructor Description
      - - + + @@ -1960,7 +1960,7 @@

      Constructor

      MethodReturnsMethodReturns Description
      - + @@ -1973,8 +1973,8 @@

      Methods

      ConstructorConstructor Description
      - - + + @@ -2014,7 +2014,7 @@

      Constructor

      MethodReturnsMethodReturns Description
      - + @@ -2029,7 +2029,7 @@

      Methods

      ConstructorConstructor Description
      - + @@ -2051,8 +2051,8 @@

      Events

      MethodMethod Returns Description
      - - + + @@ -2145,8 +2145,8 @@

      Methods

      EventDataEventData Description
      - - + + @@ -2193,7 +2193,7 @@

      Constructor

      MethodReturnsMethodReturns Description
      - + @@ -2206,8 +2206,8 @@

      Properties

      ConstructorConstructor Description
      - - + + @@ -2251,9 +2251,9 @@

      Constants

      PropertyTypePropertyType Description
      - - - + + + @@ -2290,7 +2290,7 @@

      Constructor

      ConstantTypeValueConstantTypeValue Description
      - + @@ -2307,7 +2307,7 @@

      Methods

      ConstructorConstructor Description
      - + @@ -2364,7 +2364,7 @@

      Methods

      - +
      MethodMethod Returns Description
      toBBoxString() StringReturns a string with bounding box coordinates in a "southwest_lng,southwest_lat,northeast_lng,northeast_lat" format. Useful for sending requests to web services that return geo data.Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
      @@ -2379,7 +2379,7 @@

      Constructor

      - + @@ -2392,8 +2392,8 @@

      Properties

      ConstructorConstructor Description
      - - + + @@ -2471,7 +2471,7 @@

      Constructor

      PropertyTypePropertyType Description
      - + @@ -2488,8 +2488,8 @@

      Properties

      ConstructorConstructor Description
      - - + + @@ -2508,7 +2508,7 @@

      Methods

      PropertyTypePropertyType Description
      - + @@ -2561,7 +2561,7 @@

      Constructor

      MethodMethod Returns Description
      - + @@ -2624,7 +2624,7 @@

      L.Control.Zoom

      Constructor

      ConstructorConstructor Description
      - + @@ -2642,7 +2642,7 @@

      L.Control.Attribution

      Constructor

      ConstructorConstructor Description
      - + @@ -2835,8 +2835,8 @@

      Event

      ConstructorConstructor Description
      - - + + @@ -2855,7 +2855,7 @@

      MouseEvent

      propertytypepropertytype description
      - + @@ -2875,7 +2875,7 @@

      LocationEvent

      propertyproperty type description
      - + @@ -2900,8 +2900,8 @@

      ErrorEvent

      propertyproperty type description
      - - + + @@ -2920,8 +2920,8 @@

      LayerEvent

      propertytypepropertytype description
      - - + + @@ -2935,8 +2935,8 @@

      GeoJSON event

      propertytypepropertytype description
      - - + + @@ -2965,8 +2965,8 @@
      propertytypepropertytype description
      - - + + @@ -3118,8 +3118,8 @@

      L.Browser

      propertytypepropertytype description
      - - + + @@ -3390,8 +3390,8 @@

      IHandler

      propertytypepropertytype description
      - - + + From 20993a0cf69b19265fe2ac6678ddd73177e5801c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 12 Jul 2012 14:27:58 +0300 Subject: [PATCH 0149/2207] lots of docs updates regarding the new syntax --- docs/css/screen.css | 17 +++ docs/highlight/styles/github.css | 4 +- reference.html | 214 +++++++++++++++++++++++++------ 3 files changed, 194 insertions(+), 41 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 8fa47ea4b13..fea04c90ae8 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -320,4 +320,21 @@ th.width100 { } th.minwidth { width: 1px; +} + +table.factory-table { + width: 1px; +} + +table.factory-table td, table.factory-table th { + white-space: nowrap; + color: black; +} + +.factory-usage { + white-space: nowrap; +} + +.factory-usage code { + color: black; } \ No newline at end of file diff --git a/docs/highlight/styles/github.css b/docs/highlight/styles/github.css index a4f7deb78e4..dd05840d8de 100644 --- a/docs/highlight/styles/github.css +++ b/docs/highlight/styles/github.css @@ -10,7 +10,7 @@ pre code { background: #f8f8ff } -pre .comment, +code .comment, pre .template_comment, pre .diff .header, pre .javadoc { @@ -18,7 +18,7 @@ pre .javadoc { font-style: italic } -pre .keyword, +code .keyword, pre .css .rule .keyword, pre .winutils, pre .javascript .title, diff --git a/reference.html b/reference.html index 455070408d9..1d3122aed61 100644 --- a/reference.html +++ b/reference.html @@ -189,33 +189,32 @@

      L.Map

      Usage example

      // initialize the map on the "map" div with a given center and zoom
      -var map = new L.Map('map', {
      -	center: new L.LatLng(51.505, -0.09),
      +var map = L.map('map', {
      +	center: [51.505, -0.09],
       	zoom: 13
      -});
      -
      -// create a CloudMade tile layer
      -var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
      -	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18});
      -
      -// add the CloudMade layer to the map
      -map.addLayer(cloudmade);
      - -

      Constructor

      +}); - +

      Constructor

      MethodReturnsMethodReturns Description
      - + + +
      ConstructorConstructorUsage Description
      L.Map( <HTMLElement|String> id, <Map options> options? ) + new L.Map()
      + L.map() +
      Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.
      + + +

      Options

      @@ -924,10 +923,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.Marker( <LatLng> latlng, <Marker options> options? ) + new L.Marker()
      + L.marker() +
      Instantiates a Marker object given a geographical point and optionally an options object.
      @@ -1117,10 +1121,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.Popup( <Popup options> options?, <object> source? ) + new L.Popup()
      + L.popup() +
      Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers.
      @@ -1200,18 +1209,25 @@

      L.TileLayer

      Usage example

      -
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
      -	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18});
      +
      L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', {
      +	key: 'API-key',
      +	styleId: 997
      +}).addTo(map);

      Constructor

      + +
      ConstructorUsage Description
      L.TileLayer( <String> urlTemplate, <TileLayer options> options? ) + new L.TileLayer()
      + L.tileLayer() +
      Instantiates a tile layer object given a URL template and optionally an options object.
      @@ -1226,7 +1242,7 @@

      URL template

      You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

      -
      new L.TileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
      +
      L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});

      Options

      @@ -1369,10 +1385,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS options> options ) + new L.TileLayer.WMS()
      + L.tileLayer.wms() +
      Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
      @@ -1439,11 +1460,16 @@

      Constructor

      - + + +
      ConstructorConstructorUsage Description
      L.TileLayer.Canvas( <TileLayer options> options? ) + new L.TileLayer.Canvas()
      + L.tileLayer.canvas() +
      Instantiates a Canvas tile layer object given an options object (optionally).
      @@ -1452,7 +1478,7 @@

      Methods

      - + @@ -1475,22 +1501,25 @@

      L.ImageOverlay

      Usage example

      -
      var imageBounds = new L.LatLngBounds(
      -		new L.LatLng(40.712216,-74.22655),
      -		new L.LatLng(40.773941,-74.12544));
      +		
      var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
      +	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
       
      -var image = new L.ImageOverlay(
      -		"http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg", imageBounds);
      +L.imageOverlay(imageUrl, imageBounds).addTo(map);

      Constructor

      MethodMethod Returns Description
      + +
      ConstructorUsage Description
      L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds ) + new L.ImageOverlay()
      + L.imageOverlay() +
      Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to.
      @@ -1661,23 +1690,25 @@

      L.Polyline

      Usage example

      // create a red polyline from an arrays of LatLng points
      -var polyline = new L.Polyline(latlngs, {color: 'red'});
      +var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
       
       // zoom the map to the polyline
      -map.fitBounds(new L.LatLngBounds(latlngs));
      -
      -// add the polyline to the map
      -map.addLayer(polyline);
      +map.fitBounds(polyline.getBounds());

      Constructor

      + +
      ConstructorUsage Description
      L.Polyline( <LatLng[]> latlngs, <Polyline options> options? ) + new L.Polyline()
      + L.polyline() +
      Instantiates a polyline object given an array of geographical points and optionally an options object.
      @@ -1755,10 +1786,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.MultiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) + new L.MultiPolyline()
      + L.multiPolyline() +
      Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      @@ -1774,10 +1810,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.Polygon( <LatLng[]> latlngs, <Polyline options> options? ) + new L.Polygon()
      + L.polygon() +
      Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.
      @@ -1795,10 +1836,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.MultiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) + new L.MultiPolygon()
      + L.multiPolygon() +
      Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
      @@ -1830,10 +1876,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.Rectangle( <LatLngBounds> bounds, <Path options> options? ) + new L.Rectangle()
      + L.rectangle() +
      Instantiates a rectangle object with the given geographical bounds and optionally an options object.
      @@ -1865,10 +1916,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? ) + new L.Circle()
      + L.circle() +
      Instantiates a circle object given a geographical point, a radius in meters and optionally an options object.
      @@ -1914,10 +1970,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.CircleMarker( <LatLng> latlng, <Path options> options? ) + new L.CircleMarker()
      + L.circleMarker() +
      Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.
      @@ -1961,10 +2022,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.LayerGroup( <ILayer[]> layers? ) + new L.LayerGroup()
      + L.layerGroup() +
      Create a layer group, optionally given an initial set of layers.
      @@ -2015,10 +2081,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.FeatureGroup( <IFeature[]> layers? ) + new L.FeatureGroup()
      + L.featureGroup() +
      Create a layer group, optionally given an initial set of layers.
      @@ -2096,10 +2167,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.GeoJSON( <Object> geojson?, <GeoJSON options> options? ) + new L.GeoJSON()
      + L.geoJson() +
      Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it with addGeoJSON method) and an options object.
      @@ -2189,15 +2265,26 @@

      L.LatLng

      Represents a geographical point with a certain latitude and longitude.

      var latlng = new L.LatLng(50.5, 30.5);
      +

      All Leaflet methods that accept LatLng objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      + +
      map.panTo([50, 30]);
      +map.panTo(new L.LatLng(50, 30));
      +

      Constructor

      + +
      ConstructorUsage Description
      L.LatLng( <Number> latitude, <Number> longitude, <Boolean> noWrap? ) + new L.LatLng()
      + L.latLng()
      + L.latLng([]) +
      Creates an object representing a geographical point with the given latitude and longitude. Wraps longitude to lie between -180 and 180 and clamps longitude between -90 and 90 by default — you can disable this with the noWrap argument.
      @@ -2282,23 +2369,40 @@

      Constants

      L.LatLngBounds

      Represents a rectangular geographical area on a map.

      -
      var southWest = new L.LatLng(40.712,-74.227),
      -	northEast = new L.LatLng(40.774,-74.125),
      +		
      var southWest = new L.LatLng(40.712, -74.227),
      +	northEast = new L.LatLng(40.774, -74.125),
       	bounds = new L.LatLngBounds(southWest, northEast);
      +

      All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      + +
      map.fitBounds([
      +	[40.712, -74.227], 
      +	[40.774, -74.125]
      +]);
      +

      Constructor

      + + +
      ConstructorUsage Description
      L.LatLngBounds( <LatLng> southWest, <LatLng> northEast ) + new L.LatLngBounds()
      + L.latLngBounds()
      + L.latLngBounds([]) +
      Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle.
      L.LatLngBounds( <LatLng[]> latlngs ) + new L.LatLngBounds()
      + L.latLngBounds() +
      Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
      @@ -2373,17 +2477,30 @@

      Methods

      L.Point

      -

      Represents a point with x and y coordinates in pixels. +

      Represents a point with x and y coordinates in pixels.

      + +
      var point = new L.Point(200, 300);
      + +

      All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      + +
      map.panBy([200, 300]);
      +map.panBy(new L.Point(200, 300));

      Constructor

      + +
      ConstructorUsage Description
      L.Point( <Number> x, <Number> y, <Boolean> round? ) + new L.Point()
      + L.point()
      + L.point([]) +
      Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
      @@ -2467,19 +2584,33 @@

      L.Bounds

      p2 = new L.Point(40, 60), bounds = new L.Bounds(p1, p2);
      +

      All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      + +
      otherBounds.intersects([[10, 10], [40, 60]]);
      +

      Constructor

      + + +
      ConstructorUsage Description
      L.Bounds( <Point> topLeft, <Point> bottomRight ) + new L.Bounds()
      + L.bounds()
      + L.bounds([]) +
      Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
      L.LatLngBounds( <Point[]> points ) + new L.Bounds()
      + L.bounds() +
      Creates a Bounds object defined by the points it contains.
      @@ -2544,16 +2675,16 @@

      L.Icon

      Represents an icon to provide when creating a marker.

      -
      var myIcon = new L.Icon({
      +		
      var myIcon = L.icon({
       	iconUrl: 'my-icon.png',
       	shadowUrl: 'my-icon-shadow.png',
      -	iconSize: new L.Point(38, 95),
      -	shadowSize: new L.Point(68, 95),
      -	iconAnchor: new L.Point(22, 94),
      -	popupAnchor: new L.Point(-3, -76)
      +	iconSize: [38, 95],
      +	shadowSize: [68, 95],
      +	iconAnchor: [22, 94],
      +	popupAnchor: [-3, -76]
       });
       
      -var marker = new L.Marker(marker, {icon: myIcon});
      +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);

      L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

      @@ -2562,10 +2693,15 @@

      Constructor

      + +
      ConstructorUsage Description
      L.Icon( <Icon properties> props ) + new L.Icon()
      + L.icon() +
      Creates an icon instance with the given properties.
      @@ -3125,7 +3261,7 @@

      L.Browser

      ie Boolean - true for all old Internet Explorer versions (6-8). + true for all Internet Explorer versions. ie6 From 82f389d9cc997e70681bb2f8501ddc6b1943548c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 12 Jul 2012 15:12:20 +0300 Subject: [PATCH 0150/2207] more docs updates, including new geojson reference --- reference.html | 134 +++++++++++++++++++------------------------------ 1 file changed, 52 insertions(+), 82 deletions(-) diff --git a/reference.html b/reference.html index 1d3122aed61..37c808e196c 100644 --- a/reference.html +++ b/reference.html @@ -914,9 +914,7 @@

      L.Marker

      Used to put markers on the map.

      -

      Usage example

      -
      var marker = new L.Marker(latlng);
      -map.addLayer(marker);
      +
      L.marker([50.5, 30.5]).addTo(map);

      Constructor

      @@ -1108,11 +1106,9 @@

      Usage example

      If you want to just bind a popup to marker click and then open it, it's really easy:

      marker.bindPopup(popupContent).openPopup();

      Path overlays like polylines also have a bindPopup method. Here's a more complicated way to open a popup on a map:

      -
      var popupContent = '<p>Hello world!<br />This is a nice popup.</p>',
      -	popup = new L.Popup();
      -
      -popup.setLatLng(latlng);
      -popup.setContent(popupContent);
      +		
      var popup = L.popup()
      +	.setLatLng(latlng)
      +	.setContent('<p>Hello world!<br />This is a nice popup.</p>');
       
       map.openPopup(popup);
      @@ -1373,7 +1369,7 @@

      L.TileLayer.WMS

      Usage example

      -
      var nexrad = new L.TileLayer.WMS("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
      +		
      var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
       	layers: 'nexrad-n0r-900913',
       	format: 'image/png',
       	transparent: true,
      @@ -1449,7 +1445,7 @@ 

      L.TileLayer.Canvas

      Usage example

      -
      var canvasTiles = new L.TileLayer.Canvas();
      +		
      var canvasTiles = L.tileLayer.canvas();
       
       canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
       	var ctx = canvas.getContext('2d');
      @@ -1625,7 +1621,7 @@ 

      Events

      -

      Properties

      +

      Static properties

      @@ -1634,25 +1630,25 @@

      Properties

      - + - + - + - + @@ -1854,22 +1850,14 @@

      L.Rectangle

      A class for drawing rectangle overlays on a map. Extends Polygon. Use Map#addLayer to add it to the map.

      Usage example

      -
      // create an orange rectangle from a LatLngBounds
      -var bounds = new L.LatLngBounds(new L.LatLng(54.559322, -5.767822), new L.LatLng(56.1210604, -3.021240));
      -
      -// zoom the map to the rectangle
      -map.fitBounds(bounds);
      -
      -// create the rectangle
      -var rectangle = new L.Rectangle(bounds, {
      -	fillColor: "#ff7800",
      -	color: "#000000",
      -	opacity: 1,
      -	weight: 2
      -});
      +		
      // define rectangle geographical bounds
      +var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
      +
      +// create an orange rectangle
      +L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);
       
      -// add the rectangle to the map
      -map.addLayer(rectangle);
      +// zoom the map to the rectangle bounds +map.fitBounds(bounds);

      Constructor

      @@ -1911,6 +1899,8 @@

      L.Circle

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      +
      L.circle([50.5, 30.5], 200).addTo(map);
      +

      Constructor

      Constant Description
      L.Path.SVGSVG Boolean depends True if SVG is used for vector rendering (true for most modern browsers).
      L.Path.VMLVML Boolean depends True if VML is used for vector rendering (IE 6-8).
      L.Path.CANVASCANVAS Boolean depends True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow.
      L.Path.CLIP_PADDINGCLIP_PADDING Number 0.5 for SVG
      0.02 for VML
      How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.
      @@ -2009,13 +1999,9 @@

      L.LayerGroup

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      -
      var group = new L.LayerGroup();
      -
      -group.addLayer(marker1);
      -group.addLayer(marker2);
      -group.addLayer(polyline);
      -
      -map.addLayer(group);
      +
      L.layerGroup([marker1, marker2])
      +	.addLayer(polyline)
      +	.addTo(map);

      Constructor

      @@ -2066,15 +2052,10 @@

      L.FeatureGroup

      Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

      -
      var group = new L.FeatureGroup([marker1, marker2, polyline]);
      -
      -group.bindPopup('Hello world!');
      -
      -group.on('click', function() {
      -	alert('Clicked on a group!');
      -});
      -
      -map.addLayer(group);
      +
      L.featureGroup([marker1, marker2, polyline])
      +	.bindPopup('Hello world!')
      +	.on('click', function() { alert('Clicked on a group!'); })
      +	.addTo(map);

      Constructor

      @@ -2151,16 +2132,16 @@

      Events

      L.GeoJSON

      -

      Represents a GeoJSON layer. Allows you to parse GeoJSON data and display on the map. Extends FeatureGroup.

      +

      Represents a GeoJSON layer. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

      -
      var geojson = new L.GeoJSON();
      -
      -geojson.on('featureparse', function(e) {
      -	// do something with e.layer depending on e.properties
      -});
      -geojson.addGeoJSON(geojsonObj);
      -
      -map.addLayer(geojson);
      +
      L.geoJson(data, {
      +	style: function (feature) {
      +		return {color: feature.properties.color};
      +	},
      +	onEachFeature: function (feature, layer) {
      +		layer.bindPopup(feature.properties.description);
      +	}
      +}).addTo(map);

      Constructor

      @@ -2176,7 +2157,7 @@

      Constructor

      new L.GeoJSON()
      L.geoJson() - +
      Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it with addGeoJSON method) and an options object.Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it later with addData method) and an options object.
      @@ -2185,38 +2166,27 @@

      Options

      - - - - - - + + -
      OptionTypeDefault Description
      pointToLayerFunctionnullFunction of the form (LatLng) -> ILayer that will be used for creating layers for GeoJSON points (if not specified, markers will be created).pointToLayer( <GeoJSON> featureData, <LatLng> latlng )Function that will be used for creating layers for GeoJSON points (if not specified, simple markers will be created).
      - - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - + + + - - - + + + + + + +
      EventDataDescription
      style( <GeoJSON> featureData )Function that will be used to get style options for vector layers created for GeoJSON features.
      featureparseGeoJSONEvent - Fired before an object converted from a GeoJSON feature is added to the map. This event can be used to add interaction or change styling of objects depending on feature properties.
      onEachFeature( <GeoJSON> featureData, <ILayer> layer )Function that will be called on each created feature layer. Useful for attaching events and popups to features.
      filter( <GeoJSON> featureData, <ILayer> layer )Function that will be used to decide whether to show a feature or not.
      -

      Methods

      @@ -2226,7 +2196,7 @@

      Methods

      - + @@ -2241,9 +2211,9 @@

      Static methods

      - + - + From 9df26ae7398c290845e57a87f830992671c94c44 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 12 Jul 2012 15:33:52 +0300 Subject: [PATCH 0151/2207] fix geojson example code so that it works --- debug/vector/geojson.html | 20 ++-- examples/geojson.html | 224 ++++++++++++++++++-------------------- 2 files changed, 113 insertions(+), 131 deletions(-) diff --git a/debug/vector/geojson.html b/debug/vector/geojson.html index c49708d5678..5033b8a8c07 100644 --- a/debug/vector/geojson.html +++ b/debug/vector/geojson.html @@ -18,17 +18,14 @@ diff --git a/examples/geojson.html b/examples/geojson.html index 0fcbbad3625..80ead7d2c85 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -50,74 +50,60 @@

      Using GeoJSON with Leaflet

      @@ -139,84 +125,84 @@

      The GeoJSON layer

      map.addLayer(geojsonLayer); -

      This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

      - -
      var geojsonFeature = {
      -    "type": "Feature",
      -    "properties": {
      -        "name": "Coors Field",
      -        "amenity": "Baseball Stadium",
      -        "popupContent": "This is where the Rockies play!"
      -    },
      -    "geometry": {
      -        "type": "Point",
      -        "coordinates": [-104.99404, 39.75621]
      -    }
      +		

      This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

      + +
      var geojsonFeature = {
      +	"type": "Feature",
      +	"properties": {
      +		"name": "Coors Field",
      +		"amenity": "Baseball Stadium",
      +		"popupContent": "This is where the Rockies play!"
      +	},
      +	"geometry": {
      +		"type": "Point",
      +		"coordinates": [-104.99404, 39.75621]
      +	}
       };
       
       geojsonLayer.addGeoJSON(geojsonFeature);
      -

      We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

      +

      We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

      -
      var geojsonLayer = new L.GeoJSON(geojsonFeature);
      +		
      var geojsonLayer = new L.GeoJSON(geojsonFeature);
       
       map.addLayer(geojsonLayer);
      -

      Popups

      +

      Popups

      -

      We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

      +

      We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

      -
      geojsonLayer.on("featureparse", function (e) {
      -    if (e.properties && e.properties.popupContent){
      -        e.layer.bindPopup(e.properties.popupContent);
      -    }
      +		
      geojsonLayer.on("featureparse", function (e) {
      +	if (e.properties && e.properties.popupContent){
      +		e.layer.bindPopup(e.properties.popupContent);
      +	}
       });

      Make sure to do this before adding GeoJSON objects through the addGeoJSON method.

      -

      Styling Features

      +

      Styling Features

      We can also listen to the featureparse event to style our Polyline and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

      var freeBus = {
      -    "type": "Feature",
      -    "geometry": {
      -        "type": "LineString",
      -        "coordinates": [
      -            [-104.98726, 39.74136],
      -            [-104.98720, 39.74132],
      -            [-104.98715, 39.74127],
      -            [-104.98713, 39.74117],
      -            [-104.98712, 39.74106], ...
      -        ]
      -    },
      -    "properties": {
      -        "name": "16th Street Free Bus",
      -        "style": {
      -            "color": "#004070",
      -            "weight": 4,
      -            "opacity": 0.9
      -        },
      -        "popupContent": "This is the 16th street free bus ..."
      -    }
      +	"type": "Feature",
      +	"geometry": {
      +		"type": "LineString",
      +		"coordinates": [
      +			[-104.98726, 39.74136],
      +			[-104.98720, 39.74132],
      +			[-104.98715, 39.74127],
      +			[-104.98713, 39.74117],
      +			[-104.98712, 39.74106], ...
      +		]
      +	},
      +	"properties": {
      +		"name": "16th Street Free Bus",
      +		"style": {
      +			"color": "#004070",
      +			"weight": 4,
      +			"opacity": 0.9
      +		},
      +		"popupContent": "This is the 16th street free bus ..."
      +	}
       };
      -

      To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

      +

      To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

      geojsonLayer.on("featureparse", function (e){
       	if (e.properties && e.properties.style && e.layer.setStyle){
      -	    // The setStyle method isn't available for Points. More on that below ...
      +		// The setStyle method isn't available for Points. More on that below ...
       		e.layer.setStyle(e.properties.style);
       	}
       });
      -

      Styling Points

      +

      Styling Points

      -

      Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

      +

      Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

      -

      Here we're using a CircleMarker:

      +

      Here we're using a CircleMarker:

      -
      var geojsonMarkerOptions = {
      +		
      var geojsonMarkerOptions = {
       	radius: 8,
       	fillColor: "#ff7800",
       	color: "#000",
      @@ -226,22 +212,22 @@ 

      Styling Points

      }; var geojsonLayer = new L.GeoJSON(someGeojsonFeature, { - pointToLayer: function (latlng) { - return new L.CircleMarker(latlng, geojsonMarkerOptions); - } + pointToLayer: function (latlng) { + return new L.CircleMarker(latlng, geojsonMarkerOptions); + } });
      -

      And here's an example of using a custom Marker:

      +

      And here's an example of using a custom Marker:

      -
      var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
      -    pointToLayer: function (latlng) {
      -        return new L.Marker(latlng, {
      -            icon: new MyCustomIcon()
      -        });
      -    }
      +		
      var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
      +	pointToLayer: function (latlng) {
      +		return new L.Marker(latlng, {
      +			icon: new MyCustomIcon()
      +		});
      +	}
       });
      -

      View the example page to see in detail what is possible with the GeoJSON layer.

      +

      View the example page to see in detail what is possible with the GeoJSON layer.


      From 25a20644ab248a4462dfa2a45464e498cd9e89de Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 12 Jul 2012 16:05:49 +0300 Subject: [PATCH 0152/2207] more docs fixes --- examples/geojson.html | 2 +- reference.html | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/geojson.html b/examples/geojson.html index 80ead7d2c85..782becf74b9 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -62,7 +62,7 @@

      Using GeoJSON with Leaflet

      iconUrl: 'baseball-marker.png', iconSize: [32, 37], iconAnchor: [16, 37], - popupAnchor: new L.Point(0, -28) // TODO temporary until fixed + popupAnchor: [0, -28] }); function onEachFeature(feature, layer) { diff --git a/reference.html b/reference.html index 37c808e196c..3acfabb9274 100644 --- a/reference.html +++ b/reference.html @@ -1108,9 +1108,8 @@

      Usage example

      Path overlays like polylines also have a bindPopup method. Here's a more complicated way to open a popup on a map:

      var popup = L.popup()
       	.setLatLng(latlng)
      -	.setContent('<p>Hello world!<br />This is a nice popup.</p>');
      -
      -map.openPopup(popup);
      + .setContent('<p>Hello world!<br />This is a nice popup.</p>') + .openOn(map);

      Constructor

      From ebf491db8987b16eab41f0abc2d04c0912e5e276 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Jul 2012 15:10:28 +0300 Subject: [PATCH 0153/2207] add last point polygon note, closes #684 --- reference.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reference.html b/reference.html index 3acfabb9274..b1f33b682c6 100644 --- a/reference.html +++ b/reference.html @@ -1800,6 +1800,8 @@

      L.Polygon

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      +

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      +

      Constructor

      Description
      addGeoJSON( <Object> geojson )addData( <GeoJSON> data ) Boolean Adds a GeoJSON object to the layer.
      Description
      geometryToLayer( <Object> geojson, <Function> pointToLayer? )geometryToLayer( <GeoJSON> featureData, <Function> pointToLayer? ) ILayerCreates a layer from a given GeoJSON geometry.Creates a layer from a given GeoJSON feature.
      coordsToLatlng( <Array> coords, <Boolean> reverse? )
      From fc69e43ab5edc38920e94615f0355a4d57edc133 Mon Sep 17 00:00:00 2001 From: hayley Date: Sat, 14 Jul 2012 12:27:53 -0500 Subject: [PATCH 0154/2207] typo where maxWidth should've been minWidth --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b1f33b682c6..29aa4118946 100644 --- a/reference.html +++ b/reference.html @@ -1145,7 +1145,7 @@ - + From 604c77419af484b24bdfc624ddc883c8ff867611 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 16 Jul 2012 20:21:00 +0300 Subject: [PATCH 0155/2207] initial jekyll conversion --- .gitignore | 3 +- _config.yml | 6 + _layouts/default.html | 164 + download.md | 34 + examples.md | 63 + examples/quick-start.md | 237 ++ features.html | 293 +- index.md | 68 + reference.html | 6581 +++++++++++++++++++-------------------- 9 files changed, 3908 insertions(+), 3541 deletions(-) create mode 100644 _config.yml create mode 100644 _layouts/default.html create mode 100644 download.md create mode 100644 examples.md create mode 100644 examples/quick-start.md create mode 100644 index.md diff --git a/.gitignore b/.gitignore index a363d3b2ba9..38c00bfe5d3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ node_modules tmp/**/* .idea .idea/**/* -*.iml \ No newline at end of file +*.iml +_site \ No newline at end of file diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000000..78504620f11 --- /dev/null +++ b/_config.yml @@ -0,0 +1,6 @@ +exclude: build, node_modules, spec, src, CNAME, Jakefile.js, reference-tpl.html, CHANGELOG.md, README.md, LICENSE + +markdown: kramdown + +kramdown: + entity_output: as_input \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 00000000000..7f8bc42aab9 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,164 @@ + + + + Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade + + + + + + + + + + + + + + {% capture root %}{% if page.root %}{{ page.root }}{% else %}{{ post.root }}{% endif %}{% endcapture %} + + + + + + + + + + + + + + + + + + + +
      +

      Leaflet

      +

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      + + + + + + + {{ content }} + +
      + +

      © 2012 CloudMade, Vladimir Agafonkin. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

      +
      + + Fork me on GitHub + + + + + + + + diff --git a/download.md b/download.md new file mode 100644 index 00000000000..ca56f53f67a --- /dev/null +++ b/download.md @@ -0,0 +1,34 @@ +--- +layout: default +title: Download +--- + +### Download Leaflet + +Besides the library itself, the download package contains full source +code, unit tests, files for debugging and a build system. The production +files (included the same way as in the code above) are in the `dist` +folder. + +[Download Leaflet 0.3.1 stable](https://github.com/CloudMade/Leaflet/zipball/v0.3.1) (February 14, 2012) +[Download Leaflet 0.4 master](http://github.com/CloudMade/Leaflet/zipball/master) (in-progress version) + +[View Changelog](https://github.com/CloudMade/Leaflet/blob/master/CHANGELOG.md) + +### Using a hosted version of Leaflet + +The latest stable release of Leaflet is hosted on a CDN — to start using +it straight away, place this code in the `head` section of your HTML: + + + + + + +### Building a custom version of Leaflet + +Open `build/build.html` page from the download package, check the +components you want to see in your build and then follow the +instructions there. \ No newline at end of file diff --git a/examples.md b/examples.md new file mode 100644 index 00000000000..c6adc792655 --- /dev/null +++ b/examples.md @@ -0,0 +1,63 @@ +--- +layout: default +title: Tutorials +--- + +### Leaflet tutorials + +Every example here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers. + +*** +[][1] + +### [Leaflet Quick Start Guide][1] + +A simple step-by-step guide that will quickly get you started with Leaflet basics, including setting up a Leaflet map (with CloudMade tiles) on your page, working with markers, polylines and popups, and dealing with events. + +*** +[][2] + +### [Leaflet on Mobile][2] + +In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location. + +*** +[][3] + +### [Markers With Custom Icons][3] + +In this pretty example, you'll learn how to easily define your own icons for use by the markers you put on the map. + +*** +[][4] + +### [Using GeoJSON with Leaflet][4] + +In this example, you'll learn how to create and interact with map vectors created from [GeoJSON][5] objects. + +*** +[][6] + +### [Layer Groups and Layers Control][6] + +A tutorial on how to manage groups of layers and use the layer switching control. + +*** +### Custom Controls + +A brief tutorial on implementing custom map controls. + +*** +### Custom Overlays + +If markers, popups and vectors are not enough for you, here's a guide for creating your own map overlays (things to put on a map). + +*** +More examples coming soon! + + [1]: examples/quick-start.html + [2]: examples/mobile.html + [3]: examples/custom-icons.html + [4]: examples/geojson.html + [5]: http://geojson.org/ + [6]: examples/layers-control.html \ No newline at end of file diff --git a/examples/quick-start.md b/examples/quick-start.md new file mode 100644 index 00000000000..17d8eb0ec17 --- /dev/null +++ b/examples/quick-start.md @@ -0,0 +1,237 @@ +--- +layout: default +title: Quick Start Guide +root: ../ +--- + +[← Back to the list of examples](../examples.html) + + +### Leaflet Quick Start Guide + +This step-by-step guide will quickly get you started on Leaflet basics, including setting up a Leaflet map, working with markers, polylines and popups, and dealing with events. + + +
      + +[View example on a separate page →](quick-start-example.html) + + +### Preparing your page + +Before writing any code for the map, you need to do the following preparation steps on your page: + + * Include Leaflet CSS files in the head section of your document: + + + + + * Include Leaflet JavaScript file somewhere on the page (preferably before body close tag): + + + + * Put a div element with a certain id where you want your map to be (making sure it has defined height): + +
      + +Now you're ready to initialize the map and do some stuff with it. + + +### Setting up the map + +
      + + +Let's create a map instance, set its view to the center of London and add a pretty CloudMade tile layer to it. First we'll initialize the map: + + var map = new L.Map('map'); + +By default (as we didn't pass any options when creating the map instance), all mouse and touch interactions on the map are enabled, and it has zoom and attribution controls. + +Next we'll create a tile layer to add to our map, in this case it's a CloudMade tile layer with Fresh style. Creating a tile layer usually involves setting the URL template for the tile images (get yours at [CloudMade](http://cloudmade.com/register)), the attribution text and the maximum zoom level of the layer: + +
      var cloudmade = new L.TileLayer('http://{s}.tile.cloudmade.com/API-KEY/997/256/{z}/{x}/{y}.png', {
      +	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
      +	maxZoom: 18
      +});
      + +It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles, and it doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd recommend CloudMade though, it looks beautiful). + +Finally we'll set the map view to the center of London at 13th zoom level and add our tile layer (see the resulting map above): + + var london = new L.LatLng(51.505, -0.09); // geographical point (longitude and latitude) + map.setView(london, 13).addLayer(cloudmade); + +Make sure this code is below both the map div and leaflet.js inclusion, or in a window.load or document.ready event handler. + + +### Markers, circles and polygons + +
      + +Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker: + + var markerLocation = new L.LatLng(51.5, -0.09); + + var marker = new L.Marker(markerLocation); + map.addLayer(marker); + +Adding a circle is the same (except for specifying the radius in meters), but lets configure it by passing options as a third argument when creating the object (the second argument is the radius in pixels): + + var circleLocation = new L.LatLng(51.508, -0.11), + circleOptions = { + color: 'red', + fillColor: '#f03', + fillOpacity: 0.5 + }; + + var circle = new L.Circle(circleLocation, 500, circleOptions); + map.addLayer(circle); + +Add a polygon is easy too: + + L.polygon([[51.509, -0.08], [51.503, -0.06], [51.51, -0.047]]).addTo(map); + + +### Working with popups + +
      + +Popups are usually used when you want to attach some information to a particular object on a map. Leaflet has a very handy shortcut for this: + + marker.bindPopup("Hello world!
      I am a popup.").openPopup(); + circle.bindPopup("I am a circle."); + polygon.bindPopup("I am a polygon."); + +Try clicking on our objects. The bindPopup method attaches a popup with the specified HTML content to your marker so the popup appears when you click on the object, and the openPopup method (for markers only) immediately opens the attached popup. + +You can also use popups as layers (when you need something more than attching a popup to an object): + + var popup = new L.Popup(); + + popup.setLatLng(new L.LatLng(51.5, -0.09)); + popup.setContent("I am a standalone popup."); + + map.openPopup(popup); + +Here we use openPopup instead of addLayer because it handles automatic closing of a previously opened popup when opening a new one which is good for usability. + + +### Dealing with events + +Every time something happens in Leaflet, e.g. user clicks on a marker or map zoom changes, the corresponding object sends an event which you can subscribe to with a function. It allows you to react to user interaction: + + map.on('click', onMapClick); + + function onMapClick(e) { + alert("You clicked the map at " + e.latlng); + } + +Each object has its own set of events — see documentation for details. The first argument of the listener function is an event object — it contains useful information about the event that happened. For example, map click event object (e in the example above) has latlng property which is a location at which the click occured. + +Lets improve our example by using a popup instead of an alert and formatting the location string: + + map.on('click', onMapClick); + + var popup = new L.Popup(); + + function onMapClick(e) { + var latlngStr = '(' + e.latlng.lat.toFixed(3) + ', ' + e.latlng.lng.toFixed(3) + ')'; + + popup.setLatLng(e.latlng); + popup.setContent("You clicked the map at " + latlngStr); + + map.openPopup(popup); + } + +Try clicking on the map and you will see the coordinates in a popup. View the full example → + +Now you've learned Leaflet basics and can start building map apps straight away! Don't forget to take a look at the detailed documentation or other examples. + + + + + + + + \ No newline at end of file diff --git a/features.html b/features.html index 6798a48c255..bde35fc1055 100644 --- a/features.html +++ b/features.html @@ -1,208 +1,103 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Features - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - -
      - - - - +

      If you find some feature really missing in Leaflet, please vote for it on the Leaflet UserVoice page.

      \ No newline at end of file diff --git a/index.md b/index.md new file mode 100644 index 00000000000..ddb8e306699 --- /dev/null +++ b/index.md @@ -0,0 +1,68 @@ +--- +layout: default +--- + +Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 25 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. + +It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. + + +### Basic usage example + +
      + +Here we create a map with tiles of our choice, add a marker and bind a popup with some text to it: + + + +
      // create a map in the "map" div, set the view to a given place and zoom
      +var map = L.map('map').setView([51.505, -0.09], 13);
      +
      +// add a CloudMade tile layer with style #997
      +L.tileLayer('http://{s}.tile.cloudmade.com/[API-key]/997/256/{z}/{x}/{y}.png', {
      +    attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
      +}).addTo(map);
      +
      +// add a marker in the given location, attach some popup content to it and open the popup
      +L.marker([51.5, -0.09]).addTo(map)
      +    .bindPopup('A pretty CSS3 popup. <br> Easily customizable.').openPopup();
      + + +Check out the [examples](examples.html) section for more examples, or head straight to the [documentation](reference.html). + + +### Contributing to Leaflet + +The project is [hosted on GitHub][], waiting for your contributions --- just send your pull requests to [@mourner][] (Vladimir Agafonkin, Leaflet author and maintainer). Let’s make the best library for maps that can possibly exist! + +You can also help the project a lot by reporting bugs on the [GitHub issues page][], showing your support for your favorite feature suggestions on [Leaflet UserVoice page][], tweeting to [@LeafletJS][] or joining the [Leaflet mailing list][]. + + [Vladimir Agafonkin]: http://agafonkin.com/en + [CloudMade]: http://cloudmade.com + [contributors]: https://github.com/CloudMade/Leaflet/graphs/contributors + [features]: features.html + [A-grade]: http://developer.yahoo.com/yui/articles/gbs/ + [a simple API]: reference.html "Leaflet API reference" + [code of the library]: https://github.com/CloudMade/Leaflet + "Leaflet GitHub repository" + [hosted on GitHub]: http://github.com/CloudMade/Leaflet + [@mourner]: http://github.com/mourner + [GitHub issues page]: http://github.com/CloudMade/Leaflet/issues + [Leaflet UserVoice page]: http://leaflet.uservoice.com + [@LeafletJS]: http://twitter.com/LeafletJS + [Leaflet mailing list]: https://groups.google.com/group/leaflet-js + + + \ No newline at end of file diff --git a/reference.html b/reference.html index 29aa4118946..a65b87f694d 100644 --- a/reference.html +++ b/reference.html @@ -1,1857 +1,1798 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Documentation - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - -
      Max width of the popup.
      maxWidthminWidth Number 50 Min width of the popup.
      - - - - - - - - - - -
      ConstructorUsageDescription
      L.Map( <HTMLElement|String> id, <Map options> options? ) - new L.Map()
      - L.map() -
      Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.
      - - - - -

      Options

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      centerLatLngnullInitial geographical center of the map.
      zoomNumbernullInitial map zoom.
      layersILayer[][]Layers that will be added to the map initially.
      minZoomNumber0Minimum zoom level of the map. Overrides any minZoom set on map layers.
      maxZoomNumber18Maximum zoom level of the map. This overrides any maxZoom set on map layers.
      maxBoundsLatLngBoundsnullWhen this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view, and also not allowing to zoom out to a view that's larger than the given bounds (depending on the map size). To set the restriction dynamically, use setMaxBounds method
      crsCRSL.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means.
      draggingBooleantrueWhether the map be draggable with mouse/touch or not.
      touchZoomBooleantrueWhether the map can be zoomed by touch-dragging with two fingers.
      scrollWheelZoomBooleantrueWhether the map can be zoomed by using the mouse wheel.
      doubleClickZoomBooleantrueWhether the map can be zoomed in by double clicking on it.
      boxZoomBooleantrueWhether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift.
      zoomControlBooleantrueWhether the zoom control is added to the map by default.
      attributionControlBooleantrueWhether the attribution control is added to the map by default.
      trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
      fadeAnimationBooleandependsWhether the tile fade animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      zoomAnimationBooleandependsWhether the tile zoom animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      markerZoomAnimationBooleandependsWhether markers animate their zoom with the zoom animation, if disabled they will disappear for the length of the animation. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
      worldCopyJumpBooleantrueWith this option enabled, the map tracks when you pan to another "copy" of the world and moves all overlays like markers and vector layers there.
      - - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      clickMouseEvent - Fired when the user clicks (or taps) the map.
      dblclickMouseEvent - Fired when the user double-clicks (or double-taps) the map.
      mousedownMouseEvent - Fired when the user pushes the mouse button on the map.
      mouseenterMouseEvent - Fired when the mouse enters the map.
      mouseleaveMouseEvent - Fired when the mouse leaves the map.
      mousemoveMouseEvent - Fired while the mouse moves over the map.
      contextmenuMouseEvent - Fired when the user pushes the right mouse button on the map.
      preclickMouseEvent - Fired before mouse click on the map (sometimes useful when you want something to happen on click before any existing click handlers start running).
      loadEvent - Fired when the map is initialized (when its center and zoom are set for the first time).
      viewresetEvent - Fired when the map needs to redraw its content (this usually happens on map zoom or load). Very useful for creating custom overlays.
      movestartEvent - Fired when the view of the map starts changing (e.g. user starts dragging the map).
      moveEvent - Fired on any movement of the map view.
      moveendEvent - Fired when the view of the map ends changed (e.g. user stopped dragging the map).
      dragstartEvent - Fired when the user starts dragging the map.
      dragEvent - Fired repeatedly while the user drags the map.
      dragendEvent - Fired when the user stops dragging the map.
      zoomstartEvent - Fired when the map zoom is about to change (e.g. before zoom animation).
      zoomendEvent - Fired when the map zoom changes.
      layeraddLayerEvent - Fired when a new layer is added to the map.
      layerremoveLayerEvent - Fired when some layer is removed from the map.
      locationfoundLocationEvent - Fired when geolocation (using locate or locateAndSetView method) went successfully.
      locationerrorErrorEvent - Fired when geolocation (using locate or locateAndSetView method) failed.
      popupopenPopupEvent - Fired when a popup is opened (using openPopup method).
      popupclosePopupEvent - Fired when a popup is closed (using closePopup method).
      - - -

      Methods that modify map state

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setView( <LatLng> center, <Number> zoom, <Boolean> forceReset? )thisSets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default).
      setZoom( <Number> zoom )thisSets the zoom of the map.
      zoomIn()thisIncreases the zoom of the map by 1.
      zoomOut()thisDecreases the zoom of the map by 1.
      fitBounds( <LatLngBounds> bounds )thisSets a map view that contains the given geographical bounds with the maximum zoom level possible.
      fitWorld()thisSets a map view that mostly contains the whole world with the maximum zoom level possible.
      panTo( <LatLng> latlng )thisPans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one.
      panInsideBounds( <LatLngBounds> bounds )thisPans the map to the closest view that would lie inside the given bounds (if it's not already).
      panBy( <Point> point )thisPans the map by a given number of pixels (animated).
      invalidateSize()thisChecks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically.
      setMaxBounds( <LatLngBounds> bounds )thisRestricts the map view to the given bounds (see map maxBounds option).
      locate( <Locate options> options? )thisTries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details.
      locateAndSetView( <Number> maxZoom?, <Locate options> options? )thisAutomatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});.
      stopLocate()thisStops watching location previously initiated by map.locate({watch: true}).
      - -

      Methods that get map state

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      getCenter()LatLngReturns the geographical center of the map view.
      getZoom()NumberReturns the current zoom of the map view.
      getMinZoom()NumberReturns the minimum zoom level of the map.
      getMaxZoom()NumberReturns the maximum zoom level of the map.
      getBounds()LatLngBoundsReturns the LatLngBounds of the current map view.
      getBoundsZoom( <LatLngBounds> bounds, <Boolean> inside? )NumberReturns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety.
      getSize()PointReturns the current size of the map container.
      getPixelBounds()BoundsReturns the bounds of the current map view in projected pixel coordinates (sometimes useful in layer and overlay implementations).
      getPixelOrigin()PointReturns the projected pixel coordinates of the top left point of the map layer (useful in custom layer and overlay implementations).
      - -

      Methods for layers and controls

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? )thisAdds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers).
      removeLayer( <ILayer> layer )thisRemoves the given layer from the map.
      hasLayer( <ILayer> layer )BooleanReturns true if the given layer is currently added to the map.
      openPopup( <Popup> popup )thisOpens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).
      closePopup()thisCloses the popup opened with openPopup.
      addControl( <IControl> control )thisAdds the given control to the map.
      removeControl( <IControl> control )thisRemoves the given control from the map.
      - - -

      Conversion methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      latLngToLayerPoint( <LatLng> latlng )PointReturns the map layer point that corresponds to the given geographical coordinates (useful for placing overlays on the map).
      layerPointToLatLng( <Point> point )LatLngReturns the geographical coordinates of a given map layer point.
      containerPointToLayerPoint( <Point> point )PointConverts the point relative to the map container to a point relative to the map layer.
      layerPointToContainerPoint( <Point> point )PointConverts the point relative to the map layer to a point relative to the map container.
      project( <LatLng> latlng, <Number> zoom? )PointProjects the given geographical coordinates to absolute pixel coordinates for the given zoom level (current zoom level by default).
      unproject( <Point> point, <Number> zoom? )LatLngProjects the given absolute pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).
      mouseEventToContainerPoint( <MouseEvent> event )PointReturns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object.
      mouseEventToLayerPoint( <MouseEvent> event )PointReturns the pixel coordinates of a mouse click relative to the map layer given its event object. -
      mouseEventToLatLng( <MouseEvent> event )LatLngReturns the geographical coordinates of the point the mouse clicked on given the click's event object.
      - -

      Other methods

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      getContainer()HTMLElementReturns the container element of the map.
      getPanes()MapPanesReturns an object with different map panes (to render overlays in).
      - -

      Locate options

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      watchBooleanfalseIf true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method.
      setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to detection accuracy.
      maxZoomNumberInfinityThe maximum zoom for automatic view setting when using `setView` option.
      timeoutNumber10000Number of millisecond to wait for a response from geolocation before firing a locationerror event.
      maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, locate will return a cached location.
      enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.
      - - -

      Properties

      - -

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      - -
      map.doubleClickZoom.disable();
      - -

      You can also access default map controls like attribution control through map properties:

      - -
      map.attributionControl.addAttribution("Earthquake data &copy; GeoNames");
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      draggingIHandlerMap dragging handler (by both mouse and touch).
      touchZoomIHandlerTouch zoom handler.
      doubleClickZoomIHandlerDouble click zoom handler.
      scrollWheelZoomIHandlerScroll wheel zoom handler.
      boxZoomIHandlerBox (shift-drag with mouse) zoom handler.
      zoomControlControl.ZoomZoom control.
      attributionControlControl.AttributionAttribution control.
      - -

      Projections

      - -

      You can specify different CRS for map to use through its crs option. Here's the list of available CRS:

      - - - - - - - - - - - - - - - - - - -
      CRSData
      L.CRS.EPSG3857EPSG:3857 (Spherical Mercator), used by most of commercial map providers (CloudMade, Google, Yahoo, Bing, etc.).
      L.CRS.EPSG4326EPSG:4326 (Plate Carree), very popular among GIS enthusiasts.
      L.CRS.EPSG3395EPSG:3395 (True Mercator), used by some map providers.
      - - -

      Map panes

      - -

      An object literal (returned by map.getPanes) that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      mapPaneHTMLElementPane that contains all other map panes.
      tilePaneHTMLElementPane for tile layers.
      objectsPaneHTMLElementPane that contains all the panes except tile pane.
      shadowPaneHTMLElementPane for overlay shadows (e.g. marker shadows).
      overlayPaneHTMLElementPane for overlays like polylines and polygons.
      markerPaneHTMLElementPane for marker icons.
      popupPaneHTMLElementPane for popups.
      - - -

      L.Marker

      - -

      Used to put markers on the map.

      - -
      L.marker([50.5, 30.5]).addTo(map);
      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Marker( <LatLng> latlng, <Marker options> options? ) - new L.Marker()
      - L.marker() -
      Instantiates a Marker object given a geographical point and optionally an options object.
      - -

      Options

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      iconL.Icon*Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default.
      clickableBooleantrueIf false, the marker will not emit mouse events and will act as a part of the underlying map.
      draggableBooleanfalseWhether the marker is draggable with mouse/touch or not.
      titleString''Text for the browser tooltip that appear on marker hover (no tooltip by default).
      zIndexOffsetNumber0By default, marker images zIndex is set automatically based on its latitude. You this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
      - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      clickMouseEvent - Fired when the user clicks (or taps) the marker.
      dblclickMouseEvent - Fired when the user double-clicks (or double-taps) the marker.
      mousedownMouseEvent - Fired when the user pushes the mouse button on the marker.
      mouseoverMouseEvent - Fired when the mouse enters the marker.
      mouseoutMouseEvent - Fired when the mouse leaves the marker.
      dragstartEvent - Fired when the user starts dragging the marker.
      dragEvent - Fired repeatedly while the user drags the marker.
      dragendEvent - Fired when the user stops dragging the marker.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      getLatLng()LatLngReturns the current geographical position of the marker.
      setLatLng( <LatLng> latlng )thisChanges the marker position to the given point.
      setIcon( <Icon> icon )thisChanges the marker icon.
      setZIndexOffset( <Number> offset )thisChanges the zIndex offset of the marker.
      bindPopup( <String> htmlContent, <Popup options> options? )thisBinds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method.
      unbindPopup()thisUnbinds the popup previously bound to the marker with bindPopup.
      openPopup()thisOpens the popup previously bound by the bindPopup method.
      closePopup()thisCloses the bound popup of the marker if it's opened.
      - -

      Interaction handlers

      - -

      Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

      - -
      marker.dragging.disable();
      - - - - - - - - - - - - -
      PropertyTypeDescription
      draggingIHandlerMarker dragging handler (by both mouse and touch).
      - - - - - -

      Used to open popups in certain places of the map. Use Map#openPopup to open popups while making sure that only one popup is open at one time (recommended for usability), or use Map#addLayer to open as many as you want.

      - -

      Usage example

      -

      If you want to just bind a popup to marker click and then open it, it's really easy:

      -
      marker.bindPopup(popupContent).openPopup();
      -

      Path overlays like polylines also have a bindPopup method. Here's a more complicated way to open a popup on a map:

      -
      var popup = L.popup()
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Map( <HTMLElement|String> id, <Map options> options? ) + new L.Map()
      + L.map() +
      Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.
      + + + + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      centerLatLngnullInitial geographical center of the map.
      zoomNumbernullInitial map zoom.
      layersILayer[][]Layers that will be added to the map initially.
      minZoomNumber0Minimum zoom level of the map. Overrides any minZoom set on map layers.
      maxZoomNumber18Maximum zoom level of the map. This overrides any maxZoom set on map layers.
      maxBoundsLatLngBoundsnullWhen this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view, and also not allowing to zoom out to a view that's larger than the given bounds (depending on the map size). To set the restriction dynamically, use setMaxBounds method
      crsCRSL.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means.
      draggingBooleantrueWhether the map be draggable with mouse/touch or not.
      touchZoomBooleantrueWhether the map can be zoomed by touch-dragging with two fingers.
      scrollWheelZoomBooleantrueWhether the map can be zoomed by using the mouse wheel.
      doubleClickZoomBooleantrueWhether the map can be zoomed in by double clicking on it.
      boxZoomBooleantrueWhether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift.
      zoomControlBooleantrueWhether the zoom control is added to the map by default.
      attributionControlBooleantrueWhether the attribution control is added to the map by default.
      trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
      fadeAnimationBooleandependsWhether the tile fade animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      zoomAnimationBooleandependsWhether the tile zoom animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      markerZoomAnimationBooleandependsWhether markers animate their zoom with the zoom animation, if disabled they will disappear for the length of the animation. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
      worldCopyJumpBooleantrueWith this option enabled, the map tracks when you pan to another "copy" of the world and moves all overlays like markers and vector layers there.
      + + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      clickMouseEvent + Fired when the user clicks (or taps) the map.
      dblclickMouseEvent + Fired when the user double-clicks (or double-taps) the map.
      mousedownMouseEvent + Fired when the user pushes the mouse button on the map.
      mouseenterMouseEvent + Fired when the mouse enters the map.
      mouseleaveMouseEvent + Fired when the mouse leaves the map.
      mousemoveMouseEvent + Fired while the mouse moves over the map.
      contextmenuMouseEvent + Fired when the user pushes the right mouse button on the map.
      preclickMouseEvent + Fired before mouse click on the map (sometimes useful when you want something to happen on click before any existing click handlers start running).
      loadEvent + Fired when the map is initialized (when its center and zoom are set for the first time).
      viewresetEvent + Fired when the map needs to redraw its content (this usually happens on map zoom or load). Very useful for creating custom overlays.
      movestartEvent + Fired when the view of the map starts changing (e.g. user starts dragging the map).
      moveEvent + Fired on any movement of the map view.
      moveendEvent + Fired when the view of the map ends changed (e.g. user stopped dragging the map).
      dragstartEvent + Fired when the user starts dragging the map.
      dragEvent + Fired repeatedly while the user drags the map.
      dragendEvent + Fired when the user stops dragging the map.
      zoomstartEvent + Fired when the map zoom is about to change (e.g. before zoom animation).
      zoomendEvent + Fired when the map zoom changes.
      layeraddLayerEvent + Fired when a new layer is added to the map.
      layerremoveLayerEvent + Fired when some layer is removed from the map.
      locationfoundLocationEvent + Fired when geolocation (using locate or locateAndSetView method) went successfully.
      locationerrorErrorEvent + Fired when geolocation (using locate or locateAndSetView method) failed.
      popupopenPopupEvent + Fired when a popup is opened (using openPopup method).
      popupclosePopupEvent + Fired when a popup is closed (using closePopup method).
      + + +

      Methods that modify map state

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setView( <LatLng> center, <Number> zoom, <Boolean> forceReset? )thisSets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default).
      setZoom( <Number> zoom )thisSets the zoom of the map.
      zoomIn()thisIncreases the zoom of the map by 1.
      zoomOut()thisDecreases the zoom of the map by 1.
      fitBounds( <LatLngBounds> bounds )thisSets a map view that contains the given geographical bounds with the maximum zoom level possible.
      fitWorld()thisSets a map view that mostly contains the whole world with the maximum zoom level possible.
      panTo( <LatLng> latlng )thisPans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one.
      panInsideBounds( <LatLngBounds> bounds )thisPans the map to the closest view that would lie inside the given bounds (if it's not already).
      panBy( <Point> point )thisPans the map by a given number of pixels (animated).
      invalidateSize()thisChecks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically.
      setMaxBounds( <LatLngBounds> bounds )thisRestricts the map view to the given bounds (see map maxBounds option).
      locate( <Locate options> options? )thisTries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details.
      locateAndSetView( <Number> maxZoom?, <Locate options> options? )thisAutomatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});.
      stopLocate()thisStops watching location previously initiated by map.locate({watch: true}).
      + +

      Methods that get map state

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      getCenter()LatLngReturns the geographical center of the map view.
      getZoom()NumberReturns the current zoom of the map view.
      getMinZoom()NumberReturns the minimum zoom level of the map.
      getMaxZoom()NumberReturns the maximum zoom level of the map.
      getBounds()LatLngBoundsReturns the LatLngBounds of the current map view.
      getBoundsZoom( <LatLngBounds> bounds, <Boolean> inside? )NumberReturns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety.
      getSize()PointReturns the current size of the map container.
      getPixelBounds()BoundsReturns the bounds of the current map view in projected pixel coordinates (sometimes useful in layer and overlay implementations).
      getPixelOrigin()PointReturns the projected pixel coordinates of the top left point of the map layer (useful in custom layer and overlay implementations).
      + +

      Methods for layers and controls

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? )thisAdds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers).
      removeLayer( <ILayer> layer )thisRemoves the given layer from the map.
      hasLayer( <ILayer> layer )BooleanReturns true if the given layer is currently added to the map.
      openPopup( <Popup> popup )thisOpens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability).
      closePopup()thisCloses the popup opened with openPopup.
      addControl( <IControl> control )thisAdds the given control to the map.
      removeControl( <IControl> control )thisRemoves the given control from the map.
      + + +

      Conversion methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      latLngToLayerPoint( <LatLng> latlng )PointReturns the map layer point that corresponds to the given geographical coordinates (useful for placing overlays on the map).
      layerPointToLatLng( <Point> point )LatLngReturns the geographical coordinates of a given map layer point.
      containerPointToLayerPoint( <Point> point )PointConverts the point relative to the map container to a point relative to the map layer.
      layerPointToContainerPoint( <Point> point )PointConverts the point relative to the map layer to a point relative to the map container.
      project( <LatLng> latlng, <Number> zoom? )PointProjects the given geographical coordinates to absolute pixel coordinates for the given zoom level (current zoom level by default).
      unproject( <Point> point, <Number> zoom? )LatLngProjects the given absolute pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default).
      mouseEventToContainerPoint( <MouseEvent> event )PointReturns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object.
      mouseEventToLayerPoint( <MouseEvent> event )PointReturns the pixel coordinates of a mouse click relative to the map layer given its event object. +
      mouseEventToLatLng( <MouseEvent> event )LatLngReturns the geographical coordinates of the point the mouse clicked on given the click's event object.
      + +

      Other methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      getContainer()HTMLElementReturns the container element of the map.
      getPanes()MapPanesReturns an object with different map panes (to render overlays in).
      + +

      Locate options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      watchBooleanfalseIf true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method.
      setViewBooleanfalseIf true, automatically sets the map view to the user location with respect to detection accuracy.
      maxZoomNumberInfinityThe maximum zoom for automatic view setting when using `setView` option.
      timeoutNumber10000Number of millisecond to wait for a response from geolocation before firing a locationerror event.
      maximumAgeNumber0Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, locate will return a cached location.
      enableHighAccuracyBooleanfalseEnables high accuracy, see description in the W3C spec.
      + + +

      Properties

      + +

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      + +
      map.doubleClickZoom.disable();
      + +

      You can also access default map controls like attribution control through map properties:

      + +
      map.attributionControl.addAttribution("Earthquake data &copy; GeoNames");
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      draggingIHandlerMap dragging handler (by both mouse and touch).
      touchZoomIHandlerTouch zoom handler.
      doubleClickZoomIHandlerDouble click zoom handler.
      scrollWheelZoomIHandlerScroll wheel zoom handler.
      boxZoomIHandlerBox (shift-drag with mouse) zoom handler.
      zoomControlControl.ZoomZoom control.
      attributionControlControl.AttributionAttribution control.
      + +

      Projections

      + +

      You can specify different CRS for map to use through its crs option. Here's the list of available CRS:

      + + + + + + + + + + + + + + + + + + +
      CRSData
      L.CRS.EPSG3857EPSG:3857 (Spherical Mercator), used by most of commercial map providers (CloudMade, Google, Yahoo, Bing, etc.).
      L.CRS.EPSG4326EPSG:4326 (Plate Carree), very popular among GIS enthusiasts.
      L.CRS.EPSG3395EPSG:3395 (True Mercator), used by some map providers.
      + + +

      Map panes

      + +

      An object literal (returned by map.getPanes) that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      mapPaneHTMLElementPane that contains all other map panes.
      tilePaneHTMLElementPane for tile layers.
      objectsPaneHTMLElementPane that contains all the panes except tile pane.
      shadowPaneHTMLElementPane for overlay shadows (e.g. marker shadows).
      overlayPaneHTMLElementPane for overlays like polylines and polygons.
      markerPaneHTMLElementPane for marker icons.
      popupPaneHTMLElementPane for popups.
      + + +

      L.Marker

      + +

      Used to put markers on the map.

      + +
      L.marker([50.5, 30.5]).addTo(map);
      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Marker( <LatLng> latlng, <Marker options> options? ) + new L.Marker()
      + L.marker() +
      Instantiates a Marker object given a geographical point and optionally an options object.
      + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      iconL.Icon*Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default.
      clickableBooleantrueIf false, the marker will not emit mouse events and will act as a part of the underlying map.
      draggableBooleanfalseWhether the marker is draggable with mouse/touch or not.
      titleString''Text for the browser tooltip that appear on marker hover (no tooltip by default).
      zIndexOffsetNumber0By default, marker images zIndex is set automatically based on its latitude. You this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively).
      + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      clickMouseEvent + Fired when the user clicks (or taps) the marker.
      dblclickMouseEvent + Fired when the user double-clicks (or double-taps) the marker.
      mousedownMouseEvent + Fired when the user pushes the mouse button on the marker.
      mouseoverMouseEvent + Fired when the mouse enters the marker.
      mouseoutMouseEvent + Fired when the mouse leaves the marker.
      dragstartEvent + Fired when the user starts dragging the marker.
      dragEvent + Fired repeatedly while the user drags the marker.
      dragendEvent + Fired when the user stops dragging the marker.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      getLatLng()LatLngReturns the current geographical position of the marker.
      setLatLng( <LatLng> latlng )thisChanges the marker position to the given point.
      setIcon( <Icon> icon )thisChanges the marker icon.
      setZIndexOffset( <Number> offset )thisChanges the zIndex offset of the marker.
      bindPopup( <String> htmlContent, <Popup options> options? )thisBinds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method.
      unbindPopup()thisUnbinds the popup previously bound to the marker with bindPopup.
      openPopup()thisOpens the popup previously bound by the bindPopup method.
      closePopup()thisCloses the bound popup of the marker if it's opened.
      + +

      Interaction handlers

      + +

      Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

      + +
      marker.dragging.disable();
      + + + + + + + + + + + + +
      PropertyTypeDescription
      draggingIHandlerMarker dragging handler (by both mouse and touch).
      + + + + + +

      Used to open popups in certain places of the map. Use Map#openPopup to open popups while making sure that only one popup is open at one time (recommended for usability), or use Map#addLayer to open as many as you want.

      + +

      Usage example

      +

      If you want to just bind a popup to marker click and then open it, it's really easy:

      +
      marker.bindPopup(popupContent).openPopup();
      +

      Path overlays like polylines also have a bindPopup method. Here's a more complicated way to open a popup on a map:

      + +
      var popup = L.popup()
       	.setLatLng(latlng)
       	.setContent('<p>Hello world!<br />This is a nice popup.</p>')
       	.openOn(map);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Popup( <Popup options> options?, <object> source? ) - new L.Popup()
      - L.popup() -
      Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers.
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      maxWidthNumber300Max width of the popup.
      minWidthNumber50Min width of the popup.
      autoPanBooleantrueSet it to false if you don't want the map to do panning animation to fit the opened popup.
      closeButtonBooleantrueControls the presense of a close button in the popup.
      offsetPointPoint(0, 0)The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays.
      autoPanPaddingPointPoint(5, 5)The margin between the popup and the edges of the map view after autopanning was performed.
      - -

      Methods

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setLatLng( <LatLng> latlng )thisSets the geographical point where the popup will open.
      setContent( <String> htmlContent )thisSets the HTML content of the popup.
      - - - -

      L.TileLayer

      - -

      Used to load and display tile layers on the map, implements ILayer interface.

      - -

      Usage example

      - -
      L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', {
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Popup( <Popup options> options?, <object> source? ) + new L.Popup()
      + L.popup() +
      Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers.
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      maxWidthNumber300Max width of the popup.
      minWidthNumber50Min width of the popup.
      autoPanBooleantrueSet it to false if you don't want the map to do panning animation to fit the opened popup.
      closeButtonBooleantrueControls the presense of a close button in the popup.
      offsetPointPoint(0, 0)The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays.
      autoPanPaddingPointPoint(5, 5)The margin between the popup and the edges of the map view after autopanning was performed.
      + +

      Methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setLatLng( <LatLng> latlng )thisSets the geographical point where the popup will open.
      setContent( <String> htmlContent )thisSets the HTML content of the popup.
      + + + +

      L.TileLayer

      + +

      Used to load and display tile layers on the map, implements ILayer interface.

      + +

      Usage example

      + +
      L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', {
       	key: 'API-key',
       	styleId: 997
       }).addTo(map);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.TileLayer( <String> urlTemplate, <TileLayer options> options? ) - new L.TileLayer()
      - L.tileLayer() -
      Instantiates a tile layer object given a URL template and optionally an options object.
      - -

      URL template

      - -

      A string of the following form:

      - -
      'http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png'
      - -

      {s} means one of the randomly chosen subdomains (their range is specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

      - -

      You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

      - -
      L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
      - -

      Options

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      minZoomNumber0Minimum zoom number.
      maxZoomNumber18Maximum zoom number.
      tileSizeNumber256Tile size (width and height in pixels, assuming tiles are square).
      subdomainsString or String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
      errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
      attributionString''e.g. "© CloudMade" — the string used by the attribution control, describes the layer data.
      tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
      continuousWorldBooleanfalseIf set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps).
      noWrapBooleanfalseIf set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating.
      zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
      zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
      opacityNumber1.0The opacity of the tile layer.
      unloadInvisibleTilesBooleandependsIf true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false.
      updateWhenIdleBooleandependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false.
      reuseTilesBooleanfalseIf true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed.
      - -

      Methods

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setOpacity( <Number> opacity )thisChanges the opacity of the tile layer.
      redraw()-Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas
      - - - -

      L.TileLayer.WMS

      - -

      Used to display WMS services as tile layers on the map. Extends TileLayer, implements ILayer interface.

      - -

      Usage example

      - -
      var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.TileLayer( <String> urlTemplate, <TileLayer options> options? ) + new L.TileLayer()
      + L.tileLayer() +
      Instantiates a tile layer object given a URL template and optionally an options object.
      + +

      URL template

      + +

      A string of the following form:

      + +
      'http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png'
      + +

      {s} means one of the randomly chosen subdomains (their range is specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

      + +

      You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

      + +
      L.tileLayer('http://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png', {foo: 'bar'});
      + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      minZoomNumber0Minimum zoom number.
      maxZoomNumber18Maximum zoom number.
      tileSizeNumber256Tile size (width and height in pixels, assuming tiles are square).
      subdomainsString or String[]'abc'Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings.
      errorTileUrlString''URL to the tile image to show in place of the tile that failed to load.
      attributionString''e.g. "© CloudMade" — the string used by the attribution control, describes the layer data.
      tmsBooleanfalseIf true, inverses Y axis numbering for tiles (turn this on for TMS services).
      continuousWorldBooleanfalseIf set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps).
      noWrapBooleanfalseIf set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating.
      zoomOffsetNumber0The zoom number used in tile URLs will be offset with this value.
      zoomReverseBooleanfalseIf set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom)
      opacityNumber1.0The opacity of the tile layer.
      unloadInvisibleTilesBooleandependsIf true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false.
      updateWhenIdleBooleandependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false.
      reuseTilesBooleanfalseIf true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed.
      + +

      Methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setOpacity( <Number> opacity )thisChanges the opacity of the tile layer.
      redraw()-Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas
      + + + +

      L.TileLayer.WMS

      + +

      Used to display WMS services as tile layers on the map. Extends TileLayer, implements ILayer interface.

      + +

      Usage example

      + +
      var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
       	layers: 'nexrad-n0r-900913',
       	format: 'image/png',
       	transparent: true,
       	attribution: "Weather data © 2012 IEM Nexrad"
       });
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS options> options ) - new L.TileLayer.WMS()
      - L.tileLayer.wms() -
      Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
      - -

      Options

      - -

      Includes all TileLayer options and additionally:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      layersString''(required) Comma-separated list of WMS layers to show.
      stylesString''Comma-separated list of WMS styles.
      formatString'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
      transparentBooleanfalseIf true, the WMS service will return images with transparency.
      versionString'1.1.1'Version of the WMS service to use.
      - - - -

      L.TileLayer.Canvas

      - -

      Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer, implements ILayer interface.

      - -

      Usage example

      - -
      var canvasTiles = L.tileLayer.canvas();
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS options> options ) + new L.TileLayer.WMS()
      + L.tileLayer.wms() +
      Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
      + +

      Options

      + +

      Includes all TileLayer options and additionally:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      layersString''(required) Comma-separated list of WMS layers to show.
      stylesString''Comma-separated list of WMS styles.
      formatString'image/jpeg'WMS image format (use 'image/png' for layers with transparency).
      transparentBooleanfalseIf true, the WMS service will return images with transparency.
      versionString'1.1.1'Version of the WMS service to use.
      + + + +

      L.TileLayer.Canvas

      + +

      Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer, implements ILayer interface.

      + +

      Usage example

      + +
      var canvasTiles = L.tileLayer.canvas();
       
       canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
       	var ctx = canvas.getContext('2d');
       	// draw something on the tile canvas
       }
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.TileLayer.Canvas( <TileLayer options> options? ) - new L.TileLayer.Canvas()
      - L.tileLayer.canvas() -
      Instantiates a Canvas tile layer object given an options object (optionally).
      - -

      Methods

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, <Number> zoom )thisYou need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom.
      redraw()-Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas
      - - -

      L.ImageOverlay

      - -

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      - -

      Usage example

      - -
      var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.TileLayer.Canvas( <TileLayer options> options? ) + new L.TileLayer.Canvas()
      + L.tileLayer.canvas() +
      Instantiates a Canvas tile layer object given an options object (optionally).
      + +

      Methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, <Number> zoom )thisYou need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom.
      redraw()-Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas
      + + +

      L.ImageOverlay

      + +

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      + +

      Usage example

      + +
      var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
       	imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];
       
       L.imageOverlay(imageUrl, imageBounds).addTo(map);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds ) - new L.ImageOverlay()
      - L.imageOverlay() -
      Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to.
      - - - - -

      L.Path

      -

      An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. - -

      Options

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
      colorString'#03f'Stroke color.
      weightNumber5Stroke width in pixels.
      opacityNumber0.5Stroke opacity.
      fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
      fillColorStringsame as colorFill color.
      fillOpacityNumber0.2Fill opacity.
      clickableBooleantrueIf false, the vector will not emit mouse events and will act as a part of the underlying map.
      - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      clickMouseEvent - Fired when the user clicks (or taps) the object.
      dblclickMouseEvent - Fired when the user double-clicks (or double-taps) the object.
      mousedownMouseEvent - Fired when the user pushes the mouse button on the object.
      mouseoverMouseEvent - Fired when the mouse enters the object.
      mouseoutMouseEvent - Fired when the mouse leaves the object.
      - -

      Static properties

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ConstantTypeValueDescription
      SVGBooleandependsTrue if SVG is used for vector rendering (true for most modern browsers).
      VMLBooleandependsTrue if VML is used for vector rendering (IE 6-8).
      CANVASBooleandependsTrue if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow.
      CLIP_PADDINGNumber0.5 for SVG
      0.02 for VML
      How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      bindPopup( <String> htmlContent, <Popup options> options? )thisBinds a popup with a particular HTML content to a click on this path.
      setStyle( <Path options> object )thisChanges the appearance of a Path based on the options in the Path options object.
      getBounds()LatLngBoundsReturns the LatLngBounds of the path.
      - - -

      L.Polyline

      - -

      A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      - -

      Usage example

      -
      // create a red polyline from an arrays of LatLng points
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds ) + new L.ImageOverlay()
      + L.imageOverlay() +
      Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to.
      + + + + +

      L.Path

      +

      An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      strokeBooleantrueWhether to draw stroke along the path. Set it to false to disable borders on polygons or circles.
      colorString'#03f'Stroke color.
      weightNumber5Stroke width in pixels.
      opacityNumber0.5Stroke opacity.
      fillBooleandependsWhether to fill the path with color. Set it to false to disable filling on polygons or circles.
      fillColorStringsame as colorFill color.
      fillOpacityNumber0.2Fill opacity.
      clickableBooleantrueIf false, the vector will not emit mouse events and will act as a part of the underlying map.
      + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      clickMouseEvent + Fired when the user clicks (or taps) the object.
      dblclickMouseEvent + Fired when the user double-clicks (or double-taps) the object.
      mousedownMouseEvent + Fired when the user pushes the mouse button on the object.
      mouseoverMouseEvent + Fired when the mouse enters the object.
      mouseoutMouseEvent + Fired when the mouse leaves the object.
      + +

      Static properties

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ConstantTypeValueDescription
      SVGBooleandependsTrue if SVG is used for vector rendering (true for most modern browsers).
      VMLBooleandependsTrue if VML is used for vector rendering (IE 6-8).
      CANVASBooleandependsTrue if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow.
      CLIP_PADDINGNumber0.5 for SVG
      0.02 for VML
      How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      bindPopup( <String> htmlContent, <Popup options> options? )thisBinds a popup with a particular HTML content to a click on this path.
      setStyle( <Path options> object )thisChanges the appearance of a Path based on the options in the Path options object.
      getBounds()LatLngBoundsReturns the LatLngBounds of the path.
      + + +

      L.Polyline

      + +

      A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      + +

      Usage example

      +
      // create a red polyline from an arrays of LatLng points
       var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
       
       // zoom the map to the polyline
       map.fitBounds(polyline.getBounds());
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Polyline( <LatLng[]> latlngs, <Polyline options> options? ) - new L.Polyline()
      - L.polyline() -
      Instantiates a polyline object given an array of geographical points and optionally an options object.
      - -

      Options

      - -

      You can use Path options and additionally the following options:

      - - - - - - - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means better performance and smoother look, and less means more accurate representation.
      noClipBooleanfalseDisabled polyline clipping.
      - -

      Methods

      - -

      You can use Path methods and additionally the following methods:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      addLatLng( <LatLng> latlng )thisAdds a given point to the polyline.
      setLatLngs( <LatLng[]> latlngs )thisReplaces all the points in the polyline with the given array of geographical points.
      getLatLngs()LatLng[]Returns an array of the points in the path.
      spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng?, … )LatLng[]Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any).
      getBounds()LatLngBoundsReturns the LatLngBounds of the polyline.
      - - - -

      L.MultiPolyline

      - -

      Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.MultiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) - new L.MultiPolyline()
      - L.multiPolyline() -
      Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      - - - -

      L.Polygon

      - -

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      - -

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Polygon( <LatLng[]> latlngs, <Polyline options> options? ) - new L.Polygon()
      - L.polygon() -
      Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.
      - -

      Polygon the same options and methods as Polyline.

      - - - -

      L.MultiPolygon

      - -

      Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.MultiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) - new L.MultiPolygon()
      - L.multiPolygon() -
      Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
      - -

      L.Rectangle

      - -

      A class for drawing rectangle overlays on a map. Extends Polygon. Use Map#addLayer to add it to the map.

      - -

      Usage example

      -
      // define rectangle geographical bounds
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Polyline( <LatLng[]> latlngs, <Polyline options> options? ) + new L.Polyline()
      + L.polyline() +
      Instantiates a polyline object given an array of geographical points and optionally an options object.
      + +

      Options

      + +

      You can use Path options and additionally the following options:

      + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      smoothFactorNumber1.0How much to simplify the polyline on each zoom level. More means better performance and smoother look, and less means more accurate representation.
      noClipBooleanfalseDisabled polyline clipping.
      + +

      Methods

      + +

      You can use Path methods and additionally the following methods:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addLatLng( <LatLng> latlng )thisAdds a given point to the polyline.
      setLatLngs( <LatLng[]> latlngs )thisReplaces all the points in the polyline with the given array of geographical points.
      getLatLngs()LatLng[]Returns an array of the points in the path.
      spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng?, … )LatLng[]Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any).
      getBounds()LatLngBoundsReturns the LatLngBounds of the polyline.
      + + + +

      L.MultiPolyline

      + +

      Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.MultiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) + new L.MultiPolyline()
      + L.multiPolyline() +
      Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      + + + +

      L.Polygon

      + +

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      + +

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Polygon( <LatLng[]> latlngs, <Polyline options> options? ) + new L.Polygon()
      + L.polygon() +
      Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.
      + +

      Polygon the same options and methods as Polyline.

      + + + +

      L.MultiPolygon

      + +

      Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.MultiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) + new L.MultiPolygon()
      + L.multiPolygon() +
      Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
      + +

      L.Rectangle

      + +

      A class for drawing rectangle overlays on a map. Extends Polygon. Use Map#addLayer to add it to the map.

      + +

      Usage example

      +
      // define rectangle geographical bounds
       var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
       
       // create an orange rectangle
      @@ -1860,282 +1801,282 @@ 

      Usage example

      // zoom the map to the rectangle bounds map.fitBounds(bounds);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Rectangle( <LatLngBounds> bounds, <Path options> options? ) - new L.Rectangle()
      - L.rectangle() -
      Instantiates a rectangle object with the given geographical bounds and optionally an options object.
      - -

      Methods

      - -

      You can use Path methods and additionally the following methods:

      - - - - - - - - - - - - -
      MethodReturnsDescription
      setBounds( <LatLngBounds> bounds )thisRedraws the rectangle with the passed bounds.
      - - -

      L.Circle

      - -

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      - -
      L.circle([50.5, 30.5], 200).addTo(map);
      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? ) - new L.Circle()
      - L.circle() -
      Instantiates a circle object given a geographical point, a radius in meters and optionally an options object.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      getLatLng()LatLngReturns the current geographical position of the circle.
      getRadius()NumberReturns the current radius of a circle. Units are in meters.
      setLatLng( <LatLng> latlng )thisSets the position of a circle to a new location.
      setRadius( <Number> radius )thisSets the radius of a circle. Units are in meters.
      - - - -

      L.CircleMarker

      - -

      A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.CircleMarker( <LatLng> latlng, <Path options> options? ) - new L.CircleMarker()
      - L.circleMarker() -
      Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.
      - -

      Methods

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setLatLng( <LatLng> latlng )thisSets the position of a circle marker to a new location.
      setRadius( <Number> radius )thisSets the radius of a circle marker. Units are in pixels.
      - - - -

      L.LayerGroup

      - -

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      - -
      L.layerGroup([marker1, marker2])
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Rectangle( <LatLngBounds> bounds, <Path options> options? ) + new L.Rectangle()
      + L.rectangle() +
      Instantiates a rectangle object with the given geographical bounds and optionally an options object.
      + +

      Methods

      + +

      You can use Path methods and additionally the following methods:

      + + + + + + + + + + + + +
      MethodReturnsDescription
      setBounds( <LatLngBounds> bounds )thisRedraws the rectangle with the passed bounds.
      + + +

      L.Circle

      + +

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      + +
      L.circle([50.5, 30.5], 200).addTo(map);
      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? ) + new L.Circle()
      + L.circle() +
      Instantiates a circle object given a geographical point, a radius in meters and optionally an options object.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      getLatLng()LatLngReturns the current geographical position of the circle.
      getRadius()NumberReturns the current radius of a circle. Units are in meters.
      setLatLng( <LatLng> latlng )thisSets the position of a circle to a new location.
      setRadius( <Number> radius )thisSets the radius of a circle. Units are in meters.
      + + + +

      L.CircleMarker

      + +

      A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.CircleMarker( <LatLng> latlng, <Path options> options? ) + new L.CircleMarker()
      + L.circleMarker() +
      Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.
      + +

      Methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setLatLng( <LatLng> latlng )thisSets the position of a circle marker to a new location.
      setRadius( <Number> radius )thisSets the radius of a circle marker. Units are in pixels.
      + + + +

      L.LayerGroup

      + +

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      + +
      L.layerGroup([marker1, marker2])
       	.addLayer(polyline)
       	.addTo(map);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.LayerGroup( <ILayer[]> layers? ) - new L.LayerGroup()
      - L.layerGroup() -
      Create a layer group, optionally given an initial set of layers.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      addLayer( <ILayer> layer )thisAdds a given layer to the group.
      removeLayer( <ILayer> layer )thisRemoves a given layer from the group.
      clearLayers()thisRemoves all the layers from the group.
      - - - -

      L.FeatureGroup

      - -

      Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

      - -
      L.featureGroup([marker1, marker2, polyline])
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.LayerGroup( <ILayer[]> layers? ) + new L.LayerGroup()
      + L.layerGroup() +
      Create a layer group, optionally given an initial set of layers.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addLayer( <ILayer> layer )thisAdds a given layer to the group.
      removeLayer( <ILayer> layer )thisRemoves a given layer from the group.
      clearLayers()thisRemoves all the layers from the group.
      + + + +

      L.FeatureGroup

      + +

      Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

      + +
      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
       	.on('click', function() { alert('Clicked on a group!'); })
       	.addTo(map);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.FeatureGroup( <IFeature[]> layers? ) - new L.FeatureGroup()
      - L.featureGroup() -
      Create a layer group, optionally given an initial set of layers.
      - -

      Methods

      - -

      Has all LayerGroup methods and additionally:

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      bindPopup( <String> htmlContent, <Popup options> options? )thisBinds a popup with a particular HTML content to a click on any layer from the group.
      getBounds()LatLngBoundsReturns the LatLngBounds of the Feature Group.
      - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      clickMouseEvent - Fired when the user clicks (or taps) the group.
      dblclickMouseEvent - Fired when the user double-clicks (or double-taps) the group.
      mouseoverMouseEvent - Fired when the mouse enters the group.
      mouseoutMouseEvent - Fired when the mouse leaves the group.
      - - -

      L.GeoJSON

      - -

      Represents a GeoJSON layer. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

      - -
      L.geoJson(data, {
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.FeatureGroup( <IFeature[]> layers? ) + new L.FeatureGroup()
      + L.featureGroup() +
      Create a layer group, optionally given an initial set of layers.
      + +

      Methods

      + +

      Has all LayerGroup methods and additionally:

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      bindPopup( <String> htmlContent, <Popup options> options? )thisBinds a popup with a particular HTML content to a click on any layer from the group.
      getBounds()LatLngBoundsReturns the LatLngBounds of the Feature Group.
      + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      clickMouseEvent + Fired when the user clicks (or taps) the group.
      dblclickMouseEvent + Fired when the user double-clicks (or double-taps) the group.
      mouseoverMouseEvent + Fired when the mouse enters the group.
      mouseoutMouseEvent + Fired when the mouse leaves the group.
      + + +

      L.GeoJSON

      + +

      Represents a GeoJSON layer. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

      + +
      L.geoJson(data, {
       	style: function (feature) {
       		return {color: feature.properties.color};
       	},
      @@ -2144,509 +2085,509 @@ 

      L.GeoJSON

      } }).addTo(map);
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.GeoJSON( <Object> geojson?, <GeoJSON options> options? ) - new L.GeoJSON()
      - L.geoJson() -
      Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it later with addData method) and an options object.
      - -

      Options

      - - - - - - - - - - - - - - - - - - - - - - -
      OptionDescription
      pointToLayer( <GeoJSON> featureData, <LatLng> latlng )Function that will be used for creating layers for GeoJSON points (if not specified, simple markers will be created).
      style( <GeoJSON> featureData )Function that will be used to get style options for vector layers created for GeoJSON features.
      onEachFeature( <GeoJSON> featureData, <ILayer> layer )Function that will be called on each created feature layer. Useful for attaching events and popups to features.
      filter( <GeoJSON> featureData, <ILayer> layer )Function that will be used to decide whether to show a feature or not.
      - - -

      Methods

      - - - - - - - - - - - - -
      MethodReturnsDescription
      addData( <GeoJSON> data )BooleanAdds a GeoJSON object to the layer.
      - -

      Static methods

      - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      geometryToLayer( <GeoJSON> featureData, <Function> pointToLayer? )ILayerCreates a layer from a given GeoJSON feature.
      coordsToLatlng( <Array> coords, <Boolean> reverse? )LatLngCreates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude).
      coordsToLatlngs( <Array> coords, <Number> levelsDeep?, <Boolean> reverse? )ArrayCreates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude).
      - - - - -

      L.LatLng

      - -

      Represents a geographical point with a certain latitude and longitude.

      -
      var latlng = new L.LatLng(50.5, 30.5);
      - -

      All Leaflet methods that accept LatLng objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      - -
      map.panTo([50, 30]);
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.GeoJSON( <Object> geojson?, <GeoJSON options> options? ) + new L.GeoJSON()
      + L.geoJson() +
      Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it later with addData method) and an options object.
      + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + +
      OptionDescription
      pointToLayer( <GeoJSON> featureData, <LatLng> latlng )Function that will be used for creating layers for GeoJSON points (if not specified, simple markers will be created).
      style( <GeoJSON> featureData )Function that will be used to get style options for vector layers created for GeoJSON features.
      onEachFeature( <GeoJSON> featureData, <ILayer> layer )Function that will be called on each created feature layer. Useful for attaching events and popups to features.
      filter( <GeoJSON> featureData, <ILayer> layer )Function that will be used to decide whether to show a feature or not.
      + + +

      Methods

      + + + + + + + + + + + + +
      MethodReturnsDescription
      addData( <GeoJSON> data )BooleanAdds a GeoJSON object to the layer.
      + +

      Static methods

      + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      geometryToLayer( <GeoJSON> featureData, <Function> pointToLayer? )ILayerCreates a layer from a given GeoJSON feature.
      coordsToLatlng( <Array> coords, <Boolean> reverse? )LatLngCreates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude).
      coordsToLatlngs( <Array> coords, <Number> levelsDeep?, <Boolean> reverse? )ArrayCreates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude).
      + + + + +

      L.LatLng

      + +

      Represents a geographical point with a certain latitude and longitude.

      +
      var latlng = new L.LatLng(50.5, 30.5);
      + +

      All Leaflet methods that accept LatLng objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      + +
      map.panTo([50, 30]);
       map.panTo(new L.LatLng(50, 30));
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.LatLng( <Number> latitude, <Number> longitude, <Boolean> noWrap? ) - new L.LatLng()
      - L.latLng()
      - L.latLng([]) -
      Creates an object representing a geographical point with the given latitude and longitude. Wraps longitude to lie between -180 and 180 and clamps longitude between -90 and 90 by default — you can disable this with the noWrap argument.
      - -

      Properties

      - - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      latNumberLatitude in degrees.
      lngNumberLongitude in degrees.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      distanceTo( <LatLng> otherLatlng )NumberReturns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia
      equals( <LatLng> otherLatlng )BooleanReturns true if the given LatLng point is at the same position (within a small margin of error).
      toString()StringReturns a string representation of the point (for debugging purposes).
      - -

      Constants

      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ConstantTypeValueDescription
      DEG_TO_RADNumberMath.PI / 180A multiplier for converting degrees into radians.
      RAD_TO_DEGNumber180 / Math.PIA multiplier for converting radians into degrees.
      MAX_MARGINNumber1.0E-9Max margin of error for the equality check.
      - - - - -

      L.LatLngBounds

      - -

      Represents a rectangular geographical area on a map.

      -
      var southWest = new L.LatLng(40.712, -74.227),
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.LatLng( <Number> latitude, <Number> longitude, <Boolean> noWrap? ) + new L.LatLng()
      + L.latLng()
      + L.latLng([]) +
      Creates an object representing a geographical point with the given latitude and longitude. Wraps longitude to lie between -180 and 180 and clamps longitude between -90 and 90 by default — you can disable this with the noWrap argument.
      + +

      Properties

      + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      latNumberLatitude in degrees.
      lngNumberLongitude in degrees.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      distanceTo( <LatLng> otherLatlng )NumberReturns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia
      equals( <LatLng> otherLatlng )BooleanReturns true if the given LatLng point is at the same position (within a small margin of error).
      toString()StringReturns a string representation of the point (for debugging purposes).
      + +

      Constants

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ConstantTypeValueDescription
      DEG_TO_RADNumberMath.PI / 180A multiplier for converting degrees into radians.
      RAD_TO_DEGNumber180 / Math.PIA multiplier for converting radians into degrees.
      MAX_MARGINNumber1.0E-9Max margin of error for the equality check.
      + + + + +

      L.LatLngBounds

      + +

      Represents a rectangular geographical area on a map.

      +
      var southWest = new L.LatLng(40.712, -74.227),
       	northEast = new L.LatLng(40.774, -74.125),
       	bounds = new L.LatLngBounds(southWest, northEast);
      -

      All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      +

      All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      -
      map.fitBounds([
      +
      map.fitBounds([
       	[40.712, -74.227], 
       	[40.774, -74.125]
       ]);
      -

      Constructor

      - - - - - - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.LatLngBounds( <LatLng> southWest, <LatLng> northEast ) - new L.LatLngBounds()
      - L.latLngBounds()
      - L.latLngBounds([]) -
      Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle.
      L.LatLngBounds( <LatLng[]> latlngs ) - new L.LatLngBounds()
      - L.latLngBounds() -
      Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      extend( <LatLng|LatLngBounds> latlng )thisExtends the bounds to contain the given point or bounds.
      getSouthWest()LatLngReturns the south-west point of the bounds.
      getNorthEast()LatLngReturns the north-east point of the bounds.
      getNorthWest()LatLngReturns the north-west point of the bounds.
      getSouthEast()LatLngReturns the south-east point of the bounds.
      getCenter()LatLngReturns the center point of the bounds.
      contains( <LatLngBounds> otherBounds )BooleanReturns true if the rectangle contains the given one.
      contains( <LatLng> latlng )BooleanReturns true if the rectangle contains the given point.
      intersects( <LatLngBounds> otherBounds )BooleanReturns true if the rectangle intersects the given bounds.
      equals( <LatLngBounds> otherBounds )BooleanReturns true if the rectangle is equivalent (within a small margin of error) to the given bounds.
      toBBoxString()StringReturns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
      - - - - -

      L.Point

      - -

      Represents a point with x and y coordinates in pixels.

      - -
      var point = new L.Point(200, 300);
      - -

      All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      - -
      map.panBy([200, 300]);
      +

      Constructor

      + + + + + + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.LatLngBounds( <LatLng> southWest, <LatLng> northEast ) + new L.LatLngBounds()
      + L.latLngBounds()
      + L.latLngBounds([]) +
      Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle.
      L.LatLngBounds( <LatLng[]> latlngs ) + new L.LatLngBounds()
      + L.latLngBounds() +
      Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      extend( <LatLng|LatLngBounds> latlng )thisExtends the bounds to contain the given point or bounds.
      getSouthWest()LatLngReturns the south-west point of the bounds.
      getNorthEast()LatLngReturns the north-east point of the bounds.
      getNorthWest()LatLngReturns the north-west point of the bounds.
      getSouthEast()LatLngReturns the south-east point of the bounds.
      getCenter()LatLngReturns the center point of the bounds.
      contains( <LatLngBounds> otherBounds )BooleanReturns true if the rectangle contains the given one.
      contains( <LatLng> latlng )BooleanReturns true if the rectangle contains the given point.
      intersects( <LatLngBounds> otherBounds )BooleanReturns true if the rectangle intersects the given bounds.
      equals( <LatLngBounds> otherBounds )BooleanReturns true if the rectangle is equivalent (within a small margin of error) to the given bounds.
      toBBoxString()StringReturns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data.
      + + + + +

      L.Point

      + +

      Represents a point with x and y coordinates in pixels.

      + +
      var point = new L.Point(200, 300);
      + +

      All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      + +
      map.panBy([200, 300]);
       map.panBy(new L.Point(200, 300));
      -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Point( <Number> x, <Number> y, <Boolean> round? ) - new L.Point()
      - L.point()
      - L.point([]) -
      Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
      - -

      Properties

      - - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      xNumberThe x coordinate.
      yNumberThe y coordinate.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      add( <Point> otherPoint )PointReturns the result of addition of the current and the given points.
      subtract( <Point> otherPoint )PointReturns the result of subtraction of the given point from the current.
      multiplyBy( <Number> number )PointReturns the result of multiplication of the current point by the given number.
      divideBy( <Number> number, <Boolean> round? )PointReturns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result.
      distanceTo( <Point> otherPoint )NumberReturns the distance between the current and the given points.
      clone()PointReturns a copy of the current point.
      round()PointReturns a copy of the current point with rounded coordinates.
      toString()StringReturns a string representation of the point for debugging purposes.
      - - - -

      L.Bounds

      - -

      Represents a rectangular area in pixel coordinates.

      -
      var p1 = new L.Point(10, 10),
      +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Point( <Number> x, <Number> y, <Boolean> round? ) + new L.Point()
      + L.point()
      + L.point([]) +
      Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
      + +

      Properties

      + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      xNumberThe x coordinate.
      yNumberThe y coordinate.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      add( <Point> otherPoint )PointReturns the result of addition of the current and the given points.
      subtract( <Point> otherPoint )PointReturns the result of subtraction of the given point from the current.
      multiplyBy( <Number> number )PointReturns the result of multiplication of the current point by the given number.
      divideBy( <Number> number, <Boolean> round? )PointReturns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result.
      distanceTo( <Point> otherPoint )NumberReturns the distance between the current and the given points.
      clone()PointReturns a copy of the current point.
      round()PointReturns a copy of the current point with rounded coordinates.
      toString()StringReturns a string representation of the point for debugging purposes.
      + + + +

      L.Bounds

      + +

      Represents a rectangular area in pixel coordinates.

      +
      var p1 = new L.Point(10, 10),
       	p2 = new L.Point(40, 60),
       	bounds = new L.Bounds(p1, p2);
      -

      All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      - -
      otherBounds.intersects([[10, 10], [40, 60]]);
      - -

      Constructor

      - - - - - - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Bounds( <Point> topLeft, <Point> bottomRight ) - new L.Bounds()
      - L.bounds()
      - L.bounds([]) -
      Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
      L.LatLngBounds( <Point[]> points ) - new L.Bounds()
      - L.bounds() -
      Creates a Bounds object defined by the points it contains.
      - -

      Properties

      - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      minPoint - The top left corner of the rectangle.
      maxPoint - The bottom right corner of the rectangle.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      extend( <Point> point )-Extends the bounds to contain the given point.
      getCenter()PointReturns the center point of the bounds.
      contains( <Bounds> otherBounds )BooleanReturns true if the rectangle contains the given one.
      contains( <Point> point )BooleanReturns true if the rectangle contains the given point.
      intersects( <Bounds> otherBounds )BooleanReturns true if the rectangle intersects the given bounds.
      - - -

      L.Icon

      - -

      Represents an icon to provide when creating a marker.

      - -
      var myIcon = L.icon({
      +

      All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      + +
      otherBounds.intersects([[10, 10], [40, 60]]);
      + +

      Constructor

      + + + + + + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Bounds( <Point> topLeft, <Point> bottomRight ) + new L.Bounds()
      + L.bounds()
      + L.bounds([]) +
      Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
      L.LatLngBounds( <Point[]> points ) + new L.Bounds()
      + L.bounds() +
      Creates a Bounds object defined by the points it contains.
      + +

      Properties

      + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      minPoint + The top left corner of the rectangle.
      maxPoint + The bottom right corner of the rectangle.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      extend( <Point> point )-Extends the bounds to contain the given point.
      getCenter()PointReturns the center point of the bounds.
      contains( <Bounds> otherBounds )BooleanReturns true if the rectangle contains the given one.
      contains( <Point> point )BooleanReturns true if the rectangle contains the given point.
      intersects( <Bounds> otherBounds )BooleanReturns true if the rectangle intersects the given bounds.
      + + +

      L.Icon

      + +

      Represents an icon to provide when creating a marker.

      + +
      var myIcon = L.icon({
       	iconUrl: 'my-icon.png',
       	shadowUrl: 'my-icon-shadow.png',
       	iconSize: [38, 95],
      @@ -2657,137 +2598,137 @@ 

      L.Icon

      L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
      -

      L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

      - -

      Constructor

      - - - - - - - - - - - - -
      ConstructorUsageDescription
      L.Icon( <Icon properties> props ) - new L.Icon()
      - L.icon() -
      Creates an icon instance with the given properties.
      - -

      Properties

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      iconUrlString - (required) The URL to the icon image (absolute or relative to your script path).
      iconSizePoint - Size of the icon image in pixels.
      iconAnchorPoint - The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location.
      shadowUrlString - The URL to the icon shadow image. If shadowUrl is null then no shadow image will be created.
      shadowSizePoint - Size of the shadow image in pixels.
      shadowOffsetPoint - Position of the shadow relative to the icon ((0, 0) by default)
      popupAnchorPoint - The point from which the marker popup opens, relative to the anchor point.
      - - - -

      L.Control.Zoom

      - -

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Implements IControl interface.

      - -

      Constructor

      - - - - - - - - - -
      ConstructorDescription
      L.Control.Zoom()Creates a zoom control.
      - - - -

      L.Control.Attribution

      - -

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Implements IControl interface.

      - -

      Constructor

      - - - - - - - - - -
      ConstructorDescription
      L.Control.Attribution()Creates an attribution control.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setPrefix( <String> prefix )-Sets the string before the attributions ("Powered by Leaflet" by default).
      addAttribution( <String> text )-Adds an attribution text (e.g. "Vector data &copy; CloudMade").
      removeAttribution( <String> text )-Removes an attribution text.
      - - -

      L.Control.Layers

      - -

      The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). It should be created and added explicitly to the map using Map#addControl method. Implements IControl interface.

      - -
      var baseLayers = {
      +

      L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Icon( <Icon properties> props ) + new L.Icon()
      + L.icon() +
      Creates an icon instance with the given properties.
      + +

      Properties

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      iconUrlString + (required) The URL to the icon image (absolute or relative to your script path).
      iconSizePoint + Size of the icon image in pixels.
      iconAnchorPoint + The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location.
      shadowUrlString + The URL to the icon shadow image. If shadowUrl is null then no shadow image will be created.
      shadowSizePoint + Size of the shadow image in pixels.
      shadowOffsetPoint + Position of the shadow relative to the icon ((0, 0) by default)
      popupAnchorPoint + The point from which the marker popup opens, relative to the anchor point.
      + + + +

      L.Control.Zoom

      + +

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Implements IControl interface.

      + +

      Constructor

      + + + + + + + + + +
      ConstructorDescription
      L.Control.Zoom()Creates a zoom control.
      + + + +

      L.Control.Attribution

      + +

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Implements IControl interface.

      + +

      Constructor

      + + + + + + + + + +
      ConstructorDescription
      L.Control.Attribution()Creates an attribution control.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setPrefix( <String> prefix )-Sets the string before the attributions ("Powered by Leaflet" by default).
      addAttribution( <String> text )-Adds an attribution text (e.g. "Vector data &copy; CloudMade").
      removeAttribution( <String> text )-Removes an attribution text.
      + + +

      L.Control.Layers

      + +

      The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). It should be created and added explicitly to the map using Map#addControl method. Implements IControl interface.

      + +
      var baseLayers = {
       	"CloudMade": cloudmade,
       	"OpenStreetMap": osm
       };
      @@ -2801,296 +2742,296 @@ 

      L.Control.Layers

      map.addControl(layersControl);
      -

      Constructor

      - - - - - - - - - -
      ConstructorDescription
      L.Control.Layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? )Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      addBaseLayer( <ILayer> layer, <String> name )thisAdds a base layer (radio button entry) with the given name to the control.
      addOverlay( <ILayer> layer, <String> name )thisAdds an overlay (checkbox entry) with the given name to the control.
      removeLayer( <ILayer> layer )thisRemove the given layer from the control.
      - -

      Options

      - - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      collapsedBooleantrueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
      - - -

      Layer Config

      - -

      An object literal with layer names as keys and layer objects as values:

      - -
      {
      +

      Constructor

      + + + + + + + + + +
      ConstructorDescription
      L.Control.Layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? )Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes.
      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addBaseLayer( <ILayer> layer, <String> name )thisAdds a base layer (radio button entry) with the given name to the control.
      addOverlay( <ILayer> layer, <String> name )thisAdds an overlay (checkbox entry) with the given name to the control.
      removeLayer( <ILayer> layer )thisRemove the given layer from the control.
      + +

      Options

      + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      collapsedBooleantrueIf true, the control will be collapsed into an icon and expanded on mouse hover or touch.
      + + +

      Layer Config

      + +

      An object literal with layer names as keys and layer objects as values:

      + +
      {
       	"<someName1>": layer1,
       	"<someName2>": layer2
       }
      -

      Events methods

      +

      Events methods

      -

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

      +

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

      -

      Example

      +

      Example

      -
      map.on('click', function(e) {
      +
      map.on('click', function(e) {
       	alert(e.latlng);
       });
      -

      Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

      +

      Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function:

      -
      function onClick(e) { ... }
      +
      function onClick(e) { ... }
       
       map.on('click', onClick);
       map.off('click', onClick);
      -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      addEventListener( <String> type, <Function> fn, <Object> context? )thisAdds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to).
      removeEventListener( <String> type, <Function> fn, <Object> context? )thisRemoves a previously added listener function.
      on( … )thisAlias to addEventListener.
      off( … )thisAlias to removeEventListener.
      hasEventListeners( <String> type )BooleanReturns true if a particular event type has some listeners attached to it.
      fireEvent( <String> type, <Object> data? )thisFires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties.
      fire( … )thisAlias to fireEvent.
      - - -

      Event objects

      - -

      Event object is an object that you recieve as an argument in a listener function when some event is fired, containing useful information about that event. For example:

      - -
      map.on('click', function(e) {
      +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addEventListener( <String> type, <Function> fn, <Object> context? )thisAdds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to).
      removeEventListener( <String> type, <Function> fn, <Object> context? )thisRemoves a previously added listener function.
      on( … )thisAlias to addEventListener.
      off( … )thisAlias to removeEventListener.
      hasEventListeners( <String> type )BooleanReturns true if a particular event type has some listeners attached to it.
      fireEvent( <String> type, <Object> data? )thisFires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties.
      fire( … )thisAlias to fireEvent.
      + + +

      Event objects

      + +

      Event object is an object that you recieve as an argument in a listener function when some event is fired, containing useful information about that event. For example:

      + +
      map.on('click', function(e) {
       	alert(e.latlng); // e is an event object (MouseEvent in this case)
       });
      -

      Event

      - -

      The base event object. All other event objects contain these properties too.

      - - - - - - - - - - - - - - - - - -
      propertytypedescription
      typeStringThe event type (e.g. 'click').
      targetObjectThe object that fired the event.
      - -

      MouseEvent

      - - - - - - - - - - - - - - - - - -
      propertytypedescription
      latlngLatLngThe geographical point where the mouse event occured.
      layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.
      - -

      LocationEvent

      - - - - - - - - - - - - - - - - - - - - - - -
      propertytypedescription
      latlngLatLngDetected geographical location of the user.
      boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
      accuracyNumberAccuracy of location in meters.
      - -

      ErrorEvent

      - - - - - - - - - - - - - - - - - -
      propertytypedescription
      messageStringError message.
      codeNumberError code (if applicable).
      - -

      LayerEvent

      - - - - - - - - - - - - -
      propertytypedescription
      layerILayerThe layer that was added or removed.
      - -

      GeoJSON event

      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      propertytypedescription
      layerILayerThe layer for the GeoJSON feature that is being added to the map.
      propertiesObjectGeoJSON properties of the feature.
      geometryTypeStringGeoJSON geometry type of the feature.
      idStringGeoJSON ID of the feature (if present).
      - - - - - - - - - - - - - - -
      propertytypedescription
      popupPopupThe popup that was opened or closed.
      - - - - - -

      L.Class

      - -

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      -

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      +

      Event

      + +

      The base event object. All other event objects contain these properties too.

      + + + + + + + + + + + + + + + + + +
      propertytypedescription
      typeStringThe event type (e.g. 'click').
      targetObjectThe object that fired the event.
      + +

      MouseEvent

      + + + + + + + + + + + + + + + + + +
      propertytypedescription
      latlngLatLngThe geographical point where the mouse event occured.
      layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.
      + +

      LocationEvent

      + + + + + + + + + + + + + + + + + + + + + + +
      propertytypedescription
      latlngLatLngDetected geographical location of the user.
      boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
      accuracyNumberAccuracy of location in meters.
      + +

      ErrorEvent

      + + + + + + + + + + + + + + + + + +
      propertytypedescription
      messageStringError message.
      codeNumberError code (if applicable).
      + +

      LayerEvent

      + + + + + + + + + + + + +
      propertytypedescription
      layerILayerThe layer that was added or removed.
      + +

      GeoJSON event

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      propertytypedescription
      layerILayerThe layer for the GeoJSON feature that is being added to the map.
      propertiesObjectGeoJSON properties of the feature.
      geometryTypeStringGeoJSON geometry type of the feature.
      idStringGeoJSON ID of the feature (if present).
      + + + + + + + + + + + + + + +
      propertytypedescription
      popupPopupThe popup that was opened or closed.
      + + + + + +

      L.Class

      + +

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      +

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      var MyClass = L.Class.extend({
       	initialize: function (greeter) {
      @@ -3110,22 +3051,22 @@ 

      L.Class

      a.greet("World");
      -

      Inheritance

      +

      Inheritance

      -

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      +

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      var MyChildClass = MyClass.extend({
       	// ... new properties and methods
       });
      -

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      +

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      var a = new MyChildClass();
       a instanceof MyChildClass; // true
       a instanceof MyClass; // true
       
      -

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      +

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      var MyChildClass = MyClass.extend({
       	initialize: function () {
      @@ -3140,9 +3081,9 @@ 

      Inheritance

      var a = new MyChildClass(); a.greet('Jason'); // alerts "Yo, bro Jason!"
      -

      Options

      +

      Options

      -

      options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

      +

      options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

      var MyClass = L.Class.extend({
       	options: {
      @@ -3163,7 +3104,7 @@ 

      Options

      a.options.myOption2; // 'bar' a.options.myOption3; // 5
      -

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defauls defines in the class:

      +

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defauls defines in the class:

      var MyClass = L.Class.extend({
       	options: {
      @@ -3180,9 +3121,9 @@ 

      Options

      var a = new MyClass({bla: 10}); a.options; // {foo: 'bar', bla: 10}
      -

      Includes

      +

      Includes

      -

      includes is a special class property that merges all specified objects into the class (such objects are called mixins). A good example of this is L.Mixin.Events that event-related methods like on, off and fire to the class.

      +

      includes is a special class property that merges all specified objects into the class (such objects are called mixins). A good example of this is L.Mixin.Events that event-related methods like on, off and fire to the class.

       var MyMixin = {
       	foo: function () { ... },
      @@ -3196,13 +3137,13 @@ 

      Includes

      var a = new MyClass(); a.foo();
      -

      You can also do such includes in runtime with the include method:

      +

      You can also do such includes in runtime with the include method:

      MyClass.include(MyMixin);
      -

      Statics

      +

      Statics

      -

      statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

      +

      statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

      var MyClass = L.Class.extend({
       	statics: {
      @@ -3215,365 +3156,323 @@ 

      Statics

      -

      L.Browser

      +

      L.Browser

      -

      A namespace with properties for browser/feature detection used by Leaflet internally.

      +

      A namespace with properties for browser/feature detection used by Leaflet internally.

      if (L.Browser.ie6) {
      -	alert('Upgrade your browser, dude!');
      +alert('Upgrade your browser, dude!');
       }
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      propertytypedescription
      ieBooleantrue for all Internet Explorer versions.
      ie6Booleantrue for Internet Explorer 6.
      webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
      webkit3dBooleantrue for webkit-based browsers that support CSS 3D transformations.
      geckoBooleantrue for Gecko-based browsers like Firefox and Mozilla.
      operaBooleantrue for Opera.
      androidBooleantrue for Android mobile browser.
      mobileBooleantrue for modern mobile browsers (including iOS Safari and different Android browsers).
      mobileWebkitBooleantrue for mobile webkit-based browsers.
      mobileOperaBooleantrue for mobile Opera.
      touchBooleantrue for all browsers on touch devices.
      - - -

      L.Util

      - -

      Various utility functions, used by Leaflet internally.

      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      extend( <Object> dest, <Object> src?.. )ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter.
      bind( <Function> fn, <Object> obj )FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code).
      stamp( <Object> obj )StringApplies a unique key to the object and returns that key.
      limitExecByInterval( <Function> fn, <Number> time, <Object> context? )FunctionReturns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called.
      falseFn()FunctionReturns a function which always returns false.
      formatNum( <Number> num, <Number> digits )NumberReturns the number num rounded to digits decimals.
      splitWords( <String> str )String[]Trims and splits the string on whitespace and returns the array of parts.
      setOptions( <Object> obj, <Object> options )ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options.
      getParamString( <Object> obj )StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'.
      template( <String> str, <Object> data )StringSimple templating facility, creates a string by applying the values of the data object of a form {a: 'foo', b: 'bar', …} to a template string of the form 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'.
      - -

      Properties

      - - - - - - - - - - - - -
      PropertyTypeDescription
      emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. Used as a hack to free memory from unused images on WebKit-powered mobile devices (by setting image src to this string).
      - - - -

      L.DomUtil

      - -

      Utility functions to work with the DOM tree, used by Leaflet internally.

      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      get( <String or HTMLElement> id )HTMLElementReturns an element with the given id if a string was passed, or just returns the element if it was passed directly.
      getStyle( <HTMLElement> el, <String> style )StringReturns the value for a certain style attribute on an element, including computed values or values set through CSS.
      getViewportOffset( <HTMLElement> el )PointReturns the offset to the viewport for the requested element.
      create( <String> tagName, <String> className, <HTMLElement> container? )HTMLElementCreates an element with tagName, sets the className, and optionally appends it to container element.
      disableTextSelection()-Makes sure text cannot be selected, for example during dragging.
      enableTextSelection()-Makes text selection possible again.
      hasClass( <HTMLElement> el, <String> name )BooleanReturns true if the element class attribute contains name.
      addClass( <HTMLElement> el, <String> name )-Adds name to the element's class attribute.
      removeClass( <HTMLElement> el, <String> name )-Removes name from the element's class attribute.
      setOpacity( <HTMLElement> el, <Number> value )-Set the opacity of an element (including old IE support). Value must be from 0 to 1.
      testProp( <String[]> props )String or falseGoes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform.
      getTranslateString( <Point> point )StringReturns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers.
      getScaleString( <Number> scale, <Point> origin )StringReturns a CSS transform string to scale an element (with the given scale origin).
      setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? )-Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true.
      getPosition( <HTMLElement> el )PointReturns the coordinates of an element previously positioned with setPosition.
      - -

      Properties

      - - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      TRANSITIONStringVendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit).
      TRANSFORMStringVendor-prefixed transform style name.
      - - -

      IHandler

      -

      An interface implemented by interaction handlers.

      - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      - -

      L.version

      - -

      A constant that represents the Leaflet version in use.

      - -

      L.version // returns "0.4" (or whatever version is currently in use)
      - - -

      L.noConflict()

      - -

      This method restores the L global variale to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      - -

      // L points to some other library
      +
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +
      propertytypedescription
      ieBooleantrue for all Internet Explorer versions.
      ie6Booleantrue for Internet Explorer 6.
      webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
      webkit3dBooleantrue for webkit-based browsers that support CSS 3D transformations.
      geckoBooleantrue for Gecko-based browsers like Firefox and Mozilla.
      operaBooleantrue for Opera.
      androidBooleantrue for Android mobile browser.
      mobileBooleantrue for modern mobile browsers (including iOS Safari and different Android browsers).
      mobileWebkitBooleantrue for mobile webkit-based browsers.
      mobileOperaBooleantrue for mobile Opera.
      touchBooleantrue for all browsers on touch devices.
      + + +

      L.Util

      + +

      Various utility functions, used by Leaflet internally.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      extend( <Object> dest, <Object> src?.. )ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter.
      bind( <Function> fn, <Object> obj )FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code).
      stamp( <Object> obj )StringApplies a unique key to the object and returns that key.
      limitExecByInterval( <Function> fn, <Number> time, <Object> context? )FunctionReturns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called.
      falseFn()FunctionReturns a function which always returns false.
      formatNum( <Number> num, <Number> digits )NumberReturns the number num rounded to digits decimals.
      splitWords( <String> str )String[]Trims and splits the string on whitespace and returns the array of parts.
      setOptions( <Object> obj, <Object> options )ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options.
      getParamString( <Object> obj )StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'.
      template( <String> str, <Object> data )StringSimple templating facility, creates a string by applying the values of the data object of a form {a: 'foo', b: 'bar', …} to a template string of the form 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'.
      + +

      Properties

      + + + + + + + + + + + + +
      PropertyTypeDescription
      emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. Used as a hack to free memory from unused images on WebKit-powered mobile devices (by setting image src to this string).
      + + + +

      L.DomUtil

      + +

      Utility functions to work with the DOM tree, used by Leaflet internally.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      get( <String or HTMLElement> id )HTMLElementReturns an element with the given id if a string was passed, or just returns the element if it was passed directly.
      getStyle( <HTMLElement> el, <String> style )StringReturns the value for a certain style attribute on an element, including computed values or values set through CSS.
      getViewportOffset( <HTMLElement> el )PointReturns the offset to the viewport for the requested element.
      create( <String> tagName, <String> className, <HTMLElement> container? )HTMLElementCreates an element with tagName, sets the className, and optionally appends it to container element.
      disableTextSelection()-Makes sure text cannot be selected, for example during dragging.
      enableTextSelection()-Makes text selection possible again.
      hasClass( <HTMLElement> el, <String> name )BooleanReturns true if the element class attribute contains name.
      addClass( <HTMLElement> el, <String> name )-Adds name to the element's class attribute.
      removeClass( <HTMLElement> el, <String> name )-Removes name from the element's class attribute.
      setOpacity( <HTMLElement> el, <Number> value )-Set the opacity of an element (including old IE support). Value must be from 0 to 1.
      testProp( <String[]> props )String or falseGoes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform.
      getTranslateString( <Point> point )StringReturns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers.
      getScaleString( <Number> scale, <Point> origin )StringReturns a CSS transform string to scale an element (with the given scale origin).
      setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? )-Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true.
      getPosition( <HTMLElement> el )PointReturns the coordinates of an element previously positioned with setPosition.
      + +

      Properties

      + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      TRANSITIONStringVendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit).
      TRANSFORMStringVendor-prefixed transform style name.
      + + +

      IHandler

      +

      An interface implemented by interaction handlers.

      + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      + +

      L.version

      + +

      A constant that represents the Leaflet version in use.

      + +

      L.version // returns "0.4" (or whatever version is currently in use)
      + + +

      L.noConflict()

      + +

      This method restores the L global variale to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      + +

      // L points to some other library
       ...
       // you include Leaflet, it replaces the L variable to Leaflet namespace
       
       var Leaflet = L.noConflict();
      -// now L points to that other library again, and you can use Leaflet.Map etc.
      - - - -
      - -

      © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

      - - - Fork me on GitHub - - - - - - - - +// now L points to that other library again, and you can use Leaflet.Map etc.
      \ No newline at end of file From 45e98842578ad8dc0cc63cbd7edfd47f8c2c3a23 Mon Sep 17 00:00:00 2001 From: mourner Date: Mon, 16 Jul 2012 23:56:37 +0300 Subject: [PATCH 0156/2207] remove outdated files --- download.html | 133 ---------------- examples.html | 148 ------------------ examples/quick-start.html | 315 -------------------------------------- index.html | 164 -------------------- 4 files changed, 760 deletions(-) delete mode 100644 download.html delete mode 100644 examples.html delete mode 100644 examples/quick-start.html delete mode 100644 index.html diff --git a/download.html b/download.html deleted file mode 100644 index 65c0a1a61f8..00000000000 --- a/download.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Download - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - - - - -

      Download Leaflet

      - -

      Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system. The production files (included the same way as in the code above) are in the dist folder.

      - -

      - Download Leaflet 0.3.1 stable (February 14, 2012)
      - Download Leaflet 0.4 master (in-progress version) -

      - -

      - View Changelog -

      - -

      Using a hosted version of Leaflet

      - -

      The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the head section of your HTML:

      -
      <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.css" />
      -<!--[if lte IE 8]>
      -	<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.ie.css" />
      -<![endif]-->
      -
      -<script src="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.js"></script>
      - -

      Building a custom version of Leaflet

      -

      Open build/build.html page from the download package, check the components you want to see in your build and then follow the instructions there.

      - -
      - -

      © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - diff --git a/examples.html b/examples.html deleted file mode 100644 index f1a6811c6ec..00000000000 --- a/examples.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Examples - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - - - -

      Leaflet tutorials

      - -

      Every example here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers.

      - -
      - - -

      Leaflet Quick Start Guide

      -

      A simple step-by-step guide that will quickly get you started with Leaflet basics, including setting up a Leaflet map (with CloudMade tiles) on your page, working with markers, polylines and popups, and dealing with events.

      - -
      - - -

      Leaflet on Mobile

      -

      In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

      -
      - - -

      Markers With Custom Icons

      -

      In this pretty example, you'll learn how to easily define your own icons for use by the markers you put on the map.

      -
      - - -

      Using GeoJSON with Leaflet

      -

      In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

      -
      - - -

      Layer Groups and Layers Control

      -

      A tutorial on how to manage groups of layers and use the layer switching control.

      -
      - -

      Custom Controls

      -

      A brief tutorial on implementing custom map controls.

      -
      - -

      Custom Overlays

      -

      If markers, popups and vectors are not enough for you, here's a guide for creating your own map overlays (things to put on a map).

      -
      - -

      More examples coming soon!

      - -
      - -

      © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - diff --git a/examples/quick-start.html b/examples/quick-start.html deleted file mode 100644 index d0df5a2c30a..00000000000 --- a/examples/quick-start.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Quick Start Guide - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - -

      ← Back to the list of examples

      -

      Leaflet Quick Start Guide

      - -

      This step-by-step guide will quickly get you started on Leaflet basics, including setting up a Leaflet map, working with markers, polylines and popups, and dealing with events.

      - -
      - - -

      View example on a separate page →

      - -

      Preparing your page

      - -

      Before writing any code for the map, you need to do the following preparation steps on your page:

      - -
        -
      1. Download Leaflet and put the contents of the dist folder somewhere in your project directory
      2. -
      3. Include Leaflet CSS files in the head section of your document: -
        <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.css" />
        -<!--[if lte IE 8]>
        -	<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.ie.css" />
        -<![endif]-->
        -
      4. - -
      5. Include Leaflet JavaScript file somewhere on the page (preferably before body close tag): -
        <script src="http://cdn.leafletjs.com/leaflet-0.3.1/leaflet.js"></script>
      6. - -
      7. Put a div element with a certain id where you want your map to be (making sure it has defined height): -
        <div id="map" style="height: 200px"></div>
      8. -
      - -

      Now you're ready to initialize the map and do some stuff with it.

      - - -

      Setting up the map

      - -
      - - -

      Let's create a map instance, set its view to the center of London and add a pretty CloudMade tile layer to it. First we'll initialize the map:

      - -
      var map = new L.Map('map');
      - -

      By default (as we didn't pass any options when creating the map instance), all mouse and touch interactions on the map are enabled, and it has zoom and attribution controls.

      - -

      Next we'll create a tile layer to add to our map, in this case it's a CloudMade tile layer with Fresh style. Creating a tile layer usually involves setting the URL template for the tile images (get yours at CloudMade), the attribution text and the maximum zoom level of the layer:

      - -
      var cloudmade = new L.TileLayer('http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png', {
      -	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
      -	maxZoom: 18
      -});
      - -

      It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles, and it doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd recommend CloudMade though, it looks beautiful).

      - -

      Finally we'll set the map view to the center of London at 13th zoom level and add our tile layer (see the resulting map above):

      - -
      var london = new L.LatLng(51.505, -0.09); // geographical point (longitude and latitude)
      -map.setView(london, 13).addLayer(cloudmade);
      - -

      Make sure this code is below both the map div and leaflet.js inclusion, or in a window.load or document.ready event handler.

      - -

      Markers, circles and polygons

      - -
      - - -

      Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker:

      - -
      var markerLocation = new L.LatLng(51.5, -0.09);
      -
      -var marker = new L.Marker(markerLocation);
      -map.addLayer(marker);
      - -

      Adding a circle is the same (except for specifying the radius in meters), but lets configure it by passing options as a third argument when creating the object (the second argument is the radius in pixels):

      - -
      var circleLocation = new L.LatLng(51.508, -0.11),
      -	circleOptions = {
      -		color: 'red',
      -		fillColor: '#f03',
      -		fillOpacity: 0.5
      -	};
      -
      -var circle = new L.Circle(circleLocation, 500, circleOptions);
      -map.addLayer(circle);
      - -

      Add a polygon is easy too:

      -
      var p1 = new L.LatLng(51.509, -0.08),
      -	p2 = new L.LatLng(51.503, -0.06),
      -	p3 = new L.LatLng(51.51, -0.047),
      -	polygonPoints = [p1, p2, p3];
      -
      -var polygon = new L.Polygon(polygonPoints);
      -map.addLayer(polygon);
      - - -

      Working with popups

      - -
      - - -

      Popups are usually used when you want to attach some information to a particular object on a map. Leaflet has a very handy shortcut for this:

      - -
      marker.bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
      -circle.bindPopup("I am a circle.");
      -polygon.bindPopup("I am a polygon.");
      - -

      Try clicking on our objects. The bindPopup method attaches a popup with the specified HTML content to your marker so the popup appears when you click on the object, and the openPopup method (for markers only) immediately opens the attached popup.

      - -

      You can also use popups as layers (when you need something more than attching a popup to an object):

      - -
      var popup = new L.Popup();
      -
      -popup.setLatLng(new L.LatLng(51.5, -0.09));
      -popup.setContent("I am a standalone popup.");
      -
      -map.openPopup(popup);
      - -

      Here we use openPopup instead of addLayer because it handles automatic closing of a previously opened popup when opening a new one which is good for usability.

      - - -

      Dealing with events

      - -

      Every time something happens in Leaflet, e.g. user clicks on a marker or map zoom changes, the corresponding object sends an event which you can subscribe to with a function. It allows you to react to user interaction:

      -
      map.on('click', onMapClick);
      -
      -function onMapClick(e) {
      -	alert("You clicked the map at " + e.latlng);
      -}
      - -

      Each object has its own set of events — see documentation for details. The first argument of the listener function is an event object — it contains useful information about the event that happened. For example, map click event object (e in the example above) has latlng property which is a location at which the click occured.

      - -

      Lets improve our example by using a popup instead of an alert and formatting the location string:

      - -
      map.on('click', onMapClick);
      -
      -var popup = new L.Popup();
      -
      -function onMapClick(e) {
      -	var latlngStr = '(' + e.latlng.lat.toFixed(3) + ', ' + e.latlng.lng.toFixed(3) + ')';
      -
      -	popup.setLatLng(e.latlng);
      -	popup.setContent("You clicked the map at " + latlngStr);
      -
      -	map.openPopup(popup);
      -}
      - -

      Try clicking on the map and you will see the coordinates in a popup. View the full example →

      -

      Now you've learned Leaflet basics and can start building map apps straight away! Don't forget to take a look at the detailed documentation or other examples.

      - -
      - -

      © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - diff --git a/index.html b/index.html deleted file mode 100644 index 2e15674c66e..00000000000 --- a/index.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - - - - - -

      Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by Vladimir Agafonkin of CloudMade with a team of dedicated contributors. Weighing just about 25 KB of gzipped JS code, it still has all the features most developers ever need for online maps, while providing a smooth, pleasant user experience.

      -

      It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, A-grade browser support and a simple API with convention over configuration. The OOP-based code of the library is designed to be modular, extensible and very easy to understand.

      - -

      Basic usage example

      -
      - - -

      Here we create a map with tiles of our choice, add a marker and bind a popup with some text to it:

      - - - -
      // create a map in the "map" div, set the view to a given place and zoom
      -var map = L.map('map').setView([51.505, -0.09], 13);
      -
      -// add a CloudMade tile layer with style #997
      -L.tileLayer('http://{s}.tile.cloudmade.com/[API-key]/997/256/{z}/{x}/{y}.png', {
      -	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>'
      -}).addTo(map);
      -
      -// add a marker in the given location, attach some popup content to it and open the popup
      -L.marker([51.5, -0.09]).addTo(map)
      -	.bindPopup('A pretty CSS3 popup. <br> Easily customizable.').openPopup();
      - - - -

      Check out the examples section for more examples, or head straight to the documentation.

      - -

      Contributing to Leaflet

      -

      The project is hosted on GitHub, waiting for your contributions — just send your pull requests to Vladimir Agafonkin (Leaflet maintainer). Let's make the best library for maps that can possibly exist!

      -

      You can also help the project a lot by reporting bugs on the GitHub issues page, showing your support for your favorite feature suggestions on Leaflet UserVoice page, tweeting to @LeafletJS or joining the Leaflet mailing list. - -


      -

      © 2012 CloudMade. Map data © 2012 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - - From e27bc8db1909fdebe820049fa39a37b43e8cb481 Mon Sep 17 00:00:00 2001 From: mourner Date: Mon, 16 Jul 2012 23:56:58 +0300 Subject: [PATCH 0157/2207] improve social buttons in layout --- _layouts/default.html | 6 +++--- docs/css/screen.css | 49 +++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 7f8bc42aab9..f731de9a52a 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -85,7 +85,7 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv {{ content }} diff --git a/docs/css/screen.css b/docs/css/screen.css index fea04c90ae8..3e97cb323c3 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -4,6 +4,7 @@ body { .container { background: white; + position: relative; padding: 15px 40px 20px; width: 790px; @@ -142,7 +143,7 @@ td { } .nav li a, .nav li span { float: left; - padding: 10px 17px; + padding: 10px 14px; border-right: 1px solid #ddd; } .nav a { @@ -179,23 +180,15 @@ td { border-left: 1px solid #ddd; filter: none; } - /*.nav li a.cloudmade-link { - padding: 4px 8px; - opacity: 0.7; - } - .nav li a.cloudmade-link img { - margin: 0; - display: block; - }*/ .nav li a.github-link { - padding-left: 34px; - padding-right: 12px; - background: url(https://github.com/favicon.png) 12px 12px no-repeat; + padding-left: 30px; + padding-right: 10px; + background: url(https://github.com/favicon.png) 10px 12px no-repeat; } .nav li a.twitter-link { - padding-left: 32px; - padding-right: 14px; - background: url(http://twitter.com/phoenix/favicon.ico) 12px 13px no-repeat; + padding-left: 28px; + padding-right: 12px; + background: url(http://twitter.com/phoenix/favicon.ico) 10px 13px no-repeat; } #forkme { @@ -250,9 +243,9 @@ a.nodocs { h3 span { color: #888; } -h3.alt a { +/*h3.alt a { color: #888; -} +}*/ .example-img { float: left; @@ -279,14 +272,6 @@ h3.alt a { margin-right: 0; } -.social-buttons { - margin: 18px 0; -} - -.twitter-follow-button { - margin-left: -9px; -} - table td { color: #666; } @@ -337,4 +322,18 @@ table.factory-table td, table.factory-table th { .factory-usage code { color: black; +} + +.social-buttons { + margin: 18px 0; + padding: 6px 0 2px 8px; + background: #f7f7f7; + position: absolute; + top: 10px; + right: 40px; + border-radius: 5px; +} + +.twitter-follow-button { + margin-left: -9px; } \ No newline at end of file From d354b3fcb7882d3693526cb41e80e3c44eaac1cc Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 17 Jul 2012 01:11:39 +0300 Subject: [PATCH 0158/2207] more layout improvements --- _layouts/default.html | 6 +++--- docs/css/screen.css | 12 +++++++----- docs/images/logo.png | Bin 6641 -> 12668 bytes index.md | 2 +- reference.html | 2 -- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index f731de9a52a..b2b659442de 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -36,8 +36,8 @@
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      +

      Leaflet

      +

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps

      diff --git a/docs/css/screen.css b/docs/css/screen.css index 2f66809ddc1..ae47d410f25 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -122,7 +122,7 @@ td { .nav { padding: 0; - margin: 22px 0 2em; + margin: 28px 0 2em; list-style: none; font-size: 1.2em; @@ -177,23 +177,27 @@ td { filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); } .nav li a.github-link, - .nav li a.twitter-link { + .nav li a.twitter-link, + .nav li a.forum-link { font-weight: normal; float: right; border-right: none; border-left: 1px solid #ddd; + padding-left: 30px; + padding-right: 10px; filter: none; } .nav li a.github-link { - padding-left: 30px; - padding-right: 10px; background: url(https://github.com/favicon.png) 10px 12px no-repeat; } .nav li a.twitter-link { padding-left: 28px; - padding-right: 12px; - background: url(http://twitter.com/phoenix/favicon.ico) 10px 13px no-repeat; + background: url(http://twitter.com/phoenix/favicon.ico) 9px 13px no-repeat; } + .nav li a.forum-link { + padding-right: 12px; + background: url(https://groups.google.com/forum/favicon.ico) 10px 12px no-repeat; + } #forkme { position: absolute; From f3f67a267ac7a2d9a2b69dc38351ed36943fef2d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 17 Jul 2012 16:56:49 +0300 Subject: [PATCH 0161/2207] more layout improvements, plugins/blog links --- _layouts/default.html | 17 ++++++------ docs/css/screen.css | 63 ++++++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 7e6ae33c147..df8dd6368f8 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -37,7 +37,7 @@

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps

      +

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      Fork me on GitHub diff --git a/docs/css/screen.css b/docs/css/screen.css index ae47d410f25..d1d3a7630e9 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -1,5 +1,5 @@ body { - background: #f7f7f7; + background: #f0f0f0; } .container { @@ -122,7 +122,7 @@ td { .nav { padding: 0; - margin: 28px 0 2em; + margin: 28px -13px 2.5em; list-style: none; font-size: 1.2em; @@ -130,11 +130,10 @@ td { overflow: hidden; background-color: #ffffff; - background-image: -moz-linear-gradient(top, #ffffff, #eff0f1); /* FF3.6 */ - background-image: -o-linear-gradient(top, #ffffff, #eff0f1); /* Opera 11.10+ */ - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #ffffff),color-stop(1, #eff0f1)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#ffffff, #eff0f1); /* Chrome 10+, Saf5.1+ */ - background-image: linear-gradient(top, #ffffff, #eff0f1); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#eaebec)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #ffffff, #eaebec); /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #ffffff, #eaebec); /* FF3.6+ */ + background-image: -o-linear-gradient(top, #ffffff, #eaebec); /* Opera 11.10+ */ filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eff0f1'); /* IE6�IE9 */ border-radius: 10px; @@ -147,8 +146,10 @@ td { } .nav li a, .nav li span { float: left; - padding: 10px 14px; + padding: 0 13px; border-right: 1px solid #ddd; + text-shadow: 1px 1px 0 white; + line-height: 40px; } .nav a { text-decoration: none; @@ -176,27 +177,33 @@ td { background-image: linear-gradient(top, #eff0f1, #f6f7f8); filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); } + .nav li a.github-link { + background: url(https://github.com/favicon.png) 8px 12px no-repeat; + } + .nav li a.twitter-link { + padding-left: 26px; + background: url(http://twitter.com/phoenix/favicon.ico) 7px 13px no-repeat; + } + .nav li a.forum-link { + padding-right: 10px; + background: url(https://groups.google.com/forum/favicon.ico) 8px 12px no-repeat; + } .nav li a.github-link, .nav li a.twitter-link, .nav li a.forum-link { - font-weight: normal; + font-size: 12px; + color: #555; float: right; border-right: none; border-left: 1px solid #ddd; - padding-left: 30px; - padding-right: 10px; - filter: none; - } - .nav li a.github-link { - background: url(https://github.com/favicon.png) 10px 12px no-repeat; - } - .nav li a.twitter-link { padding-left: 28px; - background: url(http://twitter.com/phoenix/favicon.ico) 9px 13px no-repeat; + padding-right: 8px; + filter: none; } - .nav li a.forum-link { - padding-right: 12px; - background: url(https://groups.google.com/forum/favicon.ico) 10px 12px no-repeat; + .nav li a.github-link:hover, + .nav li a.twitter-link:hover, + .nav li a.forum-link:hover { + color: black; } #forkme { @@ -251,9 +258,13 @@ a.nodocs { h3 span { color: #888; } -/*h3.alt a { - color: #888; -}*/ +h3.alt a { + color: #56b1ee; + text-decoration: none; +} +h3.alt a:hover { + text-decoration: underline; +} .example-img { float: left; @@ -344,4 +355,8 @@ table.factory-table td, table.factory-table th { .twitter-follow-button { margin-left: -9px; +} + +.footer { + margin-top: 2.5em; } \ No newline at end of file From b8c40ee93ad4cacd74cc43453a4486d78c6dbdf8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 17 Jul 2012 18:26:08 +0300 Subject: [PATCH 0162/2207] partially convert custom icons example to markdown --- docs/css/screen.css | 28 +++--- examples/custom-icons.html | 184 ------------------------------------- examples/custom-icons.md | 111 ++++++++++++++++++++++ 3 files changed, 126 insertions(+), 197 deletions(-) delete mode 100644 examples/custom-icons.html create mode 100644 examples/custom-icons.md diff --git a/docs/css/screen.css b/docs/css/screen.css index d1d3a7630e9..d3ab9ba4c98 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -13,9 +13,9 @@ body { border: 1px solid #dfdfdf; border-top: 0; - box-shadow: 0 0 40px #e0e0e0; - -moz-box-shadow: 0 0 40px #e0e0e0; - -webkit-box-shadow: 0 0 40px #e0e0e0; + box-shadow: 0 0 50px rgba(0,0,0,0.1); + -moz-box-shadow: 0 0 50px rgba(0,0,0,0.1); + -webkit-box-shadow: 0 0 50px rgba(0,0,0,0.1); } h1 { margin-bottom: 10px; @@ -154,6 +154,9 @@ td { .nav a { text-decoration: none; color: #000; + background-color: rgba(0,0,0,0); + background-repeat: no-repeat; + -webkit-transition: 0.08s all; } .nav li span { color: #000; @@ -169,24 +172,23 @@ td { .nav li a:hover { color: black; - background-color: #eff0f1; - background-image: -moz-linear-gradient(top, #eff0f1, #f6f7f8); - background-image: -o-linear-gradient(top, #eff0f1, #f6f7f8); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #eff0f1),color-stop(1, #f6f7f8)); - background-image: -webkit-linear-gradient(#eff0f1, #f6f7f8); - background-image: linear-gradient(top, #eff0f1, #f6f7f8); + background-color: rgba(0,0,0,0.03); + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); } .nav li a.github-link { - background: url(https://github.com/favicon.png) 8px 12px no-repeat; + background-image: url(https://github.com/favicon.png); + background-position: 8px 12px; } .nav li a.twitter-link { padding-left: 26px; - background: url(http://twitter.com/phoenix/favicon.ico) 7px 13px no-repeat; + background-image: url(http://twitter.com/phoenix/favicon.ico); + background-position: 7px 13px; } .nav li a.forum-link { padding-right: 10px; - background: url(https://groups.google.com/forum/favicon.ico) 8px 12px no-repeat; + background-image: url(https://groups.google.com/forum/favicon.ico); + background-position: 8px 12px; } .nav li a.github-link, .nav li a.twitter-link, @@ -346,7 +348,7 @@ table.factory-table td, table.factory-table th { .social-buttons { margin: 18px 0; padding: 6px 0 2px 8px; - background: #f7f7f7; + background: #f3f3f3; position: absolute; top: 10px; right: 40px; diff --git a/examples/custom-icons.html b/examples/custom-icons.html deleted file mode 100644 index b16497237ec..00000000000 --- a/examples/custom-icons.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Markers With Custom Icons Example - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - -

      ← Back to the list of examples

      -

      Markers With Custom Icons

      - -

      In this example, you'll learn how to easily define your own icons for use by the markers you put on the map.

      - -
      - - - -

      View example on a separate page →

      - -

      Preparing the images

      - -

      To make a custom icon, we usually need two images — the actual icon image and the image of its shadow. For this example, we took the Leaflet logo and created four images out of it — 3 leaf images of different colors and one shadow image for the three:

      - -

      - - - - -

      - -

      The white area in the images is actually transparent, and they are saved in the PNG24 format. Notice there's some excessive area on the left of the shadow image — its cropped in such way that if you align the icon and the shadow images on top of each other, the top left corners are in the same spot.

      - -

      Defining an icon class

      - -

      The default marker icons in Leaflet are defined by the L.Icon class. Its instance (new L.Icon()) is then set by default in the L.Marker options. So how do we define our own icon class? Inherit from L.Icon! It's really easy in Leaflet:

      - -
      var LeafIcon = L.Icon.extend({
      -	options: {
      -		iconUrl: '../docs/images/leaf-green.png',
      -		shadowUrl: '../docs/images/leaf-shadow.png',
      -		iconSize: new L.Point(38, 95),
      -		shadowSize: new L.Point(68, 95),
      -		iconAnchor: new L.Point(22, 94),
      -		popupAnchor: new L.Point(-3, -76)
      -	}
      -});
      - -

      Now we've defined a green leaf icon class. The iconSize and shadowSize properties are the sizes of the corresponding images in pixels, the iconAnchor property is the coordinates of the "tip" of our icon, and the popupAnchor property points to a point from which a marker popup would open relative to the iconAnchor point.

      - -

      Using icons in markers

      - -

      To use our newly created icon class in a marker, we need to create an instance of that class and pass it to the marker constructor in the options:

      - -
      var greenIcon = new LeafIcon(),
      -	marker = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon});
      - -

      Awesome, it works! But what about the orange and the red ones? You could repeat the whole process above for each of them, but there's a much easier way. Notice that these icons would have the same properties except for one — the iconUrl. Because it's a frequent case, the L.Icon constructor has an optional argument — an iconUrl to replace the defined one. Let's see:

      - -
      var greenIcon = new LeafIcon(),
      -	redIcon = new LeafIcon({iconUrl: '../docs/images/leaf-red.png'}),
      -	orangeIcon = new LeafIcon({iconUrl: '../docs/images/leaf-orange.png'});
      -
      - -

      Now we can use all the three icons:

      - -
      var marker1 = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon}),
      -	marker2 = new L.Marker(new L.LatLng(51.495, -0.083), {icon: redIcon}),
      -	marker3 = new L.Marker(new L.LatLng(51.49, -0.1), {icon: orangeIcon});
      -
      -marker1.bindPopup("I am a green leaf.");
      -marker2.bindPopup("I am a red leaf.");
      -marker3.bindPopup("I am an orange leaf.");
      -
      -map.addLayer(marker1).addLayer(marker2).addLayer(marker3);
      - -

      That's all. Now take a look at the full example, the L.Icon docs, or browse other examples.

      - -
      - -

      © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - diff --git a/examples/custom-icons.md b/examples/custom-icons.md new file mode 100644 index 00000000000..15748546790 --- /dev/null +++ b/examples/custom-icons.md @@ -0,0 +1,111 @@ +--- +layout: default +title: Custom Icons +root: ../ +--- + +[← Back to the list of examples](../examples.html) + + +### Markers With Custom Icons + +In this example, you'll learn how to easily define your own icons for use by the markers you put on the map. + +
      + +[View example on a separate page →](custom-icons-example.html) + + +### Preparing the images + +To make a custom icon, we usually need two images --- the actual icon image and the image of its shadow. For this example, we took the Leaflet logo and created four images out of it --- 3 leaf images of different colors and one shadow image for the three: + +

      + + + + +

      + +The white area in the images is actually transparent, and they are saved in the PNG24 format. Notice there's some excessive area on the left of the shadow image — its cropped in such way that if you align the icon and the shadow images on top of each other, the top left corners are in the same spot. + + +### Defining an icon class + +The default marker icons in Leaflet are defined by the [L.Icon](../reference.html#icon) class. Its instance (`new L.Icon()`) is then set by default in the `L.Marker` options. So how do we define our own icon class? Inherit from `L.Icon`! It's really easy in Leaflet: + + var LeafIcon = L.Icon.extend({ + options: { + iconUrl: '../docs/images/leaf-green.png', + shadowUrl: '../docs/images/leaf-shadow.png', + iconSize: new L.Point(38, 95), + shadowSize: new L.Point(68, 95), + iconAnchor: new L.Point(22, 94), + popupAnchor: new L.Point(-3, -76) + } + }); + +Now we've defined a green leaf icon class. The iconSize and shadowSize properties are the sizes of the corresponding images in pixels, the iconAnchor property is the coordinates of the "tip" of our icon, and the popupAnchor property points to a point from which a marker popup would open relative to the iconAnchor point. + + +### Using icons in markers + +To use our newly created icon class in a marker, we need to create an instance of that class and pass it to the marker constructor in the options: + + var greenIcon = new LeafIcon(), + marker = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon}); + +Awesome, it works! But what about the orange and the red ones? You could repeat the whole process above for each of them, but there's a much easier way. Notice that these icons would have the same properties except for one --- the iconUrl. Because it's a frequent case, the L.Icon constructor has an optional argument --- an iconUrl to replace the defined one. Let's see: + + var greenIcon = new LeafIcon(), + redIcon = new LeafIcon({iconUrl: '../docs/images/leaf-red.png'}), + orangeIcon = new LeafIcon({iconUrl: '../docs/images/leaf-orange.png'}); + +Now we can use all the three icons: + + var marker1 = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon}), + marker2 = new L.Marker(new L.LatLng(51.495, -0.083), {icon: redIcon}), + marker3 = new L.Marker(new L.LatLng(51.49, -0.1), {icon: orangeIcon}); + +marker1.bindPopup("I am a green leaf."); +marker2.bindPopup("I am a red leaf."); +marker3.bindPopup("I am an orange leaf."); + +map.addLayer(marker1).addLayer(marker2).addLayer(marker3); + +That's all. Now take a look at the full example, the L.Icon docs, or browse other examples. + + From 1290a31447778b4e11c31f8d2ce60ff3fea28235 Mon Sep 17 00:00:00 2001 From: mourner Date: Wed, 18 Jul 2012 00:32:50 +0300 Subject: [PATCH 0163/2207] add social icons, improve title --- _layouts/default.html | 4 +++- docs/css/screen.css | 17 +++++++---------- docs/images/forum.png | Bin 0 -> 566 bytes docs/images/github.png | Bin 0 -> 385 bytes docs/images/twitter.png | Bin 0 -> 444 bytes examples.md | 4 ++-- 6 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 docs/images/forum.png create mode 100644 docs/images/github.png create mode 100644 docs/images/twitter.png diff --git a/_layouts/default.html b/_layouts/default.html index df8dd6368f8..ff27c712fe3 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,7 +1,9 @@ - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade + {% capture title %}{% if page.title %}{{ page.title }} - {% elsif post.title %}{{ post.title }} - {% endif %}{% endcapture %} + + {{ title }}Leaflet - a JavaScript library for mobile-friendly maps diff --git a/docs/css/screen.css b/docs/css/screen.css index d3ab9ba4c98..13d2b3d6ff4 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -177,18 +177,14 @@ td { filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); } .nav li a.github-link { - background-image: url(https://github.com/favicon.png); - background-position: 8px 12px; + background-image: url(../images/github.png); } .nav li a.twitter-link { - padding-left: 26px; - background-image: url(http://twitter.com/phoenix/favicon.ico); - background-position: 7px 13px; + background-image: url(../images/twitter.png); } .nav li a.forum-link { - padding-right: 10px; - background-image: url(https://groups.google.com/forum/favicon.ico); - background-position: 8px 12px; + padding-right: 12px; + background-image: url(../images/forum.png); } .nav li a.github-link, .nav li a.twitter-link, @@ -198,9 +194,10 @@ td { float: right; border-right: none; border-left: 1px solid #ddd; - padding-left: 28px; - padding-right: 8px; + padding-left: 30px; + padding-right: 10px; filter: none; + background-position: 10px 12px; } .nav li a.github-link:hover, .nav li a.twitter-link:hover, diff --git a/docs/images/forum.png b/docs/images/forum.png new file mode 100644 index 0000000000000000000000000000000000000000..a4eaaa49982b80485e53bab7d676894753f278aa GIT binary patch literal 566 zcmV-60?GY}P)W2+ZDf*uq!OD* z#y60N`|v0B3-RbW;*m8dMzOhl>EdiVac%uVunE`!!xbj>AqB|=Rz-`|j*3<8D`p_Y44jo`+ zKz|vn=K=W6Y~&5^2gI7Jyd>PJA)YwD zxiNLVx8&5d1I zZ27)R0Pi*r#qE9%RUH>{xyIm{8p9N6a&q*P`BG;F8^6CvfKfre7t@{zct}c}GRzH+ z(sj=jUeC{;X6qkTtDz&MUF=BK|L4?to>LbddV7uUf1B<}ZG-dy&Hw-a07*qoM6N<$ Ef=+1!%m4rY literal 0 HcmV?d00001 diff --git a/docs/images/github.png b/docs/images/github.png new file mode 100644 index 0000000000000000000000000000000000000000..129e95ab8ee0637014b77a61df1e07065d7eb208 GIT binary patch literal 385 zcmV-{0e=38P) z%`c9!u};;V;K+g(%qh8*FgdiX+F86>@P$DocT+5|r`iF0JDu~elJhARSWxW{J}h{^ zhLV-INSJ(yTGg)O(Sl{|Lj|UEOxDt|H}MQP)i|Am^}k{-b=rp|WOcr_LD${_#mI$P zQ~&j0Vnl_L=*24Dyan#P$$@gC(Q7)bfxIrtmAAkRx^STPnYg>&rhel#@f__g#bbXk fhDEWs>A%8XwB3YkN>@&u00000NkvXXu0mjf$nUo6 literal 0 HcmV?d00001 diff --git a/docs/images/twitter.png b/docs/images/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2a9162d90f1125dea7bdeb94edfa9933b5624d GIT binary patch literal 444 zcmV;t0YmT_6dbbrEz^Yib$`z{ZY1GCRRd2gUM>(B*khJeICatt%C{AXBr z|3AZ=8~^!x_I>~vXfXZ2`3=`!g)r=Y^wxu6$>aa>6Zbs;8HQ{?-^sg$AUTFL?+|$9 ztN$Pa`BpyuoUr58a-cJQ>VYMeKmX6rx%WS^GwY5&?L*OwgbU7nTJit?e+`Dc_uje{ zod2>KE(vrdL))(Z3KMqUlV5!8F)jmuKn3i~3$H%efc=QB2;?FV#-iC^_s83Ce*#V7 zL2&^QIREtfQM~%{Q1AA!OH7b!68gQbNuPg+kmcS zM=<~>zzoF3^X`A|1S!C!8RYj5zkV5GO>v+!PCustom Controls +

      Custom Controls

      A brief tutorial on implementing custom map controls. *** -### Custom Overlays +

      Custom Overlays

      If markers, popups and vectors are not enough for you, here's a guide for creating your own map overlays (things to put on a map). From eecf61985584b7150b346619ce700587cb978eb3 Mon Sep 17 00:00:00 2001 From: mourner Date: Wed, 18 Jul 2012 00:41:26 +0300 Subject: [PATCH 0164/2207] initial blog and plugins pages --- _layouts/default.html | 16 ++++++++++++++-- blog.md | 6 ++++++ plugins.md | 6 ++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 blog.md create mode 100644 plugins.md diff --git a/_layouts/default.html b/_layouts/default.html index ff27c712fe3..8f0496d5990 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -78,8 +78,20 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv Download {% endif %} -
    7. Plugins
    8. -
    9. Blog
    10. +
    11. + {% if page.title == 'Plugins' %} + Plugins + {% else %} + Plugins + {% endif %} +
    12. +
    13. + {% if page.title == 'Blog' %} + Blog + {% else %} + Blog + {% endif %} +
    14. Forum
    15. GitHub
    16. diff --git a/blog.md b/blog.md new file mode 100644 index 00000000000..291e08766ba --- /dev/null +++ b/blog.md @@ -0,0 +1,6 @@ +--- +layout: default +title: Blog +--- + +Blog will be here. \ No newline at end of file diff --git a/plugins.md b/plugins.md new file mode 100644 index 00000000000..0649adcd36c --- /dev/null +++ b/plugins.md @@ -0,0 +1,6 @@ +--- +layout: default +title: Plugins +--- + +Plugins will be listed here. \ No newline at end of file From b4f509abd35c5c1979f13451473880d5db24ba18 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 18 Jul 2012 11:25:20 +0300 Subject: [PATCH 0165/2207] minor style improvements, logo easter egg --- _layouts/default.html | 49 +++++++++++---------- docs/css/blueprint/screen.css | 2 +- docs/css/screen.css | 80 +++++++++++++++++++++++++---------- 3 files changed, 82 insertions(+), 49 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 8f0496d5990..fa0b40c8d8b 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -41,6 +41,30 @@

      Leaflet

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      + + - - - {{ content }}

      -Check out the [examples](examples.html) section for more examples, or head straight to the [documentation](reference.html). +Learn more with the [quick start guide](examples/quick-start.html), check out [other tutorials](examples.html), or head straight to the [API documentation](reference.html). ### Contributing to Leaflet @@ -65,4 +65,4 @@ You can also help the project a lot by reporting bugs on the [GitHub issues page map.addLayer(marker); marker.bindPopup('A pretty CSS3 popup.
      Easily customizable.').openPopup(); - \ No newline at end of file + diff --git a/reference.html b/reference.html index 4aa628f2880..a8de452424b 100644 --- a/reference.html +++ b/reference.html @@ -12,7 +12,7 @@

      Map

    17. Options
    18. Events
    19. -

      Map methods

      +

      Map Methods

      -

      Map misc.

      +

      Map Misc

      -

      UI layers

      +

      UI Layers

      -

      Raster layers

      +

      Raster Layers

      -

      Vector layers

      +

      Vector Layers

      -

      Other layers

      +

      Other Layers

      -

      Basic types

      +

      Basic Types

      -

      DOM utility

      +

      DOM Utility


      -

      This reference reflects Leaflet 0.4. You can find docs for the in-progress master version in reference.html of gh-pages-master branch.
      Grayed out things are not yet documented but planned to be.

      +

      This reference reflects Leaflet 0.4. You can find docs for the in-progress master version in reference.html of gh-pages-master branch

      L.Map

      @@ -418,7 +418,7 @@

      Events

      -

      Methods that modify map state

      +

      Methods for Modifying Map State

      @@ -498,7 +498,7 @@

      Methods that modify map state

      -

      Methods that get map state

      +

      Methods for Getting Map State

      @@ -553,7 +553,7 @@

      Methods that get map state

      -

      Methods for layers and controls

      +

      Methods for Layers and Controls

      @@ -600,7 +600,7 @@

      Methods for layers and controls

      -

      Conversion methods

      +

      Conversion Methods

      @@ -655,7 +655,7 @@

      Conversion methods

      -

      Other methods

      +

      Other Methods

      @@ -800,7 +800,7 @@

      Projections

      -

      Map panes

      +

      Map Panes

      An object literal (returned by map.getPanes) that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

      @@ -2286,7 +2286,7 @@

      L.LatLngBounds

      All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      map.fitBounds([
      -	[40.712, -74.227], 
      +	[40.712, -74.227],
       	[40.774, -74.125]
       ]);
      @@ -3271,7 +3271,7 @@

      Methods

      Function Returns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called. - + falseFn() Function @@ -3473,4 +3473,4 @@

      L.noConflict()

      // you include Leaflet, it replaces the L variable to Leaflet namespace var Leaflet = L.noConflict(); -// now L points to that other library again, and you can use Leaflet.Map etc.
      \ No newline at end of file +// now L points to that other library again, and you can use Leaflet.Map etc.
      From c2a687be2952dfb7554a65298df6b8a43af91e6f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 18 Jul 2012 17:31:24 +0300 Subject: [PATCH 0170/2207] update readme regarding docs and jekyll --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 8f70d3997c0..18a1756e74f 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,15 @@ It is built from the ground up to work efficiently and smoothly on both desktop Check out the website for more information: [leaflet.cloudmade.com](http://leaflet.cloudmade.com) +## Contributing to Leaflet Website (Docs) + + 1. Install Ruby if don't have it yet + 2. Run `gem install jekyll` + 3. Run `jekyll --auto` inside the `Leaflet` folder + 4. Open the website from the `_site` folder + +Now any file changes will be reflected on the generated pages automatically. + ## Contributing to Leaflet Let's make the best open-source library for maps that can possibly exist! From c89e855a9449ee78db82a40b2c5565ed5be55969 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 18 Jul 2012 17:32:12 +0300 Subject: [PATCH 0171/2207] remove logo easter egg, causing hover animation problems --- docs/css/screen.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 88ac2a1025e..5381f91fdc1 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -33,11 +33,11 @@ h1 a { -webkit-transition: 0.8s all; - -webkit-animation-duration: 2s; + /*-webkit-animation-duration: 2s; -webkit-animation-delay: 15s; -webkit-animation-name: autumn; -webkit-animation-iteration-count: 2; - -webkit-animation-direction: alternate; + -webkit-animation-direction: alternate;*/ } @-webkit-keyframes autumn { @@ -194,7 +194,7 @@ td { color: black; background-color: rgba(0,0,0,0.03); - + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); } .nav li a.github-link, @@ -392,4 +392,4 @@ table.factory-table td, table.factory-table th { .footer { margin-top: 2.5em; -} \ No newline at end of file +} From 539b44e0aaa80b965c580a7ead1fc2ad1359958a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 18 Jul 2012 19:12:01 +0300 Subject: [PATCH 0172/2207] initial plugins list --- docs/css/screen.css | 26 +++++++++++++ plugins.md | 95 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 5381f91fdc1..09167b319d7 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -393,3 +393,29 @@ table.factory-table td, table.factory-table th { .footer { margin-top: 2.5em; } + +dl { + overflow: hidden; +} + +dl dt { + font-size: 14px; + font-weight: normal; + float: left; + clear: left; + width: 160px; +} + +dl dd { + margin-bottom: 2em; + float: left; + width: 500px; +} + +.plugins td:first-child, .plugins td:last-child { + white-space: nowrap; +} + +.plugins td { + color: black; +} diff --git a/plugins.md b/plugins.md index 0649adcd36c..9b6c95745e7 100644 --- a/plugins.md +++ b/plugins.md @@ -3,4 +3,97 @@ layout: default title: Plugins --- -Plugins will be listed here. \ No newline at end of file +### Notable Leaflet Plugins + +While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. + +### Services, providers and formats + + + + + + + + + + + + + + + + + + + + + + +
      PluginDescriptionMaintainer
      + Plugins by Pavel Shramov + + A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), Permalink and alternative Scale controls. + + Pavel Shramov +
      + Proj4Leaflet + + Proj4js integration plugin, allowing you to use all kinds of weird projections in Leaflet. + + Kartena +
      + Leaflet Vector Layers + + Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. + + Jason Sanford +
      + leaflet-tilejson + + Adds support for the TileJSON specification to Leaflet. + + Per Liedman, Kartena +
      + leaflet-providers + + Contains configurations for various free tile providers — OSM, OpenCycleMap, MapQuest, Mapbox Streets, Stamen, Esri, etc. + + Stefan Seelmann +
      + + From fea0a680675eddd4896be68cc85a9d344bbf4850 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 19 Jul 2012 01:55:21 +0300 Subject: [PATCH 0173/2207] add remaining plugins --- plugins.md | 211 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 179 insertions(+), 32 deletions(-) diff --git a/plugins.md b/plugins.md index 9b6c95745e7..a46484bce2d 100644 --- a/plugins.md +++ b/plugins.md @@ -7,7 +7,8 @@ title: Plugins While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. -### Services, providers and formats + +### Layers and Overlays @@ -17,13 +18,60 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s + + + + + + + + + + + + +
      - Plugins by Pavel Shramov + Leaflet.markercluster - A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), Permalink and alternative Scale controls. + Sophisticated marker clustering solution with smooth animations. - Pavel Shramov + Dave Leaver +
      + RaphaelLayer + + Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. + + Dynamic Methods +
      + Leaflet.iconlabel + + Adds text labels to map markers. + + Jacob Toye +
      + Overlapping Marker Spiderfier + + Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. + + George MacKerron
      + arc.js + + Allows you to draw great circle routes between two points. + + Dane Springmeyer +
      + + +### Services, Providers and Formats + + + + + + + + + + + + + @@ -55,45 +121,126 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s + + + + + +
      PluginDescriptionMaintainer
      Proj4Leaflet @@ -33,11 +81,29 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Kartena
      + Plugins by Pavel Shramov + + A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), Permalink and alternative Scale controls. + + Pavel Shramov +
      + cartodb-leaflet + + Official CartoDB plugin for Leaflet. + + Vizzuality +
      Leaflet Vector Layers - Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. + Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. Jason Sanford leaflet-providers - Contains configurations for various free tile providers — OSM, OpenCycleMap, MapQuest, Mapbox Streets, Stamen, Esri, etc. + Contains configurations for various free tile providers — OSM, OpenCycleMap, MapQuest, Mapbox Streets, Stamen, Esri, etc. Stefan Seelmann
      + azgs-leaflet + + A set of small plugins for Leaflet, including WFS-GeoJSON layer with filtering, a hover control for GeoJSON, and an Esri tile layer. + + AZGS +
      + Leaflet Control Bing Geocoder + + A simple geocoder control that uses Bing to locate places. + + Samuel Piquet +
      - From 5933cb31df15326797a0eccf02123bee5475ef31 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 19 Jul 2012 02:00:36 +0300 Subject: [PATCH 0174/2207] minor fixes --- download.md | 2 +- features.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/download.md b/download.md index ffba86b07b2..6d41be21ca2 100644 --- a/download.md +++ b/download.md @@ -10,7 +10,7 @@ code, unit tests, files for debugging and a build system. The production files (included the same way as in the code above) are in the `dist` folder. -[Download Leaflet 0.3.1 stable](https://github.com/CloudMade/Leaflet/zipball/v0.3.1) (February 14, 2012) +[Download Leaflet 0.3.1 stable](https://github.com/CloudMade/Leaflet/zipball/v0.3.1) (February 14, 2012)
      [Download Leaflet 0.4 master](http://github.com/CloudMade/Leaflet/zipball/master) (in-progress version) [View Changelog](https://github.com/CloudMade/Leaflet/blob/master/CHANGELOG.md) diff --git a/features.html b/features.html index 8be60f200ee..a8297e593b4 100644 --- a/features.html +++ b/features.html @@ -5,7 +5,7 @@

      Leaflet Features

      -

      Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being easily extended by third-party plugins.

      +

      Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being easily extended by third-party plugins.


      From d8eef8fb8b4bbf81c598f5f93ba169b4e1054ae9 Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 19 Jul 2012 02:08:47 +0300 Subject: [PATCH 0175/2207] nicer style for plugins page --- docs/css/screen.css | 3 +++ plugins.md | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 09167b319d7..25a406573f9 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -78,6 +78,9 @@ h2 { text-shadow: -1px -1px 0 #999; } +h2.less-margin { + margin-top: 1em; +} h3 { margin-top: 1.5em; } diff --git a/plugins.md b/plugins.md index a46484bce2d..719eb19ea16 100644 --- a/plugins.md +++ b/plugins.md @@ -8,7 +8,7 @@ title: Plugins While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. -### Layers and Overlays +

      Layers and Overlays

      @@ -64,7 +64,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -### Services, Providers and Formats +

      Services, Providers and Formats

      @@ -147,7 +147,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -### Controls +

      Controls

      @@ -212,7 +212,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -### Other Plugins +

      Other Plugins

      From 4d776737ab7886f3f9e825c4083ddb54ab5d5003 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 19 Jul 2012 11:11:48 +0300 Subject: [PATCH 0176/2207] add docs todo for 0.4 --- DOCS-TODO | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 DOCS-TODO diff --git a/DOCS-TODO b/DOCS-TODO new file mode 100644 index 00000000000..fb0ea1df1f1 --- /dev/null +++ b/DOCS-TODO @@ -0,0 +1,180 @@ + +Layers addTo(map) + +Map + panning inertia options + + remove locateAndSetView + new locate options + + getContainer + containerPointToLatLng + latLngToContainerPoint + addHandler + + autopanstart event + +Icon +Icon.Default +DivIcon + +Control + position option + + setPosition + getPosition + +Control.Attribution prefix in options + +Scale control + +LatLngBounds pad + +on/off(eventMap) +on/off(space-separated types) +off(type) to remove all listeners + +TileLayer + removed urlParams + + detectRetina option + + redraw + setUrl + bringToFront + bringToBack + +TileLayer.WMS + setParams + +Marker + opacity option + + setOpacity + update + +ImageOverlay + opacity option + + setOpacity + +Popup + maxHeight + +Path + bringToFront + bringToBack + + openPopup + + redraw + + events + contextmenu + +Circle + getBounds + getLatLng + getRadius + +MouseEvent + originalEvent + containerPoint + +Global switches + L_NO_TOUCH + L_PREFER_CANVAS + L_DISABLE_3D + + + +Transformation + Transformation(a, b, c, d) + + transform(point, scale) + untransform(point, scale) + +LineUtil + simplify(points, tolerance) + pointToSegmentDistance(p, p1, p2) + closestPointOnSegment(p, p1, p2) + clipSegment(a, b, bounds) + +PolyUtil + clipPolygon(points, bounds) + +DomEvent + addListener(obj, type, fn, context) + on + removeListener(obj, type, fn) + off + stopPropagation(e) + disableClickPropagation(el) + preventDefault(e) + stop(e) + getMousePosition(e, container) + getWheelDelta(e) + +Transition + Transition(el, options) + + run(props) + + options + fps: 50 + easing: 'ease', + duration: 0.5 + fakeStepInterval: 100 + + events + start + step + end + +Draggable + Draggable(element, dragStartTarget) + + enable() + disable() + + events + dragstart + predrag + drag + dragend + +ILayer + onAdd(map) + onRemove(map) + + important events: viewreset, moveend + + options.minZoom and options.maxZoom + +IFeature - ? + getBounds() or getLatLng() + setStyle + bindPopup + events + +Control + Control(options) + + getPosition() + setPosition() + addTo(map) + removeFrom(map) + +IControl + onAdd(map) + onRemove(map) + +IProjection + project(latlng) + unproject(point) + +ICRS + latLngToPoint(latlng, zoom) + pointToLatLng(point, zoom) + project(latlng) + scale(zoom) From fb307af27405ce7765797ed6b23c89b3b358aecf Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 19 Jul 2012 11:12:10 +0300 Subject: [PATCH 0177/2207] more files to ignore by Jekyll --- _config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 78504620f11..fb96b8041a7 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,6 @@ -exclude: build, node_modules, spec, src, CNAME, Jakefile.js, reference-tpl.html, CHANGELOG.md, README.md, LICENSE +exclude: build, debug, node_modules, spec, src, CNAME, Jakefile.js, reference-tpl.html, CHANGELOG.md, README.md, LICENSE, DOCS-TODO.md markdown: kramdown kramdown: - entity_output: as_input \ No newline at end of file + entity_output: as_input From 726213e701af368fd23b9b52932cafdec932ea1b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 19 Jul 2012 11:32:09 +0300 Subject: [PATCH 0178/2207] minor tweaks --- _layouts/default.html | 8 ++++---- docs/css/screen.css | 11 ++++++----- plugins.md | 8 ++++---- reference.html | 1 + 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index fa0b40c8d8b..27c30111025 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -6,11 +6,11 @@ {{ title }}Leaflet - a JavaScript library for mobile-friendly maps - + - + @@ -36,7 +36,7 @@ - +

      Leaflet

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      @@ -49,7 +49,7 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv - + diff --git a/docs/css/screen.css b/docs/css/screen.css index 25a406573f9..0efca4c613c 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -53,8 +53,8 @@ h1 a:hover, h1 a:focus { h2 { font-size: 1.8em; + margin-top: 1em; font-weight: bold; - margin-top: 2.5em; padding: 4px 12px 3px; margin-left: 0; margin-right: 0; @@ -78,9 +78,9 @@ h2 { text-shadow: -1px -1px 0 #999; } -h2.less-margin { - margin-top: 1em; -} +.api-page h2 { + margin-top: 2.5em; + } h3 { margin-top: 1.5em; } @@ -94,6 +94,7 @@ h4 { font-weight: bold; color: #555; } + h3.alt { color: #999; font-family: Georgia, serif; @@ -145,7 +146,7 @@ td { .nav { padding: 0; - margin: 28px 0 2.5em; + margin: 28px 0 32px; list-style: none; font-size: 1.2em; diff --git a/plugins.md b/plugins.md index 719eb19ea16..c0a92100eb2 100644 --- a/plugins.md +++ b/plugins.md @@ -8,7 +8,7 @@ title: Plugins While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. -

      Layers and Overlays

      +## Layers and Overlays
      @@ -64,7 +64,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -

      Services, Providers and Formats

      +## Services, Providers and Formats @@ -147,7 +147,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -

      Controls

      +## Controls @@ -212,7 +212,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -

      Other Plugins

      +## Other Plugins diff --git a/reference.html b/reference.html index a8de452424b..5e33d17c552 100644 --- a/reference.html +++ b/reference.html @@ -1,6 +1,7 @@ --- layout: default title: Documentation +bodyclass: api-page ---
      From 92e9d43071911bef236f347277f817611a23cd78 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 19 Jul 2012 11:39:36 +0300 Subject: [PATCH 0179/2207] update docs snippets --- reference-tpl.html | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/reference-tpl.html b/reference-tpl.html index f617b45d07a..2e3cee70374 100644 --- a/reference-tpl.html +++ b/reference-tpl.html @@ -1,13 +1,12 @@ + -<[type][name] - +<Foo> name -

      [class-name]

      [description]

      @@ -22,10 +21,15 @@

      Constructor

      + +
      ConstructorUsage Description
      [constructor]( [arguments] ) + new L.Map()
      + L.map() +
      [description]
      @@ -41,7 +45,7 @@

      Methods

      Description - [method]( [arguments] ) + [method]( argument, argument ) [return-type] [description] @@ -60,9 +64,9 @@

      Options

      Description - [name] + [name] [type] [default] [description] - \ No newline at end of file + From a2d7c9819e6ada18f00522a3062e1fd0069ff4c8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 19 Jul 2012 17:11:26 +0300 Subject: [PATCH 0180/2207] more docs updates --- DOCS-TODO | 95 +---- docs/css/screen.css | 22 +- docs/highlight/styles/github.css | 6 +- reference.html | 630 ++++++++++++++++++++++++------- 4 files changed, 527 insertions(+), 226 deletions(-) diff --git a/DOCS-TODO b/DOCS-TODO index fb0ea1df1f1..3dce470d738 100644 --- a/DOCS-TODO +++ b/DOCS-TODO @@ -1,66 +1,28 @@ - -Layers addTo(map) - Map panning inertia options remove locateAndSetView new locate options - getContainer - containerPointToLatLng - latLngToContainerPoint addHandler - autopanstart event - Icon Icon.Default -DivIcon - -Control - position option - - setPosition - getPosition - -Control.Attribution prefix in options -Scale control - -LatLngBounds pad +NEW DivIcon on/off(eventMap) on/off(space-separated types) off(type) to remove all listeners TileLayer - removed urlParams - - detectRetina option + detectRetina option redraw setUrl bringToFront bringToBack -TileLayer.WMS - setParams - -Marker - opacity option - - setOpacity - update - -ImageOverlay - opacity option - - setOpacity - -Popup - maxHeight - Path bringToFront bringToBack @@ -69,41 +31,30 @@ Path redraw - events - contextmenu - -Circle - getBounds - getLatLng - getRadius - -MouseEvent - originalEvent - containerPoint +FeatureGroup - ? + setStyle -Global switches +NEW Global switches L_NO_TOUCH L_PREFER_CANVAS L_DISABLE_3D - - -Transformation +NEW Transformation Transformation(a, b, c, d) transform(point, scale) untransform(point, scale) -LineUtil +NEW LineUtil simplify(points, tolerance) pointToSegmentDistance(p, p1, p2) closestPointOnSegment(p, p1, p2) clipSegment(a, b, bounds) -PolyUtil +NEW PolyUtil clipPolygon(points, bounds) -DomEvent +NEW DomEvent addListener(obj, type, fn, context) on removeListener(obj, type, fn) @@ -115,7 +66,7 @@ DomEvent getMousePosition(e, container) getWheelDelta(e) -Transition +NEW Transition Transition(el, options) run(props) @@ -131,9 +82,9 @@ Transition step end -Draggable +NEW Draggable Draggable(element, dragStartTarget) - + enable() disable() @@ -143,7 +94,7 @@ Draggable drag dragend -ILayer +NEW ILayer onAdd(map) onRemove(map) @@ -151,29 +102,15 @@ ILayer options.minZoom and options.maxZoom -IFeature - ? - getBounds() or getLatLng() - setStyle - bindPopup - events - -Control - Control(options) - - getPosition() - setPosition() - addTo(map) - removeFrom(map) - -IControl +NEW IControl onAdd(map) onRemove(map) -IProjection +NEW IProjection project(latlng) unproject(point) -ICRS +NEW ICRS latLngToPoint(latlng, zoom) pointToLatLng(point, zoom) project(latlng) diff --git a/docs/css/screen.css b/docs/css/screen.css index 0efca4c613c..77dd55fddb6 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -122,24 +122,32 @@ pre code a:hover { text-decoration: underline; } +p code, td:last-child code { + color: #666; +} + table { border-collapse: collapse; box-shadow: 0 3px 15px #f0f0f0; } th { - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#e7e7e7)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #f3f3f3, #e7e7e7); /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, #f3f3f3, #e7e7e7); /* FF3.6+ */ - background-image: -o-linear-gradient(top, #f3f3f3, #e7e7e7); /* Opera 11.10+ */ - background-image: linear-gradient(to bottom, #f3f3f3, #e7e7e7); + background-color: #eeeeee; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#d7d7d7)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #eeeeee, #d7d7d7); /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #eeeeee, #d7d7d7); /* FF3.6+ */ + background-image: -o-linear-gradient(top, #eeeeee, #d7d7d7); /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #eeeeee, #d7d7d7); + + text-shadow: 1px 1px 0 white; + + padding: 5px 10px; } th, td { - padding: 8px 10px; vertical-align: top; /*line-height: 1.4;*/ } td { + padding: 8px 10px; /*border-right: 1px solid #eee;*/ } diff --git a/docs/highlight/styles/github.css b/docs/highlight/styles/github.css index 69622eedff2..ba1fabd9198 100644 --- a/docs/highlight/styles/github.css +++ b/docs/highlight/styles/github.css @@ -36,7 +36,8 @@ pre .javascript .title { } code .number, -pre .hexcolor { +pre .hexcolor, +code .literal { color: #00A707 } @@ -66,9 +67,6 @@ pre .tex .command { color: #458; font-weight: bold } -code .literal { - color: #333; -} pre .tag, pre .tag .title, diff --git a/reference.html b/reference.html index 5e33d17c552..973b1b426c8 100644 --- a/reference.html +++ b/reference.html @@ -67,13 +67,15 @@

      Basic Types

    20. Point
    21. Bounds
    22. Icon
    23. +
    24. DivIcon
    25. Controls

      @@ -112,8 +114,9 @@

      Interfaces

      Misc

      @@ -275,7 +278,7 @@

      Options

      closePopupOnClick Boolean true - Set it to false if you don't want popups to close when user clicks the map. + Set it to false if you don't want popups to close when user clicks the map. worldCopyJump @@ -329,7 +332,7 @@

      Events

      contextmenu MouseEvent - Fired when the user pushes the right mouse button on the map. + Fired when the user pushes the right mouse button on the map, prevents default browser context menu from showing if there are listeners on this event. preclick @@ -386,6 +389,11 @@

      Events

      Event Fired when the map zoom changes. + + autopanstart + Event + Fired when the map starts autopanning when opening a popup. + layeradd LayerEvent @@ -429,72 +437,72 @@

      Methods for Modifying Map State

      setView( <LatLng> center, <Number> zoom, <Boolean> forceReset? ) - this - Sets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default). + this + Sets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default). setZoom( <Number> zoom ) - this + this Sets the zoom of the map. zoomIn() - this + this Increases the zoom of the map by 1. zoomOut() - this + this Decreases the zoom of the map by 1. fitBounds( <LatLngBounds> bounds ) - this + this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. fitWorld() - this + this Sets a map view that mostly contains the whole world with the maximum zoom level possible. panTo( <LatLng> latlng ) - this + this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. panInsideBounds( <LatLngBounds> bounds ) - this + this Pans the map to the closest view that would lie inside the given bounds (if it's not already). panBy( <Point> point ) - this + this Pans the map by a given number of pixels (animated). invalidateSize() - this + this Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. setMaxBounds( <LatLngBounds> bounds ) - this + this Restricts the map view to the given bounds (see map maxBounds option). locate( <Locate options> options? ) - this + this Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details. locateAndSetView( <Number> maxZoom?, <Locate options> options? ) - this + this Automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});. stopLocate() - this + this Stops watching location previously initiated by map.locate({watch: true}). @@ -535,7 +543,7 @@

      Methods for Getting Map State

      getBoundsZoom( <LatLngBounds> bounds, <Boolean> inside? ) Number - Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. + Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. getSize() @@ -564,38 +572,38 @@

      Methods for Layers and Controls

      addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? ) - this - Adds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers). + this + Adds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers). removeLayer( <ILayer> layer ) - this + this Removes the given layer from the map. hasLayer( <ILayer> layer ) Boolean - Returns true if the given layer is currently added to the map. + Returns true if the given layer is currently added to the map. openPopup( <Popup> popup ) - this + this Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability). closePopup() - this + this Closes the popup opened with openPopup. addControl( <IControl> control ) - this + this Adds the given control to the map. removeControl( <IControl> control ) - this + this Removes the given control from the map. @@ -629,6 +637,16 @@

      Conversion Methods

      Point Converts the point relative to the map layer to a point relative to the map container. + + latLngToContainerPoint( <LatLng> latlng ) + Point + Returns the map container point that corresponds to the given geographical coordinates. + + + containerPointToLatLng( <Point> point ) + LatLng + Returns the geographical coordinates of a given map container point. + project( <LatLng> latlng, <Number> zoom? ) Point @@ -689,13 +707,13 @@

      Locate options

      watch Boolean false - If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. + If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. setView Boolean false - If true, automatically sets the map view to the user location with respect to detection accuracy. + If true, automatically sets the map view to the user location with respect to detection accuracy. maxZoom @@ -892,7 +910,7 @@

      Options

      clickable Boolean true - If false, the marker will not emit mouse events and will act as a part of the underlying map. + If false, the marker will not emit mouse events and will act as a part of the underlying map. draggable @@ -912,6 +930,12 @@

      Options

      0 By default, marker images zIndex is set automatically based on its latitude. You this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). + + opacity + Number + 1.0 + The opacity of the marker. +

      Events

      @@ -974,6 +998,11 @@

      Methods

      Returns Description + + addTo( <Map> map ) + this + Adds the marker to the map. + getLatLng() LatLng @@ -981,37 +1010,47 @@

      Methods

      setLatLng( <LatLng> latlng ) - this + this Changes the marker position to the given point. setIcon( <Icon> icon ) - this + this Changes the marker icon. setZIndexOffset( <Number> offset ) - this + this Changes the zIndex offset of the marker. - + + setOpacity( <Number> opacity ) + this + Changes the opacity of the marker. + + + update() + this + Updates the marker position, useful if coordinates of its latLng object were changed directly. + + bindPopup( <String> htmlContent, <Popup options> options? ) - this + this Binds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method. - + unbindPopup() - this + this Unbinds the popup previously bound to the marker with bindPopup. - + openPopup() - this + this Opens the popup previously bound by the bindPopup method. - + closePopup() - this + this Closes the bound popup of the marker if it's opened. @@ -1090,11 +1129,17 @@ 50 Min width of the popup. + + maxHeight + Number + null + If set, creates a scrollable container of the given height inside a popup if its content exceeds it. + autoPan Boolean true - Set it to false if you don't want the map to do panning animation to fit the opened popup. + Set it to false if you don't want the map to do panning animation to fit the opened popup. closeButton @@ -1119,6 +1164,11 @@

      Methods

      + + + + + @@ -1126,12 +1176,12 @@

      Methods

      - + - +
      addTo( <Map> map )thisAdds the popup to the map.
      Method Returns
      setLatLng( <LatLng> latlng )thisthis Sets the geographical point where the popup will open.
      setContent( <String> htmlContent )thisthis Sets the HTML content of the popup.
      @@ -1228,19 +1278,19 @@

      Options

      tms Boolean false - If true, inverses Y axis numbering for tiles (turn this on for TMS services). + If true, inverses Y axis numbering for tiles (turn this on for TMS services). continuousWorld Boolean false - If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). + If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). noWrap Boolean false - If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. + If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. zoomOffset @@ -1252,7 +1302,7 @@

      Options

      zoomReverse Boolean false - If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) + If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) opacity @@ -1264,19 +1314,19 @@

      Options

      unloadInvisibleTiles Boolean depends - If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. + If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. updateWhenIdle Boolean depends - If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. + If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. reuseTiles Boolean false - If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. + If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. @@ -1288,9 +1338,14 @@

      Methods

      Returns Description + + addTo( <Map> map ) + this + Adds the layer to the map. + setOpacity( <Number> opacity ) - this + this Changes the opacity of the tile layer. @@ -1304,7 +1359,7 @@

      Methods

      L.TileLayer.WMS

      -

      Used to display WMS services as tile layers on the map. Extends TileLayer, implements ILayer interface.

      +

      Used to display WMS services as tile layers on the map. Extends TileLayer.

      Usage example

      @@ -1366,7 +1421,7 @@

      Options

      transparent Boolean false - If true, the WMS service will return images with transparency. + If true, the WMS service will return images with transparency. version @@ -1376,11 +1431,25 @@

      Options

      +

      Methods

      + + + + + + + + + + + + +
      MethodReturnsDescription
      setParams( <WMS parameters> params, <Boolean> noRedraw? )thisMerges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true).

      L.TileLayer.Canvas

      -

      Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer, implements ILayer interface.

      +

      Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer.

      Usage example

      @@ -1419,7 +1488,7 @@

      Methods

      drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, <Number> zoom ) - this + this You need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom. @@ -1450,7 +1519,7 @@

      Constructor

      Description - L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds ) + L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options? ) new L.ImageOverlay()
      L.imageOverlay() @@ -1459,7 +1528,40 @@

      Constructor

      +

      Options

      + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      opacityNumber1.0The opacity of the image overlay.
      +

      Methods

      + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addTo( <Map> map )thisAdds the overlay to the map.
      setOpacity( <Number> opacity )thisSets the opacity of the overlay.

      L.Path

      @@ -1477,7 +1579,7 @@

      Options

      stroke Boolean true - Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. + Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. color @@ -1501,7 +1603,7 @@

      Options

      fill Boolean depends - Whether to fill the path with color. Set it to false to disable filling on polygons or circles. + Whether to fill the path with color. Set it to false to disable filling on polygons or circles. fillColor @@ -1519,7 +1621,7 @@

      Options

      clickable Boolean true - If false, the vector will not emit mouse events and will act as a part of the underlying map. + If false, the vector will not emit mouse events and will act as a part of the underlying map. @@ -1558,6 +1660,11 @@

      Events

      MouseEvent Fired when the mouse leaves the object. + + contextmenu + MouseEvent + Fired when the user pushes the right mouse button on the object, prevents default browser context menu from showing if there are listeners on this event. +

      Static properties

      @@ -1584,7 +1691,7 @@

      Static properties

      CANVAS Boolean depends - True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. + True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. CLIP_PADDING @@ -1601,14 +1708,24 @@

      Methods

      Returns Description + + addTo( <Map> map ) + this + Adds the layer to the map. + bindPopup( <String> htmlContent, <Popup options> options? ) - this + this Binds a popup with a particular HTML content to a click on this path. + + openPopup( <LatLng> latlng? ) + this + Opens the popup previously bound by the bindPopup method in the given point, or in one of the path's points if not specified. + setStyle( <Path options> object ) - this + this Changes the appearance of a Path based on the options in the Path options object. @@ -1685,12 +1802,12 @@

      Methods

      addLatLng( <LatLng> latlng ) - this + this Adds a given point to the polyline. setLatLngs( <LatLng[]> latlngs ) - this + this Replaces all the points in the polyline with the given array of geographical points. @@ -1703,7 +1820,7 @@

      Methods

      LatLng[] Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). - + getBounds() LatLngBounds Returns the LatLngBounds of the polyline. @@ -1830,7 +1947,7 @@

      Methods

      setBounds( <LatLngBounds> bounds ) - this + this Redraws the rectangle with the passed bounds. @@ -1880,12 +1997,12 @@

      Methods

      setLatLng( <LatLng> latlng ) - this + this Sets the position of a circle to a new location. setRadius( <Number> radius ) - this + this Sets the radius of a circle. Units are in meters. @@ -1924,12 +2041,12 @@

      Methods

      setLatLng( <LatLng> latlng ) - this + this Sets the position of a circle marker to a new location. setRadius( <Number> radius ) - this + this Sets the radius of a circle marker. Units are in pixels. @@ -1970,19 +2087,24 @@

      Methods

      Returns Description + + addTo( <Map> map ) + this + Adds the group of layers to the map. + addLayer( <ILayer> layer ) - this + this Adds a given layer to the group. removeLayer( <ILayer> layer ) - this + this Removes a given layer from the group. clearLayers() - this + this Removes all the layers from the group. @@ -2028,13 +2150,13 @@

      Methods

      bindPopup( <String> htmlContent, <Popup options> options? ) - this - Binds a popup with a particular HTML content to a click on any layer from the group. + this + Binds a popup with a particular HTML content to a click on any layer from the group that has a bindPopup method. getBounds() LatLngBounds - Returns the LatLngBounds of the Feature Group. + Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). @@ -2159,12 +2281,12 @@

      Static methods

      coordsToLatlng( <Array> coords, <Boolean> reverse? ) LatLng - Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). + Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). coordsToLatlngs( <Array> coords, <Number> levelsDeep?, <Boolean> reverse? ) Array - Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). + Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). @@ -2236,7 +2358,7 @@

      Methods

      equals( <LatLng> otherLatlng ) Boolean - Returns true if the given LatLng point is at the same position (within a small margin of error). + Returns true if the given LatLng point is at the same position (within a small margin of error). toString() @@ -2328,7 +2450,7 @@

      Methods

      extend( <LatLng|LatLngBounds> latlng ) - this + this Extends the bounds to contain the given point or bounds. @@ -2359,28 +2481,33 @@

      Methods

      contains( <LatLngBounds> otherBounds ) Boolean - Returns true if the rectangle contains the given one. + Returns true if the rectangle contains the given one. contains( <LatLng> latlng ) Boolean - Returns true if the rectangle contains the given point. + Returns true if the rectangle contains the given point. intersects( <LatLngBounds> otherBounds ) Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. equals( <LatLngBounds> otherBounds ) Boolean - Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. + Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. toBBoxString() String Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. + + pad( <Number> bufferRatio ) + LatLngBounds + Returns bigger bounds created by extending the current bounds by a given percentage in each direction. + @@ -2412,7 +2539,7 @@

      Constructor

      L.point()
      L.point([]) - Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. + Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. @@ -2462,7 +2589,7 @@

      Methods

      divideBy( <Number> number, <Boolean> round? ) Point - Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. + Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. distanceTo( <Point> otherPoint ) @@ -2567,17 +2694,17 @@

      Methods

      contains( <Bounds> otherBounds ) Boolean - Returns true if the rectangle contains the given one. + Returns true if the rectangle contains the given one. contains( <Point> point ) Boolean - Returns true if the rectangle contains the given point. + Returns true if the rectangle contains the given point. intersects( <Bounds> otherBounds ) Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. @@ -2643,7 +2770,7 @@

      Properties

      shadowUrl String - The URL to the icon shadow image. If shadowUrl is null then no shadow image will be created. + The URL to the icon shadow image. If shadowUrl is null then no shadow image will be created. shadowSize @@ -2664,40 +2791,186 @@

      Properties

      -

      L.Control.Zoom

      +

      L.Control

      + +

      The base class for all Leaflet controls. Implements IControl interface. You can add controls to the map like this:

      -

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Implements IControl interface.

      +
      control.addTo(map);
      +// the same as
      +map.addControl(control);

      Constructor

      - + + + + + + + + + +
      ConstructorConstructorUsageDescription
      L.Control( <Control options> options? ) + new L.Control()
      + L.control() +
      Creates a control with the given options.
      + +

      Options

      + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      positionString'topright'The initial position of the control (one of the map corners). See control positions.
      + +

      Methods

      + + + + - + + + + + + + + + + + + + + + + + + + +
      MethodReturns Description
      L.Control.Zoom()setPosition( <String> position )thisSets the position of the control. See control positions.
      getPosition()StringReturns the current position of the control.
      addTo( <Map> map )thisAdds the control to the map.
      removeFrom( <Map> map )thisRemoves the control from the map.
      + +

      Control Positions

      + +

      Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.

      + + + + + + + + + + + + + + + + + + + + + + +
      PositionDescription
      'topleft'Top left of the map.
      'topright'Top right of the map.
      'bottomleft'Bottom left of the map.
      'bottomright'Bottom right of the map.
      + + +

      L.Control.Zoom

      + +

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      + +

      Constructor

      + + + + + + + + +
      ConstructorUsageDescription
      L.Control.Zoom( <Control.Zoom options> options? ) + new L.Control.Zoom()
      + L.control.zoom() +
      Creates a zoom control.
      +

      Options

      + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      positionString'topleft'The position of the control (one of the map corners). See control positions.
      +

      L.Control.Attribution

      -

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Implements IControl interface.

      +

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      Constructor

      + - + +
      ConstructorUsage Description
      L.Control.Attribution()L.Control.Attribution( <Control.Attribution options> options? ) + new L.Control.Attribution()
      + L.control.attribution() +
      Creates an attribution control.
      +

      Options

      + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      positionString'bottomright'The position of the control (one of the map corners). See control positions.
      prefixString'Powered by Leaflet'The HTML text shown before the attributions. Pass false to disable.
      +

      Methods

      @@ -2707,17 +2980,17 @@

      Methods

      - - + + - - + + - +
      setPrefix( <String> prefix )-Sets the string before the attributions ("Powered by Leaflet" by default).thisSets the text before the attributions.
      addAttribution( <String> text )-Adds an attribution text (e.g. "Vector data &copy; CloudMade").thisAdds an attribution text (e.g. 'Vector data &copy; CloudMade').
      removeAttribution( <String> text )-this Removes an attribution text.
      @@ -2725,7 +2998,7 @@

      Methods

      L.Control.Layers

      -

      The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). It should be created and added explicitly to the map using Map#addControl method. Implements IControl interface.

      +

      The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

      var baseLayers = {
       	"CloudMade": cloudmade,
      @@ -2737,18 +3010,21 @@ 

      L.Control.Layers

      "Roads": roadsLayer }; -layersControl = new L.Control.Layers(baseLayers, overlays); - -map.addControl(layersControl);
      +L.control.layers(baseLayers, overlays).addTo(map);

      Constructor

      + +
      ConstructorUsage Description
      L.Control.Layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? ) + new L.Control.Layers()
      + L.control.layers() +
      Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes.
      @@ -2762,17 +3038,17 @@

      Methods

      addBaseLayer( <ILayer> layer, <String> name ) - this + this Adds a base layer (radio button entry) with the given name to the control. addOverlay( <ILayer> layer, <String> name ) - this + this Adds an overlay (checkbox entry) with the given name to the control. removeLayer( <ILayer> layer ) - this + this Remove the given layer from the control. @@ -2786,11 +3062,17 @@

      Options

      Default Description + + position + String + 'topright' + The position of the control (one of the map corners). See control positions. + collapsed Boolean true - If true, the control will be collapsed into an icon and expanded on mouse hover or touch. + If true, the control will be collapsed into an icon and expanded on mouse hover or touch. @@ -2806,6 +3088,72 @@

      Layer Config

      +

      L.Control.Scale

      + +

      A simple scale control that shows the scale of the current center of screen in metric (m/km) and imerial (mi/ft) systems. Implements IControl interface.

      + +
      L.control.scale().addTo(map);
      + +

      Constructor

      + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Control.Scale( <Control.Scale options> options? ) + new L.Control.Attribution()
      + L.control.attribution() +
      Creates an scale control with the given options.
      + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      positionString'bottomleft'The position of the control (one of the map corners). See control positions.
      maxWidthNumber100Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500).
      metricBooleantrueWhether to show the metric scale line (m/km).
      imerialBooleantrueWhether to show the imerial scale line (mi/ft).
      updateWhenIdleBooleanfalseIf true, the control is updated on moveend, otherwise it's always up-to-date (updated on move).
      + + +

      Events methods

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

      @@ -2832,37 +3180,37 @@

      Methods

      addEventListener( <String> type, <Function> fn, <Object> context? ) - this - Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). + this + Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). removeEventListener( <String> type, <Function> fn, <Object> context? ) - this + this Removes a previously added listener function. on( … ) - this + this Alias to addEventListener. off( … ) - this + this Alias to removeEventListener. hasEventListeners( <String> type ) Boolean - Returns true if a particular event type has some listeners attached to it. + Returns true if a particular event type has some listeners attached to it. fireEvent( <String> type, <Object> data? ) - this + this Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. fire( … ) - this + this Alias to fireEvent. @@ -2916,6 +3264,16 @@

      MouseEvent

      Point Pixel coordinates of the point where the mouse event occured relative to the map layer. + + containerPoint + Point + Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + + + originalEvent + DOMMouseEvent + The original DOM mouse event fired by the browser. +

      LocationEvent

      @@ -3172,57 +3530,57 @@

      L.Browser

      ie Boolean - true for all Internet Explorer versions. + true for all Internet Explorer versions. ie6 Boolean - true for Internet Explorer 6. + true for Internet Explorer 6. webkit Boolean - true for webkit-based browsers like Chrome and Safari (including mobile versions). + true for webkit-based browsers like Chrome and Safari (including mobile versions). webkit3d Boolean - true for webkit-based browsers that support CSS 3D transformations. + true for webkit-based browsers that support CSS 3D transformations. gecko Boolean - true for Gecko-based browsers like Firefox and Mozilla. + true for Gecko-based browsers like Firefox and Mozilla. opera Boolean - true for Opera. + true for Opera. android Boolean - true for Android mobile browser. + true for Android mobile browser. mobile Boolean - true for modern mobile browsers (including iOS Safari and different Android browsers). + true for modern mobile browsers (including iOS Safari and different Android browsers). mobileWebkit Boolean - true for mobile webkit-based browsers. + true for mobile webkit-based browsers. mobileOpera Boolean - true for mobile Opera. + true for mobile Opera. touch Boolean - true for all browsers on touch devices. + true for all browsers on touch devices. @@ -3247,7 +3605,7 @@

      Methods

      bind( <Function> fn, <Object> obj ) Function - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). stamp( <Object> obj ) @@ -3276,7 +3634,7 @@

      Methods

      falseFn() Function - Returns a function which always returns false. + Returns a function which always returns false. formatNum(
      <Number> num, <Number> digits ) @@ -3367,7 +3725,7 @@

      Methods

      hasClass( <HTMLElement> el, <String> name ) Boolean - Returns true if the element class attribute contains name. + Returns true if the element class attribute contains name. addClass( <HTMLElement> el, <String> name ) @@ -3387,7 +3745,7 @@

      Methods

      testProp( <String[]> props ) String or false - Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. + Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. getTranslateString( <Point> point ) @@ -3402,7 +3760,7 @@

      Methods

      setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? ) - - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. + Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. getPosition( <HTMLElement> el ) @@ -3454,7 +3812,7 @@

      IHandler

      enabled() Boolean - Returns true if the handler is enabled. + Returns true if the handler is enabled. From 7d6af0fad3744539860d8709d56960bce03c179a Mon Sep 17 00:00:00 2001 From: mourner Date: Fri, 20 Jul 2012 20:10:30 +0300 Subject: [PATCH 0181/2207] more docs updates and additions --- DOCS-TODO | 25 +--- docs/css/screen.css | 9 +- reference.html | 323 ++++++++++++++++++++++++++++++++------------ 3 files changed, 249 insertions(+), 108 deletions(-) diff --git a/DOCS-TODO b/DOCS-TODO index 3dce470d738..e2e12f88764 100644 --- a/DOCS-TODO +++ b/DOCS-TODO @@ -1,15 +1,3 @@ -Map - panning inertia options - - remove locateAndSetView - new locate options - - addHandler - -Icon -Icon.Default - -NEW DivIcon on/off(eventMap) on/off(space-separated types) @@ -20,20 +8,10 @@ TileLayer redraw setUrl - bringToFront - bringToBack Path - bringToFront - bringToBack - - openPopup - redraw -FeatureGroup - ? - setStyle - NEW Global switches L_NO_TOUCH L_PREFER_CANVAS @@ -115,3 +93,6 @@ NEW ICRS pointToLatLng(point, zoom) project(latlng) scale(zoom) + + +Map addHandler? diff --git a/docs/css/screen.css b/docs/css/screen.css index 77dd55fddb6..6b609feaa8d 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -88,11 +88,11 @@ h3.alt { margin-top: 0; } h4 { - margin-bottom: 0.2em; + margin-bottom: 0.5em; line-height: inherit; - font-size: 1em; + font-size: 1.1em; font-weight: bold; - color: #555; + color: #777; } h3.alt { @@ -367,6 +367,9 @@ th.width300 { th.width100 { width: 100px; } +th.width140 { + width: 140px; +} th.minwidth { width: 1px; } diff --git a/reference.html b/reference.html index 973b1b426c8..9ae3f734a1b 100644 --- a/reference.html +++ b/reference.html @@ -159,6 +159,8 @@

      Constructor

      Options

      +

      Map State Options

      + @@ -181,19 +183,19 @@

      Options

      - + - + - + @@ -208,6 +210,17 @@

      Options

      +
      Option
      layers ILayer[][]null Layers that will be added to the map initially.
      minZoom Number0null Minimum zoom level of the map. Overrides any minZoom set on map layers.
      maxZoom Number18null Maximum zoom level of the map. This overrides any maxZoom set on map layers.
      L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means.
      + +

      Interaction Options

      + + + + + + + + @@ -238,6 +251,70 @@

      Options

      + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      dragging Boolean true Whether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift.
      trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.
      worldCopyJumpBooleantrueWith this option enabled, the map tracks when you pan to another "copy" of the world and moves all overlays like markers and vector layers there.
      closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
      + +

      Panning Inertia Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      inertiaBooleantrueIf enabled, panning of the map will have an inertia effect where the map builds momentum while dragging and continues moving in the same direction for some time. Feels especially nice on touch devices.
      inertiaDecelerationNumber3000The rate with which the inertial movement slows down, in pixels/second2.
      inertiaMaxSpeedNumber1500Max speed of the inertial movement, in pixels/second.
      inertiaThresholdNumberdependsAmount of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default.
      + +

      Control options

      + + + + + + + + @@ -250,11 +327,16 @@

      Options

      +
      OptionTypeDefaultDescription
      zoomControl Boolean true Whether the attribution control is added to the map by default.
      + +

      Animation options

      + + - - - - + + + + @@ -274,18 +356,6 @@

      Options

      - - - - - - - - - - - -
      trackResizeBooleantrueWhether the map automatically handles browser window resize to update itself.OptionTypeDefaultDescription
      fadeAnimation depends Whether markers animate their zoom with the zoom animation, if disabled they will disappear for the length of the animation. By default it's enabled in all browsers that support CSS3 Transitions except Android.
      closePopupOnClickBooleantrueSet it to false if you don't want popups to close when user clicks the map.
      worldCopyJumpBooleantrueWith this option enabled, the map tracks when you pan to another "copy" of the world and moves all overlays like markers and vector layers there.
      @@ -407,12 +477,12 @@

      Events

      locationfound LocationEvent - Fired when geolocation (using locate or locateAndSetView method) went successfully. + Fired when geolocation (using locate method) went successfully. locationerror ErrorEvent - Fired when geolocation (using locate or locateAndSetView method) failed. + Fired when geolocation (using locate method) failed. popupopen @@ -493,12 +563,7 @@

      Methods for Modifying Map State

      locate( <Locate options> options? ) this - Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure. See Locate options for more details. - - - locateAndSetView( <Number> maxZoom?, <Locate options> options? ) - this - Automatically sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). A shortcut for map.locate({setView: true, maxZoom: maxZoom});. + Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure, and optionally sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). See Locate options for more details. stopLocate() @@ -713,7 +778,7 @@

      Locate options

      setView Boolean false - If true, automatically sets the map view to the user location with respect to detection accuracy. + If true, automatically sets the map view to the user location with respect to detection accuracy, or to world view if geolocation failed. maxZoom @@ -1343,6 +1408,16 @@

      Methods

      this Adds the layer to the map. + + bringToFront() + this + Brings the tile layer to the top of all tile layers. + + + bringToBack() + this + Brings the tile layer to the bottom of all tile layers. + setOpacity( <Number> opacity ) this @@ -1667,40 +1742,6 @@

      Events

      -

      Static properties

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ConstantTypeValueDescription
      SVGBooleandependsTrue if SVG is used for vector rendering (true for most modern browsers).
      VMLBooleandependsTrue if VML is used for vector rendering (IE 6-8).
      CANVASBooleandependsTrue if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow.
      CLIP_PADDINGNumber0.5 for SVG
      0.02 for VML
      How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.
      -

      Methods

      @@ -1733,6 +1774,50 @@

      Methods

      + + + + + + + + + + +
      LatLngBounds Returns the LatLngBounds of the path.
      bringToFront()thisBrings the layer to the top of all path layers.
      bringToBack()thisBrings the layer to the bottom of all path layers.
      + +

      Static properties

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ConstantTypeValueDescription
      SVGBooleandependsTrue if SVG is used for vector rendering (true for most modern browsers).
      VMLBooleandependsTrue if VML is used for vector rendering (IE 6-8).
      CANVASBooleandependsTrue if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow.
      CLIP_PADDINGNumber0.5 for SVG
      0.02 for VML
      How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance.
      @@ -2149,7 +2234,7 @@

      Methods

      Description - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( <String> htmlContent, <Popup options> options? ) this Binds a popup with a particular HTML content to a click on any layer from the group that has a bindPopup method. @@ -2158,6 +2243,11 @@

      Methods

      LatLngBounds Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). + + setStyle( <Path options> style ) + this + Sets the given path options to each layer of the group that has a setStyle method. +

      Events

      @@ -2190,6 +2280,16 @@

      Events

      MouseEvent Fired when the mouse leaves the group. + + mousemove + MouseEvent + Fired while the mouse moves over the layers of the group. + + + contextmenu + MouseEvent + Fired when the user right-clicks on one of the layers. + @@ -2715,11 +2815,12 @@

      L.Icon

      var myIcon = L.icon({
       	iconUrl: 'my-icon.png',
      -	shadowUrl: 'my-icon-shadow.png',
       	iconSize: [38, 95],
      -	shadowSize: [68, 95],
       	iconAnchor: [22, 94],
      -	popupAnchor: [-3, -76]
      +	popupAnchor: [-3, -76],
      +	shadowUrl: 'my-icon-shadow.png',
      +	shadowSize: [68, 95],
      +	shadowAnchor: [22, 94]
       });
       
       L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
      @@ -2735,20 +2836,20 @@

      Constructor

      Description - L.Icon( <Icon properties> props ) + L.Icon( <Icon options> options ) new L.Icon()
      L.icon() - Creates an icon instance with the given properties. + Creates an icon instance with the given options. -

      Properties

      +

      Options

      - + @@ -2765,12 +2866,12 @@

      Properties

      + + @@ -2778,19 +2879,75 @@

      Properties

      - + + - + + + +
      PropertyOption Type Description
      iconAnchor Point - The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location.The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location. Centered by default if size is specified, also can be set in CSS with negative margins.
      shadowUrl String - The URL to the icon shadow image. If shadowUrl is null then no shadow image will be created.The URL to the icon shadow image. If not specified, no shadow image will be created.
      shadowSize Size of the shadow image in pixels.
      shadowOffsetshadowAnchor Point - Position of the shadow relative to the icon ((0, 0) by default)The coordinates of the "tip" of the shadow (relative to its top left corner) (the same as iconAnchor if not specified).
      popupAnchorclassNameString + A custom class name to assign to both icon and shadow images. Empty by default.
      + + +

      L.DivIcon

      + +

      Represents a lightweight icon for markers that uses a simple div element instead of an image.

      + +
      var myIcon = L.divIcon({className: 'my-div-icon'});
      +// you can set .my-div-icon styles in CSS
      +
      +L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
      + +

      By default, it has a 'leaflet-div-icon' class and is styled as a little white square with a shadow.

      + +

      Constructor

      + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.DivIcon( <DivIcon options> options ) + new L.DivIcon()
      + L.divIcon() +
      Creates a div icon instance with the given options.
      + +

      Options

      + + + + + + + + + + + + + + + + + +
      OptionTypeDescription
      iconSize Point - The point from which the marker popup opens, relative to the anchor point.Size of the icon in pixels. Can be also set through CSS.
      iconAnchorPoint + The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location. Centered by default if size is specified, also can be set in CSS with negative margins.
      classNameString + A custom class name to assign to the icon. 'leaflet-div-icon' by default.
      +

      L.Control

      The base class for all Leaflet controls. Implements IControl interface. You can add controls to the map like this:

      @@ -3816,13 +3973,6 @@

      IHandler

      -

      L.version

      - -

      A constant that represents the Leaflet version in use.

      - -

      L.version // returns "0.4" (or whatever version is currently in use)
      - -

      L.noConflict()

      This method restores the L global variale to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      @@ -3833,3 +3983,10 @@

      L.noConflict()

      var Leaflet = L.noConflict(); // now L points to that other library again, and you can use Leaflet.Map etc.
      + + +

      L.version

      + +

      A constant that represents the Leaflet version in use.

      + +

      L.version // returns "0.4" (or whatever version is currently in use)
      From 30a5caee4d3f76ac4965c7e1a5b88f2018022f5a Mon Sep 17 00:00:00 2001 From: mourner Date: Fri, 20 Jul 2012 23:15:21 +0300 Subject: [PATCH 0182/2207] more docs updates --- DOCS-TODO | 21 --------------- reference.html | 70 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/DOCS-TODO b/DOCS-TODO index e2e12f88764..b2d65e29090 100644 --- a/DOCS-TODO +++ b/DOCS-TODO @@ -1,22 +1,4 @@ -on/off(eventMap) -on/off(space-separated types) -off(type) to remove all listeners - -TileLayer - detectRetina option - - redraw - setUrl - -Path - redraw - -NEW Global switches - L_NO_TOUCH - L_PREFER_CANVAS - L_DISABLE_3D - NEW Transformation Transformation(a, b, c, d) @@ -93,6 +75,3 @@ NEW ICRS pointToLatLng(point, zoom) project(latlng) scale(zoom) - - -Map addHandler? diff --git a/reference.html b/reference.html index 9ae3f734a1b..88e3b1a8644 100644 --- a/reference.html +++ b/reference.html @@ -114,7 +114,7 @@

      Interfaces

      Misc

      @@ -1387,6 +1387,12 @@

      Options

      depends If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. + + detectRetina + Boolean + false + If true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. + reuseTiles Boolean @@ -1426,7 +1432,12 @@

      Methods

      redraw() - - Calling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas + Causes the layer to clear all the tiles and request them again. + + + setUrl( <String> urlTemplate ) + this + Updates the layer's URL template and redraws it. @@ -1784,6 +1795,11 @@

      Methods

      this Brings the layer to the bottom of all path layers. + + redraw() + this + Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. +

      Static properties

      @@ -3338,22 +3354,22 @@

      Methods

      addEventListener( <String> type, <Function> fn, <Object> context? ) this - Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). + Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). - removeEventListener( <String> type, <Function> fn, <Object> context? ) + addEventListener( <Object> eventMap, <Object> context? ) this - Removes a previously added listener function. + Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} - on( … ) + removeEventListener( <String> type, <Function> fn?, <Object> context? ) this - Alias to addEventListener. + Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. - off( … ) + removeEventListener( <Object> eventMap, <Object> context? ) this - Alias to removeEventListener. + Removes a set of type/listener pairs.
      hasEventListeners( <String> type ) @@ -3365,6 +3381,16 @@

      Methods

      this Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. + + on( … ) + this + Alias to addEventListener. + + + off( … ) + this + Alias to removeEventListener. + fire( … ) this @@ -3973,6 +3999,32 @@

      IHandler

      +

      Global Switches

      + +

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      + +
      <script>L_PREFER_CANVAS = true;</script>
      +<script src="leaflet.js"></script>
      + + + + + + + + + + + + + + + + + + +
      SwitchDescription
      L_PREFER_CANVASForces Leaflet to use the Canvas back-end (if available) for vector layers instead of SVG. This can increase performance considerably in some cases (e.g. many thousands of circle markers on the map).
      L_NO_TOUCHForces Leaflet to not use touch events even if it detects them. Particularly useful if you embed Leaflet inside a QT WebView (which exposes touch events even on desktop PCs).
      L_DISABLE_3DForces Leaflet to not use hardware-accelerated CSS 3D transforms for positioning (which may cause glitches in some rare environments) even if they're supported.
      +

      L.noConflict()

      This method restores the L global variale to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      From 4ee1ee8b9c425b7fb856541c0acea7469b22ade0 Mon Sep 17 00:00:00 2001 From: mourner Date: Sat, 21 Jul 2012 01:11:26 +0300 Subject: [PATCH 0183/2207] more docs updates, jekyllize remaining pages --- _layouts/default.html | 2 +- examples/custom-icons.md | 2 +- examples/geojson.html | 257 ++++++++++++----------------------- examples/layers-control.html | 185 ++++++++----------------- examples/mobile.html | 129 ++++-------------- reference.html | 16 ++- 6 files changed, 186 insertions(+), 405 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 27c30111025..8f2d95ed497 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -125,7 +125,7 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv diff --git a/examples/custom-icons.md b/examples/custom-icons.md index 15748546790..7ca68043ea0 100644 --- a/examples/custom-icons.md +++ b/examples/custom-icons.md @@ -1,6 +1,6 @@ --- layout: default -title: Custom Icons +title: Markers With Custom Icons root: ../ --- diff --git a/examples/geojson.html b/examples/geojson.html index 782becf74b9..6ccb95c30bd 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -1,133 +1,96 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Leaflet on Mobile Example - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - -

      ← Back to the list of examples

      -

      Using GeoJSON with Leaflet

      - -

      GeoJSON is becoming a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

      - -
      - - - + + -

      View example on a separate page →

      +

      View example on a separate page →

      -

      About GeoJSON

      +

      About GeoJSON

      -

      According to http://geojson.org:

      +

      According to http://geojson.org:

      -
      GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
      +
      GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
      -

      Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

      +

      Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

      -

      The GeoJSON layer

      +

      The GeoJSON layer

      -

      GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

      +

      GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

      -
      var geojsonLayer = new L.GeoJSON();
      +
      var geojsonLayer = new L.GeoJSON();
       
       map.addLayer(geojsonLayer);
      -

      This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

      +

      This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

      -
      var geojsonFeature = {
      +
      var geojsonFeature = {
       	"type": "Feature",
       	"properties": {
       		"name": "Coors Field",
      @@ -142,29 +105,29 @@ 

      The GeoJSON layer

      geojsonLayer.addGeoJSON(geojsonFeature);
      -

      We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

      +

      We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

      -
      var geojsonLayer = new L.GeoJSON(geojsonFeature);
      +
      var geojsonLayer = new L.GeoJSON(geojsonFeature);
       
       map.addLayer(geojsonLayer);
      -

      Popups

      +

      Popups

      -

      We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

      +

      We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

      -
      geojsonLayer.on("featureparse", function (e) {
      +
      geojsonLayer.on("featureparse", function (e) {
       	if (e.properties && e.properties.popupContent){
       		e.layer.bindPopup(e.properties.popupContent);
       	}
       });
      -

      Make sure to do this before adding GeoJSON objects through the addGeoJSON method.

      +

      Make sure to do this before adding GeoJSON objects through the addGeoJSON method.

      -

      Styling Features

      +

      Styling Features

      -

      We can also listen to the featureparse event to style our Polyline and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

      +

      We can also listen to the featureparse event to style our Polyline and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

      -
      var freeBus = {
      +
      var freeBus = {
       	"type": "Feature",
       	"geometry": {
       		"type": "LineString",
      @@ -187,22 +150,22 @@ 

      Styling Features

      } };
      -

      To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

      +

      To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

      -
      geojsonLayer.on("featureparse", function (e){
      +
      geojsonLayer.on("featureparse", function (e){
       	if (e.properties && e.properties.style && e.layer.setStyle){
       		// The setStyle method isn't available for Points. More on that below ...
       		e.layer.setStyle(e.properties.style);
       	}
       });
      -

      Styling Points

      +

      Styling Points

      -

      Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

      +

      Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

      -

      Here we're using a CircleMarker:

      +

      Here we're using a CircleMarker:

      -
      var geojsonMarkerOptions = {
      +
      var geojsonMarkerOptions = {
       	radius: 8,
       	fillColor: "#ff7800",
       	color: "#000",
      @@ -217,9 +180,9 @@ 

      Styling Points

      } });
      -

      And here's an example of using a custom Marker:

      +

      And here's an example of using a custom Marker:

      -
      var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
      +
      var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
       	pointToLayer: function (latlng) {
       		return new L.Marker(latlng, {
       			icon: new MyCustomIcon()
      @@ -227,44 +190,4 @@ 

      Styling Points

      } });
      -

      View the example page to see in detail what is possible with the GeoJSON layer.

      - -
      - -

      © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - +

      View the example page to see in detail what is possible with the GeoJSON layer.

      diff --git a/examples/layers-control.html b/examples/layers-control.html index 5518184e4e5..45c525916a1 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -1,104 +1,67 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Layers Control Example +--- +layout: default +title: Layer Groups and Layers Control +root: ../ +--- - - - +

      ← Back to the list of examples

      +

      Layer Groups and Layers Control

      - +

      This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

      +

      Note: this only works in the latest (master) version of Leaflet.

      - +
      + - + var cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade', + cloudmadeUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png'; - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      + var minimal = new L.TileLayer(cloudmadeUrl, {styleId: 22677, attribution: cloudmadeAttribution}), + midnightCommander = new L.TileLayer(cloudmadeUrl, {styleId: 999, attribution: cloudmadeAttribution}), + motorways = new L.TileLayer(cloudmadeUrl, {styleId: 46561, attribution: cloudmadeAttribution}); - + var map = new L.Map('map', {center: new L.LatLng(39.73, -104.99), zoom: 10, layers: [minimal, motorways, citiesLayer]}); -

      ← Back to the list of examples

      -

      Layer Groups and Layers Control

      + var baseMaps = { + "Minimal": minimal, + "Night View": midnightCommander + }; -

      This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

      -

      Note: this only works in the latest (master) version of Leaflet.

      + var overlayMaps = { + "Motorways": motorways, + "Cities": citiesLayer + }; -
      - - citiesLayer.addLayer(littletonMarker); - citiesLayer.addLayer(denverMarker); - citiesLayer.addLayer(auroraMarker); - citiesLayer.addLayer(goldenMarker); +

      View example on a separate page →

      - var cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade', - cloudmadeUrl = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png'; +

      Layer Groups

      - var minimal = new L.TileLayer(cloudmadeUrl, {styleId: 22677, attribution: cloudmadeAttribution}), - midnightCommander = new L.TileLayer(cloudmadeUrl, {styleId: 999, attribution: cloudmadeAttribution}), - motorways = new L.TileLayer(cloudmadeUrl, {styleId: 46561, attribution: cloudmadeAttribution}); +

      Lets suppose you have a bunch of layers you want to combine into a group to handle them as one in your code:

      - var map = new L.Map('map', {center: new L.LatLng(39.73, -104.99), zoom: 10, layers: [minimal, motorways, citiesLayer]}); - - var baseMaps = { - "Minimal": minimal, - "Night View": midnightCommander - }; - - var overlayMaps = { - "Motorways": motorways, - "Cities": citiesLayer - }; - - layersControl = new L.Control.Layers(baseMaps, overlayMaps); - - map.addControl(layersControl); - - -

      View example on a separate page →

      - -

      Layer Groups

      - -

      Lets suppose you have a bunch of layers you want to combine into a group to handle them as one in your code:

      - -
      var littletonMarker = new L.Marker(new L.LatLng(39.61, -105.02)).bindPopup("This is Littleton, CO."),
      +
      var littletonMarker = new L.Marker(new L.LatLng(39.61, -105.02)).bindPopup("This is Littleton, CO."),
       	denverMarker = new L.Marker(new L.LatLng(39.74, -104.99)).bindPopup("This is Denver, CO."),
       	auroraMarker = new L.Marker(new L.LatLng(39.73, -104.8)).bindPopup("This is Aurora, CO."),
       	goldenMarker = new L.Marker(new L.LatLng(39.77, -105.23)).bindPopup("This is Golden, CO.");
      -

      Instead of adding them directly to the map, you can do the following, using the LayerGroup class:

      +

      Instead of adding them directly to the map, you can do the following, using the LayerGroup class:

      -
      var citiesLayer = new L.LayerGroup();
      +
      var citiesLayer = new L.LayerGroup();
       
       citiesLayer.addLayer(littletonMarker)
                  .addLayer(denverMarker)
      @@ -107,15 +70,15 @@ 

      Layer Groups

      map.addLayer(citiesLayer);
      -

      Easy enough! Now you have citiesLayer that combines your city markers into one layer you can add or remove from the map at once.

      +

      Easy enough! Now you have citiesLayer that combines your city markers into one layer you can add or remove from the map at once.

      -

      Layers Control

      +

      Layers Control

      -

      Leaflet has a nice little control that allows your users control what layers they want to see on your map. In addition to showing you how to use it, we'll show another handy use for layer groups.

      +

      Leaflet has a nice little control that allows your users control what layers they want to see on your map. In addition to showing you how to use it, we'll show another handy use for layer groups.

      -

      There are two types of layers — base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays — all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off — a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map:

      +

      There are two types of layers — base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays — all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off — a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map:

      -
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/{styleId}/256/{z}/{x}/{y}.png',
      +
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/{styleId}/256/{z}/{x}/{y}.png',
       	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
       	cloudmadeOptions = {maxZoom: 18, };
       
      @@ -129,9 +92,9 @@ 

      Layers Control

      layers: [minimal, motorways, citiesLayer] });
      -

      Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are just simple objects with key/value pairs. The key is what sets the text for the layer in the control (e.g. "Night View"). The corresponding value is a reference to the layer (e.g. midnightCommander).

      +

      Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are just simple objects with key/value pairs. The key is what sets the text for the layer in the control (e.g. "Night View"). The corresponding value is a reference to the layer (e.g. midnightCommander).

      -
      var baseMaps = {
      +
      var baseMaps = {
       	"Minimal": minimal,
       	"Night View": midnightCommander
       };
      @@ -141,51 +104,11 @@ 

      Layers Control

      "Cities": citiesLayer };
      - -

      Now, all that's left to do is to create a Layers Control and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional — for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing null as the first argument.

      + +

      Now, all that's left to do is to create a Layers Control and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional — for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing null as the first argument.

      -
      var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
      +
      var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
       
       map.addControl(layersControl);
      -

      Now lets view the result on a separate page →

      - -
      - -

      © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - +

      Now lets view the result on a separate page →

      diff --git a/examples/mobile.html b/examples/mobile.html index 13fc3231b73..2ac04cec439 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -1,56 +1,21 @@ - - - - Leaflet - a JavaScript library for mobile-friendly interactive maps by CloudMade - Leaflet on Mobile Example +--- +layout: default +title: Leaflet on Mobile +root: ../ +--- - - - +

      ← Back to the list of examples

      +

      Leaflet on Mobile

      - +

      In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

      - - - - +

      View example →

      - +

      Preparing the page

      - - +

      First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

      - - - - - - -
      -

      Leaflet

      -

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      - - - -

      ← Back to the list of examples

      -

      Leaflet on Mobile

      - -

      In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

      - -

      View example →

      - -

      Preparing the page

      - -

      First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

      - -
      body {
      +
      body {
       	padding: 0;
       	margin: 0;
       }
      @@ -58,15 +23,15 @@ 

      Preparing the page

      height: 100%; }
      -

      Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the head section:

      +

      Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the head section:

      -
      <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
      +
      <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
      -

      Initializing the map

      +

      Initializing the map

      -

      We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

      +

      We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

      -
      var map = new L.Map('map');
      +
      var map = new L.Map('map');
       
       var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
       	cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
      @@ -74,15 +39,15 @@ 

      Initializing the map

      map.addLayer(cloudmade);
      -

      Geolocation

      +

      Geolocation

      -

      Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

      +

      Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

      -
      map.locateAndSetView(16);
      +
      map.locateAndSetView(16);
      -

      Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

      +

      Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

      -
      map.on('locationfound', onLocationFound);
      +
      map.on('locationfound', onLocationFound);
       
       function onLocationFound(e) {
       	var radius = e.accuracy / 2;
      @@ -95,54 +60,14 @@ 

      Geolocation

      map.addLayer(circle); }
      -

      Excellent! But it would also be nice to show an error message if the geolocation failed:

      +

      Excellent! But it would also be nice to show an error message if the geolocation failed:

      -
      map.on('locationerror', onLocationError);
      +
      map.on('locationerror', onLocationError);
       
       function onLocationError(e) {
       	alert(e.message);
       }
      -

      Now the example is complete — try it on your mobile phone: View the full example →

      - -

      Next steps would be to take a look at the detailed documentation and browse other examples.

      - -
      - -

      © 2011 CloudMade. Map data © 2011 OpenStreetMap contributors, CC-BY-SA.

      -
      - - Fork me on GitHub - - - - - - - - +

      Now the example is complete — try it on your mobile phone: View the full example →

      + +

      Next steps would be to take a look at the detailed documentation and browse other examples.

      diff --git a/reference.html b/reference.html index 88e3b1a8644..bbc16ef5cca 100644 --- a/reference.html +++ b/reference.html @@ -384,6 +384,11 @@

      Events

      MouseEvent Fired when the user pushes the mouse button on the map. + + mouseup + MouseEvent + Fired when the user pushes the mouse button on the map. + mouseenter MouseEvent @@ -1229,15 +1234,20 @@

      Methods

      + + + + + - - - + + + From 94c027c208f8a6017f4a50395ca129ab5428a22f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2012 10:20:49 +0300 Subject: [PATCH 0184/2207] separate layout for tutorials --- _layouts/default.html | 2 +- _layouts/tutorial.html | 9 +++++++++ docs/css/screen.css | 7 +++++++ examples/custom-icons.md | 6 +----- examples/geojson.html | 4 +--- examples/layers-control.html | 4 +--- examples/mobile.html | 4 +--- examples/quick-start.md | 8 ++------ 8 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 _layouts/tutorial.html diff --git a/_layouts/default.html b/_layouts/default.html index 8f2d95ed497..4d069679ec7 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -85,7 +85,7 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv {% if page.title == 'Tutorials' %} Tutorials {% else %} - Tutorials + Tutorials {% endif %}
    26. diff --git a/_layouts/tutorial.html b/_layouts/tutorial.html new file mode 100644 index 00000000000..4471a1a2d9f --- /dev/null +++ b/_layouts/tutorial.html @@ -0,0 +1,9 @@ +--- +layout: default +root: ../ +tutorial: true +--- + +

      ← Back to the list of tutorials

      + +{{ content }} diff --git a/docs/css/screen.css b/docs/css/screen.css index 6b609feaa8d..b7eebfb6491 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -209,6 +209,13 @@ td { filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); } + .nav li a.active { + color: black; + + background-color: rgba(0,0,0,0.06); + + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); + } .nav li a.github-link, .nav li a.twitter-link, .nav li a.forum-link { diff --git a/examples/custom-icons.md b/examples/custom-icons.md index 7ca68043ea0..7d95ef382e1 100644 --- a/examples/custom-icons.md +++ b/examples/custom-icons.md @@ -1,12 +1,8 @@ --- -layout: default +layout: tutorial title: Markers With Custom Icons -root: ../ --- -[← Back to the list of examples](../examples.html) - - ### Markers With Custom Icons In this example, you'll learn how to easily define your own icons for use by the markers you put on the map. diff --git a/examples/geojson.html b/examples/geojson.html index 6ccb95c30bd..f7c1bdb0fac 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -1,10 +1,8 @@ --- -layout: default +layout: tutorial title: Using GeoJSON with Leaflet -root: ../ --- -

      ← Back to the list of examples

      Using GeoJSON with Leaflet

      GeoJSON is becoming a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

      diff --git a/examples/layers-control.html b/examples/layers-control.html index 45c525916a1..d36690540a8 100644 --- a/examples/layers-control.html +++ b/examples/layers-control.html @@ -1,10 +1,8 @@ --- -layout: default +layout: tutorial title: Layer Groups and Layers Control -root: ../ --- -

      ← Back to the list of examples

      Layer Groups and Layers Control

      This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

      diff --git a/examples/mobile.html b/examples/mobile.html index 2ac04cec439..ef7f067583f 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -1,10 +1,8 @@ --- -layout: default +layout: tutorial title: Leaflet on Mobile -root: ../ --- -

      ← Back to the list of examples

      Leaflet on Mobile

      In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

      diff --git a/examples/quick-start.md b/examples/quick-start.md index 17d8eb0ec17..3a773e8cc86 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -1,12 +1,8 @@ --- -layout: default +layout: tutorial title: Quick Start Guide -root: ../ --- -[← Back to the list of examples](../examples.html) - - ### Leaflet Quick Start Guide This step-by-step guide will quickly get you started on Leaflet basics, including setting up a Leaflet map, working with markers, polylines and popups, and dealing with events. @@ -234,4 +230,4 @@ Now you've learned Leaflet basics and can start building map apps straight away! var polygon3 = new L.Polygon(polygonPoints); polygon3.bindPopup("I am a polygon."); map3.addLayer(polygon3); - \ No newline at end of file + From 5806d6bc6dac9e4f8be84203c1e9561431ac60df Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2012 12:15:00 +0300 Subject: [PATCH 0185/2207] add lineutil and polyutil docs --- reference.html | 90 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index bbc16ef5cca..34ad4bf327b 100644 --- a/reference.html +++ b/reference.html @@ -90,8 +90,8 @@

      Utility

    27. Browser
    28. Util
    29. Transformation
    30. -
    31. LineUtil
    32. -
    33. PolyUtil
    34. +
    35. LineUtil
    36. +
    37. PolyUtil
    38. DOM Utility

        @@ -121,6 +121,8 @@

        Misc

        + +

        This reference reflects Leaflet 0.4. You can find docs for the in-progress master version in reference.html of gh-pages-master branch

        @@ -3872,6 +3874,90 @@

        Properties

      MethodReturnsDescription
      addTo( <Map> map ) this Adds the popup to the map.
      MethodReturnsDescriptionopenOn( <Map> map )thisAdds the popup to the map and closes the previous one. The same as map.openPopup(popup).
      setLatLng( <LatLng> latlng )
      +

      L.LineUtil

      + +

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      simplify( + <Point[]> points, + <Number> tolerance ) + Point[]Dramatically reduces the number of points in a polyline while retaining its shape and returns a new array of simplified points. Used for a huge performance boost when processing/displaying Leaflet polylines for each zoom level and also reducing visual noise. tolerance affects the amount of simplification (lesser value means higher quality but slower and with more points). Also released as a separated micro-library Simplify.js.
      pointToSegmentDistance( + <Point> p, + <Point> p1, + <Point> p2 ) + NumberReturns the distance between point p and segment p1 to p2.
      closestPointOnSegment( + <Point> p, + <Point> p1, + <Point> p2 ) + NumberReturns the closest point from a point p on a segment p1 to p2.
      clipSegment( + <Point> a, + <Point> b, + <Bounds> bounds ) + -Clips the segment a to b by rectangular bounds (modifying the segment points directly!). Used by Leaflet to only show polyline points that are on the screen or near, increasing performance.
      + + + +

      L.PolyUtil

      + +

      Various utility functions for polygon geometries.

      + +

      Methods

      + + + + + + + + + + + + + + +
      MethodReturnsDescription
      clipPolygon( + <Point[]> points, + <Bounds> bounds ) + Point[]Clips the polygon geometry defined by the given points by rectangular bounds. Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping than polyline, so there's a seperate method for it.
      + +

      L.DomUtil

      From cff5d6552802e5bae0695aeb65ea5e7e1dea4222 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2012 12:45:18 +0300 Subject: [PATCH 0186/2207] color method arguments --- docs/css/screen.css | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index b7eebfb6491..fae3f9fb537 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -354,7 +354,7 @@ table td:last-child { } table td code i { - color: black; + color: #00A707; } table td code b { @@ -441,3 +441,17 @@ dl dd { .plugins td { color: black; } + + +#back-to-top { + text-decoration: none; + padding: 0px 10px 2px; + background: white; + color: black; + font-weight: bold; + font-size: 16px; + position: fixed; + top: -1px; + left: 0; + box-shadow: 0 3px 20px rgba(0, 0, 0, 0.1); +} From 8827c66c6c1fa265ba217c9424035eb86dcf3626 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2012 12:45:52 +0300 Subject: [PATCH 0187/2207] improve docs html formatting --- reference.html | 854 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 697 insertions(+), 157 deletions(-) diff --git a/reference.html b/reference.html index 34ad4bf327b..d2497d7a0a4 100644 --- a/reference.html +++ b/reference.html @@ -147,11 +147,16 @@

      Constructor

      Description - L.Map( <HTMLElement|String> id, <Map options> options? ) + L.Map( + <HTMLElement|String> id, + <Map options> options? ) + + new L.Map()
      L.map() + Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below. @@ -513,12 +518,18 @@

      Methods for Modifying Map State

      Description - setView( <LatLng> center, <Number> zoom, <Boolean> forceReset? ) + setView( + <LatLng> center, + <Number> zoom, + <Boolean> forceReset? ) + this Sets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default). - setZoom( <Number> zoom ) + setZoom( + <Number> zoom ) + this Sets the zoom of the map. @@ -533,7 +544,9 @@

      Methods for Modifying Map State

      Decreases the zoom of the map by 1. - fitBounds( <LatLngBounds> bounds ) + fitBounds( + <LatLngBounds> bounds ) + this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. @@ -543,17 +556,23 @@

      Methods for Modifying Map State

      Sets a map view that mostly contains the whole world with the maximum zoom level possible. - panTo( <LatLng> latlng ) + panTo( + <LatLng> latlng ) + this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. - panInsideBounds( <LatLngBounds> bounds ) + panInsideBounds( + <LatLngBounds> bounds ) + this Pans the map to the closest view that would lie inside the given bounds (if it's not already). - panBy( <Point> point ) + panBy( + <Point> point ) + this Pans the map by a given number of pixels (animated). @@ -563,12 +582,16 @@

      Methods for Modifying Map State

      Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. - setMaxBounds( <LatLngBounds> bounds ) + setMaxBounds( + <LatLngBounds> bounds ) + this Restricts the map view to the given bounds (see map maxBounds option). - locate( <Locate options> options? ) + locate( + <Locate options> options? ) + this Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure, and optionally sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). See Locate options for more details. @@ -613,8 +636,13 @@

      Methods for Getting Map State

      Returns the LatLngBounds of the current map view. - getBoundsZoom( <LatLngBounds> bounds, <Boolean> inside? ) + getBoundsZoom( + <LatLngBounds> bounds, + <Boolean> inside? ) + + Number + Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. @@ -643,23 +671,36 @@

      Methods for Layers and Controls

      Description - addLayer( <ILayer> layer, <Boolean> insertAtTheBottom? ) + addLayer( + <ILayer> layer, + <Boolean> insertAtTheBottom? ) + + this Adds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers). - removeLayer( <ILayer> layer ) + removeLayer( + <ILayer> layer ) + + this Removes the given layer from the map. - hasLayer( <ILayer> layer ) + hasLayer( + <ILayer> layer ) + + Boolean Returns true if the given layer is currently added to the map. - openPopup( <Popup> popup ) + openPopup( + <Popup> popup ) + + this Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability). @@ -669,12 +710,18 @@

      Methods for Layers and Controls

      Closes the popup opened with openPopup. - addControl( <IControl> control ) + addControl( + <IControl> control ) + + this Adds the given control to the map. - removeControl( <IControl> control ) + removeControl( + <IControl> control ) + + this Removes the given control from the map. @@ -690,57 +737,92 @@

      Conversion Methods

      Description - latLngToLayerPoint( <LatLng> latlng ) + latLngToLayerPoint( + <LatLng> latlng ) + + Point Returns the map layer point that corresponds to the given geographical coordinates (useful for placing overlays on the map). - layerPointToLatLng( <Point> point ) + layerPointToLatLng( + <Point> point ) + + LatLng Returns the geographical coordinates of a given map layer point. - containerPointToLayerPoint( <Point> point ) + containerPointToLayerPoint( + <Point> point ) + + Point Converts the point relative to the map container to a point relative to the map layer. - layerPointToContainerPoint( <Point> point ) + layerPointToContainerPoint( + <Point> point ) + + Point Converts the point relative to the map layer to a point relative to the map container. - latLngToContainerPoint( <LatLng> latlng ) + latLngToContainerPoint( + <LatLng> latlng ) + + Point Returns the map container point that corresponds to the given geographical coordinates. - containerPointToLatLng( <Point> point ) + containerPointToLatLng( + <Point> point ) + + LatLng Returns the geographical coordinates of a given map container point. - project( <LatLng> latlng, <Number> zoom? ) + project( + <LatLng> latlng, + <Number> zoom? ) + + Point Projects the given geographical coordinates to absolute pixel coordinates for the given zoom level (current zoom level by default). - unproject( <Point> point, <Number> zoom? ) + unproject( + <Point> point, + <Number> zoom? ) + + LatLng Projects the given absolute pixel coordinates to geographical coordinates for the given zoom level (current zoom level by default). - mouseEventToContainerPoint( <MouseEvent> event ) + mouseEventToContainerPoint( + <MouseEvent> event ) + + Point Returns the pixel coordinates of a mouse click (relative to the top left corner of the map) given its event object. - mouseEventToLayerPoint( <MouseEvent> event ) + mouseEventToLayerPoint( + <MouseEvent> event ) + + Point Returns the pixel coordinates of a mouse click relative to the map layer given its event object. - mouseEventToLatLng( <MouseEvent> event ) + mouseEventToLatLng( + <MouseEvent> event ) + + LatLng Returns the geographical coordinates of the point the mouse clicked on given the click's event object. @@ -954,11 +1036,16 @@

      Constructor

      Description - L.Marker( <LatLng> latlng, <Marker options> options? ) + L.Marker( + <LatLng> latlng, + <Marker options> options? ) + + new L.Marker()
      L.marker() + Instantiates a Marker object given a geographical point and optionally an options object. @@ -1071,7 +1158,10 @@

      Methods

      Description - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the marker to the map. @@ -1081,32 +1171,49 @@

      Methods

      Returns the current geographical position of the marker. - setLatLng( <LatLng> latlng ) + setLatLng( + <LatLng> latlng ) + + this Changes the marker position to the given point. - setIcon( <Icon> icon ) + setIcon( + <Icon> icon ) + + this Changes the marker icon. - setZIndexOffset( <Number> offset ) + setZIndexOffset( + <Number> offset ) + + this Changes the zIndex offset of the marker. - setOpacity( <Number> opacity ) + setOpacity( + <Number> opacity ) + this Changes the opacity of the marker. - update() + update() + + this Updates the marker position, useful if coordinates of its latLng object were changed directly. - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( + <String> htmlContent, + <Popup options> options? ) + + this Binds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method. @@ -1171,11 +1278,16 @@

      Constructor

      Description - L.Popup( <Popup options> options?, <object> source? ) + L.Popup( + <Popup options> options?, + <object> source? ) + + new L.Popup()
      L.popup() + Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers. @@ -1222,13 +1334,15 @@ offset Point - Point(0, 0) + Point(0, 0) + The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays. autoPanPadding Point - Point(5, 5) + Point(5, 5) + The margin between the popup and the edges of the map view after autopanning was performed. @@ -1242,22 +1356,34 @@

      Methods

      Description - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the popup to the map. - openOn( <Map> map ) + openOn( + <Map> map ) + + this Adds the popup to the map and closes the previous one. The same as map.openPopup(popup). - setLatLng( <LatLng> latlng ) + setLatLng( + <LatLng> latlng ) + + this Sets the geographical point where the popup will open. - setContent( <String> htmlContent ) + setContent( + <String> htmlContent ) + + this Sets the HTML content of the popup. @@ -1285,11 +1411,16 @@

      Constructor

      Description - L.TileLayer( <String> urlTemplate, <TileLayer options> options? ) + L.TileLayer( + <String> urlTemplate, + <TileLayer options> options? ) + + new L.TileLayer()
      L.tileLayer() + Instantiates a tile layer object given a URL template and optionally an options object. @@ -1422,7 +1553,10 @@

      Methods

      Description - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the layer to the map. @@ -1437,7 +1571,10 @@

      Methods

      Brings the tile layer to the bottom of all tile layers. - setOpacity( <Number> opacity ) + setOpacity( + <Number> opacity ) + + this Changes the opacity of the tile layer. @@ -1447,7 +1584,9 @@

      Methods

      Causes the layer to clear all the tiles and request them again. - setUrl( <String> urlTemplate ) + setUrl( + <String> urlTemplate ) + this Updates the layer's URL template and redraws it. @@ -1477,11 +1616,16 @@

      Constructor

      Description - L.TileLayer.WMS( <String> baseUrl, <TileLayer.WMS options> options ) + L.TileLayer.WMS( + <String> baseUrl, + <TileLayer.WMS options> options ) + + new L.TileLayer.WMS()
      L.tileLayer.wms() + Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object. @@ -1538,7 +1682,10 @@

      Methods

      Description - setParams( <WMS parameters> params, <Boolean> noRedraw? ) + setParams( + <WMS parameters> params, + <Boolean> noRedraw? ) + this Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true). @@ -1567,7 +1714,9 @@

      Constructor

      Description - L.TileLayer.Canvas( <TileLayer options> options? ) + L.TileLayer.Canvas( + <TileLayer options> options? ) + new L.TileLayer.Canvas()
      L.tileLayer.canvas() @@ -1585,7 +1734,11 @@

      Methods

      Description - drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, <Number> zoom ) + drawTile( + <HTMLCanvasElement> canvas, + <Point> tilePoint, + <Number> zoom ) + this You need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom. @@ -1617,11 +1770,17 @@

      Constructor

      Description - L.ImageOverlay( <String> imageUrl, <LatLngBounds> bounds, <ImageOverlay options> options? ) + L.ImageOverlay( + <String> imageUrl, + <LatLngBounds> bounds, + <ImageOverlay options> options? ) + + new L.ImageOverlay()
      L.imageOverlay() + Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to. @@ -1650,12 +1809,18 @@

      Methods

      Description - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the overlay to the map. - setOpacity( <Number> opacity ) + setOpacity( + <Number> opacity ) + + this Sets the opacity of the overlay. @@ -1773,22 +1938,35 @@

      Methods

      Description - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the layer to the map. - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( + <String> htmlContent, + <Popup options> options? ) + + this Binds a popup with a particular HTML content to a click on this path. - openPopup( <LatLng> latlng? ) + openPopup( + <LatLng> latlng? ) + + this Opens the popup previously bound by the bindPopup method in the given point, or in one of the path's points if not specified. - setStyle( <Path options> object ) + setStyle( + <Path options> object ) + + this Changes the appearance of a Path based on the options in the Path options object. @@ -1869,11 +2047,16 @@

      Constructor

      Description - L.Polyline( <LatLng[]> latlngs, <Polyline options> options? ) + L.Polyline( + <LatLng[]> latlngs, + <Polyline options> options? ) + + new L.Polyline()
      L.polyline() + Instantiates a polyline object given an array of geographical points and optionally an options object. @@ -1914,12 +2097,18 @@

      Methods

      Description - addLatLng( <LatLng> latlng ) + addLatLng( + <LatLng> latlng ) + + this Adds a given point to the polyline. - setLatLngs( <LatLng[]> latlngs ) + setLatLngs( + <LatLng[]> latlngs ) + + this Replaces all the points in the polyline with the given array of geographical points. @@ -1929,7 +2118,12 @@

      Methods

      Returns an array of the points in the path. - spliceLatLngs( <Number> index, <Number> pointsToRemove, <LatLng> latlng?, … ) + spliceLatLngs( + <Number> index, + <Number> pointsToRemove, + <LatLng> latlng?, … ) + + LatLng[] Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). @@ -1955,11 +2149,16 @@

      Constructor

      Description - L.MultiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) + L.MultiPolyline( + <LatLng[][]> latlngs, + <Polyline options> options? ) + + new L.MultiPolyline()
      L.multiPolyline() + Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object. @@ -1981,11 +2180,16 @@

      Constructor

      Description - L.Polygon( <LatLng[]> latlngs, <Polyline options> options? ) + L.Polygon( + <LatLng[]> latlngs, + <Polyline options> options? ) + + new L.Polygon()
      L.polygon() + Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. @@ -2007,11 +2211,16 @@

      Constructor

      Description - L.MultiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) + L.MultiPolygon( + <LatLng[][]> latlngs, + <Polyline options> options? ) + + new L.MultiPolygon()
      L.multiPolygon() + Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline). @@ -2039,11 +2248,16 @@

      Constructor

      Description - L.Rectangle( <LatLngBounds> bounds, <Path options> options? ) + L.Rectangle( + <LatLngBounds> bounds, + <Path options> options? ) + + new L.Rectangle()
      L.rectangle() + Instantiates a rectangle object with the given geographical bounds and optionally an options object. @@ -2059,7 +2273,10 @@

      Methods

      Description - setBounds( <LatLngBounds> bounds ) + setBounds( + <LatLngBounds> bounds ) + + this Redraws the rectangle with the passed bounds. @@ -2081,11 +2298,17 @@

      Constructor

      Description - L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? ) + L.Circle( + <LatLng> latlng, + <Number> radius, + <Path options> options? ) + + new L.Circle()
      L.circle() + Instantiates a circle object given a geographical point, a radius in meters and optionally an options object. @@ -2109,12 +2332,18 @@

      Methods

      Returns the current radius of a circle. Units are in meters. - setLatLng( <LatLng> latlng ) + setLatLng( + <LatLng> latlng ) + + this Sets the position of a circle to a new location. - setRadius( <Number> radius ) + setRadius( + <Number> radius ) + + this Sets the radius of a circle. Units are in meters. @@ -2135,11 +2364,16 @@

      Constructor

      Description - L.CircleMarker( <LatLng> latlng, <Path options> options? ) + L.CircleMarker( + <LatLng> latlng, + <Path options> options? ) + + new L.CircleMarker()
      L.circleMarker() + Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object. @@ -2153,12 +2387,18 @@

      Methods

      Description - setLatLng( <LatLng> latlng ) + setLatLng( + <LatLng> latlng ) + + this Sets the position of a circle marker to a new location. - setRadius( <Number> radius ) + setRadius( + <Number> radius ) + + this Sets the radius of a circle marker. Units are in pixels. @@ -2183,11 +2423,15 @@

      Constructor

      Description - L.LayerGroup( <ILayer[]> layers? ) + L.LayerGroup( + <ILayer[]> layers? ) + + new L.LayerGroup()
      L.layerGroup() + Create a layer group, optionally given an initial set of layers. @@ -2201,17 +2445,26 @@

      Methods

      Description - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the group of layers to the map. - addLayer( <ILayer> layer ) + addLayer( + <ILayer> layer ) + + this Adds a given layer to the group. - removeLayer( <ILayer> layer ) + removeLayer( + <ILayer> layer ) + + this Removes a given layer from the group. @@ -2242,11 +2495,15 @@

      Constructor

      Description - L.FeatureGroup( <IFeature[]> layers? ) + L.FeatureGroup( + <IFeature[]> layers? ) + + new L.FeatureGroup()
      L.featureGroup() + Create a layer group, optionally given an initial set of layers. @@ -2262,7 +2519,11 @@

      Methods

      Description - bindPopup( <String> htmlContent, <Popup options> options? ) + bindPopup( + <String> htmlContent, + <Popup options> options? ) + + this Binds a popup with a particular HTML content to a click on any layer from the group that has a bindPopup method. @@ -2272,7 +2533,9 @@

      Methods

      Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). - setStyle( <Path options> style ) + setStyle( + <Path options> style ) + this Sets the given path options to each layer of the group that has a setStyle method. @@ -2343,11 +2606,16 @@

      Constructor

      Description - L.GeoJSON( <Object> geojson?, <GeoJSON options> options? ) + L.GeoJSON( + <Object> geojson?, + <GeoJSON options> options? ) + + new L.GeoJSON()
      L.geoJson() + Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it later with addData method) and an options object. @@ -2360,19 +2628,34 @@

      Options

      Description - pointToLayer( <GeoJSON> featureData, <LatLng> latlng ) + pointToLayer( + <GeoJSON> featureData, + <LatLng> latlng ) + + Function that will be used for creating layers for GeoJSON points (if not specified, simple markers will be created). - style( <GeoJSON> featureData ) + style( + <GeoJSON> featureData ) + + Function that will be used to get style options for vector layers created for GeoJSON features. - onEachFeature( <GeoJSON> featureData, <ILayer> layer ) + onEachFeature( + <GeoJSON> featureData, + <ILayer> layer ) + + Function that will be called on each created feature layer. Useful for attaching events and popups to features. - filter( <GeoJSON> featureData, <ILayer> layer ) + filter( + <GeoJSON> featureData, + <ILayer> layer ) + + Function that will be used to decide whether to show a feature or not. @@ -2387,7 +2670,10 @@

      Methods

      Description - addData( <GeoJSON> data ) + addData( + <GeoJSON> data ) + + Boolean Adds a GeoJSON object to the layer. @@ -2402,17 +2688,30 @@

      Static methods

      Description - geometryToLayer( <GeoJSON> featureData, <Function> pointToLayer? ) + geometryToLayer( + <GeoJSON> featureData, + <Function> pointToLayer? ) + + ILayer Creates a layer from a given GeoJSON feature. - coordsToLatlng( <Array> coords, <Boolean> reverse? ) + coordsToLatlng( + <Array> coords, + <Boolean> reverse? ) + + LatLng Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). - coordsToLatlngs( <Array> coords, <Number> levelsDeep?, <Boolean> reverse? ) + coordsToLatlngs( + <Array> coords, + <Number> levelsDeep?, + <Boolean> reverse? ) + + Array Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). @@ -2440,12 +2739,18 @@

      Constructor

      Description - L.LatLng( <Number> latitude, <Number> longitude, <Boolean> noWrap? ) + L.LatLng( + <Number> latitude, + <Number> longitude, + <Boolean> noWrap? ) + + new L.LatLng()
      L.latLng()
      L.latLng([]) + Creates an object representing a geographical point with the given latitude and longitude. Wraps longitude to lie between -180 and 180 and clamps longitude between -90 and 90 by default — you can disable this with the noWrap argument. @@ -2479,12 +2784,18 @@

      Methods

      Description - distanceTo( <LatLng> otherLatlng ) + distanceTo( + <LatLng> otherLatlng ) + + Number Returns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia - equals( <LatLng> otherLatlng ) + equals( + <LatLng> otherLatlng ) + + Boolean Returns true if the given LatLng point is at the same position (within a small margin of error). @@ -2550,16 +2861,24 @@

      Constructor

      Description - L.LatLngBounds( <LatLng> southWest, <LatLng> northEast ) + + L.LatLngBounds( + <LatLng> southWest, + <LatLng> northEast ) + + new L.LatLngBounds()
      L.latLngBounds()
      L.latLngBounds([]) + Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle. - L.LatLngBounds( <LatLng[]> latlngs ) + L.LatLngBounds( + <LatLng[]> latlngs ) + new L.LatLngBounds()
      L.latLngBounds() @@ -2577,7 +2896,10 @@

      Methods

      Description - extend( <LatLng|LatLngBounds> latlng ) + extend( + <LatLng|LatLngBounds> latlng ) + + this Extends the bounds to contain the given point or bounds. @@ -2607,22 +2929,34 @@

      Methods

      Returns the center point of the bounds. - contains( <LatLngBounds> otherBounds ) + contains( + <LatLngBounds> otherBounds ) + + Boolean Returns true if the rectangle contains the given one. - contains( <LatLng> latlng ) + contains( + <LatLng> latlng ) + + Boolean Returns true if the rectangle contains the given point. - intersects( <LatLngBounds> otherBounds ) + intersects( + <LatLngBounds> otherBounds ) + + Boolean Returns true if the rectangle intersects the given bounds. - equals( <LatLngBounds> otherBounds ) + equals( + <LatLngBounds> otherBounds ) + + Boolean Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. @@ -2632,7 +2966,10 @@

      Methods

      Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. - pad( <Number> bufferRatio ) + pad( + <Number> bufferRatio ) + + LatLngBounds Returns bigger bounds created by extending the current bounds by a given percentage in each direction. @@ -2661,12 +2998,17 @@

      Constructor

      Description - L.Point( <Number> x, <Number> y, <Boolean> round? ) + L.Point( + <Number> x, <Number> y, + <Boolean> round? ) + + new L.Point()
      L.point()
      L.point([]) + Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. @@ -2700,27 +3042,43 @@

      Methods

      Description - add( <Point> otherPoint ) + add( + <Point> otherPoint ) + + Point Returns the result of addition of the current and the given points. - subtract( <Point> otherPoint ) + subtract( + <Point> otherPoint ) + + Point Returns the result of subtraction of the given point from the current. - multiplyBy( <Number> number ) + multiplyBy( + <Number> number ) + + Point Returns the result of multiplication of the current point by the given number. - divideBy( <Number> number, <Boolean> round? ) + divideBy( + <Number> number, + <Boolean> round? ) + + Point Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. - distanceTo( <Point> otherPoint ) + distanceTo( + <Point> otherPoint ) + + Number Returns the distance between the current and the given points. @@ -2763,20 +3121,29 @@

      Constructor

      Description - L.Bounds( <Point> topLeft, <Point> bottomRight ) + L.Bounds( + <Point> topLeft, + <Point> bottomRight ) + + new L.Bounds()
      L.bounds()
      L.bounds([]) + Creates a Bounds object from two coordinates (usually top-left and bottom-right corners). - L.LatLngBounds( <Point[]> points ) + L.LatLngBounds( + <Point[]> points ) + + new L.Bounds()
      L.bounds() + Creates a Bounds object defined by the points it contains. @@ -2810,7 +3177,10 @@

      Methods

      Description - extend( <Point> point ) + extend( + <Point> point ) + + - Extends the bounds to contain the given point. @@ -2820,17 +3190,26 @@

      Methods

      Returns the center point of the bounds. - contains( <Bounds> otherBounds ) + contains( + <Bounds> otherBounds ) + + Boolean Returns true if the rectangle contains the given one. - contains( <Point> point ) + contains( + <Point> point ) + + Boolean Returns true if the rectangle contains the given point. - intersects( <Bounds> otherBounds ) + intersects( + <Bounds> otherBounds ) + + Boolean Returns true if the rectangle intersects the given bounds. @@ -2864,11 +3243,15 @@

      Constructor

      Description - L.Icon( <Icon options> options ) + L.Icon( + <Icon options> options ) + + new L.Icon()
      L.icon() + Creates an icon instance with the given options. @@ -2939,11 +3322,15 @@

      Constructor

      Description - L.DivIcon( <DivIcon options> options ) + L.DivIcon( + <DivIcon options> options ) + + new L.DivIcon()
      L.divIcon() + Creates a div icon instance with the given options. @@ -2992,11 +3379,15 @@

      Constructor

      Description - L.Control( <Control options> options? ) + L.Control( + <Control options> options? ) + + new L.Control()
      L.control() + Creates a control with the given options. @@ -3025,7 +3416,10 @@

      Methods

      Description - setPosition( <String> position ) + setPosition( + <String> position ) + + this Sets the position of the control. See control positions. @@ -3035,12 +3429,18 @@

      Methods

      Returns the current position of the control. - addTo( <Map> map ) + addTo( + <Map> map ) + + this Adds the control to the map. - removeFrom( <Map> map ) + removeFrom( + <Map> map ) + + this Removes the control from the map. @@ -3086,11 +3486,15 @@

      Constructor

      Description - L.Control.Zoom( <Control.Zoom options> options? ) + L.Control.Zoom( + <Control.Zoom options> options? ) + + new L.Control.Zoom()
      L.control.zoom() + Creates a zoom control. @@ -3125,11 +3529,15 @@

      Constructor

      Description - L.Control.Attribution( <Control.Attribution options> options? ) + L.Control.Attribution( + <Control.Attribution options> options? ) + + new L.Control.Attribution()
      L.control.attribution() + Creates an attribution control. @@ -3164,17 +3572,23 @@

      Methods

      Description - setPrefix( <String> prefix ) + setPrefix( + <String> prefix ) + this Sets the text before the attributions. - addAttribution( <String> text ) + addAttribution( + <String> text ) + this Adds an attribution text (e.g. 'Vector data &copy; CloudMade'). - removeAttribution( <String> text ) + removeAttribution( + <String> text ) + this Removes an attribution text. @@ -3205,7 +3619,11 @@

      Constructor

      Description - L.Control.Layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? ) + L.Control.Layers( + <Layer Config> baseLayers?, + <Layer Config> overlays?, + <Control.Layers options> options? ) + new L.Control.Layers()
      L.control.layers() @@ -3222,17 +3640,25 @@

      Methods

      Description - addBaseLayer( <ILayer> layer, <String> name ) + addBaseLayer( + <ILayer> layer, + <String> name ) + this Adds a base layer (radio button entry) with the given name to the control. - addOverlay( <ILayer> layer, <String> name ) + addOverlay( + <ILayer> layer, + <String> name ) + this Adds an overlay (checkbox entry) with the given name to the control. - removeLayer( <ILayer> layer ) + removeLayer( + <ILayer> layer ) + this Remove the given layer from the control. @@ -3287,11 +3713,15 @@

      Constructor

      Description - L.Control.Scale( <Control.Scale options> options? ) + L.Control.Scale( + <Control.Scale options> options? ) + + new L.Control.Attribution()
      L.control.attribution() + Creates an scale control with the given options. @@ -3364,32 +3794,57 @@

      Methods

      Description - addEventListener( <String> type, <Function> fn, <Object> context? ) + addEventListener( + <String> type, + <Function> fn, + <Object> context? ) + + this Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). - addEventListener( <Object> eventMap, <Object> context? ) + addEventListener( + <Object> eventMap, + <Object> context? ) + + this Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} - removeEventListener( <String> type, <Function> fn?, <Object> context? ) + removeEventListener( + <String> type, + <Function> fn?, + <Object> context? ) + + this Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. - removeEventListener( <Object> eventMap, <Object> context? ) + removeEventListener( + <Object> eventMap, + <Object> context? ) + + this Removes a set of type/listener pairs.
      - hasEventListeners( <String> type ) + hasEventListeners( + <String> type ) + + Boolean Returns true if a particular event type has some listeners attached to it. - fireEvent( <String> type, <Object> data? ) + fireEvent( + <String> type, + <Object> data? ) + + this Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. @@ -3793,17 +4248,25 @@

      Methods

      Description - extend( <Object> dest, <Object> src?.. ) + extend( + <Object> dest, + <Object> src?.. ) + + Object Merges the properties of the src object (or multiple objects) into dest object and returns the latter. - bind( <Function> fn, <Object> obj ) + bind( + <Function> fn, + <Object> obj ) + + Function Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). - stamp( <Object> obj ) + stamp( <Object> obj ) String Applies a unique key to the object and returns that key. @@ -3821,7 +4284,12 @@

      Methods

      --> - limitExecByInterval(
      <Function> fn, <Number> time, <Object> context? ) + limitExecByInterval( + <Function> fn, + <Number> time, + <Object> context? ) + + Function Returns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called. @@ -3832,27 +4300,44 @@

      Methods

      Returns a function which always returns false. - formatNum( <Number> num, <Number> digits ) + formatNum( + <Number> num, + <Number> digits ) + + Number Returns the number num rounded to digits decimals. - splitWords( <String> str ) + splitWords( + <String> str ) + + String[] Trims and splits the string on whitespace and returns the array of parts.
      - setOptions( <Object> obj, <Object> options ) + setOptions( + <Object> obj, + <Object> options ) + + Object Merges the given properties to the options of the obj object, returning the resulting options. See Class options. - getParamString( <Object> obj ) + getParamString( + <Object> obj ) + + String Converts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'. - template( <String> str, <Object> data ) + template( + <String> str, <Object> data ) + + String Simple templating facility, creates a string by applying the values of the data object of a form {a: 'foo', b: 'bar', …} to a template string of the form 'Hello {a}, {b}' — in this example you will get 'Hello foo, bar'. @@ -3972,23 +4457,39 @@

      Methods

      Description - get( <String or HTMLElement> id ) + get( + <String or HTMLElement> id ) + + HTMLElement Returns an element with the given id if a string was passed, or just returns the element if it was passed directly. - getStyle( <HTMLElement> el, <String> style ) + getStyle( + <HTMLElement> el, + <String> style ) + + String Returns the value for a certain style attribute on an element, including computed values or values set through CSS. - getViewportOffset( <HTMLElement> el ) + getViewportOffset( + <HTMLElement> el ) + + Point Returns the offset to the viewport for the requested element. - create( <String> tagName, <String> className, <HTMLElement> container? ) + create( + <String> tagName, + <String> className, + <HTMLElement> container? ) + + HTMLElement + Creates an element with tagName, sets the className, and optionally appends it to container element. @@ -4002,47 +4503,84 @@

      Methods

      Makes text selection possible again. - hasClass( <HTMLElement> el, <String> name ) + hasClass( + <HTMLElement> el, + <String> name ) + + Boolean + Returns true if the element class attribute contains name. - addClass( <HTMLElement> el, <String> name ) + addClass( + <HTMLElement> el, + <String> name ) + + - + Adds name to the element's class attribute. - removeClass( <HTMLElement> el, <String> name ) + removeClass( + <HTMLElement> el, + <String> name ) + + - + Removes name from the element's class attribute. - setOpacity( <HTMLElement> el, <Number> value ) + setOpacity( + <HTMLElement> el, + <Number> value ) + + - Set the opacity of an element (including old IE support). Value must be from 0 to 1. - testProp( <String[]> props ) + testProp( + <String[]> props ) + + String or false Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. - getTranslateString( <Point> point ) + getTranslateString( + <Point> point ) + + String Returns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers. - getScaleString( <Number> scale, <Point> origin ) + getScaleString( + <Number> scale, + <Point> origin ) + + String Returns a CSS transform string to scale an element (with the given scale origin). - setPosition( <HTMLElement> el, <Point> point, <Boolean> disable3D? ) + setPosition( + <HTMLElement> el, + <Point> point, + <Boolean> disable3D? ) + + - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. - getPosition( <HTMLElement> el ) + getPosition( + <HTMLElement> el ) + + Point Returns the coordinates of an element previously positioned with setPosition. @@ -4057,12 +4595,14 @@

      Properties

      Description - TRANSITION + TRANSITION + String Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). - TRANSFORM + TRANSFORM + String Vendor-prefixed transform style name. From b8b161d7a25930605d16b3c1dc5078e79131351d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2012 17:22:08 +0300 Subject: [PATCH 0188/2207] more docs updates, ilayer and icontrol docs at last! --- DOCS-TODO | 25 ++----- docs/css/screen.css | 4 +- examples.md | 5 +- reference.html | 169 +++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 167 insertions(+), 36 deletions(-) diff --git a/DOCS-TODO b/DOCS-TODO index b2d65e29090..6b4beebd87e 100644 --- a/DOCS-TODO +++ b/DOCS-TODO @@ -5,15 +5,6 @@ NEW Transformation transform(point, scale) untransform(point, scale) -NEW LineUtil - simplify(points, tolerance) - pointToSegmentDistance(p, p1, p2) - closestPointOnSegment(p, p1, p2) - clipSegment(a, b, bounds) - -NEW PolyUtil - clipPolygon(points, bounds) - NEW DomEvent addListener(obj, type, fn, context) on @@ -54,18 +45,6 @@ NEW Draggable drag dragend -NEW ILayer - onAdd(map) - onRemove(map) - - important events: viewreset, moveend - - options.minZoom and options.maxZoom - -NEW IControl - onAdd(map) - onRemove(map) - NEW IProjection project(latlng) unproject(point) @@ -75,3 +54,7 @@ NEW ICRS pointToLatLng(point, zoom) project(latlng) scale(zoom) + +ILayer options.minZoom and options.maxZoom? +Map.addHandler? + diff --git a/docs/css/screen.css b/docs/css/screen.css index fae3f9fb537..92bcf902069 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -102,8 +102,8 @@ h3.alt { font-weight: normal; } -code { - font-family: "Courier New", monospace; +.container code, .container pre code { + font-family: "Consolas", "Lucida Console", "Courier New", monospace; } .container pre code { padding: 10px 15px; diff --git a/examples.md b/examples.md index 7cf74780223..f273915c517 100644 --- a/examples.md +++ b/examples.md @@ -42,7 +42,7 @@ In this example, you'll learn how to create and interact with map vectors create A tutorial on how to manage groups of layers and use the layer switching control. -*** + *** -More examples coming soon! +If you find that an important tutorial is missing here, let us know! [1]: examples/quick-start.html [2]: examples/mobile.html diff --git a/reference.html b/reference.html index d2497d7a0a4..75df9668267 100644 --- a/reference.html +++ b/reference.html @@ -105,9 +105,9 @@

      DOM Utility

      Interfaces

      @@ -189,7 +189,7 @@

      Map State Options

      layers - ILayer[] + ILayer[] null Layers that will be added to the map initially. @@ -426,7 +426,7 @@

      Events

      Event Fired when the map is initialized (when its center and zoom are set for the first time). - + viewreset Event Fired when the map needs to redraw its content (this usually happens on map zoom or load). Very useful for creating custom overlays. @@ -441,7 +441,7 @@

      Events

      Event Fired on any movement of the map view. - + moveend Event Fired when the view of the map ends changed (e.g. user stopped dragging the map). @@ -672,7 +672,7 @@

      Methods for Layers and Controls

      addLayer( - <ILayer> layer, + <ILayer> layer, <Boolean> insertAtTheBottom? ) @@ -681,7 +681,7 @@

      Methods for Layers and Controls

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -689,7 +689,7 @@

      Methods for Layers and Controls

      hasLayer( - <ILayer> layer ) + <ILayer> layer ) Boolean @@ -2479,7 +2479,7 @@

      Methods

      L.FeatureGroup

      -

      Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements IFeature interface.

      +

      Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
      @@ -2496,7 +2496,7 @@ 

      Constructor

      L.FeatureGroup( - <IFeature[]> layers? ) + <ILayer[]> layers? ) @@ -2693,7 +2693,7 @@

      Static methods

      <Function> pointToLayer? )
      - ILayer + ILayer Creates a layer from a given GeoJSON feature. @@ -4635,6 +4635,153 @@

      IHandler

      + +

      ILayer

      + +

      Represents an object attached to a particular location (or a set of locations) on a map. Implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      onAdd( + <Map> map ) + -Should contain code that creates DOM elements for the overlay, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).
      onRemove( + <Map> map ) + -Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners preciously added in onAdd. Called on map.removeLayer(layer).
      + +

      Implementing Custom Layers

      + +

      The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

      + +

      Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

      + +

      Another thing to note is that you'll usually need to add leaflet-zoom-hide class to the DOM elements you create for the layer so that it hides during zoom animation. Implementing zoom animation for custom layers is a complex topic and will be documented separately in future, but meanwhile you can take a look at how it's done for Leaflet layers (e.g. ImageOverlay) in the source.

      + +

      Custom Layer Example

      + +

      Here's how a custom layer implementation usually looks:

      + +
      var MyCustomLayer = L.Class.extend({
      +
      +	initialize: function (latlng) {
      +		// save position of the layer or any options from the constructor
      +		this._latlng = latlng;
      +	},
      +
      +	onAdd: function (map) {
      +		this._map = map;
      +
      +		// create a DOM element and put it into one of the map panes
      +		this._el = L.DomUtil.create('div', 'my-custom-layer leaflet-zoom-hide');
      +		map.getPanes().overlayPane.appendChild(this._el);
      +
      +		// add a viewreset event listener for updating layer's position, do the latter
      +		map.on('viewreset', this._reset, this);
      +		this._reset();
      +	},
      +
      +	onRemove: function (map) {
      +		// remove layer's DOM elements and listeners
      +		map.getPanes().overlayPane.removeChild(this._el);
      +		map.off('viewreset', this._reset, this);
      +	},
      +
      +	_reset: function () {
      +		// update layer's position
      +		var pos = this._map.latLngToLayerPoint(this._latlng);
      +		L.DomUtil.setPosition(this._el, pos);
      +	}
      +});
      +
      +map.addLayer(new MyCustomLayer(latlng));
      +
      + + + +

      IControl

      + +

      Represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls.

      + +

      Methods

      + +

      Every control in Leaflet should extend from Control class and additionally have the following methods:

      + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      onAdd( + <Map> map ) + HTMLElementShould contain code that creates all the neccessary DOM elements for the control, adds listeners on relevant map events, and returns the element containing the control. Called on map.addControl(control) or control.addTo(map).
      onRemove( + <Map> map ) + -Optional, should contain all clean up code (e.g. removes control's event listeners). Called on map.removeControl(control) or control.removeFrom(map). The control's DOM container is removed automatically.
      + +

      Custom Control Example

      + +
      var MyControl = L.Control.extend({
      +	options: {
      +		position: 'topright'
      +	},
      +
      +	onAdd: function (map) {
      +		// create the control container with a particular class name
      +		var container = L.DomUtil.create('div', 'my-custom-control');
      +
      +		// ... initialize other DOM elements, add listeners, etc.
      +
      +		return container;
      +	}
      +});
      +
      +map.addControl(new MyControl());
      +
      + +

      If specify your own contructor for the control, you'll also probably want to process options properly:

      + +
      var MyControl = L.Control.extend({
      +	initialize: function (foo, options) {
      +		// ...
      +		L.Util.setOptions(this, options);
      +	},
      +	// ...
      +});
      + +

      This will allow you to pass options like position when creating the control instances:

      + +
      map.addControl(new MyControl('bar', {position: 'bottomleft'}));
      + +

      Global Switches

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      From b2ec1e086f957890664e7041a231f95cb43cff5b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2012 19:20:29 +0300 Subject: [PATCH 0189/2207] add transformation and domevent docs, improve styles --- DOCS-TODO | 22 ------ docs/css/screen.css | 13 ++++ reference.html | 165 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 176 insertions(+), 24 deletions(-) diff --git a/DOCS-TODO b/DOCS-TODO index 6b4beebd87e..59d9e754989 100644 --- a/DOCS-TODO +++ b/DOCS-TODO @@ -1,22 +1,4 @@ -NEW Transformation - Transformation(a, b, c, d) - - transform(point, scale) - untransform(point, scale) - -NEW DomEvent - addListener(obj, type, fn, context) - on - removeListener(obj, type, fn) - off - stopPropagation(e) - disableClickPropagation(el) - preventDefault(e) - stop(e) - getMousePosition(e, container) - getWheelDelta(e) - NEW Transition Transition(el, options) @@ -54,7 +36,3 @@ NEW ICRS pointToLatLng(point, zoom) project(latlng) scale(zoom) - -ILayer options.minZoom and options.maxZoom? -Map.addHandler? - diff --git a/docs/css/screen.css b/docs/css/screen.css index 92bcf902069..e3100706af8 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -114,6 +114,8 @@ h3.alt { box-shadow: 0 0 15px #ddd; -moz-box-shadow: 0 0 15px #ddd; -webkit-box-shadow: 0 0 15px #ddd; + + border-radius: 5px; } pre code a { text-decoration: none; @@ -455,3 +457,14 @@ dl dd { left: 0; box-shadow: 0 3px 20px rgba(0, 0, 0, 0.1); } + +.api-page td pre { + margin: 1em 0 0; + +} + +.api-page td pre code { + padding: 0 10px; + border: 0; + box-shadow: none; +} diff --git a/reference.html b/reference.html index 75df9668267..33a4f70e6e9 100644 --- a/reference.html +++ b/reference.html @@ -89,13 +89,13 @@

      Utility

    39. Class
    40. Browser
    41. Util
    42. -
    43. Transformation
    44. +
    45. Transformation
    46. LineUtil
    47. PolyUtil
    48. DOM Utility

        -
      • DomEvent
      • +
      • DomEvent
      • DomUtil
      • Transition
      • Draggable
      • @@ -4359,6 +4359,74 @@

        Properties

        + +

        L.Transformation

        + +

        Represents an affine transformation: a set of coefficients a, b, c, d for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing the reverse. Used by Leaflet in its projections code.

        + +
        var transformation = new L.Transformation(2, 5, -1, 10),
        +	p = new L.Point(1, 2),
        +	p2 = transformation.transform(p), // new L.Point(7, 8)
        +	p3 = transformation.untransform(p2); // new L.Point(1, 2)
        +
        + +

        Constructor

        + + + + + + + + + + + + + + +
        ConstructorUsageDescription
        L.Transformation( + <Number> a, + <Number> b, + <Number> c, + <Number> d ) + + new L.Transformation()
        + +
        Creates a transformation object with the given coefficients.
        + +

        Methods

        + + + + + + + + + + + + + + + + + + + +
        MethodReturnsDescription
        transform( + <Point> point, + <Number> scale? ) + PointReturns a transformed point, optionally multiplied by the given scale. Only accepts real L.Point instances, not arrays.
        untransform( + <Point> point, + <Number> scale? ) + PointReturns the reverse transformation of the given point, optionally divided by the given scale. Only accepts real L.Point instances, not arrays.
        + + + +

        L.LineUtil

        Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

        @@ -4444,6 +4512,99 @@

        Methods

        + +

        L.DomEvent

        + +

        Utility functions to work with the DOM events, used by Leaflet internally.

        + +

        Methods

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        MethodReturnsDescription
        addListener( + <HTMLElement> el, + <String> type, + <Function> fn, + <Object> context? ) + thisAdds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified.
        removeListener( + <HTMLElement> el, + <String> type, + <Function> fn ) + thisRemoves an event listener from the element.
        stopPropagation( + <DOMEvent> e ) + thisStop the given event from propagation to parent elements. Used inside the listener functions: +
        L.DomEvent.addListener(div, 'click', function (e) {
        +	L.DomEvent.stopPropagation(e);
        +});
        +
        preventDefault( + <DOMEvent> e ) + thisPrevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions. +
        stop( + <DOMEvent> e ) + thisDoes stopPropagation and preventDefault at the same time.
        disableClickPropagation( + <HTMLElement> el ) + thisAdds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events.
        getMousePosition( + <DOMEvent> e, + <HTMLElement> container? ) + PointGets normalized mouse position from a DOM event relative to the container or to the whole page if not specified.
        getWheelDelta( + <DOMEvent> e ) + NumberGets normalized wheel delta from a mousewheel DOM event.
        + + + +

        L.DomUtil

        Utility functions to work with the DOM tree, used by Leaflet internally.

        From 7f812ad9ece3b8b5ca3013238942b1c071f72544 Mon Sep 17 00:00:00 2001 From: mourner Date: Tue, 24 Jul 2012 01:41:55 +0300 Subject: [PATCH 0190/2207] improve features page, more styling --- docs/css/screen.css | 6 +++--- download.md | 2 +- examples.md | 2 +- features.html | 48 +++++++++++++++++++++++++++++++-------------- index.md | 2 +- plugins.md | 43 ++++++++++++++++++++-------------------- reference.html | 16 ++++++++++++++- 7 files changed, 76 insertions(+), 43 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index e3100706af8..54506f25286 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -53,9 +53,9 @@ h1 a:hover, h1 a:focus { h2 { font-size: 1.8em; - margin-top: 1em; + margin-top: 1.3em; font-weight: bold; - padding: 4px 12px 3px; + padding: 3px 12px 2px; margin-left: 0; margin-right: 0; background: #edeeef; @@ -76,7 +76,7 @@ h2 { -moz-border-radius: 5px; -webkit-border-radius: 5px; - text-shadow: -1px -1px 0 #999; + text-shadow: -1px -1px 1px rgba(0,0,0,0.3); } .api-page h2 { margin-top: 2.5em; diff --git a/download.md b/download.md index 6d41be21ca2..7712f97a007 100644 --- a/download.md +++ b/download.md @@ -3,7 +3,7 @@ layout: default title: Download --- -### Download Leaflet +## Download Leaflet Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system. The production diff --git a/examples.md b/examples.md index f273915c517..7a80c3585b5 100644 --- a/examples.md +++ b/examples.md @@ -3,7 +3,7 @@ layout: default title: Tutorials --- -### Leaflet Tutorials +## Leaflet Tutorials Every example here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers. diff --git a/features.html b/features.html index a8297e593b4..9f7a86ffafa 100644 --- a/features.html +++ b/features.html @@ -3,7 +3,7 @@ title: Features --- -

        Leaflet Features

        +

        Leaflet Features

        Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being easily extended by third-party plugins.

        @@ -16,21 +16,27 @@

        Available Map Layers

        • Tile layers
        • -
        • Vector layers: polylines, polygons, circles, rectangles, circle markers
        • Markers
        • Popups
        • +
        • Vector layers: polylines, polygons, circles, rectangles, circle markers
        • Image overlays
        • WMS layers
        • -
        • GeoJSON
        • +
        • Layer groups
        • +
        • GeoJSON layers

        Interaction Features

        +

        General

        + +
          +
        • Drag panning with inertia
        • +
        +

        On Desktop Browsers

          -
        • Drag panning
        • Scroll wheel zoom
        • Double click zoom
        • Shift-drag zoom to bounding box
        • @@ -40,18 +46,18 @@

          On Desktop Browsers

          On Mobile Browsers (iOS, Android)

            -
          • Touch-drag panning
          • -
          • Multi-touch zoom (iOS and Android 4+)
          • +
          • Multi-touch zoom (iOS and Android 4+)
          • Double tap zoom
          - -

          Other Features

          +

          For Layers

            -
          • Panning inertia
          • - +
          • Various events: click (tap), mouseover, contextmenu, etc.
          • +
          • Marker dragging
          + +
          @@ -59,8 +65,8 @@

          Other Features

          Visual Features

            +
          • Zoom animation on modern browsers (except IE) (for all layers, including markers and vector layers)
          • Panning animation
          • -
          • Zooming animation on modern browsers (except IE)
          • Smooth continuous zoom on iOS
          • Tile and popup fade animation
          • Very nice default design for markers, popups and other map controls
          • @@ -71,19 +77,22 @@

            Customization Features

            • Pure CSS3 popups and controls for easy restyling
            • +
            • Image- and HTML-based markers
            • A simple interface for implementing custom map layers
            • The same for custom map controls
            • Custom map projections (with EPSG:4326, EPSG:3857 and EPSG:3395 out of the box)
            • +
            • Powerful OOP facilities for extending existing classes

            Performance Features

            • Hardware acceleration on iOS (and other modern browsers) makes it feel as smooth as native apps
            • -
            • Clever tricks to make panning and zooming really smooth
            • -
            • Smart polyline/polygon rendering makes it responsive even when displaying objects with thousands of points
            • -
            • Modular design and a build system allow you to reduce the size of the library by leaving out the code you don't need
            • +
            • Utilizing CSS3 features like Transitions, Transforms, requestAnimationFrame where possible to make panning and zooming really smooth
            • +
            • Smart polyline/polygon rendering with dynamic clipping and simplification makes it responsive even when displaying objects with thousands of points
            • +
            • Modular design and a build system allow you to reduce the library size by leaving out features you don't need
            • +
            • Tap delay elimination on mobile devices makes controls and layers respond to taps immediately
          @@ -120,9 +129,18 @@

          On Mobile

        • Android browser 2.2+, 3.1+, 4+
        • Chrome for Android 4+ and iOS
        • Firefox for Android
        • -
        • Other webkit-based browsers (webOS, Blackberry 6+, etc.)
        • +
        • Other webkit-based browsers (webOS, Blackberry 7+, etc.)
        • IE for Windows Phone 7
        + + +

        Misc

        + +
          +
        • Extremely lightweight — around 26 KB of gzipped JS code
        • +
        • No external dependencies
        • +
        • Keeps your JS environment clean — no global or native prototypes pollution
        • +
        diff --git a/index.md b/index.md index 90644c04a69..2e91f927bd6 100644 --- a/index.md +++ b/index.md @@ -31,7 +31,7 @@ L.marker([51.5, -0.09]). Learn more with the [quick start guide](examples/quick-start.html), check out [other tutorials](examples.html), or head straight to the [API documentation](reference.html). -### Contributing to Leaflet +## Contributing to Leaflet The project is [hosted on GitHub][], waiting for your contributions --- just send your pull requests to [@mourner][] (Vladimir Agafonkin, Leaflet author and maintainer). Let’s make the best library for maps that can possibly exist! diff --git a/plugins.md b/plugins.md index c0a92100eb2..459f516fd09 100644 --- a/plugins.md +++ b/plugins.md @@ -3,12 +3,13 @@ layout: default title: Plugins --- -### Notable Leaflet Plugins +## Notable Leaflet Plugins While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. +--- -## Layers and Overlays +### Layers and Overlays @@ -25,15 +26,6 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Dave Leaver - - -
        - RaphaelLayer - - Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. - - Dynamic Methods -
        Leaflet.iconlabel @@ -45,26 +37,26 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
        - Overlapping Marker Spiderfier + RaphaelLayer - Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. + Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. - George MacKerron + Dynamic Methods
        - arc.js + Overlapping Marker Spiderfier - Allows you to draw great circle routes between two points. + Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. - Dane Springmeyer + George MacKerron
        -## Services, Providers and Formats +### Services, Providers and Formats @@ -147,7 +139,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
        -## Controls +### Controls and Interaction @@ -212,7 +204,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
        -## Other Plugins +### Other Plugins and Libraries @@ -224,7 +216,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s @@ -238,6 +230,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Michael Lawrence Evans + + +
        OSM Buildings - Amazing plugin for visualizing 3D OSM building data on top of Leaflet. + Amazing JS library for visualizing 3D OSM building data on top of Leaflet. Jan Marsch
        + arc.js + + A JS library for drawing great circle routes that can be used with Leaflet. + + Dane Springmeyer +
        From d95761cb42af0f3ec4340d5ddb0868c7150581ec Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 24 Jul 2012 10:49:22 +0300 Subject: [PATCH 0192/2207] make the frontpage map a little bigger --- docs/css/screen.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 13511e13b5b..8620d750272 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -301,7 +301,7 @@ a.nodocs { } #map { - height: 280px; + height: 320px; border: 1px solid #ccc; margin-bottom: 20px; margin-top: 30px; From 3bf097ff0ab4837d56db1d015a8726142fff1988 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 24 Jul 2012 11:34:54 +0300 Subject: [PATCH 0193/2207] officially recommend great plugins :) --- plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 459f516fd09..e2adba61c70 100644 --- a/plugins.md +++ b/plugins.md @@ -21,7 +21,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.markercluster - Sophisticated marker clustering solution with smooth animations. + Beautiful, sophisticated, high performance marker clustering solution with smooth animations and lots of great features. Recommended! Dave Leaver @@ -151,7 +151,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.draw - Enables drawing features like polylines, polygons, rectangles, circles and markers with a nice user-friendly interface. + Enables drawing features like polylines, polygons, rectangles, circles and markers through a very nice user-friendly interface with icons and hints. Recommended! Jacob Toye From 31633ffcee57f6a64860785c9a3477e081b04d2f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 24 Jul 2012 13:57:31 +0300 Subject: [PATCH 0194/2207] update quick start guide --- examples/quick-start.md | 98 ++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 54 deletions(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 3a773e8cc86..b742503f7d8 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -3,7 +3,7 @@ layout: tutorial title: Quick Start Guide --- -### Leaflet Quick Start Guide +## Leaflet Quick Start Guide This step-by-step guide will quickly get you started on Leaflet basics, including setting up a Leaflet map, working with markers, polylines and popups, and dealing with events. @@ -19,18 +19,22 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS files in the head section of your document: - + - * Include Leaflet JavaScript file somewhere on the page (preferably before body close tag): + * Include Leaflet JavaScript file: - + - * Put a div element with a certain id where you want your map to be (making sure it has defined height): + * Put a `div` element with a certain `id` where you want your map to be: -
        +
        + + * Make sure the map container has a defined height, for example by setting it in CSS: + +
        #map { height: 180px; }
        Now you're ready to initialize the map and do some stuff with it. @@ -40,27 +44,24 @@ Now you're ready to initialize the map and do some stuff with it.
        -Let's create a map instance, set its view to the center of London and add a pretty CloudMade tile layer to it. First we'll initialize the map: +Let's create a map of the center of London with pretty CloudMade tiles. First we'll initialize the map and set its view to our chosen geographical coordinates and a zoom level: - var map = new L.Map('map'); + var map = L.map('map').setView([51.505, -0.09], 13); By default (as we didn't pass any options when creating the map instance), all mouse and touch interactions on the map are enabled, and it has zoom and attribution controls. -Next we'll create a tile layer to add to our map, in this case it's a CloudMade tile layer with Fresh style. Creating a tile layer usually involves setting the URL template for the tile images (get yours at [CloudMade](http://cloudmade.com/register)), the attribution text and the maximum zoom level of the layer: +Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. + +Next we'll add a tile layer to add to our map, in this case it's a CloudMade tile layer with Fresh style. Creating a tile layer usually involves setting the URL template for the tile images (get yours at [CloudMade](http://cloudmade.com/register)), the attribution text and the maximum zoom level of the layer: -
        var cloudmade = new L.TileLayer('http://{s}.tile.cloudmade.com/API-KEY/997/256/{z}/{x}/{y}.png', {
        +
        L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
         	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
         	maxZoom: 18
        -});
        +}).addTo(map);
        -It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles, and it doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd recommend CloudMade though, it looks beautiful). - -Finally we'll set the map view to the center of London at 13th zoom level and add our tile layer (see the resulting map above): +Make sure all the code is called after the `div` and `leaflet.js` inclusion. That's it! You have a working Leaflet map now. - var london = new L.LatLng(51.505, -0.09); // geographical point (longitude and latitude) - map.setView(london, 13).addLayer(cloudmade); - -Make sure this code is below both the map div and leaflet.js inclusion, or in a window.load or document.ready event handler. +It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enforce a particular choice of providers for tiles, and it doesn't even contain a single provider-specific line of code, so you're free to use other providers if you need to (we'd recommend CloudMade though, it looks beautiful). ### Markers, circles and polygons @@ -69,24 +70,17 @@ Make sure this code is below both the map div and leaflet.js< Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker: - var markerLocation = new L.LatLng(51.5, -0.09); + var marker = L.marker([51.5, -0.09]).addTo(map); - var marker = new L.Marker(markerLocation); - map.addLayer(marker); - -Adding a circle is the same (except for specifying the radius in meters), but lets configure it by passing options as a third argument when creating the object (the second argument is the radius in pixels): +Adding a circle is the same (except for specifying the radius in meters as a second argument), but lets you control how it looks by passing options as the last argument when creating the object: - var circleLocation = new L.LatLng(51.508, -0.11), - circleOptions = { - color: 'red', - fillColor: '#f03', - fillOpacity: 0.5 - }; + var circle = L.circle([51.508, -0.11], 500, { + color: 'red', + fillColor: '#f03', + fillOpacity: 0.5 + }).addTo(map); - var circle = new L.Circle(circleLocation, 500, circleOptions); - map.addLayer(circle); - -Add a polygon is easy too: +Adding a polygon is as easy: L.polygon([[51.509, -0.08], [51.503, -0.06], [51.51, -0.047]]).addTo(map); @@ -101,47 +95,43 @@ Popups are usually used when you want to attach some information to a particular circle.bindPopup("I am a circle."); polygon.bindPopup("I am a polygon."); -Try clicking on our objects. The bindPopup method attaches a popup with the specified HTML content to your marker so the popup appears when you click on the object, and the openPopup method (for markers only) immediately opens the attached popup. +Try clicking on our objects. The `bindPopup` method attaches a popup with the specified HTML content to your marker so the popup appears when you click on the object, and the `openPopup` method (for markers only) immediately opens the attached popup. You can also use popups as layers (when you need something more than attching a popup to an object): - var popup = new L.Popup(); - - popup.setLatLng(new L.LatLng(51.5, -0.09)); - popup.setContent("I am a standalone popup."); + var popup = L.popup() + .setLatLng([51.5, -0.09]) + .setContent("I am a standalone popup.") + .openOn(map); - map.openPopup(popup); - -Here we use openPopup instead of addLayer because it handles automatic closing of a previously opened popup when opening a new one which is good for usability. +Here we use `openOn` instead of `addTo` because it handles automatic closing of a previously opened popup when opening a new one which is good for usability. ### Dealing with events Every time something happens in Leaflet, e.g. user clicks on a marker or map zoom changes, the corresponding object sends an event which you can subscribe to with a function. It allows you to react to user interaction: - map.on('click', onMapClick); - function onMapClick(e) { alert("You clicked the map at " + e.latlng); } -Each object has its own set of events — see documentation for details. The first argument of the listener function is an event object — it contains useful information about the event that happened. For example, map click event object (e in the example above) has latlng property which is a location at which the click occured. - -Lets improve our example by using a popup instead of an alert and formatting the location string: - map.on('click', onMapClick); - var popup = new L.Popup(); +Each object has its own set of events --- see [documentation](../reference.html) for details. The first argument of the listener function is an event object --- it contains useful information about the event that happened. For example, map click event object (`e` in the example above) has `latlng` property which is a location at which the click occured. - function onMapClick(e) { - var latlngStr = '(' + e.latlng.lat.toFixed(3) + ', ' + e.latlng.lng.toFixed(3) + ')'; +Lets improve our example by using a popup instead of an alert: - popup.setLatLng(e.latlng); - popup.setContent("You clicked the map at " + latlngStr); + var popup = L.popup(); - map.openPopup(popup); + function onMapClick(e) { + popup + .setLatLng(e.latlng); + .setContent("You clicked the map at " + e.latlng.toString()); + .openOn(map); } + map.on('click', onMapClick); + Try clicking on the map and you will see the coordinates in a popup. View the full example → Now you've learned Leaflet basics and can start building map apps straight away! Don't forget to take a look at the detailed documentation or other examples. From fd3fbf84196f41ba24b45ec2db46ac8c3e5d6f68 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 24 Jul 2012 14:07:28 +0300 Subject: [PATCH 0195/2207] minor quick start fix --- examples/quick-start.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index b742503f7d8..23f0d3a2e8e 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -82,7 +82,11 @@ Adding a circle is the same (except for specifying the radius in meters as a sec Adding a polygon is as easy: - L.polygon([[51.509, -0.08], [51.503, -0.06], [51.51, -0.047]]).addTo(map); + var polygon = L.polygon([ + [51.509, -0.08], + [51.503, -0.06], + [51.51, -0.047] + ]).addTo(map); ### Working with popups From 6bdf50f41581a808a2ffd6fe1865d41486191fd7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 24 Jul 2012 18:37:33 +0300 Subject: [PATCH 0196/2207] finish quick start update --- examples/quick-start-example.html | 57 ++++++--------- examples/quick-start.md | 117 +++++++++++++++--------------- 2 files changed, 81 insertions(+), 93 deletions(-) diff --git a/examples/quick-start-example.html b/examples/quick-start-example.html index 85ccdd70d7b..5a9bb56f980 100644 --- a/examples/quick-start-example.html +++ b/examples/quick-start-example.html @@ -14,51 +14,42 @@ diff --git a/examples/quick-start.md b/examples/quick-start.md index 23f0d3a2e8e..be99b377253 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -129,8 +129,8 @@ Lets improve our example by using a popup instead of an alert: function onMapClick(e) { popup - .setLatLng(e.latlng); - .setContent("You clicked the map at " + e.latlng.toString()); + .setLatLng(e.latlng) + .setContent("You clicked the map at " + e.latlng.toString()) .openOn(map); } @@ -141,87 +141,84 @@ Try clicking on the map and you will see the coordinates in a popup. documentation or other examples. - + var map1 = L.map('map1').setView([51.505, -0.09], 13); + L.tileLayer(tilesUrl, {attribution: tilesAttrib}).addTo(map1); - + L.circle([51.508, -0.11], 500, { + color: 'red', + fillColor: '#f03', + fillOpacity: 0.5 + }).addTo(map2); + + L.polygon([ + [51.509, -0.08], + [51.503, -0.06], + [51.51, -0.047] + ]).addTo(map2); - From 46eb027c7602f2574ecd3826e9db5b7034de7001 Mon Sep 17 00:00:00 2001 From: mourner Date: Wed, 25 Jul 2012 01:09:31 +0300 Subject: [PATCH 0197/2207] news flash on frontpage --- docs/css/screen.css | 12 +++++++++++- index.md | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 8620d750272..ee1b15327a4 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -157,7 +157,7 @@ td { .nav { padding: 0; - margin: 28px 0 32px; + margin: 28px 0 28px; list-style: none; font-size: 1.2em; @@ -470,3 +470,13 @@ dl dd { border: 0; box-shadow: none; } + + +p.notice { + border: none; + border-radius: 10px; + color: #444; + background: #DBF8A7; + padding: 5px 10px; + margin-bottom: 1.5em; +} diff --git a/index.md b/index.md index 4066a160bff..493df17d1cc 100644 --- a/index.md +++ b/index.md @@ -2,6 +2,8 @@ layout: default --- +

        July 27, 2012 — Leaflet 0.4 released with lots of exciting improvements! — read more in the blog

        + Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 26 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. From f1a8f609d03edc290916cbff4f7fff1232cc00d7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 12:04:57 +0300 Subject: [PATCH 0198/2207] temporary fix for github icon --- docs/css/screen.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 0a046c0cf3f..babe130a9e2 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -178,7 +178,7 @@ th, td { display: block; }*/ .nav li a.github-link { - background: url(https://github.com/favicon.png) 15px 12px no-repeat; + background: url(https://github.com/CloudMade/Leaflet/raw/gh-pages-master/docs/images/github.png) 15px 12px no-repeat; } .nav li a.twitter-link { background: url(http://twitter.com/phoenix/favicon.ico) 15px 12px no-repeat; From 62e75978b8abdfb8b4f2cc61247b6800ddf27d21 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 13:05:51 +0300 Subject: [PATCH 0199/2207] showcase companies on frontpage #400 --- docs/css/screen.css | 22 +++++++++++++++++++++- index.md | 4 +++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index ee1b15327a4..7d05d829b00 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -304,7 +304,7 @@ a.nodocs { height: 320px; border: 1px solid #ccc; margin-bottom: 20px; - margin-top: 30px; + margin-top: 34px; /*box-shadow: 0px 0px 10px #ccc; -moz-box-shadow: 0px 0px 10px #ccc; @@ -480,3 +480,23 @@ p.notice { padding: 5px 10px; margin-bottom: 1.5em; } + +.usedby a { + text-decoration: none; + margin: 0 2px; + color: #777; +} + +.usedby a:hover { + text-decoration: underline; + color: black; +} + +.usedby { + background: #f3f3f3; + border-radius: 5px; + padding: 5px 7px; + margin: 1.5em -7px; + white-space: nowrap; + overflow: hidden; +} diff --git a/index.md b/index.md index 493df17d1cc..75f05e7e3af 100644 --- a/index.md +++ b/index.md @@ -2,12 +2,14 @@ layout: default --- -

        July 27, 2012 — Leaflet 0.4 released with lots of exciting improvements! — read more in the blog

        +

        July 27, 2012 — Leaflet 0.4 Released with Lots of Exciting Improvements! — Read More in the Blog

        Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 26 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. +{: .usedby} +Used by: [Flickr](http://flickr.com/map) [Foursquare](https://foursquare.com/) [Wikipedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [City-Data.com](http://city-data.com) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [CityMaps](http://www.citymaps.com) [Chartbeat](http://chartbeat.com/) [GisCloud](http://www.giscloud.com/) [Skobbler](http://maps.skobbler.com/) ...
        From 24dd02aacc014fc9ea558b56524880c27cb4c052 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 13:15:33 +0300 Subject: [PATCH 0200/2207] improve download page --- download.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/download.md b/download.md index 7712f97a007..50c45675720 100644 --- a/download.md +++ b/download.md @@ -27,8 +27,20 @@ it straight away, place this code in the `head` section of your HTML: +### Building Leaflet from the Source + +Leaflet build system is powered by the [Node.js](http://nodejs.org) platform and Jake, JSHint and UglifyJS libraries, which install easily and work well across all major platforms. Here are the steps to install it: + + 1. [Download and install Node](http://nodejs.org) + 2. Run the following commands in the command line: + +
        npm install -g jake
        +npm install jshint
        +npm install uglify-js
        +
        + +Now that you have everything installed, run `jake` inside the Leaflet directory. This will check Leaflet source files for JavaScript errors and inconsistencies, and then combine and compress it to the `dist` folder. + ### Building a Custom Version of Leaflet -Open `build/build.html` page from the download package, check the -components you want to see in your build and then follow the -instructions there. +To make a custom build of the library with only the things you need, open `build/build.html` page of the package contents, choose the components (it figures out dependencies for you) and then run the command generated with it. From 9c253a627c379671ba4c6b483ef0683d53cbeff4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 14:02:10 +0300 Subject: [PATCH 0201/2207] update "used by" links --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 75f05e7e3af..5677c9e03b0 100644 --- a/index.md +++ b/index.md @@ -9,7 +9,7 @@ Leaflet is a modern open-source JavaScript library for mobile-friendly interacti It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. {: .usedby} -Used by: [Flickr](http://flickr.com/map) [Foursquare](https://foursquare.com/) [Wikipedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [City-Data.com](http://city-data.com) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [CityMaps](http://www.citymaps.com) [Chartbeat](http://chartbeat.com/) [GisCloud](http://www.giscloud.com/) [Skobbler](http://maps.skobbler.com/) ... +Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data.com](http://city-data.com) [CityMaps](http://www.citymaps.com) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [skobbler](http://maps.skobbler.com/) ...
        From 6b2184821e514536d070fec21a88ab1c46b27966 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 16:24:11 +0300 Subject: [PATCH 0202/2207] improve download page more --- docs/css/screen.css | 12 ++++++------ download.md | 25 ++++++++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 7d05d829b00..a6334395bbe 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -366,22 +366,22 @@ table td code b { font-weight: normal; } -th.width250 { +.width250 { width: 250px; } -th.width200 { +.width200 { width: 200px; } -th.width300 { +.width300 { width: 300px; } -th.width100 { +.width100 { width: 100px; } -th.width140 { +.width140 { width: 140px; } -th.minwidth { +.minwidth { width: 1px; } diff --git a/download.md b/download.md index 50c45675720..e9f60449663 100644 --- a/download.md +++ b/download.md @@ -5,16 +5,27 @@ title: Download ## Download Leaflet -Besides the library itself, the download package contains full source -code, unit tests, files for debugging and a build system. The production -files (included the same way as in the code above) are in the `dist` -folder. - -[Download Leaflet 0.3.1 stable](https://github.com/CloudMade/Leaflet/zipball/v0.3.1) (February 14, 2012)
        -[Download Leaflet 0.4 master](http://github.com/CloudMade/Leaflet/zipball/master) (in-progress version) +Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system. The production files are in the `dist` folder. + + + + + + + + + + + + + + +
        VersionDescription
        Leaflet 0.3.1Stable version, released on February 14, 2012
        Leaflet masterIn-progress version, developed on the master branch
        [View Changelog](https://github.com/CloudMade/Leaflet/blob/master/CHANGELOG.md) +Note that the master version can contain incompatible changes, so please read the changelog carefully when upgrading to it. + ### Using a Hosted Version of Leaflet The latest stable release of Leaflet is hosted on a CDN — to start using From 97b43a3e9882725b7c2691bb06e5e4bf9c2d6a71 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 18:51:38 +0300 Subject: [PATCH 0203/2207] update mobile example --- _layouts/default.html | 8 +++- examples/mobile-example.html | 29 +++++++-------- examples/mobile.html | 51 +++++++++++++------------- examples/mobile.md | 71 ++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 43 deletions(-) create mode 100644 examples/mobile.md diff --git a/_layouts/default.html b/_layouts/default.html index 4d069679ec7..69a6eea2112 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -135,11 +135,15 @@

        An Open-Source JavaScript Library for Mobile-Friendly Interactiv hljs.tabReplace = ' '; (function () { - var codes = document.getElementsByTagName('code'); + var codes = document.getElementsByTagName('code'), + parentClass; for (var i = 0, len = codes.length; i < len; i++) { if (!codes[i].className) { - if (codes[i].innerHTML.match(/^\s*</)) { + parentClass = codes[i].parentNode.className; + if (parentClass) { + codes[i].className = parentClass; + } else if (codes[i].innerHTML.match(/^\s*</)) { codes[i].className = 'xml'; } else { codes[i].className = 'javascript'; diff --git a/examples/mobile-example.html b/examples/mobile-example.html index 345f0b7fb6c..d00b0b5128a 100644 --- a/examples/mobile-example.html +++ b/examples/mobile-example.html @@ -24,33 +24,30 @@
        diff --git a/examples/mobile.html b/examples/mobile.html index ef7f067583f..3dcf96c7767 100644 --- a/examples/mobile.html +++ b/examples/mobile.html @@ -7,11 +7,11 @@

        Leaflet on Mobile

        In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

        -

        View example →

        +

        View example in fullscreen →

        Preparing the page

        -

        First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

        +

        First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

        body {
         	padding: 0;
        @@ -21,7 +21,7 @@ 

        Preparing the page

        height: 100%; }
        -

        Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the head section:

        +

        Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the head section or our HTML page:

        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        @@ -29,42 +29,43 @@

        Initializing the map

        We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

        -
        var map = new L.Map('map');
        +
        var map = L.map('map');
         
        -var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/997/256/{z}/{x}/{y}.png',
        -	cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
        -	cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
        -
        -map.addLayer(cloudmade);
        +L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', { + attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>', + maxZoom: 18 +}).addTo(map);

        Geolocation

        -

        Leaflet has a very handy shortcut for zooming the map view to the detected location — locateAndSetView method, replacing the usual setView method in the code:

        - -
        map.locateAndSetView(16);
        +

        Leaflet has a very handy shortcut for zooming the map view to the detected location — locate method with the setView option, replacing the usual setView method in the code:

        -

        Here we specify 16 as the maximum zoom when setting the map view automatically. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

        +
        map.locate({setView: true, maxZoom: 16});
        -
        map.on('locationfound', onLocationFound);
        +

        Here we specify 16 as the maximum zoom when setting the map view automatically. As soon as the user agrees to share its location and it's detected by the browser, the map will set the view to it. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

        -function onLocationFound(e) { +
        function onLocationFound(e) {
         	var radius = e.accuracy / 2;
         
        -	var marker = new L.Marker(e.latlng);
        -	map.addLayer(marker);
        -	marker.bindPopup("You are within " + radius + " meters from this point").openPopup();
        +	L.marker(e.latlng).addTo(map)
        +		.bindPopup("You are within " + radius + " meters from this point").openPopup();
         
        -	var circle = new L.Circle(e.latlng, radius);
        -	map.addLayer(circle);
        -}
        + L.circle(e.latlng, radius).addTo(map); +} -

        Excellent! But it would also be nice to show an error message if the geolocation failed:

        +map.on('locationfound', onLocationFound); +
        -
        map.on('locationerror', onLocationError);
        +

        Excellent! But it would also be nice to show an error message if the geolocation failed:

        -function onLocationError(e) { +
        function onLocationError(e) {
         	alert(e.message);
        -}
        +} + +map.on('locationerror', onLocationError); +
        + +

        If you have setView option set to true and the geolocation failed, it will set the view to the whole world.

        Now the example is complete — try it on your mobile phone: View the full example →

        diff --git a/examples/mobile.md b/examples/mobile.md new file mode 100644 index 00000000000..045be0956ce --- /dev/null +++ b/examples/mobile.md @@ -0,0 +1,71 @@ +--- +layout: tutorial +title: Leaflet on Mobile +--- + +## Leaflet on Mobile + +In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location. + +[View example in fullscreen →](mobile-example.html) + +### Preparing the page + +First we'll take a look at the HTML & CSS code of the page. To make our map `div` element stretch to all available space (fullscreen), we can use the following CSS code: + +{: .css} + body { + padding: 0; + margin: 0; + } + html, body, #map { + height: 100%; + } + +Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the `head` section or our HTML page: + + + +### Initializing the map + +We'll now initialize the map in the JavaScript code exactly like we did in the [quick start guide](quick-start.html), but won't set the map view yet: + +
        var map = L.map('map');
        +
        +L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
        +	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
        +	maxZoom: 18
        +}).addTo(map);
        + +### Geolocation + +Leaflet has a very handy shortcut for zooming the map view to the detected location --- `locate` method with the `setView` option, replacing the usual `setView` method in the code: + + map.locate({setView: true, maxZoom: 16}); + +Here we specify 16 as the maximum zoom when setting the map view automatically. As soon as the user agrees to share its location and it's detected by the browser, the map will set the view to it. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the `locationfound` and `locationerror` events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to `locationfound` event before the `locateAndSetView` call: + + function onLocationFound(e) { + var radius = e.accuracy / 2; + + L.marker(e.latlng).addTo(map) + .bindPopup("You are within " + radius + " meters from this point").openPopup(); + + L.circle(e.latlng, radius).addTo(map); + } + + map.on('locationfound', onLocationFound); + +Excellent! But it would also be nice to show an error message if the geolocation failed: + + function onLocationError(e) { + alert(e.message); + } + + map.on('locationerror', onLocationError); + +If you have `setView` option set to true and the geolocation failed, it will set the view to the whole world. + +Now the example is complete --- try it on your mobile phone: [View the full example →](mobile-example.html) + +Next steps would be to take a look at the detailed [documentation](../reference.html) and browse [other examples](../examples.html). From 522c8310103d925c0aa809eec5fa72c462dad115 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 25 Jul 2012 19:50:59 +0300 Subject: [PATCH 0204/2207] update custom icons example, minor fixes --- _layouts/default.html | 8 +++ docs/images/leaf-shadow.png | Bin 3852 -> 3236 bytes examples.md | 8 +-- examples/custom-icons-example.html | 12 ++-- examples/custom-icons.md | 112 ++++++++++++++++++----------- examples/mobile.html | 72 ------------------- examples/quick-start.md | 12 ++-- 7 files changed, 91 insertions(+), 133 deletions(-) delete mode 100644 examples/mobile.html diff --git a/_layouts/default.html b/_layouts/default.html index 69a6eea2112..9b3ca05474a 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -35,6 +35,14 @@ + +
        diff --git a/docs/images/leaf-shadow.png b/docs/images/leaf-shadow.png index f8129861309457b00d5e7b5f425e9b2766df8515..119a71dbcfb43c0a0788b1a72806bdcf2323124a 100644 GIT binary patch literal 3236 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 S-l_fnQ(H?1_][1] @@ -19,21 +19,21 @@ A simple step-by-step guide that will quickly get you started with Leaflet basic ### [Leaflet on Mobile][2] -In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location. +In this tutorial, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location. *** [][3] ### [Markers With Custom Icons][3] -In this pretty example, you'll learn how to easily define your own icons for use by the markers you put on the map. +In this pretty tutorial, you'll learn how to easily define your own icons for use by the markers you put on the map. *** [][4] ### [Using GeoJSON with Leaflet][4] -In this example, you'll learn how to create and interact with map vectors created from [GeoJSON][5] objects. +In this tutorial, you'll learn how to create and interact with map vectors created from [GeoJSON][5] objects. *** [][6] diff --git a/examples/custom-icons-example.html b/examples/custom-icons-example.html index cb6c521a61f..4263e2fa21d 100644 --- a/examples/custom-icons-example.html +++ b/examples/custom-icons-example.html @@ -23,16 +23,16 @@ var LeafIcon = L.Icon.extend({ options: { - iconUrl: '../docs/images/leaf-green.png', shadowUrl: '../docs/images/leaf-shadow.png', - iconSize: [38, 95], - shadowSize: [68, 95], - iconAnchor: [22, 94], - popupAnchor: [-3, -76] + iconSize: [38, 95], + shadowSize: [50, 64], + iconAnchor: [22, 94], + shadowAnchor: [4, 62], + popupAnchor: [-3, -76] } }); - var greenIcon = new LeafIcon(), + var greenIcon = new LeafIcon({iconUrl: '../docs/images/leaf-green.png'}), redIcon = new LeafIcon({iconUrl: '../docs/images/leaf-red.png'}), orangeIcon = new LeafIcon({iconUrl: '../docs/images/leaf-orange.png'}); diff --git a/examples/custom-icons.md b/examples/custom-icons.md index 7d95ef382e1..4928840eb18 100644 --- a/examples/custom-icons.md +++ b/examples/custom-icons.md @@ -5,7 +5,7 @@ title: Markers With Custom Icons ### Markers With Custom Icons -In this example, you'll learn how to easily define your own icons for use by the markers you put on the map. +In this tutorial, you'll learn how to easily define your own icons for use by the markers you put on the map.
        @@ -14,7 +14,7 @@ In this example, you'll learn how to easily define your own icons for use by the ### Preparing the images -To make a custom icon, we usually need two images --- the actual icon image and the image of its shadow. For this example, we took the Leaflet logo and created four images out of it --- 3 leaf images of different colors and one shadow image for the three: +To make a custom icon, we usually need two images --- the actual icon image and the image of its shadow. For this tutorial, we took the Leaflet logo and created four images out of it --- 3 leaf images of different colors and one shadow image for the three:

        @@ -23,71 +23,78 @@ To make a custom icon, we usually need two images --- the actual icon image and

        -The white area in the images is actually transparent, and they are saved in the PNG24 format. Notice there's some excessive area on the left of the shadow image — its cropped in such way that if you align the icon and the shadow images on top of each other, the top left corners are in the same spot. +Note that the white area in the images is actually transparent. +### Creating an icon -### Defining an icon class +Marker icons in Leaflet are defined by [L.Icon](../reference.html#icon) objects, which are passed as an option when creating markers. Let's create a green leaf icon: -The default marker icons in Leaflet are defined by the [L.Icon](../reference.html#icon) class. Its instance (`new L.Icon()`) is then set by default in the `L.Marker` options. So how do we define our own icon class? Inherit from `L.Icon`! It's really easy in Leaflet: + var greenIcon = L.icon({ + iconUrl: 'leaf-green.png', + shadowUrl: 'leaf-shadow.png', - var LeafIcon = L.Icon.extend({ - options: { - iconUrl: '../docs/images/leaf-green.png', - shadowUrl: '../docs/images/leaf-shadow.png', - iconSize: new L.Point(38, 95), - shadowSize: new L.Point(68, 95), - iconAnchor: new L.Point(22, 94), - popupAnchor: new L.Point(-3, -76) - } - }); + iconSize: [38, 95], // size of the icon + shadowSize: [50, 64], // size of the shadow + iconAnchor: [22, 94], // point of the icon which will correspond to marker's location + shadowAnchor: [4, 62], // the same for the shadow + popupAnchor: [-3, -76] // point from which the popup should open relative to the iconAnchor + }); -Now we've defined a green leaf icon class. The iconSize and shadowSize properties are the sizes of the corresponding images in pixels, the iconAnchor property is the coordinates of the "tip" of our icon, and the popupAnchor property points to a point from which a marker popup would open relative to the iconAnchor point. +Now putting a marker with this icon on a map is easy: + L.marker([51.5, -0.09], {icon: greenIcon}).addTo(map); -### Using icons in markers +
        -To use our newly created icon class in a marker, we need to create an instance of that class and pass it to the marker constructor in the options: +### Defining an icon class - var greenIcon = new LeafIcon(), - marker = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon}); +What if we need to create several icons that have lots in common? Lets define our own icon class containing the shared options, inheriting from `L.Icon`! It's really easy in Leaflet: -Awesome, it works! But what about the orange and the red ones? You could repeat the whole process above for each of them, but there's a much easier way. Notice that these icons would have the same properties except for one --- the iconUrl. Because it's a frequent case, the L.Icon constructor has an optional argument --- an iconUrl to replace the defined one. Let's see: + var LeafIcon = L.Icon.extend({ + options: { + shadowUrl: 'leaf-shadow.png', + iconSize: [38, 95], + shadowSize: [50, 64], + iconAnchor: [22, 94], + shadowAnchor: [4, 62], + popupAnchor: [-3, -76] + } + }); - var greenIcon = new LeafIcon(), - redIcon = new LeafIcon({iconUrl: '../docs/images/leaf-red.png'}), - orangeIcon = new LeafIcon({iconUrl: '../docs/images/leaf-orange.png'}); +Now we can create all three of our leaf icons from this class and use them: -Now we can use all the three icons: + var greenIcon = new LeafIcon({iconUrl: 'leaf-green.png'}), + redIcon = new LeafIcon({iconUrl: 'leaf-red.png'}), + orangeIcon = new LeafIcon({iconUrl: 'leaf-orange.png'}); - var marker1 = new L.Marker(new L.LatLng(51.5, -0.09), {icon: greenIcon}), - marker2 = new L.Marker(new L.LatLng(51.495, -0.083), {icon: redIcon}), - marker3 = new L.Marker(new L.LatLng(51.49, -0.1), {icon: orangeIcon}); +You may have noticed that we used the `new` keyword for creating LeafIcon instances. So why do all Leaflet classes get created without it? The answer is simple: the real Leaflet classes are named with a capital letter (e.g. `L.Icon`), and they also need to be created with `new`, but there are also shortcuts with lowercase names (`L.icon`), created for convenience like this: -marker1.bindPopup("I am a green leaf."); -marker2.bindPopup("I am a red leaf."); -marker3.bindPopup("I am an orange leaf."); + L.icon = function (options) { + return new L.Icon(options); + }; -map.addLayer(marker1).addLayer(marker2).addLayer(marker3); +You can do the same with your classes too. OK, lets finally put some markers with these icons on the map: -That's all. Now take a look at the full example, the L.Icon docs, or browse other examples. + L.marker([51.5, -0.09], {icon: greenIcon}).addTo(map).bindPopup("I am a green leaf."); + L.marker([51.495, -0.083], {icon: redIcon}).addTo(map).bindPopup("I am a red leaf."); + L.marker([51.49, -0.1], {icon: orangeIcon}).addTo(map).bindPopup("I am an orange leaf."); - diff --git a/examples/mobile.html b/examples/mobile.html deleted file mode 100644 index 3dcf96c7767..00000000000 --- a/examples/mobile.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -layout: tutorial -title: Leaflet on Mobile ---- - -

        Leaflet on Mobile

        - -

        In this example, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.

        - -

        View example in fullscreen →

        - -

        Preparing the page

        - -

        First we'll take a look at the HTML & CSS code of the page. To make our map div element stretch to all available space (fullscreen), we can use the following CSS code:

        - -
        body {
        -	padding: 0;
        -	margin: 0;
        -}
        -html, body, #map {
        -	height: 100%;
        -}
        - -

        Also, we need to tell the mobile browser to disable unwanted scaling of the page and set it to its actual size by placing the following line in the head section or our HTML page:

        - -
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        - -

        Initializing the map

        - -

        We'll now initialize the map in the JavaScript code exactly like we did in the quick start guide, but won't set the map view yet:

        - -
        var map = L.map('map');
        -
        -L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
        -	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
        -	maxZoom: 18
        -}).addTo(map);
        - -

        Geolocation

        - -

        Leaflet has a very handy shortcut for zooming the map view to the detected location — locate method with the setView option, replacing the usual setView method in the code:

        - -
        map.locate({setView: true, maxZoom: 16});
        - -

        Here we specify 16 as the maximum zoom when setting the map view automatically. As soon as the user agrees to share its location and it's detected by the browser, the map will set the view to it. Now we have a working fullscreen mobile map! But what if we need to do something after the geolocation completed? Here's what the locationfound and locationerror events are for. Let's for example add a marker in the detected location, showing accuracy in a popup, by adding an event listener to locationfound event before the locateAndSetView call:

        - -
        function onLocationFound(e) {
        -	var radius = e.accuracy / 2;
        -
        -	L.marker(e.latlng).addTo(map)
        -		.bindPopup("You are within " + radius + " meters from this point").openPopup();
        -
        -	L.circle(e.latlng, radius).addTo(map);
        -}
        -
        -map.on('locationfound', onLocationFound);
        -
        - -

        Excellent! But it would also be nice to show an error message if the geolocation failed:

        - -
        function onLocationError(e) {
        -	alert(e.message);
        -}
        -
        -map.on('locationerror', onLocationError);
        -
        - -

        If you have setView option set to true and the geolocation failed, it will set the view to the whole world.

        - -

        Now the example is complete — try it on your mobile phone: View the full example →

        - -

        Next steps would be to take a look at the detailed documentation and browse other examples.

        diff --git a/examples/quick-start.md b/examples/quick-start.md index be99b377253..c30abe7ce6b 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -142,13 +142,9 @@ Now you've learned Leaflet basics and can start building map apps straight away!

        View example on a separate page →

        @@ -92,12 +97,6 @@

        The GeoJSON layer

        GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

        -
        var geojsonLayer = new L.GeoJSON();
        -
        -map.addLayer(geojsonLayer);
        - -

        This creates an empty GeoJSON layer that we can easily add vectors to with the addGeoJSON method.

        -
        var geojsonFeature = {
         	"type": "Feature",
         	"properties": {
        @@ -111,25 +110,56 @@ 

        The GeoJSON layer

        } }; -geojsonLayer.addGeoJSON(geojsonFeature);
        +L.geoJson(geojsonFeature).addTo(map);
      + +

      Alternatively, we could create an empty GeoJSON layer and assign it to a variable so that we can add more features to it later.

      + +
      var myLayer = L.geoJson().addTo(map);
      +
      +myLayer.addData(geojsonFeature);
      +
      + +

      Options

      + +

      style

      + +

      The style option is used to ...

      -

      We can also instantiate the GeoJSON layer with a GeoJSON object to show it immediately, without having to call addGeoJSON.

      +

      onEachFeature

      -
      var geojsonLayer = new L.GeoJSON(geojsonFeature);
      +

      The onEachFeature option is used to ...

      -map.addLayer(geojsonLayer);
      +

      filter

      + +

      The filter option is used to ...

      Popups

      -

      We can use popups to show information about these features when they are clicked. To accomplish this we'll listen to the featureparse event of the GeoJSON layer. Here we're checking to see if a feature has a property named "popupContent" and if so binding a popup to the feature so this text (or HTML) appears when clicked.

      +

      We can use popups to show information about features when they are clicked. To accomplish this we'll utilise the onEachFeature option of the GeoJSON layer.

      -
      geojsonLayer.on("featureparse", function (e) {
      -	if (e.properties && e.properties.popupContent){
      -		e.layer.bindPopup(e.properties.popupContent);
      +
      function onEachFeature (feature, layer) {
      +	// Does this feature have a property named popupContent
      +	if (feature.properties && feature.properties.popupContent) {
      +		layer.bindPopup(feature.properties.popupContent);
       	}
      -});
      +} + +var geojsonFeature = { + "type": "Feature", + "properties": { + "name": "Coors Field", + "amenity": "Baseball Stadium", + "popupContent": "This is where the Rockies play!" + }, + "geometry": { + "type": "Point", + "coordinates": [-104.99404, 39.75621] + } +}; -

      Make sure to do this before adding GeoJSON objects through the addGeoJSON method.

      +L.geoJson(geojsonFeature, { + onEachFeature: onEachFeature +}).addTo(map);

      Styling Features

      diff --git a/examples/sample-geojson.js b/examples/sample-geojson.js index b65735e0945..2c2471e58cc 100644 --- a/examples/sample-geojson.js +++ b/examples/sample-geojson.js @@ -11,7 +11,7 @@ var freeBus = { ] }, "properties": { - "name": "16th Street Free Bus", + "popupContent": "This is free bus that will take you across downtown.", "underConstruction": false }, "id": 1 @@ -26,7 +26,7 @@ var freeBus = { ] }, "properties": { - "name": "16th Street Free Bus", + "popupContent": "This is free bus that will take you across downtown.", "underConstruction": true }, "id": 2 @@ -41,7 +41,7 @@ var freeBus = { ] }, "properties": { - "name": "16th Street Free Bus", + "popupContent": "This is free bus that will take you across downtown.", "underConstruction": false }, "id": 3 From b3d751818c469c7fb75c1c829978cb03448e21ca Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 12:16:38 +0300 Subject: [PATCH 0209/2207] fix jekyll error --- download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.md b/download.md index e9f60449663..3253fd8b71e 100644 --- a/download.md +++ b/download.md @@ -45,7 +45,7 @@ Leaflet build system is powered by the [Node.js](http://nodejs.org) platform and 1. [Download and install Node](http://nodejs.org) 2. Run the following commands in the command line: -
      npm install -g jake
      + 
      npm install -g jake
       npm install jshint
       npm install uglify-js
       
      From 40a6fc1d10484e9c6b925620fbbf56bc37418f12 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 12:17:40 +0300 Subject: [PATCH 0210/2207] update layers control --- examples/layers-control-example.html | 42 +++++----- examples/layers-control.html | 112 --------------------------- examples/layers-control.md | 98 +++++++++++++++++++++++ 3 files changed, 118 insertions(+), 134 deletions(-) delete mode 100644 examples/layers-control.html create mode 100644 examples/layers-control.md diff --git a/examples/layers-control-example.html b/examples/layers-control-example.html index 638c9c43ebb..9ce0f12517b 100644 --- a/examples/layers-control-example.html +++ b/examples/layers-control-example.html @@ -14,40 +14,38 @@ diff --git a/examples/layers-control.html b/examples/layers-control.html deleted file mode 100644 index d36690540a8..00000000000 --- a/examples/layers-control.html +++ /dev/null @@ -1,112 +0,0 @@ ---- -layout: tutorial -title: Layer Groups and Layers Control ---- - -

      Layer Groups and Layers Control

      - -

      This guide will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map.

      -

      Note: this only works in the latest (master) version of Leaflet.

      - -
      - - -

      View example on a separate page →

      - -

      Layer Groups

      - -

      Lets suppose you have a bunch of layers you want to combine into a group to handle them as one in your code:

      - -
      var littletonMarker = new L.Marker(new L.LatLng(39.61, -105.02)).bindPopup("This is Littleton, CO."),
      -	denverMarker = new L.Marker(new L.LatLng(39.74, -104.99)).bindPopup("This is Denver, CO."),
      -	auroraMarker = new L.Marker(new L.LatLng(39.73, -104.8)).bindPopup("This is Aurora, CO."),
      -	goldenMarker = new L.Marker(new L.LatLng(39.77, -105.23)).bindPopup("This is Golden, CO.");
      - -

      Instead of adding them directly to the map, you can do the following, using the LayerGroup class:

      - -
      var citiesLayer = new L.LayerGroup();
      -
      -citiesLayer.addLayer(littletonMarker)
      -           .addLayer(denverMarker)
      -           .addLayer(auroraMarker)
      -           .addLayer(goldenMarker);
      -
      -map.addLayer(citiesLayer);
      - -

      Easy enough! Now you have citiesLayer that combines your city markers into one layer you can add or remove from the map at once.

      - -

      Layers Control

      - -

      Leaflet has a nice little control that allows your users control what layers they want to see on your map. In addition to showing you how to use it, we'll show another handy use for layer groups.

      - -

      There are two types of layers — base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays — all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off — a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map:

      - -
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/YOUR-API-KEY/{styleId}/256/{z}/{x}/{y}.png',
      -	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade',
      -	cloudmadeOptions = {maxZoom: 18, };
      -
      -var minimal = new L.TileLayer(cloudmadeUrl, {styleId: 22677, attribution: cloudmadeAttribution}),
      -	midnightCommander = new L.TileLayer(cloudmadeUrl, {styleId: 999, attribution: cloudmadeAttribution}),
      -	motorways = new L.TileLayer(cloudmadeUrl, {styleId: 46561, attribution: cloudmadeAttribution});
      -
      -var map = new L.Map('map', {
      -	center: new L.LatLng(39.73, -104.99),
      -	zoom: 10,
      -	layers: [minimal, motorways, citiesLayer]
      -});
      - -

      Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are just simple objects with key/value pairs. The key is what sets the text for the layer in the control (e.g. "Night View"). The corresponding value is a reference to the layer (e.g. midnightCommander).

      - -
      var baseMaps = {
      -	"Minimal": minimal,
      -	"Night View": midnightCommander
      -};
      -
      -var overlayMaps = {
      -    "Motorways": motorways,
      -    "Cities": citiesLayer
      -};
      - - -

      Now, all that's left to do is to create a Layers Control and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional — for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing null as the first argument.

      - -
      var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
      -
      -map.addControl(layersControl);
      - -

      Now lets view the result on a separate page →

      diff --git a/examples/layers-control.md b/examples/layers-control.md new file mode 100644 index 00000000000..f30d14855d7 --- /dev/null +++ b/examples/layers-control.md @@ -0,0 +1,98 @@ +--- +layout: tutorial +title: Layer Groups and Layers Control +--- + +## Layer Groups and Layers Control + +This tutorial will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map. + +
      + +[View example on a separate page →](ayers-control-example.html) + + +### Layer Groups + +Lets suppose you have a bunch of layers you want to combine into a group to handle them as one in your code: + + var littleton = L.marker([39.61, -105.02]).bindPopup('This is Littleton, CO.'), + denver = L.marker([39.74, -104.99]).bindPopup('This is Denver, CO.'), + aurora = L.marker([39.73, -104.8]).bindPopup('This is Aurora, CO.'), + golden = L.marker([39.77, -105.23]).bindPopup('This is Golden, CO.'); + +Instead of adding them directly to the map, you can do the following, using the LayerGroup class: + + var cities = L.layerGroup([littleton, denver, aurora, golden]); + +Easy enough! Now you have a `cities` layer that combines your city markers into one layer you can add or remove from the map at once. + +### Layers Control + +Leaflet has a nice little control that allows your users control what layers they want to see on your map. In addition to showing you how to use it, we'll show another handy use for layer groups. + +There are two types of layers --- base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays --- all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off --- a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map: + +
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png',
      +	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade';
      +
      +var minimal   = L.tileLayer(cloudmadeUrl, {styleId: 22677, attribution: cloudmadeAttribution}),
      +	midnight  = L.tileLayer(cloudmadeUrl, {styleId: 999,   attribution: cloudmadeAttribution}),
      +	motorways = L.tileLayer(cloudmadeUrl, {styleId: 46561, attribution: cloudmadeAttribution});
      +
      +var map = L.map('map', {
      +	center: new L.LatLng(39.73, -104.99),
      +	zoom: 10,
      +	layers: [minimal, motorways, cities]
      +});
      + +Next, we'll create two objects. One will contain our base layers and one will contain our overlays. These are just simple objects with key/value pairs. The key is what sets the text for the layer in the control (e.g. "Night View"). The corresponding value is a reference to the layer (e.g. `midnight`). + +
      var baseMaps = {
      +	"Minimal": minimal,
      +	"Night View": midnight
      +};
      +
      +var overlayMaps = {
      +    "Motorways": motorways,
      +    "Cities": cities
      +};
      + +Now, all that's left to do is to create a [Layers Control](../reference.html#control-layers) and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional --- for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing `null` as the first argument. + +
      L.control.layers(baseMaps, overlayMaps).addTo(map);
      + +Note that we added `minimal`, `motorways` and `cities` layers to the map but didn't add `midnight`. The layers control is smart enough to detect what layers we've already added and have corresponding checkboxes and radioboxes set. + +Now lets [view the result on a separate page →](layers-control-example.html) + + From 1ed9a6c7cebf391a893f643358e35b0cba8867e5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 14:39:06 +0300 Subject: [PATCH 0211/2207] add draggable and transition docs --- DOCS-TODO | 28 ----- reference.html | 307 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 305 insertions(+), 30 deletions(-) diff --git a/DOCS-TODO b/DOCS-TODO index 59d9e754989..c60e29beb74 100644 --- a/DOCS-TODO +++ b/DOCS-TODO @@ -1,32 +1,4 @@ -NEW Transition - Transition(el, options) - - run(props) - - options - fps: 50 - easing: 'ease', - duration: 0.5 - fakeStepInterval: 100 - - events - start - step - end - -NEW Draggable - Draggable(element, dragStartTarget) - - enable() - disable() - - events - dragstart - predrag - drag - dragend - NEW IProjection project(latlng) unproject(point) diff --git a/reference.html b/reference.html index 78c3e70d645..df9186fab60 100644 --- a/reference.html +++ b/reference.html @@ -97,8 +97,8 @@

      DOM Utility

      @@ -1544,6 +1544,38 @@

      Options

      +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      loadingEvent + Fired when the tile layer starts loading tiles.
      loadEvent + Fired when the tile layer loaded all visible tiles.
      tileloadEvent + Fired when a tile loads.
      tileunloadEvent + Fired when a tile is removed (e.g. when you have unloadInvisibleTiles on).
      +

      Methods

      @@ -1824,6 +1856,16 @@

      Methods

      + + + + + + + + + +
      this Sets the opacity of the overlay.
      bringToFront()thisBrings the layer to the top of all overlays.
      bringToBack()thisBrings the layer to the bottom of all overlays.
      @@ -1880,6 +1922,12 @@

      Options

      0.2 Fill opacity. + + dashArray + String + null + A string that defines the stroke dash pattern. Doesn't work on canvas-powered layers (e.g. Android 2). + clickable Boolean @@ -3986,6 +4034,26 @@

      LayerEvent

      +

      TileEvent

      + + + + + + + + + + + + + + + + + +
      propertytypedescription
      tileHTMLElementThe tile element (image).
      urlStringThe source URL of the tile.
      +

      GeoJSON event

      @@ -4784,6 +4852,241 @@

      Properties

      + +

      L.Transition

      + +

      Used internally for most animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

      + +
      var fx = new L.Transition(el, {duration: 0.5});
      +
      +fx.run({left: '300px', top: '500px'});
      + +

      Constructor

      + + + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Transition( + <HTMLElement> element, + <Transition options> options? ) + + new L.Transition() + Creates a Transition object tied to a particular element with the given options.
      + +

      Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      durationNumber0.5Duration of the animation in seconds.
      easingString'ease'One of the timing functions for the animation.
      fpsNumber50Frames per second for the timer fallback (IE6-9).
      fakeStepIntervalNumber100How often to fire the step event during transition with a timer (as native transitions don't support such events).
      + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      startEvent + Fired when the animation starts.
      stepEvent + Fired continuously during the animation.
      endEvent + Fired when the animation ends.
      + +

      Methods

      + + + + + + + + + + + + + +
      MethodReturnsDescription
      run( + <Object> properties ) + thisRun the animation with the given set of properties and their end values.
      + +

      Transition Properties

      + +

      An object literal of the following form:

      + +
      {
      +	'<style-property-1>': '<value-1>',
      +	'<style-property-2>': '<value-2>'
      +	// ...
      +}
      + + + + +

      L.Draggable

      + +

      A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging.

      + +
      var draggable = new L.Draggable(elementToDrag);
      +draggable.enable();
      +
      + +

      Constructor

      + + + + + + + + + + + + + + +
      ConstructorUsageDescription
      L.Draggable( + <HTMLElement> element, + <HTMLElement> dragHandle? ) + + new L.Draggable() + Creates a Draggable object for moving the given element when you start dragging the dragHandle element (equals the element itself by default).
      + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      dragstartEvent + Fired when the dragging starts.
      predragEvent + Fired continuously during dragging before each corresponding update of the element position.
      dragEvent + Fired continuously during dragging.
      dragendEvent + Fired when the dragging ends.
      + +

      Methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      enable()-Enables the dragging ability.
      disable()-Disables the dragging ability.
      + +

      Static Properties

      + + + + + + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      STARTStringName of the DOM event that initiates dragging. 'mousedown' for desktop browsers, 'touchstart' for mobile devices.
      MOVEStringName of the DOM event for drag moving. 'mousemove' for desktop browsers, 'touchmove' for mobile devices.
      ENDStringName of the DOM event that ends dragging. 'mouseup' for desktop browsers, 'touchend' for mobile devices.
      + + +

      IHandler

      An interface implemented by interaction handlers.

      From 97edb8d88db04d4f175612e5778871e07583411e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 14:53:24 +0300 Subject: [PATCH 0212/2207] minor download page edits --- download.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/download.md b/download.md index 3253fd8b71e..5cf58c03b4c 100644 --- a/download.md +++ b/download.md @@ -12,9 +12,13 @@ Besides the library itself, the download package contains full source code, unit Version Description + + Leaflet 0.4 + Stable version, released on July 27, 2012 + Leaflet 0.3.1 - Stable version, released on February 14, 2012 + Previous stable version, released on February 14, 2012 Leaflet master From 862fe30438bf6ca1dbdd91858be4071e069734da Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 15:53:46 +0300 Subject: [PATCH 0213/2207] add crs and projection docs, API docs now 100% COMPLETE!!! --- DOCS-TODO | 10 --- docs/css/screen.css | 4 + reference.html | 214 ++++++++++++++++++++++++++++++++++++++------ 3 files changed, 191 insertions(+), 37 deletions(-) delete mode 100644 DOCS-TODO diff --git a/DOCS-TODO b/DOCS-TODO deleted file mode 100644 index c60e29beb74..00000000000 --- a/DOCS-TODO +++ /dev/null @@ -1,10 +0,0 @@ - -NEW IProjection - project(latlng) - unproject(point) - -NEW ICRS - latLngToPoint(latlng, zoom) - pointToLatLng(point, zoom) - project(latlng) - scale(zoom) diff --git a/docs/css/screen.css b/docs/css/screen.css index a6334395bbe..06bbbe25c0e 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -129,6 +129,10 @@ p code, td:last-child code { color: #666; } +/*.api-page td:last-child pre { + margin-top: 0.5em; +}*/ + table { border-collapse: collapse; box-shadow: 0 3px 15px #f0f0f0; diff --git a/reference.html b/reference.html index df9186fab60..5275ee29a3b 100644 --- a/reference.html +++ b/reference.html @@ -24,7 +24,6 @@

      Map Methods

      Map Misc

      @@ -108,8 +107,8 @@

      Interfaces

    49. ILayer
    50. IControl
    51. -
    52. IProjection
    53. -
    54. ICRS
    55. +
    56. IProjection
    57. +
    58. ICRS
    59. Misc

      @@ -213,7 +212,7 @@

      Map State Options

      crs - CRS + CRS L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means. @@ -949,29 +948,6 @@

      Properties

      -

      Projections

      - -

      You can specify different CRS for map to use through its crs option. Here's the list of available CRS:

      - - - - - - - - - - - - - - - - - - -
      CRSData
      L.CRS.EPSG3857EPSG:3857 (Spherical Mercator), used by most of commercial map providers (CloudMade, Google, Yahoo, Bing, etc.).
      L.CRS.EPSG4326EPSG:4326 (Plate Carree), very popular among GIS enthusiasts.
      L.CRS.EPSG3395EPSG:3395 (True Mercator), used by some map providers.
      -

      Map Panes

      @@ -2521,6 +2497,18 @@

      Methods

      this Removes all the layers from the group. + + eachLayers( + <Function> fn, + <Object> context? ) + + this + Iterates over the layers of the group, optionally specifying context of the iterator function. +
      group.eachLayer(function (layer) {
      +	layer.bindPopup('Hello');
      +});
      + + @@ -5260,6 +5248,178 @@

      Custom Control Example

      map.addControl(new MyControl('bar', {position: 'bottomleft'}));
      + + +

      IProjection

      + +

      An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See Map projection.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      project( + <LatLng> latlng ) + PointProjects geographical coordinates into a 2D point.
      unproject( + <Point> point ) + LatLngThe inverse of project. Projects a 2D point into geographical location.
      + +

      Defined Projections

      + +

      Leaflet comes with a set of already defined projections out of the box:

      + + + + + + + + + + + + + + + + + + + + + +
      ProjectionDescription
      L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, used by almost all free and commercial tile providers. Assumes that Earth is a sphere. Used by the EPSG:3857 CRS.
      L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
      L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, mostly used by GIS enthusiasts. Directly maps x as longitude, and y as latitude. Also suitable for flat worlds, e.g. game maps. Used by the EPSG:3395 and Simple CRS.
      + + + + +

      ICRS

      + +

      Defines coordinate reference systems for projecting geographical points into pixel (screen) coordinates and back (and to coordinates in other units for WMS services). See Spatial reference system.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      latLngToPoint( + <LatLng> latlng, + <Number> zoom ) + PointProjects geographical coordinates on a given zoom into pixel coordinates.
      pointToLatLng( + <Point> point, + <Number> zoom ) + LatLngThe inverse of latLngToPoint. Projects pixel coordinates on a given zoom into geographical coordinates.
      project( + <LatLng> latlng ) + PointProjects geographical coordinates into coordinates in units accepted for this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).
      scale( + <Number> zoom ) + NumberReturns the scale used when transforming projected coordinates into pixel coordinates for a particular zoom. For example, it returns 256 * 2^zoom for Mercator-based CRS.
      + +

      Properties

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      projectionIProjectionProjection that this CRS uses.
      transformationTransformationTransformation that this CRS uses to turn projected coordinates into screen coordinates for a particular tile service.
      codeStringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857').
      + +

      Defined CRS

      + +

      Leaflet comes with a set of already defined CRS to use out of the box:

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ProjectionDescription
      L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial tile providers. Uses Spherical Mercator projection. Set in by default in Map's crs option.
      L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
      L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
      L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps).
      + +

      If you want to use some obscure CRS not listed here, take a look at the Proj4Leaflet plugin.

      + +

      Global Switches

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      From 8f329343f583245ac774308b181c7fc1e6e3f261 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 16:12:20 +0300 Subject: [PATCH 0214/2207] fix sample maps border and margins --- docs/css/screen.css | 8 +++++--- examples/custom-icons.md | 6 +++--- examples/layers-control.md | 2 +- examples/quick-start.md | 8 ++++---- index.md | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 06bbbe25c0e..8d5e38a6a7c 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -304,11 +304,13 @@ a.nodocs { color: #bbb; } +.container .map { + border: 1px solid #ccc; + margin: 1.5em 0; +} + #map { height: 320px; - border: 1px solid #ccc; - margin-bottom: 20px; - margin-top: 34px; /*box-shadow: 0px 0px 10px #ccc; -moz-box-shadow: 0px 0px 10px #ccc; diff --git a/examples/custom-icons.md b/examples/custom-icons.md index 4928840eb18..51a88d6b35e 100644 --- a/examples/custom-icons.md +++ b/examples/custom-icons.md @@ -3,11 +3,11 @@ layout: tutorial title: Markers With Custom Icons --- -### Markers With Custom Icons +## Markers With Custom Icons In this tutorial, you'll learn how to easily define your own icons for use by the markers you put on the map. -
      +
      [View example on a separate page →](custom-icons-example.html) @@ -44,7 +44,7 @@ Now putting a marker with this icon on a map is easy: L.marker([51.5, -0.09], {icon: greenIcon}).addTo(map); -
      +
      ### Defining an icon class diff --git a/examples/layers-control.md b/examples/layers-control.md index f30d14855d7..5d3b7ebe550 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -7,7 +7,7 @@ title: Layer Groups and Layers Control This tutorial will show you how to group several layers into one, and how to use the layers control to allow users to easily switch different layers on your map. -
      +
      [View example on a separate page →](ayers-control-example.html) diff --git a/examples/quick-start.md b/examples/quick-start.md index c30abe7ce6b..85bd31a16a4 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -8,7 +8,7 @@ title: Quick Start Guide This step-by-step guide will quickly get you started on Leaflet basics, including setting up a Leaflet map, working with markers, polylines and popups, and dealing with events. -
      +
      [View example on a separate page →](quick-start-example.html) @@ -41,7 +41,7 @@ Now you're ready to initialize the map and do some stuff with it. ### Setting up the map -
      +
      Let's create a map of the center of London with pretty CloudMade tiles. First we'll initialize the map and set its view to our chosen geographical coordinates and a zoom level: @@ -66,7 +66,7 @@ It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enf ### Markers, circles and polygons -
      +
      Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker: @@ -91,7 +91,7 @@ Adding a polygon is as easy: ### Working with popups -
      +
      Popups are usually used when you want to attach some information to a particular object on a map. Leaflet has a very handy shortcut for this: diff --git a/index.md b/index.md index 5677c9e03b0..ee29a0c1f32 100644 --- a/index.md +++ b/index.md @@ -11,7 +11,7 @@ It is built from the ground up to work efficiently on both desktop and mobile pl {: .usedby} Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data.com](http://city-data.com) [CityMaps](http://www.citymaps.com) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [skobbler](http://maps.skobbler.com/) ... -
      +
      In this basic example, we create a map with tiles of our choice, add a marker and bind a popup with some text to it: From 5d57d208fe7ff1981a7df8446fc1266eebcd1a65 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 26 Jul 2012 16:58:48 +0300 Subject: [PATCH 0215/2207] minor style tweaks --- docs/css/screen.css | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 8d5e38a6a7c..631098eb6e4 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -10,12 +10,10 @@ body { padding: 15px 40px 20px; width: 790px; - border: 1px solid #dfdfdf; + /*border: 1px solid #dfdfdf;*/ border-top: 0; - box-shadow: 0 0 50px rgba(0,0,0,0.1); - -moz-box-shadow: 0 0 50px rgba(0,0,0,0.1); - -webkit-box-shadow: 0 0 50px rgba(0,0,0,0.1); + box-shadow: 0 0 60px rgba(0,0,0,0.15); } h1 { margin-bottom: 10px; From bbe6a94a81f867310da10a3ec989c0da196bd886 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 26 Jul 2012 15:43:24 -0600 Subject: [PATCH 0216/2207] Explaining the filter option. --- examples/geojson.html | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/examples/geojson.html b/examples/geojson.html index fe37c8eead1..83833c9b4f8 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -131,7 +131,43 @@

      onEachFeature

      filter

      -

      The filter option is used to ...

      +

      The filter option can be used to control the visibility of GeoJSON features. To accomplish this we pass a function as the filter option. This function gets called for each feature in your GeoJSON layer, and gets passed the feature and the layer. You can then utilise the values in the feature's properties to control the visibility by returning true or false.

      + +

      In the example below "Busch Field" will not be shown on the map.

      + +
      var someFeatures = {
      +	"type": "FeatureCollection",
      +	"features": [
      +		{
      +			"type": "Feature",
      +			"properties": {
      +				"name": "Coors Field",
      +				"show_on_map": true
      +			},
      +			"geometry": {
      +				"type": "Point",
      +				"coordinates": [-104.99404, 39.75621]
      +			}
      +		},
      +		{
      +			"type": "Feature",
      +			"properties": {
      +				"name": "Busch Field",
      +				"show_on_map": false
      +			},
      +			"geometry": {
      +				"type": "Point",
      +				"coordinates": [-104.98404, 39.74621]
      +			}
      +		}
      +	]
      +};
      +
      +L.geoJson(someFeatures, {
      +	filter: function(feature, layer) {
      +		return feature.properties.show_on_map;
      +	}
      +}).addTo(map);

      Popups

      From 57c13390e91b56afef42b2be6e06f3328d532acc Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Thu, 26 Jul 2012 16:50:57 -0600 Subject: [PATCH 0217/2207] Style tutorial --- examples/geojson.html | 106 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/examples/geojson.html b/examples/geojson.html index 83833c9b4f8..93f05129b18 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -123,7 +123,111 @@

      Options

      style

      -

      The style option is used to ...

      +

      The style option can be used to style features two different ways. We can pass a simple object that styles all paths (polylines and polygons) the same way.

      + +
      var myStyle = {
      +	"color": "#ff7800",
      +	"weight": 5,
      +	"opacity": 0.65
      +};
      +
      +var myLines = {
      +	"type": "GeometryCollection",
      +	"features": [
      +		{
      +			"type": "LineString",
      +			"coordinates": [
      +				[-100, 40],
      +				[-105, 45],
      +				[-110, 55]
      +			]
      +		},
      +		{
      +			"type": "LineString",
      +			"coordinates": [
      +				[-105, 40],
      +				[-110, 45],
      +				[-115, 55]
      +			]
      +		}
      +	]
      +};
      +
      +L.geoJson(myLines, {
      +	style: myStyle
      +}).addTo(map);
      + +

      Alternatively, we can pass an function that styles individual features based on their properties. In the example below we check the "party" property and style our polygons accordingly.

      + +
      var republicanStyle = {
      +	"color": "#ff0000",
      +	"opacity": 1,
      +	"weight": 2,
      +	"fillOpacity": 0.4,
      +	"fillColor": "#ff0000"
      +
      +};
      +
      +var democratStyle = {
      +	"color": "#0000ff",
      +	"opacity": 1,
      +	"weight": 2,
      +	"fillOpacity": 0.4,
      +	"fillColor": "#0000ff"
      +
      +};
      +
      +var states = {
      +	"type": "FeatureCollection",
      +	"features": [
      +		{
      +			"type": "Feature",
      +			"properties": {
      +				"party": "Republican"
      +			},
      +			"geometry": {
      +				"type": "Polygon",
      +				"coordinates": [
      +					[
      +						[-104.05, 48.99],
      +						[-97.22, 48.98],
      +						[-96.58, 45.94],
      +						[-104.03, 45.94],
      +						[-104.05, 48.99]
      +					]
      +				]
      +			}
      +		},
      +		{
      +			"type": "Feature",
      +			"properties": {
      +				"party": "Democrat"
      +			},
      +			"geometry": {
      +				"type": "Polygon",
      +				"coordinates": [
      +					[
      +						[-109.05, 41.00],
      +						[-102.06, 40.99],
      +						[-102.03, 36.99],
      +						[-109.04, 36.99],
      +						[-109.05, 41.00]
      +					]
      +				]
      +			}
      +		}
      +	]
      +};
      +
      +L.geoJson(states, {
      +	style: function(feature) {
      +		if (feature.properties.party === "Republican") {
      +			return republicanStyle;
      +		} else if (feature.properties.party === "Democrat") {
      +			return democratStyle;
      +		}
      +	}
      +}).addTo(map);

      onEachFeature

      From 72c81f0f677ada39a2350aa714b776b8b77f1f3d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 27 Jul 2012 13:19:51 +0300 Subject: [PATCH 0218/2207] update docs and other minor things --- download.md | 2 +- index.md | 4 ++-- reference.html | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/download.md b/download.md index 5cf58c03b4c..89f79568b5c 100644 --- a/download.md +++ b/download.md @@ -14,7 +14,7 @@ Besides the library itself, the download package contains full source code, unit Leaflet 0.4 - Stable version, released on July 27, 2012 + Stable version, released on July 30, 2012 Leaflet 0.3.1 diff --git a/index.md b/index.md index ee29a0c1f32..8df52b39e08 100644 --- a/index.md +++ b/index.md @@ -2,14 +2,14 @@ layout: default --- -

      July 27, 2012 — Leaflet 0.4 Released with Lots of Exciting Improvements! — Read More in the Blog

      +

      July 30, 2012 — Leaflet 0.4 Released with Lots of Exciting Improvements! — Read More in the Blog

      Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 26 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. {: .usedby} -Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data.com](http://city-data.com) [CityMaps](http://www.citymaps.com) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [skobbler](http://maps.skobbler.com/) ... +Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data.com](http://city-data.com) [Topix](http://topix.com/) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [CityMaps](http://www.citymaps.com) ...
      diff --git a/reference.html b/reference.html index 5275ee29a3b..3700733d011 100644 --- a/reference.html +++ b/reference.html @@ -1494,6 +1494,12 @@

      Options

      1.0 The opacity of the tile layer. + + zIndex + Number + null + The explicit zIndex of the tile layer. Not set by default. + unloadInvisibleTiles Boolean @@ -1586,6 +1592,14 @@

      Methods

      this Changes the opacity of the tile layer. + + setZIndex( + <Number> zIndex ) + + + this + Sets the zIndex of the tile layer. + redraw() - @@ -3721,6 +3735,12 @@

      Options

      true If true, the control will be collapsed into an icon and expanded on mouse hover or touch. + + autoZIndex + Boolean + true + If true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + From 4da5ae5e20d2116c673ebfc6b7a90d8443540943 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 27 Jul 2012 15:18:52 +0300 Subject: [PATCH 0219/2207] add keyboard nav docs --- reference.html | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/reference.html b/reference.html index 3700733d011..4f4a069e515 100644 --- a/reference.html +++ b/reference.html @@ -277,6 +277,35 @@

      Interaction Options

      +

      Keyboard Navigation Options

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      keyboardBooleantrueMakes the map focusable and allows users to navigate the map with keyboard arrows and +/- keys.
      keyboardPanOffsetNumber80Amount of pixels to pan when pressing an arrow key.
      keyboardZoomOffsetNumber1Number of zoom levels to change when pressing + or - key.
      +

      Panning Inertia Options

      @@ -936,6 +965,11 @@

      Properties

      + + + + + From e57cce2678cf430fc0a313bcb065f792adb2958a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 27 Jul 2012 17:59:28 +0300 Subject: [PATCH 0220/2207] document keyboard events, highlight focused maps --- docs/css/screen.css | 3 +++ reference.html | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/docs/css/screen.css b/docs/css/screen.css index 631098eb6e4..417a95baf77 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -306,6 +306,9 @@ a.nodocs { border: 1px solid #ccc; margin: 1.5em 0; } +.container .map:focus { + border-color: #999; +} #map { height: 320px; diff --git a/reference.html b/reference.html index 4f4a069e515..8e82a0d1ad6 100644 --- a/reference.html +++ b/reference.html @@ -444,6 +444,16 @@

      Events

      + + + + + + + + + + +
      IHandler Box (shift-drag with mouse) zoom handler.
      keyboardIHandlerKeyboard navigation handler.
      zoomControl Control.ZoomMouseEvent Fired when the user pushes the right mouse button on the map, prevents default browser context menu from showing if there are listeners on this event.
      focusEvent + Fired when the user focuses the map either by tabbing to it or clicking/panning.
      blurEvent + Fired when the map looses focus.
      preclick MouseEvent From 81746a8aaed71feb02045ac14d9f3b057ab6e9cd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 27 Jul 2012 18:34:24 +0300 Subject: [PATCH 0221/2207] update features --- features.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features.html b/features.html index 9f7a86ffafa..f753579fba8 100644 --- a/features.html +++ b/features.html @@ -39,7 +39,8 @@

      On Desktop Browsers

      • Scroll wheel zoom
      • Double click zoom
      • -
      • Shift-drag zoom to bounding box
      • +
      • Zoom to area (shift-drag)
      • +
      • Keyboard navigation (with arrows and +/- keys)
      From facdcbfbdff74f35b15f4e6a6400f6d3ef4d23d5 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Sat, 28 Jul 2012 00:41:12 -0600 Subject: [PATCH 0222/2207] Finishing up GeoJSON tutorial. --- examples/geojson-example.html | 143 +++++++++++++++------------------- examples/geojson.html | 142 +++++++++++---------------------- 2 files changed, 109 insertions(+), 176 deletions(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 20a4d25efd6..9afed090cf2 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -1,106 +1,89 @@ - Leaflet GeoJSON example + Leaflet Layers Control Example + - - - -
      + + + diff --git a/examples/geojson.html b/examples/geojson.html index 93f05129b18..66ffbef6814 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -229,9 +229,54 @@

      style

      } }).addTo(map); +

      pointToLayer

      + +

      Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

      + +

      Here we're using the pointToLayer option to create a CircleMarker:

      + +
      var geojsonMarkerOptions = {
      +	radius: 8,
      +	fillColor: "#ff7800",
      +	color: "#000",
      +	weight: 1,
      +	opacity: 1,
      +	fillOpacity: 0.8
      +};
      +
      +L.geoJson(someGeojsonFeature, {
      +	pointToLayer: function (feature, latlng) {
      +		return L.circleMarker(latlng, geojsonMarkerOptions);
      +	}
      +}).addTo(map);
      +

      onEachFeature

      -

      The onEachFeature option is used to ...

      +

      The onEachFeature option is a function that gets triggered when each feature added to a GeoJSON layer. A common reason to use this option is to attach a popup to features when they are clicked.

      + +
      function onEachFeature (feature, layer) {
      +	// Does this feature have a property named popupContent?
      +	if (feature.properties && feature.properties.popupContent) {
      +		layer.bindPopup(feature.properties.popupContent);
      +	}
      +}
      +
      +var geojsonFeature = {
      +	"type": "Feature",
      +	"properties": {
      +		"name": "Coors Field",
      +		"amenity": "Baseball Stadium",
      +		"popupContent": "This is where the Rockies play!"
      +	},
      +	"geometry": {
      +		"type": "Point",
      +		"coordinates": [-104.99404, 39.75621]
      +	}
      +};
      +
      +L.geoJson(geojsonFeature, {
      +	onEachFeature: onEachFeature
      +}).addTo(map);

      filter

      @@ -273,99 +318,4 @@

      filter

      } }).addTo(map); -

      Popups

      - -

      We can use popups to show information about features when they are clicked. To accomplish this we'll utilise the onEachFeature option of the GeoJSON layer.

      - -
      function onEachFeature (feature, layer) {
      -	// Does this feature have a property named popupContent
      -	if (feature.properties && feature.properties.popupContent) {
      -		layer.bindPopup(feature.properties.popupContent);
      -	}
      -}
      -
      -var geojsonFeature = {
      -	"type": "Feature",
      -	"properties": {
      -		"name": "Coors Field",
      -		"amenity": "Baseball Stadium",
      -		"popupContent": "This is where the Rockies play!"
      -	},
      -	"geometry": {
      -		"type": "Point",
      -		"coordinates": [-104.99404, 39.75621]
      -	}
      -};
      -
      -L.geoJson(geojsonFeature, {
      -	onEachFeature: onEachFeature
      -}).addTo(map);
      - -

      Styling Features

      - -

      We can also listen to the featureparse event to style our Polyline and Polygon features. As with our popup content, we can store our styling information in the properties of the GeoJSON object as well. These style properties should match those found in path options. Our feature with styling information might look something like:

      - -
      var freeBus = {
      -	"type": "Feature",
      -	"geometry": {
      -		"type": "LineString",
      -		"coordinates": [
      -			[-104.98726, 39.74136],
      -			[-104.98720, 39.74132],
      -			[-104.98715, 39.74127],
      -			[-104.98713, 39.74117],
      -			[-104.98712, 39.74106], ...
      -		]
      -	},
      -	"properties": {
      -		"name": "16th Street Free Bus",
      -		"style": {
      -			"color": "#004070",
      -			"weight": 4,
      -			"opacity": 0.9
      -		},
      -		"popupContent": "This is the 16th street free bus ..."
      -	}
      -};
      - -

      To change the feature's style from the Leaflet default, we simply call the setStyle method on our layer (e.layer) in our featureparse event listener.

      - -
      geojsonLayer.on("featureparse", function (e){
      -	if (e.properties && e.properties.style && e.layer.setStyle){
      -		// The setStyle method isn't available for Points. More on that below ...
      -		e.layer.setStyle(e.properties.style);
      -	}
      -});
      - -

      Styling Points

      - -

      Points are handled differently than polylines and polygons. By default simple markers are drawn for GeoJSON Points. We can alter this by passing a pointToLayer function in a GeoJSON options object when creating the GeoJSON layer. This function is passed a LatLng and should return an instance of ILayer, in this case likely a Marker or CircleMarker.

      - -

      Here we're using a CircleMarker:

      - -
      var geojsonMarkerOptions = {
      -	radius: 8,
      -	fillColor: "#ff7800",
      -	color: "#000",
      -	weight: 1,
      -	opacity: 1,
      -	fillOpacity: 0.8
      -};
      -
      -var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
      -	pointToLayer: function (latlng) {
      -		return new L.CircleMarker(latlng, geojsonMarkerOptions);
      -	}
      -});
      - -

      And here's an example of using a custom Marker:

      - -
      var geojsonLayer = new L.GeoJSON(someGeojsonFeature, {
      -	pointToLayer: function (latlng) {
      -		return new L.Marker(latlng, {
      -			icon: new MyCustomIcon()
      -		});
      -	}
      -});
      -

      View the example page to see in detail what is possible with the GeoJSON layer.

      From 754e46c9b225596e77e33b3f013c7c7472316beb Mon Sep 17 00:00:00 2001 From: mourner Date: Sat, 28 Jul 2012 14:32:45 +0300 Subject: [PATCH 0223/2207] improve GeoJSON example --- examples/geojson-example.html | 6 +- examples/geojson.html | 205 +++++++++++++--------------------- 2 files changed, 79 insertions(+), 132 deletions(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 9afed090cf2..59e90b9048f 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -41,7 +41,7 @@ layer.bindPopup(popupContent); } - L.geoJson({features: [bicycleRental, campus]}, { + L.geoJson([bicycleRental, campus], { style: function (feature) { return feature.properties && feature.properties.style; @@ -74,7 +74,7 @@ onEachFeature: onEachFeature }).addTo(map); - var coorsLayer = L.geoJson(null, { + var coorsLayer = L.geoJson(coorsField, { pointToLayer: function (feature, latlng) { return L.marker(latlng, {icon: baseballIcon}); @@ -83,8 +83,6 @@ onEachFeature: onEachFeature }).addTo(map); - coorsLayer.addData(coorsField); - diff --git a/examples/geojson.html b/examples/geojson.html index 66ffbef6814..bf2e1b72015 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -7,7 +7,7 @@

      Using GeoJSON with Leaflet

      GeoJSON is becoming a very popular data format among many GIS technologies and services — it's simple, lightweight, straightforward, and Leaflet is quite good at handling it. In this example, you'll learn how to create and interact with map vectors created from GeoJSON objects.

      -
      +
      -

      View example on a separate page →

      +

      View example on a separate page →

      About GeoJSON

      @@ -91,11 +91,7 @@

      About GeoJSON

      GeoJSON is a format for encoding a variety of geographic data structures. A GeoJSON object may represent a geometry, a feature, or a collection of features. GeoJSON supports the following geometry types: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. Features in GeoJSON contain a geometry object and additional properties, and a feature collection represents a list of features.
      -

      Leaflet supports all of the GeoJSON types above but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. (see example)

      - -

      The GeoJSON layer

      - -

      GeoJSON objects are added to the map through a GeoJSON layer. To create a GeoJSON layer and add it to a map we can use the following code.

      +

      Leaflet supports all of the GeoJSON types above, but Features and FeatureCollections work best as they allow you to describe features with a set of properties. We can even use these properties to style our Leaflet vectors. Here's an example of a simple GeoJSON feature:

      var geojsonFeature = {
       	"type": "Feature",
      @@ -109,13 +105,17 @@ 

      The GeoJSON layer

      "coordinates": [-104.99404, 39.75621] } }; +
      + +

      The GeoJSON layer

      + +

      GeoJSON objects are added to the map through a GeoJSON layer. To create it and add it to a map, we can use the following code:

      -L.geoJson(geojsonFeature).addTo(map); +
      L.geoJson(geojsonFeature).addTo(map);

      Alternatively, we could create an empty GeoJSON layer and assign it to a variable so that we can add more features to it later.

      var myLayer = L.geoJson().addTo(map);
      -
       myLayer.addData(geojsonFeature);
       
      @@ -123,108 +123,61 @@

      Options

      style

      -

      The style option can be used to style features two different ways. We can pass a simple object that styles all paths (polylines and polygons) the same way.

      +

      The style option can be used to style features two different ways. First, we can pass a simple object that styles all paths (polylines and polygons) the same way:

      + +
      var myLines = [{
      +	"type": "LineString",
      +	"coordinates": [[-100, 40], [-105, 45], [-110, 55]]
      +}, {
      +	"type": "LineString",
      +	"coordinates": [[-105, 40], [-110, 45], [-115, 55]]
      +}];
       
      -
      var myStyle = {
      +var myStyle = {
       	"color": "#ff7800",
       	"weight": 5,
       	"opacity": 0.65
       };
       
      -var myLines = {
      -	"type": "GeometryCollection",
      -	"features": [
      -		{
      -			"type": "LineString",
      -			"coordinates": [
      -				[-100, 40],
      -				[-105, 45],
      -				[-110, 55]
      -			]
      -		},
      -		{
      -			"type": "LineString",
      -			"coordinates": [
      -				[-105, 40],
      -				[-110, 45],
      -				[-115, 55]
      -			]
      -		}
      -	]
      -};
      -
       L.geoJson(myLines, {
       	style: myStyle
       }).addTo(map);
      -

      Alternatively, we can pass an function that styles individual features based on their properties. In the example below we check the "party" property and style our polygons accordingly.

      +

      Alternatively, we can pass a function that styles individual features based on their properties. In the example below we check the "party" property and style our polygons accordingly:

      -
      var republicanStyle = {
      -	"color": "#ff0000",
      -	"opacity": 1,
      -	"weight": 2,
      -	"fillOpacity": 0.4,
      -	"fillColor": "#ff0000"
      -
      -};
      -
      -var democratStyle = {
      -	"color": "#0000ff",
      -	"opacity": 1,
      -	"weight": 2,
      -	"fillOpacity": 0.4,
      -	"fillColor": "#0000ff"
      -
      -};
      -
      -var states = {
      -	"type": "FeatureCollection",
      -	"features": [
      -		{
      -			"type": "Feature",
      -			"properties": {
      -				"party": "Republican"
      -			},
      -			"geometry": {
      -				"type": "Polygon",
      -				"coordinates": [
      -					[
      -						[-104.05, 48.99],
      -						[-97.22, 48.98],
      -						[-96.58, 45.94],
      -						[-104.03, 45.94],
      -						[-104.05, 48.99]
      -					]
      -				]
      -			}
      -		},
      -		{
      -			"type": "Feature",
      -			"properties": {
      -				"party": "Democrat"
      -			},
      -			"geometry": {
      -				"type": "Polygon",
      -				"coordinates": [
      -					[
      -						[-109.05, 41.00],
      -						[-102.06, 40.99],
      -						[-102.03, 36.99],
      -						[-109.04, 36.99],
      -						[-109.05, 41.00]
      -					]
      -				]
      -			}
      -		}
      -	]
      -};
      +
      var states = [{
      +	"type": "Feature",
      +	"properties": {"party": "Republican"},
      +	"geometry": {
      +		"type": "Polygon",
      +		"coordinates": [[
      +			[-104.05, 48.99],
      +			[-97.22,  48.98],
      +			[-96.58,  45.94],
      +			[-104.03, 45.94],
      +			[-104.05, 48.99]
      +		]]
      +	}
      +}, {
      +	"type": "Feature",
      +	"properties": {"party": "Democrat"},
      +	"geometry": {
      +		"type": "Polygon",
      +		"coordinates": [[
      +			[-109.05, 41.00],
      +			[-102.06, 40.99],
      +			[-102.03, 36.99],
      +			[-109.04, 36.99],
      +			[-109.05, 41.00]
      +		]]
      +	}
      +}];
       
       L.geoJson(states, {
       	style: function(feature) {
      -		if (feature.properties.party === "Republican") {
      -			return republicanStyle;
      -		} else if (feature.properties.party === "Democrat") {
      -			return democratStyle;
      +		switch (feature.properties.party) {
      +			case 'Republican': return {color: "#ff0000"};
      +			case 'Democrat':   return {color: "#0000ff"};
       		}
       	}
       }).addTo(map);
      @@ -250,13 +203,15 @@

      pointToLayer

      } }).addTo(map);
      +

      We could also set the style property in this example — Leaflet is smart enough to apply styles to GeoJSON points if you create a vector layer like circle inside the pointToLayer function.

      +

      onEachFeature

      -

      The onEachFeature option is a function that gets triggered when each feature added to a GeoJSON layer. A common reason to use this option is to attach a popup to features when they are clicked.

      +

      The onEachFeature option is a function that gets called on each feature before adding it to a GeoJSON layer. A common reason to use this option is to attach a popup to features when they are clicked.

      -
      function onEachFeature (feature, layer) {
      -	// Does this feature have a property named popupContent?
      -	if (feature.properties && feature.properties.popupContent) {
      +
      function onEachFeature(feature, layer) {
      +	// does this feature have a property named popupContent?
      +	if (feature.properties && feature.properties.popupContent) {
       		layer.bindPopup(feature.properties.popupContent);
       	}
       }
      @@ -284,33 +239,27 @@ 

      filter

      In the example below "Busch Field" will not be shown on the map.

      -
      var someFeatures = {
      -	"type": "FeatureCollection",
      -	"features": [
      -		{
      -			"type": "Feature",
      -			"properties": {
      -				"name": "Coors Field",
      -				"show_on_map": true
      -			},
      -			"geometry": {
      -				"type": "Point",
      -				"coordinates": [-104.99404, 39.75621]
      -			}
      -		},
      -		{
      -			"type": "Feature",
      -			"properties": {
      -				"name": "Busch Field",
      -				"show_on_map": false
      -			},
      -			"geometry": {
      -				"type": "Point",
      -				"coordinates": [-104.98404, 39.74621]
      -			}
      -		}
      -	]
      -};
      +
      var someFeatures = [{
      +	"type": "Feature",
      +	"properties": {
      +		"name": "Coors Field",
      +		"show_on_map": true
      +	},
      +	"geometry": {
      +		"type": "Point",
      +		"coordinates": [-104.99404, 39.75621]
      +	}
      +}, {
      +	"type": "Feature",
      +	"properties": {
      +		"name": "Busch Field",
      +		"show_on_map": false
      +	},
      +	"geometry": {
      +		"type": "Point",
      +		"coordinates": [-104.98404, 39.74621]
      +	}
      +}];
       
       L.geoJson(someFeatures, {
       	filter: function(feature, layer) {
      
      From 706159078479188782965fd130dffff3be45ffbf Mon Sep 17 00:00:00 2001
      From: mourner 
      Date: Sun, 29 Jul 2012 02:20:15 +0300
      Subject: [PATCH 0224/2207] add developer blog and release post
      
      ---
       _layouts/default.html                     |   4 +-
       _layouts/post.html                        |  13 ++
       _posts/2012-07-30-leaflet-0-4-released.md | 233 ++++++++++++++++++++++
       atom.xml                                  |  31 +++
       blog.md                                   |  19 +-
       docs/css/screen.css                       |  23 ++-
       examples.md                               |   2 +-
       index.md                                  |   2 +-
       8 files changed, 315 insertions(+), 12 deletions(-)
       create mode 100644 _layouts/post.html
       create mode 100644 _posts/2012-07-30-leaflet-0-4-released.md
       create mode 100644 atom.xml
      
      diff --git a/_layouts/default.html b/_layouts/default.html
      index 9b3ca05474a..40e947f9cf1 100644
      --- a/_layouts/default.html
      +++ b/_layouts/default.html
      @@ -21,6 +21,8 @@
       
       	
       
      +	
      +
       	
       	
       	
      @@ -121,7 +123,7 @@ 

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv {% if page.title == 'Blog' %} Blog {% else %} - Blog + Blog {% endif %}
    60. Forum
    61. diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 00000000000..d7886299cff --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,13 @@ +--- +layout: default +root: ../../../ +post: true +--- + +

      ← Back to the list of blog posts

      + +

      {{ page.title }}

      + + + +{{ content }} diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md new file mode 100644 index 00000000000..42f7f1e2840 --- /dev/null +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -0,0 +1,233 @@ +--- +layout: post +title: Leaflet 0.4 Released +description: After 5.5 months of development with 32 contributors involved, I'm proud to announce the release of Leaflet 0.4! It comes with a simpler API and lots of great improvements, along with a major update to documentation, a plugins page and the launch of the developer blog. +--- + +After 5.5 months of development with [32 contributors](https://github.com/CloudMade/Leaflet/graphs/contributors?from=2012-02-15&to=2012-07-30&type=c) involved since the previous stable release, I'm proud to announce the release of Leaflet 0.4! It comes with a simpler API and *lots* of great improvements and important bugfixes, along with a major update to documentation, an official plugins page and the launch of this developer blog. Lets take a look at the improvements one by one. + +### Simpler API + +Leaflet 0.4 contains several API improvements that allow you to write simpler, terser code ([jQuery](http://jquery.com)-like), while being backwards compatible with the previous approach (so that you can use both styles). + + L.marker([51.5, -0.09]) + .addTo(map) + .bindPopup('Hello world!') + .openPopup(); + +First, Leaflet methods now accept [LatLng][], [LatLngBounds][], [Point][] and [Bounds][] objects in a simple array form, so you don't need to always create them explicitly: + + map.panTo([50, 30]); // the same as: + map.panTo(new L.LatLng(50, 30)); + +Second, Map methods like [addLayer][], [addControl][], [openPopup][] got their counterparts from the other side: + + marker.addTo(map); // same as map.addLayer(marker) + control.addTo(map); // map.addControl(control) + popup.openOn(map); // map.openPopup(popup) + +Along with the fact that all Leaflet methods that don't explicitly return a value return the object itself, this allows for convenient method chaining. + +Third, Leaflet classes now come with lowercase shortcuts (class factories) that allow you to create objects without the new keyword, which makes chained code look nicer: + + L.map('map').fitWorld(); // same as + (new L.Map('map')).fitWorld(); + +### Notable New Features + +
      + +#### Improved Zoom Animation + +Markers, popups, vector layers and image overlays were hidden during zoom in the previous version, but now (thanks to [Dave Leaver][]) they all have beautiful, smooth zoom animation unlike any other existing mapping libraries. Try zooming on the map above to see how it looks! If you have thousands of markers on a map though, you can turn off the marker animation if it gets slow with the Map's `markerZoomAnimation` option. + +In addition, now tiles won't disappear if you zoom in or out more than once quickly. + +#### Keyboard Navigation + +Leaflet maps got a nice accessibility boost in 0.4 with the new keyboard handler (contributed by [Eric Martinez](https://github.com/ericmmartinez)), enabled by default. It allows users to navigate the map by using arrow keys for panning and +/- keys for zooming (after making the map focused either by tabbing to it or clicking on it). Try it on the map above, it feels very nice! + +#### Panning Inertia + +Another nice improvement comes to the panning experience --- now it has an inertial movement effect, where the map smoothly continues to move after a quick pan. Feels especially natural on touch devices --- and it's enabled by default too, try it now! It's also highly configurable, allowing you to set the maximum speed of the effect, decceleration, and time threshold under which it triggers. + +#### Pinch-Zoom on Android 4 + +In the previous Leaflet version, pinch-zoom only worked on iOS devices, but now comes finally to Android! Works from Android 4+ not only in the stock browser, but also on Chrome and Firefox for Android. + +#### Scale Control + +A simple, lightweight control that indicates the scale of the current map view in metric and/or imerial systems. As usual, you can customize its appearance with CSS. Take a look at the bottom left corner of the map above! + + L.control.scale().addTo(map); + +#### Polyline and Polygon Editing + +Allows users to edit polylines and polygons with a simple, intuitive interface. Note that this feature will eventually be merged into [Leaflet.draw][] --- an awesome plugin for drawing shapes by Jacob Toye. + + polygon.editing.enable(); + +#### Div-based Icons + +In addition to the image-based [Icon][] class, Leaflet 0.4 gets a [DivIcon][] class for creating lightweight div-based markers (that can contain custom HTML and can be styled with CSS). For example, you can see them in action when editing polylines (the square handles), or in the [Leaflet.markercluster][] plugin I'll talk about later (the colored clusters). + + L.marker([50.505, 30.57], { + icon: L.divIcon({className: 'my-div-icon'}) + }).addTo(map); + +#### Rectangle Layer + +Rectangle is a convenient shortcut for creating rectangular area layers. You could do this earlier with polygons, but this is easier: + + L.rectangle([[51.505, -0.03], [51.5, -0.045]]).addTo(map); + +### API improvements + +#### GeoJSON API + +[GeoJSON][] API was improved to be simpler and much more flexible. [Jason Sanford][] wrote a [great tutorial](../../../examples/geojson.html) that showcases the new API. The changes are not backwards-compatible though, so be sure to update your old code. + +#### Icon API + +[Icon][] API was improved to be simpler and more flexible, and the changes are not backwards-compatible too (the old code can be updated very quickly though). Check out the updated [Custom Icons tutorial](../../../examples/custom-icons.html), or head straigt to the [API docs](../../../reference.html#icon). + +#### Control API + +Custom Controls are much easier to create now --- checkout the [API docs](../../../reference.html#icontrol) that also have a simple example. + +#### Better Events API + +[Aaron King][] brough some improvements to [event methods](../../../reference.html#events). `on` and `off` methods can now accept multiple event types at once as a string space-separated types: + + map.on('click dblclick moveend', doStuff); + +Also, they can accept an object with types and listener functions as key/value pairs, like this: + + marker.on({ + click: onMarkerClick, + dragend: onMarkerDragEnd + }); + +Moreover, now if only specify an event type to the `off` method, it will remove all listeners tied to this event. + + map.off('click'); + +#### Other API Improvements + +Leaflet 0.4 features more than 30 new methods, options and events across different Leaflet classes that make the API more complete and powerful. Check out the [full changelog](https://github.com/CloudMade/Leaflet/blob/master/CHANGELOG.md#other-api-improvements) for the complete list. + +### Performance and Usability Improvements + +You may think that Leaflet is unbelievably fast already, but this version brings several performance improvements that makes it even faster. + + * Panning, map resizing and pinch-zoom performance was improved (some tricks behind this will be explained in a future blog post). + * Updating and removing vector layers on the canvas backend (e.g. on Android 2) works many times faster. + * Box shadows on controls were replaced with simple borders on mobile devices to improve performance. + * Vector layers won't flicker after each panning on iOS now. + +In addition, there are several usability improvents not already mentioned: + + * Panning now works even if there are markers under the cursor (helps on crowded maps). + * Popup appearance is slightly improved. + * Tile layer now has detectRetina option that, when enabled, doubles the tile resolution for retina displays (contributed by [Mithgol][]) . + +### Bugfixes + +Leaflet 0.4 brings around 45 bugfixes that make it more stable and reliable across all browsers and platforms. Notable bugfixes include the dreaded iOS bug that caused the map to completely disappear after pinch-zooming in some rare cases, broken zooming on IE10 beta, broken Leaflet maps on pages served with an XHTML content type, and incorrect zooming on maps inside a fixed-position element. + +Here's [a full list of bugfixes](https://github.com/CloudMade/Leaflet/blob/master/CHANGELOG.md#bug-fixes) in the changelog. + +### Upgrading from older versions + +Besides the GeoJSON and Icon changes mentioned above, here's a [list of potentially breaking changes](https://github.com/CloudMade/Leaflet/blob/master/CHANGELOG.md#other-breaking-api-changes) --- read it carefully when updating your code (shouldn't take much time though). + +Download options for Leaflet 0.4 (including the actual download, the CDN-hosted version, and intructions for building manually) are listed on the [download page](../../../download.html). + +### Documentation Update + +Until now, Leaflet API reference was incomplete. But for this release, enourmous effort was put into making it 100% complete, up-to-date and generally the best API reference page you've ever seen. All remaining classes, methods, options, events and properties were carefully documented and more code examples added, and the docs will always be kept up-to-date from now on. + +Besides, the design of the page was significantly improved --- with better colors, font, spacing, hyphenation, manually adjusted column widths, etc. --- lots of detail to make it beautiful and easy to read. + +### Plugins Page + +Leaflet website now has an official [plugins page](../../../plugins.html) that lists many Leaflet plugins created by the awesome Leaflet community, adding lots of great features and helping with service integration. + +One plugin I'd like to mention is [Leaflet.markercluster][] by [Dave Leaver], currently the best marker clustering plugin I've ever seen among any mapping libraries --- it's fast, beautiful, provides smooth animations for clusters, includes a smart Google Earth-style solution for crowded markers on the last zoom level (by [George MacKerron][]), can highlight the area covered by a cluster on hover, works well on mobile devices, and can be customized easily. I think we'll cover this plugin in more detail in one of the next posts. + +Another plugin to note is [Leaflet.draw][] by [Jacob Toye][], inspired by a similar plugin by [Bruno B](https://github.com/brunob). It enables drawing features like polylines, polygons, rectangles, circles and markers through a very nice user-friendly interface with icons and hints. Other editing-related code will probably move into this plugin in future. + +Also, thanks to [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin by [Kartena](http://www.kartena.se/), GIS enthusiasts can now enjoy Leaflet for maps with some quirky and rare projections. + +One more Leaflet-based creation everyone needs to check out is [OSM Buildings](http://flyjs.com/buildings/) by [Jan Marsch](http://flyjs.com/buildings/about.php), an amazing JS library for visualizing 3D OSM building data on top of Leaflet maps. Incredibly cool stuff. + +### Developer Blog + +This is the first post of the official Leaflet developer blog, that will become the main place for all important Leaflet-related news, tutorials, tips and development notes. + +### Big Players Using Leaflet + +Since the previous release, Leaflet got adopted by many great companies, including [Flickr](http://flickr.com/map), [foursquare](http://foursquare.com) and [Wikimedia Foundation](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) (featured on [frontpage](../../../index.html) now). This is a really exciting time for Leaflet and open source maps, and I look forward to see many other companies follow this awesome trend in future. + +### Thank You + +I'd like to thank all the awesome people that helped Leaflet becoming what it is now --- contributed code, reported bugs, used Leaflet on their websites, told collegues about it, talked about it on conferences, etc. Keep up the great work! + +Special thanks go to [Dave Leaver][] for his inspiring contributions including improved zoom animation and the state-of-the-art clustering plugin, and [Jason Sanford][] for his friendly support (and setting up the Leaflet CDN among other things). + +And, of course, thanks to my amazing company, [CloudMade](http://cloudmade.com), for embracing open source and supporting this development. + +Sinerely,
      +Vladimir Agafonkin, Leaflet maintainer. + + + [LatLng]: ../../../reference.html#latlng + [LatLngBounds]: ../../../reference.html#latlngbounds + [Point]: ../../../reference.html#point + [Bounds]: ../../../reference.html#bounds + [Icon]: ../../../reference.html#icon + [DivIcon]: ../../../reference.html#divicon + [GeoJSON]: ../../../reference.html#geojson + + [addControl]: ../../../reference.html#map-addcontrol + [addLayer]: ../../../reference.html#map-addlayer + [openPopup]: ../../../reference.html#map-openpopup + + [Leaflet.draw]: https://github.com/jacobtoye/Leaflet.draw + [Leaflet.markercluster]: https://github.com/danzel/Leaflet.markercluster + + [Dave Leaver]: https://github.com/danzel + [Jason Sanford]: https://github.com/JasonSanford + [Aaron King]: https://github.com/Guiswa + [Mithgol]: https://github.com/Mithgol + [George MacKerron]: https://github.com/jawj/ + [Jacob Toye]: https://github.com/jacobtoye + + diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000000..3efaa4132bf --- /dev/null +++ b/atom.xml @@ -0,0 +1,31 @@ +--- +layout: nil +title: Leaflet Developer Blog Atom Feed +--- + + + + Leaflet Dev Blog + + + + + {{ site.time | date_to_xmlschema }} + http://leaflet.cloudmade.com + + + + {% for post in site.posts %} + + {{ post.title }} + + {{ post.date | date_to_xmlschema }} + http://leaflet.cloudmade.com{{ post.id }} + {{ post.content | xml_escape }} + + {% endfor %} + + diff --git a/blog.md b/blog.md index 291e08766ba..f05409ad72a 100644 --- a/blog.md +++ b/blog.md @@ -3,4 +3,21 @@ layout: default title: Blog --- -Blog will be here. \ No newline at end of file +## Leaflet Developer Blog + +The main place for all important Leaflet-related news, tutorials, tips and development notes. + +--- + +{% for post in site.posts %} +
      + +
      +

      {{ post.title }}

      +

      {{ post.description }}

      +
      +
      +{% unless forloop.last %}
      {% endunless %} +{% endfor %} diff --git a/docs/css/screen.css b/docs/css/screen.css index 417a95baf77..f385889d8c6 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -310,14 +310,6 @@ a.nodocs { border-color: #999; } -#map { - height: 320px; - - /*box-shadow: 0px 0px 10px #ccc; - -moz-box-shadow: 0px 0px 10px #ccc; - -webkit-box-shadow: 0px 0px 10px #ccc;*/ - } - h3 span { color: #888; } @@ -507,3 +499,18 @@ p.notice { white-space: nowrap; overflow: hidden; } + +.post-title { + margin-top: 0; +} + +.post-date { + color: #777; + font-size: 18px; + line-height: 1; +} + +.post-meta { + color: #888; + margin-top: -1em; +} diff --git a/examples.md b/examples.md index 20cee828f5f..33d7dc8618b 100644 --- a/examples.md +++ b/examples.md @@ -24,7 +24,7 @@ In this tutorial, you'll learn how to create a fullscreen map tuned for mobile d *** [][3] -### [Markers With Custom Icons][3] +### [Markers with Custom Icons][3] In this pretty tutorial, you'll learn how to easily define your own icons for use by the markers you put on the map. diff --git a/index.md b/index.md index 8df52b39e08..55985d38187 100644 --- a/index.md +++ b/index.md @@ -11,7 +11,7 @@ It is built from the ground up to work efficiently on both desktop and mobile pl {: .usedby} Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data.com](http://city-data.com) [Topix](http://topix.com/) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [CityMaps](http://www.citymaps.com) ... -
      +
      In this basic example, we create a map with tiles of our choice, add a marker and bind a popup with some text to it: From 4b8e9e4a29e3b7666930113dedb13490484f1931 Mon Sep 17 00:00:00 2001 From: mourner Date: Mon, 30 Jul 2012 01:34:17 +0300 Subject: [PATCH 0225/2207] add disquis comments to posts --- _layouts/post.html | 16 ++++++++++++++++ docs/css/screen.css | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/_layouts/post.html b/_layouts/post.html index d7886299cff..8825a654b94 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -11,3 +11,19 @@

      {{ page.title }}

      {{ content }} + +
      + + + +comments powered by Disqus + diff --git a/docs/css/screen.css b/docs/css/screen.css index f385889d8c6..fd4025adc8c 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -514,3 +514,7 @@ p.notice { color: #888; margin-top: -1em; } + +#disqus_thread { + margin-top: 3em; +} From 9559344d3d4f042f210d96fe6e6a02f56a697657 Mon Sep 17 00:00:00 2001 From: mourner Date: Mon, 30 Jul 2012 01:34:53 +0300 Subject: [PATCH 0226/2207] minor fixes --- _posts/2012-07-30-leaflet-0-4-released.md | 16 ++++++++++++---- index.md | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index 42f7f1e2840..fac0c41e90a 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -53,7 +53,7 @@ Another nice improvement comes to the panning experience --- now it has an inert #### Pinch-Zoom on Android 4 -In the previous Leaflet version, pinch-zoom only worked on iOS devices, but now comes finally to Android! Works from Android 4+ not only in the stock browser, but also on Chrome and Firefox for Android. +In the previous Leaflet version, pinch-zoom only worked on iOS devices, but now it finally comes to Android! Works for Android 4+ not only in the stock browser, but also on Chrome and Firefox for Android. #### Scale Control @@ -108,7 +108,7 @@ Also, they can accept an object with types and listener functions as key/value p dragend: onMarkerDragEnd }); -Moreover, now if only specify an event type to the `off` method, it will remove all listeners tied to this event. +Moreover, now if you only specify an event type to the `off` method, it will remove all listeners tied to this event. map.off('click'); @@ -118,7 +118,7 @@ Leaflet 0.4 features more than 30 new methods, options and events across differe ### Performance and Usability Improvements -You may think that Leaflet is unbelievably fast already, but this version brings several performance improvements that makes it even faster. +You may think that Leaflet is unbelievably fast already, but this version brings several performance improvements that make it even faster. * Panning, map resizing and pinch-zoom performance was improved (some tricks behind this will be explained in a future blog post). * Updating and removing vector layers on the canvas backend (e.g. on Android 2) works many times faster. @@ -143,6 +143,14 @@ Besides the GeoJSON and Icon changes mentioned above, here's a [list of potentia Download options for Leaflet 0.4 (including the actual download, the CDN-hosted version, and intructions for building manually) are listed on the [download page](../../../download.html). +### Code Stats + +I'm still commited to keeping Leaflet as small and lightweight as possible. Here's a breakdown of the current size of the library: + + * JavaScript: **27 KB** minified and gzipped (102 KB minified, 176 KB in source, 7578 lines of code) + * CSS: **1.8 KB** gzipped (8 KB, 377 lines of code) + * Images: **10 KB** (5 PNG images) + ### Documentation Update Until now, Leaflet API reference was incomplete. But for this release, enourmous effort was put into making it 100% complete, up-to-date and generally the best API reference page you've ever seen. All remaining classes, methods, options, events and properties were carefully documented and more code examples added, and the docs will always be kept up-to-date from now on. @@ -177,7 +185,7 @@ Special thanks go to [Dave Leaver][] for his inspiring contributions including i And, of course, thanks to my amazing company, [CloudMade](http://cloudmade.com), for embracing open source and supporting this development. -Sinerely,
      +Sincerely,
      Vladimir Agafonkin, Leaflet maintainer. diff --git a/index.md b/index.md index 55985d38187..18cdb9980a8 100644 --- a/index.md +++ b/index.md @@ -4,7 +4,7 @@ layout: default

      July 30, 2012 — Leaflet 0.4 Released with Lots of Exciting Improvements! — Read More in the Blog

      -Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 26 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. +Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 27 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. From dbd875d960a3eaf243c882d10ae1585db94ae79c Mon Sep 17 00:00:00 2001 From: mourner Date: Mon, 30 Jul 2012 01:42:15 +0300 Subject: [PATCH 0227/2207] minor fixes --- _posts/2012-07-30-leaflet-0-4-released.md | 4 ++-- index.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index fac0c41e90a..6ed96f6d781 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -1,10 +1,10 @@ --- layout: post title: Leaflet 0.4 Released -description: After 5.5 months of development with 32 contributors involved, I'm proud to announce the release of Leaflet 0.4! It comes with a simpler API and lots of great improvements, along with a major update to documentation, a plugins page and the launch of the developer blog. +description: After 5.5 months of development with 33 contributors involved, I'm proud to announce the release of Leaflet 0.4! It comes with a simpler API and lots of great improvements, along with a major update to documentation, a plugins page and the launch of the developer blog. --- -After 5.5 months of development with [32 contributors](https://github.com/CloudMade/Leaflet/graphs/contributors?from=2012-02-15&to=2012-07-30&type=c) involved since the previous stable release, I'm proud to announce the release of Leaflet 0.4! It comes with a simpler API and *lots* of great improvements and important bugfixes, along with a major update to documentation, an official plugins page and the launch of this developer blog. Lets take a look at the improvements one by one. +After 5.5 months of development with [33 contributors](https://github.com/CloudMade/Leaflet/graphs/contributors?from=2012-02-15&to=2012-07-30&type=c) involved since the previous stable release, I'm proud to announce the release of Leaflet 0.4! It comes with a simpler API and *lots* of great improvements and important bugfixes, along with a major update to documentation, an official plugins page and the launch of this developer blog. Lets take a look at the improvements one by one. ### Simpler API diff --git a/index.md b/index.md index 18cdb9980a8..fe93e886b6d 100644 --- a/index.md +++ b/index.md @@ -2,7 +2,7 @@ layout: default --- -

      July 30, 2012 — Leaflet 0.4 Released with Lots of Exciting Improvements! — Read More in the Blog

      +

      July 30, 2012 — Leaflet 0.4 Released with Lots of Exciting Improvements! — Read More in the Blog

      Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] of [CloudMade][] with a team of dedicated [contributors][]. Weighing just about 27 KB of gzipped JS code, it still has all the [features][] most developers ever need for online maps, while providing a smooth, pleasant user experience. From be1ac7aff639a5a16db7b3ca234069a51f96e4af Mon Sep 17 00:00:00 2001 From: Alexander Parshin Date: Mon, 30 Jul 2012 03:50:44 +0400 Subject: [PATCH 0228/2207] Add TileLayer.BoundaryCanvas plugin description into plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index e2adba61c70..ead0a0e63b2 100644 --- a/plugins.md +++ b/plugins.md @@ -53,6 +53,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s George MacKerron
      + TileLayer.BoundaryCanvas + + Plugin allows to draw tiled raster layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. + + Alexander Parshin +
      From adc139f07e54f7e0693348e8e247a2fd1d830b7d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 30 Jul 2012 10:35:16 +0300 Subject: [PATCH 0229/2207] minor plugins page fix --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index ead0a0e63b2..4c9e79af9d4 100644 --- a/plugins.md +++ b/plugins.md @@ -57,7 +57,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s TileLayer.BoundaryCanvas - Plugin allows to draw tiled raster layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. + Allows you to draw tile layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. Alexander Parshin From 4a7eecbec943e13b8dcc874eeac47e8ac72a457d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 30 Jul 2012 11:17:10 +0300 Subject: [PATCH 0230/2207] final polishing --- _posts/2012-07-30-leaflet-0-4-released.md | 2 -- atom.xml | 7 +++---- blog.md | 2 +- download.md | 6 +++--- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index 6ed96f6d781..da2c3516aa8 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -212,7 +212,6 @@ Vladimir Agafonkin, Leaflet maintainer. [Jacob Toye]: https://github.com/jacobtoye diff --git a/atom.xml b/atom.xml index 3efaa4132bf..c998e841348 100644 --- a/atom.xml +++ b/atom.xml @@ -11,12 +11,11 @@ title: Leaflet Developer Blog Atom Feed {{ site.time | date_to_xmlschema }} - http://leaflet.cloudmade.com + http://leaflet.cloudmade.com/ - + {% for post in site.posts %} diff --git a/blog.md b/blog.md index f05409ad72a..74e85741a9c 100644 --- a/blog.md +++ b/blog.md @@ -5,7 +5,7 @@ title: Blog ## Leaflet Developer Blog -The main place for all important Leaflet-related news, tutorials, tips and development notes. +The main place for all important Leaflet-related news, tutorials, tips and development notes. [Subscribe to Atom feed](atom.xml) --- diff --git a/download.md b/download.md index 89f79568b5c..b0d3e8791ac 100644 --- a/download.md +++ b/download.md @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source From 2aeebe6473adcd079419f362b1e2947a549196a6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 30 Jul 2012 12:53:08 +0300 Subject: [PATCH 0231/2207] fix ugly marker shadows on iE8 --- dist/leaflet-src.js | 4 ++-- dist/leaflet.js | 2 +- src/layer/marker/Marker.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index 39fc495f7b0..ada423f5197 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -2901,7 +2901,7 @@ L.Marker = L.Class.extend({ } this._initInteraction(); - needOpacityUpdate = true; + needOpacityUpdate = (this.options.opacity < 1); L.DomUtil.addClass(this._icon, classToAdd); } @@ -2910,7 +2910,7 @@ L.Marker = L.Class.extend({ if (this._shadow) { L.DomUtil.addClass(this._shadow, classToAdd); - needOpacityUpdate = true; + needOpacityUpdate = (this.options.opacity < 1); } } diff --git a/dist/leaflet.js b/dist/leaflet.js index 61cf0d3de11..060cc64d001 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -3,4 +3,4 @@ Leaflet is an open-source JavaScript library for mobile-friendly interactive maps. http://leaflet.cloudmade.com */ -(function(e,t){var n,r;typeof exports!=t+""?n=exports:(r=e.L,n={},n.noConflict=function(){return e.L=r,this},e.L=n),n.version="0.4",n.Util={extend:function(e){var t=Array.prototype.slice.call(arguments,1);for(var n=0,r=t.length,i;n2?Array.prototype.slice.call(arguments,2):null;return function(){return e.apply(t,n||arguments)}},stamp:function(){var e=0,t="_leaflet_id";return function(n){return n[t]=n[t]||++e,n[t]}}(),limitExecByInterval:function(e,t,n){var r,i;return function s(){var o=arguments;if(r){i=!0;return}r=!0,setTimeout(function(){r=!1,i&&(s.apply(n,o),i=!1)},t),e.apply(n,o)}},falseFn:function(){return!1},formatNum:function(e,t){var n=Math.pow(10,t||5);return Math.round(e*n)/n},splitWords:function(e){return e.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(e,t){return e.options=n.Util.extend({},e.options,t),e.options},getParamString:function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+"="+e[n]);return"?"+t.join("&")},template:function(e,t){return e.replace(/\{ *([\w_]+) *\}/g,function(e,n){var r=t[n];if(!t.hasOwnProperty(n))throw Error("No value provided for variable "+e);return r})},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function t(t){var n,r,i=["webkit","moz","o","ms"];for(n=0;n0},removeEventListener:function(e,t,r){var s=this[i],o,u,a,f,l;if(typeof e=="object"){for(o in e)e.hasOwnProperty(o)&&this.removeEventListener(o,e[o],t);return this}e=n.Util.splitWords(e);for(u=0,a=e.length;u=0;l--)(!t||f[l].action===t)&&(!r||f[l].context===r)&&f.splice(l,1)}return this},fireEvent:function(e,t){if(!this.hasEventListeners(e))return this;var r=n.Util.extend({type:e,target:this},t),s=this[i][e].slice();for(var o=0,u=s.length;o=this.min.x&&r.x<=this.max.x&&t.y>=this.min.y&&r.y<=this.max.y},intersects:function(e){e=n.bounds(e);var t=this.min,r=this.max,i=e.min,s=e.max,o=s.x>=t.x&&i.x<=r.x,u=s.y>=t.y&&i.y<=r.y;return o&&u}}),n.bounds=function(e,t){return!e||e instanceof n.Bounds?e:new n.Bounds(e,t)},n.Transformation=n.Class.extend({initialize:function(e,t,n,r){this._a=e,this._b=t,this._c=n,this._d=r},transform:function(e,t){return this._transform(e.clone(),t)},_transform:function(e,t){return t=t||1,e.x=t*(this._a*e.x+this._b),e.y=t*(this._c*e.y+this._d),e},untransform:function(e,t){return t=t||1,new n.Point((e.x/t-this._b)/this._a,(e.y/t-this._d)/this._c)}}),n.DomUtil={get:function(e){return typeof e=="string"?document.getElementById(e):e},getStyle:function(e,t){var n=e.style[t];!n&&e.currentStyle&&(n=e.currentStyle[t]);if(!n||n==="auto"){var r=document.defaultView.getComputedStyle(e,null);n=r?r[t]:null}return n==="auto"?null:n},getViewportOffset:function(e){var t=0,r=0,i=e,s=document.body;do{t+=i.offsetTop||0,r+=i.offsetLeft||0;if(i.offsetParent===s&&n.DomUtil.getStyle(i,"position")==="absolute")break;if(n.DomUtil.getStyle(i,"position")==="fixed"){t+=s.scrollTop||0,r+=s.scrollLeft||0;break}i=i.offsetParent}while(i);i=e;do{if(i===s)break;t-=i.scrollTop||0,r-=i.scrollLeft||0,i=i.parentNode}while(i);return new n.Point(r,t)},create:function(e,t,n){var r=document.createElement(e);return r.className=t,n&&n.appendChild(r),r},disableTextSelection:function(){document.selection&&document.selection.empty&&document.selection.empty(),this._onselectstart||(this._onselectstart=document.onselectstart,document.onselectstart=n.Util.falseFn)},enableTextSelection:function(){document.onselectstart=this._onselectstart,this._onselectstart=null},hasClass:function(e,t){return e.className.length>0&&RegExp("(^|\\s)"+t+"(\\s|$)").test(e.className)},addClass:function(e,t){n.DomUtil.hasClass(e,t)||(e.className+=(e.className?" ":"")+t)},removeClass:function(e,t){function n(e,n){return n===t?"":e}e.className=e.className.replace(/(\S+)\s*/g,n).replace(/(^\s+|\s+$)/,"")},setOpacity:function(e,t){if("opacity"in e.style)e.style.opacity=t;else if(n.Browser.ie){var r=!1,i="DXImageTransform.Microsoft.Alpha";try{r=e.filters.item(i)}catch(s){}t=Math.round(t*100),r?(r.Enabled=t===100,r.Opacity=t):e.style.filter+=" progid:"+i+"(opacity="+t+")"}},testProp:function(e){var t=document.documentElement.style;for(var n=0;n=t.lat&&s.lat<=r.lat&&i.lng>=t.lng&&s.lng<=r.lng},intersects:function(e){e=n.latLngBounds(e);var t=this._southWest,r=this._northEast,i=e.getSouthWest(),s=e.getNorthEast(),o=s.lat>=t.lat&&i.lat<=r.lat,u=s.lng>=t.lng&&i.lng<=r.lng;return o&&u},toBBoxString:function(){var e=this._southWest,t=this._northEast;return[e.lng,e.lat,t.lng,t.lat].join(",")},equals:function(e){return e?(e=n.latLngBounds(e),this._southWest.equals(e.getSouthWest())&&this._northEast.equals(e.getNorthEast())):!1}}),n.latLngBounds=function(e,t){return!e||e instanceof n.LatLngBounds?e:new n.LatLngBounds(e,t)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(e){var t=n.LatLng.DEG_TO_RAD,r=this.MAX_LATITUDE,i=Math.max(Math.min(r,e.lat),-r),s=e.lng*t,o=i*t;return o=Math.log(Math.tan(Math.PI/4+o/2)),new n.Point(s,o)},unproject:function(e){var t=n.LatLng.RAD_TO_DEG,r=e.x*t,i=(2*Math.atan(Math.exp(e.y))-Math.PI/2)*t;return new n.LatLng(i,r,!0)}},n.Projection.LonLat={project:function(e){return new n.Point(e.lng,e.lat)},unproject:function(e){return new n.LatLng(e.y,e.x,!0)}},n.CRS={latLngToPoint:function(e,t){var n=this.projection.project(e),r=this.scale(t);return this.transformation._transform(n,r)},pointToLatLng:function(e,t){var n=this.scale(t),r=this.transformation.untransform(e,n);return this.projection.unproject(r)},project:function(e){return this.projection.project(e)},scale:function(e){return 256*Math.pow(2,e)}},n.CRS.EPSG3857=n.Util.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-0.5/Math.PI,.5),project:function(e){var t=this.projection.project(e),n=6378137;return t.multiplyBy(n)}}),n.CRS.EPSG900913=n.Util.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.Util.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(e,r){r=n.Util.setOptions(this,r),this._initContainer(e),this._initLayout(),this._initHooks(),this._initEvents(),r.maxBounds&&this.setMaxBounds(r.maxBounds),r.center&&r.zoom!==t&&this.setView(n.latLng(r.center),r.zoom,!0),this._initLayers(r.layers)},setView:function(e,t){return this._resetView(n.latLng(e),this._limitZoom(t)),this},setZoom:function(e){return this.setView(this.getCenter(),e)},zoomIn:function(){return this.setZoom(this._zoom+1)},zoomOut:function(){return this.setZoom(this._zoom-1)},fitBounds:function(e){var t=this.getBoundsZoom(e);return this.setView(n.latLngBounds(e).getCenter(),t)},fitWorld:function(){var e=new n.LatLng(-60,-170),t=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(e,t))},panTo:function(e){return this.setView(e,this._zoom)},panBy:function(e){return this.fire("movestart"),this._rawPanBy(n.point(e)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(e){e=n.latLngBounds(e),this.options.maxBounds=e;if(!e)return this._boundsMinZoom=null,this;var t=this.getBoundsZoom(e,!0);return this._boundsMinZoom=t,this._loaded&&(this._zoomo.x&&(u=o.x-i.x),r.y>s.y&&(a=s.y-r.y),r.xc&&--h>0)d=u*Math.sin(f),p=Math.PI/2-2*Math.atan(a*Math.pow((1-d)/(1+d),.5*u))-f,f+=p;return new n.LatLng(f*t,s,!0)}},n.CRS.EPSG3395=n.Util.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var e=n.Projection.Mercator,t=e.R_MAJOR,r=e.R_MINOR;return new n.Transformation(.5/(Math.PI*t),.5,-0.5/(Math.PI*r),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,r){r=n.Util.setOptions(this,r),r.detectRetina&&e.devicePixelRatio>1&&r.maxZoom>0&&(r.tileSize=Math.floor(r.tileSize/2),r.zoomOffset++,r.minZoom>0&&r.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;typeof i=="string"&&(this.options.subdomains=i.split(""))},onAdd:function(e){this._map=e,this._initContainer(),this._createTileProto(),e.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),e.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(e){return e.addLayer(this),this},onRemove:function(e){e._panes.tilePane.removeChild(this._container),e.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||e.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var e=this._map._panes.tilePane;return this._container&&(e.appendChild(this._container),this._setAutoZIndex(e,Math.max)),this},bringToBack:function(){var e=this._map._panes.tilePane;return this._container&&(e.insertBefore(this._container,e.firstChild),this._setAutoZIndex(e,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(e){return this.options.opacity=e,this._map&&this._updateOpacity(),this},setZIndex:function(e){return this.options.zIndex=e,this._updateZIndex(),this},setUrl:function(e,t){return this._url=e,t||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==t&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(e,t){var n=e.getElementsByClassName("leaflet-layer"),r=-t(Infinity,-Infinity),i;for(var s=0,o=n.length;sthis.options.maxZoom||r=t)||e.y<0||e.y>=t)return!1}return!0},_removeOtherTiles:function(e){var t,n,r,i;for(i in this._tiles)this._tiles.hasOwnProperty(i)&&(t=i.split(":"),n=parseInt(t[0],10),r=parseInt(t[1],10),(ne.max.x||re.max.y)&&this._removeTile(i))},_removeTile:function(e){var t=this._tiles[e];this.fire("tileunload",{tile:t,url:t.src}),this.options.reuseTiles?(n.DomUtil.removeClass(t,"leaflet-tile-loaded"),this._unusedTiles.push(t)):t.parentNode===this._container&&this._container.removeChild(t),n.Browser.android||(t.src=n.Util.emptyImageUrl),delete this._tiles[e]},_addTile:function(e,t){var r=this._getTilePos(e),i=this._getTile();n.DomUtil.setPosition(i,r,n.Browser.chrome),this._tiles[e.x+":"+e.y]=i,this._loadTile(i,e),i.parentNode!==this._container&&t.appendChild(i)},_getZoomForUrl:function(){var e=this.options,t=this._map.getZoom();return e.zoomReverse&&(t=e.maxZoom-t),t+e.zoomOffset},_getTilePos:function(e){var t=this._map.getPixelOrigin(),n=this.options.tileSize;return e.multiplyBy(n).subtract(t)},getTileUrl:function(e){return this._adjustTilePoint(e),n.Util.template(this._url,n.Util.extend({s:this._getSubdomain(e),z:this._getZoomForUrl(),x:e.x,y:e.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(e){var t=this._getWrapTileNum();!this.options.continuousWorld&&!this.options.noWrap&&(e.x=(e.x%t+t)%t),this.options.tms&&(e.y=t-e.y-1)},_getSubdomain:function(e){var t=(e.x+e.y)%this.options.subdomains.length;return this.options.subdomains[t]},_createTileProto:function(){var e=this._tileImg=n.DomUtil.create("img","leaflet-tile");e.galleryimg="no";var t=this.options.tileSize;e.style.width=t+"px",e.style.height=t+"px"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var e=this._unusedTiles.pop();return this._resetTile(e),e}return this._createTile()},_resetTile:function(e){},_createTile:function(){var e=this._tileImg.cloneNode(!1);return e.onselectstart=e.onmousemove=n.Util.falseFn,e},_loadTile:function(e,t){e._layer=this,e.onload=this._tileOnLoad,e.onerror=this._tileOnError,e.src=this.getTileUrl(t)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(e){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(e){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var n=t.options.errorTileUrl;n&&(this.src=n),t._tileLoaded()}}),n.tileLayer=function(e,t){return new n.TileLayer(e,t)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,r){this._url=t;var i=n.Util.extend({},this.defaultWmsParams);r.detectRetina&&e.devicePixelRatio>1?i.width=i.height=this.options.tileSize*2:i.width=i.height=this.options.tileSize;for(var s in r)this.options.hasOwnProperty(s)||(i[s]=r[s]);this.wmsParams=i,n.Util.setOptions(this,r)},onAdd:function(e){var t=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[t]=e.options.crs.code,n.TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e,t){var r=this._map,i=r.options.crs,s=this.options.tileSize,o=e.multiplyBy(s),u=o.add(new n.Point(s,s)),a=i.project(r.unproject(o,t)),f=i.project(r.unproject(u,t)),l=[a.x,f.y,f.x,a.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(e)});return c+n.Util.getParamString(this.wmsParams)+"&bbox="+l},setParams:function(e,t){return n.Util.extend(this.wmsParams,e),t||this.redraw(),this}}),n.tileLayer.wms=function(e,t){return new n.TileLayer(e,t)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(e){n.Util.setOptions(this,e)},redraw:function(){var e,t=this._tiles;for(e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(e){this.drawTile(e,e._tilePoint,e._zoom)},_createTileProto:function(){var e=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile"),t=this.options.tileSize;e.width=t,e.height=t},_createTile:function(){var e=this._canvasProto.cloneNode(!1);return e.onselectstart=e.onmousemove=n.Util.falseFn,e},_loadTile:function(e,t,n){e._layer=this,e._tilePoint=t,e._zoom=n,this.drawTile(e,t,n),this.options.async||this.tileDrawn(e)},drawTile:function(e,t,n){},tileDrawn:function(e){this._tileOnLoad.call(e)}}),n.tileLayer.canvas=function(e){return new n.TileLayer.Canvas(e)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(e,t,r){this._url=e,this._bounds=n.latLngBounds(t),n.Util.setOptions(this,r)},onAdd:function(e){this._map=e,this._image||this._initImage(),e._panes.overlayPane.appendChild(this._image),e.on("viewreset",this._reset,this),e.options.zoomAnimation&&n.Browser.any3d&&e.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(e){e.getPanes().overlayPane.removeChild(this._image),e.off("viewreset",this._reset,this),e.options.zoomAnimation&&e.off("zoomanim",this._animateZoom,this)},addTo:function(e){return e.addLayer(this),this},setOpacity:function(e){return this.options.opacity=e,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var e=this._map._panes.overlayPane;return this._image&&e.insertBefore(this._image,e.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.Util.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.Util.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(e){var t=this._map,r=this._image,i=t.getZoomScale(e.zoom),s=this._bounds.getNorthWest(),o=this._bounds.getSouthEast(),u=t._latLngToNewLayerPoint(s,e.zoom,e.center),a=t._latLngToNewLayerPoint(o,e.zoom,e.center).subtract(u),f=t.latLngToLayerPoint(o).subtract(t.latLngToLayerPoint(s)),l=u.add(a.subtract(f).divideBy(2));r.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+i+") "},_reset:function(){var e=this._image,t=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),r=this._map.latLngToLayerPoint(this._bounds.getSouthEast()).subtract(t);n.DomUtil.setPosition(e,t),e.style.width=r.x+"px",e.style.height=r.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(e,t,r){return new n.ImageOverlay(e,t,r)},n.Icon=n.Class.extend({options:{className:""},initialize:function(e){n.Util.setOptions(this,e)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(e){var t=this._getIconUrl(e);if(!t){if(e==="icon")throw Error("iconUrl not set in Icon options (see the docs).");return null}var n=this._createImg(t);return this._setIconStyles(n,e),n},_setIconStyles:function(e,t){var r=this.options,i=n.point(r[t+"Size"]),s;t==="shadow"?s=n.point(r.shadowAnchor||r.iconAnchor):s=n.point(r.iconAnchor),!s&&i&&(s=i.divideBy(2,!0)),e.className="leaflet-marker-"+t+" "+r.className,s&&(e.style.marginLeft=-s.x+"px",e.style.marginTop=-s.y+"px"),i&&(e.style.width=i.x+"px",e.style.height=i.y+"px")},_createImg:function(e){var t;return n.Browser.ie6?(t=document.createElement("div"),t.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+e+'")'):(t=document.createElement("img"),t.src=e),t},_getIconUrl:function(e){return this.options[e+"Url"]}}),n.icon=function(e){return new n.Icon(e)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(13,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(e){var t=e+"Url";if(this.options[t])return this.options[t];var r=n.Icon.Default.imagePath;if(!r)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return r+"/marker-"+e+".png"}}),n.Icon.Default.imagePath=function(){var e=document.getElementsByTagName("script"),t=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/,n,r,i,s;for(n=0,r=e.length;ns?(t.height=s+"px",n.DomUtil.addClass(e,o)):n.DomUtil.removeClass(e,o),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){var e=this._map.latLngToLayerPoint(this._latlng),t=n.Browser.any3d,r=this.options.offset;t&&n.DomUtil.setPosition(this._container,e),this._containerBottom=-r.y-(t?0:e.y),this._containerLeft=-Math.round(this._containerWidth/2)+r.x+(t?0:e.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"},_zoomAnimation:function(e){var t=this._map._latLngToNewLayerPoint(this._latlng,e.zoom,e.center);n.DomUtil.setPosition(this._container,t)},_adjustPan:function(){if(!this.options.autoPan)return;var e=this._map,t=this._container.offsetHeight,r=this._containerWidth,i=new n.Point(this._containerLeft,-t-this._containerBottom);n.Browser.any3d&&i._add(n.DomUtil.getPosition(this._container));var s=e.layerPointToContainerPoint(i),o=this.options.autoPanPadding,u=e.getSize(),a=0,f=0;s.x<0&&(a=s.x-o.x),s.x+r>u.x&&(a=s.x+r-u.x+o.x),s.y<0&&(f=s.y-o.y),s.y+t>u.y&&(f=s.y+t-u.y+o.y),(a||f)&&e.panBy(new n.Point(a,f))},_onCloseButtonClick:function(e){this._close(),n.DomEvent.stop(e)}}),n.popup=function(e,t){return new n.Popup(e,t)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(e,t){var r=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return r=r.add(n.Popup.prototype.options.offset),t&&t.offset&&(r=r.add(t.offset)),t=n.Util.extend({offset:r},t),this._popup||this.on("click",this.openPopup,this),this._popup=(new n.Popup(t,this)).setContent(e),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup)),this}}),n.Map.include({openPopup:function(e){return this.closePopup(),this._popup=e,this.addLayer(e).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(e){this._layers={};var t,n;if(e)for(t=0,n=e.length;t';var t=e.firstChild;return t.style.behavior="url(#default#VML)",t&&typeof t.adj=="object"}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(e){return document.createElement("')}}catch(e){return function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var e=this._container=this._createElement("shape");n.DomUtil.addClass(e,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(e,"leaflet-clickable"),e.coordsize="1 1",this._path=this._createElement("path"),e.appendChild(this._path),this._map._pathRoot.appendChild(e)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var e=this._stroke,t=this._fill,n=this.options,r=this._container;r.stroked=n.stroke,r.filled=n.fill,n.stroke?(e||(e=this._stroke=this._createElement("stroke"),e.endcap="round",r.appendChild(e)),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=n.dashArray.replace(/ *, */g," "):e.dashStyle=""):e&&(r.removeChild(e),this._stroke=null),n.fill?(t||(t=this._fill=this._createElement("fill"),r.appendChild(t)),t.color=n.fillColor||n.color,t.opacity=n.fillOpacity):t&&(r.removeChild(t),this._fill=null)},_updatePath:function(){var e=this._container.style;e.display="none",this._path.v=this.getPathString()+" ",e.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(this._pathRoot)return;var e=this._pathRoot=document.createElement("div");e.className="leaflet-vml-container",this._panes.overlayPane.appendChild(e),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}),n.Browser.canvas=function(){return!!document.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!e.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(e){return n.Util.setOptions(this,e),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(e){e.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&(n.Util.cancelAnimFrame(this._fireMapMoveEnd),this._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var e=this.options;e.stroke&&(this._ctx.lineWidth=e.weight,this._ctx.strokeStyle=e.color),e.fill&&(this._ctx.fillStyle=e.fillColor||e.color)},_drawPath:function(){var e,t,r,i,s,o;this._ctx.beginPath();for(e=0,r=this._parts.length;es&&(o=u,s=a);s>n&&(t[o]=1,this._simplifyDPStep(e,t,n,r,o),this._simplifyDPStep(e,t,n,o,i))},_reducePoints:function(e,t){var n=[e[0]];for(var r=1,i=0,s=e.length;rt&&(n.push(e[r]),i=r);return it.max.x&&(n|=2),e.yt.max.y&&(n|=8),n},_sqDist:function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},_sqClosestPointOnSegment:function(e,t,r,i){var s=t.x,o=t.y,u=r.x-s,a=r.y-o,f=u*u+a*a,l;return f>0&&(l=((e.x-s)*u+(e.y-o)*a)/f,l>1?(s=r.x,o=r.y):l>0&&(s+=u*l,o+=a*l)),u=e.x-s,a=e.y-o,i?u*u+a*a:new n.Point(s,o)}},n.Polyline=n.Path.extend({initialize:function(e,t){n.Path.prototype.initialize.call(this,t),this._latlngs=this._convertLatLngs(e),n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable())},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var e=0,t=this._latlngs.length;ee.max.x||n.y-t>e.max.y||n.x+te.y!=s.y>e.y&&e.x<(s.x-i.x)*(e.y-i.y)/(s.y-i.y)+i.x&&(t=!t)}return t}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var e=this._point;this._ctx.beginPath(),this._ctx.arc(e.x,e.y,this._radius,0,Math.PI*2,!1)},_containsPoint:function(e){var t=this._point,n=this.options.stroke?this.options.weight/2:0;return e.distanceTo(t)<=this._radius+n}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(e,t){n.Util.setOptions(this,t),this._layers={},e&&this.addData(e)},addData:function(e){var t=e instanceof Array?e:e.features,r,i;if(t){for(r=0,i=t.length;r1){this._simulateClick=!1;return}var t=e.touches&&e.touches.length===1?e.touches[0]:e,r=t.target;n.DomEvent.preventDefault(e),n.Browser.touch&&r.tagName.toLowerCase()==="a"&&n.DomUtil.addClass(r,"leaflet-active"),this._moved=!1;if(this._moving)return;n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor()),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),this._startPoint=new n.Point(t.clientX,t.clientY),n.DomEvent.on(document,n.Draggable.MOVE,this._onMove,this),n.DomEvent.on(document,n.Draggable.END,this._onUp,this)},_onMove:function(e){if(e.touches&&e.touches.length>1)return;var t=e.touches&&e.touches.length===1?e.touches[0]:e,r=new n.Point(t.clientX,t.clientY),i=r.subtract(this._startPoint);if(!i.x&&!i.y)return;n.DomEvent.preventDefault(e),this._moved||(this.fire("dragstart"),this._moved=!0),this._newPos=this._startPos.add(i),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget)},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(e){if(this._simulateClick&&e.changedTouches){var t=e.changedTouches[0],r=t.target,i=this._newPos&&this._newPos.distanceTo(this._startPos)||0;r.tagName.toLowerCase()==="a"&&n.DomUtil.removeClass(r,"leaflet-active"),i200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var e=this._map.getSize().divideBy(2),t=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=t.subtract(e).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var e=this._map,t=this._worldWidth,n=Math.round(t/2),r=this._initialWorldOffset,i=this._draggable._newPos.x,s=(i-n+r)%t+n-r,o=(i+n+r)%t-n-r,u=Math.abs(s+r)r.inertiaThreshold||this._positions[0]===t;if(s)e.fire("moveend");else{var o=this._lastPos.subtract(this._positions[0]),u=(this._lastTime+i-this._times[0])/1e3,a=o.multiplyBy(.58/u),f=a.distanceTo(new n.Point(0,0)),l=Math.min(r.inertiaMaxSpeed,f),c=a.multiplyBy(l/f),h=l/r.inertiaDeceleration,p=c.multiplyBy(-h/2).round(),d={duration:h,easing:"ease-out"};n.Util.requestAnimFrame(n.Util.bind(function(){this._map.panBy(p,d)},this))}e.fire("dragend"),r.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,e,!0,e._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(e){this.setView(e.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!n.Browser.touch}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(e){var t=n.DomEvent.getWheelDelta(e);this._delta+=t,this._lastMousePos=this._map.mouseEventToContainerPoint(e),clearTimeout(this._timer),this._timer=setTimeout(n.Util.bind(this._performZoom,this),40),n.DomEvent.preventDefault(e)},_performZoom:function(){var e=this._map,t=Math.round(this._delta),n=e.getZoom();t=Math.max(Math.min(t,4),-4),t=e._limitZoom(n+t)-n,this._delta=0;if(!t)return;var r=n+t,i=this._getCenterForScrollWheelZoom(this._lastMousePos,r);e.setView(i,r)},_getCenterForScrollWheelZoom:function(e,t){var n=this._map,r=n.getZoomScale(t),i=n.getSize().divideBy(2),s=e.subtract(i).multiplyBy(1-1/r),o=n._getTopLeftPoint().add(i).add(s);return n.unproject(o)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.Util.extend(n.DomEvent,{addDoubleTapListener:function(e,t,n){function l(e){if(e.touches.length!==1)return;var t=Date.now(),n=t-(r||t);o=e.touches[0],i=n>0&&n<=s,r=t}function c(e){i&&(o.type="dblclick",t(o),r=null)}var r,i=!1,s=250,o,u="_leaflet_",a="touchstart",f="touchend";return e[u+a+n]=l,e[u+f+n]=c,e.addEventListener(a,l,!1),e.addEventListener(f,c,!1),this},removeDoubleTapListener:function(e,t){var n="_leaflet_";return e.removeEventListener(e,e[n+"touchstart"+t],!1),e.removeEventListener(e,e[n+"touchend"+t],!1),this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(e){var t=this._map;if(!e.touches||e.touches.length!==2||t._animatingZoom||this._zooming)return;var r=t.mouseEventToLayerPoint(e.touches[0]),i=t.mouseEventToLayerPoint(e.touches[1]),s=t._getCenterLayerPoint();this._startCenter=r.add(i).divideBy(2,!0),this._startDist=r.distanceTo(i),this._moved=!1,this._zooming=!0,this._centerOffset=s.subtract(this._startCenter),n.DomEvent.on(document,"touchmove",this._onTouchMove,this).on(document,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(e)},_onTouchMove:function(e){if(!e.touches||e.touches.length!==2)return;var t=this._map,r=t.mouseEventToLayerPoint(e.touches[0]),i=t.mouseEventToLayerPoint(e.touches[1]);this._scale=r.distanceTo(i)/this._startDist,this._delta=r.add(i).divideBy(2,!0).subtract(this._startCenter);if(this._scale===1)return;this._moved||(n.DomUtil.addClass(t._mapPane,"leaflet-zoom-anim leaflet-touching"),t.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(e)},_updateOnMove:function(){var e=this._map,t=this._getScaleOrigin(),r=e.layerPointToLatLng(t);e.fire("zoomanim",{center:r,zoom:e.getScaleZoom(this._scale)}),e._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(e){if(!this._moved||!this._zooming)return;var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(document,"touchmove",this._onTouchMove).off(document,"touchend",this._onTouchEnd);var r=this._getScaleOrigin(),i=t.layerPointToLatLng(r),s=t.getZoom(),o=t.getScaleZoom(this._scale)-s,u=o>0?Math.ceil(o):Math.floor(o),a=t._limitZoom(s+u);t.fire("zoomanim",{center:i,zoom:a}),t._runAnimation(i,a,t.getZoomScale(a)/this._scale,r,!0)},_getScaleOrigin:function(){var e=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(e)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(e){this._map=e,this._container=e._container,this._pane=e._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(e){if(!e.shiftKey||e.which!==1&&e.button!==1)return!1;n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(e),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(document,"mousemove",this._onMouseMove,this).on(document,"mouseup",this._onMouseUp,this).preventDefault(e),this._map.fire("boxzoomstart")},_onMouseMove:function(e){var t=this._startLayerPoint,r=this._box,i=this._map.mouseEventToLayerPoint(e),s=i.subtract(t),o=new n.Point(Math.min(i.x,t.x),Math.min(i.y,t.y));n.DomUtil.setPosition(r,o),r.style.width=Math.abs(s.x)-4+"px",r.style.height=Math.abs(s.y)-4+"px"},_onMouseUp:function(e){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(document,"mousemove",this._onMouseMove).off(document,"mouseup",this._onMouseUp);var t=this._map,r=t.mouseEventToLayerPoint(e),i=new n.LatLngBounds(t.layerPointToLatLng(this._startLayerPoint),t.layerPointToLatLng(r));t.fitBounds(i),t.fire("boxzoomend",{boxZoomBounds:i})}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,61,107],zoomOut:[189,109,0]},initialize:function(e){this._map=e,this._setPanOffset(e.options.keyboardPanOffset),this._setZoomOffset(e.options.keyboardZoomOffset)},addHooks:function(){var e=this._map._container;e.tabIndex===-1&&(e.tabIndex="0"),n.DomEvent.addListener(e,"focus",this._onFocus,this).addListener(e,"blur",this._onBlur,this).addListener(e,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var e=this._map._container;n.DomEvent.removeListener(e,"focus",this._onFocus,this).removeListener(e,"blur",this._onBlur,this).removeListener(e,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(e){var t=this._panKeys={},n=this.keyCodes,r,i;for(r=0,i=n.left.length;re&&(n._index+=t)})},_createMiddleMarker:function(e,t){var n=this._getMiddleLatLng(e,t),r=this._createMarker(n),i,s,o;r.setOpacity(.6),e._middleRight=t._middleLeft=r,s=function(){var s=t._index;r._index=s,r.off("click",i).on("click",this._onMarkerClick,this),n.lat=r.getLatLng().lat,n.lng=r.getLatLng().lng,this._poly.spliceLatLngs(s,0,n),this._markers.splice(s,0,r),r.setOpacity(1),this._updateIndexes(s,1),t._index++,this._updatePrevNext(e,r),this._updatePrevNext(r,t)},o=function(){r.off("dragstart",s,this),r.off("dragend",o,this),this._createMiddleMarker(e,r),this._createMiddleMarker(r,t)},i=function(){s.call(this),o.call(this),this._poly.fire("edit")},r.on("click",i,this).on("dragstart",s,this).on("dragend",o,this),this._markerGroup.addLayer(r)},_updatePrevNext:function(e,t){e._next=t,t._prev=e},_getMiddleLatLng:function(e,t){var n=this._poly._map,r=n.latLngToLayerPoint(e.getLatLng()),i=n.latLngToLayerPoint(t.getLatLng());return n.layerPointToLatLng(r._add(i).divideBy(2))}}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(e){n.Util.setOptions(this,e)},getPosition:function(){return this.options.position},setPosition:function(e){var t=this._map;return t&&t.removeControl(this),this.options.position=e,t&&t.addControl(this),this},addTo:function(e){this._map=e;var t=this._container=this.onAdd(e),r=this.getPosition(),i=e._controlCorners[r];return n.DomUtil.addClass(t,"leaflet-control"),r.indexOf("bottom")!==-1?i.insertBefore(t,i.firstChild):i.appendChild(t),this},removeFrom:function(e){var t=this.getPosition(),n=e._controlCorners[t];return n.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(e),this}}),n.control=function(e){return new n.Control(e)},n.Map.include({addControl:function(e){return e.addTo(this),this},removeControl:function(e){return e.removeFrom(this),this},_initControlPos:function(){function i(i,s){var o=t+i+" "+t+s;e[i+s]=n.DomUtil.create("div",o,r)}var e=this._controlCorners={},t="leaflet-",r=this._controlContainer=n.DomUtil.create("div",t+"control-container",this._container);i("top","left"),i("top","right"),i("bottom","left"),i("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(e){var t="leaflet-control-zoom",r=n.DomUtil.create("div",t);return this._createButton("Zoom in",t+"-in",r,e.zoomIn,e),this._createButton("Zoom out",t+"-out",r,e.zoomOut,e),r},_createButton:function(e,t,r,i,s){var o=n.DomUtil.create("a",t,r);return o.href="#",o.title=e,n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",i,s).on(o,"dblclick",n.DomEvent.stopPropagation),o}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(e){return new n.Control.Zoom(e)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(e){n.Util.setOptions(this,e),this._attributions={}},onAdd:function(e){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),e.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(e){e.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(e){return this.options.prefix=e,this._update(),this},addAttribution:function(e){if(!e)return;return this._attributions[e]||(this._attributions[e]=0),this._attributions[e]++,this._update(),this},removeAttribution:function(e){if(!e)return;return this._attributions[e]--,this._update(),this},_update:function(){if(!this._map)return;var e=[];for(var t in this._attributions)this._attributions.hasOwnProperty(t)&&this._attributions[t]&&e.push(t);var n=[];this.options.prefix&&n.push(this.options.prefix),e.length&&n.push(e.join(", ")),this._container.innerHTML=n.join(" — ")},_onLayerAdd:function(e){e.layer.getAttribution&&this.addAttribution(e.layer.getAttribution())},_onLayerRemove:function(e){e.layer.getAttribution&&this.removeAttribution(e.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(e){return new n.Control.Attribution(e)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(e){this._map=e;var t="leaflet-control-scale",r=n.DomUtil.create("div",t),i=this.options;return this._addScales(i,t,r),e.on(i.updateWhenIdle?"moveend":"move",this._update,this),this._update(),r},onRemove:function(e){e.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(e,t,r){e.metric&&(this._mScale=n.DomUtil.create("div",t+"-line",r)),e.imperial&&(this._iScale=n.DomUtil.create("div",t+"-line",r))},_update:function(){var e=this._map.getBounds(),t=e.getCenter().lat,r=(new n.LatLng(t,0)).distanceTo(new n.LatLng(t,180)),i=r*(e.getNorthEast().lng-e.getSouthWest().lng)/180,s=this._map.getSize(),o=this.options,u=0;s.x>0&&(u=i*(o.maxWidth/s.x)),this._updateScales(o,u)},_updateScales:function(e,t){e.metric&&t&&this._updateMetric(t),e.imperial&&t&&this._updateImperial(t)},_updateMetric:function(e){var t=this._getRoundNum(e);this._mScale.style.width=this._getScaleWidth(t/e)+"px",this._mScale.innerHTML=t<1e3?t+" m":t/1e3+" km"},_updateImperial:function(e){var t=e*3.2808399,n=this._iScale,r,i,s;t>5280?(r=t/5280,i=this._getRoundNum(r),n.style.width=this._getScaleWidth(i/r)+"px",n.innerHTML=i+" mi"):(s=this._getRoundNum(t),n.style.width=this._getScaleWidth(s/t)+"px",n.innerHTML=s+" ft")},_getScaleWidth:function(e){return Math.round(this.options.maxWidth*e)-10},_getRoundNum:function(e){var t=Math.pow(10,(Math.floor(e)+"").length-1),n=e/t;return n=n>=10?10:n>=5?5:n>=3?3:n>=2?2:1,t*n}}),n.control.scale=function(e){return new n.Control.Scale(e)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(e,t,r){n.Util.setOptions(this,r),this._layers={},this._lastZIndex=0;for(var i in e)e.hasOwnProperty(i)&&this._addLayer(e[i],i);for(i in t)t.hasOwnProperty(i)&&this._addLayer(t[i],i,!0)},onAdd:function(e){return this._initLayout(),this._update(),this._container},addBaseLayer:function(e,t){return this._addLayer(e,t),this._update(),this},addOverlay:function(e,t){return this._addLayer(e,t,!0),this._update(),this},removeLayer:function(e){var t=n.Util.stamp(e);return delete this._layers[t],this._update(),this},_initLayout:function(){var e="leaflet-control-layers",t=this._container=n.DomUtil.create("div",e);n.Browser.touch?n.DomEvent.on(t,"click",n.DomEvent.stopPropagation):n.DomEvent.disableClickPropagation(t);var r=this._form=n.DomUtil.create("form",e+"-list");if(this.options.collapsed){n.DomEvent.on(t,"mouseover",this._expand,this).on(t,"mouseout",this._collapse,this);var i=this._layersLink=n.DomUtil.create("a",e+"-toggle",t);i.href="#",i.title="Layers",n.Browser.touch?n.DomEvent.on(i,"click",n.DomEvent.stopPropagation).on(i,"click",n.DomEvent.preventDefault).on(i,"click",this._expand,this):n.DomEvent.on(i,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",e+"-base",r),this._separator=n.DomUtil.create("div",e+"-separator",r),this._overlaysList=n.DomUtil.create("div",e+"-overlays",r),t.appendChild(r)},_addLayer:function(e,t,r){var i=n.Util.stamp(e);this._layers[i]={layer:e,name:t,overlay:r},this.options.autoZIndex&&e.setZIndex&&(this._lastZIndex++,e.setZIndex(this._lastZIndex))},_update:function(){if(!this._container)return;this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var e=!1,t=!1;for(var n in this._layers)if(this._layers.hasOwnProperty(n)){var r=this._layers[n];this._addItem(r),t=t||r.overlay,e=e||!r.overlay}this._separator.style.display=t&&e?"":"none"},_addItem:function(e,t){var r=document.createElement("label"),i=document.createElement("input");e.overlay||(i.name="leaflet-base-layers"),i.type=e.overlay?"checkbox":"radio",i.layerId=n.Util.stamp(e.layer),i.defaultChecked=this._map.hasLayer(e.layer),n.DomEvent.on(i,"click",this._onInputClick,this);var s=document.createTextNode(" "+e.name);r.appendChild(i),r.appendChild(s);var o=e.overlay?this._overlaysList:this._baseLayersList;o.appendChild(r)},_onInputClick:function(){var e,t,n,r=this._form.getElementsByTagName("input"),i=r.length;for(e=0;e.5&&this._getLoadedTilesPercentage(e)<.5){e.style.visibility="hidden",e.empty=!0,this._stopLoadingImages(e);return}t||(t=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),t.style.zIndex=1),t.style[n.DomUtil.TRANSFORM]="",t.style.visibility="hidden",t.empty=!0,e.empty=!1,this._tilePane=this._panes.tilePane=t;var r=this._tileBg=e;r.transition||(r.transition=new n.Transition(r,{duration:.25,easing:"cubic-bezier(0.25,0.1,0.25,0.75)"}),r.transition.on("end",this._onZoomTransitionEnd,this)),this._stopLoadingImages(r)},_getLoadedTilesPercentage:function(e){var t=e.getElementsByTagName("img"),n,r,i=0;for(n=0,r=t.length;n2?Array.prototype.slice.call(arguments,2):null;return function(){return e.apply(t,n||arguments)}},stamp:function(){var e=0,t="_leaflet_id";return function(n){return n[t]=n[t]||++e,n[t]}}(),limitExecByInterval:function(e,t,n){var r,i;return function s(){var o=arguments;if(r){i=!0;return}r=!0,setTimeout(function(){r=!1,i&&(s.apply(n,o),i=!1)},t),e.apply(n,o)}},falseFn:function(){return!1},formatNum:function(e,t){var n=Math.pow(10,t||5);return Math.round(e*n)/n},splitWords:function(e){return e.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(e,t){return e.options=n.Util.extend({},e.options,t),e.options},getParamString:function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+"="+e[n]);return"?"+t.join("&")},template:function(e,t){return e.replace(/\{ *([\w_]+) *\}/g,function(e,n){var r=t[n];if(!t.hasOwnProperty(n))throw Error("No value provided for variable "+e);return r})},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function t(t){var n,r,i=["webkit","moz","o","ms"];for(n=0;n0},removeEventListener:function(e,t,r){var s=this[i],o,u,a,f,l;if(typeof e=="object"){for(o in e)e.hasOwnProperty(o)&&this.removeEventListener(o,e[o],t);return this}e=n.Util.splitWords(e);for(u=0,a=e.length;u=0;l--)(!t||f[l].action===t)&&(!r||f[l].context===r)&&f.splice(l,1)}return this},fireEvent:function(e,t){if(!this.hasEventListeners(e))return this;var r=n.Util.extend({type:e,target:this},t),s=this[i][e].slice();for(var o=0,u=s.length;o=this.min.x&&r.x<=this.max.x&&t.y>=this.min.y&&r.y<=this.max.y},intersects:function(e){e=n.bounds(e);var t=this.min,r=this.max,i=e.min,s=e.max,o=s.x>=t.x&&i.x<=r.x,u=s.y>=t.y&&i.y<=r.y;return o&&u}}),n.bounds=function(e,t){return!e||e instanceof n.Bounds?e:new n.Bounds(e,t)},n.Transformation=n.Class.extend({initialize:function(e,t,n,r){this._a=e,this._b=t,this._c=n,this._d=r},transform:function(e,t){return this._transform(e.clone(),t)},_transform:function(e,t){return t=t||1,e.x=t*(this._a*e.x+this._b),e.y=t*(this._c*e.y+this._d),e},untransform:function(e,t){return t=t||1,new n.Point((e.x/t-this._b)/this._a,(e.y/t-this._d)/this._c)}}),n.DomUtil={get:function(e){return typeof e=="string"?document.getElementById(e):e},getStyle:function(e,t){var n=e.style[t];!n&&e.currentStyle&&(n=e.currentStyle[t]);if(!n||n==="auto"){var r=document.defaultView.getComputedStyle(e,null);n=r?r[t]:null}return n==="auto"?null:n},getViewportOffset:function(e){var t=0,r=0,i=e,s=document.body;do{t+=i.offsetTop||0,r+=i.offsetLeft||0;if(i.offsetParent===s&&n.DomUtil.getStyle(i,"position")==="absolute")break;if(n.DomUtil.getStyle(i,"position")==="fixed"){t+=s.scrollTop||0,r+=s.scrollLeft||0;break}i=i.offsetParent}while(i);i=e;do{if(i===s)break;t-=i.scrollTop||0,r-=i.scrollLeft||0,i=i.parentNode}while(i);return new n.Point(r,t)},create:function(e,t,n){var r=document.createElement(e);return r.className=t,n&&n.appendChild(r),r},disableTextSelection:function(){document.selection&&document.selection.empty&&document.selection.empty(),this._onselectstart||(this._onselectstart=document.onselectstart,document.onselectstart=n.Util.falseFn)},enableTextSelection:function(){document.onselectstart=this._onselectstart,this._onselectstart=null},hasClass:function(e,t){return e.className.length>0&&RegExp("(^|\\s)"+t+"(\\s|$)").test(e.className)},addClass:function(e,t){n.DomUtil.hasClass(e,t)||(e.className+=(e.className?" ":"")+t)},removeClass:function(e,t){function n(e,n){return n===t?"":e}e.className=e.className.replace(/(\S+)\s*/g,n).replace(/(^\s+|\s+$)/,"")},setOpacity:function(e,t){if("opacity"in e.style)e.style.opacity=t;else if(n.Browser.ie){var r=!1,i="DXImageTransform.Microsoft.Alpha";try{r=e.filters.item(i)}catch(s){}t=Math.round(t*100),r?(r.Enabled=t===100,r.Opacity=t):e.style.filter+=" progid:"+i+"(opacity="+t+")"}},testProp:function(e){var t=document.documentElement.style;for(var n=0;n=t.lat&&s.lat<=r.lat&&i.lng>=t.lng&&s.lng<=r.lng},intersects:function(e){e=n.latLngBounds(e);var t=this._southWest,r=this._northEast,i=e.getSouthWest(),s=e.getNorthEast(),o=s.lat>=t.lat&&i.lat<=r.lat,u=s.lng>=t.lng&&i.lng<=r.lng;return o&&u},toBBoxString:function(){var e=this._southWest,t=this._northEast;return[e.lng,e.lat,t.lng,t.lat].join(",")},equals:function(e){return e?(e=n.latLngBounds(e),this._southWest.equals(e.getSouthWest())&&this._northEast.equals(e.getNorthEast())):!1}}),n.latLngBounds=function(e,t){return!e||e instanceof n.LatLngBounds?e:new n.LatLngBounds(e,t)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(e){var t=n.LatLng.DEG_TO_RAD,r=this.MAX_LATITUDE,i=Math.max(Math.min(r,e.lat),-r),s=e.lng*t,o=i*t;return o=Math.log(Math.tan(Math.PI/4+o/2)),new n.Point(s,o)},unproject:function(e){var t=n.LatLng.RAD_TO_DEG,r=e.x*t,i=(2*Math.atan(Math.exp(e.y))-Math.PI/2)*t;return new n.LatLng(i,r,!0)}},n.Projection.LonLat={project:function(e){return new n.Point(e.lng,e.lat)},unproject:function(e){return new n.LatLng(e.y,e.x,!0)}},n.CRS={latLngToPoint:function(e,t){var n=this.projection.project(e),r=this.scale(t);return this.transformation._transform(n,r)},pointToLatLng:function(e,t){var n=this.scale(t),r=this.transformation.untransform(e,n);return this.projection.unproject(r)},project:function(e){return this.projection.project(e)},scale:function(e){return 256*Math.pow(2,e)}},n.CRS.EPSG3857=n.Util.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-0.5/Math.PI,.5),project:function(e){var t=this.projection.project(e),n=6378137;return t.multiplyBy(n)}}),n.CRS.EPSG900913=n.Util.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.Util.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(e,r){r=n.Util.setOptions(this,r),this._initContainer(e),this._initLayout(),this._initHooks(),this._initEvents(),r.maxBounds&&this.setMaxBounds(r.maxBounds),r.center&&r.zoom!==t&&this.setView(n.latLng(r.center),r.zoom,!0),this._initLayers(r.layers)},setView:function(e,t){return this._resetView(n.latLng(e),this._limitZoom(t)),this},setZoom:function(e){return this.setView(this.getCenter(),e)},zoomIn:function(){return this.setZoom(this._zoom+1)},zoomOut:function(){return this.setZoom(this._zoom-1)},fitBounds:function(e){var t=this.getBoundsZoom(e);return this.setView(n.latLngBounds(e).getCenter(),t)},fitWorld:function(){var e=new n.LatLng(-60,-170),t=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(e,t))},panTo:function(e){return this.setView(e,this._zoom)},panBy:function(e){return this.fire("movestart"),this._rawPanBy(n.point(e)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(e){e=n.latLngBounds(e),this.options.maxBounds=e;if(!e)return this._boundsMinZoom=null,this;var t=this.getBoundsZoom(e,!0);return this._boundsMinZoom=t,this._loaded&&(this._zoomo.x&&(u=o.x-i.x),r.y>s.y&&(a=s.y-r.y),r.xc&&--h>0)d=u*Math.sin(f),p=Math.PI/2-2*Math.atan(a*Math.pow((1-d)/(1+d),.5*u))-f,f+=p;return new n.LatLng(f*t,s,!0)}},n.CRS.EPSG3395=n.Util.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var e=n.Projection.Mercator,t=e.R_MAJOR,r=e.R_MINOR;return new n.Transformation(.5/(Math.PI*t),.5,-0.5/(Math.PI*r),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,r){r=n.Util.setOptions(this,r),r.detectRetina&&e.devicePixelRatio>1&&r.maxZoom>0&&(r.tileSize=Math.floor(r.tileSize/2),r.zoomOffset++,r.minZoom>0&&r.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;typeof i=="string"&&(this.options.subdomains=i.split(""))},onAdd:function(e){this._map=e,this._initContainer(),this._createTileProto(),e.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),e.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(e){return e.addLayer(this),this},onRemove:function(e){e._panes.tilePane.removeChild(this._container),e.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||e.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var e=this._map._panes.tilePane;return this._container&&(e.appendChild(this._container),this._setAutoZIndex(e,Math.max)),this},bringToBack:function(){var e=this._map._panes.tilePane;return this._container&&(e.insertBefore(this._container,e.firstChild),this._setAutoZIndex(e,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(e){return this.options.opacity=e,this._map&&this._updateOpacity(),this},setZIndex:function(e){return this.options.zIndex=e,this._updateZIndex(),this},setUrl:function(e,t){return this._url=e,t||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==t&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(e,t){var n=e.getElementsByClassName("leaflet-layer"),r=-t(Infinity,-Infinity),i;for(var s=0,o=n.length;sthis.options.maxZoom||r=t)||e.y<0||e.y>=t)return!1}return!0},_removeOtherTiles:function(e){var t,n,r,i;for(i in this._tiles)this._tiles.hasOwnProperty(i)&&(t=i.split(":"),n=parseInt(t[0],10),r=parseInt(t[1],10),(ne.max.x||re.max.y)&&this._removeTile(i))},_removeTile:function(e){var t=this._tiles[e];this.fire("tileunload",{tile:t,url:t.src}),this.options.reuseTiles?(n.DomUtil.removeClass(t,"leaflet-tile-loaded"),this._unusedTiles.push(t)):t.parentNode===this._container&&this._container.removeChild(t),n.Browser.android||(t.src=n.Util.emptyImageUrl),delete this._tiles[e]},_addTile:function(e,t){var r=this._getTilePos(e),i=this._getTile();n.DomUtil.setPosition(i,r,n.Browser.chrome),this._tiles[e.x+":"+e.y]=i,this._loadTile(i,e),i.parentNode!==this._container&&t.appendChild(i)},_getZoomForUrl:function(){var e=this.options,t=this._map.getZoom();return e.zoomReverse&&(t=e.maxZoom-t),t+e.zoomOffset},_getTilePos:function(e){var t=this._map.getPixelOrigin(),n=this.options.tileSize;return e.multiplyBy(n).subtract(t)},getTileUrl:function(e){return this._adjustTilePoint(e),n.Util.template(this._url,n.Util.extend({s:this._getSubdomain(e),z:this._getZoomForUrl(),x:e.x,y:e.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(e){var t=this._getWrapTileNum();!this.options.continuousWorld&&!this.options.noWrap&&(e.x=(e.x%t+t)%t),this.options.tms&&(e.y=t-e.y-1)},_getSubdomain:function(e){var t=(e.x+e.y)%this.options.subdomains.length;return this.options.subdomains[t]},_createTileProto:function(){var e=this._tileImg=n.DomUtil.create("img","leaflet-tile");e.galleryimg="no";var t=this.options.tileSize;e.style.width=t+"px",e.style.height=t+"px"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var e=this._unusedTiles.pop();return this._resetTile(e),e}return this._createTile()},_resetTile:function(e){},_createTile:function(){var e=this._tileImg.cloneNode(!1);return e.onselectstart=e.onmousemove=n.Util.falseFn,e},_loadTile:function(e,t){e._layer=this,e.onload=this._tileOnLoad,e.onerror=this._tileOnError,e.src=this.getTileUrl(t)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(e){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(e){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var n=t.options.errorTileUrl;n&&(this.src=n),t._tileLoaded()}}),n.tileLayer=function(e,t){return new n.TileLayer(e,t)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,r){this._url=t;var i=n.Util.extend({},this.defaultWmsParams);r.detectRetina&&e.devicePixelRatio>1?i.width=i.height=this.options.tileSize*2:i.width=i.height=this.options.tileSize;for(var s in r)this.options.hasOwnProperty(s)||(i[s]=r[s]);this.wmsParams=i,n.Util.setOptions(this,r)},onAdd:function(e){var t=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[t]=e.options.crs.code,n.TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e,t){var r=this._map,i=r.options.crs,s=this.options.tileSize,o=e.multiplyBy(s),u=o.add(new n.Point(s,s)),a=i.project(r.unproject(o,t)),f=i.project(r.unproject(u,t)),l=[a.x,f.y,f.x,a.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(e)});return c+n.Util.getParamString(this.wmsParams)+"&bbox="+l},setParams:function(e,t){return n.Util.extend(this.wmsParams,e),t||this.redraw(),this}}),n.tileLayer.wms=function(e,t){return new n.TileLayer(e,t)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(e){n.Util.setOptions(this,e)},redraw:function(){var e,t=this._tiles;for(e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(e){this.drawTile(e,e._tilePoint,e._zoom)},_createTileProto:function(){var e=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile"),t=this.options.tileSize;e.width=t,e.height=t},_createTile:function(){var e=this._canvasProto.cloneNode(!1);return e.onselectstart=e.onmousemove=n.Util.falseFn,e},_loadTile:function(e,t,n){e._layer=this,e._tilePoint=t,e._zoom=n,this.drawTile(e,t,n),this.options.async||this.tileDrawn(e)},drawTile:function(e,t,n){},tileDrawn:function(e){this._tileOnLoad.call(e)}}),n.tileLayer.canvas=function(e){return new n.TileLayer.Canvas(e)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(e,t,r){this._url=e,this._bounds=n.latLngBounds(t),n.Util.setOptions(this,r)},onAdd:function(e){this._map=e,this._image||this._initImage(),e._panes.overlayPane.appendChild(this._image),e.on("viewreset",this._reset,this),e.options.zoomAnimation&&n.Browser.any3d&&e.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(e){e.getPanes().overlayPane.removeChild(this._image),e.off("viewreset",this._reset,this),e.options.zoomAnimation&&e.off("zoomanim",this._animateZoom,this)},addTo:function(e){return e.addLayer(this),this},setOpacity:function(e){return this.options.opacity=e,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var e=this._map._panes.overlayPane;return this._image&&e.insertBefore(this._image,e.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.Util.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.Util.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(e){var t=this._map,r=this._image,i=t.getZoomScale(e.zoom),s=this._bounds.getNorthWest(),o=this._bounds.getSouthEast(),u=t._latLngToNewLayerPoint(s,e.zoom,e.center),a=t._latLngToNewLayerPoint(o,e.zoom,e.center).subtract(u),f=t.latLngToLayerPoint(o).subtract(t.latLngToLayerPoint(s)),l=u.add(a.subtract(f).divideBy(2));r.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+i+") "},_reset:function(){var e=this._image,t=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),r=this._map.latLngToLayerPoint(this._bounds.getSouthEast()).subtract(t);n.DomUtil.setPosition(e,t),e.style.width=r.x+"px",e.style.height=r.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(e,t,r){return new n.ImageOverlay(e,t,r)},n.Icon=n.Class.extend({options:{className:""},initialize:function(e){n.Util.setOptions(this,e)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(e){var t=this._getIconUrl(e);if(!t){if(e==="icon")throw Error("iconUrl not set in Icon options (see the docs).");return null}var n=this._createImg(t);return this._setIconStyles(n,e),n},_setIconStyles:function(e,t){var r=this.options,i=n.point(r[t+"Size"]),s;t==="shadow"?s=n.point(r.shadowAnchor||r.iconAnchor):s=n.point(r.iconAnchor),!s&&i&&(s=i.divideBy(2,!0)),e.className="leaflet-marker-"+t+" "+r.className,s&&(e.style.marginLeft=-s.x+"px",e.style.marginTop=-s.y+"px"),i&&(e.style.width=i.x+"px",e.style.height=i.y+"px")},_createImg:function(e){var t;return n.Browser.ie6?(t=document.createElement("div"),t.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+e+'")'):(t=document.createElement("img"),t.src=e),t},_getIconUrl:function(e){return this.options[e+"Url"]}}),n.icon=function(e){return new n.Icon(e)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(13,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(e){var t=e+"Url";if(this.options[t])return this.options[t];var r=n.Icon.Default.imagePath;if(!r)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return r+"/marker-"+e+".png"}}),n.Icon.Default.imagePath=function(){var e=document.getElementsByTagName("script"),t=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/,n,r,i,s;for(n=0,r=e.length;ns?(t.height=s+"px",n.DomUtil.addClass(e,o)):n.DomUtil.removeClass(e,o),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){var e=this._map.latLngToLayerPoint(this._latlng),t=n.Browser.any3d,r=this.options.offset;t&&n.DomUtil.setPosition(this._container,e),this._containerBottom=-r.y-(t?0:e.y),this._containerLeft=-Math.round(this._containerWidth/2)+r.x+(t?0:e.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"},_zoomAnimation:function(e){var t=this._map._latLngToNewLayerPoint(this._latlng,e.zoom,e.center);n.DomUtil.setPosition(this._container,t)},_adjustPan:function(){if(!this.options.autoPan)return;var e=this._map,t=this._container.offsetHeight,r=this._containerWidth,i=new n.Point(this._containerLeft,-t-this._containerBottom);n.Browser.any3d&&i._add(n.DomUtil.getPosition(this._container));var s=e.layerPointToContainerPoint(i),o=this.options.autoPanPadding,u=e.getSize(),a=0,f=0;s.x<0&&(a=s.x-o.x),s.x+r>u.x&&(a=s.x+r-u.x+o.x),s.y<0&&(f=s.y-o.y),s.y+t>u.y&&(f=s.y+t-u.y+o.y),(a||f)&&e.panBy(new n.Point(a,f))},_onCloseButtonClick:function(e){this._close(),n.DomEvent.stop(e)}}),n.popup=function(e,t){return new n.Popup(e,t)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(e,t){var r=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return r=r.add(n.Popup.prototype.options.offset),t&&t.offset&&(r=r.add(t.offset)),t=n.Util.extend({offset:r},t),this._popup||this.on("click",this.openPopup,this),this._popup=(new n.Popup(t,this)).setContent(e),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup)),this}}),n.Map.include({openPopup:function(e){return this.closePopup(),this._popup=e,this.addLayer(e).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(e){this._layers={};var t,n;if(e)for(t=0,n=e.length;t';var t=e.firstChild;return t.style.behavior="url(#default#VML)",t&&typeof t.adj=="object"}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(e){return document.createElement("')}}catch(e){return function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var e=this._container=this._createElement("shape");n.DomUtil.addClass(e,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(e,"leaflet-clickable"),e.coordsize="1 1",this._path=this._createElement("path"),e.appendChild(this._path),this._map._pathRoot.appendChild(e)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var e=this._stroke,t=this._fill,n=this.options,r=this._container;r.stroked=n.stroke,r.filled=n.fill,n.stroke?(e||(e=this._stroke=this._createElement("stroke"),e.endcap="round",r.appendChild(e)),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=n.dashArray.replace(/ *, */g," "):e.dashStyle=""):e&&(r.removeChild(e),this._stroke=null),n.fill?(t||(t=this._fill=this._createElement("fill"),r.appendChild(t)),t.color=n.fillColor||n.color,t.opacity=n.fillOpacity):t&&(r.removeChild(t),this._fill=null)},_updatePath:function(){var e=this._container.style;e.display="none",this._path.v=this.getPathString()+" ",e.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(this._pathRoot)return;var e=this._pathRoot=document.createElement("div");e.className="leaflet-vml-container",this._panes.overlayPane.appendChild(e),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}),n.Browser.canvas=function(){return!!document.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!e.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(e){return n.Util.setOptions(this,e),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(e){e.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&(n.Util.cancelAnimFrame(this._fireMapMoveEnd),this._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var e=this.options;e.stroke&&(this._ctx.lineWidth=e.weight,this._ctx.strokeStyle=e.color),e.fill&&(this._ctx.fillStyle=e.fillColor||e.color)},_drawPath:function(){var e,t,r,i,s,o;this._ctx.beginPath();for(e=0,r=this._parts.length;es&&(o=u,s=a);s>n&&(t[o]=1,this._simplifyDPStep(e,t,n,r,o),this._simplifyDPStep(e,t,n,o,i))},_reducePoints:function(e,t){var n=[e[0]];for(var r=1,i=0,s=e.length;rt&&(n.push(e[r]),i=r);return it.max.x&&(n|=2),e.yt.max.y&&(n|=8),n},_sqDist:function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},_sqClosestPointOnSegment:function(e,t,r,i){var s=t.x,o=t.y,u=r.x-s,a=r.y-o,f=u*u+a*a,l;return f>0&&(l=((e.x-s)*u+(e.y-o)*a)/f,l>1?(s=r.x,o=r.y):l>0&&(s+=u*l,o+=a*l)),u=e.x-s,a=e.y-o,i?u*u+a*a:new n.Point(s,o)}},n.Polyline=n.Path.extend({initialize:function(e,t){n.Path.prototype.initialize.call(this,t),this._latlngs=this._convertLatLngs(e),n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable())},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var e=0,t=this._latlngs.length;ee.max.x||n.y-t>e.max.y||n.x+te.y!=s.y>e.y&&e.x<(s.x-i.x)*(e.y-i.y)/(s.y-i.y)+i.x&&(t=!t)}return t}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var e=this._point;this._ctx.beginPath(),this._ctx.arc(e.x,e.y,this._radius,0,Math.PI*2,!1)},_containsPoint:function(e){var t=this._point,n=this.options.stroke?this.options.weight/2:0;return e.distanceTo(t)<=this._radius+n}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(e,t){n.Util.setOptions(this,t),this._layers={},e&&this.addData(e)},addData:function(e){var t=e instanceof Array?e:e.features,r,i;if(t){for(r=0,i=t.length;r1){this._simulateClick=!1;return}var t=e.touches&&e.touches.length===1?e.touches[0]:e,r=t.target;n.DomEvent.preventDefault(e),n.Browser.touch&&r.tagName.toLowerCase()==="a"&&n.DomUtil.addClass(r,"leaflet-active"),this._moved=!1;if(this._moving)return;n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor()),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),this._startPoint=new n.Point(t.clientX,t.clientY),n.DomEvent.on(document,n.Draggable.MOVE,this._onMove,this),n.DomEvent.on(document,n.Draggable.END,this._onUp,this)},_onMove:function(e){if(e.touches&&e.touches.length>1)return;var t=e.touches&&e.touches.length===1?e.touches[0]:e,r=new n.Point(t.clientX,t.clientY),i=r.subtract(this._startPoint);if(!i.x&&!i.y)return;n.DomEvent.preventDefault(e),this._moved||(this.fire("dragstart"),this._moved=!0),this._newPos=this._startPos.add(i),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget)},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(e){if(this._simulateClick&&e.changedTouches){var t=e.changedTouches[0],r=t.target,i=this._newPos&&this._newPos.distanceTo(this._startPos)||0;r.tagName.toLowerCase()==="a"&&n.DomUtil.removeClass(r,"leaflet-active"),i200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var e=this._map.getSize().divideBy(2),t=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=t.subtract(e).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var e=this._map,t=this._worldWidth,n=Math.round(t/2),r=this._initialWorldOffset,i=this._draggable._newPos.x,s=(i-n+r)%t+n-r,o=(i+n+r)%t-n-r,u=Math.abs(s+r)r.inertiaThreshold||this._positions[0]===t;if(s)e.fire("moveend");else{var o=this._lastPos.subtract(this._positions[0]),u=(this._lastTime+i-this._times[0])/1e3,a=o.multiplyBy(.58/u),f=a.distanceTo(new n.Point(0,0)),l=Math.min(r.inertiaMaxSpeed,f),c=a.multiplyBy(l/f),h=l/r.inertiaDeceleration,p=c.multiplyBy(-h/2).round(),d={duration:h,easing:"ease-out"};n.Util.requestAnimFrame(n.Util.bind(function(){this._map.panBy(p,d)},this))}e.fire("dragend"),r.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,e,!0,e._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(e){this.setView(e.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!n.Browser.touch}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(e){var t=n.DomEvent.getWheelDelta(e);this._delta+=t,this._lastMousePos=this._map.mouseEventToContainerPoint(e),clearTimeout(this._timer),this._timer=setTimeout(n.Util.bind(this._performZoom,this),40),n.DomEvent.preventDefault(e)},_performZoom:function(){var e=this._map,t=Math.round(this._delta),n=e.getZoom();t=Math.max(Math.min(t,4),-4),t=e._limitZoom(n+t)-n,this._delta=0;if(!t)return;var r=n+t,i=this._getCenterForScrollWheelZoom(this._lastMousePos,r);e.setView(i,r)},_getCenterForScrollWheelZoom:function(e,t){var n=this._map,r=n.getZoomScale(t),i=n.getSize().divideBy(2),s=e.subtract(i).multiplyBy(1-1/r),o=n._getTopLeftPoint().add(i).add(s);return n.unproject(o)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.Util.extend(n.DomEvent,{addDoubleTapListener:function(e,t,n){function l(e){if(e.touches.length!==1)return;var t=Date.now(),n=t-(r||t);o=e.touches[0],i=n>0&&n<=s,r=t}function c(e){i&&(o.type="dblclick",t(o),r=null)}var r,i=!1,s=250,o,u="_leaflet_",a="touchstart",f="touchend";return e[u+a+n]=l,e[u+f+n]=c,e.addEventListener(a,l,!1),e.addEventListener(f,c,!1),this},removeDoubleTapListener:function(e,t){var n="_leaflet_";return e.removeEventListener(e,e[n+"touchstart"+t],!1),e.removeEventListener(e,e[n+"touchend"+t],!1),this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(e){var t=this._map;if(!e.touches||e.touches.length!==2||t._animatingZoom||this._zooming)return;var r=t.mouseEventToLayerPoint(e.touches[0]),i=t.mouseEventToLayerPoint(e.touches[1]),s=t._getCenterLayerPoint();this._startCenter=r.add(i).divideBy(2,!0),this._startDist=r.distanceTo(i),this._moved=!1,this._zooming=!0,this._centerOffset=s.subtract(this._startCenter),n.DomEvent.on(document,"touchmove",this._onTouchMove,this).on(document,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(e)},_onTouchMove:function(e){if(!e.touches||e.touches.length!==2)return;var t=this._map,r=t.mouseEventToLayerPoint(e.touches[0]),i=t.mouseEventToLayerPoint(e.touches[1]);this._scale=r.distanceTo(i)/this._startDist,this._delta=r.add(i).divideBy(2,!0).subtract(this._startCenter);if(this._scale===1)return;this._moved||(n.DomUtil.addClass(t._mapPane,"leaflet-zoom-anim leaflet-touching"),t.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(e)},_updateOnMove:function(){var e=this._map,t=this._getScaleOrigin(),r=e.layerPointToLatLng(t);e.fire("zoomanim",{center:r,zoom:e.getScaleZoom(this._scale)}),e._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(e){if(!this._moved||!this._zooming)return;var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(document,"touchmove",this._onTouchMove).off(document,"touchend",this._onTouchEnd);var r=this._getScaleOrigin(),i=t.layerPointToLatLng(r),s=t.getZoom(),o=t.getScaleZoom(this._scale)-s,u=o>0?Math.ceil(o):Math.floor(o),a=t._limitZoom(s+u);t.fire("zoomanim",{center:i,zoom:a}),t._runAnimation(i,a,t.getZoomScale(a)/this._scale,r,!0)},_getScaleOrigin:function(){var e=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(e)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(e){this._map=e,this._container=e._container,this._pane=e._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(e){if(!e.shiftKey||e.which!==1&&e.button!==1)return!1;n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(e),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(document,"mousemove",this._onMouseMove,this).on(document,"mouseup",this._onMouseUp,this).preventDefault(e),this._map.fire("boxzoomstart")},_onMouseMove:function(e){var t=this._startLayerPoint,r=this._box,i=this._map.mouseEventToLayerPoint(e),s=i.subtract(t),o=new n.Point(Math.min(i.x,t.x),Math.min(i.y,t.y));n.DomUtil.setPosition(r,o),r.style.width=Math.abs(s.x)-4+"px",r.style.height=Math.abs(s.y)-4+"px"},_onMouseUp:function(e){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(document,"mousemove",this._onMouseMove).off(document,"mouseup",this._onMouseUp);var t=this._map,r=t.mouseEventToLayerPoint(e),i=new n.LatLngBounds(t.layerPointToLatLng(this._startLayerPoint),t.layerPointToLatLng(r));t.fitBounds(i),t.fire("boxzoomend",{boxZoomBounds:i})}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,61,107],zoomOut:[189,109,0]},initialize:function(e){this._map=e,this._setPanOffset(e.options.keyboardPanOffset),this._setZoomOffset(e.options.keyboardZoomOffset)},addHooks:function(){var e=this._map._container;e.tabIndex===-1&&(e.tabIndex="0"),n.DomEvent.addListener(e,"focus",this._onFocus,this).addListener(e,"blur",this._onBlur,this).addListener(e,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var e=this._map._container;n.DomEvent.removeListener(e,"focus",this._onFocus,this).removeListener(e,"blur",this._onBlur,this).removeListener(e,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(e){var t=this._panKeys={},n=this.keyCodes,r,i;for(r=0,i=n.left.length;re&&(n._index+=t)})},_createMiddleMarker:function(e,t){var n=this._getMiddleLatLng(e,t),r=this._createMarker(n),i,s,o;r.setOpacity(.6),e._middleRight=t._middleLeft=r,s=function(){var s=t._index;r._index=s,r.off("click",i).on("click",this._onMarkerClick,this),n.lat=r.getLatLng().lat,n.lng=r.getLatLng().lng,this._poly.spliceLatLngs(s,0,n),this._markers.splice(s,0,r),r.setOpacity(1),this._updateIndexes(s,1),t._index++,this._updatePrevNext(e,r),this._updatePrevNext(r,t)},o=function(){r.off("dragstart",s,this),r.off("dragend",o,this),this._createMiddleMarker(e,r),this._createMiddleMarker(r,t)},i=function(){s.call(this),o.call(this),this._poly.fire("edit")},r.on("click",i,this).on("dragstart",s,this).on("dragend",o,this),this._markerGroup.addLayer(r)},_updatePrevNext:function(e,t){e._next=t,t._prev=e},_getMiddleLatLng:function(e,t){var n=this._poly._map,r=n.latLngToLayerPoint(e.getLatLng()),i=n.latLngToLayerPoint(t.getLatLng());return n.layerPointToLatLng(r._add(i).divideBy(2))}}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(e){n.Util.setOptions(this,e)},getPosition:function(){return this.options.position},setPosition:function(e){var t=this._map;return t&&t.removeControl(this),this.options.position=e,t&&t.addControl(this),this},addTo:function(e){this._map=e;var t=this._container=this.onAdd(e),r=this.getPosition(),i=e._controlCorners[r];return n.DomUtil.addClass(t,"leaflet-control"),r.indexOf("bottom")!==-1?i.insertBefore(t,i.firstChild):i.appendChild(t),this},removeFrom:function(e){var t=this.getPosition(),n=e._controlCorners[t];return n.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(e),this}}),n.control=function(e){return new n.Control(e)},n.Map.include({addControl:function(e){return e.addTo(this),this},removeControl:function(e){return e.removeFrom(this),this},_initControlPos:function(){function i(i,s){var o=t+i+" "+t+s;e[i+s]=n.DomUtil.create("div",o,r)}var e=this._controlCorners={},t="leaflet-",r=this._controlContainer=n.DomUtil.create("div",t+"control-container",this._container);i("top","left"),i("top","right"),i("bottom","left"),i("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(e){var t="leaflet-control-zoom",r=n.DomUtil.create("div",t);return this._createButton("Zoom in",t+"-in",r,e.zoomIn,e),this._createButton("Zoom out",t+"-out",r,e.zoomOut,e),r},_createButton:function(e,t,r,i,s){var o=n.DomUtil.create("a",t,r);return o.href="#",o.title=e,n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",i,s).on(o,"dblclick",n.DomEvent.stopPropagation),o}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(e){return new n.Control.Zoom(e)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(e){n.Util.setOptions(this,e),this._attributions={}},onAdd:function(e){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),e.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(e){e.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(e){return this.options.prefix=e,this._update(),this},addAttribution:function(e){if(!e)return;return this._attributions[e]||(this._attributions[e]=0),this._attributions[e]++,this._update(),this},removeAttribution:function(e){if(!e)return;return this._attributions[e]--,this._update(),this},_update:function(){if(!this._map)return;var e=[];for(var t in this._attributions)this._attributions.hasOwnProperty(t)&&this._attributions[t]&&e.push(t);var n=[];this.options.prefix&&n.push(this.options.prefix),e.length&&n.push(e.join(", ")),this._container.innerHTML=n.join(" — ")},_onLayerAdd:function(e){e.layer.getAttribution&&this.addAttribution(e.layer.getAttribution())},_onLayerRemove:function(e){e.layer.getAttribution&&this.removeAttribution(e.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(e){return new n.Control.Attribution(e)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(e){this._map=e;var t="leaflet-control-scale",r=n.DomUtil.create("div",t),i=this.options;return this._addScales(i,t,r),e.on(i.updateWhenIdle?"moveend":"move",this._update,this),this._update(),r},onRemove:function(e){e.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(e,t,r){e.metric&&(this._mScale=n.DomUtil.create("div",t+"-line",r)),e.imperial&&(this._iScale=n.DomUtil.create("div",t+"-line",r))},_update:function(){var e=this._map.getBounds(),t=e.getCenter().lat,r=(new n.LatLng(t,0)).distanceTo(new n.LatLng(t,180)),i=r*(e.getNorthEast().lng-e.getSouthWest().lng)/180,s=this._map.getSize(),o=this.options,u=0;s.x>0&&(u=i*(o.maxWidth/s.x)),this._updateScales(o,u)},_updateScales:function(e,t){e.metric&&t&&this._updateMetric(t),e.imperial&&t&&this._updateImperial(t)},_updateMetric:function(e){var t=this._getRoundNum(e);this._mScale.style.width=this._getScaleWidth(t/e)+"px",this._mScale.innerHTML=t<1e3?t+" m":t/1e3+" km"},_updateImperial:function(e){var t=e*3.2808399,n=this._iScale,r,i,s;t>5280?(r=t/5280,i=this._getRoundNum(r),n.style.width=this._getScaleWidth(i/r)+"px",n.innerHTML=i+" mi"):(s=this._getRoundNum(t),n.style.width=this._getScaleWidth(s/t)+"px",n.innerHTML=s+" ft")},_getScaleWidth:function(e){return Math.round(this.options.maxWidth*e)-10},_getRoundNum:function(e){var t=Math.pow(10,(Math.floor(e)+"").length-1),n=e/t;return n=n>=10?10:n>=5?5:n>=3?3:n>=2?2:1,t*n}}),n.control.scale=function(e){return new n.Control.Scale(e)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(e,t,r){n.Util.setOptions(this,r),this._layers={},this._lastZIndex=0;for(var i in e)e.hasOwnProperty(i)&&this._addLayer(e[i],i);for(i in t)t.hasOwnProperty(i)&&this._addLayer(t[i],i,!0)},onAdd:function(e){return this._initLayout(),this._update(),this._container},addBaseLayer:function(e,t){return this._addLayer(e,t),this._update(),this},addOverlay:function(e,t){return this._addLayer(e,t,!0),this._update(),this},removeLayer:function(e){var t=n.Util.stamp(e);return delete this._layers[t],this._update(),this},_initLayout:function(){var e="leaflet-control-layers",t=this._container=n.DomUtil.create("div",e);n.Browser.touch?n.DomEvent.on(t,"click",n.DomEvent.stopPropagation):n.DomEvent.disableClickPropagation(t);var r=this._form=n.DomUtil.create("form",e+"-list");if(this.options.collapsed){n.DomEvent.on(t,"mouseover",this._expand,this).on(t,"mouseout",this._collapse,this);var i=this._layersLink=n.DomUtil.create("a",e+"-toggle",t);i.href="#",i.title="Layers",n.Browser.touch?n.DomEvent.on(i,"click",n.DomEvent.stopPropagation).on(i,"click",n.DomEvent.preventDefault).on(i,"click",this._expand,this):n.DomEvent.on(i,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",e+"-base",r),this._separator=n.DomUtil.create("div",e+"-separator",r),this._overlaysList=n.DomUtil.create("div",e+"-overlays",r),t.appendChild(r)},_addLayer:function(e,t,r){var i=n.Util.stamp(e);this._layers[i]={layer:e,name:t,overlay:r},this.options.autoZIndex&&e.setZIndex&&(this._lastZIndex++,e.setZIndex(this._lastZIndex))},_update:function(){if(!this._container)return;this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var e=!1,t=!1;for(var n in this._layers)if(this._layers.hasOwnProperty(n)){var r=this._layers[n];this._addItem(r),t=t||r.overlay,e=e||!r.overlay}this._separator.style.display=t&&e?"":"none"},_addItem:function(e,t){var r=document.createElement("label"),i=document.createElement("input");e.overlay||(i.name="leaflet-base-layers"),i.type=e.overlay?"checkbox":"radio",i.layerId=n.Util.stamp(e.layer),i.defaultChecked=this._map.hasLayer(e.layer),n.DomEvent.on(i,"click",this._onInputClick,this);var s=document.createTextNode(" "+e.name);r.appendChild(i),r.appendChild(s);var o=e.overlay?this._overlaysList:this._baseLayersList;o.appendChild(r)},_onInputClick:function(){var e,t,n,r=this._form.getElementsByTagName("input"),i=r.length;for(e=0;e.5&&this._getLoadedTilesPercentage(e)<.5){e.style.visibility="hidden",e.empty=!0,this._stopLoadingImages(e);return}t||(t=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),t.style.zIndex=1),t.style[n.DomUtil.TRANSFORM]="",t.style.visibility="hidden",t.empty=!0,e.empty=!1,this._tilePane=this._panes.tilePane=t;var r=this._tileBg=e;r.transition||(r.transition=new n.Transition(r,{duration:.25,easing:"cubic-bezier(0.25,0.1,0.25,0.75)"}),r.transition.on("end",this._onZoomTransitionEnd,this)),this._stopLoadingImages(r)},_getLoadedTilesPercentage:function(e){var t=e.getElementsByTagName("img"),n,r,i=0;for(n=0,r=t.length;n Date: Mon, 30 Jul 2012 16:58:58 +0300 Subject: [PATCH 0232/2207] add MapMarker to plugins list --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 4c9e79af9d4..47c13da7e35 100644 --- a/plugins.md +++ b/plugins.md @@ -230,6 +230,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jan Marsch + + + Leaflet Maps Marker + + A Wordpress plugin that uses Leaflet and a set of its plugins for adding maps to your posts through a nice admin interface. + + Robert Harm + + leaflet-hash From 46eb40de6fa6d96b6469311e0af6bd01b2eb427e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 31 Jul 2012 11:11:04 +0300 Subject: [PATCH 0233/2207] update about 0.4.1 --- _posts/2012-07-30-leaflet-0-4-released.md | 9 +++++++++ download.md | 10 +++++----- reference.html | 5 +++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index da2c3516aa8..9342ac2e613 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -188,6 +188,15 @@ And, of course, thanks to my amazing company, [CloudMade](http://cloudmade.com), Sincerely,
      Vladimir Agafonkin, Leaflet maintainer. +
      + +**Update (July 31)**: 0.4.1 hotfix was released with the following bugs fixed: + + * Fixed a bug that caused marker shadows to appear as opaque black in IE6-8. [#850](https://github.com/CloudMade/Leaflet/issues/850) + * Fixed a bug with incorrect calculation of scale by the scale control. [#852](https://github.com/CloudMade/Leaflet/issues/852) + * Fixed broken L.tileLayer.wms class factory. [#856](https://github.com/CloudMade/Leaflet/issues/856) + * Improved retina detection for `TileLayer` `detectRetina` option. [#854](https://github.com/CloudMade/Leaflet/issues/854) + [LatLng]: ../../../reference.html#latlng [LatLngBounds]: ../../../reference.html#latlngbounds diff --git a/download.md b/download.md index b0d3e8791ac..0333b73f5f5 100644 --- a/download.md +++ b/download.md @@ -13,8 +13,8 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.4 - Stable version, released on July 30, 2012 + Leaflet 0.4.1 + Stable version, released on July 31, 2012 Leaflet 0.3.1 @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source diff --git a/reference.html b/reference.html index 8e82a0d1ad6..bc7a3c7b646 100644 --- a/reference.html +++ b/reference.html @@ -4366,6 +4366,11 @@

      L.Browser

      Boolean true for all browsers on touch devices. + + retina + Boolean + true for devices with Retina screens. + From e94052de42227397f7fbe435958adc3d23f9d294 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 31 Jul 2012 11:19:09 +0300 Subject: [PATCH 0234/2207] update docs for #857 --- reference.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index bc7a3c7b646..1abcb025b10 100644 --- a/reference.html +++ b/reference.html @@ -615,9 +615,11 @@

      Methods for Modifying Map State

      Pans the map by a given number of pixels (animated). - invalidateSize() + invalidateSize( + <Boolean> animate? ) + this - Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. + Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. If animate is true, map animates the update. setMaxBounds( From e37f4fd9f3910f64ff0b8f1d593371cccebc4542 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 31 Jul 2012 17:50:54 +0300 Subject: [PATCH 0235/2207] fix typo in layers control link --- examples/layers-control.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/layers-control.md b/examples/layers-control.md index 5d3b7ebe550..0b85c3bf720 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -9,7 +9,7 @@ This tutorial will show you how to group several layers into one, and how to use
      -[View example on a separate page →](ayers-control-example.html) +[View example on a separate page →](layers-control-example.html) ### Layer Groups From fae9ceee363f66af1734c081c190c7ec68758ef1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Aug 2012 14:22:32 +0300 Subject: [PATCH 0236/2207] update cdn links to 0.4.2 --- download.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/download.md b/download.md index 0333b73f5f5..7549efc265a 100644 --- a/download.md +++ b/download.md @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source From f58a5b0c5b35fbafc64828268168765bd13958ea Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Aug 2012 14:26:22 +0300 Subject: [PATCH 0237/2207] update blogpost with 0.4.2 --- _posts/2012-07-30-leaflet-0-4-released.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index 9342ac2e613..464438242f2 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -197,6 +197,11 @@ Vladimir Agafonkin, Leaflet maintainer. * Fixed broken L.tileLayer.wms class factory. [#856](https://github.com/CloudMade/Leaflet/issues/856) * Improved retina detection for `TileLayer` `detectRetina` option. [#854](https://github.com/CloudMade/Leaflet/issues/854) +**Update (August 1)**: 0.4.2 hotfix was released with the following bugs fixed: + + * Fixed a bug where layers control radio buttons would not work correctly in IE7. [#862](https://github.com/CloudMade/Leaflet/pull/862) + * Fixed a bug where `FeatureGroup` `removeLayer` would unbind popups of removed layers even if the popups were not put by the group (affected [Leaflet.markercluster](https://github.com/danzel/Leaflet.markercluster) plugin). [#861](https://github.com/CloudMade/Leaflet/pull/861) + [LatLng]: ../../../reference.html#latlng [LatLngBounds]: ../../../reference.html#latlngbounds From ffa20b558c90f4bea040a193e10254d9275f1d9a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Aug 2012 14:27:57 +0300 Subject: [PATCH 0238/2207] update download page with 0.4.2 --- download.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/download.md b/download.md index 7549efc265a..ea84c884e8d 100644 --- a/download.md +++ b/download.md @@ -13,8 +13,8 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.4.1 - Stable version, released on July 31, 2012 + Leaflet 0.4.2 + Stable version, released on August 1, 2012 Leaflet 0.3.1 From f6efb08b4a9bd17e2046b31c22aa703b97b80b83 Mon Sep 17 00:00:00 2001 From: Eric Theise Date: Mon, 6 Aug 2012 08:59:08 -0300 Subject: [PATCH 0239/2207] Update reference.html Fixing typos ("preciously" should be "previously"), the default values of offset for L.Popup are (0,6), not (0,0). --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index bc7a3c7b646..7ff638feb8a 100644 --- a/reference.html +++ b/reference.html @@ -1354,7 +1354,7 @@ offset Point - Point(0, 0) + Point(0, 6) The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays. @@ -5197,7 +5197,7 @@

      Methods

      - - Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners preciously added in onAdd. Called on map.removeLayer(layer). + Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). From f41c68f4181a297ab3b62191fbd3f2a76058af65 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 12:44:50 +0300 Subject: [PATCH 0240/2207] update docs with 0.4.3 changes --- reference.html | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/reference.html b/reference.html index b148bb6e07c..6f0cefcf4bc 100644 --- a/reference.html +++ b/reference.html @@ -2635,6 +2635,16 @@

      Methods

      this Sets the given path options to each layer of the group that has a setStyle method. + + bringToFront() + this + Brings the layer group to the top of all other layers. + + + bringToBack() + this + Brings the layer group to the bottom of all other layers. +

      Events

      @@ -2693,6 +2703,8 @@

      L.GeoJSON

      } }).addTo(map);
      +

      Each feature layer created by it gets a feature property that links to the GeoJSON feature data the layer was created from (so that you can access its properties later).

      +

      Constructor

      @@ -2773,6 +2785,22 @@

      Methods

      + + + + + + + + + + + +
      Boolean Adds a GeoJSON object to the layer.
      setStyle( + <Function> style ) + thisChanges styles of GeoJSON vector layers with the given style function.
      resetStyle( + <Path> layer ) + thisResets the the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events.

      Static methods

      From 76e76d02c210212cc83626637dc9dd6be47445f3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 13:01:39 +0300 Subject: [PATCH 0241/2207] add Wall Street Journal link to frontpage --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index fe93e886b6d..c5aea67cd1b 100644 --- a/index.md +++ b/index.md @@ -9,7 +9,7 @@ Leaflet is a modern open-source JavaScript library for mobile-friendly interacti It is built from the ground up to work efficiently on both desktop and mobile platforms like iOS and Android, taking advantage of HTML5 and CSS3 on modern browsers. The focus is on usability, performance, small size, [A-grade][] browser support and [a simple API][] with convention over configuration. The OOP-based [code of the library][] is designed to be modular, extensible and very easy to understand. {: .usedby} -Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data.com](http://city-data.com) [Topix](http://topix.com/) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [CityMaps](http://www.citymaps.com) ... +Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [Meetup](http://www.meetup.com/) [WSJ](http://projects.wsj.com/campaign2012/maps/) [Geocaching](http://geocaching.com) [StreetEasy](http://streeteasy.com/) [Nestoria](http://www.nestoria.co.uk) [City-Data](http://city-data.com) [Topix](http://topix.com/) [Chartbeat](http://chartbeat.com/) [GIS Cloud](http://www.giscloud.com/) [CityMaps](http://www.citymaps.com) ...
      From f847e07c064dcebe1cf7742316ace634658fe6bd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 13:01:56 +0300 Subject: [PATCH 0242/2207] update references to 0.4.3 --- download.md | 10 +++++----- reference.html | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/download.md b/download.md index ea84c884e8d..0de048e1708 100644 --- a/download.md +++ b/download.md @@ -13,8 +13,8 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.4.2 - Stable version, released on August 1, 2012 + Leaflet 0.4.3 + Stable version, released on August 7, 2012 Leaflet 0.3.1 @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source diff --git a/reference.html b/reference.html index 6f0cefcf4bc..c7ff9a76255 100644 --- a/reference.html +++ b/reference.html @@ -123,7 +123,7 @@

      Misc


      -

      This reference reflects Leaflet 0.4. You can find docs for the in-progress master version in reference.html of gh-pages-master branch

      +

      This reference reflects Leaflet 0.4.3. You can find docs for the in-progress master version in reference.html of gh-pages-master branch

      L.Map

      From 6b4d64a32030bf0be6c8b56310f5d24fab987b49 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 17:45:47 +0300 Subject: [PATCH 0243/2207] Added new choropleth map tutorial --- _layouts/default.html | 2 + docs/css/blueprint/screen.css | 8 +- docs/images/choropleth.png | Bin 0 -> 7976 bytes examples.md | 8 + examples/choropleth-example.html | 169 ++++++++++++++ examples/choropleth.md | 383 +++++++++++++++++++++++++++++++ examples/us-states.js | 54 +++++ 7 files changed, 620 insertions(+), 4 deletions(-) create mode 100644 docs/images/choropleth.png create mode 100644 examples/choropleth-example.html create mode 100644 examples/choropleth.md create mode 100644 examples/us-states.js diff --git a/_layouts/default.html b/_layouts/default.html index 40e947f9cf1..38e7ccb2b15 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -38,6 +38,8 @@ + {% if page.css %}{% endif %} + + + + + + diff --git a/examples/choropleth.md b/examples/choropleth.md new file mode 100644 index 00000000000..d280334473b --- /dev/null +++ b/examples/choropleth.md @@ -0,0 +1,383 @@ +--- +layout: tutorial +title: Interactive Choropleth Map +css: "#map { + height: 420px; + } + + .info { + padding: 6px 8px; + font: 14px/18px Arial, Helvetica, sans-serif; + background: white; + background: rgba(255,255,255,0.8); + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + } + .info h4 { + margin: 0 0 5px; + color: #777; + } + + .legend { + text-align: left; + line-height: 18px; + color: #555; + } + .legend i { + width: 18px; + height: 18px; + float: left; + margin-right: 8px; + opacity: 0.7; + }" +--- + +## Interactive Choropleth Map + +This is a case study of creating a colorful interactive choropleth map of US States Population Density with the help of [GeoJSON](geojson.html) and some [custom controls](../reference.html#icontrol) (that will hopefully convince all the remaining major news and government websites that do not use Leaflet yet to start doing so). + +The tutorial was inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/about/staff/ryan-murphy/) (also powered by Leaflet), created by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/). + +
      + +[View example on a separate page →](choropleth-example.html) + +### Data Source + +We'll be creating a visualization of population density per US state. As the amount of data (state shapes and the density value for each state) is not very big, the most convenient and simple way to store and then display it is [GeoJSON](geojson.html). + +Each feature of our GeoJSON data ([us-states.js](us-states.js)) will look like this: + + { + "type": "Feature", + "properties": { + "name": "Alabama", + "density": 94.65 + }, + "geometry": ... + ... + } + +The GeoJSON with state shapes was kindly shared by [Mike Bostock](http://bost.ocks.org/mike) of [D3](http://d3js.org/) fame, extended with density values from [this Wikipedia article](http://en.wikipedia.org/wiki/List_of_U.S._states_by_population_density) based on July 1st 2011 data from [US Census Bureau](http://www.census.gov/) and assigned to `statesData` JS variable. + +### Basic States Map + +Lets display our states data on a map with CloudMade tiles of style 22677 for nice grayscale tiles that look perfect as a background for visualizations: + + var map = L.map('map').setView([37.8, -96], 4); + + L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', { + key: ..., + attribution: ..., + styleId: 22677 + }).addTo(map); + + L.geoJson(statesData).addTo(map); + +
      + + +### Adding Some Color + +Now we need to color the states according to their population density. Choosing nice colors for a map can be tricky, but there's a great tool that can help with it --- [ColorBrewer](http://colorbrewer2.org/). Using the values we got from it, we create a function that returns a color based on population density: + + function getColor(d) { + return d > 1000 ? '#800026' : + d > 500 ? '#BD0026' : + d > 200 ? '#E31A1C' : + d > 100 ? '#FC4E2A' : + d > 50 ? '#FD8D3C' : + d > 20 ? '#FEB24C' : + d > 10 ? '#FED976' : + '#FFEDA0'; + } + +Next we define a styling function for our GeoJSON layer so that its `fillColor` depends on `feature.properties.density` property, also adjusting the appearance a bit and adding a nice touch with dashed stroke. + + function style(feature) { + return { + fillColor: getColor(feature.properties.density), + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + }; + } + + L.geoJson(statesData, {style: style}).addTo(map); + +Looks much better now! + +
      + + +### Adding Interaction + +Now lets make the states highlighted visually in some way when they are hovered with a mouse. First we'll define an event listener for layer `mouseover` event: + + function highlightFeature(e) { + var layer = e.target; + + layer.bringToFront().setStyle({ + weight: 5, + color: '#666', + dashArray: '', + fillOpacity: 0.7 + }); + } + +Here we get access to the layer that was hovered through `e.target`, set a thick grey border on the layer as our highlight effect, also bringing it to the front so that the border doesn't clash with nearby states. + +Next we'll define what happens on `mouseout`: + + function resetHighlight(e) { + geojson.resetStyle(e.target); + } + +The handy `geojson.resetStyle` method will reset the layer style to its default state (defined by our `style` function). For this to work, make sure our GeoJSON layer is accessible through the `geojson` variable by defining it before our listeners and assigning the layer to it later: + + var geojson; + // ... our listeners + geojson = L.geoJson(...); + +As an additional touch, lets define a `click` listener that zooms to the state: + + function zoomToFeature(e) { + map.fitBounds(e.target.getBounds()); + } + +Now we'll use the `onEachFeature` option to add the listeners on our state layers: + + function onEachFeature(feature, layer) { + layer.on({ + mouseover: highlightFeature, + mouseout: resetHighlight, + click: zoomToFeature + }); + } + + geojson = L.geoJson(statesData, { + style: style, + onEachFeature: onEachFeature + }).addTo(map); + +This makes the states highlight nicely on hover and gives us the ability to add other interactions inside our listeners. + +### Custom Info Control + +We could use the usual popups on click to show information about different states, but we'll choose a different route --- showing it on state hover inside a [custom control](../reference.html#icontrol). + +Here's the code for our control: + + var info = L.control(); + + info.onAdd = function (map) { + this._div = L.DomUtil.create('div', 'info'); // create a div with a class "info" + this.update(); + return this._div; + }; + + // method that we will use to update the control based on feature properties passed + info.update = function (props) { + this._div.innerHTML = '

      US Population Density

      ' + (props ? + '' + props.name + '
      ' + props.density + ' people / mi2' + : 'Hover over a state'); + }; + + info.addTo(map); + +We need to update the control when the user hovers over a state, so we'll also modify our listeners as follows: + + function highlightFeature(e) { + ... + info.update(layer.feature.properties); + } + + function resetHighlight(e) { + ... + info.update(); + } + +The control also needs some CSS styles to look nice: + +{: .css} + .info { + padding: 6px 8px; + font: 14px/16px Arial, Helvetica, sans-serif; + background: white; + background: rgba(255,255,255,0.8); + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + } + .info h4 { + margin: 0 0 5px; + color: #777; + } + +### Custom Legend Control + +Creating a control with a legend is easier, since it is static and doesn't change on state hover. JavaScript code: + + var legend = L.control({position: 'bottomright'}); + + legend.onAdd = function (map) { + + var div = L.DomUtil.create('div', 'info legend'), + grades = [0, 10, 20, 50, 100, 200, 500, 1000], + labels = []; + + // loop through our density intervals and generate a label with a colored square for each interval + for (var i = 0; i < grades.length; i++) { + div.innerHTML += + ' ' + + grades[i] + (grades[i + 1] ? '–' + grades[i + 1] + '
      ' : '+'); + } + + return div; + }; + + legend.addTo(map); + +CSS styles for the control (we also reuse the `info` class defined earlier): + +{: .css} + .legend { + line-height: 18px; + color: #555; + } + .legend i { + width: 18px; + height: 18px; + float: left; + margin-right: 8px; + opacity: 0.7; + } + +Enjoy the result on [the top of this page](#map) or on a [separate page](choropleth-example.html). + + + diff --git a/examples/us-states.js b/examples/us-states.js new file mode 100644 index 00000000000..7f6af2fb34b --- /dev/null +++ b/examples/us-states.js @@ -0,0 +1,54 @@ +var statesData = {"type":"FeatureCollection","features":[ +{"type":"Feature","id":"01","properties":{"name":"Alabama","density":94.65},"geometry":{"type":"Polygon","coordinates":[[[-87.359296,35.00118],[-85.606675,34.984749],[-85.431413,34.124869],[-85.184951,32.859696],[-85.069935,32.580372],[-84.960397,32.421541],[-85.004212,32.322956],[-84.889196,32.262709],[-85.058981,32.13674],[-85.053504,32.01077],[-85.141136,31.840985],[-85.042551,31.539753],[-85.113751,31.27686],[-85.004212,31.003013],[-85.497137,30.997536],[-87.600282,30.997536],[-87.633143,30.86609],[-87.408589,30.674397],[-87.446927,30.510088],[-87.37025,30.427934],[-87.518128,30.280057],[-87.655051,30.247195],[-87.90699,30.411504],[-87.934375,30.657966],[-88.011052,30.685351],[-88.10416,30.499135],[-88.137022,30.318396],[-88.394438,30.367688],[-88.471115,31.895754],[-88.241084,33.796253],[-88.098683,34.891641],[-88.202745,34.995703],[-87.359296,35.00118]]]}}, +{"type":"Feature","id":"02","properties":{"name":"Alaska","density":1.264},"geometry":{"type":"MultiPolygon","coordinates":[[[[-131.602021,55.117982],[-131.569159,55.28229],[-131.355558,55.183705],[-131.38842,55.01392],[-131.645836,55.035827],[-131.602021,55.117982]]],[[[-131.832052,55.42469],[-131.645836,55.304197],[-131.749898,55.128935],[-131.832052,55.189182],[-131.832052,55.42469]]],[[[-132.976733,56.437924],[-132.735747,56.459832],[-132.631685,56.421493],[-132.664547,56.273616],[-132.878148,56.240754],[-133.069841,56.333862],[-132.976733,56.437924]]],[[[-133.595627,56.350293],[-133.162949,56.317431],[-133.05341,56.125739],[-132.620732,55.912138],[-132.472854,55.780691],[-132.4619,55.671152],[-132.357838,55.649245],[-132.341408,55.506844],[-132.166146,55.364444],[-132.144238,55.238474],[-132.029222,55.276813],[-131.97993,55.178228],[-131.958022,54.789365],[-132.029222,54.701734],[-132.308546,54.718165],[-132.385223,54.915335],[-132.483808,54.898904],[-132.686455,55.046781],[-132.746701,54.997489],[-132.916486,55.046781],[-132.889102,54.898904],[-132.73027,54.937242],[-132.626209,54.882473],[-132.675501,54.679826],[-132.867194,54.701734],[-133.157472,54.95915],[-133.239626,55.090597],[-133.223195,55.22752],[-133.453227,55.216566],[-133.453227,55.320628],[-133.277964,55.331582],[-133.102702,55.42469],[-133.17938,55.588998],[-133.387503,55.62186],[-133.420365,55.884753],[-133.497042,56.0162],[-133.639442,55.923092],[-133.694212,56.070969],[-133.546335,56.142169],[-133.666827,56.311955],[-133.595627,56.350293]]],[[[-133.738027,55.556137],[-133.546335,55.490413],[-133.414888,55.572568],[-133.283441,55.534229],[-133.420365,55.386352],[-133.633966,55.430167],[-133.738027,55.556137]]],[[[-133.907813,56.930849],[-134.050213,57.029434],[-133.885905,57.095157],[-133.343688,57.002049],[-133.102702,57.007526],[-132.932917,56.82131],[-132.620732,56.667956],[-132.653593,56.55294],[-132.817901,56.492694],[-133.042456,56.520078],[-133.201287,56.448878],[-133.420365,56.492694],[-133.66135,56.448878],[-133.710643,56.684386],[-133.688735,56.837741],[-133.869474,56.843218],[-133.907813,56.930849]]],[[[-134.115936,56.48174],[-134.25286,56.558417],[-134.400737,56.722725],[-134.417168,56.848695],[-134.296675,56.908941],[-134.170706,56.848695],[-134.143321,56.952757],[-133.748981,56.772017],[-133.710643,56.596755],[-133.847566,56.574848],[-133.935197,56.377678],[-133.836612,56.322908],[-133.957105,56.092877],[-134.110459,56.142169],[-134.132367,55.999769],[-134.230952,56.070969],[-134.291198,56.350293],[-134.115936,56.48174]]],[[[-134.636246,56.28457],[-134.669107,56.169554],[-134.806031,56.235277],[-135.178463,56.67891],[-135.413971,56.810356],[-135.331817,56.914418],[-135.424925,57.166357],[-135.687818,57.369004],[-135.419448,57.566174],[-135.298955,57.48402],[-135.063447,57.418296],[-134.849846,57.407343],[-134.844369,57.248511],[-134.636246,56.728202],[-134.636246,56.28457]]],[[[-134.712923,58.223407],[-134.373353,58.14673],[-134.176183,58.157683],[-134.187137,58.081006],[-133.902336,57.807159],[-134.099505,57.850975],[-134.148798,57.757867],[-133.935197,57.615466],[-133.869474,57.363527],[-134.083075,57.297804],[-134.154275,57.210173],[-134.499322,57.029434],[-134.603384,57.034911],[-134.6472,57.226604],[-134.575999,57.341619],[-134.608861,57.511404],[-134.729354,57.719528],[-134.707446,57.829067],[-134.784123,58.097437],[-134.91557,58.212453],[-134.953908,58.409623],[-134.712923,58.223407]]],[[[-135.857603,57.330665],[-135.715203,57.330665],[-135.567326,57.149926],[-135.633049,57.023957],[-135.857603,56.996572],[-135.824742,57.193742],[-135.857603,57.330665]]],[[[-136.279328,58.206976],[-135.978096,58.201499],[-135.780926,58.28913],[-135.496125,58.168637],[-135.64948,58.037191],[-135.59471,57.987898],[-135.45231,58.135776],[-135.107263,58.086483],[-134.91557,57.976944],[-135.025108,57.779775],[-134.937477,57.763344],[-134.822462,57.500451],[-135.085355,57.462112],[-135.572802,57.675713],[-135.556372,57.456635],[-135.709726,57.369004],[-135.890465,57.407343],[-136.000004,57.544266],[-136.208128,57.637374],[-136.366959,57.829067],[-136.569606,57.916698],[-136.558652,58.075529],[-136.421728,58.130299],[-136.377913,58.267222],[-136.279328,58.206976]]],[[[-147.079854,60.200582],[-147.501579,59.948643],[-147.53444,59.850058],[-147.874011,59.784335],[-147.80281,59.937689],[-147.435855,60.09652],[-147.205824,60.271782],[-147.079854,60.200582]]],[[[-147.561825,60.578491],[-147.616594,60.370367],[-147.758995,60.156767],[-147.956165,60.227967],[-147.791856,60.474429],[-147.561825,60.578491]]],[[[-147.786379,70.245291],[-147.682318,70.201475],[-147.162008,70.15766],[-146.888161,70.185044],[-146.510252,70.185044],[-146.099482,70.146706],[-145.858496,70.168614],[-145.622988,70.08646],[-145.195787,69.993352],[-144.620708,69.971444],[-144.461877,70.026213],[-144.078491,70.059075],[-143.914183,70.130275],[-143.497935,70.141229],[-143.503412,70.091936],[-143.25695,70.119321],[-142.747594,70.042644],[-142.402547,69.916674],[-142.079408,69.856428],[-142.008207,69.801659],[-141.712453,69.790705],[-141.433129,69.697597],[-141.378359,69.63735],[-141.208574,69.686643],[-141.00045,69.648304],[-141.00045,60.304644],[-140.53491,60.22249],[-140.474664,60.310121],[-139.987216,60.184151],[-139.696939,60.342983],[-139.088998,60.359413],[-139.198537,60.091043],[-139.045183,59.997935],[-138.700135,59.910304],[-138.623458,59.767904],[-137.604747,59.242118],[-137.445916,58.908024],[-137.265177,59.001132],[-136.827022,59.159963],[-136.580559,59.16544],[-136.465544,59.285933],[-136.476498,59.466672],[-136.301236,59.466672],[-136.25742,59.625503],[-135.945234,59.663842],[-135.479694,59.800766],[-135.025108,59.565257],[-135.068924,59.422857],[-134.959385,59.280456],[-134.701969,59.247595],[-134.378829,59.033994],[-134.400737,58.973748],[-134.25286,58.858732],[-133.842089,58.727285],[-133.173903,58.152206],[-133.075318,57.998852],[-132.867194,57.845498],[-132.560485,57.505928],[-132.253777,57.21565],[-132.368792,57.095157],[-132.05113,57.051341],[-132.127807,56.876079],[-131.870391,56.804879],[-131.837529,56.602232],[-131.580113,56.613186],[-131.087188,56.405062],[-130.78048,56.366724],[-130.621648,56.268139],[-130.468294,56.240754],[-130.424478,56.142169],[-130.101339,56.114785],[-130.002754,55.994292],[-130.150631,55.769737],[-130.128724,55.583521],[-129.986323,55.276813],[-130.095862,55.200136],[-130.336847,54.920812],[-130.687372,54.718165],[-130.785957,54.822227],[-130.917403,54.789365],[-131.010511,54.997489],[-130.983126,55.08512],[-131.092665,55.189182],[-130.862634,55.298721],[-130.928357,55.337059],[-131.158389,55.200136],[-131.284358,55.287767],[-131.426759,55.238474],[-131.843006,55.457552],[-131.700606,55.698537],[-131.963499,55.616383],[-131.974453,55.49589],[-132.182576,55.588998],[-132.226392,55.704014],[-132.083991,55.829984],[-132.127807,55.955953],[-132.324977,55.851892],[-132.522147,56.076446],[-132.642639,56.032631],[-132.719317,56.218847],[-132.527624,56.339339],[-132.341408,56.339339],[-132.396177,56.487217],[-132.297592,56.67891],[-132.450946,56.673433],[-132.768609,56.837741],[-132.993164,57.034911],[-133.51895,57.177311],[-133.507996,57.577128],[-133.677781,57.62642],[-133.639442,57.790728],[-133.814705,57.834544],[-134.072121,58.053622],[-134.143321,58.168637],[-134.586953,58.206976],[-135.074401,58.502731],[-135.282525,59.192825],[-135.38111,59.033994],[-135.337294,58.891593],[-135.140124,58.617746],[-135.189417,58.573931],[-135.05797,58.349376],[-135.085355,58.201499],[-135.277048,58.234361],[-135.430402,58.398669],[-135.633049,58.426053],[-135.91785,58.382238],[-135.912373,58.617746],[-136.087635,58.814916],[-136.246466,58.75467],[-136.876314,58.962794],[-136.931084,58.902547],[-136.586036,58.836824],[-136.317666,58.672516],[-136.213604,58.667039],[-136.180743,58.535592],[-136.043819,58.382238],[-136.388867,58.294607],[-136.591513,58.349376],[-136.59699,58.212453],[-136.859883,58.316515],[-136.947514,58.393192],[-137.111823,58.393192],[-137.566409,58.590362],[-137.900502,58.765624],[-137.933364,58.869686],[-138.11958,59.02304],[-138.634412,59.132579],[-138.919213,59.247595],[-139.417615,59.379041],[-139.746231,59.505011],[-139.718846,59.641934],[-139.625738,59.598119],[-139.5162,59.68575],[-139.625738,59.88292],[-139.488815,59.992458],[-139.554538,60.041751],[-139.801,59.833627],[-140.315833,59.696704],[-140.92925,59.745996],[-141.444083,59.871966],[-141.46599,59.970551],[-141.706976,59.948643],[-141.964392,60.019843],[-142.539471,60.085566],[-142.873564,60.091043],[-143.623905,60.036274],[-143.892275,59.997935],[-144.231845,60.140336],[-144.65357,60.206059],[-144.785016,60.29369],[-144.834309,60.441568],[-145.124586,60.430614],[-145.223171,60.299167],[-145.738004,60.474429],[-145.820158,60.551106],[-146.351421,60.408706],[-146.608837,60.238921],[-146.718376,60.397752],[-146.608837,60.485383],[-146.455483,60.463475],[-145.951604,60.578491],[-146.017328,60.666122],[-146.252836,60.622307],[-146.345944,60.737322],[-146.565022,60.753753],[-146.784099,61.044031],[-146.866253,60.972831],[-147.172962,60.934492],[-147.271547,60.972831],[-147.375609,60.879723],[-147.758995,60.912584],[-147.775426,60.808523],[-148.032842,60.781138],[-148.153334,60.819476],[-148.065703,61.005692],[-148.175242,61.000215],[-148.350504,60.803046],[-148.109519,60.737322],[-148.087611,60.594922],[-147.939734,60.441568],[-148.027365,60.277259],[-148.219058,60.332029],[-148.273827,60.249875],[-148.087611,60.217013],[-147.983549,59.997935],[-148.251919,59.95412],[-148.399797,59.997935],[-148.635305,59.937689],[-148.755798,59.986981],[-149.067984,59.981505],[-149.05703,60.063659],[-149.204907,60.008889],[-149.287061,59.904827],[-149.418508,59.997935],[-149.582816,59.866489],[-149.511616,59.806242],[-149.741647,59.729565],[-149.949771,59.718611],[-150.031925,59.61455],[-150.25648,59.521442],[-150.409834,59.554303],[-150.579619,59.444764],[-150.716543,59.450241],[-151.001343,59.225687],[-151.308052,59.209256],[-151.406637,59.280456],[-151.592853,59.159963],[-151.976239,59.253071],[-151.888608,59.422857],[-151.636669,59.483103],[-151.47236,59.472149],[-151.423068,59.537872],[-151.127313,59.669319],[-151.116359,59.778858],[-151.505222,59.63098],[-151.828361,59.718611],[-151.8667,59.778858],[-151.702392,60.030797],[-151.423068,60.211536],[-151.379252,60.359413],[-151.297098,60.386798],[-151.264237,60.545629],[-151.406637,60.720892],[-151.06159,60.786615],[-150.404357,61.038554],[-150.245526,60.939969],[-150.042879,60.912584],[-149.741647,61.016646],[-150.075741,61.15357],[-150.207187,61.257632],[-150.47008,61.246678],[-150.656296,61.29597],[-150.711066,61.252155],[-151.023251,61.180954],[-151.165652,61.044031],[-151.477837,61.011169],[-151.800977,60.852338],[-151.833838,60.748276],[-152.080301,60.693507],[-152.13507,60.578491],[-152.310332,60.507291],[-152.392486,60.304644],[-152.732057,60.173197],[-152.567748,60.069136],[-152.704672,59.915781],[-153.022334,59.888397],[-153.049719,59.691227],[-153.345474,59.620026],[-153.438582,59.702181],[-153.586459,59.548826],[-153.761721,59.543349],[-153.72886,59.433811],[-154.117723,59.368087],[-154.1944,59.066856],[-153.750768,59.050425],[-153.400243,58.968271],[-153.301658,58.869686],[-153.444059,58.710854],[-153.679567,58.612269],[-153.898645,58.606793],[-153.920553,58.519161],[-154.062953,58.4863],[-153.99723,58.376761],[-154.145107,58.212453],[-154.46277,58.059098],[-154.643509,58.059098],[-154.818771,58.004329],[-154.988556,58.015283],[-155.120003,57.955037],[-155.081664,57.872883],[-155.328126,57.829067],[-155.377419,57.708574],[-155.547204,57.785251],[-155.73342,57.549743],[-156.045606,57.566174],[-156.023698,57.440204],[-156.209914,57.473066],[-156.34136,57.418296],[-156.34136,57.248511],[-156.549484,56.985618],[-156.883577,56.952757],[-157.157424,56.832264],[-157.20124,56.766541],[-157.376502,56.859649],[-157.672257,56.607709],[-157.754411,56.67891],[-157.918719,56.657002],[-157.957058,56.514601],[-158.126843,56.459832],[-158.32949,56.48174],[-158.488321,56.339339],[-158.208997,56.295524],[-158.510229,55.977861],[-159.375585,55.873799],[-159.616571,55.594475],[-159.676817,55.654722],[-159.643955,55.829984],[-159.813741,55.857368],[-160.027341,55.791645],[-160.060203,55.720445],[-160.394296,55.605429],[-160.536697,55.473983],[-160.580512,55.567091],[-160.668143,55.457552],[-160.865313,55.528752],[-161.232268,55.358967],[-161.506115,55.364444],[-161.467776,55.49589],[-161.588269,55.62186],[-161.697808,55.517798],[-161.686854,55.408259],[-162.053809,55.074166],[-162.179779,55.15632],[-162.218117,55.03035],[-162.470057,55.052258],[-162.508395,55.249428],[-162.661749,55.293244],[-162.716519,55.222043],[-162.579595,55.134412],[-162.645319,54.997489],[-162.847965,54.926289],[-163.00132,55.079643],[-163.187536,55.090597],[-163.220397,55.03035],[-163.034181,54.942719],[-163.373752,54.800319],[-163.14372,54.76198],[-163.138243,54.696257],[-163.329936,54.74555],[-163.587352,54.614103],[-164.085754,54.61958],[-164.332216,54.531949],[-164.354124,54.466226],[-164.638925,54.389548],[-164.847049,54.416933],[-164.918249,54.603149],[-164.710125,54.663395],[-164.551294,54.88795],[-164.34317,54.893427],[-163.894061,55.041304],[-163.532583,55.046781],[-163.39566,54.904381],[-163.291598,55.008443],[-163.313505,55.128935],[-163.105382,55.183705],[-162.880827,55.183705],[-162.579595,55.446598],[-162.245502,55.682106],[-161.807347,55.89023],[-161.292514,55.983338],[-161.078914,55.939523],[-160.87079,55.999769],[-160.816021,55.912138],[-160.931036,55.813553],[-160.805067,55.736876],[-160.766728,55.857368],[-160.509312,55.868322],[-160.438112,55.791645],[-160.27928,55.76426],[-160.273803,55.857368],[-160.536697,55.939523],[-160.558604,55.994292],[-160.383342,56.251708],[-160.147834,56.399586],[-159.830171,56.541986],[-159.326293,56.667956],[-158.959338,56.848695],[-158.784076,56.782971],[-158.641675,56.810356],[-158.701922,56.925372],[-158.658106,57.034911],[-158.378782,57.264942],[-157.995396,57.41282],[-157.688688,57.609989],[-157.705118,57.719528],[-157.458656,58.497254],[-157.07527,58.705377],[-157.119086,58.869686],[-158.039212,58.634177],[-158.32949,58.661562],[-158.40069,58.760147],[-158.564998,58.803962],[-158.619768,58.913501],[-158.767645,58.864209],[-158.860753,58.694424],[-158.701922,58.480823],[-158.893615,58.387715],[-159.0634,58.420577],[-159.392016,58.760147],[-159.616571,58.929932],[-159.731586,58.929932],[-159.808264,58.803962],[-159.906848,58.782055],[-160.054726,58.886116],[-160.235465,58.902547],[-160.317619,59.072332],[-160.854359,58.88064],[-161.33633,58.743716],[-161.374669,58.667039],[-161.752577,58.552023],[-161.938793,58.656085],[-161.769008,58.776578],[-161.829255,59.061379],[-161.955224,59.36261],[-161.703285,59.48858],[-161.911409,59.740519],[-162.092148,59.88292],[-162.234548,60.091043],[-162.448149,60.178674],[-162.502918,59.997935],[-162.760334,59.959597],[-163.171105,59.844581],[-163.66403,59.795289],[-163.9324,59.806242],[-164.162431,59.866489],[-164.189816,60.02532],[-164.386986,60.074613],[-164.699171,60.29369],[-164.962064,60.337506],[-165.268773,60.578491],[-165.060649,60.68803],[-165.016834,60.890677],[-165.175665,60.846861],[-165.197573,60.972831],[-165.120896,61.076893],[-165.323543,61.170001],[-165.34545,61.071416],[-165.591913,61.109754],[-165.624774,61.279539],[-165.816467,61.301447],[-165.920529,61.416463],[-165.915052,61.558863],[-166.106745,61.49314],[-166.139607,61.630064],[-165.904098,61.662925],[-166.095791,61.81628],[-165.756221,61.827233],[-165.756221,62.013449],[-165.674067,62.139419],[-165.044219,62.539236],[-164.912772,62.659728],[-164.819664,62.637821],[-164.874433,62.807606],[-164.633448,63.097884],[-164.425324,63.212899],[-164.036462,63.262192],[-163.73523,63.212899],[-163.313505,63.037637],[-163.039658,63.059545],[-162.661749,63.22933],[-162.272887,63.486746],[-162.075717,63.514131],[-162.026424,63.448408],[-161.555408,63.448408],[-161.13916,63.503177],[-160.766728,63.771547],[-160.766728,63.837271],[-160.952944,64.08921],[-160.974852,64.237087],[-161.26513,64.395918],[-161.374669,64.532842],[-161.078914,64.494503],[-160.79959,64.609519],[-160.783159,64.719058],[-161.144637,64.921705],[-161.413007,64.762873],[-161.664946,64.790258],[-161.900455,64.702627],[-162.168825,64.680719],[-162.234548,64.620473],[-162.541257,64.532842],[-162.634365,64.384965],[-162.787719,64.324718],[-162.858919,64.49998],[-163.045135,64.538319],[-163.176582,64.401395],[-163.253259,64.467119],[-163.598306,64.565704],[-164.304832,64.560227],[-164.80871,64.450688],[-165.000403,64.434257],[-165.411174,64.49998],[-166.188899,64.576658],[-166.391546,64.636904],[-166.484654,64.735489],[-166.413454,64.872412],[-166.692778,64.987428],[-166.638008,65.113398],[-166.462746,65.179121],[-166.517516,65.337952],[-166.796839,65.337952],[-167.026871,65.381768],[-167.47598,65.414629],[-167.711489,65.496784],[-168.072967,65.578938],[-168.105828,65.682999],[-167.541703,65.819923],[-166.829701,66.049954],[-166.3313,66.186878],[-166.046499,66.110201],[-165.756221,66.09377],[-165.690498,66.203309],[-165.86576,66.21974],[-165.88219,66.312848],[-165.186619,66.466202],[-164.403417,66.581218],[-163.981692,66.592172],[-163.751661,66.553833],[-163.872153,66.389525],[-163.828338,66.274509],[-163.915969,66.192355],[-163.768091,66.060908],[-163.494244,66.082816],[-163.149197,66.060908],[-162.749381,66.088293],[-162.634365,66.039001],[-162.371472,66.028047],[-162.14144,66.077339],[-161.840208,66.02257],[-161.549931,66.241647],[-161.341807,66.252601],[-161.199406,66.208786],[-161.128206,66.334755],[-161.528023,66.395002],[-161.911409,66.345709],[-161.87307,66.510017],[-162.174302,66.68528],[-162.502918,66.740049],[-162.601503,66.89888],[-162.344087,66.937219],[-162.015471,66.778388],[-162.075717,66.652418],[-161.916886,66.553833],[-161.571838,66.438817],[-161.489684,66.55931],[-161.884024,66.718141],[-161.714239,67.002942],[-161.851162,67.052235],[-162.240025,66.991988],[-162.639842,67.008419],[-162.700088,67.057712],[-162.902735,67.008419],[-163.740707,67.128912],[-163.757138,67.254881],[-164.009077,67.534205],[-164.211724,67.638267],[-164.534863,67.725898],[-165.192096,67.966884],[-165.493328,68.059992],[-165.794559,68.081899],[-166.243668,68.246208],[-166.681824,68.339316],[-166.703731,68.372177],[-166.375115,68.42147],[-166.227238,68.574824],[-166.216284,68.881533],[-165.329019,68.859625],[-164.255539,68.930825],[-163.976215,68.985595],[-163.532583,69.138949],[-163.110859,69.374457],[-163.023228,69.609966],[-162.842489,69.812613],[-162.470057,69.982398],[-162.311225,70.108367],[-161.851162,70.311014],[-161.779962,70.256245],[-161.396576,70.239814],[-160.837928,70.343876],[-160.487404,70.453415],[-159.649432,70.792985],[-159.33177,70.809416],[-159.298908,70.760123],[-158.975769,70.798462],[-158.658106,70.787508],[-158.033735,70.831323],[-157.420318,70.979201],[-156.812377,71.285909],[-156.565915,71.351633],[-156.522099,71.296863],[-155.585543,71.170894],[-155.508865,71.083263],[-155.832005,70.968247],[-155.979882,70.96277],[-155.974405,70.809416],[-155.503388,70.858708],[-155.476004,70.940862],[-155.262403,71.017539],[-155.191203,70.973724],[-155.032372,71.148986],[-154.566832,70.990155],[-154.643509,70.869662],[-154.353231,70.8368],[-154.183446,70.7656],[-153.931507,70.880616],[-153.487874,70.886093],[-153.235935,70.924431],[-152.589656,70.886093],[-152.26104,70.842277],[-152.419871,70.606769],[-151.817408,70.546523],[-151.773592,70.486276],[-151.187559,70.382214],[-151.182082,70.431507],[-150.760358,70.49723],[-150.355064,70.491753],[-150.349588,70.436984],[-150.114079,70.431507],[-149.867617,70.508184],[-149.462323,70.519138],[-149.177522,70.486276],[-148.78866,70.404122],[-148.607921,70.420553],[-148.350504,70.305537],[-148.202627,70.349353],[-147.961642,70.316491],[-147.786379,70.245291]]],[[[-152.94018,58.026237],[-152.945657,57.982421],[-153.290705,58.048145],[-153.044242,58.305561],[-152.819688,58.327469],[-152.666333,58.562977],[-152.496548,58.354853],[-152.354148,58.426053],[-152.080301,58.311038],[-152.080301,58.152206],[-152.480117,58.130299],[-152.655379,58.059098],[-152.94018,58.026237]]],[[[-153.958891,57.538789],[-153.67409,57.670236],[-153.931507,57.69762],[-153.936983,57.812636],[-153.723383,57.889313],[-153.570028,57.834544],[-153.548121,57.719528],[-153.46049,57.796205],[-153.455013,57.96599],[-153.268797,57.889313],[-153.235935,57.998852],[-153.071627,57.933129],[-152.874457,57.933129],[-152.721103,57.993375],[-152.469163,57.889313],[-152.469163,57.599035],[-152.151501,57.620943],[-152.359625,57.42925],[-152.74301,57.505928],[-152.60061,57.379958],[-152.710149,57.275896],[-152.907319,57.325188],[-152.912796,57.128019],[-153.214027,57.073249],[-153.312612,56.991095],[-153.498828,57.067772],[-153.695998,56.859649],[-153.849352,56.837741],[-154.013661,56.744633],[-154.073907,56.969187],[-154.303938,56.848695],[-154.314892,56.919895],[-154.523016,56.991095],[-154.539447,57.193742],[-154.742094,57.275896],[-154.627078,57.511404],[-154.227261,57.659282],[-153.980799,57.648328],[-153.958891,57.538789]]],[[[-154.53397,56.602232],[-154.742094,56.399586],[-154.807817,56.432447],[-154.53397,56.602232]]],[[[-155.634835,55.923092],[-155.476004,55.912138],[-155.530773,55.704014],[-155.793666,55.731399],[-155.837482,55.802599],[-155.634835,55.923092]]],[[[-159.890418,55.28229],[-159.950664,55.068689],[-160.257373,54.893427],[-160.109495,55.161797],[-160.005433,55.134412],[-159.890418,55.28229]]],[[[-160.520266,55.358967],[-160.33405,55.358967],[-160.339527,55.249428],[-160.525743,55.128935],[-160.690051,55.211089],[-160.794113,55.134412],[-160.854359,55.320628],[-160.79959,55.380875],[-160.520266,55.358967]]],[[[-162.256456,54.981058],[-162.234548,54.893427],[-162.349564,54.838658],[-162.437195,54.931766],[-162.256456,54.981058]]],[[[-162.415287,63.634624],[-162.563165,63.536039],[-162.612457,63.62367],[-162.415287,63.634624]]],[[[-162.80415,54.488133],[-162.590549,54.449795],[-162.612457,54.367641],[-162.782242,54.373118],[-162.80415,54.488133]]],[[[-165.548097,54.29644],[-165.476897,54.181425],[-165.630251,54.132132],[-165.685021,54.252625],[-165.548097,54.29644]]],[[[-165.73979,54.15404],[-166.046499,54.044501],[-166.112222,54.121178],[-165.980775,54.219763],[-165.73979,54.15404]]],[[[-166.364161,60.359413],[-166.13413,60.397752],[-166.084837,60.326552],[-165.88219,60.342983],[-165.685021,60.277259],[-165.646682,59.992458],[-165.750744,59.89935],[-166.00816,59.844581],[-166.062929,59.745996],[-166.440838,59.855535],[-166.6161,59.850058],[-166.994009,59.992458],[-167.125456,59.992458],[-167.344534,60.074613],[-167.421211,60.206059],[-167.311672,60.238921],[-166.93924,60.206059],[-166.763978,60.310121],[-166.577762,60.321075],[-166.495608,60.392275],[-166.364161,60.359413]]],[[[-166.375115,54.01164],[-166.210807,53.934962],[-166.5449,53.748746],[-166.539423,53.715885],[-166.117699,53.852808],[-166.112222,53.776131],[-166.282007,53.683023],[-166.555854,53.622777],[-166.583239,53.529669],[-166.878994,53.431084],[-167.13641,53.425607],[-167.306195,53.332499],[-167.623857,53.250345],[-167.793643,53.337976],[-167.459549,53.442038],[-167.355487,53.425607],[-167.103548,53.513238],[-167.163794,53.611823],[-167.021394,53.715885],[-166.807793,53.666592],[-166.785886,53.732316],[-167.015917,53.754223],[-167.141887,53.825424],[-167.032348,53.945916],[-166.643485,54.017116],[-166.561331,53.880193],[-166.375115,54.01164]]],[[[-168.790446,53.157237],[-168.40706,53.34893],[-168.385152,53.431084],[-168.237275,53.524192],[-168.007243,53.568007],[-167.886751,53.518715],[-167.842935,53.387268],[-168.270136,53.244868],[-168.500168,53.036744],[-168.686384,52.965544],[-168.790446,53.157237]]],[[[-169.74891,52.894344],[-169.705095,52.795759],[-169.962511,52.790282],[-169.989896,52.856005],[-169.74891,52.894344]]],[[[-170.148727,57.221127],[-170.28565,57.128019],[-170.313035,57.221127],[-170.148727,57.221127]]],[[[-170.669036,52.697174],[-170.603313,52.604066],[-170.789529,52.538343],[-170.816914,52.636928],[-170.669036,52.697174]]],[[[-171.742517,63.716778],[-170.94836,63.5689],[-170.488297,63.69487],[-170.280174,63.683916],[-170.093958,63.612716],[-170.044665,63.492223],[-169.644848,63.4265],[-169.518879,63.366254],[-168.99857,63.338869],[-168.686384,63.295053],[-168.856169,63.147176],[-169.108108,63.180038],[-169.376478,63.152653],[-169.513402,63.08693],[-169.639372,62.939052],[-169.831064,63.075976],[-170.055619,63.169084],[-170.263743,63.180038],[-170.362328,63.2841],[-170.866206,63.415546],[-171.101715,63.421023],[-171.463193,63.306007],[-171.73704,63.366254],[-171.852055,63.486746],[-171.742517,63.716778]]],[[[-172.432611,52.390465],[-172.41618,52.275449],[-172.607873,52.253542],[-172.569535,52.352127],[-172.432611,52.390465]]],[[[-173.626584,52.14948],[-173.495138,52.105664],[-173.122706,52.111141],[-173.106275,52.07828],[-173.549907,52.028987],[-173.626584,52.14948]]],[[[-174.322156,52.280926],[-174.327632,52.379511],[-174.185232,52.41785],[-173.982585,52.319265],[-174.059262,52.226157],[-174.179755,52.231634],[-174.141417,52.127572],[-174.333109,52.116618],[-174.738403,52.007079],[-174.968435,52.039941],[-174.902711,52.116618],[-174.656249,52.105664],[-174.322156,52.280926]]],[[[-176.469116,51.853725],[-176.288377,51.870156],[-176.288377,51.744186],[-176.518409,51.760617],[-176.80321,51.61274],[-176.912748,51.80991],[-176.792256,51.815386],[-176.775825,51.963264],[-176.627947,51.968741],[-176.627947,51.859202],[-176.469116,51.853725]]],[[[-177.153734,51.946833],[-177.044195,51.897541],[-177.120872,51.727755],[-177.274226,51.678463],[-177.279703,51.782525],[-177.153734,51.946833]]],[[[-178.123152,51.919448],[-177.953367,51.913971],[-177.800013,51.793479],[-177.964321,51.651078],[-178.123152,51.919448]]],[[[-187.107557,52.992929],[-187.293773,52.927205],[-187.304726,52.823143],[-188.90491,52.762897],[-188.642017,52.927205],[-188.642017,53.003883],[-187.107557,52.992929]]]]}}, +{"type":"Feature","id":"04","properties":{"name":"Arizona","density":57.05},"geometry":{"type":"Polygon","coordinates":[[[-109.042503,37.000263],[-109.04798,31.331629],[-111.074448,31.331629],[-112.246513,31.704061],[-114.815198,32.492741],[-114.72209,32.717295],[-114.524921,32.755634],[-114.470151,32.843265],[-114.524921,33.029481],[-114.661844,33.034958],[-114.727567,33.40739],[-114.524921,33.54979],[-114.497536,33.697668],[-114.535874,33.933176],[-114.415382,34.108438],[-114.256551,34.174162],[-114.136058,34.305608],[-114.333228,34.448009],[-114.470151,34.710902],[-114.634459,34.87521],[-114.634459,35.00118],[-114.574213,35.138103],[-114.596121,35.324319],[-114.678275,35.516012],[-114.738521,36.102045],[-114.371566,36.140383],[-114.251074,36.01989],[-114.152489,36.025367],[-114.048427,36.195153],[-114.048427,37.000263],[-110.499369,37.00574],[-109.042503,37.000263]]]}}, +{"type":"Feature","id":"05","properties":{"name":"Arkansas","density":56.43},"geometry":{"type":"Polygon","coordinates":[[[-94.473842,36.501861],[-90.152536,36.496384],[-90.064905,36.304691],[-90.218259,36.184199],[-90.377091,35.997983],[-89.730812,35.997983],[-89.763673,35.811767],[-89.911551,35.756997],[-89.944412,35.603643],[-90.130628,35.439335],[-90.114197,35.198349],[-90.212782,35.023087],[-90.311367,34.995703],[-90.251121,34.908072],[-90.409952,34.831394],[-90.481152,34.661609],[-90.585214,34.617794],[-90.568783,34.420624],[-90.749522,34.365854],[-90.744046,34.300131],[-90.952169,34.135823],[-90.891923,34.026284],[-91.072662,33.867453],[-91.231493,33.560744],[-91.056231,33.429298],[-91.143862,33.347144],[-91.089093,33.13902],[-91.16577,33.002096],[-93.608485,33.018527],[-94.041164,33.018527],[-94.041164,33.54979],[-94.183564,33.593606],[-94.380734,33.544313],[-94.484796,33.637421],[-94.430026,35.395519],[-94.616242,36.501861],[-94.473842,36.501861]]]}}, +{"type":"Feature","id":"06","properties":{"name":"California","density":241.7},"geometry":{"type":"Polygon","coordinates":[[[-123.233256,42.006186],[-122.378853,42.011663],[-121.037003,41.995232],[-120.001861,41.995232],[-119.996384,40.264519],[-120.001861,38.999346],[-118.71478,38.101128],[-117.498899,37.21934],[-116.540435,36.501861],[-115.85034,35.970598],[-114.634459,35.00118],[-114.634459,34.87521],[-114.470151,34.710902],[-114.333228,34.448009],[-114.136058,34.305608],[-114.256551,34.174162],[-114.415382,34.108438],[-114.535874,33.933176],[-114.497536,33.697668],[-114.524921,33.54979],[-114.727567,33.40739],[-114.661844,33.034958],[-114.524921,33.029481],[-114.470151,32.843265],[-114.524921,32.755634],[-114.72209,32.717295],[-116.04751,32.624187],[-117.126467,32.536556],[-117.24696,32.668003],[-117.252437,32.876127],[-117.329114,33.122589],[-117.471515,33.297851],[-117.7837,33.538836],[-118.183517,33.763391],[-118.260194,33.703145],[-118.413548,33.741483],[-118.391641,33.840068],[-118.566903,34.042715],[-118.802411,33.998899],[-119.218659,34.146777],[-119.278905,34.26727],[-119.558229,34.415147],[-119.875891,34.40967],[-120.138784,34.475393],[-120.472878,34.448009],[-120.64814,34.579455],[-120.609801,34.858779],[-120.670048,34.902595],[-120.631709,35.099764],[-120.894602,35.247642],[-120.905556,35.450289],[-121.004141,35.461243],[-121.168449,35.636505],[-121.283465,35.674843],[-121.332757,35.784382],[-121.716143,36.195153],[-121.896882,36.315645],[-121.935221,36.638785],[-121.858544,36.6114],[-121.787344,36.803093],[-121.929744,36.978355],[-122.105006,36.956447],[-122.335038,37.115279],[-122.417192,37.241248],[-122.400761,37.361741],[-122.515777,37.520572],[-122.515777,37.783465],[-122.329561,37.783465],[-122.406238,38.15042],[-122.488392,38.112082],[-122.504823,37.931343],[-122.701993,37.893004],[-122.937501,38.029928],[-122.97584,38.265436],[-123.129194,38.451652],[-123.331841,38.566668],[-123.44138,38.698114],[-123.737134,38.95553],[-123.687842,39.032208],[-123.824765,39.366301],[-123.764519,39.552517],[-123.85215,39.831841],[-124.109566,40.105688],[-124.361506,40.259042],[-124.410798,40.439781],[-124.158859,40.877937],[-124.109566,41.025814],[-124.158859,41.14083],[-124.065751,41.442061],[-124.147905,41.715908],[-124.257444,41.781632],[-124.213628,42.000709],[-123.233256,42.006186]]]}}, +{"type":"Feature","id":"08","properties":{"name":"Colorado","density":49.33},"geometry":{"type":"Polygon","coordinates":[[[-107.919731,41.003906],[-105.728954,40.998429],[-104.053011,41.003906],[-102.053927,41.003906],[-102.053927,40.001626],[-102.042974,36.994786],[-103.001438,37.000263],[-104.337812,36.994786],[-106.868158,36.994786],[-107.421329,37.000263],[-109.042503,37.000263],[-109.042503,38.166851],[-109.058934,38.27639],[-109.053457,39.125316],[-109.04798,40.998429],[-107.919731,41.003906]]]}}, +{"type":"Feature","id":"09","properties":{"name":"Connecticut","density":739.1},"geometry":{"type":"Polygon","coordinates":[[[-73.053528,42.039048],[-71.799309,42.022617],[-71.799309,42.006186],[-71.799309,41.414677],[-71.859555,41.321569],[-71.947186,41.338],[-72.385341,41.261322],[-72.905651,41.28323],[-73.130205,41.146307],[-73.371191,41.102491],[-73.655992,40.987475],[-73.727192,41.102491],[-73.48073,41.21203],[-73.55193,41.294184],[-73.486206,42.050002],[-73.053528,42.039048]]]}}, +{"type":"Feature","id":"10","properties":{"name":"Delaware","density":464.3},"geometry":{"type":"Polygon","coordinates":[[[-75.414089,39.804456],[-75.507197,39.683964],[-75.611259,39.61824],[-75.589352,39.459409],[-75.441474,39.311532],[-75.403136,39.065069],[-75.189535,38.807653],[-75.09095,38.796699],[-75.047134,38.451652],[-75.693413,38.462606],[-75.786521,39.722302],[-75.616736,39.831841],[-75.414089,39.804456]]]}}, +{"type":"Feature","id":"11","properties":{"name":"District of Columbia","density":10065},"geometry":{"type":"Polygon","coordinates":[[[-77.035264,38.993869],[-76.909294,38.895284],[-77.040741,38.791222],[-77.117418,38.933623],[-77.035264,38.993869]]]}}, +{"type":"Feature","id":"12","properties":{"name":"Florida","density":353.4},"geometry":{"type":"Polygon","coordinates":[[[-85.497137,30.997536],[-85.004212,31.003013],[-84.867289,30.712735],[-83.498053,30.647012],[-82.216449,30.570335],[-82.167157,30.356734],[-82.046664,30.362211],[-82.002849,30.564858],[-82.041187,30.751074],[-81.948079,30.827751],[-81.718048,30.745597],[-81.444201,30.707258],[-81.383954,30.27458],[-81.257985,29.787132],[-80.967707,29.14633],[-80.524075,28.461713],[-80.589798,28.41242],[-80.56789,28.094758],[-80.381674,27.738757],[-80.091397,27.021277],[-80.03115,26.796723],[-80.036627,26.566691],[-80.146166,25.739673],[-80.239274,25.723243],[-80.337859,25.465826],[-80.304997,25.383672],[-80.49669,25.197456],[-80.573367,25.241272],[-80.759583,25.164595],[-81.077246,25.120779],[-81.170354,25.224841],[-81.126538,25.378195],[-81.351093,25.821827],[-81.526355,25.903982],[-81.679709,25.843735],[-81.800202,26.090198],[-81.833064,26.292844],[-82.041187,26.517399],[-82.09048,26.665276],[-82.057618,26.878877],[-82.172634,26.917216],[-82.145249,26.791246],[-82.249311,26.758384],[-82.566974,27.300601],[-82.692943,27.437525],[-82.391711,27.837342],[-82.588881,27.815434],[-82.720328,27.689464],[-82.851774,27.886634],[-82.676512,28.434328],[-82.643651,28.888914],[-82.764143,28.998453],[-82.802482,29.14633],[-82.994175,29.179192],[-83.218729,29.420177],[-83.399469,29.518762],[-83.410422,29.66664],[-83.536392,29.721409],[-83.640454,29.885717],[-84.02384,30.104795],[-84.357933,30.055502],[-84.341502,29.902148],[-84.451041,29.929533],[-84.867289,29.743317],[-85.310921,29.699501],[-85.299967,29.80904],[-85.404029,29.940487],[-85.924338,30.236241],[-86.29677,30.362211],[-86.630863,30.395073],[-86.910187,30.373165],[-87.518128,30.280057],[-87.37025,30.427934],[-87.446927,30.510088],[-87.408589,30.674397],[-87.633143,30.86609],[-87.600282,30.997536],[-85.497137,30.997536]]]}}, +{"type":"Feature","id":"13","properties":{"name":"Georgia","density":169.5},"geometry":{"type":"Polygon","coordinates":[[[-83.109191,35.00118],[-83.322791,34.787579],[-83.339222,34.683517],[-83.005129,34.469916],[-82.901067,34.486347],[-82.747713,34.26727],[-82.714851,34.152254],[-82.55602,33.94413],[-82.325988,33.81816],[-82.194542,33.631944],[-81.926172,33.462159],[-81.937125,33.347144],[-81.761863,33.160928],[-81.493493,33.007573],[-81.42777,32.843265],[-81.416816,32.629664],[-81.279893,32.558464],[-81.121061,32.290094],[-81.115584,32.120309],[-80.885553,32.032678],[-81.132015,31.693108],[-81.175831,31.517845],[-81.279893,31.364491],[-81.290846,31.20566],[-81.400385,31.13446],[-81.444201,30.707258],[-81.718048,30.745597],[-81.948079,30.827751],[-82.041187,30.751074],[-82.002849,30.564858],[-82.046664,30.362211],[-82.167157,30.356734],[-82.216449,30.570335],[-83.498053,30.647012],[-84.867289,30.712735],[-85.004212,31.003013],[-85.113751,31.27686],[-85.042551,31.539753],[-85.141136,31.840985],[-85.053504,32.01077],[-85.058981,32.13674],[-84.889196,32.262709],[-85.004212,32.322956],[-84.960397,32.421541],[-85.069935,32.580372],[-85.184951,32.859696],[-85.431413,34.124869],[-85.606675,34.984749],[-84.319594,34.990226],[-83.618546,34.984749],[-83.109191,35.00118]]]}}, +{"type":"Feature","id":"15","properties":{"name":"Hawaii","density":214.1},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.634835,18.948267],[-155.881297,19.035898],[-155.919636,19.123529],[-155.886774,19.348084],[-156.062036,19.73147],[-155.925113,19.857439],[-155.826528,20.032702],[-155.897728,20.147717],[-155.87582,20.26821],[-155.596496,20.12581],[-155.284311,20.021748],[-155.092618,19.868393],[-155.092618,19.736947],[-154.807817,19.523346],[-154.983079,19.348084],[-155.295265,19.26593],[-155.514342,19.134483],[-155.634835,18.948267]]],[[[-156.587823,21.029505],[-156.472807,20.892581],[-156.324929,20.952827],[-156.00179,20.793996],[-156.051082,20.651596],[-156.379699,20.580396],[-156.445422,20.60778],[-156.461853,20.783042],[-156.631638,20.821381],[-156.697361,20.919966],[-156.587823,21.029505]]],[[[-156.982162,21.210244],[-157.080747,21.106182],[-157.310779,21.106182],[-157.239579,21.221198],[-156.982162,21.210244]]],[[[-157.951581,21.697691],[-157.842042,21.462183],[-157.896811,21.325259],[-158.110412,21.303352],[-158.252813,21.582676],[-158.126843,21.588153],[-157.951581,21.697691]]],[[[-159.468693,22.228955],[-159.353678,22.218001],[-159.298908,22.113939],[-159.33177,21.966061],[-159.446786,21.872953],[-159.764448,21.987969],[-159.726109,22.152277],[-159.468693,22.228955]]]]}}, +{"type":"Feature","id":"16","properties":{"name":"Idaho","density":19.15},"geometry":{"type":"Polygon","coordinates":[[[-116.04751,49.000239],[-116.04751,47.976051],[-115.724371,47.696727],[-115.718894,47.42288],[-115.527201,47.302388],[-115.324554,47.258572],[-115.302646,47.187372],[-114.930214,46.919002],[-114.886399,46.809463],[-114.623506,46.705401],[-114.612552,46.639678],[-114.322274,46.645155],[-114.464674,46.272723],[-114.492059,46.037214],[-114.387997,45.88386],[-114.568736,45.774321],[-114.497536,45.670259],[-114.546828,45.560721],[-114.333228,45.456659],[-114.086765,45.593582],[-113.98818,45.703121],[-113.807441,45.604536],[-113.834826,45.522382],[-113.736241,45.330689],[-113.571933,45.128042],[-113.45144,45.056842],[-113.456917,44.865149],[-113.341901,44.782995],[-113.133778,44.772041],[-113.002331,44.448902],[-112.887315,44.394132],[-112.783254,44.48724],[-112.471068,44.481763],[-112.241036,44.569394],[-112.104113,44.520102],[-111.868605,44.563917],[-111.819312,44.509148],[-111.616665,44.547487],[-111.386634,44.75561],[-111.227803,44.580348],[-111.047063,44.476286],[-111.047063,42.000709],[-112.164359,41.995232],[-114.04295,41.995232],[-117.027882,42.000709],[-117.027882,43.830007],[-116.896436,44.158624],[-116.97859,44.240778],[-117.170283,44.257209],[-117.241483,44.394132],[-117.038836,44.750133],[-116.934774,44.782995],[-116.830713,44.930872],[-116.847143,45.02398],[-116.732128,45.144473],[-116.671881,45.319735],[-116.463758,45.61549],[-116.545912,45.752413],[-116.78142,45.823614],[-116.918344,45.993399],[-116.92382,46.168661],[-117.055267,46.343923],[-117.038836,46.426077],[-117.044313,47.762451],[-117.033359,49.000239],[-116.04751,49.000239]]]}}, +{"type":"Feature","id":"17","properties":{"name":"Illinois","density":231.5},"geometry":{"type":"Polygon","coordinates":[[[-90.639984,42.510065],[-88.788778,42.493634],[-87.802929,42.493634],[-87.83579,42.301941],[-87.682436,42.077386],[-87.523605,41.710431],[-87.529082,39.34987],[-87.63862,39.169131],[-87.512651,38.95553],[-87.49622,38.780268],[-87.62219,38.637868],[-87.655051,38.506421],[-87.83579,38.292821],[-87.950806,38.27639],[-87.923421,38.15042],[-88.000098,38.101128],[-88.060345,37.865619],[-88.027483,37.799896],[-88.15893,37.657496],[-88.065822,37.482234],[-88.476592,37.389126],[-88.514931,37.285064],[-88.421823,37.153617],[-88.547792,37.071463],[-88.914747,37.224817],[-89.029763,37.213863],[-89.183118,37.038601],[-89.133825,36.983832],[-89.292656,36.994786],[-89.517211,37.279587],[-89.435057,37.34531],[-89.517211,37.537003],[-89.517211,37.690357],[-89.84035,37.903958],[-89.949889,37.88205],[-90.059428,38.013497],[-90.355183,38.216144],[-90.349706,38.374975],[-90.179921,38.632391],[-90.207305,38.725499],[-90.10872,38.845992],[-90.251121,38.917192],[-90.470199,38.961007],[-90.585214,38.867899],[-90.661891,38.928146],[-90.727615,39.256762],[-91.061708,39.470363],[-91.368417,39.727779],[-91.494386,40.034488],[-91.50534,40.237135],[-91.417709,40.379535],[-91.401278,40.560274],[-91.121954,40.669813],[-91.09457,40.823167],[-90.963123,40.921752],[-90.946692,41.097014],[-91.111001,41.239415],[-91.045277,41.414677],[-90.656414,41.463969],[-90.344229,41.589939],[-90.311367,41.743293],[-90.179921,41.809016],[-90.141582,42.000709],[-90.168967,42.126679],[-90.393521,42.225264],[-90.420906,42.329326],[-90.639984,42.510065]]]}}, +{"type":"Feature","id":"18","properties":{"name":"Indiana","density":181.7},"geometry":{"type":"Polygon","coordinates":[[[-85.990061,41.759724],[-84.807042,41.759724],[-84.807042,41.694001],[-84.801565,40.500028],[-84.817996,39.103408],[-84.894673,39.059592],[-84.812519,38.785745],[-84.987781,38.780268],[-85.173997,38.68716],[-85.431413,38.730976],[-85.42046,38.533806],[-85.590245,38.451652],[-85.655968,38.325682],[-85.83123,38.27639],[-85.924338,38.024451],[-86.039354,37.958727],[-86.263908,38.051835],[-86.302247,38.166851],[-86.521325,38.040881],[-86.504894,37.931343],[-86.729448,37.893004],[-86.795172,37.991589],[-87.047111,37.893004],[-87.129265,37.788942],[-87.381204,37.93682],[-87.512651,37.903958],[-87.600282,37.975158],[-87.682436,37.903958],[-87.934375,37.893004],[-88.027483,37.799896],[-88.060345,37.865619],[-88.000098,38.101128],[-87.923421,38.15042],[-87.950806,38.27639],[-87.83579,38.292821],[-87.655051,38.506421],[-87.62219,38.637868],[-87.49622,38.780268],[-87.512651,38.95553],[-87.63862,39.169131],[-87.529082,39.34987],[-87.523605,41.710431],[-87.42502,41.644708],[-87.118311,41.644708],[-86.822556,41.759724],[-85.990061,41.759724]]]}}, +{"type":"Feature","id":"19","properties":{"name":"Iowa","density":54.81},"geometry":{"type":"Polygon","coordinates":[[[-91.368417,43.501391],[-91.215062,43.501391],[-91.204109,43.353514],[-91.056231,43.254929],[-91.176724,43.134436],[-91.143862,42.909881],[-91.067185,42.75105],[-90.711184,42.636034],[-90.639984,42.510065],[-90.420906,42.329326],[-90.393521,42.225264],[-90.168967,42.126679],[-90.141582,42.000709],[-90.179921,41.809016],[-90.311367,41.743293],[-90.344229,41.589939],[-90.656414,41.463969],[-91.045277,41.414677],[-91.111001,41.239415],[-90.946692,41.097014],[-90.963123,40.921752],[-91.09457,40.823167],[-91.121954,40.669813],[-91.401278,40.560274],[-91.417709,40.379535],[-91.527248,40.412397],[-91.729895,40.615043],[-91.833957,40.609566],[-93.257961,40.582182],[-94.632673,40.571228],[-95.7664,40.587659],[-95.881416,40.719105],[-95.826646,40.976521],[-95.925231,41.201076],[-95.919754,41.453015],[-96.095016,41.540646],[-96.122401,41.67757],[-96.062155,41.798063],[-96.127878,41.973325],[-96.264801,42.039048],[-96.44554,42.488157],[-96.631756,42.707235],[-96.544125,42.855112],[-96.511264,43.052282],[-96.434587,43.123482],[-96.560556,43.222067],[-96.527695,43.397329],[-96.582464,43.479483],[-96.451017,43.501391],[-91.368417,43.501391]]]}}, +{"type":"Feature","id":"20","properties":{"name":"Kansas","density":35.09},"geometry":{"type":"Polygon","coordinates":[[[-101.90605,40.001626],[-95.306337,40.001626],[-95.207752,39.908518],[-94.884612,39.831841],[-95.109167,39.541563],[-94.983197,39.442978],[-94.824366,39.20747],[-94.610765,39.158177],[-94.616242,37.000263],[-100.087706,37.000263],[-102.042974,36.994786],[-102.053927,40.001626],[-101.90605,40.001626]]]}}, +{"type":"Feature","id":"21","properties":{"name":"Kentucky","density":110},"geometry":{"type":"Polygon","coordinates":[[[-83.903347,38.769315],[-83.678792,38.632391],[-83.519961,38.703591],[-83.142052,38.626914],[-83.032514,38.725499],[-82.890113,38.758361],[-82.846298,38.588575],[-82.731282,38.561191],[-82.594358,38.424267],[-82.621743,38.123036],[-82.50125,37.931343],[-82.342419,37.783465],[-82.293127,37.668449],[-82.101434,37.553434],[-81.969987,37.537003],[-82.353373,37.268633],[-82.720328,37.120755],[-82.720328,37.044078],[-82.868205,36.978355],[-82.879159,36.890724],[-83.070852,36.852385],[-83.136575,36.742847],[-83.673316,36.600446],[-83.689746,36.584015],[-84.544149,36.594969],[-85.289013,36.627831],[-85.486183,36.616877],[-86.592525,36.655216],[-87.852221,36.633308],[-88.071299,36.677123],[-88.054868,36.496384],[-89.298133,36.507338],[-89.418626,36.496384],[-89.363857,36.622354],[-89.215979,36.578538],[-89.133825,36.983832],[-89.183118,37.038601],[-89.029763,37.213863],[-88.914747,37.224817],[-88.547792,37.071463],[-88.421823,37.153617],[-88.514931,37.285064],[-88.476592,37.389126],[-88.065822,37.482234],[-88.15893,37.657496],[-88.027483,37.799896],[-87.934375,37.893004],[-87.682436,37.903958],[-87.600282,37.975158],[-87.512651,37.903958],[-87.381204,37.93682],[-87.129265,37.788942],[-87.047111,37.893004],[-86.795172,37.991589],[-86.729448,37.893004],[-86.504894,37.931343],[-86.521325,38.040881],[-86.302247,38.166851],[-86.263908,38.051835],[-86.039354,37.958727],[-85.924338,38.024451],[-85.83123,38.27639],[-85.655968,38.325682],[-85.590245,38.451652],[-85.42046,38.533806],[-85.431413,38.730976],[-85.173997,38.68716],[-84.987781,38.780268],[-84.812519,38.785745],[-84.894673,39.059592],[-84.817996,39.103408],[-84.43461,39.103408],[-84.231963,38.895284],[-84.215533,38.807653],[-83.903347,38.769315]]]}}, +{"type":"Feature","id":"22","properties":{"name":"Louisiana","density":105},"geometry":{"type":"Polygon","coordinates":[[[-93.608485,33.018527],[-91.16577,33.002096],[-91.072662,32.887081],[-91.143862,32.843265],[-91.154816,32.640618],[-91.006939,32.514649],[-90.985031,32.218894],[-91.105524,31.988862],[-91.341032,31.846462],[-91.401278,31.621907],[-91.499863,31.643815],[-91.516294,31.27686],[-91.636787,31.265906],[-91.565587,31.068736],[-91.636787,30.997536],[-89.747242,30.997536],[-89.845827,30.66892],[-89.681519,30.449842],[-89.643181,30.285534],[-89.522688,30.181472],[-89.818443,30.044549],[-89.84035,29.945964],[-89.599365,29.88024],[-89.495303,30.039072],[-89.287179,29.88024],[-89.30361,29.754271],[-89.424103,29.699501],[-89.648657,29.748794],[-89.621273,29.655686],[-89.69795,29.513285],[-89.506257,29.387316],[-89.199548,29.348977],[-89.09001,29.2011],[-89.002379,29.179192],[-89.16121,29.009407],[-89.336472,29.042268],[-89.484349,29.217531],[-89.851304,29.310638],[-89.851304,29.480424],[-90.032043,29.425654],[-90.021089,29.283254],[-90.103244,29.151807],[-90.23469,29.129899],[-90.333275,29.277777],[-90.563307,29.283254],[-90.645461,29.129899],[-90.798815,29.086084],[-90.963123,29.179192],[-91.09457,29.190146],[-91.220539,29.436608],[-91.445094,29.546147],[-91.532725,29.529716],[-91.620356,29.73784],[-91.883249,29.710455],[-91.888726,29.836425],[-92.146142,29.715932],[-92.113281,29.622824],[-92.31045,29.535193],[-92.617159,29.579009],[-92.97316,29.715932],[-93.2251,29.776178],[-93.767317,29.726886],[-93.838517,29.688547],[-93.926148,29.787132],[-93.690639,30.143133],[-93.767317,30.334826],[-93.696116,30.438888],[-93.728978,30.575812],[-93.630393,30.679874],[-93.526331,30.93729],[-93.542762,31.15089],[-93.816609,31.556184],[-93.822086,31.775262],[-94.041164,31.994339],[-94.041164,33.018527],[-93.608485,33.018527]]]}}, +{"type":"Feature","id":"23","properties":{"name":"Maine","density":43.04},"geometry":{"type":"Polygon","coordinates":[[[-70.703921,43.057759],[-70.824413,43.128959],[-70.807983,43.227544],[-70.966814,43.34256],[-71.032537,44.657025],[-71.08183,45.303304],[-70.649151,45.440228],[-70.720352,45.511428],[-70.556043,45.664782],[-70.386258,45.735983],[-70.41912,45.796229],[-70.260289,45.889337],[-70.309581,46.064599],[-70.210996,46.327492],[-70.057642,46.415123],[-69.997395,46.694447],[-69.225147,47.461219],[-69.044408,47.428357],[-69.033454,47.242141],[-68.902007,47.176418],[-68.578868,47.285957],[-68.376221,47.285957],[-68.233821,47.357157],[-67.954497,47.198326],[-67.790188,47.066879],[-67.779235,45.944106],[-67.801142,45.675736],[-67.456095,45.604536],[-67.505388,45.48952],[-67.417757,45.379982],[-67.488957,45.281397],[-67.346556,45.128042],[-67.16034,45.160904],[-66.979601,44.804903],[-67.187725,44.646072],[-67.308218,44.706318],[-67.406803,44.596779],[-67.549203,44.624164],[-67.565634,44.531056],[-67.75185,44.54201],[-68.047605,44.328409],[-68.118805,44.476286],[-68.222867,44.48724],[-68.173574,44.328409],[-68.403606,44.251732],[-68.458375,44.377701],[-68.567914,44.311978],[-68.82533,44.311978],[-68.830807,44.459856],[-68.984161,44.426994],[-68.956777,44.322932],[-69.099177,44.103854],[-69.071793,44.043608],[-69.258008,43.923115],[-69.444224,43.966931],[-69.553763,43.840961],[-69.707118,43.82453],[-69.833087,43.720469],[-69.986442,43.742376],[-70.030257,43.851915],[-70.254812,43.676653],[-70.194565,43.567114],[-70.358873,43.528776],[-70.369827,43.435668],[-70.556043,43.320652],[-70.703921,43.057759]]]}}, +{"type":"Feature","id":"24","properties":{"name":"Maryland","density":596.3},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.994645,37.95325],[-76.016553,37.95325],[-76.043938,37.95325],[-75.994645,37.95325]]],[[[-79.477979,39.722302],[-75.786521,39.722302],[-75.693413,38.462606],[-75.047134,38.451652],[-75.244304,38.029928],[-75.397659,38.013497],[-75.671506,37.95325],[-75.885106,37.909435],[-75.879629,38.073743],[-75.961783,38.139466],[-75.846768,38.210667],[-76.000122,38.374975],[-76.049415,38.303775],[-76.257538,38.320205],[-76.328738,38.500944],[-76.263015,38.500944],[-76.257538,38.736453],[-76.191815,38.829561],[-76.279446,39.147223],[-76.169907,39.333439],[-76.000122,39.366301],[-75.972737,39.557994],[-76.098707,39.536086],[-76.104184,39.437501],[-76.367077,39.311532],[-76.443754,39.196516],[-76.460185,38.906238],[-76.55877,38.769315],[-76.514954,38.539283],[-76.383508,38.380452],[-76.399939,38.259959],[-76.317785,38.139466],[-76.3616,38.057312],[-76.591632,38.216144],[-76.920248,38.292821],[-77.018833,38.446175],[-77.205049,38.358544],[-77.276249,38.479037],[-77.128372,38.632391],[-77.040741,38.791222],[-76.909294,38.895284],[-77.035264,38.993869],[-77.117418,38.933623],[-77.248864,39.026731],[-77.456988,39.076023],[-77.456988,39.223901],[-77.566527,39.306055],[-77.719881,39.322485],[-77.834897,39.601809],[-78.004682,39.601809],[-78.174467,39.694917],[-78.267575,39.61824],[-78.431884,39.623717],[-78.470222,39.514178],[-78.765977,39.585379],[-78.963147,39.437501],[-79.094593,39.470363],[-79.291763,39.300578],[-79.488933,39.20747],[-79.477979,39.722302]]]]}}, +{"type":"Feature","id":"25","properties":{"name":"Massachusetts","density":840.2},"geometry":{"type":"Polygon","coordinates":[[[-70.917521,42.887974],[-70.818936,42.871543],[-70.780598,42.696281],[-70.824413,42.55388],[-70.983245,42.422434],[-70.988722,42.269079],[-70.769644,42.247172],[-70.638197,42.08834],[-70.660105,41.962371],[-70.550566,41.929509],[-70.539613,41.814493],[-70.260289,41.715908],[-69.937149,41.809016],[-70.008349,41.672093],[-70.484843,41.5516],[-70.660105,41.546123],[-70.764167,41.639231],[-70.928475,41.611847],[-70.933952,41.540646],[-71.120168,41.496831],[-71.196845,41.67757],[-71.22423,41.710431],[-71.328292,41.781632],[-71.383061,42.01714],[-71.530939,42.01714],[-71.799309,42.006186],[-71.799309,42.022617],[-73.053528,42.039048],[-73.486206,42.050002],[-73.508114,42.08834],[-73.267129,42.745573],[-72.456542,42.729142],[-71.29543,42.696281],[-71.185891,42.789389],[-70.917521,42.887974]]]}}, +{"type":"Feature","id":"26","properties":{"name":"Michigan","density":173.9},"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.454238,41.732339],[-84.807042,41.694001],[-84.807042,41.759724],[-85.990061,41.759724],[-86.822556,41.759724],[-86.619909,41.891171],[-86.482986,42.115725],[-86.357016,42.252649],[-86.263908,42.444341],[-86.209139,42.718189],[-86.231047,43.013943],[-86.526801,43.594499],[-86.433693,43.813577],[-86.499417,44.07647],[-86.269385,44.34484],[-86.220093,44.569394],[-86.252954,44.689887],[-86.088646,44.73918],[-86.066738,44.903488],[-85.809322,44.947303],[-85.612152,45.128042],[-85.628583,44.766564],[-85.524521,44.750133],[-85.393075,44.930872],[-85.387598,45.237581],[-85.305444,45.314258],[-85.031597,45.363551],[-85.119228,45.577151],[-84.938489,45.75789],[-84.713934,45.768844],[-84.461995,45.653829],[-84.215533,45.637398],[-84.09504,45.494997],[-83.908824,45.484043],[-83.596638,45.352597],[-83.4871,45.358074],[-83.317314,45.144473],[-83.454238,45.029457],[-83.322791,44.88158],[-83.273499,44.711795],[-83.333745,44.339363],[-83.536392,44.246255],[-83.585684,44.054562],[-83.82667,43.988839],[-83.958116,43.758807],[-83.908824,43.671176],[-83.667839,43.589022],[-83.481623,43.714992],[-83.262545,43.972408],[-82.917498,44.070993],[-82.747713,43.994316],[-82.643651,43.851915],[-82.539589,43.435668],[-82.523158,43.227544],[-82.413619,42.975605],[-82.517681,42.614127],[-82.681989,42.559357],[-82.687466,42.690804],[-82.797005,42.652465],[-82.922975,42.351234],[-83.125621,42.236218],[-83.185868,42.006186],[-83.437807,41.814493],[-83.454238,41.732339]]],[[[-85.508091,45.730506],[-85.49166,45.610013],[-85.623106,45.588105],[-85.568337,45.75789],[-85.508091,45.730506]]],[[[-87.589328,45.095181],[-87.742682,45.199243],[-87.649574,45.341643],[-87.885083,45.363551],[-87.791975,45.500474],[-87.781021,45.675736],[-87.989145,45.796229],[-88.10416,45.922199],[-88.531362,46.020784],[-88.662808,45.987922],[-89.09001,46.135799],[-90.119674,46.338446],[-90.229213,46.508231],[-90.415429,46.568478],[-90.026566,46.672539],[-89.851304,46.793032],[-89.413149,46.842325],[-89.128348,46.990202],[-88.996902,46.995679],[-88.887363,47.099741],[-88.575177,47.247618],[-88.416346,47.373588],[-88.180837,47.455742],[-87.956283,47.384542],[-88.350623,47.077833],[-88.443731,46.973771],[-88.438254,46.787555],[-88.246561,46.929956],[-87.901513,46.908048],[-87.633143,46.809463],[-87.392158,46.535616],[-87.260711,46.486323],[-87.008772,46.530139],[-86.948526,46.469893],[-86.696587,46.437031],[-86.159846,46.667063],[-85.880522,46.68897],[-85.508091,46.678016],[-85.256151,46.754694],[-85.064458,46.760171],[-85.02612,46.480847],[-84.82895,46.442508],[-84.63178,46.486323],[-84.549626,46.4206],[-84.418179,46.502754],[-84.127902,46.530139],[-84.122425,46.179615],[-83.990978,46.031737],[-83.793808,45.993399],[-83.7719,46.091984],[-83.580208,46.091984],[-83.476146,45.987922],[-83.563777,45.911245],[-84.111471,45.976968],[-84.374364,45.933153],[-84.659165,46.053645],[-84.741319,45.944106],[-84.70298,45.850998],[-84.82895,45.872906],[-85.015166,46.00983],[-85.338305,46.091984],[-85.502614,46.097461],[-85.661445,45.966014],[-85.924338,45.933153],[-86.209139,45.960537],[-86.324155,45.905768],[-86.351539,45.796229],[-86.663725,45.703121],[-86.647294,45.834568],[-86.784218,45.861952],[-86.838987,45.725029],[-87.069019,45.719552],[-87.17308,45.659305],[-87.326435,45.423797],[-87.611236,45.122565],[-87.589328,45.095181]]],[[[-88.805209,47.976051],[-89.057148,47.850082],[-89.188594,47.833651],[-89.177641,47.937713],[-88.547792,48.173221],[-88.668285,48.008913],[-88.805209,47.976051]]]]}}, +{"type":"Feature","id":"27","properties":{"name":"Minnesota","density":67.14},"geometry":{"type":"Polygon","coordinates":[[[-92.014696,46.705401],[-92.091373,46.749217],[-92.29402,46.667063],[-92.29402,46.075553],[-92.354266,46.015307],[-92.639067,45.933153],[-92.869098,45.719552],[-92.885529,45.577151],[-92.770513,45.566198],[-92.644544,45.440228],[-92.75956,45.286874],[-92.737652,45.117088],[-92.808852,44.750133],[-92.545959,44.569394],[-92.337835,44.552964],[-92.233773,44.443425],[-91.927065,44.333886],[-91.877772,44.202439],[-91.592971,44.032654],[-91.43414,43.994316],[-91.242447,43.775238],[-91.269832,43.616407],[-91.215062,43.501391],[-91.368417,43.501391],[-96.451017,43.501391],[-96.451017,45.297827],[-96.681049,45.412843],[-96.856311,45.604536],[-96.582464,45.818137],[-96.560556,45.933153],[-96.598895,46.332969],[-96.719387,46.437031],[-96.801542,46.656109],[-96.785111,46.924479],[-96.823449,46.968294],[-96.856311,47.609096],[-97.053481,47.948667],[-97.130158,48.140359],[-97.16302,48.545653],[-97.097296,48.682577],[-97.228743,49.000239],[-95.152983,49.000239],[-95.152983,49.383625],[-94.955813,49.372671],[-94.824366,49.295994],[-94.69292,48.775685],[-94.588858,48.715438],[-94.260241,48.699007],[-94.221903,48.649715],[-93.838517,48.627807],[-93.794701,48.518268],[-93.466085,48.545653],[-93.466085,48.589469],[-93.208669,48.644238],[-92.984114,48.62233],[-92.726698,48.540176],[-92.655498,48.436114],[-92.50762,48.447068],[-92.370697,48.222514],[-92.304974,48.315622],[-92.053034,48.359437],[-92.009219,48.266329],[-91.713464,48.200606],[-91.713464,48.112975],[-91.565587,48.041775],[-91.264355,48.080113],[-91.083616,48.178698],[-90.837154,48.238944],[-90.749522,48.091067],[-90.579737,48.123929],[-90.377091,48.091067],[-90.141582,48.112975],[-89.873212,47.987005],[-89.615796,48.008913],[-89.637704,47.954144],[-89.971797,47.828174],[-90.437337,47.729589],[-90.738569,47.625527],[-91.171247,47.368111],[-91.357463,47.20928],[-91.642264,47.028541],[-92.091373,46.787555],[-92.014696,46.705401]]]}}, +{"type":"Feature","id":"28","properties":{"name":"Mississippi","density":63.50},"geometry":{"type":"Polygon","coordinates":[[[-88.471115,34.995703],[-88.202745,34.995703],[-88.098683,34.891641],[-88.241084,33.796253],[-88.471115,31.895754],[-88.394438,30.367688],[-88.503977,30.323872],[-88.744962,30.34578],[-88.843547,30.411504],[-89.084533,30.367688],[-89.418626,30.252672],[-89.522688,30.181472],[-89.643181,30.285534],[-89.681519,30.449842],[-89.845827,30.66892],[-89.747242,30.997536],[-91.636787,30.997536],[-91.565587,31.068736],[-91.636787,31.265906],[-91.516294,31.27686],[-91.499863,31.643815],[-91.401278,31.621907],[-91.341032,31.846462],[-91.105524,31.988862],[-90.985031,32.218894],[-91.006939,32.514649],[-91.154816,32.640618],[-91.143862,32.843265],[-91.072662,32.887081],[-91.16577,33.002096],[-91.089093,33.13902],[-91.143862,33.347144],[-91.056231,33.429298],[-91.231493,33.560744],[-91.072662,33.867453],[-90.891923,34.026284],[-90.952169,34.135823],[-90.744046,34.300131],[-90.749522,34.365854],[-90.568783,34.420624],[-90.585214,34.617794],[-90.481152,34.661609],[-90.409952,34.831394],[-90.251121,34.908072],[-90.311367,34.995703],[-88.471115,34.995703]]]}}, +{"type":"Feature","id":"29","properties":{"name":"Missouri","density":87.26},"geometry":{"type":"Polygon","coordinates":[[[-91.833957,40.609566],[-91.729895,40.615043],[-91.527248,40.412397],[-91.417709,40.379535],[-91.50534,40.237135],[-91.494386,40.034488],[-91.368417,39.727779],[-91.061708,39.470363],[-90.727615,39.256762],[-90.661891,38.928146],[-90.585214,38.867899],[-90.470199,38.961007],[-90.251121,38.917192],[-90.10872,38.845992],[-90.207305,38.725499],[-90.179921,38.632391],[-90.349706,38.374975],[-90.355183,38.216144],[-90.059428,38.013497],[-89.949889,37.88205],[-89.84035,37.903958],[-89.517211,37.690357],[-89.517211,37.537003],[-89.435057,37.34531],[-89.517211,37.279587],[-89.292656,36.994786],[-89.133825,36.983832],[-89.215979,36.578538],[-89.363857,36.622354],[-89.418626,36.496384],[-89.484349,36.496384],[-89.539119,36.496384],[-89.533642,36.249922],[-89.730812,35.997983],[-90.377091,35.997983],[-90.218259,36.184199],[-90.064905,36.304691],[-90.152536,36.496384],[-94.473842,36.501861],[-94.616242,36.501861],[-94.616242,37.000263],[-94.610765,39.158177],[-94.824366,39.20747],[-94.983197,39.442978],[-95.109167,39.541563],[-94.884612,39.831841],[-95.207752,39.908518],[-95.306337,40.001626],[-95.552799,40.264519],[-95.7664,40.587659],[-94.632673,40.571228],[-93.257961,40.582182],[-91.833957,40.609566]]]}}, +{"type":"Feature","id":"30","properties":{"name":"Montana","density":6.858},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,49.000239],[-104.042057,47.861036],[-104.047534,45.944106],[-104.042057,44.996596],[-104.058488,44.996596],[-105.91517,45.002073],[-109.080842,45.002073],[-111.05254,45.002073],[-111.047063,44.476286],[-111.227803,44.580348],[-111.386634,44.75561],[-111.616665,44.547487],[-111.819312,44.509148],[-111.868605,44.563917],[-112.104113,44.520102],[-112.241036,44.569394],[-112.471068,44.481763],[-112.783254,44.48724],[-112.887315,44.394132],[-113.002331,44.448902],[-113.133778,44.772041],[-113.341901,44.782995],[-113.456917,44.865149],[-113.45144,45.056842],[-113.571933,45.128042],[-113.736241,45.330689],[-113.834826,45.522382],[-113.807441,45.604536],[-113.98818,45.703121],[-114.086765,45.593582],[-114.333228,45.456659],[-114.546828,45.560721],[-114.497536,45.670259],[-114.568736,45.774321],[-114.387997,45.88386],[-114.492059,46.037214],[-114.464674,46.272723],[-114.322274,46.645155],[-114.612552,46.639678],[-114.623506,46.705401],[-114.886399,46.809463],[-114.930214,46.919002],[-115.302646,47.187372],[-115.324554,47.258572],[-115.527201,47.302388],[-115.718894,47.42288],[-115.724371,47.696727],[-116.04751,47.976051],[-116.04751,49.000239],[-111.50165,48.994762],[-109.453274,49.000239],[-104.047534,49.000239]]]}}, +{"type":"Feature","id":"31","properties":{"name":"Nebraska","density":23.97},"geometry":{"type":"Polygon","coordinates":[[[-103.324578,43.002989],[-101.626726,42.997512],[-98.499393,42.997512],[-98.466531,42.94822],[-97.951699,42.767481],[-97.831206,42.866066],[-97.688806,42.844158],[-97.217789,42.844158],[-96.692003,42.657942],[-96.626279,42.515542],[-96.44554,42.488157],[-96.264801,42.039048],[-96.127878,41.973325],[-96.062155,41.798063],[-96.122401,41.67757],[-96.095016,41.540646],[-95.919754,41.453015],[-95.925231,41.201076],[-95.826646,40.976521],[-95.881416,40.719105],[-95.7664,40.587659],[-95.552799,40.264519],[-95.306337,40.001626],[-101.90605,40.001626],[-102.053927,40.001626],[-102.053927,41.003906],[-104.053011,41.003906],[-104.053011,43.002989],[-103.324578,43.002989]]]}}, +{"type":"Feature","id":"32","properties":{"name":"Nevada","density":24.80},"geometry":{"type":"Polygon","coordinates":[[[-117.027882,42.000709],[-114.04295,41.995232],[-114.048427,37.000263],[-114.048427,36.195153],[-114.152489,36.025367],[-114.251074,36.01989],[-114.371566,36.140383],[-114.738521,36.102045],[-114.678275,35.516012],[-114.596121,35.324319],[-114.574213,35.138103],[-114.634459,35.00118],[-115.85034,35.970598],[-116.540435,36.501861],[-117.498899,37.21934],[-118.71478,38.101128],[-120.001861,38.999346],[-119.996384,40.264519],[-120.001861,41.995232],[-118.698349,41.989755],[-117.027882,42.000709]]]}}, +{"type":"Feature","id":"33","properties":{"name":"New Hampshire","density":147},"geometry":{"type":"Polygon","coordinates":[[[-71.08183,45.303304],[-71.032537,44.657025],[-70.966814,43.34256],[-70.807983,43.227544],[-70.824413,43.128959],[-70.703921,43.057759],[-70.818936,42.871543],[-70.917521,42.887974],[-71.185891,42.789389],[-71.29543,42.696281],[-72.456542,42.729142],[-72.544173,42.80582],[-72.533219,42.953697],[-72.445588,43.008466],[-72.456542,43.150867],[-72.379864,43.572591],[-72.204602,43.769761],[-72.116971,43.994316],[-72.02934,44.07647],[-72.034817,44.322932],[-71.700724,44.41604],[-71.536416,44.585825],[-71.629524,44.750133],[-71.4926,44.914442],[-71.503554,45.013027],[-71.361154,45.270443],[-71.131122,45.243058],[-71.08183,45.303304]]]}}, +{"type":"Feature","id":"34","properties":{"name":"New Jersey","density":1189 },"geometry":{"type":"Polygon","coordinates":[[[-74.236547,41.14083],[-73.902454,40.998429],[-74.022947,40.708151],[-74.187255,40.642428],[-74.274886,40.489074],[-74.001039,40.412397],[-73.979131,40.297381],[-74.099624,39.760641],[-74.411809,39.360824],[-74.614456,39.245808],[-74.795195,38.993869],[-74.888303,39.158177],[-75.178581,39.240331],[-75.534582,39.459409],[-75.55649,39.607286],[-75.561967,39.629194],[-75.507197,39.683964],[-75.414089,39.804456],[-75.145719,39.88661],[-75.129289,39.963288],[-74.82258,40.127596],[-74.773287,40.215227],[-75.058088,40.417874],[-75.069042,40.543843],[-75.195012,40.576705],[-75.205966,40.691721],[-75.052611,40.866983],[-75.134765,40.971045],[-74.882826,41.179168],[-74.828057,41.288707],[-74.69661,41.359907],[-74.236547,41.14083]]]}}, +{"type":"Feature","id":"35","properties":{"name":"New Mexico","density":17.16},"geometry":{"type":"Polygon","coordinates":[[[-107.421329,37.000263],[-106.868158,36.994786],[-104.337812,36.994786],[-103.001438,37.000263],[-103.001438,36.501861],[-103.039777,36.501861],[-103.045254,34.01533],[-103.067161,33.002096],[-103.067161,31.999816],[-106.616219,31.999816],[-106.643603,31.901231],[-106.528588,31.786216],[-108.210008,31.786216],[-108.210008,31.331629],[-109.04798,31.331629],[-109.042503,37.000263],[-107.421329,37.000263]]]}}, +{"type":"Feature","id":"36","properties":{"name":"New York","density":412.3},"geometry":{"type":"Polygon","coordinates":[[[-73.343806,45.013027],[-73.332852,44.804903],[-73.387622,44.618687],[-73.294514,44.437948],[-73.321898,44.246255],[-73.436914,44.043608],[-73.349283,43.769761],[-73.404052,43.687607],[-73.245221,43.523299],[-73.278083,42.833204],[-73.267129,42.745573],[-73.508114,42.08834],[-73.486206,42.050002],[-73.55193,41.294184],[-73.48073,41.21203],[-73.727192,41.102491],[-73.655992,40.987475],[-73.22879,40.905321],[-73.141159,40.965568],[-72.774204,40.965568],[-72.587988,40.998429],[-72.28128,41.157261],[-72.259372,41.042245],[-72.100541,40.992952],[-72.467496,40.845075],[-73.239744,40.625997],[-73.562884,40.582182],[-73.776484,40.593136],[-73.935316,40.543843],[-74.022947,40.708151],[-73.902454,40.998429],[-74.236547,41.14083],[-74.69661,41.359907],[-74.740426,41.431108],[-74.89378,41.436584],[-75.074519,41.60637],[-75.052611,41.754247],[-75.173104,41.869263],[-75.249781,41.863786],[-75.35932,42.000709],[-79.76278,42.000709],[-79.76278,42.252649],[-79.76278,42.269079],[-79.149363,42.55388],[-79.050778,42.690804],[-78.853608,42.783912],[-78.930285,42.953697],[-79.012439,42.986559],[-79.072686,43.260406],[-78.486653,43.375421],[-77.966344,43.369944],[-77.75822,43.34256],[-77.533665,43.233021],[-77.391265,43.276836],[-76.958587,43.271359],[-76.695693,43.34256],[-76.41637,43.523299],[-76.235631,43.528776],[-76.230154,43.802623],[-76.137046,43.961454],[-76.3616,44.070993],[-76.312308,44.196962],[-75.912491,44.366748],[-75.764614,44.514625],[-75.282643,44.848718],[-74.828057,45.018503],[-74.148916,44.991119],[-73.343806,45.013027]]]}}, +{"type":"Feature","id":"37","properties":{"name":"North Carolina","density":198.2},"geometry":{"type":"Polygon","coordinates":[[[-80.978661,36.562108],[-80.294043,36.545677],[-79.510841,36.5402],[-75.868676,36.551154],[-75.75366,36.151337],[-76.032984,36.189676],[-76.071322,36.140383],[-76.410893,36.080137],[-76.460185,36.025367],[-76.68474,36.008937],[-76.673786,35.937736],[-76.399939,35.987029],[-76.3616,35.943213],[-76.060368,35.992506],[-75.961783,35.899398],[-75.781044,35.937736],[-75.715321,35.696751],[-75.775568,35.581735],[-75.89606,35.570781],[-76.147999,35.324319],[-76.482093,35.313365],[-76.536862,35.14358],[-76.394462,34.973795],[-76.279446,34.940933],[-76.493047,34.661609],[-76.673786,34.694471],[-76.991448,34.667086],[-77.210526,34.60684],[-77.555573,34.415147],[-77.82942,34.163208],[-77.971821,33.845545],[-78.179944,33.916745],[-78.541422,33.851022],[-79.675149,34.80401],[-80.797922,34.820441],[-80.781491,34.935456],[-80.934845,35.105241],[-81.038907,35.044995],[-81.044384,35.149057],[-82.276696,35.198349],[-82.550543,35.160011],[-82.764143,35.066903],[-83.109191,35.00118],[-83.618546,34.984749],[-84.319594,34.990226],[-84.29221,35.225734],[-84.09504,35.247642],[-84.018363,35.41195],[-83.7719,35.559827],[-83.498053,35.565304],[-83.251591,35.718659],[-82.994175,35.773428],[-82.775097,35.997983],[-82.638174,36.063706],[-82.610789,35.965121],[-82.216449,36.156814],[-82.03571,36.118475],[-81.909741,36.304691],[-81.723525,36.353984],[-81.679709,36.589492],[-80.978661,36.562108]]]}}, +{"type":"Feature","id":"38","properties":{"name":"North Dakota","density":9.916},"geometry":{"type":"Polygon","coordinates":[[[-97.228743,49.000239],[-97.097296,48.682577],[-97.16302,48.545653],[-97.130158,48.140359],[-97.053481,47.948667],[-96.856311,47.609096],[-96.823449,46.968294],[-96.785111,46.924479],[-96.801542,46.656109],[-96.719387,46.437031],[-96.598895,46.332969],[-96.560556,45.933153],[-104.047534,45.944106],[-104.042057,47.861036],[-104.047534,49.000239],[-97.228743,49.000239]]]}}, +{"type":"Feature","id":"39","properties":{"name":"Ohio","density":281.9},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,41.978802],[-80.518598,40.636951],[-80.666475,40.582182],[-80.595275,40.472643],[-80.600752,40.319289],[-80.737675,40.078303],[-80.830783,39.711348],[-81.219646,39.388209],[-81.345616,39.344393],[-81.455155,39.410117],[-81.57017,39.267716],[-81.685186,39.273193],[-81.811156,39.0815],[-81.783771,38.966484],[-81.887833,38.873376],[-82.03571,39.026731],[-82.221926,38.785745],[-82.172634,38.632391],[-82.293127,38.577622],[-82.331465,38.446175],[-82.594358,38.424267],[-82.731282,38.561191],[-82.846298,38.588575],[-82.890113,38.758361],[-83.032514,38.725499],[-83.142052,38.626914],[-83.519961,38.703591],[-83.678792,38.632391],[-83.903347,38.769315],[-84.215533,38.807653],[-84.231963,38.895284],[-84.43461,39.103408],[-84.817996,39.103408],[-84.801565,40.500028],[-84.807042,41.694001],[-83.454238,41.732339],[-83.065375,41.595416],[-82.933929,41.513262],[-82.835344,41.589939],[-82.616266,41.431108],[-82.479343,41.381815],[-82.013803,41.513262],[-81.739956,41.485877],[-81.444201,41.672093],[-81.011523,41.852832],[-80.518598,41.978802],[-80.518598,41.978802]]]}}, +{"type":"Feature","id":"40","properties":{"name":"Oklahoma","density":55.22},"geometry":{"type":"Polygon","coordinates":[[[-100.087706,37.000263],[-94.616242,37.000263],[-94.616242,36.501861],[-94.430026,35.395519],[-94.484796,33.637421],[-94.868182,33.74696],[-94.966767,33.861976],[-95.224183,33.960561],[-95.289906,33.87293],[-95.547322,33.878407],[-95.602092,33.933176],[-95.8376,33.834591],[-95.936185,33.889361],[-96.149786,33.840068],[-96.346956,33.686714],[-96.423633,33.774345],[-96.631756,33.845545],[-96.850834,33.845545],[-96.922034,33.960561],[-97.173974,33.736006],[-97.256128,33.861976],[-97.371143,33.823637],[-97.458774,33.905791],[-97.694283,33.982469],[-97.869545,33.851022],[-97.946222,33.987946],[-98.088623,34.004376],[-98.170777,34.113915],[-98.36247,34.157731],[-98.488439,34.064623],[-98.570593,34.146777],[-98.767763,34.135823],[-98.986841,34.223454],[-99.189488,34.2125],[-99.260688,34.404193],[-99.57835,34.415147],[-99.698843,34.382285],[-99.923398,34.573978],[-100.000075,34.563024],[-100.000075,36.501861],[-101.812942,36.501861],[-103.001438,36.501861],[-103.001438,37.000263],[-102.042974,36.994786],[-100.087706,37.000263]]]}}, +{"type":"Feature","id":"41","properties":{"name":"Oregon","density":40.33},"geometry":{"type":"Polygon","coordinates":[[[-123.211348,46.174138],[-123.11824,46.185092],[-122.904639,46.08103],[-122.811531,45.960537],[-122.762239,45.659305],[-122.247407,45.549767],[-121.809251,45.708598],[-121.535404,45.725029],[-121.217742,45.670259],[-121.18488,45.604536],[-120.637186,45.746937],[-120.505739,45.697644],[-120.209985,45.725029],[-119.963522,45.823614],[-119.525367,45.911245],[-119.125551,45.933153],[-118.988627,45.998876],[-116.918344,45.993399],[-116.78142,45.823614],[-116.545912,45.752413],[-116.463758,45.61549],[-116.671881,45.319735],[-116.732128,45.144473],[-116.847143,45.02398],[-116.830713,44.930872],[-116.934774,44.782995],[-117.038836,44.750133],[-117.241483,44.394132],[-117.170283,44.257209],[-116.97859,44.240778],[-116.896436,44.158624],[-117.027882,43.830007],[-117.027882,42.000709],[-118.698349,41.989755],[-120.001861,41.995232],[-121.037003,41.995232],[-122.378853,42.011663],[-123.233256,42.006186],[-124.213628,42.000709],[-124.356029,42.115725],[-124.432706,42.438865],[-124.416275,42.663419],[-124.553198,42.838681],[-124.454613,43.002989],[-124.383413,43.271359],[-124.235536,43.55616],[-124.169813,43.8081],[-124.060274,44.657025],[-124.076705,44.772041],[-123.97812,45.144473],[-123.939781,45.659305],[-123.994551,45.944106],[-123.945258,46.113892],[-123.545441,46.261769],[-123.370179,46.146753],[-123.211348,46.174138]]]}}, +{"type":"Feature","id":"42","properties":{"name":"Pennsylvania","density":284.3},"geometry":{"type":"Polygon","coordinates":[[[-79.76278,42.252649],[-79.76278,42.000709],[-75.35932,42.000709],[-75.249781,41.863786],[-75.173104,41.869263],[-75.052611,41.754247],[-75.074519,41.60637],[-74.89378,41.436584],[-74.740426,41.431108],[-74.69661,41.359907],[-74.828057,41.288707],[-74.882826,41.179168],[-75.134765,40.971045],[-75.052611,40.866983],[-75.205966,40.691721],[-75.195012,40.576705],[-75.069042,40.543843],[-75.058088,40.417874],[-74.773287,40.215227],[-74.82258,40.127596],[-75.129289,39.963288],[-75.145719,39.88661],[-75.414089,39.804456],[-75.616736,39.831841],[-75.786521,39.722302],[-79.477979,39.722302],[-80.518598,39.722302],[-80.518598,40.636951],[-80.518598,41.978802],[-80.518598,41.978802],[-80.332382,42.033571],[-79.76278,42.269079],[-79.76278,42.252649]]]}}, +{"type":"Feature","id":"44","properties":{"name":"Rhode Island","density":1006 },"geometry":{"type":"MultiPolygon","coordinates":[[[[-71.196845,41.67757],[-71.120168,41.496831],[-71.317338,41.474923],[-71.196845,41.67757]]],[[[-71.530939,42.01714],[-71.383061,42.01714],[-71.328292,41.781632],[-71.22423,41.710431],[-71.344723,41.726862],[-71.448785,41.578985],[-71.481646,41.370861],[-71.859555,41.321569],[-71.799309,41.414677],[-71.799309,42.006186],[-71.530939,42.01714]]]]}}, +{"type":"Feature","id":"45","properties":{"name":"South Carolina","density":155.4},"geometry":{"type":"Polygon","coordinates":[[[-82.764143,35.066903],[-82.550543,35.160011],[-82.276696,35.198349],[-81.044384,35.149057],[-81.038907,35.044995],[-80.934845,35.105241],[-80.781491,34.935456],[-80.797922,34.820441],[-79.675149,34.80401],[-78.541422,33.851022],[-78.716684,33.80173],[-78.935762,33.637421],[-79.149363,33.380005],[-79.187701,33.171881],[-79.357487,33.007573],[-79.582041,33.007573],[-79.631334,32.887081],[-79.866842,32.755634],[-79.998289,32.613234],[-80.206412,32.552987],[-80.430967,32.399633],[-80.452875,32.328433],[-80.660998,32.246279],[-80.885553,32.032678],[-81.115584,32.120309],[-81.121061,32.290094],[-81.279893,32.558464],[-81.416816,32.629664],[-81.42777,32.843265],[-81.493493,33.007573],[-81.761863,33.160928],[-81.937125,33.347144],[-81.926172,33.462159],[-82.194542,33.631944],[-82.325988,33.81816],[-82.55602,33.94413],[-82.714851,34.152254],[-82.747713,34.26727],[-82.901067,34.486347],[-83.005129,34.469916],[-83.339222,34.683517],[-83.322791,34.787579],[-83.109191,35.00118],[-82.764143,35.066903]]]}}, +{"type":"Feature","id":"46","properties":{"name":"South Dakota","density":98.07},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,45.944106],[-96.560556,45.933153],[-96.582464,45.818137],[-96.856311,45.604536],[-96.681049,45.412843],[-96.451017,45.297827],[-96.451017,43.501391],[-96.582464,43.479483],[-96.527695,43.397329],[-96.560556,43.222067],[-96.434587,43.123482],[-96.511264,43.052282],[-96.544125,42.855112],[-96.631756,42.707235],[-96.44554,42.488157],[-96.626279,42.515542],[-96.692003,42.657942],[-97.217789,42.844158],[-97.688806,42.844158],[-97.831206,42.866066],[-97.951699,42.767481],[-98.466531,42.94822],[-98.499393,42.997512],[-101.626726,42.997512],[-103.324578,43.002989],[-104.053011,43.002989],[-104.058488,44.996596],[-104.042057,44.996596],[-104.047534,45.944106]]]}}, +{"type":"Feature","id":"47","properties":{"name":"Tennessee","density":88.08},"geometry":{"type":"Polygon","coordinates":[[[-88.054868,36.496384],[-88.071299,36.677123],[-87.852221,36.633308],[-86.592525,36.655216],[-85.486183,36.616877],[-85.289013,36.627831],[-84.544149,36.594969],[-83.689746,36.584015],[-83.673316,36.600446],[-81.679709,36.589492],[-81.723525,36.353984],[-81.909741,36.304691],[-82.03571,36.118475],[-82.216449,36.156814],[-82.610789,35.965121],[-82.638174,36.063706],[-82.775097,35.997983],[-82.994175,35.773428],[-83.251591,35.718659],[-83.498053,35.565304],[-83.7719,35.559827],[-84.018363,35.41195],[-84.09504,35.247642],[-84.29221,35.225734],[-84.319594,34.990226],[-85.606675,34.984749],[-87.359296,35.00118],[-88.202745,34.995703],[-88.471115,34.995703],[-90.311367,34.995703],[-90.212782,35.023087],[-90.114197,35.198349],[-90.130628,35.439335],[-89.944412,35.603643],[-89.911551,35.756997],[-89.763673,35.811767],[-89.730812,35.997983],[-89.533642,36.249922],[-89.539119,36.496384],[-89.484349,36.496384],[-89.418626,36.496384],[-89.298133,36.507338],[-88.054868,36.496384]]]}}, +{"type":"Feature","id":"48","properties":{"name":"Texas","density":98.07},"geometry":{"type":"Polygon","coordinates":[[[-101.812942,36.501861],[-100.000075,36.501861],[-100.000075,34.563024],[-99.923398,34.573978],[-99.698843,34.382285],[-99.57835,34.415147],[-99.260688,34.404193],[-99.189488,34.2125],[-98.986841,34.223454],[-98.767763,34.135823],[-98.570593,34.146777],[-98.488439,34.064623],[-98.36247,34.157731],[-98.170777,34.113915],[-98.088623,34.004376],[-97.946222,33.987946],[-97.869545,33.851022],[-97.694283,33.982469],[-97.458774,33.905791],[-97.371143,33.823637],[-97.256128,33.861976],[-97.173974,33.736006],[-96.922034,33.960561],[-96.850834,33.845545],[-96.631756,33.845545],[-96.423633,33.774345],[-96.346956,33.686714],[-96.149786,33.840068],[-95.936185,33.889361],[-95.8376,33.834591],[-95.602092,33.933176],[-95.547322,33.878407],[-95.289906,33.87293],[-95.224183,33.960561],[-94.966767,33.861976],[-94.868182,33.74696],[-94.484796,33.637421],[-94.380734,33.544313],[-94.183564,33.593606],[-94.041164,33.54979],[-94.041164,33.018527],[-94.041164,31.994339],[-93.822086,31.775262],[-93.816609,31.556184],[-93.542762,31.15089],[-93.526331,30.93729],[-93.630393,30.679874],[-93.728978,30.575812],[-93.696116,30.438888],[-93.767317,30.334826],[-93.690639,30.143133],[-93.926148,29.787132],[-93.838517,29.688547],[-94.002825,29.68307],[-94.523134,29.546147],[-94.70935,29.622824],[-94.742212,29.787132],[-94.873659,29.672117],[-94.966767,29.699501],[-95.016059,29.557101],[-94.911997,29.496854],[-94.895566,29.310638],[-95.081782,29.113469],[-95.383014,28.867006],[-95.985477,28.604113],[-96.045724,28.647929],[-96.226463,28.582205],[-96.23194,28.642452],[-96.478402,28.598636],[-96.593418,28.724606],[-96.664618,28.697221],[-96.401725,28.439805],[-96.593418,28.357651],[-96.774157,28.406943],[-96.801542,28.226204],[-97.026096,28.039988],[-97.256128,27.694941],[-97.404005,27.333463],[-97.513544,27.360848],[-97.540929,27.229401],[-97.425913,27.262263],[-97.480682,26.99937],[-97.557359,26.988416],[-97.562836,26.840538],[-97.469728,26.758384],[-97.442344,26.457153],[-97.332805,26.353091],[-97.30542,26.161398],[-97.217789,25.991613],[-97.524498,25.887551],[-97.650467,26.018997],[-97.885976,26.06829],[-98.198161,26.057336],[-98.466531,26.221644],[-98.669178,26.238075],[-98.822533,26.369522],[-99.030656,26.413337],[-99.173057,26.539307],[-99.266165,26.840538],[-99.446904,27.021277],[-99.424996,27.174632],[-99.50715,27.33894],[-99.479765,27.48134],[-99.605735,27.640172],[-99.709797,27.656603],[-99.879582,27.799003],[-99.934351,27.979742],[-100.082229,28.14405],[-100.29583,28.280974],[-100.399891,28.582205],[-100.498476,28.66436],[-100.629923,28.905345],[-100.673738,29.102515],[-100.799708,29.244915],[-101.013309,29.370885],[-101.062601,29.458516],[-101.259771,29.535193],[-101.413125,29.754271],[-101.851281,29.803563],[-102.114174,29.792609],[-102.338728,29.869286],[-102.388021,29.765225],[-102.629006,29.732363],[-102.809745,29.524239],[-102.919284,29.190146],[-102.97953,29.184669],[-103.116454,28.987499],[-103.280762,28.982022],[-103.527224,29.135376],[-104.146119,29.381839],[-104.266611,29.513285],[-104.507597,29.639255],[-104.677382,29.924056],[-104.688336,30.181472],[-104.858121,30.389596],[-104.896459,30.570335],[-105.005998,30.685351],[-105.394861,30.855136],[-105.602985,31.085167],[-105.77277,31.167321],[-105.953509,31.364491],[-106.205448,31.468553],[-106.38071,31.731446],[-106.528588,31.786216],[-106.643603,31.901231],[-106.616219,31.999816],[-103.067161,31.999816],[-103.067161,33.002096],[-103.045254,34.01533],[-103.039777,36.501861],[-103.001438,36.501861],[-101.812942,36.501861]]]}}, +{"type":"Feature","id":"49","properties":{"name":"Utah","density":34.30},"geometry":{"type":"Polygon","coordinates":[[[-112.164359,41.995232],[-111.047063,42.000709],[-111.047063,40.998429],[-109.04798,40.998429],[-109.053457,39.125316],[-109.058934,38.27639],[-109.042503,38.166851],[-109.042503,37.000263],[-110.499369,37.00574],[-114.048427,37.000263],[-114.04295,41.995232],[-112.164359,41.995232]]]}}, +{"type":"Feature","id":"50","properties":{"name":"Vermont","density":67.73},"geometry":{"type":"Polygon","coordinates":[[[-71.503554,45.013027],[-71.4926,44.914442],[-71.629524,44.750133],[-71.536416,44.585825],[-71.700724,44.41604],[-72.034817,44.322932],[-72.02934,44.07647],[-72.116971,43.994316],[-72.204602,43.769761],[-72.379864,43.572591],[-72.456542,43.150867],[-72.445588,43.008466],[-72.533219,42.953697],[-72.544173,42.80582],[-72.456542,42.729142],[-73.267129,42.745573],[-73.278083,42.833204],[-73.245221,43.523299],[-73.404052,43.687607],[-73.349283,43.769761],[-73.436914,44.043608],[-73.321898,44.246255],[-73.294514,44.437948],[-73.387622,44.618687],[-73.332852,44.804903],[-73.343806,45.013027],[-72.308664,45.002073],[-71.503554,45.013027]]]}}, +{"type":"Feature","id":"51","properties":{"name":"Virginia","density":204.5},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.397659,38.013497],[-75.244304,38.029928],[-75.375751,37.860142],[-75.512674,37.799896],[-75.594828,37.569865],[-75.802952,37.197433],[-75.972737,37.120755],[-76.027507,37.257679],[-75.939876,37.564388],[-75.671506,37.95325],[-75.397659,38.013497]]],[[[-76.016553,37.95325],[-75.994645,37.95325],[-76.043938,37.95325],[-76.016553,37.95325]]],[[[-78.349729,39.464886],[-77.82942,39.130793],[-77.719881,39.322485],[-77.566527,39.306055],[-77.456988,39.223901],[-77.456988,39.076023],[-77.248864,39.026731],[-77.117418,38.933623],[-77.040741,38.791222],[-77.128372,38.632391],[-77.248864,38.588575],[-77.325542,38.446175],[-77.281726,38.342113],[-77.013356,38.374975],[-76.964064,38.216144],[-76.613539,38.15042],[-76.514954,38.024451],[-76.235631,37.887527],[-76.3616,37.608203],[-76.246584,37.389126],[-76.383508,37.285064],[-76.399939,37.159094],[-76.273969,37.082417],[-76.410893,36.961924],[-76.619016,37.120755],[-76.668309,37.065986],[-76.48757,36.95097],[-75.994645,36.923586],[-75.868676,36.551154],[-79.510841,36.5402],[-80.294043,36.545677],[-80.978661,36.562108],[-81.679709,36.589492],[-83.673316,36.600446],[-83.136575,36.742847],[-83.070852,36.852385],[-82.879159,36.890724],[-82.868205,36.978355],[-82.720328,37.044078],[-82.720328,37.120755],[-82.353373,37.268633],[-81.969987,37.537003],[-81.986418,37.454849],[-81.849494,37.285064],[-81.679709,37.20291],[-81.55374,37.208387],[-81.362047,37.339833],[-81.225123,37.235771],[-80.967707,37.290541],[-80.513121,37.482234],[-80.474782,37.421987],[-80.29952,37.509618],[-80.294043,37.690357],[-80.184505,37.849189],[-79.998289,37.997066],[-79.921611,38.177805],[-79.724442,38.364021],[-79.647764,38.594052],[-79.477979,38.457129],[-79.313671,38.413313],[-79.209609,38.495467],[-78.996008,38.851469],[-78.870039,38.763838],[-78.404499,39.169131],[-78.349729,39.464886]]]]}}, +{"type":"Feature","id":"53","properties":{"name":"Washington","density":102.6},"geometry":{"type":"MultiPolygon","coordinates":[[[[-117.033359,49.000239],[-117.044313,47.762451],[-117.038836,46.426077],[-117.055267,46.343923],[-116.92382,46.168661],[-116.918344,45.993399],[-118.988627,45.998876],[-119.125551,45.933153],[-119.525367,45.911245],[-119.963522,45.823614],[-120.209985,45.725029],[-120.505739,45.697644],[-120.637186,45.746937],[-121.18488,45.604536],[-121.217742,45.670259],[-121.535404,45.725029],[-121.809251,45.708598],[-122.247407,45.549767],[-122.762239,45.659305],[-122.811531,45.960537],[-122.904639,46.08103],[-123.11824,46.185092],[-123.211348,46.174138],[-123.370179,46.146753],[-123.545441,46.261769],[-123.72618,46.300108],[-123.874058,46.239861],[-124.065751,46.327492],[-124.027412,46.464416],[-123.895966,46.535616],[-124.098612,46.74374],[-124.235536,47.285957],[-124.31769,47.357157],[-124.427229,47.740543],[-124.624399,47.88842],[-124.706553,48.184175],[-124.597014,48.381345],[-124.394367,48.288237],[-123.983597,48.162267],[-123.704273,48.167744],[-123.424949,48.118452],[-123.162056,48.167744],[-123.036086,48.080113],[-122.800578,48.08559],[-122.636269,47.866512],[-122.515777,47.882943],[-122.493869,47.587189],[-122.422669,47.318818],[-122.324084,47.346203],[-122.422669,47.576235],[-122.395284,47.800789],[-122.230976,48.030821],[-122.362422,48.123929],[-122.373376,48.288237],[-122.471961,48.468976],[-122.422669,48.600422],[-122.488392,48.753777],[-122.647223,48.775685],[-122.795101,48.8907],[-122.756762,49.000239],[-117.033359,49.000239]]],[[[-122.718423,48.310145],[-122.586977,48.35396],[-122.608885,48.151313],[-122.767716,48.227991],[-122.718423,48.310145]]],[[[-123.025132,48.583992],[-122.915593,48.715438],[-122.767716,48.556607],[-122.811531,48.419683],[-123.041563,48.458022],[-123.025132,48.583992]]]]}}, +{"type":"Feature","id":"54","properties":{"name":"West Virginia","density":77.06},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,40.636951],[-80.518598,39.722302],[-79.477979,39.722302],[-79.488933,39.20747],[-79.291763,39.300578],[-79.094593,39.470363],[-78.963147,39.437501],[-78.765977,39.585379],[-78.470222,39.514178],[-78.431884,39.623717],[-78.267575,39.61824],[-78.174467,39.694917],[-78.004682,39.601809],[-77.834897,39.601809],[-77.719881,39.322485],[-77.82942,39.130793],[-78.349729,39.464886],[-78.404499,39.169131],[-78.870039,38.763838],[-78.996008,38.851469],[-79.209609,38.495467],[-79.313671,38.413313],[-79.477979,38.457129],[-79.647764,38.594052],[-79.724442,38.364021],[-79.921611,38.177805],[-79.998289,37.997066],[-80.184505,37.849189],[-80.294043,37.690357],[-80.29952,37.509618],[-80.474782,37.421987],[-80.513121,37.482234],[-80.967707,37.290541],[-81.225123,37.235771],[-81.362047,37.339833],[-81.55374,37.208387],[-81.679709,37.20291],[-81.849494,37.285064],[-81.986418,37.454849],[-81.969987,37.537003],[-82.101434,37.553434],[-82.293127,37.668449],[-82.342419,37.783465],[-82.50125,37.931343],[-82.621743,38.123036],[-82.594358,38.424267],[-82.331465,38.446175],[-82.293127,38.577622],[-82.172634,38.632391],[-82.221926,38.785745],[-82.03571,39.026731],[-81.887833,38.873376],[-81.783771,38.966484],[-81.811156,39.0815],[-81.685186,39.273193],[-81.57017,39.267716],[-81.455155,39.410117],[-81.345616,39.344393],[-81.219646,39.388209],[-80.830783,39.711348],[-80.737675,40.078303],[-80.600752,40.319289],[-80.595275,40.472643],[-80.666475,40.582182],[-80.518598,40.636951]]]}}, +{"type":"Feature","id":"55","properties":{"name":"Wisconsin","density":105.2},"geometry":{"type":"Polygon","coordinates":[[[-90.415429,46.568478],[-90.229213,46.508231],[-90.119674,46.338446],[-89.09001,46.135799],[-88.662808,45.987922],[-88.531362,46.020784],[-88.10416,45.922199],[-87.989145,45.796229],[-87.781021,45.675736],[-87.791975,45.500474],[-87.885083,45.363551],[-87.649574,45.341643],[-87.742682,45.199243],[-87.589328,45.095181],[-87.627666,44.974688],[-87.819359,44.95278],[-87.983668,44.722749],[-88.043914,44.563917],[-87.928898,44.536533],[-87.775544,44.640595],[-87.611236,44.837764],[-87.403112,44.914442],[-87.238804,45.166381],[-87.03068,45.22115],[-87.047111,45.089704],[-87.189511,44.969211],[-87.468835,44.552964],[-87.545512,44.322932],[-87.540035,44.158624],[-87.644097,44.103854],[-87.737205,43.8793],[-87.704344,43.687607],[-87.791975,43.561637],[-87.912467,43.249452],[-87.885083,43.002989],[-87.76459,42.783912],[-87.802929,42.493634],[-88.788778,42.493634],[-90.639984,42.510065],[-90.711184,42.636034],[-91.067185,42.75105],[-91.143862,42.909881],[-91.176724,43.134436],[-91.056231,43.254929],[-91.204109,43.353514],[-91.215062,43.501391],[-91.269832,43.616407],[-91.242447,43.775238],[-91.43414,43.994316],[-91.592971,44.032654],[-91.877772,44.202439],[-91.927065,44.333886],[-92.233773,44.443425],[-92.337835,44.552964],[-92.545959,44.569394],[-92.808852,44.750133],[-92.737652,45.117088],[-92.75956,45.286874],[-92.644544,45.440228],[-92.770513,45.566198],[-92.885529,45.577151],[-92.869098,45.719552],[-92.639067,45.933153],[-92.354266,46.015307],[-92.29402,46.075553],[-92.29402,46.667063],[-92.091373,46.749217],[-92.014696,46.705401],[-91.790141,46.694447],[-91.09457,46.864232],[-90.837154,46.95734],[-90.749522,46.88614],[-90.886446,46.754694],[-90.55783,46.584908],[-90.415429,46.568478]]]}}, +{"type":"Feature","id":"56","properties":{"name":"Wyoming","density":5.851},"geometry":{"type":"Polygon","coordinates":[[[-109.080842,45.002073],[-105.91517,45.002073],[-104.058488,44.996596],[-104.053011,43.002989],[-104.053011,41.003906],[-105.728954,40.998429],[-107.919731,41.003906],[-109.04798,40.998429],[-111.047063,40.998429],[-111.047063,42.000709],[-111.047063,44.476286],[-111.05254,45.002073],[-109.080842,45.002073]]]}}, +{"type":"Feature","id":"72","properties":{"name":"Puerto Rico","density":1082 },"geometry":{"type":"Polygon","coordinates":[[[-66.448338,17.984326],[-66.771478,18.006234],[-66.924832,17.929556],[-66.985078,17.973372],[-67.209633,17.956941],[-67.154863,18.19245],[-67.269879,18.362235],[-67.094617,18.515589],[-66.957694,18.488204],[-66.409999,18.488204],[-65.840398,18.433435],[-65.632274,18.367712],[-65.626797,18.203403],[-65.730859,18.186973],[-65.834921,18.017187],[-66.234737,17.929556],[-66.448338,17.984326]]]}} +]}; From f15dc88a4fedb11629ef3e50d663c9fce814a95c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 18:09:59 +0300 Subject: [PATCH 0244/2207] add 0.4.3 blog post, minor tutorials update --- _posts/2012-07-30-leaflet-0-4-released.md | 15 ------- ...-08-07-leaflet-0-4-3-and-a-new-tutorial.md | 43 +++++++++++++++++++ examples.md | 2 +- examples/choropleth.md | 2 +- 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 _posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index 464438242f2..79d603a2daf 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -188,21 +188,6 @@ And, of course, thanks to my amazing company, [CloudMade](http://cloudmade.com), Sincerely,
      Vladimir Agafonkin, Leaflet maintainer. -
      - -**Update (July 31)**: 0.4.1 hotfix was released with the following bugs fixed: - - * Fixed a bug that caused marker shadows to appear as opaque black in IE6-8. [#850](https://github.com/CloudMade/Leaflet/issues/850) - * Fixed a bug with incorrect calculation of scale by the scale control. [#852](https://github.com/CloudMade/Leaflet/issues/852) - * Fixed broken L.tileLayer.wms class factory. [#856](https://github.com/CloudMade/Leaflet/issues/856) - * Improved retina detection for `TileLayer` `detectRetina` option. [#854](https://github.com/CloudMade/Leaflet/issues/854) - -**Update (August 1)**: 0.4.2 hotfix was released with the following bugs fixed: - - * Fixed a bug where layers control radio buttons would not work correctly in IE7. [#862](https://github.com/CloudMade/Leaflet/pull/862) - * Fixed a bug where `FeatureGroup` `removeLayer` would unbind popups of removed layers even if the popups were not put by the group (affected [Leaflet.markercluster](https://github.com/danzel/Leaflet.markercluster) plugin). [#861](https://github.com/CloudMade/Leaflet/pull/861) - - [LatLng]: ../../../reference.html#latlng [LatLngBounds]: ../../../reference.html#latlngbounds [Point]: ../../../reference.html#point diff --git a/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md b/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md new file mode 100644 index 00000000000..0e127c35d4f --- /dev/null +++ b/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md @@ -0,0 +1,43 @@ +--- +layout: post +title: Leaflet 0.4.3 and a New Tutorial +description: Leaflet 0.4.3 released with several bugfixes and improvements, and comes with a new tutorial on creating a colorful interactive choropleth map. +--- + +Following the [Leaflet 0.4 release](leaflet-0-4-released.html), there were several minor bugfix releases over the past week, with Leaflet 0.4.3 released today. They contain fixes for some bugs that were discovered and also bring some improvements to the new GeoJSON API to make it even more flexible --- see the changelog below. + +I've also written [a new tutorial](../../../examples/choropleth.html), inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/about/staff/ryan-murphy/) by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/) (also powered by Leaflet). It will show you step-by-step how to create a beautiful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with the help of GeoJSON and custom controls, and hopefully convince more major news and government websites to switch to Leaflet. :) + +Grab the new Leaflet 0.4.3 at the [download page](../../../download.html). Enjoy! + +### 0.4.3 (August 7, 2012) + +#### Improvements + + * Improved `GeoJSON` `setStyle` to also accept function (like the corresponding option). + * Added `GeoJSON` `resetStyle(layer)`, useful for resetting hover state. + * Added `feature` property to layers created with `GeoJSON` (containing the GeoJSON feature data). + * Added `FeatureGroup` `bringToFront` and `bringToBack` methods (so that they would work for multipolys). + * Added optional `animate` argument to `Map` `invalidateSize` (by [@ajbeaven](https://github.com/ajbeaven)). [#857](https://github.com/CloudMade/Leaflet/pull/857) + +#### Bugfixes + + * Fixed a bug where tiles sometimes disappeared on initial map load on Android 2/3 (by [@danzel](https://github.com/danzel)). [#868](https://github.com/CloudMade/Leaflet/pull/868) + * Fixed a bug where map would occasionally flicker near the border on zoom or pan on Chrome. + * Fixed a bug where `Path` `bringToFront` and `bringToBack` didn't return `this`. + * Removed zoom out on Win/Meta key binding (since it interferes with global keyboard shortcuts). [#869](https://github.com/CloudMade/Leaflet/issues/869) + +### 0.4.2 (August 1, 2012) + + * Fixed a bug where layers control radio buttons would not work correctly in IE7 (by [@danzel](https://github.com/danzel)). [#862](https://github.com/CloudMade/Leaflet/pull/862) + * Fixed a bug where `FeatureGroup` `removeLayer` would unbind popups of removed layers even if the popups were not put by the group (affected [Leaflet.markercluster](https://github.com/danzel/Leaflet.markercluster) plugin) (by [@danzel](https://github.com/danzel)). [#861](https://github.com/CloudMade/Leaflet/pull/861) + +### 0.4.1 (July 31, 2012) + + * Fixed a bug that caused marker shadows appear as opaque black in IE6-8. [#850](https://github.com/CloudMade/Leaflet/issues/850) + * Fixed a bug with incorrect calculation of scale by the scale control. [#852](https://github.com/CloudMade/Leaflet/issues/852) + * Fixed broken L.tileLayer.wms class factory (by [@mattcurrie](https://github.com/mattcurrie)). [#856](https://github.com/CloudMade/Leaflet/issues/856) + * Improved retina detection for `TileLayer` `detectRetina` option (by [@sxua](https://github.com/sxua)). [#854](https://github.com/CloudMade/Leaflet/issues/854) + +Sincerely,
      +Vladimir Agafonkin, Leaflet maintainer. diff --git a/examples.md b/examples.md index d7dd895684b..ef7fe81bb65 100644 --- a/examples.md +++ b/examples.md @@ -40,7 +40,7 @@ In this tutorial, you'll learn how to create and interact with map vectors creat ### [Interactive Choropleth Map][7] -A case study of creating a colorful interactive choropleth map of US States Population Density with GeoJSON and some custom controls. News websites will love this. +A case study of creating a colorful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with GeoJSON and some custom controls. News websites will love this. *** [][6] diff --git a/examples/choropleth.md b/examples/choropleth.md index d280334473b..05374cf55d0 100644 --- a/examples/choropleth.md +++ b/examples/choropleth.md @@ -34,7 +34,7 @@ css: "#map { ## Interactive Choropleth Map -This is a case study of creating a colorful interactive choropleth map of US States Population Density with the help of [GeoJSON](geojson.html) and some [custom controls](../reference.html#icontrol) (that will hopefully convince all the remaining major news and government websites that do not use Leaflet yet to start doing so). +This is a case study of creating a colorful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with the help of [GeoJSON](geojson.html) and some [custom controls](../reference.html#icontrol) (that will hopefully convince all the remaining major news and government websites that do not use Leaflet yet to start doing so). The tutorial was inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/about/staff/ryan-murphy/) (also powered by Leaflet), created by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/). From c4756638fefddf29e303dac359004416b9bcb4c6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 18:16:00 +0300 Subject: [PATCH 0245/2207] fix Texas Tribune links --- _posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md | 2 +- examples/choropleth.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md b/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md index 0e127c35d4f..9b155631fd7 100644 --- a/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md +++ b/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md @@ -6,7 +6,7 @@ description: Leaflet 0.4.3 released with several bugfixes and improvements, and Following the [Leaflet 0.4 release](leaflet-0-4-released.html), there were several minor bugfix releases over the past week, with Leaflet 0.4.3 released today. They contain fixes for some bugs that were discovered and also bring some improvements to the new GeoJSON API to make it even more flexible --- see the changelog below. -I've also written [a new tutorial](../../../examples/choropleth.html), inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/about/staff/ryan-murphy/) by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/) (also powered by Leaflet). It will show you step-by-step how to create a beautiful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with the help of GeoJSON and custom controls, and hopefully convince more major news and government websites to switch to Leaflet. :) +I've also written [a new tutorial](../../../examples/choropleth.html), inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/library/data/us-senate-runoff-results-map/) by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/) (also powered by Leaflet). It will show you step-by-step how to create a beautiful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with the help of GeoJSON and custom controls, and hopefully convince more major news and government websites to switch to Leaflet. :) Grab the new Leaflet 0.4.3 at the [download page](../../../download.html). Enjoy! diff --git a/examples/choropleth.md b/examples/choropleth.md index 05374cf55d0..8b9a3061e00 100644 --- a/examples/choropleth.md +++ b/examples/choropleth.md @@ -36,7 +36,7 @@ css: "#map { This is a case study of creating a colorful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with the help of [GeoJSON](geojson.html) and some [custom controls](../reference.html#icontrol) (that will hopefully convince all the remaining major news and government websites that do not use Leaflet yet to start doing so). -The tutorial was inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/about/staff/ryan-murphy/) (also powered by Leaflet), created by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/). +The tutorial was inspired by the [Texas Tribune US Senate Runoff Results map](http://www.texastribune.org/library/data/us-senate-runoff-results-map/) (also powered by Leaflet), created by [Ryan Murphy](http://www.texastribune.org/about/staff/ryan-murphy/).
      From 6fc2d96ddace1dfc60cdeccb8fee27f704d39730 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 7 Aug 2012 18:47:24 +0300 Subject: [PATCH 0246/2207] update with 0.4.4 --- _posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md | 2 ++ download.md | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md b/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md index 9b155631fd7..8518ab94afc 100644 --- a/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md +++ b/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md @@ -10,6 +10,8 @@ I've also written [a new tutorial](../../../examples/choropleth.html), inspired Grab the new Leaflet 0.4.3 at the [download page](../../../download.html). Enjoy! +**update**: IE9 regression was discovered in 0.4.3, so I had to release 0.4.4 with a fix. Sorry! + ### 0.4.3 (August 7, 2012) #### Improvements diff --git a/download.md b/download.md index 0de048e1708..97de2d6e2f3 100644 --- a/download.md +++ b/download.md @@ -13,7 +13,7 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.4.3 + Leaflet 0.4.4 Stable version, released on August 7, 2012 @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source From 69df53248e48e04fabc8df0b0f9f0de0af8f8452 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 8 Aug 2012 12:22:27 +0300 Subject: [PATCH 0247/2207] fix choropleth examples hover issue in IE --- examples/choropleth-example.html | 6 +++++- examples/choropleth.md | 14 +++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/examples/choropleth-example.html b/examples/choropleth-example.html index d1302b375f1..6dac8d6080b 100644 --- a/examples/choropleth-example.html +++ b/examples/choropleth-example.html @@ -103,13 +103,17 @@ function highlightFeature(e) { var layer = e.target; - layer.bringToFront().setStyle({ + layer.setStyle({ weight: 5, color: '#666', dashArray: '', fillOpacity: 0.7 }); + if (!L.Browser.ie) { + layer.bringToFront(); + } + info.update(layer.feature.properties); } diff --git a/examples/choropleth.md b/examples/choropleth.md index 8b9a3061e00..ca5be2c2c1e 100644 --- a/examples/choropleth.md +++ b/examples/choropleth.md @@ -119,15 +119,19 @@ Now lets make the states highlighted visually in some way when they are hovered function highlightFeature(e) { var layer = e.target; - layer.bringToFront().setStyle({ + layer.setStyle({ weight: 5, color: '#666', dashArray: '', fillOpacity: 0.7 }); + + if (!L.Browser.ie) { + layer.bringToFront(); + } } -Here we get access to the layer that was hovered through `e.target`, set a thick grey border on the layer as our highlight effect, also bringing it to the front so that the border doesn't clash with nearby states. +Here we get access to the layer that was hovered through `e.target`, set a thick grey border on the layer as our highlight effect, also bringing it to the front so that the border doesn't clash with nearby states (but not for IE, since it has problems doing `bringToFront` on `mouseover`). Next we'll define what happens on `mouseout`: @@ -319,13 +323,17 @@ Enjoy the result on [the top of this page](#map) or on a [separate page](choropl function highlightFeature(e) { var layer = e.target; - layer.bringToFront().setStyle({ + layer.setStyle({ weight: 5, color: '#666', dashArray: '', fillOpacity: 0.7 }); + if (!L.Browser.ie) { + layer.bringToFront(); + } + info.update(layer.feature.properties); } From eb03c6b267e111dd74c85798071fdd93f5dc9dbf Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 8 Aug 2012 14:05:39 +0300 Subject: [PATCH 0248/2207] fix choropleth hover for Opera too --- examples/choropleth-example.html | 2 +- examples/choropleth.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/choropleth-example.html b/examples/choropleth-example.html index 6dac8d6080b..6c1295b6efc 100644 --- a/examples/choropleth-example.html +++ b/examples/choropleth-example.html @@ -110,7 +110,7 @@ fillOpacity: 0.7 }); - if (!L.Browser.ie) { + if (!L.Browser.ie && !L.Browser.opera) { layer.bringToFront(); } diff --git a/examples/choropleth.md b/examples/choropleth.md index ca5be2c2c1e..c0fc16703af 100644 --- a/examples/choropleth.md +++ b/examples/choropleth.md @@ -126,12 +126,12 @@ Now lets make the states highlighted visually in some way when they are hovered fillOpacity: 0.7 }); - if (!L.Browser.ie) { + if (!L.Browser.ie && !L.Browser.opera) { layer.bringToFront(); } } -Here we get access to the layer that was hovered through `e.target`, set a thick grey border on the layer as our highlight effect, also bringing it to the front so that the border doesn't clash with nearby states (but not for IE, since it has problems doing `bringToFront` on `mouseover`). +Here we get access to the layer that was hovered through `e.target`, set a thick grey border on the layer as our highlight effect, also bringing it to the front so that the border doesn't clash with nearby states (but not for IE or Opera, since they have problems doing `bringToFront` on `mouseover`). Next we'll define what happens on `mouseout`: From 20530e3d88de7de303d202a57e9e39c8f8c9f59c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 8 Aug 2012 14:23:19 +0300 Subject: [PATCH 0249/2207] fix choropleth example in Opera more --- examples/choropleth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/choropleth.md b/examples/choropleth.md index c0fc16703af..800dcd76c4f 100644 --- a/examples/choropleth.md +++ b/examples/choropleth.md @@ -330,7 +330,7 @@ Enjoy the result on [the top of this page](#map) or on a [separate page](choropl fillOpacity: 0.7 }); - if (!L.Browser.ie) { + if (!L.Browser.ie && !L.Browser.opera) { layer.bringToFront(); } From 9cd0ab6427b32f84f5d28f743a9322f73ec4536e Mon Sep 17 00:00:00 2001 From: mourner Date: Thu, 9 Aug 2012 01:12:05 +0300 Subject: [PATCH 0250/2207] remove markdotto github button that broke everything --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 38e7ccb2b15..84ef1a10819 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -54,7 +54,7 @@

      Leaflet

      An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps by CloudMade

      +

      The layer names can contain HTML, which allows you to add additional styling to the items:

      + +
      {"<img src='my-layer-icon' /> <span class='my-layer-item'>My Layer</span>": myLayer}
      + + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + +
      EventDataDescription
      baselayerchangeLayerEvent + Fired when the base layer is changed through the control.

      L.Control.Scale

      @@ -4387,6 +4480,19 @@

      Class Factories

      };
      +

      Constructor Hooks

      + +

      If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

      + +
      MyClass.addInitHook(function () {
      +	// ... do something in constructor additionally
      +	// e.g. add event listeners, set custom properties etc.
      +});
      + +

      You can also use the following shortcut when you just need to make one additional method call:

      + +
      MyClass.addInitHook('methodName', arg1, arg2, …);
      +

      L.Browser

      @@ -4412,6 +4518,11 @@

      L.Browser

      Boolean true for Internet Explorer 6. + + ie7 + Boolean + true for Internet Explorer 6. + webkit Boolean @@ -4422,7 +4533,7 @@

      L.Browser

      Boolean true for webkit-based browsers that support CSS 3D transformations. - + android Boolean true for Android mobile browser. + + android23 + Boolean + true for old Android stock browsers (2 and 3). + mobile Boolean @@ -4457,6 +4573,11 @@

      L.Browser

      Boolean true for all browsers on touch devices. + + msTouch + Boolean + true for browsers with Microsoft touch model (e.g. IE10). + retina Boolean @@ -4484,7 +4605,7 @@

      Methods

      Object - Merges the properties of the src object (or multiple objects) into dest object and returns the latter. + Merges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut. bind( @@ -4493,12 +4614,12 @@

      Methods

      Function - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. stamp( <Object> obj ) String - Applies a unique key to the object and returns that key. + Applies a unique key to the object and returns that key. Has an L.stamp shortcut. + new L.PosAnimation() - Creates a Transition object tied to a particular element with the given options. + Creates a PosAnimation object. -

      Options

      +

      Methods

      - - - + + - - - - - - - - - - - - - - - - - - - - - - + + + +
      OptionTypeDefaultMethodReturns Description
      durationNumber0.5Duration of the animation in seconds.
      easingString'ease'One of the timing functions for the animation.
      fpsNumber50Frames per second for the timer fallback (IE6-9).
      fakeStepIntervalNumber100How often to fire the step event during transition with a timer (as native transitions don't support such events).run( + <HTMLElement> element, + <Point> newPos, + <Number> duration?, + <Number> easeLinearity? ) + thisRun an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default)
      @@ -5094,35 +5204,6 @@

      Events

      -

      Methods

      - - - - - - - - - - - - - -
      MethodReturnsDescription
      run( - <Object> properties ) - thisRun the animation with the given set of properties and their end values.
      - -

      Transition Properties

      - -

      An object literal of the following form:

      - -
      {
      -	'<style-property-1>': '<value-1>',
      -	'<style-property-2>': '<value-2>'
      -	// ...
      -}
      - -

      L.Draggable

      @@ -5208,7 +5289,7 @@

      Methods

      -

      Static Properties

      + @@ -5573,7 +5654,7 @@

      Defined CRS

      L.CRS.Simple - A simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps). + A simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps). Note that the y axis should still be inverted (going from bottom to top). @@ -5598,7 +5679,7 @@

      Global Switches

      L_NO_TOUCH - Forces Leaflet to not use touch events even if it detects them. Particularly useful if you embed Leaflet inside a QT WebView (which exposes touch events even on desktop PCs). + Forces Leaflet to not use touch events even if it detects them. L_DISABLE_3D @@ -5622,4 +5703,4 @@

      L.version

      A constant that represents the Leaflet version in use.

      -

      L.version // returns "0.4" (or whatever version is currently in use)
      +
      L.version // returns "0.5" (or whatever version is currently in use)
      From 9cc33e2cf36b5473ca82724a45fed34e4e99632d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 17 Jan 2013 16:48:32 +0200 Subject: [PATCH 0329/2207] update download page and add 0.5 release post --- _posts/2013-01-17-leaflet-0-5-released.md | 24 +++++++++++++++++++++++ download.md | 14 ++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 _posts/2013-01-17-leaflet-0-5-released.md diff --git a/_posts/2013-01-17-leaflet-0-5-released.md b/_posts/2013-01-17-leaflet-0-5-released.md new file mode 100644 index 00000000000..c9630db2915 --- /dev/null +++ b/_posts/2013-01-17-leaflet-0-5-released.md @@ -0,0 +1,24 @@ +--- +layout: post +title: Leaflet 0.5 Released +description: Leaflet 0.5 released — with IE10 touch support, retina-enabled markers, better panning inertia, new zoom control and about a hundred of other improvements and bugfixes! +author: Vladimir Agafonkin +authorsite: http://agafonkin.com/en +--- + +Rejoice, everyone — after 4.5 months of development with [26 contributors involved](https://github.com/Leaflet/Leaflet/graphs/contributors?from=2012-08-30&to=2013-01-17&type=c) since the previous major release, I'm happy to announce the release of Leaflet 0.5 stable, hooray! + +0.5 highlights include IE10 touch devices and Metro apps support, retina-enabled markers, a much better panning inertia implementation, hand cursors for dragging and a new zoom control design. But the real power of this release comes with about a hundred of subtle improvements and bugfixes, improving usability, performance and overall "feel" of browsing the map even further. + +As always, you can find CDN links and downloads for the new release on the [download page](../../../download.html). + +The huge detailed list of changes is documented in the [changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). Be sure to read the "Breaking Changes" part of it before upgrading to avoid any issues! The [API reference](../../../reference.html) was updated to accomodate all the changes too. + +In other news, [Leaflet repository](https://github.com/Leaflet/Leaflet) has moved to [its own GitHub organization](https://github.com/Leaflet), along with the two of the most important plugins — [Leaflet.markercluster](https://github.com/Leaflet/Leaflet.markercluster) and [Leaflet.draw](https://github.com/Leaflet/Leaflet.draw). As some of you have noticed, this is one of the clues to a really nice upcoming announcement about Leaflet future — stay tuned. :) + +Thanks to everyone! It's absolutely breathtaking to see what the Leaflet community has achieved over the last months with all the contributions, amazing projects and demos, and I'm honestly proud to be a part of it. + +P.S. I also heard in a dream that everyone who tweets about the new Leaflet release will get an incredible luck boost for the next month. Sounds like true to me. + +Cheers,
      +Vladimir, Leaflet creator and maintainer. diff --git a/download.md b/download.md index 833ef96e348..baff1875dd5 100644 --- a/download.md +++ b/download.md @@ -13,12 +13,12 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.4.5 - Stable version, released on October 25, 2012 + Leaflet 0.5 + Stable version, released on January 17, 2013 - Leaflet 0.3.1 - Previous stable version, released on February 14, 2012 + Leaflet 0.4.5 + Previous stable version, released on October 25, 2012 Leaflet master @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source From 89ae70b32e8c9b9398c108dd6a02d061c955c0ce Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 17 Jan 2013 16:50:07 +0200 Subject: [PATCH 0330/2207] add link to 0.5 blog post --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 3afb1a666cc..0b8a9e1845d 100644 --- a/index.md +++ b/index.md @@ -2,7 +2,7 @@ layout: default --- - +

      January 17, 2013 — Leaflet 0.5 Released — Read More in the Blog

      Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. From 10305963288fa349e2cd660b8fe26910d040fe4a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 18 Jan 2013 12:29:19 +0200 Subject: [PATCH 0331/2207] index, features and plugin page updates --- features.html | 17 +++++++++-------- index.md | 2 +- plugins.md | 2 ++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/features.html b/features.html index f753579fba8..a96e467cdc1 100644 --- a/features.html +++ b/features.html @@ -44,10 +44,10 @@

      On Desktop Browsers

      -

      On Mobile Browsers (iOS, Android)

      +

      On Mobile Browsers

        -
      • Multi-touch zoom (iOS and Android 4+)
      • +
      • Multi-touch zoom (iOS, Android 4+, Win8)
      • Double tap zoom
      @@ -66,11 +66,12 @@

      For Layers

      Visual Features

        -
      • Zoom animation on modern browsers (except IE) (for all layers, including markers and vector layers)
      • +
      • Zoom animation (for all layers, including tile layers, markers and vector layers)
      • Panning animation
      • -
      • Smooth continuous zoom on iOS
      • +
      • Smooth continuous zoom on modern mobile devices
      • Tile and popup fade animation
      • Very nice default design for markers, popups and other map controls
      • +
      • Retina resolution support for tile layers and markers
      @@ -119,26 +120,26 @@

      On Desktop

    62. Firefox
    63. Safari 5+
    64. Opera 11.11+
    65. -
    66. IE 7–9
    67. +
    68. IE 7–10
    69. IE 6 (not perfect but accessible)
    70. On Mobile

        -
      • Safari for iOS 3/4/5+
      • +
      • Safari for iOS 3/4/5/6+
      • Android browser 2.2+, 3.1+, 4+
      • Chrome for Android 4+ and iOS
      • Firefox for Android
      • Other webkit-based browsers (webOS, Blackberry 7+, etc.)
      • -
      • IE for Windows Phone 7
      • +
      • IE10 for Win8-based devices

      Misc

        -
      • Extremely lightweight — around 26 KB of gzipped JS code
      • +
      • Extremely lightweight — around 28 KB of gzipped JS code
      • No external dependencies
      • Keeps your JS environment clean — no global or native prototypes pollution
      diff --git a/index.md b/index.md index 0b8a9e1845d..62545ef0a43 100644 --- a/index.md +++ b/index.md @@ -6,7 +6,7 @@ layout: default Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. -Weighing just about 27 KB of JS code, +Weighing just about 28 KB of JS code, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. diff --git a/plugins.md b/plugins.md index d071a4cee10..0878718a756 100644 --- a/plugins.md +++ b/plugins.md @@ -413,6 +413,8 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s +To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From 4e9490e71b1c08a77452ed5ea35e56284c71c6b4 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 4 Feb 2013 14:35:21 +0100 Subject: [PATCH 0342/2207] Add getWest/South/East/North to reference --- reference.html | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/reference.html b/reference.html index b45742080e3..a567dc32112 100644 --- a/reference.html +++ b/reference.html @@ -3131,6 +3131,26 @@

      Methods

      LatLng Returns the south-east point of the bounds. + + getWest() + Number + Returns the west longitude of the bounds. + + + getSouth() + Number + Returns the south latitude of the bounds. + + + getEast() + Number + Returns the east longitude of the bounds. + + + getNorth() + Number + Returns the north latitude of the bounds. + getCenter() LatLng From ae6c88dd1f616b9aff1f6df9c2434f611c7eb4ff Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 6 Feb 2013 15:12:49 +0200 Subject: [PATCH 0343/2207] add generated coverage to gitignore in stable --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b86ab6fc607..77024e967c3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ tmp/**/* *.sublime-* _site dist/*.js +spec/coverage From 0dcbed845ea82dd3fe832de92563f95edf37f074 Mon Sep 17 00:00:00 2001 From: danzel Date: Mon, 4 Feb 2013 09:51:27 +1300 Subject: [PATCH 0344/2207] Make setRadius and updateStyle({radius: 123 }) work. --- src/layer/vector/CircleMarker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/CircleMarker.js b/src/layer/vector/CircleMarker.js index f2a9e23e5c7..e1c8333ccb9 100644 --- a/src/layer/vector/CircleMarker.js +++ b/src/layer/vector/CircleMarker.js @@ -23,7 +23,7 @@ L.CircleMarker = L.Circle.extend({ }, setRadius: function (radius) { - this._radius = radius; + this.options.radius = this._radius = radius; return this.redraw(); } }); From 241cc7dc043c5bc35cce3904212920d60a933003 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 6 Feb 2013 15:21:29 +0200 Subject: [PATCH 0345/2207] backport the geojson featurecollection arrays fix --- src/layer/GeoJSON.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 0d618a75c94..0a154a7e1b0 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -15,13 +15,13 @@ L.GeoJSON = L.FeatureGroup.extend({ }, addData: function (geojson) { - var features = L.Util.isArray(geojson) ? geojson : geojson.features, + var features = L.Util.isArray(geojson) ? geojson : geojson.features, i, len; if (features) { for (i = 0, len = features.length; i < len; i++) { // Only add this if geometry or geometries are set and not null - if (features[i].geometries || features[i].geometry) { + if (features[i].geometries || features[i].geometry || features[i].features) { this.addData(features[i]); } } From c1d410f2703f0832618c997225e7360f6a292c58 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 6 Feb 2013 15:25:26 +0200 Subject: [PATCH 0346/2207] bump version to 0.5.1 and update build --- dist/leaflet-src.js | 6 +++--- dist/leaflet.js | 4 ++-- src/Leaflet.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index 2da1987dfa9..c5b4c6d8465 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -23,7 +23,7 @@ if (typeof exports !== undefined + '') { window.L = L; } -L.version = '0.5'; +L.version = '0.5.1'; /* @@ -5317,7 +5317,7 @@ L.CircleMarker = L.Circle.extend({ }, setRadius: function (radius) { - this._radius = radius; + this.options.radius = this._radius = radius; return this.redraw(); } }); @@ -5441,7 +5441,7 @@ L.GeoJSON = L.FeatureGroup.extend({ if (features) { for (i = 0, len = features.length; i < len; i++) { // Only add this if geometry or geometries are set and not null - if (features[i].geometries || features[i].geometry) { + if (features[i].geometries || features[i].geometry || features[i].features) { this.addData(features[i]); } } diff --git a/dist/leaflet.js b/dist/leaflet.js index fa82c839150..bdf0b69e213 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -2,7 +2,7 @@ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com (c) 2010-2013, Vladimir Agafonkin, CloudMade */ -(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.5",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n+"="+t[n]);return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h[t[a]]=h[t[a]]||[],h[t[a]].push({action:e,context:i||this});return this},hasEventListeners:function(t){return s in this&&t in this[s]&&this[s][t].length>0},removeEventListener:function(t,e,i){var o,a,r,h,l,u=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a]))for(h=u[t[a]],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;for(var i=n.extend({type:t,target:this},e),o=this[s][t].slice(),a=0,r=o.length;r>a;a++)o[a].action.call(o[a].context||this,i);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=navigator.userAgent.toLowerCase(),h=-1!==r.indexOf("webkit"),l=-1!==r.indexOf("chrome"),u=-1!==r.indexOf("android"),c=-1!==r.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,p="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,m=e.documentElement,f=o&&"transition"in m.style,g="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,v="MozPerspective"in m.style,y="OTransition"in m.style,L=!t.L_DISABLE_3D&&(f||g||v||y),P=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in m)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,webkit:h,android:u,android23:c,chrome:l,ie3d:f,webkit3d:g,gecko3d:v,opera3d:y,any3d:L,mobile:_,mobileWebkit:_&&h,mobileWebkit3d:_&&g,mobileOpera:_&&t.opera,touch:P,msTouch:d,retina:p}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,i){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):isNaN(t)?t:new n.Point(t,e,i)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||0,s+=r.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!h||(s+=a.scrollWidth-a.clientWidth,h&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):isNaN(t)?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this._northEast.lat,this._southWest.lng)},getSouthEast:function(){return new n.LatLng(this._southWest.lat,this._northEast.lng)},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){var t=this._southWest,e=this._northEast;return[t.lng,t.lat,e.lng,e.lat].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_updateZoomLevels:function(){var t,e=1/0,n=-1/0;for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var o=this._zoomBoundLayers[t];isNaN(o.options.minZoom)||(e=Math.min(e,o.options.minZoom)),isNaN(o.options.maxZoom)||(n=Math.max(n,o.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e)},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var _=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(_),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,_=1e-7,d=c,p=.1;Math.abs(p)>_&&--d>0;)e=h*Math.sin(u),p=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=p;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){n.DomUtil.setOpacity(this._container,this.options.opacity);var t,e=this._tiles;if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l);this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o) +(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.5.1",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n+"="+t[n]);return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h[t[a]]=h[t[a]]||[],h[t[a]].push({action:e,context:i||this});return this},hasEventListeners:function(t){return s in this&&t in this[s]&&this[s][t].length>0},removeEventListener:function(t,e,i){var o,a,r,h,l,u=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a]))for(h=u[t[a]],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;for(var i=n.extend({type:t,target:this},e),o=this[s][t].slice(),a=0,r=o.length;r>a;a++)o[a].action.call(o[a].context||this,i);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=navigator.userAgent.toLowerCase(),h=-1!==r.indexOf("webkit"),l=-1!==r.indexOf("chrome"),u=-1!==r.indexOf("android"),c=-1!==r.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,p="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,m=e.documentElement,f=o&&"transition"in m.style,g="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,v="MozPerspective"in m.style,y="OTransition"in m.style,L=!t.L_DISABLE_3D&&(f||g||v||y),P=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in m)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,webkit:h,android:u,android23:c,chrome:l,ie3d:f,webkit3d:g,gecko3d:v,opera3d:y,any3d:L,mobile:_,mobileWebkit:_&&h,mobileWebkit3d:_&&g,mobileOpera:_&&t.opera,touch:P,msTouch:d,retina:p}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,i){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):isNaN(t)?t:new n.Point(t,e,i)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||0,s+=r.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!h||(s+=a.scrollWidth-a.clientWidth,h&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):isNaN(t)?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this._northEast.lat,this._southWest.lng)},getSouthEast:function(){return new n.LatLng(this._southWest.lat,this._northEast.lng)},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){var t=this._southWest,e=this._northEast;return[t.lng,t.lat,e.lng,e.lat].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_updateZoomLevels:function(){var t,e=1/0,n=-1/0;for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var o=this._zoomBoundLayers[t];isNaN(o.options.minZoom)||(e=Math.min(e,o.options.minZoom)),isNaN(o.options.maxZoom)||(n=Math.max(n,o.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e)},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var _=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(_),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,_=1e-7,d=c,p=.1;Math.abs(p)>_&&--d>0;)e=h*Math.sin(u),p=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=p;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){n.DomUtil.setOpacity(this._container,this.options.opacity);var t,e=this._tiles;if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l);this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o) },_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return this._adjustTilePoint(t),n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:this._getZoomForUrl(),x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1)},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){this._adjustTilePoint(t);var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s=e.getElementsByTagName("script"),a=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=s.length;i>t;t++)if(n=s[t].src,o=n.match(a))return n.split(a)[0]+"/images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popup=new n.Popup(e,this).setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer=t.target,t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return(!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u]; -var _=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>_&&(o=_,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,_=[1,4,2,8],d=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=d._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=_[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)):(h._code&u&&(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1))},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),_=u/(e.inertiaDeceleration*r),d=c.multiplyBy(-_/2).round();n.Util.requestAnimFrame(function(){t.panBy(d,_,r)})}t.fire("dragend"),e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(p.push(t.pointerId),e=p.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=p.indexOf(t.pointerId);if(-1===e)return;p.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",_=this._touchstart,d=this._touchend,p=[];t[c+_+o]=s,t[c+d+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(_,s,!1),m.addEventListener(d,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Handler.PolyEdit=n.Handler.extend({options:{icon:new n.DivIcon({iconSize:new n.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"})},initialize:function(t,e){this._poly=t,n.setOptions(this,e)},addHooks:function(){this._poly._map&&(this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){this._poly._map&&(this._poly._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new n.LayerGroup),this._markers=[];var t,e,i,o,s=this._poly._latlngs;for(t=0,i=s.length;i>t;t++)o=this._createMarker(s[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var a,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||n.Polygon&&this._poly instanceof n.Polygon)&&(a=this._markers[e],r=this._markers[t],this._createMiddleMarker(a,r),this._updatePrevNext(a,r))},_createMarker:function(t,e){var i=new n.Marker(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("drag",this._onMarkerDrag,this),i.on("dragend",this._fireEdit,this),this._markerGroup.addLayer(i),i},_fireEdit:function(){this._poly.fire("edit")},_onMarkerDrag:function(t){var e=t.target;n.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw()},_onMarkerClick:function(t){if(!(3>this._poly._latlngs.length)){var e=t.target,i=e._index;this._markerGroup.removeLayer(e),this._markers.splice(i,1),this._poly.spliceLatLngs(i,1),this._updateIndexes(i,-1),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._poly.fire("edit")}},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,n=function(){var n=e._index;a._index=n,a.off("click",i).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._poly.spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e)},o=function(){a.off("dragstart",n,this),a.off("dragend",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){n.call(this),o.call(this),this._poly.fire("edit")},a.on("click",i,this).on("dragstart",n,this).on("dragend",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.latLngToLayerPoint(t.getLatLng()),o=i.latLngToLayerPoint(e.getLatLng());return i.layerPointToLatLng(n._add(o)._divideBy(2))}}),n.Polyline.addInitHook(function(){n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this +var _=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>_&&(o=_,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,_=[1,4,2,8],d=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=d._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=_[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)):(h._code&u&&(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1))},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry||o[e].features)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),_=u/(e.inertiaDeceleration*r),d=c.multiplyBy(-_/2).round();n.Util.requestAnimFrame(function(){t.panBy(d,_,r)})}t.fire("dragend"),e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(p.push(t.pointerId),e=p.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=p.indexOf(t.pointerId);if(-1===e)return;p.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",_=this._touchstart,d=this._touchend,p=[];t[c+_+o]=s,t[c+d+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(_,s,!1),m.addEventListener(d,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Handler.PolyEdit=n.Handler.extend({options:{icon:new n.DivIcon({iconSize:new n.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"})},initialize:function(t,e){this._poly=t,n.setOptions(this,e)},addHooks:function(){this._poly._map&&(this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){this._poly._map&&(this._poly._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new n.LayerGroup),this._markers=[];var t,e,i,o,s=this._poly._latlngs;for(t=0,i=s.length;i>t;t++)o=this._createMarker(s[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var a,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||n.Polygon&&this._poly instanceof n.Polygon)&&(a=this._markers[e],r=this._markers[t],this._createMiddleMarker(a,r),this._updatePrevNext(a,r))},_createMarker:function(t,e){var i=new n.Marker(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("drag",this._onMarkerDrag,this),i.on("dragend",this._fireEdit,this),this._markerGroup.addLayer(i),i},_fireEdit:function(){this._poly.fire("edit")},_onMarkerDrag:function(t){var e=t.target;n.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw()},_onMarkerClick:function(t){if(!(3>this._poly._latlngs.length)){var e=t.target,i=e._index;this._markerGroup.removeLayer(e),this._markers.splice(i,1),this._poly.spliceLatLngs(i,1),this._updateIndexes(i,-1),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._poly.fire("edit")}},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,n=function(){var n=e._index;a._index=n,a.off("click",i).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._poly.spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e)},o=function(){a.off("dragstart",n,this),a.off("dragend",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){n.call(this),o.call(this),this._poly.fire("edit")},a.on("click",i,this).on("dragstart",n,this).on("dragend",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.latLngToLayerPoint(t.getLatLng()),o=i.latLngToLayerPoint(e.getLatLng());return i.layerPointToLatLng(n._add(o)._divideBy(2))}}),n.Polyline.addInitHook(function(){n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this },addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i="leaflet-bar",o=i+"-part",s=n.DomUtil.create("div",e+" "+i);return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in "+o+" "+o+"-top",s,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out "+o+" "+o+"-bottom",s,this._zoomOut,this),t.on("zoomend",this._updateDisabled,this),s},onRemove:function(t){t.off("zoomend",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-control-zoom-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay||(n=i.layer)):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var o=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,o,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); \ No newline at end of file diff --git a/src/Leaflet.js b/src/Leaflet.js index 02889ee21df..eee635de765 100644 --- a/src/Leaflet.js +++ b/src/Leaflet.js @@ -19,4 +19,4 @@ if (typeof exports !== undefined + '') { window.L = L; } -L.version = '0.5'; +L.version = '0.5.1'; From d80551d1dc686552304bb9cb290a2f4ce083f939 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 6 Feb 2013 16:03:22 +0200 Subject: [PATCH 0347/2207] update links to 0.5.1 --- download.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/download.md b/download.md index baff1875dd5..9fe078d6a59 100644 --- a/download.md +++ b/download.md @@ -13,12 +13,12 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.5 - Stable version, released on January 17, 2013 + Leaflet 0.5.1 + Stable version, released on January 17, 2013 and last updated on February 6, 2013 Leaflet 0.4.5 - Previous stable version, released on October 25, 2012 + Previous stable version, released on July 30, 2012 and last updated on October 25, 2012 Leaflet master @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source From 30ab98e3ae7c5cab9428a375e94a71f9267cf816 Mon Sep 17 00:00:00 2001 From: Mattias Bengtsson Date: Fri, 15 Feb 2013 01:27:28 +0100 Subject: [PATCH 0348/2207] Document the zoomlevelschange event --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index bc92f0be3fe..45441be91db 100644 --- a/reference.html +++ b/reference.html @@ -509,6 +509,11 @@

      Events

      Event Fired when the map zoom changes. + + zoomlevelschange + Event + Fired when the number of zoomlevels on the map is changed due to adding or removing a layer. + autopanstart Event From 2f6b6d79bab778a19d819ada27d3617aa46af0ce Mon Sep 17 00:00:00 2001 From: Mattias Bengtsson Date: Fri, 15 Feb 2013 01:34:29 +0100 Subject: [PATCH 0349/2207] Add some missing (but not strictly mandatory) 's --- reference.html | 146 ++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/reference.html b/reference.html index 45441be91db..41af9619681 100644 --- a/reference.html +++ b/reference.html @@ -406,152 +406,152 @@

      Events

      click - MouseEvent + MouseEvent Fired when the user clicks (or taps) the map. dblclick - MouseEvent + MouseEvent Fired when the user double-clicks (or double-taps) the map. mousedown - MouseEvent + MouseEvent Fired when the user pushes the mouse button on the map. mouseup - MouseEvent + MouseEvent Fired when the user pushes the mouse button on the map. mouseover - MouseEvent + MouseEvent Fired when the mouse enters the map. mouseout - MouseEvent + MouseEvent Fired when the mouse leaves the map. mousemove - MouseEvent + MouseEvent Fired while the mouse moves over the map. contextmenu - MouseEvent + MouseEvent Fired when the user pushes the right mouse button on the map, prevents default browser context menu from showing if there are listeners on this event. focus - Event + Event Fired when the user focuses the map either by tabbing to it or clicking/panning. blur - Event + Event Fired when the map looses focus. preclick - MouseEvent + MouseEvent Fired before mouse click on the map (sometimes useful when you want something to happen on click before any existing click handlers start running). load - Event + Event Fired when the map is initialized (when its center and zoom are set for the first time). viewreset - Event + Event Fired when the map needs to redraw its content (this usually happens on map zoom or load). Very useful for creating custom overlays. movestart - Event + Event Fired when the view of the map starts changing (e.g. user starts dragging the map). move - Event + Event Fired on any movement of the map view. moveend - Event + Event Fired when the view of the map ends changed (e.g. user stopped dragging the map). dragstart - Event + Event Fired when the user starts dragging the map. drag - Event + Event Fired repeatedly while the user drags the map. dragend - Event + Event Fired when the user stops dragging the map. zoomstart - Event + Event Fired when the map zoom is about to change (e.g. before zoom animation). zoomend - Event + Event Fired when the map zoom changes. zoomlevelschange - Event + Event Fired when the number of zoomlevels on the map is changed due to adding or removing a layer. autopanstart - Event + Event Fired when the map starts autopanning when opening a popup. layeradd - LayerEvent + LayerEvent Fired when a new layer is added to the map. layerremove - LayerEvent + LayerEvent Fired when some layer is removed from the map. baselayerchange - LayerEvent + LayerEvent Fired when the base layer is changed through the layer control. locationfound - LocationEvent + LocationEvent Fired when geolocation (using locate method) went successfully. locationerror - ErrorEvent + ErrorEvent Fired when geolocation (using locate method) failed. popupopen - PopupEvent + PopupEvent Fired when a popup is opened (using openPopup method). popupclose - PopupEvent + PopupEvent Fired when a popup is closed (using closePopup method). @@ -1141,52 +1141,52 @@

      Events

      click - MouseEvent + MouseEvent Fired when the user clicks (or taps) the marker. dblclick - MouseEvent + MouseEvent Fired when the user double-clicks (or double-taps) the marker. mousedown - MouseEvent + MouseEvent Fired when the user pushes the mouse button on the marker. mouseover - MouseEvent + MouseEvent Fired when the mouse enters the marker. mouseout - MouseEvent + MouseEvent Fired when the mouse leaves the marker. dragstart - Event + Event Fired when the user starts dragging the marker. drag - Event + Event Fired repeatedly while the user drags the marker. dragend - Event + Event Fired when the user stops dragging the marker. move - Event + Event Fired when the marker is moved via setLatLng. New coordinate include in event arguments. remove - Event + Event Fired when the marker is removed from the map. @@ -1604,22 +1604,22 @@

      Events

      loading - Event + Event Fired when the tile layer starts loading tiles. load - Event + Event Fired when the tile layer loaded all visible tiles. tileload - Event + Event Fired when a tile loads. tileunload - Event + Event Fired when a tile is removed (e.g. when you have unloadInvisibleTiles on). @@ -2004,37 +2004,37 @@

      Events

      click - MouseEvent + MouseEvent Fired when the user clicks (or taps) the object. dblclick - MouseEvent + MouseEvent Fired when the user double-clicks (or double-taps) the object. mousedown - MouseEvent + MouseEvent Fired when the user pushes the mouse button on the object. mouseover - MouseEvent + MouseEvent Fired when the mouse enters the object. mouseout - MouseEvent + MouseEvent Fired when the mouse leaves the object. contextmenu - MouseEvent + MouseEvent Fired when the user pushes the right mouse button on the object, prevents default browser context menu from showing if there are listeners on this event. remove - Event + Event Fired when the path is removed from the map. @@ -2697,32 +2697,32 @@

      Events

      click - MouseEvent + MouseEvent Fired when the user clicks (or taps) the group. dblclick - MouseEvent + MouseEvent Fired when the user double-clicks (or double-taps) the group. mouseover - MouseEvent + MouseEvent Fired when the mouse enters the group. mouseout - MouseEvent + MouseEvent Fired when the mouse leaves the group. mousemove - MouseEvent + MouseEvent Fired while the mouse moves over the layers of the group. contextmenu - MouseEvent + MouseEvent Fired when the user right-clicks on one of the layers. @@ -3327,12 +3327,12 @@

      Properties

      min - Point + Point The top left corner of the rectangle. max - Point + Point The bottom right corner of the rectangle. @@ -3454,12 +3454,12 @@

      Options

      iconSize - Point + Point Size of the icon image in pixels. iconAnchor - Point + Point The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location. Centered by default if size is specified, also can be set in CSS with negative margins. @@ -3474,17 +3474,17 @@

      Options

      shadowSize - Point + Point Size of the shadow image in pixels. shadowAnchor - Point + Point The coordinates of the "tip" of the shadow (relative to its top left corner) (the same as iconAnchor if not specified). popupAnchor - Point + Point The coordinates of the point from which popups will "open", relative to the icon anchor. @@ -3538,12 +3538,12 @@

      Options

      iconSize - Point + Point Size of the icon in pixels. Can be also set through CSS. iconAnchor - Point + Point The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location. Centered by default if size is specified, also can be set in CSS with negative margins. @@ -5092,17 +5092,17 @@

      Events

      start - Event + Event Fired when the animation starts. step - Event + Event Fired continuously during the animation. end - Event + Event Fired when the animation ends. @@ -5181,22 +5181,22 @@

      Events

      dragstart - Event + Event Fired when the dragging starts. predrag - Event + Event Fired continuously during dragging before each corresponding update of the element position. drag - Event + Event Fired continuously during dragging. dragend - Event + Event Fired when the dragging ends. From 331b8bbab40ae51456fc2005d753eee80bf1c5bb Mon Sep 17 00:00:00 2001 From: jacobtoye Date: Fri, 15 Feb 2013 16:24:49 +1300 Subject: [PATCH 0350/2207] Adding initial draw for Leaflet.draw blog post. --- _posts/2013-02-00-guest-post-draw.md | 123 +++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 _posts/2013-02-00-guest-post-draw.md diff --git a/_posts/2013-02-00-guest-post-draw.md b/_posts/2013-02-00-guest-post-draw.md new file mode 100644 index 00000000000..599f38218b6 --- /dev/null +++ b/_posts/2013-02-00-guest-post-draw.md @@ -0,0 +1,123 @@ +--- +layout: post +title: Leaflet.draw 0.2 released +description: Leaflet.draw 0.2 released — brings vector drawing and editing tools to your Leaflet map. +author: Jacob Toye +authorsite: https://github.com/jacobtoye/ +--- + +Leaflet.draw was born from the need to provide users with the ability draw polygons on the map. Leaflet already provided a very nice way of editing existing polylines and polygons. The logical next step was to expand on this functionality to allow the creation of these layers, and ultimately the other vector layers. + +Upon release the immediate response from the Leaflet community was very positive. It became clear that progressing this tool to a state where users could edit and delete, as well as create. This is ultimately what Leaflet.draw 0.2 set out to do. + +After a few months of off and on development, with most of this spare time kindy sponsored by my employer Smartrak, we proudly present Leaflet.draw 0.2 your one stop plugin for drawing, editing and deleting vectors and markers on Leaflet maps :) + +
      + +### Features + +Leaflet.draw is designed to not only be easy for end users to use, but also for developers to integrate. + + * Easily draw shapes on your map with easy to use tools all specifically designed for the particular shape. + * Super ccustomizable: + * Customize the styles of each shape to fit in with your maps theme. + * Pick and choose the which tools you want to use. + * Roll your own by simply using the drawing and editing handlers. + * Event based system allows you to perform any necessary actions when shapes are created, edited or deleted. + +### How to use + +Leaflet.draw is very simple to drop into you Leaflet application. The following example will add both the draw and edit toolbars to a map: + +// create a map in the "map" div, set the view to a given place and zoom +var map = L.map('map').setView([51.505, -0.09], 13); + +// add an OpenStreetMap tile layer +L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' +}).addTo(map); + +// Initialize the FeatureGroup to store editable layers +var drawnItems = new L.FeatureGroup(); +map.addLayer(drawnItems); + +// Initialize the draw control and pass it the FeatureGroup of editable layers +var drawControl = new L.Control.Draw({ + edit: { + featureGroup: drawnItems + } +}); +map.addControl(drawControl); + +#### Handling newly created layers + +Once you have successfully added the Leaflet.draw plugin your map you will want to respond to the different actions users can trigger. + +map.on('draw:created', function (e) { + var type = e.layerType, + layer = e.layer; + + if (type === 'marker') { + // Do marker specific actions + } + + // Do whatever else you need to. (save to db, add to map etc) + drawnItems.addLayer(layer); +}); + +map.on('draw:edited', function () { + // Update db to save latest changes. +}); + +map.on('draw:deleted', function () { + // Update db to save latest changes. +}); + +See the Leaflet.draw README for more details on how to configure the plugin. + +### Thanks + +First and foremost I would like to thank my employer Smartrak, without their positive attitude to open source software I would not have had the time to complete this plugin. + +The Leaflet developer community have been great in support this plugin through inspiration, pull requests and issue reports. Special thanks to: @mourner, @danzel, @brunob, @tnightingale, and @shramov. + +I really look forward to the future of Leaflet. It already is the best JavaScript mapping library around, and with such a great developer community support it's bound to be an amazing journey! + + + + + + \ No newline at end of file From f664da6ebcd9acb2f7c166092fcc32ccd529ae00 Mon Sep 17 00:00:00 2001 From: Jeremy Iglehart Date: Fri, 15 Feb 2013 15:44:10 -0500 Subject: [PATCH 0351/2207] Fixed typo reference.html contructor = constructor "If specify your own **contructor** for the control" "If specify your own ***constructor*** for the control" --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index a567dc32112..cf2c7eff4c6 100644 --- a/reference.html +++ b/reference.html @@ -5494,7 +5494,7 @@

      Custom Control Example

      map.addControl(new MyControl());
      -

      If specify your own contructor for the control, you'll also probably want to process options properly:

      +

      If specify your own constructor for the control, you'll also probably want to process options properly:

      var MyControl = L.Control.extend({
       	initialize: function (foo, options) {
      
      From 074224656d60914ed35eff1c016933e1ab33ef18 Mon Sep 17 00:00:00 2001
      From: jacobtoye 
      Date: Mon, 18 Feb 2013 15:34:03 +1300
      Subject: [PATCH 0352/2207] Rename Leaflet.draw guest post and update content.
      
      ---
       _posts/2013-02-00-guest-post-draw.md | 123 -------------------------
       _posts/2013-02-15-guest-post-draw.md | 131 +++++++++++++++++++++++++++
       2 files changed, 131 insertions(+), 123 deletions(-)
       delete mode 100644 _posts/2013-02-00-guest-post-draw.md
       create mode 100644 _posts/2013-02-15-guest-post-draw.md
      
      diff --git a/_posts/2013-02-00-guest-post-draw.md b/_posts/2013-02-00-guest-post-draw.md
      deleted file mode 100644
      index 599f38218b6..00000000000
      --- a/_posts/2013-02-00-guest-post-draw.md
      +++ /dev/null
      @@ -1,123 +0,0 @@
      ----
      -layout: post
      -title: Leaflet.draw 0.2 released
      -description: Leaflet.draw 0.2 released — brings vector drawing and editing tools to your Leaflet map.
      -author: Jacob Toye
      -authorsite: https://github.com/jacobtoye/
      ----
      -
      -Leaflet.draw was born from the need to provide users with the ability draw polygons on the map. Leaflet already provided a very nice way of editing existing polylines and polygons. The logical next step was to expand on this functionality to allow the creation of these layers, and ultimately the other vector layers.
      -
      -Upon release the immediate response from the Leaflet community was very positive. It became clear that progressing this tool to a state where users could edit and delete, as well as create. This is ultimately what Leaflet.draw 0.2 set out to do.
      -
      -After a few months of off and on development, with most of this spare time kindy sponsored by my employer Smartrak, we proudly present Leaflet.draw 0.2 your one stop plugin for drawing, editing and deleting vectors and markers on Leaflet maps :)
      -
      -
      - -### Features - -Leaflet.draw is designed to not only be easy for end users to use, but also for developers to integrate. - - * Easily draw shapes on your map with easy to use tools all specifically designed for the particular shape. - * Super ccustomizable: - * Customize the styles of each shape to fit in with your maps theme. - * Pick and choose the which tools you want to use. - * Roll your own by simply using the drawing and editing handlers. - * Event based system allows you to perform any necessary actions when shapes are created, edited or deleted. - -### How to use - -Leaflet.draw is very simple to drop into you Leaflet application. The following example will add both the draw and edit toolbars to a map: - -// create a map in the "map" div, set the view to a given place and zoom -var map = L.map('map').setView([51.505, -0.09], 13); - -// add an OpenStreetMap tile layer -L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors' -}).addTo(map); - -// Initialize the FeatureGroup to store editable layers -var drawnItems = new L.FeatureGroup(); -map.addLayer(drawnItems); - -// Initialize the draw control and pass it the FeatureGroup of editable layers -var drawControl = new L.Control.Draw({ - edit: { - featureGroup: drawnItems - } -}); -map.addControl(drawControl); - -#### Handling newly created layers - -Once you have successfully added the Leaflet.draw plugin your map you will want to respond to the different actions users can trigger. - -map.on('draw:created', function (e) { - var type = e.layerType, - layer = e.layer; - - if (type === 'marker') { - // Do marker specific actions - } - - // Do whatever else you need to. (save to db, add to map etc) - drawnItems.addLayer(layer); -}); - -map.on('draw:edited', function () { - // Update db to save latest changes. -}); - -map.on('draw:deleted', function () { - // Update db to save latest changes. -}); - -See the Leaflet.draw README for more details on how to configure the plugin. - -### Thanks - -First and foremost I would like to thank my employer Smartrak, without their positive attitude to open source software I would not have had the time to complete this plugin. - -The Leaflet developer community have been great in support this plugin through inspiration, pull requests and issue reports. Special thanks to: @mourner, @danzel, @brunob, @tnightingale, and @shramov. - -I really look forward to the future of Leaflet. It already is the best JavaScript mapping library around, and with such a great developer community support it's bound to be an amazing journey! - - - - - - \ No newline at end of file diff --git a/_posts/2013-02-15-guest-post-draw.md b/_posts/2013-02-15-guest-post-draw.md new file mode 100644 index 00000000000..7828103a137 --- /dev/null +++ b/_posts/2013-02-15-guest-post-draw.md @@ -0,0 +1,131 @@ +--- +layout: post +title: Leaflet.draw 0.2 released +description: Leaflet.draw 0.2 released — brings vector drawing and editing tools to your Leaflet map. +author: Jacob Toye +authorsite: https://github.com/jacobtoye/ +--- + +Leaflet.draw was born from the need to provide users with the ability draw polygons on the map. Leaflet already provided a very nice way of editing existing polylines and polygons. The logical next step was to expand on this functionality to allow the creation of these layers, and ultimately the other vector layers. + +Upon release the immediate response from the Leaflet community was very positive. It became clear that progressing this tool to a state where users could edit and delete, as well as create. This is ultimately what Leaflet.draw 0.2 set out to do. + +After a few months of off and on development, with most of this spare time kindy sponsored by my employer Smartrak, we proudly present Leaflet.draw 0.2 your one stop plugin for drawing, editing and deleting vectors and markers on Leaflet maps :) + +You can download the latest version from the github repo. Any bugs you come across please report them on the issues page. + +
      + +{:#plugin-features} +### Features + +Leaflet.draw is designed to not only be easy for end users to use, but also for developers to integrate. + + * Draw shapes on your map with easy to use drawing tools. + * Edit and delete vectors and markers. + * Super ccustomizable: + * Customize the styles of each shape to fit in with your maps theme. + * Pick and choose the which tools you want to use. + * Roll your own by simply using the drawing and editing handlers. + * Event based system allows you to perform any necessary actions when shapes are created, edited or deleted. + +### How to use + +Leaflet.draw is very simple to drop into you Leaflet application. The following example will add both the draw and edit toolbars to a map: + + // create a map in the "map" div, set the view to a given place and zoom + var map = L.map('map').setView([175.30867, -37.77914], 13); + + // add an OpenStreetMap tile layer + L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(map); + + // Initialize the FeatureGroup to store editable layers + var drawnItems = new L.FeatureGroup(); + map.addLayer(drawnItems); + + // Initialize the draw control and pass it the FeatureGroup of editable layers + var drawControl = new L.Control.Draw({ + edit: { + featureGroup: drawnItems + } + }); + map.addControl(drawControl); + +#### Handling newly created layers + +Once you have successfully added the Leaflet.draw plugin your map you will want to respond to the different actions users can trigger. + + map.on('draw:created', function (e) { + var type = e.layerType, + layer = e.layer; + + if (type === 'marker') { + // Do marker specific actions + } + + // Do whatever else you need to. (save to db, add to map etc) + drawnItems.addLayer(layer); + }); + + map.on('draw:edited', function () { + // Update db to save latest changes. + }); + + map.on('draw:deleted', function () { + // Update db to save latest changes. + }); + +See the Leaflet.draw README for more details on how to configure the plugin. + +### Thanks + +First and foremost I would like to thank my employer Smartrak, without their positive attitude to open source software I would not have had the time to complete this plugin. + +The Leaflet developer community have been great in support this plugin through inspiration, pull requests and issue reports. Special thanks to: @mourner, @danzel, @brunob, @tnightingale, and @shramov. + +### Closing + +I've had a great time implementing this plugin. I hope you enjoy using it. If you have a question or just want to say hi, send me an email at jacob.toye@gmail.com. + +Cheers, +Jacob Toye + + + + + + \ No newline at end of file From c436dbb54e02f3973c87556c970bf94a189e176a Mon Sep 17 00:00:00 2001 From: jacobtoye Date: Mon, 18 Feb 2013 15:34:47 +1300 Subject: [PATCH 0353/2207] Add in Leaflet.draw file for testing. [TEMP] --- dist/images/spritesheet.png | Bin 0 -> 2777 bytes dist/leaflet.draw.css | 217 ++++++++++++++++++++++++++++++++++++ dist/leaflet.draw.ie.css | 44 ++++++++ 3 files changed, 261 insertions(+) create mode 100644 dist/images/spritesheet.png create mode 100644 dist/leaflet.draw.css create mode 100644 dist/leaflet.draw.ie.css diff --git a/dist/images/spritesheet.png b/dist/images/spritesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..168c31e6b39b4975c121edb2d2e0975bafa7d4ac GIT binary patch literal 2777 zcmbVOdpJ~iAD^NNk|KqQX~-hXoG}K&l*yUd8H~#yV#$~}7>pS+2SZP_pn*mlN3p@#jLw~(6 z2%Cr-Ok#nwuUyEAj0uHdAqk6(jg2*rwJ;ZmLa>01jm?4%Jl+hEFcZf`!fc6Iq*#AZ z0|<#ZBAyWD2_n%88reaDXqb#aEdAmFU&v&BQyeM&8Ym=WSP5H*1=FBLvj`Ikfg99KmjM34@JTZkc>gz zm~(kt5(OX~E5I#O01L#S z0wLPL!xHVyi{uJo#S6*#;wuP=crg%{CKB+`pQB6S{S7+>|G&Kcg5~}{5yK+JU>8c` zze;6s3#q?_>9@j17T;P2ibVQFgfzys?q(MhYJ~~|q6ua))3n!OX6RmBh>t;?*&OO$=L8H+O zmM2aP1P+=7;!e_6E!RkG48#Chs|?i>8^NH3E!s$9t6#(W`YooW&bnEdnP&kBn%KrU zbLV+HWB%uv*j;SUk;&Xw*f9zpP7Sc@Ka=>>wzdX)U$tE8p_FYqqflOR zexX>_e{Egfc6wf!$J>kS}6BwR=c(}DMF)`8q{qI|Un>JpliIbOB9b{ut zR_P42I%Y>y`d%n?cXyXx;dL5hH5;g^sxs>8>R7I>YHLk2ZofNXs1Bbw*#Gi!a9if| zYBe<{1qFq|td&0mu91nhe3$(r5Ej0rVr^<`@EgmX9Yyu^J2b%ShV~V;YkZ$2EK@18 zjeXTLUOa8)dxie7eCc2C!w04bU`I!XVB3Qi6r+yS{!5a3nYZ`7f6X=}z5&r|dXi_s zlJ;~=_DJ-|#j2--si`Sri{MtRXg#Tc%G&bFm$ObAdld$>fKgFVkIdE|A?$q@@nY`7 zn>>Gif5yEWU0q$5Q@<*)^d;5RGMOwI0Dwx5^9`{=n@!RgV&r2j=5B>0R}_dDkFW5u z{E}G5IDOe;GEeo!23b!^LvK}hJvr{rp$)WS^zGUd?k`41+cH)ZlZ~@gP^4Qs+RBMG*Zo-!ht;n?vs0 zxl=XyYMZGk?BP}&_3SYG>T&hi?CfeRDiV`C1I`-Ul?bc+7gy1-337dpbroH#R!VXUZ+8=bxL6mY0whcbrnEkN`qZ+s*!2VkgV_&^72<7e{mhDKvXa8W!jkgx2}9^RQC-e9Z^vtb zf%Wl@rFHqHarq>DvWoiJn3uiL%R9yn=2zohSFlo0v+>>)3Jt4YVxrHj`0xYyzWu|K zNnHYyKcDXzKXoMZp{@z|M}GHFXe26Zt^yqEuZb0GHd#_#zxB_C?#$kb3%*rj z5di`HGqel2(%e$3gSF`sp2I@xwAcPWxsNUDy0O6v47u@ZQ&E}_(;+Y!+5OH=Mcr7d zwY~k*%Io<(v*`G$L&`GgX4@F$*$Me^AxHZsX>x`xIo|P-$A^iSy`^P)x|qe15fAB; zHwqo&%h+`-&yzhXyB<97emPKI&)VW{&{tfUIlQ*IYa$ekE3Ml_wU!wb1=R1~r&2ek zeT;s4tn2)NonaLRR%RxU13E7K53yBL+5!so|XF_n|Gqd zJvPrjX-vEYCxqOLcaPiT-4uT^NU`bJ^3;zF)=BdI?`L>=p}I-50;sQ(n;*q5enF*Q z)6dJx!x!l2=&;faWoby)5Wtf2je+;hj;7WM2^DR@HMWBO+JV)ZtY4c$IEDLyZkx#j zdyI@diZaq<#sq|ikLT{M-=XAQtyXkA{8pM~TTcdd>a?^tkv6BXrM6QvHF&Gd($Z4O ze{{93K6<>{SH89Egk%-q<>h6&apT4TCB>yv90>VfmX8e%4!XYn)o;kxDx&A!qrN`= zK|RLyGp=&!%;dm{AP#5Ne9!NjielU14+wiBlAewH_~Gqn=j^M#nhnYH>Dj-g$H_+6 zy}~n?U~JOGK30l-?xDa9B2#r`3viTT$~^Jz;fmFVX7|xXIy03r!CLKS+BsR~ zG6T7ysiQz6&vyk-v6~>v|8CG|t#M(2c>hO1hL*=_>>p>`=bD3qoTFdsy#utIk#i^Y lW*| Date: Mon, 18 Feb 2013 15:43:04 +1300 Subject: [PATCH 0354/2207] Update Leaflet to master for testing [TEMP] --- dist/leaflet-src.js | 582 +++++++++++++++++++------------------------- dist/leaflet.css | 84 +++---- dist/leaflet.ie.css | 6 - dist/leaflet.js | 8 +- 4 files changed, 288 insertions(+), 392 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index c5b4c6d8465..c707e942053 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -23,7 +23,7 @@ if (typeof exports !== undefined + '') { window.L = L; } -L.version = '0.5.1'; +L.version = '0.6-dev'; /* @@ -109,7 +109,7 @@ L.Util = { var params = []; for (var i in obj) { if (obj.hasOwnProperty(i)) { - params.push(i + '=' + obj[i]); + params.push(encodeURIComponent(i) + '=' + encodeURIComponent(obj[i])); } } return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); @@ -253,6 +253,7 @@ L.Class.extend = function (props) { proto._initHooks = []; var parent = this; + NewClass.__super__ = parent.prototype; // add method for calling all hooks proto.callInitHooks = function () { @@ -307,10 +308,12 @@ L.Mixin = {}; L.Mixin.Events = { addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) + var events = this[key] = this[key] || {}, - type, i, len; + type, i, len, evt, + contextId, objKey, objLenKey, eventsObj; - // Types can be a map of types/handlers + // types can be a map of types/handlers if (typeof types === 'object') { for (type in types) { if (types.hasOwnProperty(type)) { @@ -321,26 +324,50 @@ L.Mixin.Events = { return this; } + // types can be a string of space-separated words types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { - events[types[i]] = events[types[i]] || []; - events[types[i]].push({ + evt = { action: fn, context: context || this - }); + }; + contextId = context && context._leaflet_id; + + if (contextId) { + // store listeners of a particular context in a separate hash (if it has an id) + // gives a major performance boost when removing thousands of map layers + + objKey = types[i] + '_idx', + objLenKey = objKey + '_len', + eventsObj = events[objKey] = events[objKey] || {}; + + if (eventsObj[contextId]) { + eventsObj[contextId].push(evt); + } else { + eventsObj[contextId] = [evt]; + events[objLenKey] = (events[objLenKey] || 0) + 1; + } + + } else { + events[types[i]] = events[types[i]] || []; + events[types[i]].push(evt); + } } return this; }, hasEventListeners: function (type) { // (String) -> Boolean - return (key in this) && (type in this[key]) && (this[key][type].length > 0); + return (key in this) && + (((type in this[key]) && this[key][type].length > 0) || + (this[key][type + '_idx_len'] > 0)); }, removeEventListener: function (types, fn, context) { // (String[, Function, Object]) or (Object[, Object]) var events = this[key], - type, i, len, listeners, j; + type, i, len, listeners, j, + contextId, objKey, objLenKey; if (typeof types === 'object') { for (type in types) { @@ -348,25 +375,35 @@ L.Mixin.Events = { this.removeEventListener(type, types[type], fn); } } - return this; } types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { - if (this.hasEventListeners(types[i])) { - listeners = events[types[i]]; + + // if the context has an id, use it to find the listeners + contextId = context && context._leaflet_id; + objKey = types[i] + '_idx'; + + if (contextId && events[objKey]) { + listeners = events[objKey][contextId] || []; + } else { + listeners = events[types[i]] || []; + } for (j = listeners.length - 1; j >= 0; j--) { - if ( - (!fn || listeners[j].action === fn) && - (!context || (listeners[j].context === context)) - ) { + if ((!fn || listeners[j].action === fn) && (!context || (listeners[j].context === context))) { listeners.splice(j, 1); } } + + if (contextId && listeners.length === 0) { + objLenKey = objKey + '_len'; + delete events[objKey][contextId]; + events[objLenKey] = (events[objLenKey] || 1) - 1; + } } } @@ -378,15 +415,36 @@ L.Mixin.Events = { return this; } - var event = L.extend({ + var event = L.Util.extend({ type: type, target: this }, data); - var listeners = this[key][type].slice(); + var listeners, i, len, eventsObj, contextId; + + if (this[key][type]) { + listeners = this[key][type].slice(); + + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].action.call(listeners[i].context || this, event); + } + } + + // fire event for the context-indexed listeners as well + + eventsObj = this[key][type + '_idx']; - for (var i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); + if (eventsObj) { + for (contextId in eventsObj) { + if (eventsObj.hasOwnProperty(contextId)) { + listeners = eventsObj[contextId]; + if (listeners) { + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].action.call(listeners[i].context || this, event); + } + } + } + } } return this; @@ -407,6 +465,7 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; var ie = !!window.ActiveXObject, ie6 = ie && !window.XMLHttpRequest, ie7 = ie && !document.querySelector, + ielt9 = ie && !document.addEventListener, // terrible browser detection to work around Safari / iOS / Android browser bugs ua = navigator.userAgent.toLowerCase(), @@ -463,6 +522,7 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; ie: ie, ie6: ie6, ie7: ie7, + ielt9: ielt9, webkit: webkit, android: android, @@ -595,7 +655,7 @@ L.point = function (x, y, round) { if (L.Util.isArray(x)) { return new L.Point(x[0], x[1]); } - if (isNaN(x)) { + if (x === undefined || x === null) { return x; } return new L.Point(x, y, round); @@ -763,6 +823,7 @@ L.DomUtil = { left = 0, el = element, docBody = document.body, + docEl = document.documentElement, pos, ie7 = L.Browser.ie7; @@ -779,8 +840,8 @@ L.DomUtil = { if (el.offsetParent === docBody && pos === 'absolute') { break; } if (pos === 'fixed') { - top += docBody.scrollTop || 0; - left += docBody.scrollLeft || 0; + top += docBody.scrollTop || docEl.scrollTop || 0; + left += docBody.scrollLeft || docEl.scrollLeft || 0; break; } el = el.offsetParent; @@ -1050,7 +1111,7 @@ L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Numbe if (L.Util.isArray(a)) { return new L.LatLng(a[0], a[1]); } - if (isNaN(a)) { + if (a === undefined || a === null) { return a; } return new L.LatLng(a, b); @@ -1126,11 +1187,27 @@ L.LatLngBounds.prototype = { }, getNorthWest: function () { - return new L.LatLng(this._northEast.lat, this._southWest.lng); + return new L.LatLng(this.getNorth(), this.getWest()); }, getSouthEast: function () { - return new L.LatLng(this._southWest.lat, this._northEast.lng); + return new L.LatLng(this.getSouth(), this.getEast()); + }, + + getWest: function () { + return this._southWest.lng; + }, + + getSouth: function () { + return this._southWest.lat; + }, + + getEast: function () { + return this._northEast.lng; + }, + + getNorth: function () { + return this._northEast.lat; }, contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean @@ -1170,10 +1247,7 @@ L.LatLngBounds.prototype = { }, toBBoxString: function () { - var sw = this._southWest, - ne = this._northEast; - - return [sw.lng, sw.lat, ne.lng, ne.lat].join(','); + return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); }, equals: function (bounds) { // (LatLngBounds) @@ -1523,6 +1597,8 @@ L.Map = L.Class.extend({ }, hasLayer: function (layer) { + if (!layer) { return false; } + var id = L.stamp(layer); return this._layers.hasOwnProperty(id); }, @@ -1540,15 +1616,17 @@ L.Map = L.Class.extend({ var offset = oldSize._subtract(this.getSize())._divideBy(2)._round(); - if (animate === true) { - this.panBy(offset); - } else { - this._rawPanBy(offset); + if ((offset.x !== 0) || (offset.y !== 0)) { + if (animate === true) { + this.panBy(offset); + } else { + this._rawPanBy(offset); - this.fire('move'); + this.fire('move'); - clearTimeout(this._sizeTimer); - this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); + } } return this; }, @@ -1859,10 +1937,15 @@ L.Map = L.Class.extend({ L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); }, + _getZoomSpan: function () { + return this.getMaxZoom() - this.getMinZoom(); + }, + _updateZoomLevels: function () { var i, minZoom = Infinity, - maxZoom = -Infinity; + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); for (i in this._zoomBoundLayers) { if (this._zoomBoundLayers.hasOwnProperty(i)) { @@ -1882,6 +1965,10 @@ L.Map = L.Class.extend({ this._layersMaxZoom = maxZoom; this._layersMinZoom = minZoom; } + + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire("zoomlevelschange"); + } }, // map events @@ -2270,12 +2357,20 @@ L.TileLayer = L.Class.extend({ }, _updateOpacity: function () { - L.DomUtil.setOpacity(this._container, this.options.opacity); - - // stupid webkit hack to force redrawing of tiles var i, tiles = this._tiles; + if (L.Browser.ielt9) { + for (i in tiles) { + if (tiles.hasOwnProperty(i)) { + L.DomUtil.setOpacity(tiles[i], this.options.opacity); + } + } + } else { + L.DomUtil.setOpacity(this._container, this.options.opacity); + } + + // stupid webkit hack to force redrawing of tiles if (L.Browser.webkit) { for (i in tiles) { if (tiles.hasOwnProperty(i)) { @@ -2500,11 +2595,9 @@ L.TileLayer = L.Class.extend({ // image-specific code (override to implement e.g. Canvas or SVG tile layer) getTileUrl: function (tilePoint) { - this._adjustTilePoint(tilePoint); - return L.Util.template(this._url, L.extend({ s: this._getSubdomain(tilePoint), - z: this._getZoomForUrl(), + z: tilePoint.z, x: tilePoint.x, y: tilePoint.y }, this.options)); @@ -2527,6 +2620,8 @@ L.TileLayer = L.Class.extend({ if (this.options.tms) { tilePoint.y = limit - tilePoint.y - 1; } + + tilePoint.z = this._getZoomForUrl(); }, _getSubdomain: function (tilePoint) { @@ -2555,6 +2650,10 @@ L.TileLayer = L.Class.extend({ _createTile: function () { var tile = this._tileImg.cloneNode(false); tile.onselectstart = tile.onmousemove = L.Util.falseFn; + + if (L.Browser.ielt9 && this.options.opacity !== undefined) { + L.DomUtil.setOpacity(tile, this.options.opacity); + } return tile; }, @@ -2563,15 +2662,16 @@ L.TileLayer = L.Class.extend({ tile.onload = this._tileOnLoad; tile.onerror = this._tileOnError; + this._adjustTilePoint(tilePoint); tile.src = this.getTileUrl(tilePoint); }, - _tileLoaded: function () { - this._tilesToLoad--; - if (!this._tilesToLoad) { - this.fire('load'); - } - }, + _tileLoaded: function () { + this._tilesToLoad--; + if (!this._tilesToLoad) { + this.fire('load'); + } + }, _tileOnLoad: function () { var layer = this._layer; @@ -2602,8 +2702,8 @@ L.TileLayer = L.Class.extend({ this.src = newUrl; } - layer._tileLoaded(); - } + layer._tileLoaded(); + } }); L.tileLayer = function (url, options) { @@ -2661,8 +2761,6 @@ L.TileLayer.WMS = L.TileLayer.extend({ getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String - this._adjustTilePoint(tilePoint); - var map = this._map, crs = map.options.crs, tileSize = this.options.tileSize, @@ -2719,6 +2817,7 @@ L.TileLayer.Canvas = L.TileLayer.extend({ this._redrawTile(tiles[i]); } } + return this; }, _redrawTile: function (tile) { @@ -3038,14 +3137,15 @@ L.Icon.Default.imagePath = (function () { var scripts = document.getElementsByTagName('script'), leafletRe = /\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/; - var i, len, src, matches; + var i, len, src, matches, path; for (i = 0, len = scripts.length; i < len; i++) { src = scripts[i].src; matches = src.match(leafletRe); if (matches) { - return src.split(leafletRe)[0] + '/images'; + path = src.split(leafletRe)[0]; + return (path ? path + '/' : '') + 'images'; } } }()); @@ -3644,7 +3744,7 @@ L.popup = function (options, source) { L.Marker.include({ openPopup: function () { - if (this._popup && this._map) { + if (this._popup && this._map && !this._map.hasLayer(this._popup)) { this._popup.setLatLng(this._latlng); this._map.openPopup(this._popup); } @@ -3677,9 +3777,21 @@ L.Marker.include({ .on('move', this._movePopup, this); } - this._popup = new L.Popup(options, this) - .setContent(content); + if (content instanceof L.Popup) { + L.setOptions(content, options); + this._popup = content; + } else { + this._popup = new L.Popup(options, this) + .setContent(content); + } + + return this; + }, + setPopupContent: function (content) { + if (this._popup) { + this._popup.setContent(content); + } return this; }, @@ -3766,6 +3878,13 @@ L.LayerGroup = L.Class.extend({ return this; }, + hasLayer: function (layer) { + if (!layer) { return false; } + + var id = L.stamp(layer); + return this._layers.hasOwnProperty(id); + }, + clearLayers: function () { this.eachLayer(this.removeLayer, this); return this; @@ -3891,7 +4010,9 @@ L.FeatureGroup = L.LayerGroup.extend({ }, _propagateEvent: function (e) { - e.layer = e.target; + if (!e.layer) { + e.layer = e.target; + } e.target = this; this.fire(e.type, e); @@ -4083,6 +4204,12 @@ L.Path = L.Path.extend({ if (this.options.fill) { this._path.setAttribute('fill-rule', 'evenodd'); } + if (this.options.pointerEvents) { + this._path.setAttribute('pointer-events', this.options.pointerEvents); + } + if (!this.options.clickable && !this.options.pointerEvents) { + this._path.setAttribute('pointer-events', 'none'); + } this._updateStyle(); }, @@ -4243,12 +4370,15 @@ L.Path.include({ bindPopup: function (content, options) { - if (!this._popup || options) { - this._popup = new L.Popup(options, this); + if (content instanceof L.Popup) { + this._popup = content; + } else { + if (!this._popup || options) { + this._popup = new L.Popup(options, this); + } + this._popup.setContent(content); } - this._popup.setContent(content); - if (!this._popupHandlersAdded) { this .on('click', this._openPopup, this) @@ -4818,7 +4948,7 @@ L.LineUtil = { /* - * L.Polygon is used to display polylines on a map. + * L.Polyline is used to display polylines on a map. */ L.Polyline = L.Path.extend({ @@ -5063,6 +5193,13 @@ L.Polygon = L.Polyline.extend({ this._latlngs = this._convertLatLngs(latlngs[0]); this._holes = latlngs.slice(1); } + + // filter out last point if its equal to the first one + latlngs = this._latlngs; + + if (latlngs[0].equals(latlngs[latlngs.length - 1])) { + latlngs.pop(); + } }, projectLatlngs: function () { @@ -5615,6 +5752,13 @@ L.DomEvent = { obj.addEventListener(newType, handler, false); + } else if (type === 'click' && L.Browser.android) { + originalHandler = handler; + handler = function (e) { + return L.DomEvent._filterClick(e, originalHandler); + }; + + obj.addEventListener(type, handler, false); } else { obj.addEventListener(type, handler, false); } @@ -5753,6 +5897,23 @@ L.DomEvent = { } } return e; + }, + + // this solves a bug in Android WebView where a single touch triggers two click events. + _filterClick: function (e, handler) { + var elapsed = L.DomEvent._lastClick && (e.timeStamp - L.DomEvent._lastClick); + + // are they closer together than 400ms yet more than 100ms? + // Android typically triggers them ~300ms apart while multiple listeners + // on the same event should be triggered far faster. + + if (elapsed && elapsed > 100 && elapsed < 400) { + L.DomEvent.stop(e); + return; + } + L.DomEvent._lastClick = e.timeStamp; + + return handler(e); } }; @@ -6098,6 +6259,8 @@ L.Map.Drag = L.Handler.extend({ noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; + map.fire('dragend'); + if (noInertia) { map.fire('moveend'); @@ -6117,12 +6280,10 @@ L.Map.Drag = L.Handler.extend({ offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); L.Util.requestAnimFrame(function () { - map.panBy(offset, decelerationDuration, ease); + map.panBy(offset, decelerationDuration, ease, true); }); } - map.fire('dragend'); - if (options.maxBounds) { // TODO predrag validation instead of animation L.Util.requestAnimFrame(this._panInsideMaxBounds, map, true, map._container); @@ -6909,257 +7070,6 @@ L.Handler.MarkerDrag = L.Handler.extend({ }); -/* - * L.Handler.PolyEdit is an editing handler for polylines and polygons. - */ - -L.Handler.PolyEdit = L.Handler.extend({ - options: { - icon: new L.DivIcon({ - iconSize: new L.Point(8, 8), - className: 'leaflet-div-icon leaflet-editing-icon' - }) - }, - - initialize: function (poly, options) { - this._poly = poly; - L.setOptions(this, options); - }, - - addHooks: function () { - if (this._poly._map) { - if (!this._markerGroup) { - this._initMarkers(); - } - this._poly._map.addLayer(this._markerGroup); - } - }, - - removeHooks: function () { - if (this._poly._map) { - this._poly._map.removeLayer(this._markerGroup); - delete this._markerGroup; - delete this._markers; - } - }, - - updateMarkers: function () { - this._markerGroup.clearLayers(); - this._initMarkers(); - }, - - _initMarkers: function () { - if (!this._markerGroup) { - this._markerGroup = new L.LayerGroup(); - } - this._markers = []; - - var latlngs = this._poly._latlngs, - i, j, len, marker; - - // TODO refactor holes implementation in Polygon to support it here - - for (i = 0, len = latlngs.length; i < len; i++) { - - marker = this._createMarker(latlngs[i], i); - marker.on('click', this._onMarkerClick, this); - this._markers.push(marker); - } - - var markerLeft, markerRight; - - for (i = 0, j = len - 1; i < len; j = i++) { - if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) { - continue; - } - - markerLeft = this._markers[j]; - markerRight = this._markers[i]; - - this._createMiddleMarker(markerLeft, markerRight); - this._updatePrevNext(markerLeft, markerRight); - } - }, - - _createMarker: function (latlng, index) { - var marker = new L.Marker(latlng, { - draggable: true, - icon: this.options.icon - }); - - marker._origLatLng = latlng; - marker._index = index; - - marker.on('drag', this._onMarkerDrag, this); - marker.on('dragend', this._fireEdit, this); - - this._markerGroup.addLayer(marker); - - return marker; - }, - - _fireEdit: function () { - this._poly.fire('edit'); - }, - - _onMarkerDrag: function (e) { - var marker = e.target; - - L.extend(marker._origLatLng, marker._latlng); - - if (marker._middleLeft) { - marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); - } - if (marker._middleRight) { - marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); - } - - this._poly.redraw(); - }, - - _onMarkerClick: function (e) { - // we want to remove the marker on click, but if latlng count < 3, polyline would be invalid - if (this._poly._latlngs.length < 3) { return; } - - var marker = e.target, - i = marker._index; - - // remove the marker - this._markerGroup.removeLayer(marker); - this._markers.splice(i, 1); - this._poly.spliceLatLngs(i, 1); - this._updateIndexes(i, -1); - - // update prev/next links of adjacent markers - this._updatePrevNext(marker._prev, marker._next); - - // remove ghost markers near the removed marker - if (marker._middleLeft) { - this._markerGroup.removeLayer(marker._middleLeft); - } - if (marker._middleRight) { - this._markerGroup.removeLayer(marker._middleRight); - } - - // create a ghost marker in place of the removed one - if (marker._prev && marker._next) { - this._createMiddleMarker(marker._prev, marker._next); - - } else if (!marker._prev) { - marker._next._middleLeft = null; - - } else if (!marker._next) { - marker._prev._middleRight = null; - } - - this._poly.fire('edit'); - }, - - _updateIndexes: function (index, delta) { - this._markerGroup.eachLayer(function (marker) { - if (marker._index > index) { - marker._index += delta; - } - }); - }, - - _createMiddleMarker: function (marker1, marker2) { - var latlng = this._getMiddleLatLng(marker1, marker2), - marker = this._createMarker(latlng), - onClick, - onDragStart, - onDragEnd; - - marker.setOpacity(0.6); - - marker1._middleRight = marker2._middleLeft = marker; - - onDragStart = function () { - var i = marker2._index; - - marker._index = i; - - marker - .off('click', onClick) - .on('click', this._onMarkerClick, this); - - latlng.lat = marker.getLatLng().lat; - latlng.lng = marker.getLatLng().lng; - this._poly.spliceLatLngs(i, 0, latlng); - this._markers.splice(i, 0, marker); - - marker.setOpacity(1); - - this._updateIndexes(i, 1); - marker2._index++; - this._updatePrevNext(marker1, marker); - this._updatePrevNext(marker, marker2); - }; - - onDragEnd = function () { - marker.off('dragstart', onDragStart, this); - marker.off('dragend', onDragEnd, this); - - this._createMiddleMarker(marker1, marker); - this._createMiddleMarker(marker, marker2); - }; - - onClick = function () { - onDragStart.call(this); - onDragEnd.call(this); - this._poly.fire('edit'); - }; - - marker - .on('click', onClick, this) - .on('dragstart', onDragStart, this) - .on('dragend', onDragEnd, this); - - this._markerGroup.addLayer(marker); - }, - - _updatePrevNext: function (marker1, marker2) { - if (marker1) { - marker1._next = marker2; - } - if (marker2) { - marker2._prev = marker1; - } - }, - - _getMiddleLatLng: function (marker1, marker2) { - var map = this._poly._map, - p1 = map.latLngToLayerPoint(marker1.getLatLng()), - p2 = map.latLngToLayerPoint(marker2.getLatLng()); - - return map.layerPointToLatLng(p1._add(p2)._divideBy(2)); - } -}); - -L.Polyline.addInitHook(function () { - - if (L.Handler.PolyEdit) { - this.editing = new L.Handler.PolyEdit(this); - - if (this.options.editable) { - this.editing.enable(); - } - } - - this.on('add', function () { - if (this.editing && this.editing.enabled()) { - this.editing.addHooks(); - } - }); - - this.on('remove', function () { - if (this.editing && this.editing.enabled()) { - this.editing.removeHooks(); - } - }); -}); - - /* * L.Control is a base class for implementing map controls. Handles positioning. * All other controls extend from this class. @@ -7278,31 +7188,22 @@ L.Control.Zoom = L.Control.extend({ onAdd: function (map) { var zoomName = 'leaflet-control-zoom', - barName = 'leaflet-bar', - partName = barName + '-part', - container = L.DomUtil.create('div', zoomName + ' ' + barName); + container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); this._map = map; - this._zoomInButton = this._createButton('+', 'Zoom in', - zoomName + '-in ' + - partName + ' ' + - partName + '-top', - container, this._zoomIn, this); + this._zoomInButton = this._createButton( + '+', 'Zoom in', zoomName + '-in', container, this._zoomIn, this); + this._zoomOutButton = this._createButton( + '-', 'Zoom out', zoomName + '-out', container, this._zoomOut, this); - this._zoomOutButton = this._createButton('-', 'Zoom out', - zoomName + '-out ' + - partName + ' ' + - partName + '-bottom', - container, this._zoomOut, this); - - map.on('zoomend', this._updateDisabled, this); + map.on('zoomend baselayerchange', this._updateDisabled, this); return container; }, onRemove: function (map) { - map.off('zoomend', this._updateDisabled, this); + map.off('zoomend baselayerchange', this._updateDisabled, this); }, _zoomIn: function (e) { @@ -7333,7 +7234,7 @@ L.Control.Zoom = L.Control.extend({ _updateDisabled: function () { var map = this._map, - className = 'leaflet-control-zoom-disabled'; + className = 'leaflet-disabled'; L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); @@ -7812,9 +7713,12 @@ L.Control.Layers = L.Control.extend({ this._map.addLayer(obj.layer); if (!obj.overlay) { baseLayer = obj.layer; + } else { + this._map.fire('overlayadd', {layer: obj}); } } else if (!input.checked && this._map.hasLayer(obj.layer)) { this._map.removeLayer(obj.layer); + this._map.fire('overlayremove', {layer: obj}); } } @@ -7951,7 +7855,7 @@ L.Map.include({ return this; }, - panBy: function (offset, duration, easeLinearity) { + panBy: function (offset, duration, easeLinearity, moving) { offset = L.point(offset); if (!(offset.x || offset.y)) { @@ -7967,7 +7871,9 @@ L.Map.include({ }, this); } - this.fire('movestart'); + if (moving !== true) { + this.fire('movestart'); + } L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); diff --git a/dist/leaflet.css b/dist/leaflet.css index ea3da39071f..2410992d83c 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -191,37 +191,58 @@ /* general toolbar styles */ .leaflet-bar { - box-shadow: 0 0 8px rgba(0,0,0,0.4); - border: 1px solid #888; - -webkit-border-radius: 5px; - border-radius: 5px; + box-shadow: 0 1px 7px rgba(0,0,0,0.65); + -webkit-border-radius: 4px; + border-radius: 4px; } -.leaflet-bar-part { - background-color: rgba(255, 255, 255, 0.8); - border-bottom: 1px solid #aaa; +.leaflet-bar a { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; } -.leaflet-bar-part-top { +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { -webkit-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } -.leaflet-bar-part-bottom { +.leaflet-bar a:last-child { -webkit-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; border-bottom: none; } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } .leaflet-touch .leaflet-bar { -webkit-border-radius: 10px; border-radius: 10px; } -.leaflet-touch .leaflet-bar-part { - border-bottom: 4px solid rgba(0,0,0,0.3); +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; } -.leaflet-touch .leaflet-bar-part-top { +.leaflet-touch .leaflet-bar a:first-child { -webkit-border-radius: 7px 7px 0 0; border-radius: 7px 7px 0 0; } -.leaflet-touch .leaflet-bar-part-bottom { +.leaflet-touch .leaflet-bar a:last-child { -webkit-border-radius: 0 0 7px 7px; border-radius: 0 0 7px 7px; border-bottom: none; @@ -234,48 +255,23 @@ margin-left: 13px; margin-top: 12px; } -.leaflet-control-zoom a { - width: 22px; - height: 22px; - text-align: center; - text-decoration: none; - color: black; - } -.leaflet-control-zoom a, -.leaflet-control-layers-toggle { - background-position: 50% 50%; - background-repeat: no-repeat; - display: block; - } -.leaflet-control-zoom a:hover { - background-color: #fff; - color: #777; - } .leaflet-control-zoom-in { - font: bold 18px/24px Arial, Helvetica, sans-serif; + font: bold 18px 'Lucida Console', Monaco, monospace; } .leaflet-control-zoom-out { - font: bold 23px/20px Tahoma, Verdana, sans-serif; - } -.leaflet-control-zoom a.leaflet-control-zoom-disabled { - cursor: default; - background-color: rgba(255, 255, 255, 0.8); - color: #bbb; + font: bold 22px 'Lucida Console', Monaco, monospace; } -.leaflet-touch .leaflet-control-zoom a { - width: 30px; - height: 30px; - } .leaflet-touch .leaflet-control-zoom-in { - font-size: 24px; - line-height: 29px; + font-size: 22px; + line-height: 30px; } .leaflet-touch .leaflet-control-zoom-out { font-size: 28px; - line-height: 24px; + line-height: 30px; } + /* layers control */ .leaflet-control-layers { diff --git a/dist/leaflet.ie.css b/dist/leaflet.ie.css index b59c8144e6c..14b84b691e9 100644 --- a/dist/leaflet.ie.css +++ b/dist/leaflet.ie.css @@ -35,12 +35,6 @@ .leaflet-control-layers { border: 3px solid #999; } -.leaflet-control-zoom a { - background-color: #eee; - } -.leaflet-control-zoom a:hover { - background-color: #fff; - } .leaflet-control-layers-toggle { } .leaflet-control-attribution, diff --git a/dist/leaflet.js b/dist/leaflet.js index bdf0b69e213..82693aab7c0 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -2,7 +2,7 @@ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com (c) 2010-2013, Vladimir Agafonkin, CloudMade */ -(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.5.1",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n+"="+t[n]);return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h[t[a]]=h[t[a]]||[],h[t[a]].push({action:e,context:i||this});return this},hasEventListeners:function(t){return s in this&&t in this[s]&&this[s][t].length>0},removeEventListener:function(t,e,i){var o,a,r,h,l,u=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a]))for(h=u[t[a]],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;for(var i=n.extend({type:t,target:this},e),o=this[s][t].slice(),a=0,r=o.length;r>a;a++)o[a].action.call(o[a].context||this,i);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=navigator.userAgent.toLowerCase(),h=-1!==r.indexOf("webkit"),l=-1!==r.indexOf("chrome"),u=-1!==r.indexOf("android"),c=-1!==r.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,p="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,m=e.documentElement,f=o&&"transition"in m.style,g="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,v="MozPerspective"in m.style,y="OTransition"in m.style,L=!t.L_DISABLE_3D&&(f||g||v||y),P=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in m)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,webkit:h,android:u,android23:c,chrome:l,ie3d:f,webkit3d:g,gecko3d:v,opera3d:y,any3d:L,mobile:_,mobileWebkit:_&&h,mobileWebkit3d:_&&g,mobileOpera:_&&t.opera,touch:P,msTouch:d,retina:p}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,i){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):isNaN(t)?t:new n.Point(t,e,i)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||0,s+=r.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!h||(s+=a.scrollWidth-a.clientWidth,h&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):isNaN(t)?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this._northEast.lat,this._southWest.lng)},getSouthEast:function(){return new n.LatLng(this._southWest.lat,this._northEast.lng)},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){var t=this._southWest,e=this._northEast;return[t.lng,t.lat,e.lng,e.lat].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_updateZoomLevels:function(){var t,e=1/0,n=-1/0;for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var o=this._zoomBoundLayers[t];isNaN(o.options.minZoom)||(e=Math.min(e,o.options.minZoom)),isNaN(o.options.maxZoom)||(n=Math.max(n,o.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e)},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var _=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(_),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,_=1e-7,d=c,p=.1;Math.abs(p)>_&&--d>0;)e=h*Math.sin(u),p=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=p;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){n.DomUtil.setOpacity(this._container,this.options.opacity);var t,e=this._tiles;if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l);this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o) -},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return this._adjustTilePoint(t),n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:this._getZoomForUrl(),x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1)},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){this._adjustTilePoint(t);var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s=e.getElementsByTagName("script"),a=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=s.length;i>t;t++)if(n=s[t].src,o=n.match(a))return n.split(a)[0]+"/images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popup=new n.Popup(e,this).setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer=t.target,t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return(!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u]; -var _=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>_&&(o=_,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,_=[1,4,2,8],d=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=d._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=_[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)):(h._code&u&&(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1))},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry||o[e].features)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),_=u/(e.inertiaDeceleration*r),d=c.multiplyBy(-_/2).round();n.Util.requestAnimFrame(function(){t.panBy(d,_,r)})}t.fire("dragend"),e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(p.push(t.pointerId),e=p.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=p.indexOf(t.pointerId);if(-1===e)return;p.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",_=this._touchstart,d=this._touchend,p=[];t[c+_+o]=s,t[c+d+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(_,s,!1),m.addEventListener(d,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Handler.PolyEdit=n.Handler.extend({options:{icon:new n.DivIcon({iconSize:new n.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"})},initialize:function(t,e){this._poly=t,n.setOptions(this,e)},addHooks:function(){this._poly._map&&(this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){this._poly._map&&(this._poly._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new n.LayerGroup),this._markers=[];var t,e,i,o,s=this._poly._latlngs;for(t=0,i=s.length;i>t;t++)o=this._createMarker(s[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var a,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||n.Polygon&&this._poly instanceof n.Polygon)&&(a=this._markers[e],r=this._markers[t],this._createMiddleMarker(a,r),this._updatePrevNext(a,r))},_createMarker:function(t,e){var i=new n.Marker(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("drag",this._onMarkerDrag,this),i.on("dragend",this._fireEdit,this),this._markerGroup.addLayer(i),i},_fireEdit:function(){this._poly.fire("edit")},_onMarkerDrag:function(t){var e=t.target;n.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw()},_onMarkerClick:function(t){if(!(3>this._poly._latlngs.length)){var e=t.target,i=e._index;this._markerGroup.removeLayer(e),this._markers.splice(i,1),this._poly.spliceLatLngs(i,1),this._updateIndexes(i,-1),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._poly.fire("edit")}},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,n=function(){var n=e._index;a._index=n,a.off("click",i).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._poly.spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e)},o=function(){a.off("dragstart",n,this),a.off("dragend",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){n.call(this),o.call(this),this._poly.fire("edit")},a.on("click",i,this).on("dragstart",n,this).on("dragend",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.latLngToLayerPoint(t.getLatLng()),o=i.latLngToLayerPoint(e.getLatLng());return i.layerPointToLatLng(n._add(o)._divideBy(2))}}),n.Polyline.addInitHook(function(){n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this -},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i="leaflet-bar",o=i+"-part",s=n.DomUtil.create("div",e+" "+i);return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in "+o+" "+o+"-top",s,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out "+o+" "+o+"-bottom",s,this._zoomOut,this),t.on("zoomend",this._updateDisabled,this),s},onRemove:function(t){t.off("zoomend",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-control-zoom-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay||(n=i.layer)):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var o=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,o,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); \ No newline at end of file +(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.6-dev",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return e.__super__=a.prototype,o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h,l,u,c,p,_=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h={action:e,context:i||this},l=i&&i._leaflet_id,l?(u=t[a]+"_idx",c=u+"_len",p=_[u]=_[u]||{},p[l]?p[l].push(h):(p[l]=[h],_[c]=(_[c]||0)+1)):(_[t[a]]=_[t[a]]||[],_[t[a]].push(h));return this},hasEventListeners:function(t){return s in this&&(t in this[s]&&this[s][t].length>0||this[s][t+"_idx_len"]>0)},removeEventListener:function(t,e,i){var o,a,r,h,l,u,c,p,_=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a])){for(u=i&&i._leaflet_id,c=t[a]+"_idx",h=u&&_[c]?_[c][u]||[]:_[t[a]]||[],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);u&&0===h.length&&(p=c+"_len",delete _[c][u],_[p]=(_[p]||1)-1)}return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,o,a,r,h,l=n.Util.extend({type:t,target:this},e);if(this[s][t])for(i=this[s][t].slice(),o=0,a=i.length;a>o;o++)i[o].action.call(i[o].context||this,l);if(r=this[s][t+"_idx"])for(h in r)if(r.hasOwnProperty(h)&&(i=r[h]))for(o=0,a=i.length;a>o;o++)i[o].action.call(i[o].context||this,l);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=o&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,m="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,f=e.documentElement,g=o&&"transition"in f.style,v="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,y="MozPerspective"in f.style,P="OTransition"in f.style,L=!t.L_DISABLE_3D&&(g||v||y||P),w=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in f)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,ielt9:r,webkit:l,android:c,android23:p,chrome:u,ie3d:g,webkit3d:v,gecko3d:y,opera3d:P,any3d:L,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&v,mobileOpera:_&&t.opera,touch:w,msTouch:d,retina:m}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,o){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):t===i||null===t?t:new n.Point(t,e,o)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=e.documentElement,l=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):t===i||null===t?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new n.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var p=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(p),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,p=1e-7,_=c,d=.1;Math.abs(d)>p&&--_>0;)e=h*Math.sin(u),d=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=d;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(n.Browser.ielt9)for(t in e)e.hasOwnProperty(t)&&n.DomUtil.setOpacity(e[t],this.options.opacity);else n.DomUtil.setOpacity(this._container,this.options.opacity);if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l); +this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,n.Browser.ielt9&&this.options.opacity!==i&&n.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof n.Popup?(n.setOptions(t,e),this._popup=t):this._popup=new n.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},hasLayer:function(t){if(!t)return!1;var e=n.stamp(t);return this._layers.hasOwnProperty(e)},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return t instanceof n.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i); +for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var p=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>p&&(o=p,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,p=[1,4,2,8],_=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=_._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=p[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=_._getEdgeIntersection(h,r,u,e),c._code=_._getBitCode(c,e),i.push(c)):(h._code&u&&(c=_._getEdgeIntersection(h,r,u,e),c._code=_._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1)),t=this._latlngs,t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry||o[e].features)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):"click"===e&&n.Browser.android?(r=a,a=function(t){return n.DomEvent._filterClick(t,r)},t.addEventListener(e,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var o=n.DomEvent._lastClick&&t.timeStamp-n.DomEvent._lastClick;return o&&o>100&&400>o?(n.DomEvent.stop(t),i):(n.DomEvent._lastClick=t.timeStamp,e(t))}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),p=u/(e.inertiaDeceleration*r),_=c.multiplyBy(-p/2).round();n.Util.requestAnimFrame(function(){t.panBy(_,p,r,!0)})}e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(d.push(t.pointerId),e=d.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=d.indexOf(t.pointerId);if(-1===e)return;d.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",p=this._touchstart,_=this._touchend,d=[];t[c+p+o]=s,t[c+_+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(p,s,!1),m.addEventListener(_,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=n.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend baselayerchange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend baselayerchange",this._updateDisabled,this) +},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay?this._map.fire("overlayadd",{layer:i}):n=i.layer):!e.checked&&this._map.hasLayer(i.layer)&&(this._map.removeLayer(i.layer),this._map.fire("overlayremove",{layer:i}));n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i,o){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),o!==!0&&this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var s=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,s,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); \ No newline at end of file From 37dd65ff6d338345d7ffaba16d76336aad94f095 Mon Sep 17 00:00:00 2001 From: jacobtoye Date: Mon, 18 Feb 2013 15:47:38 +1300 Subject: [PATCH 0355/2207] Minor article touch ups. --- _posts/2013-02-15-guest-post-draw.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2013-02-15-guest-post-draw.md b/_posts/2013-02-15-guest-post-draw.md index 7828103a137..6db3d58112f 100644 --- a/_posts/2013-02-15-guest-post-draw.md +++ b/_posts/2013-02-15-guest-post-draw.md @@ -81,9 +81,9 @@ See the Leafle ### Thanks -First and foremost I would like to thank my employer Smartrak, without their positive attitude to open source software I would not have had the time to complete this plugin. +First and foremost I would like to thank my employer Smartrak. Without their attitude to open source software I would not have had the time to complete this plugin. -The Leaflet developer community have been great in support this plugin through inspiration, pull requests and issue reports. Special thanks to: @mourner, @danzel, @brunob, @tnightingale, and @shramov. +The Leaflet developer community have been great in supporting this plugin through inspiration, pull requests and issue reports. Special thanks to: @mourner, @danzel, @brunob, @tnightingale, @Starefossen, and @shramov. ### Closing From edd04491d5b2c38d8e50977550e8380de1759b53 Mon Sep 17 00:00:00 2001 From: jacobtoye Date: Wed, 20 Feb 2013 11:18:31 +1300 Subject: [PATCH 0356/2207] Remove built draw files and replacing with links gh-pages. --- _posts/2013-02-15-guest-post-draw.md | 22 +-- dist/images/spritesheet.png | Bin 2777 -> 0 bytes dist/leaflet.draw.css | 217 --------------------------- dist/leaflet.draw.ie.css | 44 ------ 4 files changed, 11 insertions(+), 272 deletions(-) delete mode 100644 dist/images/spritesheet.png delete mode 100644 dist/leaflet.draw.css delete mode 100644 dist/leaflet.draw.ie.css diff --git a/_posts/2013-02-15-guest-post-draw.md b/_posts/2013-02-15-guest-post-draw.md index 6db3d58112f..a8729c4be20 100644 --- a/_posts/2013-02-15-guest-post-draw.md +++ b/_posts/2013-02-15-guest-post-draw.md @@ -89,12 +89,12 @@ The Leaflet developer community have been great in supporting this plugin throug I've had a great time implementing this plugin. I hope you enjoy using it. If you have a question or just want to say hi, send me an email at jacob.toye@gmail.com. -Cheers, +Cheers, Jacob Toye - - - + + + \ No newline at end of file diff --git a/dist/images/spritesheet.png b/dist/images/spritesheet.png deleted file mode 100644 index 168c31e6b39b4975c121edb2d2e0975bafa7d4ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2777 zcmbVOdpJ~iAD^NNk|KqQX~-hXoG}K&l*yUd8H~#yV#$~}7>pS+2SZP_pn*mlN3p@#jLw~(6 z2%Cr-Ok#nwuUyEAj0uHdAqk6(jg2*rwJ;ZmLa>01jm?4%Jl+hEFcZf`!fc6Iq*#AZ z0|<#ZBAyWD2_n%88reaDXqb#aEdAmFU&v&BQyeM&8Ym=WSP5H*1=FBLvj`Ikfg99KmjM34@JTZkc>gz zm~(kt5(OX~E5I#O01L#S z0wLPL!xHVyi{uJo#S6*#;wuP=crg%{CKB+`pQB6S{S7+>|G&Kcg5~}{5yK+JU>8c` zze;6s3#q?_>9@j17T;P2ibVQFgfzys?q(MhYJ~~|q6ua))3n!OX6RmBh>t;?*&OO$=L8H+O zmM2aP1P+=7;!e_6E!RkG48#Chs|?i>8^NH3E!s$9t6#(W`YooW&bnEdnP&kBn%KrU zbLV+HWB%uv*j;SUk;&Xw*f9zpP7Sc@Ka=>>wzdX)U$tE8p_FYqqflOR zexX>_e{Egfc6wf!$J>kS}6BwR=c(}DMF)`8q{qI|Un>JpliIbOB9b{ut zR_P42I%Y>y`d%n?cXyXx;dL5hH5;g^sxs>8>R7I>YHLk2ZofNXs1Bbw*#Gi!a9if| zYBe<{1qFq|td&0mu91nhe3$(r5Ej0rVr^<`@EgmX9Yyu^J2b%ShV~V;YkZ$2EK@18 zjeXTLUOa8)dxie7eCc2C!w04bU`I!XVB3Qi6r+yS{!5a3nYZ`7f6X=}z5&r|dXi_s zlJ;~=_DJ-|#j2--si`Sri{MtRXg#Tc%G&bFm$ObAdld$>fKgFVkIdE|A?$q@@nY`7 zn>>Gif5yEWU0q$5Q@<*)^d;5RGMOwI0Dwx5^9`{=n@!RgV&r2j=5B>0R}_dDkFW5u z{E}G5IDOe;GEeo!23b!^LvK}hJvr{rp$)WS^zGUd?k`41+cH)ZlZ~@gP^4Qs+RBMG*Zo-!ht;n?vs0 zxl=XyYMZGk?BP}&_3SYG>T&hi?CfeRDiV`C1I`-Ul?bc+7gy1-337dpbroH#R!VXUZ+8=bxL6mY0whcbrnEkN`qZ+s*!2VkgV_&^72<7e{mhDKvXa8W!jkgx2}9^RQC-e9Z^vtb zf%Wl@rFHqHarq>DvWoiJn3uiL%R9yn=2zohSFlo0v+>>)3Jt4YVxrHj`0xYyzWu|K zNnHYyKcDXzKXoMZp{@z|M}GHFXe26Zt^yqEuZb0GHd#_#zxB_C?#$kb3%*rj z5di`HGqel2(%e$3gSF`sp2I@xwAcPWxsNUDy0O6v47u@ZQ&E}_(;+Y!+5OH=Mcr7d zwY~k*%Io<(v*`G$L&`GgX4@F$*$Me^AxHZsX>x`xIo|P-$A^iSy`^P)x|qe15fAB; zHwqo&%h+`-&yzhXyB<97emPKI&)VW{&{tfUIlQ*IYa$ekE3Ml_wU!wb1=R1~r&2ek zeT;s4tn2)NonaLRR%RxU13E7K53yBL+5!so|XF_n|Gqd zJvPrjX-vEYCxqOLcaPiT-4uT^NU`bJ^3;zF)=BdI?`L>=p}I-50;sQ(n;*q5enF*Q z)6dJx!x!l2=&;faWoby)5Wtf2je+;hj;7WM2^DR@HMWBO+JV)ZtY4c$IEDLyZkx#j zdyI@diZaq<#sq|ikLT{M-=XAQtyXkA{8pM~TTcdd>a?^tkv6BXrM6QvHF&Gd($Z4O ze{{93K6<>{SH89Egk%-q<>h6&apT4TCB>yv90>VfmX8e%4!XYn)o;kxDx&A!qrN`= zK|RLyGp=&!%;dm{AP#5Ne9!NjielU14+wiBlAewH_~Gqn=j^M#nhnYH>Dj-g$H_+6 zy}~n?U~JOGK30l-?xDa9B2#r`3viTT$~^Jz;fmFVX7|xXIy03r!CLKS+BsR~ zG6T7ysiQz6&vyk-v6~>v|8CG|t#M(2c>hO1hL*=_>>p>`=bD3qoTFdsy#utIk#i^Y lW*| Date: Wed, 20 Feb 2013 11:19:31 +1300 Subject: [PATCH 0357/2207] Renaming blog post to get the date right. --- ...013-02-15-guest-post-draw.md => 2013-02-20-guest-post-draw.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2013-02-15-guest-post-draw.md => 2013-02-20-guest-post-draw.md} (100%) diff --git a/_posts/2013-02-15-guest-post-draw.md b/_posts/2013-02-20-guest-post-draw.md similarity index 100% rename from _posts/2013-02-15-guest-post-draw.md rename to _posts/2013-02-20-guest-post-draw.md From 51130a814a8412ce0dd9fcfb94ab33d250166d31 Mon Sep 17 00:00:00 2001 From: jacobtoye Date: Wed, 20 Feb 2013 15:11:54 +1300 Subject: [PATCH 0358/2207] Revert "Update Leaflet to master for testing [TEMP]" This reverts commit c3eea648bdf2aa3c38cce7bb5c20a94e3e7be267. --- dist/leaflet-src.js | 582 +++++++++++++++++++++++++------------------- dist/leaflet.css | 84 ++++--- dist/leaflet.ie.css | 6 + dist/leaflet.js | 8 +- 4 files changed, 392 insertions(+), 288 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index c707e942053..c5b4c6d8465 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -23,7 +23,7 @@ if (typeof exports !== undefined + '') { window.L = L; } -L.version = '0.6-dev'; +L.version = '0.5.1'; /* @@ -109,7 +109,7 @@ L.Util = { var params = []; for (var i in obj) { if (obj.hasOwnProperty(i)) { - params.push(encodeURIComponent(i) + '=' + encodeURIComponent(obj[i])); + params.push(i + '=' + obj[i]); } } return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); @@ -253,7 +253,6 @@ L.Class.extend = function (props) { proto._initHooks = []; var parent = this; - NewClass.__super__ = parent.prototype; // add method for calling all hooks proto.callInitHooks = function () { @@ -308,12 +307,10 @@ L.Mixin = {}; L.Mixin.Events = { addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) - var events = this[key] = this[key] || {}, - type, i, len, evt, - contextId, objKey, objLenKey, eventsObj; + type, i, len; - // types can be a map of types/handlers + // Types can be a map of types/handlers if (typeof types === 'object') { for (type in types) { if (types.hasOwnProperty(type)) { @@ -324,50 +321,26 @@ L.Mixin.Events = { return this; } - // types can be a string of space-separated words types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { - evt = { + events[types[i]] = events[types[i]] || []; + events[types[i]].push({ action: fn, context: context || this - }; - contextId = context && context._leaflet_id; - - if (contextId) { - // store listeners of a particular context in a separate hash (if it has an id) - // gives a major performance boost when removing thousands of map layers - - objKey = types[i] + '_idx', - objLenKey = objKey + '_len', - eventsObj = events[objKey] = events[objKey] || {}; - - if (eventsObj[contextId]) { - eventsObj[contextId].push(evt); - } else { - eventsObj[contextId] = [evt]; - events[objLenKey] = (events[objLenKey] || 0) + 1; - } - - } else { - events[types[i]] = events[types[i]] || []; - events[types[i]].push(evt); - } + }); } return this; }, hasEventListeners: function (type) { // (String) -> Boolean - return (key in this) && - (((type in this[key]) && this[key][type].length > 0) || - (this[key][type + '_idx_len'] > 0)); + return (key in this) && (type in this[key]) && (this[key][type].length > 0); }, removeEventListener: function (types, fn, context) { // (String[, Function, Object]) or (Object[, Object]) var events = this[key], - type, i, len, listeners, j, - contextId, objKey, objLenKey; + type, i, len, listeners, j; if (typeof types === 'object') { for (type in types) { @@ -375,35 +348,25 @@ L.Mixin.Events = { this.removeEventListener(type, types[type], fn); } } + return this; } types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { - if (this.hasEventListeners(types[i])) { - // if the context has an id, use it to find the listeners - contextId = context && context._leaflet_id; - objKey = types[i] + '_idx'; - - if (contextId && events[objKey]) { - listeners = events[objKey][contextId] || []; - } else { - listeners = events[types[i]] || []; - } + if (this.hasEventListeners(types[i])) { + listeners = events[types[i]]; for (j = listeners.length - 1; j >= 0; j--) { - if ((!fn || listeners[j].action === fn) && (!context || (listeners[j].context === context))) { + if ( + (!fn || listeners[j].action === fn) && + (!context || (listeners[j].context === context)) + ) { listeners.splice(j, 1); } } - - if (contextId && listeners.length === 0) { - objLenKey = objKey + '_len'; - delete events[objKey][contextId]; - events[objLenKey] = (events[objLenKey] || 1) - 1; - } } } @@ -415,36 +378,15 @@ L.Mixin.Events = { return this; } - var event = L.Util.extend({ + var event = L.extend({ type: type, target: this }, data); - var listeners, i, len, eventsObj, contextId; - - if (this[key][type]) { - listeners = this[key][type].slice(); - - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); - } - } - - // fire event for the context-indexed listeners as well - - eventsObj = this[key][type + '_idx']; + var listeners = this[key][type].slice(); - if (eventsObj) { - for (contextId in eventsObj) { - if (eventsObj.hasOwnProperty(contextId)) { - listeners = eventsObj[contextId]; - if (listeners) { - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); - } - } - } - } + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].action.call(listeners[i].context || this, event); } return this; @@ -465,7 +407,6 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; var ie = !!window.ActiveXObject, ie6 = ie && !window.XMLHttpRequest, ie7 = ie && !document.querySelector, - ielt9 = ie && !document.addEventListener, // terrible browser detection to work around Safari / iOS / Android browser bugs ua = navigator.userAgent.toLowerCase(), @@ -522,7 +463,6 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; ie: ie, ie6: ie6, ie7: ie7, - ielt9: ielt9, webkit: webkit, android: android, @@ -655,7 +595,7 @@ L.point = function (x, y, round) { if (L.Util.isArray(x)) { return new L.Point(x[0], x[1]); } - if (x === undefined || x === null) { + if (isNaN(x)) { return x; } return new L.Point(x, y, round); @@ -823,7 +763,6 @@ L.DomUtil = { left = 0, el = element, docBody = document.body, - docEl = document.documentElement, pos, ie7 = L.Browser.ie7; @@ -840,8 +779,8 @@ L.DomUtil = { if (el.offsetParent === docBody && pos === 'absolute') { break; } if (pos === 'fixed') { - top += docBody.scrollTop || docEl.scrollTop || 0; - left += docBody.scrollLeft || docEl.scrollLeft || 0; + top += docBody.scrollTop || 0; + left += docBody.scrollLeft || 0; break; } el = el.offsetParent; @@ -1111,7 +1050,7 @@ L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Numbe if (L.Util.isArray(a)) { return new L.LatLng(a[0], a[1]); } - if (a === undefined || a === null) { + if (isNaN(a)) { return a; } return new L.LatLng(a, b); @@ -1187,27 +1126,11 @@ L.LatLngBounds.prototype = { }, getNorthWest: function () { - return new L.LatLng(this.getNorth(), this.getWest()); + return new L.LatLng(this._northEast.lat, this._southWest.lng); }, getSouthEast: function () { - return new L.LatLng(this.getSouth(), this.getEast()); - }, - - getWest: function () { - return this._southWest.lng; - }, - - getSouth: function () { - return this._southWest.lat; - }, - - getEast: function () { - return this._northEast.lng; - }, - - getNorth: function () { - return this._northEast.lat; + return new L.LatLng(this._southWest.lat, this._northEast.lng); }, contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean @@ -1247,7 +1170,10 @@ L.LatLngBounds.prototype = { }, toBBoxString: function () { - return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); + var sw = this._southWest, + ne = this._northEast; + + return [sw.lng, sw.lat, ne.lng, ne.lat].join(','); }, equals: function (bounds) { // (LatLngBounds) @@ -1597,8 +1523,6 @@ L.Map = L.Class.extend({ }, hasLayer: function (layer) { - if (!layer) { return false; } - var id = L.stamp(layer); return this._layers.hasOwnProperty(id); }, @@ -1616,17 +1540,15 @@ L.Map = L.Class.extend({ var offset = oldSize._subtract(this.getSize())._divideBy(2)._round(); - if ((offset.x !== 0) || (offset.y !== 0)) { - if (animate === true) { - this.panBy(offset); - } else { - this._rawPanBy(offset); + if (animate === true) { + this.panBy(offset); + } else { + this._rawPanBy(offset); - this.fire('move'); + this.fire('move'); - clearTimeout(this._sizeTimer); - this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); - } + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); } return this; }, @@ -1937,15 +1859,10 @@ L.Map = L.Class.extend({ L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); }, - _getZoomSpan: function () { - return this.getMaxZoom() - this.getMinZoom(); - }, - _updateZoomLevels: function () { var i, minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); + maxZoom = -Infinity; for (i in this._zoomBoundLayers) { if (this._zoomBoundLayers.hasOwnProperty(i)) { @@ -1965,10 +1882,6 @@ L.Map = L.Class.extend({ this._layersMaxZoom = maxZoom; this._layersMinZoom = minZoom; } - - if (oldZoomSpan !== this._getZoomSpan()) { - this.fire("zoomlevelschange"); - } }, // map events @@ -2357,20 +2270,12 @@ L.TileLayer = L.Class.extend({ }, _updateOpacity: function () { + L.DomUtil.setOpacity(this._container, this.options.opacity); + + // stupid webkit hack to force redrawing of tiles var i, tiles = this._tiles; - if (L.Browser.ielt9) { - for (i in tiles) { - if (tiles.hasOwnProperty(i)) { - L.DomUtil.setOpacity(tiles[i], this.options.opacity); - } - } - } else { - L.DomUtil.setOpacity(this._container, this.options.opacity); - } - - // stupid webkit hack to force redrawing of tiles if (L.Browser.webkit) { for (i in tiles) { if (tiles.hasOwnProperty(i)) { @@ -2595,9 +2500,11 @@ L.TileLayer = L.Class.extend({ // image-specific code (override to implement e.g. Canvas or SVG tile layer) getTileUrl: function (tilePoint) { + this._adjustTilePoint(tilePoint); + return L.Util.template(this._url, L.extend({ s: this._getSubdomain(tilePoint), - z: tilePoint.z, + z: this._getZoomForUrl(), x: tilePoint.x, y: tilePoint.y }, this.options)); @@ -2620,8 +2527,6 @@ L.TileLayer = L.Class.extend({ if (this.options.tms) { tilePoint.y = limit - tilePoint.y - 1; } - - tilePoint.z = this._getZoomForUrl(); }, _getSubdomain: function (tilePoint) { @@ -2650,10 +2555,6 @@ L.TileLayer = L.Class.extend({ _createTile: function () { var tile = this._tileImg.cloneNode(false); tile.onselectstart = tile.onmousemove = L.Util.falseFn; - - if (L.Browser.ielt9 && this.options.opacity !== undefined) { - L.DomUtil.setOpacity(tile, this.options.opacity); - } return tile; }, @@ -2662,16 +2563,15 @@ L.TileLayer = L.Class.extend({ tile.onload = this._tileOnLoad; tile.onerror = this._tileOnError; - this._adjustTilePoint(tilePoint); tile.src = this.getTileUrl(tilePoint); }, - _tileLoaded: function () { - this._tilesToLoad--; - if (!this._tilesToLoad) { - this.fire('load'); - } - }, + _tileLoaded: function () { + this._tilesToLoad--; + if (!this._tilesToLoad) { + this.fire('load'); + } + }, _tileOnLoad: function () { var layer = this._layer; @@ -2702,8 +2602,8 @@ L.TileLayer = L.Class.extend({ this.src = newUrl; } - layer._tileLoaded(); - } + layer._tileLoaded(); + } }); L.tileLayer = function (url, options) { @@ -2761,6 +2661,8 @@ L.TileLayer.WMS = L.TileLayer.extend({ getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String + this._adjustTilePoint(tilePoint); + var map = this._map, crs = map.options.crs, tileSize = this.options.tileSize, @@ -2817,7 +2719,6 @@ L.TileLayer.Canvas = L.TileLayer.extend({ this._redrawTile(tiles[i]); } } - return this; }, _redrawTile: function (tile) { @@ -3137,15 +3038,14 @@ L.Icon.Default.imagePath = (function () { var scripts = document.getElementsByTagName('script'), leafletRe = /\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/; - var i, len, src, matches, path; + var i, len, src, matches; for (i = 0, len = scripts.length; i < len; i++) { src = scripts[i].src; matches = src.match(leafletRe); if (matches) { - path = src.split(leafletRe)[0]; - return (path ? path + '/' : '') + 'images'; + return src.split(leafletRe)[0] + '/images'; } } }()); @@ -3744,7 +3644,7 @@ L.popup = function (options, source) { L.Marker.include({ openPopup: function () { - if (this._popup && this._map && !this._map.hasLayer(this._popup)) { + if (this._popup && this._map) { this._popup.setLatLng(this._latlng); this._map.openPopup(this._popup); } @@ -3777,21 +3677,9 @@ L.Marker.include({ .on('move', this._movePopup, this); } - if (content instanceof L.Popup) { - L.setOptions(content, options); - this._popup = content; - } else { - this._popup = new L.Popup(options, this) - .setContent(content); - } - - return this; - }, + this._popup = new L.Popup(options, this) + .setContent(content); - setPopupContent: function (content) { - if (this._popup) { - this._popup.setContent(content); - } return this; }, @@ -3878,13 +3766,6 @@ L.LayerGroup = L.Class.extend({ return this; }, - hasLayer: function (layer) { - if (!layer) { return false; } - - var id = L.stamp(layer); - return this._layers.hasOwnProperty(id); - }, - clearLayers: function () { this.eachLayer(this.removeLayer, this); return this; @@ -4010,9 +3891,7 @@ L.FeatureGroup = L.LayerGroup.extend({ }, _propagateEvent: function (e) { - if (!e.layer) { - e.layer = e.target; - } + e.layer = e.target; e.target = this; this.fire(e.type, e); @@ -4204,12 +4083,6 @@ L.Path = L.Path.extend({ if (this.options.fill) { this._path.setAttribute('fill-rule', 'evenodd'); } - if (this.options.pointerEvents) { - this._path.setAttribute('pointer-events', this.options.pointerEvents); - } - if (!this.options.clickable && !this.options.pointerEvents) { - this._path.setAttribute('pointer-events', 'none'); - } this._updateStyle(); }, @@ -4370,15 +4243,12 @@ L.Path.include({ bindPopup: function (content, options) { - if (content instanceof L.Popup) { - this._popup = content; - } else { - if (!this._popup || options) { - this._popup = new L.Popup(options, this); - } - this._popup.setContent(content); + if (!this._popup || options) { + this._popup = new L.Popup(options, this); } + this._popup.setContent(content); + if (!this._popupHandlersAdded) { this .on('click', this._openPopup, this) @@ -4948,7 +4818,7 @@ L.LineUtil = { /* - * L.Polyline is used to display polylines on a map. + * L.Polygon is used to display polylines on a map. */ L.Polyline = L.Path.extend({ @@ -5193,13 +5063,6 @@ L.Polygon = L.Polyline.extend({ this._latlngs = this._convertLatLngs(latlngs[0]); this._holes = latlngs.slice(1); } - - // filter out last point if its equal to the first one - latlngs = this._latlngs; - - if (latlngs[0].equals(latlngs[latlngs.length - 1])) { - latlngs.pop(); - } }, projectLatlngs: function () { @@ -5752,13 +5615,6 @@ L.DomEvent = { obj.addEventListener(newType, handler, false); - } else if (type === 'click' && L.Browser.android) { - originalHandler = handler; - handler = function (e) { - return L.DomEvent._filterClick(e, originalHandler); - }; - - obj.addEventListener(type, handler, false); } else { obj.addEventListener(type, handler, false); } @@ -5897,23 +5753,6 @@ L.DomEvent = { } } return e; - }, - - // this solves a bug in Android WebView where a single touch triggers two click events. - _filterClick: function (e, handler) { - var elapsed = L.DomEvent._lastClick && (e.timeStamp - L.DomEvent._lastClick); - - // are they closer together than 400ms yet more than 100ms? - // Android typically triggers them ~300ms apart while multiple listeners - // on the same event should be triggered far faster. - - if (elapsed && elapsed > 100 && elapsed < 400) { - L.DomEvent.stop(e); - return; - } - L.DomEvent._lastClick = e.timeStamp; - - return handler(e); } }; @@ -6259,8 +6098,6 @@ L.Map.Drag = L.Handler.extend({ noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; - map.fire('dragend'); - if (noInertia) { map.fire('moveend'); @@ -6280,10 +6117,12 @@ L.Map.Drag = L.Handler.extend({ offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); L.Util.requestAnimFrame(function () { - map.panBy(offset, decelerationDuration, ease, true); + map.panBy(offset, decelerationDuration, ease); }); } + map.fire('dragend'); + if (options.maxBounds) { // TODO predrag validation instead of animation L.Util.requestAnimFrame(this._panInsideMaxBounds, map, true, map._container); @@ -7070,6 +6909,257 @@ L.Handler.MarkerDrag = L.Handler.extend({ }); +/* + * L.Handler.PolyEdit is an editing handler for polylines and polygons. + */ + +L.Handler.PolyEdit = L.Handler.extend({ + options: { + icon: new L.DivIcon({ + iconSize: new L.Point(8, 8), + className: 'leaflet-div-icon leaflet-editing-icon' + }) + }, + + initialize: function (poly, options) { + this._poly = poly; + L.setOptions(this, options); + }, + + addHooks: function () { + if (this._poly._map) { + if (!this._markerGroup) { + this._initMarkers(); + } + this._poly._map.addLayer(this._markerGroup); + } + }, + + removeHooks: function () { + if (this._poly._map) { + this._poly._map.removeLayer(this._markerGroup); + delete this._markerGroup; + delete this._markers; + } + }, + + updateMarkers: function () { + this._markerGroup.clearLayers(); + this._initMarkers(); + }, + + _initMarkers: function () { + if (!this._markerGroup) { + this._markerGroup = new L.LayerGroup(); + } + this._markers = []; + + var latlngs = this._poly._latlngs, + i, j, len, marker; + + // TODO refactor holes implementation in Polygon to support it here + + for (i = 0, len = latlngs.length; i < len; i++) { + + marker = this._createMarker(latlngs[i], i); + marker.on('click', this._onMarkerClick, this); + this._markers.push(marker); + } + + var markerLeft, markerRight; + + for (i = 0, j = len - 1; i < len; j = i++) { + if (i === 0 && !(L.Polygon && (this._poly instanceof L.Polygon))) { + continue; + } + + markerLeft = this._markers[j]; + markerRight = this._markers[i]; + + this._createMiddleMarker(markerLeft, markerRight); + this._updatePrevNext(markerLeft, markerRight); + } + }, + + _createMarker: function (latlng, index) { + var marker = new L.Marker(latlng, { + draggable: true, + icon: this.options.icon + }); + + marker._origLatLng = latlng; + marker._index = index; + + marker.on('drag', this._onMarkerDrag, this); + marker.on('dragend', this._fireEdit, this); + + this._markerGroup.addLayer(marker); + + return marker; + }, + + _fireEdit: function () { + this._poly.fire('edit'); + }, + + _onMarkerDrag: function (e) { + var marker = e.target; + + L.extend(marker._origLatLng, marker._latlng); + + if (marker._middleLeft) { + marker._middleLeft.setLatLng(this._getMiddleLatLng(marker._prev, marker)); + } + if (marker._middleRight) { + marker._middleRight.setLatLng(this._getMiddleLatLng(marker, marker._next)); + } + + this._poly.redraw(); + }, + + _onMarkerClick: function (e) { + // we want to remove the marker on click, but if latlng count < 3, polyline would be invalid + if (this._poly._latlngs.length < 3) { return; } + + var marker = e.target, + i = marker._index; + + // remove the marker + this._markerGroup.removeLayer(marker); + this._markers.splice(i, 1); + this._poly.spliceLatLngs(i, 1); + this._updateIndexes(i, -1); + + // update prev/next links of adjacent markers + this._updatePrevNext(marker._prev, marker._next); + + // remove ghost markers near the removed marker + if (marker._middleLeft) { + this._markerGroup.removeLayer(marker._middleLeft); + } + if (marker._middleRight) { + this._markerGroup.removeLayer(marker._middleRight); + } + + // create a ghost marker in place of the removed one + if (marker._prev && marker._next) { + this._createMiddleMarker(marker._prev, marker._next); + + } else if (!marker._prev) { + marker._next._middleLeft = null; + + } else if (!marker._next) { + marker._prev._middleRight = null; + } + + this._poly.fire('edit'); + }, + + _updateIndexes: function (index, delta) { + this._markerGroup.eachLayer(function (marker) { + if (marker._index > index) { + marker._index += delta; + } + }); + }, + + _createMiddleMarker: function (marker1, marker2) { + var latlng = this._getMiddleLatLng(marker1, marker2), + marker = this._createMarker(latlng), + onClick, + onDragStart, + onDragEnd; + + marker.setOpacity(0.6); + + marker1._middleRight = marker2._middleLeft = marker; + + onDragStart = function () { + var i = marker2._index; + + marker._index = i; + + marker + .off('click', onClick) + .on('click', this._onMarkerClick, this); + + latlng.lat = marker.getLatLng().lat; + latlng.lng = marker.getLatLng().lng; + this._poly.spliceLatLngs(i, 0, latlng); + this._markers.splice(i, 0, marker); + + marker.setOpacity(1); + + this._updateIndexes(i, 1); + marker2._index++; + this._updatePrevNext(marker1, marker); + this._updatePrevNext(marker, marker2); + }; + + onDragEnd = function () { + marker.off('dragstart', onDragStart, this); + marker.off('dragend', onDragEnd, this); + + this._createMiddleMarker(marker1, marker); + this._createMiddleMarker(marker, marker2); + }; + + onClick = function () { + onDragStart.call(this); + onDragEnd.call(this); + this._poly.fire('edit'); + }; + + marker + .on('click', onClick, this) + .on('dragstart', onDragStart, this) + .on('dragend', onDragEnd, this); + + this._markerGroup.addLayer(marker); + }, + + _updatePrevNext: function (marker1, marker2) { + if (marker1) { + marker1._next = marker2; + } + if (marker2) { + marker2._prev = marker1; + } + }, + + _getMiddleLatLng: function (marker1, marker2) { + var map = this._poly._map, + p1 = map.latLngToLayerPoint(marker1.getLatLng()), + p2 = map.latLngToLayerPoint(marker2.getLatLng()); + + return map.layerPointToLatLng(p1._add(p2)._divideBy(2)); + } +}); + +L.Polyline.addInitHook(function () { + + if (L.Handler.PolyEdit) { + this.editing = new L.Handler.PolyEdit(this); + + if (this.options.editable) { + this.editing.enable(); + } + } + + this.on('add', function () { + if (this.editing && this.editing.enabled()) { + this.editing.addHooks(); + } + }); + + this.on('remove', function () { + if (this.editing && this.editing.enabled()) { + this.editing.removeHooks(); + } + }); +}); + + /* * L.Control is a base class for implementing map controls. Handles positioning. * All other controls extend from this class. @@ -7188,22 +7278,31 @@ L.Control.Zoom = L.Control.extend({ onAdd: function (map) { var zoomName = 'leaflet-control-zoom', - container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); + barName = 'leaflet-bar', + partName = barName + '-part', + container = L.DomUtil.create('div', zoomName + ' ' + barName); this._map = map; - this._zoomInButton = this._createButton( - '+', 'Zoom in', zoomName + '-in', container, this._zoomIn, this); - this._zoomOutButton = this._createButton( - '-', 'Zoom out', zoomName + '-out', container, this._zoomOut, this); + this._zoomInButton = this._createButton('+', 'Zoom in', + zoomName + '-in ' + + partName + ' ' + + partName + '-top', + container, this._zoomIn, this); - map.on('zoomend baselayerchange', this._updateDisabled, this); + this._zoomOutButton = this._createButton('-', 'Zoom out', + zoomName + '-out ' + + partName + ' ' + + partName + '-bottom', + container, this._zoomOut, this); + + map.on('zoomend', this._updateDisabled, this); return container; }, onRemove: function (map) { - map.off('zoomend baselayerchange', this._updateDisabled, this); + map.off('zoomend', this._updateDisabled, this); }, _zoomIn: function (e) { @@ -7234,7 +7333,7 @@ L.Control.Zoom = L.Control.extend({ _updateDisabled: function () { var map = this._map, - className = 'leaflet-disabled'; + className = 'leaflet-control-zoom-disabled'; L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); @@ -7713,12 +7812,9 @@ L.Control.Layers = L.Control.extend({ this._map.addLayer(obj.layer); if (!obj.overlay) { baseLayer = obj.layer; - } else { - this._map.fire('overlayadd', {layer: obj}); } } else if (!input.checked && this._map.hasLayer(obj.layer)) { this._map.removeLayer(obj.layer); - this._map.fire('overlayremove', {layer: obj}); } } @@ -7855,7 +7951,7 @@ L.Map.include({ return this; }, - panBy: function (offset, duration, easeLinearity, moving) { + panBy: function (offset, duration, easeLinearity) { offset = L.point(offset); if (!(offset.x || offset.y)) { @@ -7871,9 +7967,7 @@ L.Map.include({ }, this); } - if (moving !== true) { - this.fire('movestart'); - } + this.fire('movestart'); L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); diff --git a/dist/leaflet.css b/dist/leaflet.css index 2410992d83c..ea3da39071f 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -191,58 +191,37 @@ /* general toolbar styles */ .leaflet-bar { - box-shadow: 0 1px 7px rgba(0,0,0,0.65); - -webkit-border-radius: 4px; - border-radius: 4px; + box-shadow: 0 0 8px rgba(0,0,0,0.4); + border: 1px solid #888; + -webkit-border-radius: 5px; + border-radius: 5px; } -.leaflet-bar a { - background-color: #fff; - border-bottom: 1px solid #ccc; - width: 26px; - height: 26px; - line-height: 26px; - display: block; - text-align: center; - text-decoration: none; - color: black; +.leaflet-bar-part { + background-color: rgba(255, 255, 255, 0.8); + border-bottom: 1px solid #aaa; } -.leaflet-bar a, -.leaflet-control-layers-toggle { - background-position: 50% 50%; - background-repeat: no-repeat; - display: block; - } -.leaflet-bar a:hover { - background-color: #f4f4f4; - } -.leaflet-bar a:first-child { +.leaflet-bar-part-top { -webkit-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } -.leaflet-bar a:last-child { +.leaflet-bar-part-bottom { -webkit-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; border-bottom: none; } -.leaflet-bar a.leaflet-disabled { - cursor: default; - background-color: #f4f4f4; - color: #bbb; - } .leaflet-touch .leaflet-bar { -webkit-border-radius: 10px; border-radius: 10px; } -.leaflet-touch .leaflet-bar a { - width: 30px; - height: 30px; +.leaflet-touch .leaflet-bar-part { + border-bottom: 4px solid rgba(0,0,0,0.3); } -.leaflet-touch .leaflet-bar a:first-child { +.leaflet-touch .leaflet-bar-part-top { -webkit-border-radius: 7px 7px 0 0; border-radius: 7px 7px 0 0; } -.leaflet-touch .leaflet-bar a:last-child { +.leaflet-touch .leaflet-bar-part-bottom { -webkit-border-radius: 0 0 7px 7px; border-radius: 0 0 7px 7px; border-bottom: none; @@ -255,23 +234,48 @@ margin-left: 13px; margin-top: 12px; } +.leaflet-control-zoom a { + width: 22px; + height: 22px; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-control-zoom a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-control-zoom a:hover { + background-color: #fff; + color: #777; + } .leaflet-control-zoom-in { - font: bold 18px 'Lucida Console', Monaco, monospace; + font: bold 18px/24px Arial, Helvetica, sans-serif; } .leaflet-control-zoom-out { - font: bold 22px 'Lucida Console', Monaco, monospace; + font: bold 23px/20px Tahoma, Verdana, sans-serif; + } +.leaflet-control-zoom a.leaflet-control-zoom-disabled { + cursor: default; + background-color: rgba(255, 255, 255, 0.8); + color: #bbb; } +.leaflet-touch .leaflet-control-zoom a { + width: 30px; + height: 30px; + } .leaflet-touch .leaflet-control-zoom-in { - font-size: 22px; - line-height: 30px; + font-size: 24px; + line-height: 29px; } .leaflet-touch .leaflet-control-zoom-out { font-size: 28px; - line-height: 30px; + line-height: 24px; } - /* layers control */ .leaflet-control-layers { diff --git a/dist/leaflet.ie.css b/dist/leaflet.ie.css index 14b84b691e9..b59c8144e6c 100644 --- a/dist/leaflet.ie.css +++ b/dist/leaflet.ie.css @@ -35,6 +35,12 @@ .leaflet-control-layers { border: 3px solid #999; } +.leaflet-control-zoom a { + background-color: #eee; + } +.leaflet-control-zoom a:hover { + background-color: #fff; + } .leaflet-control-layers-toggle { } .leaflet-control-attribution, diff --git a/dist/leaflet.js b/dist/leaflet.js index 82693aab7c0..bdf0b69e213 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -2,7 +2,7 @@ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com (c) 2010-2013, Vladimir Agafonkin, CloudMade */ -(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.6-dev",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return e.__super__=a.prototype,o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h,l,u,c,p,_=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h={action:e,context:i||this},l=i&&i._leaflet_id,l?(u=t[a]+"_idx",c=u+"_len",p=_[u]=_[u]||{},p[l]?p[l].push(h):(p[l]=[h],_[c]=(_[c]||0)+1)):(_[t[a]]=_[t[a]]||[],_[t[a]].push(h));return this},hasEventListeners:function(t){return s in this&&(t in this[s]&&this[s][t].length>0||this[s][t+"_idx_len"]>0)},removeEventListener:function(t,e,i){var o,a,r,h,l,u,c,p,_=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a])){for(u=i&&i._leaflet_id,c=t[a]+"_idx",h=u&&_[c]?_[c][u]||[]:_[t[a]]||[],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);u&&0===h.length&&(p=c+"_len",delete _[c][u],_[p]=(_[p]||1)-1)}return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,o,a,r,h,l=n.Util.extend({type:t,target:this},e);if(this[s][t])for(i=this[s][t].slice(),o=0,a=i.length;a>o;o++)i[o].action.call(i[o].context||this,l);if(r=this[s][t+"_idx"])for(h in r)if(r.hasOwnProperty(h)&&(i=r[h]))for(o=0,a=i.length;a>o;o++)i[o].action.call(i[o].context||this,l);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=o&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,m="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,f=e.documentElement,g=o&&"transition"in f.style,v="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,y="MozPerspective"in f.style,P="OTransition"in f.style,L=!t.L_DISABLE_3D&&(g||v||y||P),w=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in f)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,ielt9:r,webkit:l,android:c,android23:p,chrome:u,ie3d:g,webkit3d:v,gecko3d:y,opera3d:P,any3d:L,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&v,mobileOpera:_&&t.opera,touch:w,msTouch:d,retina:m}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,o){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):t===i||null===t?t:new n.Point(t,e,o)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=e.documentElement,l=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):t===i||null===t?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new n.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var p=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(p),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,p=1e-7,_=c,d=.1;Math.abs(d)>p&&--_>0;)e=h*Math.sin(u),d=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=d;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(n.Browser.ielt9)for(t in e)e.hasOwnProperty(t)&&n.DomUtil.setOpacity(e[t],this.options.opacity);else n.DomUtil.setOpacity(this._container,this.options.opacity);if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l); -this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,n.Browser.ielt9&&this.options.opacity!==i&&n.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof n.Popup?(n.setOptions(t,e),this._popup=t):this._popup=new n.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},hasLayer:function(t){if(!t)return!1;var e=n.stamp(t);return this._layers.hasOwnProperty(e)},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return t instanceof n.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i); -for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var p=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>p&&(o=p,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,p=[1,4,2,8],_=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=_._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=p[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=_._getEdgeIntersection(h,r,u,e),c._code=_._getBitCode(c,e),i.push(c)):(h._code&u&&(c=_._getEdgeIntersection(h,r,u,e),c._code=_._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1)),t=this._latlngs,t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry||o[e].features)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):"click"===e&&n.Browser.android?(r=a,a=function(t){return n.DomEvent._filterClick(t,r)},t.addEventListener(e,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var o=n.DomEvent._lastClick&&t.timeStamp-n.DomEvent._lastClick;return o&&o>100&&400>o?(n.DomEvent.stop(t),i):(n.DomEvent._lastClick=t.timeStamp,e(t))}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),p=u/(e.inertiaDeceleration*r),_=c.multiplyBy(-p/2).round();n.Util.requestAnimFrame(function(){t.panBy(_,p,r,!0)})}e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(d.push(t.pointerId),e=d.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=d.indexOf(t.pointerId);if(-1===e)return;d.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",p=this._touchstart,_=this._touchend,d=[];t[c+p+o]=s,t[c+_+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(p,s,!1),m.addEventListener(_,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=n.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend baselayerchange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend baselayerchange",this._updateDisabled,this) -},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay?this._map.fire("overlayadd",{layer:i}):n=i.layer):!e.checked&&this._map.hasLayer(i.layer)&&(this._map.removeLayer(i.layer),this._map.fire("overlayremove",{layer:i}));n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i,o){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),o!==!0&&this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var s=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,s,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); \ No newline at end of file +(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.5.1",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n+"="+t[n]);return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h[t[a]]=h[t[a]]||[],h[t[a]].push({action:e,context:i||this});return this},hasEventListeners:function(t){return s in this&&t in this[s]&&this[s][t].length>0},removeEventListener:function(t,e,i){var o,a,r,h,l,u=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a]))for(h=u[t[a]],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;for(var i=n.extend({type:t,target:this},e),o=this[s][t].slice(),a=0,r=o.length;r>a;a++)o[a].action.call(o[a].context||this,i);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=navigator.userAgent.toLowerCase(),h=-1!==r.indexOf("webkit"),l=-1!==r.indexOf("chrome"),u=-1!==r.indexOf("android"),c=-1!==r.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,p="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,m=e.documentElement,f=o&&"transition"in m.style,g="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,v="MozPerspective"in m.style,y="OTransition"in m.style,L=!t.L_DISABLE_3D&&(f||g||v||y),P=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in m)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,webkit:h,android:u,android23:c,chrome:l,ie3d:f,webkit3d:g,gecko3d:v,opera3d:y,any3d:L,mobile:_,mobileWebkit:_&&h,mobileWebkit3d:_&&g,mobileOpera:_&&t.opera,touch:P,msTouch:d,retina:p}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,i){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):isNaN(t)?t:new n.Point(t,e,i)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||0,s+=r.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!h||(s+=a.scrollWidth-a.clientWidth,h&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):isNaN(t)?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this._northEast.lat,this._southWest.lng)},getSouthEast:function(){return new n.LatLng(this._southWest.lat,this._northEast.lng)},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){var t=this._southWest,e=this._northEast;return[t.lng,t.lat,e.lng,e.lat].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_updateZoomLevels:function(){var t,e=1/0,n=-1/0;for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var o=this._zoomBoundLayers[t];isNaN(o.options.minZoom)||(e=Math.min(e,o.options.minZoom)),isNaN(o.options.maxZoom)||(n=Math.max(n,o.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e)},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var _=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(_),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,_=1e-7,d=c,p=.1;Math.abs(p)>_&&--d>0;)e=h*Math.sin(u),p=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=p;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){n.DomUtil.setOpacity(this._container,this.options.opacity);var t,e=this._tiles;if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l);this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o) +},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return this._adjustTilePoint(t),n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:this._getZoomForUrl(),x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1)},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){this._adjustTilePoint(t);var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s=e.getElementsByTagName("script"),a=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=s.length;i>t;t++)if(n=s[t].src,o=n.match(a))return n.split(a)[0]+"/images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popup=new n.Popup(e,this).setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer=t.target,t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return(!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u]; +var _=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>_&&(o=_,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,_=[1,4,2,8],d=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=d._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=_[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)):(h._code&u&&(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1))},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry||o[e].features)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),_=u/(e.inertiaDeceleration*r),d=c.multiplyBy(-_/2).round();n.Util.requestAnimFrame(function(){t.panBy(d,_,r)})}t.fire("dragend"),e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(p.push(t.pointerId),e=p.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=p.indexOf(t.pointerId);if(-1===e)return;p.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",_=this._touchstart,d=this._touchend,p=[];t[c+_+o]=s,t[c+d+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(_,s,!1),m.addEventListener(d,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Handler.PolyEdit=n.Handler.extend({options:{icon:new n.DivIcon({iconSize:new n.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"})},initialize:function(t,e){this._poly=t,n.setOptions(this,e)},addHooks:function(){this._poly._map&&(this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){this._poly._map&&(this._poly._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new n.LayerGroup),this._markers=[];var t,e,i,o,s=this._poly._latlngs;for(t=0,i=s.length;i>t;t++)o=this._createMarker(s[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var a,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||n.Polygon&&this._poly instanceof n.Polygon)&&(a=this._markers[e],r=this._markers[t],this._createMiddleMarker(a,r),this._updatePrevNext(a,r))},_createMarker:function(t,e){var i=new n.Marker(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("drag",this._onMarkerDrag,this),i.on("dragend",this._fireEdit,this),this._markerGroup.addLayer(i),i},_fireEdit:function(){this._poly.fire("edit")},_onMarkerDrag:function(t){var e=t.target;n.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw()},_onMarkerClick:function(t){if(!(3>this._poly._latlngs.length)){var e=t.target,i=e._index;this._markerGroup.removeLayer(e),this._markers.splice(i,1),this._poly.spliceLatLngs(i,1),this._updateIndexes(i,-1),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._poly.fire("edit")}},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,n=function(){var n=e._index;a._index=n,a.off("click",i).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._poly.spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e)},o=function(){a.off("dragstart",n,this),a.off("dragend",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){n.call(this),o.call(this),this._poly.fire("edit")},a.on("click",i,this).on("dragstart",n,this).on("dragend",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.latLngToLayerPoint(t.getLatLng()),o=i.latLngToLayerPoint(e.getLatLng());return i.layerPointToLatLng(n._add(o)._divideBy(2))}}),n.Polyline.addInitHook(function(){n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this +},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i="leaflet-bar",o=i+"-part",s=n.DomUtil.create("div",e+" "+i);return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in "+o+" "+o+"-top",s,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out "+o+" "+o+"-bottom",s,this._zoomOut,this),t.on("zoomend",this._updateDisabled,this),s},onRemove:function(t){t.off("zoomend",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-control-zoom-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay||(n=i.layer)):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var o=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,o,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); \ No newline at end of file From e07330e4d11a20224e1e3b6fda1b7f184a2bbfc4 Mon Sep 17 00:00:00 2001 From: jacobtoye Date: Wed, 20 Feb 2013 15:12:42 +1300 Subject: [PATCH 0359/2207] Bring in the master version of Leaflet for this page. + fix typo --- _posts/2013-02-20-guest-post-draw.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/_posts/2013-02-20-guest-post-draw.md b/_posts/2013-02-20-guest-post-draw.md index a8729c4be20..072b619b0d3 100644 --- a/_posts/2013-02-20-guest-post-draw.md +++ b/_posts/2013-02-20-guest-post-draw.md @@ -23,7 +23,7 @@ Leaflet.draw is designed to not only be easy for end users to use, but also for * Draw shapes on your map with easy to use drawing tools. * Edit and delete vectors and markers. - * Super ccustomizable: + * Super customizable: * Customize the styles of each shape to fit in with your maps theme. * Pick and choose the which tools you want to use. * Roll your own by simply using the drawing and editing handlers. @@ -89,11 +89,16 @@ The Leaflet developer community have been great in supporting this plugin throug I've had a great time implementing this plugin. I hope you enjoy using it. If you have a question or just want to say hi, send me an email at jacob.toye@gmail.com. -Cheers, +Cheers, Jacob Toye + - + + + + \ No newline at end of file + diff --git a/index.md b/index.md index 75f62902be1..8bef6b402b2 100644 --- a/index.md +++ b/index.md @@ -2,7 +2,7 @@ layout: default --- -

      January 17, 2013 — Leaflet 0.5 Released — Read More in the Blog

      + Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. From e46de94873b65951673b7b99734329d8f975f77a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 20 Feb 2013 19:19:16 +0200 Subject: [PATCH 0363/2207] add link to Leaflet.draw at the top --- _posts/2013-02-20-guest-post-draw.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2013-02-20-guest-post-draw.md b/_posts/2013-02-20-guest-post-draw.md index 886edea015c..0797fac266e 100644 --- a/_posts/2013-02-20-guest-post-draw.md +++ b/_posts/2013-02-20-guest-post-draw.md @@ -8,7 +8,7 @@ authorsite: https://github.com/jacobtoye/ _This is a guest post from Jacob Toye, an active Leaflet contributor and also the author of the most sophisticated vector drawing and editing plugin out there, which is presented in this post._ -Leaflet.draw was born from the need to provide users with the ability draw polygons on the map. Leaflet already provided a very nice way of editing existing polylines and polygons. The logical next step was to expand on this functionality to allow the creation of these layers, and ultimately the other vector layers. +[Leaflet.draw](https://github.com/Leaflet/Leaflet.draw/) was born from the need to provide users with the ability draw polygons on the map. Leaflet already provided a very nice way of editing existing polylines and polygons. The logical next step was to expand on this functionality to allow the creation of these layers, and ultimately the other vector layers. Upon release the immediate response from the Leaflet community was very positive. It became clear that the next step would be progressing this tool to a state where users could edit and delete shapes in addition to creating them. This is ultimately what Leaflet.draw 0.2 set out to do. From fa26e62a12645461fbef65eccab9f3211909a087 Mon Sep 17 00:00:00 2001 From: Louis Galipeau Date: Fri, 22 Feb 2013 10:11:56 -0400 Subject: [PATCH 0364/2207] Added alternative heatmap layer plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 2531a83d871..27996c7a50c 100644 --- a/plugins.md +++ b/plugins.md @@ -80,6 +80,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Sun Ning + + + heatmap.js + + JavaScript Library for HTML5 canvas based heatmaps + + Patrick Wied + + Leaflet.MultiTileLayer From 31b6d0b81ae8a8f75bcc613e688dba6d3735c293 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Sat, 23 Feb 2013 16:46:52 -0500 Subject: [PATCH 0365/2207] fixed link --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 27996c7a50c..bc3a420f381 100644 --- a/plugins.md +++ b/plugins.md @@ -210,7 +210,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - leaflet-providers + leaflet-providers Contains configurations for various free tile providers — OSM, OpenCycleMap, MapQuest, Mapbox Streets, Stamen, Esri, etc. From 173a5bf00cdea3e542682a6abe818455de5d6220 Mon Sep 17 00:00:00 2001 From: Maxime Hadjinlian Date: Mon, 25 Feb 2013 21:22:08 +0100 Subject: [PATCH 0366/2207] Add leaflet.bouncemarker to plugins page leaflet.bouncemarker make a marker bounce when its added to a map. Signed-off-by: Maxime Hadjinlian --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index bc3a420f381..f3987f907bd 100644 --- a/plugins.md +++ b/plugins.md @@ -152,6 +152,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Calvin Metcalf + + + Leaflet.BounceMarker + + Make a marker bounce when you add it to a map. + + Maxime Hadjinlian + + From 42904288c9aa055aca8fc6bb3e975aaa1750a841 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 26 Feb 2013 18:41:59 +0200 Subject: [PATCH 0367/2207] add package.json for publishing on npm --- package.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 00000000000..97851c72166 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "leaflet", + "version": "0.5.1", + "description": "JavaScript library for mobile-friendly interactive maps", + "dependencies": { + "jshint": "~0.9.1", + "uglify-js": "~2.2.3", + "jake": "latest" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git://github.com/Leaflet/Leaflet.git" + }, + "keywords": ["gis", "map"] +} From 938e8833ef50f93c70670421dc5cef1e5b1b0bb0 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Fri, 1 Mar 2013 14:20:24 -0500 Subject: [PATCH 0368/2207] Auto-link h2s with ids in documentation. --- _layouts/default.html | 12 +++++++ docs/css/screen.css | 21 ++++++++++++ docs/images/sprite.png | Bin 0 -> 2018 bytes docs/images/sprite.svg | 75 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 docs/images/sprite.png create mode 100644 docs/images/sprite.svg diff --git a/_layouts/default.html b/_layouts/default.html index f1fc5cbd940..1f28492dcda 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -167,6 +167,18 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv } })(); + (function () { + var headers = document.getElementsByTagName('h2'); + + for (var i = 0, len = headers.length; i < len; i++) { + if (headers[i].id) { + headers[i].onclick = function() { + window.location.hash = '#' + this.id; + }; + } + } + })(); + hljs.initHighlighting(); diff --git a/docs/css/screen.css b/docs/css/screen.css index 50b6f280849..4dc277ae8fa 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -76,7 +76,28 @@ h2 { -webkit-border-radius: 5px; text-shadow: 0 -1px 1px rgba(0,0,0,0.35); + + cursor: pointer; + } + +h2[id]:before { + content:'Permalink'; + display:inline-block; + margin:0px 5px 0px -35px; + width:30px; + height:20px; + line-height:20px; + vertical-align:baseline; + background:url(../images/sprite.png) -0px -0px no-repeat; + opacity:0.2; + border-radius:50%; + text-indent:-9999px; + border-radius:50%; + overflow:hidden; } + +h2[id]:hover:before { opacity:1; } + .api-page h2 { margin-top: 2.5em; } diff --git a/docs/images/sprite.png b/docs/images/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbb751aad5415c6793f787769768c0e829d402e GIT binary patch literal 2018 zcmeHIiBr=@6kZMmqzXzolq1weLOqCxcyRGz+YcKgY!8H#ZiQOrCn#P-&4-72j<{pin3cnzUUKIW#>j=9h4}++fZd z>g)|97xHwmS%(ofVpm0${1~q*OKKbTRxafrPggA6uii5$PX9)Ng{HCUhx7CED(kyH zf#!#mjFaSiUrtLn(WDfUo^~oJX@(0?ByXAJaU>FZxp})~Mts$nvrXJAI_p4Z(i@AiuC2 zRd++9_2#fP+W|9jO9ly!feVwifJhm;8qD)x%?vd+H&-EpQOPJt=a9}$S&}HbK_H-Z zW*S?b@ZZH($a`LWxHjsky+BAzOnupacxlr)z#J5YdQD@VRum>0goTPvzL+# z@@{V%Xl9MQxcW}dU>zGJk#ZKJ;I&a<1@N1hb=nSQv!!)gAo-wX}G7F}JhoDA?8 zhU(JxNf3u4vhFBpU^b#kI_hN?sHO>dIi-piPKY%5ILNCL2idzoX8hs7^*u%kD(7N{<{5OtI(0dcBP|paDb6F?eGD#}N;ed2BjeWIDsqe^6^{Y4p<8B8V*19rNw!-P za#vby?`> z3Bp4@Z(saSPHMysfX7Sg1;UnVnuZtQEM`>H$jw|!bXqE%{^3&oPzMX+YV}2_C?2~y z(q^(Yv%0pHN$pdplr9}vkKR~|HGMeZa|O-)yb~JDdhFJ8R_1J9QH_VL!)`u&L)(MM z_m2h^Zjx-bf4Ys-niXBj%gg)!5Q*6FJFRS{#E7^GaW@O&WCse#ExBXH z#>RW)iPGaJ91-ER!c3YnRV9n&CpsKxI@=eo8-~Nx@4m867>ASdk@xQ1gH!JH(;8J} zd3iwk?3=9Mpuj+nyLEMQPa}6S+lA&J2WHh#eSq<~j{S>n|B&&2_*c#UZ*!$xwJ4bG U2#RcVhyP;$9SZWP^p5=bPj#3yX#fBK literal 0 HcmV?d00001 diff --git a/docs/images/sprite.svg b/docs/images/sprite.svg new file mode 100644 index 00000000000..847976e6b83 --- /dev/null +++ b/docs/images/sprite.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + From 603fecc6cd26a7e13a61b7219c1410fdc682dca7 Mon Sep 17 00:00:00 2001 From: arthur-e Date: Tue, 5 Mar 2013 18:30:07 -0500 Subject: [PATCH 0369/2207] Added Wicket to the plug-ins list (plugins.md) --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index f3987f907bd..d5ddf4cce85 100644 --- a/plugins.md +++ b/plugins.md @@ -280,6 +280,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Maxime Petazzoni + + + Wicket + + A modest library for translating between Well-Known Text (WKT) and Leaflet geometry objects (e.g. between L.marker() instances and "POINT()" strings). + + K. Arthur Endsley + + From 79a15d7de27c98cc88a4cdb6f0d6c5365691d712 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Wed, 6 Mar 2013 12:14:14 +0100 Subject: [PATCH 0370/2207] Add Leaflet.TextPath plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index f3987f907bd..66075fbced1 100644 --- a/plugins.md +++ b/plugins.md @@ -161,6 +161,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Maxime Hadjinlian + + + Leaflet.TextPath + + Allows you to draw text along Polylines. + + Mathieu Leplatre + + From 5643fb8a9fc85816ac81657c5eb2ab81691d1f78 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Thu, 7 Mar 2013 10:27:10 +0100 Subject: [PATCH 0371/2207] Add Leaflet.Spin plugin --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 2b5427f9259..904e00dbfcd 100644 --- a/plugins.md +++ b/plugins.md @@ -437,6 +437,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Yohan Boniface + + + Leaflet.Spin + + Shows a nice spinner on the map using Spin.js, + for asynchronous data load, like with Leaflet Ajax. + + Mathieu Leplatre + + From badd8742652b18ecd8a9abc5fe6bf48261334d00 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 8 Mar 2013 10:50:56 +0100 Subject: [PATCH 0372/2207] Add Leaflet.LayerIndex plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 904e00dbfcd..4d750df6729 100644 --- a/plugins.md +++ b/plugins.md @@ -512,6 +512,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Calvin Metcalf + + + Leaflet.LayerIndex + + An efficient spatial index for features and layers, using RTree.js. + + Mathieu Leplatre + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From c128d519b312843f41b9ceee87f670c3bdc6b81b Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Wed, 13 Mar 2013 13:43:33 -0400 Subject: [PATCH 0373/2207] moved 2 of my plugins to a joint org --- plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 4d750df6729..fc37d56128d 100644 --- a/plugins.md +++ b/plugins.md @@ -145,7 +145,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - Leaflet.Sprite + Leaflet.Sprite Use sprite based icons in your markers. @@ -505,7 +505,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - Leaflet.CSS + Leaflet.CSS Add the main Leaflet CSS files (or any css) from within JavaScript, be gone conditional comments. From 0b60d9de8f6ad0a2bf735de2d24a07e4f00d8afe Mon Sep 17 00:00:00 2001 From: lvoogdt Date: Sat, 16 Mar 2013 01:25:40 +0100 Subject: [PATCH 0374/2207] Added Awesome-Markers plugin to plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index fc37d56128d..5d88b7c40b2 100644 --- a/plugins.md +++ b/plugins.md @@ -170,6 +170,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet.Awesome-Markers + + Colorful & iconic markers based on the Font Awesome icons. + + Lennard Voogdt + + From b0aaf9df82354e1932bb3a93e6800c4dd5842ce2 Mon Sep 17 00:00:00 2001 From: Alexander Parshin Date: Sun, 17 Mar 2013 06:13:59 +0400 Subject: [PATCH 0375/2207] Misprint in event name --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 2f32b12c70d..6efa00232b0 100644 --- a/reference.html +++ b/reference.html @@ -1614,12 +1614,12 @@

      Events

      tileload - Event + TileEvent Fired when a tile loads. tileunload - Event + TileEvent Fired when a tile is removed (e.g. when you have unloadInvisibleTiles on). From 69b26c0888cc3bd4c87ea9b357667b3a7e6351f2 Mon Sep 17 00:00:00 2001 From: Karsten Hinz Date: Mon, 18 Mar 2013 00:04:15 +0100 Subject: [PATCH 0376/2207] Added control-osm-geocoder plugin to plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5d88b7c40b2..53b4968b8ef 100644 --- a/plugins.md +++ b/plugins.md @@ -400,6 +400,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Stephan Meijer + + + Leaflet Control OSM Geocoder + + A simple geocoder that uses the OpenstreetMap gecoder Nominatim to locate places. + + Karsten Hinz + + leaflet-search From 835d4a57138b5aba479d8895b2ecdbc195968917 Mon Sep 17 00:00:00 2001 From: Scott Fairgrieve Date: Mon, 18 Mar 2013 08:44:50 -0400 Subject: [PATCH 0377/2207] Added link to the Data Visualization Framework --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5d88b7c40b2..6271fbdab9f 100644 --- a/plugins.md +++ b/plugins.md @@ -179,6 +179,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Lennard Voogdt + + + Leaflet Data Visualization Framework + + New markers, layers, and utility classes for easy thematic mapping and data visualization. + + Scott Fairgrieve + + From 8df44d56ee6239b00be20a25df7b616cf5b90cdd Mon Sep 17 00:00:00 2001 From: Lennard Voogdt Date: Tue, 19 Mar 2013 09:25:39 +0100 Subject: [PATCH 0378/2207] AwesomeMarkers works with bootstrap and retina displays --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index e5375698921..dd997908678 100644 --- a/plugins.md +++ b/plugins.md @@ -174,7 +174,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.Awesome-Markers - Colorful & iconic markers based on the Font Awesome icons. + Colorful, iconic & retina-proof markers based on the Font Awesome icons/Twitter Bootstrap icons Lennard Voogdt From bd5963ecc6b317fa504cfa82dd7c206a44a8becf Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Tue, 19 Mar 2013 16:57:55 +0100 Subject: [PATCH 0379/2207] Add Leaflet.RestoreView --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index dd997908678..c4725c6c77e 100644 --- a/plugins.md +++ b/plugins.md @@ -474,6 +474,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet.RestoreView + + Stores and restores map view using localStorage. + + Mathieu Leplatre + + From 350969839d9ae142307b966813426afe89f1188e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 22 Mar 2013 16:25:20 +0200 Subject: [PATCH 0380/2207] update CloudMade register link --- examples/layers-control.md | 2 +- examples/mobile.md | 2 +- examples/quick-start.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/layers-control.md b/examples/layers-control.md index d5c2eeac1be..aea7892311d 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -33,7 +33,7 @@ Leaflet has a nice little control that allows your users control what layers the There are two types of layers --- base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays --- all the other stuff you put over the base layers. In this example, we want to have two base layers (minimal and night-style base map) to switch between, and two overlays to switch on and off --- a pink motorways overlay and city markers (those we created earlier). Lets create those layers and add the default ones to the map: -
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/API-key/{styleId}/256/{z}/{x}/{y}.png',
      +
      var cloudmadeUrl = 'http://{s}.tile.cloudmade.com/API-key/{styleId}/256/{z}/{x}/{y}.png',
       	cloudmadeAttribution = 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2011 CloudMade';
       
       var minimal   = L.tileLayer(cloudmadeUrl, {styleId: 22677, attribution: cloudmadeAttribution}),
      diff --git a/examples/mobile.md b/examples/mobile.md
      index 045be0956ce..b249c2641a1 100644
      --- a/examples/mobile.md
      +++ b/examples/mobile.md
      @@ -32,7 +32,7 @@ We'll now initialize the map in the JavaScript code exactly like we did in the [
       
       
      var map = L.map('map');
       
      -L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
      +L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
       	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
       	maxZoom: 18
       }).addTo(map);
      diff --git a/examples/quick-start.md b/examples/quick-start.md index 02aad6a1b47..bdff33c8704 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -52,9 +52,9 @@ By default (as we didn't pass any options when creating the map instance), all m Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. -Next we'll add a tile layer to add to our map, in this case it's a CloudMade tile layer with Fresh style. Creating a tile layer usually involves setting the URL template for the tile images (get yours at [CloudMade](http://cloudmade.com/register)), the attribution text and the maximum zoom level of the layer: +Next we'll add a tile layer to add to our map, in this case it's a CloudMade tile layer with Fresh style. Creating a tile layer usually involves setting the URL template for the tile images (get yours at [CloudMade](http://account.cloudmade.com/register)), the attribution text and the maximum zoom level of the layer: -
      L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
      +
      L.tileLayer('http://{s}.tile.cloudmade.com/API-key/997/256/{z}/{x}/{y}.png', {
       	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
       	maxZoom: 18
       }).addTo(map);
      From b25d89dcf999359e5e16151b2587786d5f4898a1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 22 Mar 2013 16:25:28 +0200 Subject: [PATCH 0381/2207] update CloudMade API key --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 1f28492dcda..07db2917e39 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -45,7 +45,7 @@ 'CC-BY-SA, ' + 'Imagery © CloudMade'; - CM_URL = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png'; + CM_URL = 'http://{s}.tile.cloudmade.com/d4fc77ea4a63471cab2423e66626cbb6/{styleId}/256/{z}/{x}/{y}.png'; OSM_URL = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; OSM_ATTRIB = '© OpenStreetMap contributors'; From 91b02675699bbc205490fdbbd151f619eaf4742b Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Thu, 28 Mar 2013 12:55:06 -0400 Subject: [PATCH 0382/2207] Add leaflet-pip --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index c4725c6c77e..3ea4006615b 100644 --- a/plugins.md +++ b/plugins.md @@ -557,6 +557,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet-pip + + Simple point in polygon calculation using point-in-polygon. + + Tom MacWright + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From dbb66404cfc6f930e7bf5788253fafa3f2defa9e Mon Sep 17 00:00:00 2001 From: Ilya Zverev Date: Fri, 29 Mar 2013 14:03:25 +0400 Subject: [PATCH 0383/2207] TileLayer.Grayscale for plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 3ea4006615b..ae46897e6cb 100644 --- a/plugins.md +++ b/plugins.md @@ -188,6 +188,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Scott Fairgrieve + + + TileLayer.Grayscale + + A regular TileLayer with grayscale makeover. + + Ilya Zverev + + From c8c76e3a8fbda1871002df58ac99079447e38d7a Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Wed, 3 Apr 2013 17:56:02 +0300 Subject: [PATCH 0384/2207] Add Leaflet.FileLayer plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index ae46897e6cb..aa9129adf41 100644 --- a/plugins.md +++ b/plugins.md @@ -492,6 +492,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet.FileLayer + + Loads files (GeoJSON, GPX, KML) into the map using the HTML5 FileReader API (i.e. locally without server). + + Mathieu Leplatre + + From 5c00606a1da309b19aa44394a7277f2dc5b13656 Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 11 Apr 2013 13:50:05 +0300 Subject: [PATCH 0385/2207] Fixed typo reference.html You = Use --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index cf2c7eff4c6..1d4df11bebd 100644 --- a/reference.html +++ b/reference.html @@ -1121,7 +1121,7 @@

      Options

      zIndexOffset Number 0 - By default, marker images zIndex is set automatically based on its latitude. You this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). + By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). opacity From 5ba1fd53a889badb50bfb336084eff1c8f170974 Mon Sep 17 00:00:00 2001 From: Glen Robertson Date: Mon, 15 Apr 2013 14:17:50 +1200 Subject: [PATCH 0386/2207] Added GeoJSON tile layer to plugins. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index aa9129adf41..528a6d27383 100644 --- a/plugins.md +++ b/plugins.md @@ -197,6 +197,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Ilya Zverev + + + TileLayer.GeoJSON + + A TileLayer for GeoJSON tiles (requires JQuery). + + Glen Robertson + + From 8a357ad7f33f8a4630b3e976b1b3abb18f811371 Mon Sep 17 00:00:00 2001 From: Alexander Parshin Date: Tue, 16 Apr 2013 23:37:16 +0400 Subject: [PATCH 0387/2207] Extend description of L.TileLayer.Canvas --- reference.html | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/reference.html b/reference.html index 1d4df11bebd..15a1774f0ca 100644 --- a/reference.html +++ b/reference.html @@ -1838,6 +1838,22 @@

      Constructor

      +

      Options

      + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      asyncBooleanfalseIndicates that tiles will be drawn asynchronously. tileDrawn method should be called for each tile after drawing completion.
      +

      Methods

      @@ -1846,7 +1862,7 @@

      Methods

      - + - - - - + + + +
      Returns Description
      drawTile( <HTMLCanvasElement> canvas, <Point> tilePoint, @@ -1855,10 +1871,10 @@

      Methods

      this You need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom.
      redraw()thisCalling redraw will cause the drawTile method to be called for all tiles. May be used for updating dynamic content drawn on the Canvas
      tileDrawn( <HTMLCanvasElement> canvas )-If async option is defined, this function should be called for each tile after drawing completion. canvas is the same canvas element, that was passed to drawTile.
      From 33b44332fc08b340e9343a9ea1a431f3a6471177 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 23 Apr 2013 12:21:49 +0300 Subject: [PATCH 0388/2207] make subdomain in url template description clearer, close #1441 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 15a1774f0ca..eee31c26a43 100644 --- a/reference.html +++ b/reference.html @@ -1498,7 +1498,7 @@

      URL template

      'http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png'
      -

      {s} means one of the randomly chosen subdomains (their range is specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

      +

      {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

      You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

      From a2e120285ee6b7ec2d0f6b1eae4aa43a29f67da9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 23 Apr 2013 12:24:50 +0300 Subject: [PATCH 0389/2207] disable permalink icon on all h2 headers except on API page --- docs/css/screen.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 4dc277ae8fa..afa4cf71150 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -80,7 +80,7 @@ h2 { cursor: pointer; } -h2[id]:before { +.api-page h2[id]:before { content:'Permalink'; display:inline-block; margin:0px 5px 0px -35px; @@ -96,7 +96,7 @@ h2[id]:before { overflow:hidden; } -h2[id]:hover:before { opacity:1; } +.api-page h2[id]:hover:before { opacity:1; } .api-page h2 { margin-top: 2.5em; From 9245ceeb2214eb36e86f038bff5da69e98136441 Mon Sep 17 00:00:00 2001 From: danzel Date: Mon, 29 Apr 2013 10:24:10 +1200 Subject: [PATCH 0390/2207] Mention that the baselayerchange event is fired on the map object. Fixes #1625 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index eee31c26a43..dd81658d80e 100644 --- a/reference.html +++ b/reference.html @@ -4003,7 +4003,7 @@

      Layer Config

      Events

      -

      You can subscribe to the following events using these methods.

      +

      You can subscribe to the following events on the map object using these methods.

      From 3608f5c0d9a813f75ef8b5b8c8e50cba33ee0cdc Mon Sep 17 00:00:00 2001 From: Dominik Moritz Date: Wed, 1 May 2013 12:27:43 +0300 Subject: [PATCH 0391/2207] Link to actual heatmap.js for Leaflet page Also note that the implementation in heatmap.js supports large datasets. --- plugins.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 528a6d27383..3434a0c96e0 100644 --- a/plugins.md +++ b/plugins.md @@ -82,9 +82,11 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s From 410bc4b86e56b1270e03fc56748f2ed77c8ac7a1 Mon Sep 17 00:00:00 2001 From: Didji Date: Fri, 3 May 2013 12:44:49 +0300 Subject: [PATCH 0392/2207] Update reference.html ie7 property's description in Browser section was "true for Internet Explorer 6." instead of "true for Internet Explorer 7." --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index dd81658d80e..2e7b9290ddd 100644 --- a/reference.html +++ b/reference.html @@ -4557,7 +4557,7 @@

      L.Browser

      - + From 2f6bcc358bb056976c5e4f70d14f4e70be6230c6 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 3 May 2013 12:52:25 +0300 Subject: [PATCH 0393/2207] Add Leaflet.GeometryUtil plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 3434a0c96e0..8a8e82278e1 100644 --- a/plugins.md +++ b/plugins.md @@ -595,6 +595,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Tom MacWright + + +
      - heatmap.js + heatmap.js - JavaScript Library for HTML5 canvas based heatmaps + JavaScript Library for HTML5 canvas based heatmaps. + + Its Leaflet layer implementation supports large datasets because it is tile based and uses a quadtree index to store the data. Patrick Wied
      ie7 Booleantrue for Internet Explorer 6.true for Internet Explorer 7.
      webkit
      + Leaflet.GeometryUtil + + A collection of utilities for Leaflet geometries (linear referencing, etc.) + + Benjamin Becquet, Mathieu Leplatre +
      To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From fc9d767789042b8361802d7129d45ad319c05859 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 3 May 2013 12:55:35 +0300 Subject: [PATCH 0394/2207] Add Leaflet.Snap plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 3434a0c96e0..e5e75579361 100644 --- a/plugins.md +++ b/plugins.md @@ -512,6 +512,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet.Snap + + Enable snapping between layers. + + Mathieu Leplatre + + From 5e34ca6ea23e88286339e24f0f6f435f928cdd18 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 3 May 2013 13:04:24 +0300 Subject: [PATCH 0395/2207] Clearer description of Leaflet.Snap purpose Thanks @mourner! --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index e5e75579361..53e4ed54416 100644 --- a/plugins.md +++ b/plugins.md @@ -516,7 +516,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.Snap - Enable snapping between layers. + Enables snapping of draggable markers to polylines and other layers. Mathieu Leplatre From 7edc17d2facc2a04576e7b8075c11a3f03564dcb Mon Sep 17 00:00:00 2001 From: Dan Dascalescu Date: Fri, 3 May 2013 19:43:12 -0700 Subject: [PATCH 0396/2207] Fix some typos and link to the locate method --- reference.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference.html b/reference.html index 2e7b9290ddd..4053d5fd5b9 100644 --- a/reference.html +++ b/reference.html @@ -532,12 +532,12 @@

      Events

      locationfound LocationEvent - Fired when geolocation (using locate method) went successfully. + Fired when geolocation (using the locate method) went successfully. locationerror ErrorEvent - Fired when geolocation (using locate method) failed. + Fired when geolocation (using the locate method) failed. popupopen @@ -633,12 +633,12 @@

      Methods for Modifying Map State

      this Restricts the map view to the given bounds (see map maxBounds option). - + locate( <Locate options> options? ) this - Tries to locate the user using Geolocation API, firing locationfound event with location data on success or locationerror event on failure, and optionally sets the map view to the user location with respect to detection accuracy (or to the world view if geolocation failed). See Locate options for more details. + Tries to locate the user using the Geolocation API, firing a locationfound event with location data on success or a locationerror event on failure, and optionally sets the map view to the user's location with respect to detection accuracy (or to the world view if geolocation failed). See Locate options for more details. stopLocate() From 9efded6f509932c73ebc85bae56e1df657574447 Mon Sep 17 00:00:00 2001 From: Dan Dascalescu Date: Fri, 3 May 2013 19:56:43 -0700 Subject: [PATCH 0397/2207] Improve documentation for geocoding plugins Will create a separate patch for grouping geocoding plugins together. --- plugins.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins.md b/plugins.md index a2ce04f2f20..506d77073fc 100644 --- a/plugins.md +++ b/plugins.md @@ -423,8 +423,8 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet GeoSearch - Small plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      - Comes with support for Google, Bing, Esri and Openlayers. (easy extendible) + Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      + Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Eeasily extensible. Stephan Meijer @@ -433,7 +433,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet Control OSM Geocoder - A simple geocoder that uses the OpenstreetMap gecoder Nominatim to locate places. + A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. Karsten Hinz From 5e0a4b59e61ce9e89142ae4a7ae2ec96373f8689 Mon Sep 17 00:00:00 2001 From: Dan Dascalescu Date: Sat, 4 May 2013 02:34:41 -0700 Subject: [PATCH 0398/2207] Proposing grouping geocoding plugins under one heading --- plugins.md | 67 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/plugins.md b/plugins.md index 506d77073fc..dbf7b4d696b 100644 --- a/plugins.md +++ b/plugins.md @@ -282,15 +282,6 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s AZGS - - - Leaflet Control Bing Geocoder - - A simple geocoder control that uses Bing to locate places. - - Samuel Piquet - - Leaflet.encoded @@ -339,6 +330,45 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s +### Geocoding (address lookup, a.k.a. geosearching) + + + + + + + + + + + + + + + + +
      PluginDescriptionMaintainer
      + Leaflet GeoSearch + + Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      + Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Eeasily extensible. +
      + Stephan Meijer +
      + Leaflet Control OSM Geocoder + + A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. + + Karsten Hinz +
      + Leaflet Control Bing Geocoder + + A simple geocoder control that uses Bing to locate places. + + Samuel Piquet +
      + + ### Controls and Interaction @@ -419,25 +449,6 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bruno B - - - - - - @@ -1076,7 +1075,6 @@

      Constructor

      @@ -1097,7 +1095,7 @@

      Options

      - + @@ -1345,7 +1343,6 @@

      Constructor

      @@ -1484,7 +1481,6 @@

      Constructor

      @@ -1735,7 +1731,6 @@

      Constructor

      @@ -1831,7 +1826,6 @@

      Constructor

      <TileLayer options> options? ) @@ -1906,7 +1900,6 @@

      Constructor

      @@ -2219,7 +2212,6 @@

      Constructor

      @@ -2321,7 +2313,6 @@

      Constructor

      @@ -2352,7 +2343,6 @@

      Constructor

      @@ -2383,7 +2373,6 @@

      Constructor

      @@ -2420,7 +2409,6 @@

      Constructor

      @@ -2471,7 +2459,6 @@

      Constructor

      @@ -2536,7 +2523,6 @@

      Constructor

      @@ -2594,7 +2580,6 @@

      Constructor

      @@ -2678,7 +2663,6 @@

      Constructor

      @@ -2812,7 +2796,6 @@

      Constructor

      @@ -2961,7 +2944,6 @@

      Constructor

      @@ -3092,7 +3074,6 @@

      Constructor

      @@ -3104,7 +3085,6 @@

      Constructor

      <LatLng[]> latlngs ) @@ -3255,7 +3235,6 @@

      Constructor

      @@ -3386,7 +3365,6 @@

      Constructor

      @@ -3399,7 +3377,6 @@

      Constructor

      @@ -3521,7 +3498,6 @@

      Constructor

      @@ -3615,7 +3591,6 @@

      Constructor

      @@ -3677,7 +3652,6 @@

      Constructor

      @@ -3784,7 +3758,6 @@

      Constructor

      @@ -3827,7 +3800,6 @@

      Constructor

      @@ -3918,7 +3890,6 @@

      Constructor

      <Control.Layers options> options? ) @@ -4038,7 +4009,6 @@

      Constructor

      From 3a801666f4de9c5fd82264bebf21a90e26f6fc81 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Tue, 7 May 2013 16:00:56 -0400 Subject: [PATCH 0400/2207] more consistancy --- reference.html | 440 ++++++++++++++++++++----------------------------- 1 file changed, 175 insertions(+), 265 deletions(-) diff --git a/reference.html b/reference.html index a86d0c5d13f..16553138323 100644 --- a/reference.html +++ b/reference.html @@ -9,7 +9,7 @@

      Map

      @@ -125,7 +125,7 @@

      Misc


      This reference reflects Leaflet 0.5. You can find docs for the in-progress master version in reference.html of gh-pages-master branch.

      -

      L.Map

      +

      L.map

      The central class of the API — it is used to create a map on a page and manipulate it.

      @@ -137,24 +137,20 @@

      Usage example

      zoom: 13 }); -

      Constructor

      +

      Creation

      - Leaflet GeoSearch - - Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      - Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Eeasily extensible. -
      - Stephan Meijer -
      - Leaflet Control OSM Geocoder - - A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. - - Karsten Hinz -
      leaflet-search From 43147f84aa4bc4185d06b6df95fa7840fa8b3b05 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Tue, 7 May 2013 12:44:29 -0400 Subject: [PATCH 0399/2207] per #1430 no new in documentation --- reference.html | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/reference.html b/reference.html index 4053d5fd5b9..a86d0c5d13f 100644 --- a/reference.html +++ b/reference.html @@ -152,7 +152,6 @@

      Constructor

      - new L.Map()
      L.map()
      - new L.Marker()
      L.marker()
      icon L.Icon *Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default.Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to L.icon.Default() by default.
      clickable - new L.Popup()
      L.popup()
      - new L.TileLayer()
      L.tileLayer()
      - new L.TileLayer.WMS()
      L.tileLayer.wms()
      - new L.TileLayer.Canvas()
      L.tileLayer.canvas()
      Instantiates a Canvas tile layer object given an options object (optionally). - new L.ImageOverlay()
      L.imageOverlay()
      - new L.Polyline()
      L.polyline()
      - new L.MultiPolyline()
      L.multiPolyline()
      - new L.Polygon()
      L.polygon()
      - new L.MultiPolygon()
      L.multiPolygon()
      - new L.Rectangle()
      L.rectangle()
      - new L.Circle()
      L.circle()
      - new L.CircleMarker()
      L.circleMarker()
      - new L.LayerGroup()
      L.layerGroup()
      - new L.FeatureGroup()
      L.featureGroup()
      - new L.GeoJSON()
      L.geoJson()
      - new L.LatLng()
      L.latLng()
      L.latLng([])
      - new L.LatLngBounds()
      L.latLngBounds()
      L.latLngBounds([])
      - new L.LatLngBounds()
      L.latLngBounds()
      Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds. - new L.Point()
      L.point()
      L.point([])
      - new L.Bounds()
      L.bounds()
      L.bounds([])
      - new L.Bounds()
      L.bounds()
      - new L.Icon()
      L.icon()
      - new L.DivIcon()
      L.divIcon()
      - new L.Control()
      L.control()
      - new L.Control.Zoom()
      L.control.zoom()
      - new L.Control.Attribution()
      L.control.attribution()
      - new L.Control.Layers()
      L.control.layers()
      Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. - new L.Control.Scale()
      L.control.scale()
      - - + - - - +
      ConstructorUsageCreation Description
      L.Map( + L.map( <HTMLElement|String> id, <Map options> options? ) - L.map() - Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.
      @@ -1054,30 +1050,26 @@

      Map Panes

      -

      L.Marker

      +

      L.marker

      Used to put markers on the map.

      L.marker([50.5, 30.5]).addTo(map);
      -

      Constructor

      +

      Creation

      - - + + - - -
      ConstructorUsageCreationDescription
      L.Marker( + L.marker( <LatLng> latlng, <Marker options> options? ) - L.marker() - Instantiates a Marker object given a geographical point and optionally an options object.
      @@ -1093,7 +1085,7 @@

      Options

      icon - L.Icon + L.icon * Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to L.icon.Default() by default. @@ -1314,7 +1306,7 @@

      Interaction handlers

      - +

      Used to open popups in certain places of the map. Use Map#openPopup to open popups while making sure that only one popup is open at one time (recommended for usability), or use Map#addLayer to open as many as you want.

      @@ -1328,23 +1320,20 @@

      Usage example

      .setContent('<p>Hello world!<br />This is a nice popup.</p>') .openOn(map);
      -

      Constructor

      +

      Creation

      - - + + - - @@ -1455,7 +1444,7 @@

      Methods

      -

      L.TileLayer

      +

      L.tileLayer

      Used to load and display tile layers on the map, implements ILayer interface.

      @@ -1466,23 +1455,20 @@

      Usage example

      styleId: 997 }).addTo(map); -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.Popup( + L.popup( <Popup options> options?, <object> source? ) - L.popup() - Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers.
      - - + + - - @@ -1703,7 +1689,7 @@

      Methods

      -

      L.TileLayer.WMS

      +

      L.tileLayer.wms

      Used to display WMS services as tile layers on the map. Extends TileLayer.

      @@ -1716,23 +1702,19 @@

      Usage example

      attribution: "Weather data © 2012 IEM Nexrad" }); -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.TileLayer( + L.tileLayer( <String> urlTemplate, <TileLayer options> options? ) - L.tileLayer() - Instantiates a tile layer object given a URL template and optionally an options object.
      - - + + - - - + @@ -1800,7 +1782,7 @@

      Methods

      ConstructorUsageCreationDescription
      L.TileLayer.WMS( + L.tileLayer.wms( <String> baseUrl, <TileLayer.WMS options> options ) - - L.tileLayer.wms() - Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
      -

      L.TileLayer.Canvas

      +

      L.tileLayer.canvas

      Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer.

      @@ -1813,21 +1795,19 @@

      Usage example

      // draw something on the tile canvas }
      -

      Constructor

      +

      Creation

      - - + + - - +
      ConstructorUsageCreationDescription
      L.TileLayer.Canvas( + L.tileLayer.canvas( <TileLayer options> options? ) - L.tileLayer.canvas() - Instantiates a Canvas tile layer object given an options object (optionally).
      @@ -1873,7 +1853,7 @@

      Methods

      -

      L.ImageOverlay

      +

      L.imageOverlay

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      @@ -1884,12 +1864,12 @@

      Usage example

      L.imageOverlay(imageUrl, imageBounds).addTo(map);
      -

      Constructor

      +

      Creation

      - - + + @@ -1899,9 +1879,6 @@

      Constructor

      <ImageOverlay options> options? ) - @@ -1959,7 +1936,7 @@

      Methods

      ConstructorUsageCreationDescription
      - L.imageOverlay() - Instantiates an image overlay object given the URL of the image and the geographical bounds it is tied to.
      -

      L.Path

      +

      L.path

      An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly.

      Options

      @@ -2186,7 +2163,7 @@

      Static properties

      -

      L.Polyline

      +

      L.polyline

      A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      @@ -2197,23 +2174,20 @@

      Usage example

      // zoom the map to the polyline map.fitBounds(polyline.getBounds());

      -

      Constructor

      +

      Creation

      - - + + - - @@ -2294,16 +2268,16 @@

      Methods

      -

      L.MultiPolyline

      +

      L.multiPolyline

      Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

      -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.Polyline( + L.polyline( <LatLng[]> latlngs, <Polyline options> options? ) - L.polyline() - Instantiates a polyline object given an array of geographical points and optionally an options object.
      - - + + @@ -2312,9 +2286,7 @@

      Constructor

      <Polyline options> options? ) - + @@ -2322,29 +2294,26 @@

      Constructor

      -

      L.Polygon

      +

      L.polygon

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      - L.multiPolyline() - Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      - - + + - - @@ -2354,33 +2323,30 @@

      Constructor

      -

      L.MultiPolygon

      +

      L.multiPolygon

      Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

      -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.Polygon( + L.polygon( <LatLng[]> latlngs, <Polyline options> options? ) - L.polygon() - Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.
      - - + + - -
      ConstructorUsageCreationDescription
      L.MultiPolygon( + L.multiPolygon( <LatLng[][]> latlngs, <Polyline options> options? ) - L.multiPolygon() - Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
      -

      L.Rectangle

      +

      L.rectangle

      A class for drawing rectangle overlays on a map. Extends Polygon. Use Map#addLayer to add it to the map.

      @@ -2394,23 +2360,20 @@

      Usage example

      // zoom the map to the rectangle bounds map.fitBounds(bounds);
      -

      Constructor

      +

      Creation

      - - + + - - @@ -2437,30 +2400,27 @@

      Methods

      ConstructorUsageCreationDescription
      L.Rectangle( + L.rectangle( <LatLngBounds> bounds, <Path options> options? ) - L.rectangle() - Instantiates a rectangle object with the given geographical bounds and optionally an options object.
      -

      L.Circle

      +

      L.circle

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      L.circle([50.5, 30.5], 200).addTo(map);
      -

      Constructor

      +

      Creation

      - - + + - - @@ -2504,28 +2464,25 @@

      Methods

      -

      L.CircleMarker

      +

      L.circleMarker

      A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

      -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.Circle( + L.circle( <LatLng> latlng, <Number> radius, <Path options> options? ) - L.circle() - Instantiates a circle object given a geographical point, a radius in meters and optionally an options object.
      - - + + - - - +
      ConstructorUsageCreationDescription
      L.CircleMarker( + L.circleMarker( <LatLng> latlng, <Path options> options? ) - L.circleMarker() - Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.
      @@ -2558,7 +2515,7 @@

      Methods

      -

      L.LayerGroup

      +

      L.layerGroup

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      @@ -2566,12 +2523,11 @@

      L.LayerGroup

      .addLayer(polyline) .addTo(map);
      -

      Constructor

      +

      Creation

      - - + @@ -2579,9 +2535,6 @@

      Constructor

      <ILayer[]> layers? ) - @@ -2640,31 +2593,29 @@

      Methods

      -

      L.FeatureGroup

      +

      L.featureGroup

      -

      Extended LayerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      +

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
       	.on('click', function() { alert('Clicked on a group!'); })
       	.addTo(map);
      -

      Constructor

      +

      Creation

      ConstructorUsageCreation Description
      - L.layerGroup() - Create a layer group, optionally given an initial set of layers.
      - - + + - - + @@ -2672,7 +2623,7 @@

      Constructor

      Methods

      -

      Has all LayerGroup methods and additionally:

      +

      Has all layerGroup methods and additionally:

      ConstructorUsageCreationDescription
      L.FeatureGroup( + L.featureGroup( <ILayer[]> layers? ) - L.featureGroup() - Create a layer group, optionally given an initial set of layers.
      @@ -2766,7 +2717,7 @@

      Events

      -

      L.GeoJSON

      +

      L.geoJson

      Represents a GeoJSON layer. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

      @@ -2781,24 +2732,19 @@

      L.GeoJSON

      Each feature layer created by it gets a feature property that links to the GeoJSON feature data the layer was created from (so that you can access its properties later).

      -

      Constructor

      +

      Creation

      - - + - - -
      ConstructorUsageCreation Description
      L.GeoJSON( + L.geoJson( <Object> geojson?, <GeoJSON options> options? ) - L.geoJson() - Creates a GeoJSON layer. Optionally accepts an object in GeoJSON format to display on the map (you can alternatively add it later with addData method) and an options object.
      @@ -2919,35 +2865,31 @@

      Static methods

      -

      L.LatLng

      +

      L.latLng

      Represents a geographical point with a certain latitude and longitude.

      -
      var latlng = new L.LatLng(50.5, 30.5);
      +
      var latlng = L.latLng(50.5, 30.5);

      All Leaflet methods that accept LatLng objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      map.panTo([50, 30]);
      -map.panTo(new L.LatLng(50, 30));
      +map.panTo(L.latLng(50, 30));
      -

      Constructor

      +

      Creation

      - - + + - - - +
      ConstructorUsageCreationDescription
      L.LatLng( + L.latLng( <Number> latitude, <Number> longitude ) - L.latLng()
      - L.latLng([]) -
      Creates an object representing a geographical point with the given latitude and longitude.
      @@ -3044,12 +2986,12 @@

      Constants

      -

      L.LatLngBounds

      +

      L.latLngBounds

      Represents a rectangular geographical area on a map.

      -
      var southWest = new L.LatLng(40.712, -74.227),
      -	northEast = new L.LatLng(40.774, -74.125),
      -	bounds = new L.LatLngBounds(southWest, northEast);
      +
      var southWest = L.latLng(40.712, -74.227),
      +	northEast = L.latLng(40.774, -74.125),
      +	bounds = L.latLngBounds(southWest, northEast);

      All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      @@ -3058,35 +3000,29 @@

      L.LatLngBounds

      [40.774, -74.125] ]);
      -

      Constructor

      +

      Creation

      - - + - + - + - - +
      ConstructorUsageCreation Description
      - L.LatLngBounds( + L.latLngBounds( <LatLng> southWest, <LatLng> northEast ) - L.latLngBounds()
      - L.latLngBounds([]) -
      Creates a LatLngBounds object by defining south-west and north-east corners of the rectangle.Creates a latLngBounds object by defining south-west and north-east corners of the rectangle.
      L.LatLngBounds( + L.latLngBounds( <LatLng[]> latlngs ) - L.latLngBounds() - Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
      @@ -3209,35 +3145,31 @@

      Methods

      -

      L.Point

      +

      L.point

      Represents a point with x and y coordinates in pixels.

      -
      var point = new L.Point(200, 300);
      +
      var point = L.point(200, 300);

      All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      map.panBy([200, 300]);
      -map.panBy(new L.Point(200, 300));
      +map.panBy( L.point(200, 300));
      -

      Constructor

      +

      Creation

      - + - - @@ -3339,46 +3271,40 @@

      Methods

      -

      L.Bounds

      +

      L.bounds

      Represents a rectangular area in pixel coordinates.

      -
      var p1 = new L.Point(10, 10),
      -	p2 = new L.Point(40, 60),
      -	bounds = new L.Bounds(p1, p2);
      +
      var p1 = L.point(10, 10),
      +	p2 = L.point(40, 60),
      +	bounds = L.bounds(p1, p2);

      All Leaflet methods that accept Bounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this:

      otherBounds.intersects([[10, 10], [40, 60]]);
      -

      Constructor

      +

      Creation

      ConstructorCreation Usage Description
      L.Point( + L.point( <Number> x, <Number> y, <Boolean> round? ) - L.point()
      - L.point([]) -
      Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
      - - + + - - - - + @@ -3464,7 +3390,7 @@

      Methods

      ConstructorUsageCreationDescription
      L.Bounds( + L.bounds( <Point> topLeft, <Point> bottomRight ) - L.bounds()
      - L.bounds([]) -
      Creates a Bounds object from two coordinates (usually top-left and bottom-right corners).
      L.Bounds( + L.bounds( <Point[]> points ) - L.bounds() - Creates a Bounds object defined by the points it contains.
      -

      L.Icon

      +

      L.icon

      Represents an icon to provide when creating a marker.

      @@ -3484,23 +3410,20 @@

      L.Icon

      L.Icon.Default extends L.Icon and is the blue icon Leaflet uses for markers by default.

      -

      Constructor

      +

      Creation

      - - + + - - - +
      ConstructorUsageCreationDescription
      L.Icon( + L.icon( <Icon options> options ) - L.icon() - Creates an icon instance with the given options.
      @@ -3566,7 +3489,7 @@

      Options

      -

      L.DivIcon

      +

      L.divIcon

      Represents a lightweight icon for markers that uses a simple div element instead of an image.

      @@ -3577,22 +3500,20 @@

      L.DivIcon

      By default, it has a 'leaflet-div-icon' class and is styled as a little white square with a shadow.

      -

      Constructor

      +

      Creation

      - - + + - - + @@ -3631,7 +3552,7 @@

      Options

      -

      L.Control

      +

      L.control

      The base class for all Leaflet controls. Implements IControl interface. You can add controls to the map like this:

      @@ -3639,21 +3560,19 @@

      L.Control

      // the same as map.addControl(control); -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.DivIcon( + L.divIcon( <DivIcon options> options ) - L.divIcon() - Creates a div icon instance with the given options.
      - - + + - - + @@ -3741,25 +3660,22 @@

      Control Positions

      ConstructorUsageCreationDescription
      L.Control( + L.control( <Control options> options? ) - L.control() - Creates a control with the given options.
      -

      L.Control.Zoom

      +

      L.control.zoom

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      -

      Constructor

      +

      Creation

      - - + + - - @@ -3783,25 +3699,23 @@

      Options

      -

      L.Control.Attribution

      +

      L.control.attribution

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.Control.Zoom( + L.control.zoom( <Control.Zoom options> options? ) - L.control.zoom() - Creates a zoom control.
      - - + + - - + @@ -3860,7 +3774,7 @@

      Methods

      ConstructorUsageCreationDescription
      L.Control.Attribution( + L.control.attribution( <Control.Attribution options> options? ) - L.control.attribution() - Creates an attribution control.
      -

      L.Control.Layers

      +

      L.control.layers

      The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

      @@ -3876,22 +3790,20 @@

      L.Control.Layers

      L.control.layers(baseLayers, overlays).addTo(map);
      -

      Constructor

      +

      Creation

      - - + + - - +
      ConstructorUsageCreationDescription
      L.Control.Layers( + L.control.layers( <Layer Config> baseLayers?, <Layer Config> overlays?, <Control.Layers options> options? ) - L.control.layers() - Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes.
      @@ -3990,27 +3902,25 @@

      Events

      -

      L.Control.Scale

      +

      L.control.scale

      A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Implements IControl interface.

      L.control.scale().addTo(map);
      -

      Constructor

      +

      Creation

      - - + + - - + @@ -4730,16 +4640,16 @@

      L.Transformation

      Represents an affine transformation: a set of coefficients a, b, c, d for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing the reverse. Used by Leaflet in its projections code.

      var transformation = new L.Transformation(2, 5, -1, 10),
      -	p = new L.Point(1, 2),
      -	p2 = transformation.transform(p), // new L.Point(7, 8)
      -	p3 = transformation.untransform(p2); // new L.Point(1, 2)
      +	p = L.point(1, 2),
      +	p2 = transformation.transform(p), //  L.point(7, 8)
      +	p3 = transformation.untransform(p2); //  L.point(1, 2)
       
      -

      Constructor

      +

      Creation

      ConstructorUsageCreationDescription
      L.Control.Scale( + L.control.scale( <Control.Scale options> options? ) - L.control.scale() - Creates an scale control with the given options.
      - + @@ -5143,11 +5053,11 @@

      L.PosAnimation

      var fx = new L.PosAnimation();
       fx.run(el, [300, 500], 0.5);
      -

      Constructor

      +

      Creation

      ConstructorCreation Usage Description
      - + @@ -5220,11 +5130,11 @@

      L.Draggable

      draggable.enable(); -

      Constructor

      +

      Creation

      ConstructorCreation Usage Description
      - + From 407733fdb5a62175d1c5d5b5349eece78f2aa41f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 8 May 2013 13:17:55 +0300 Subject: [PATCH 0401/2207] update heading on plugins page, #1649 --- plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index dbf7b4d696b..186a0c55a7c 100644 --- a/plugins.md +++ b/plugins.md @@ -85,7 +85,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s heatmap.js
      ConstructorCreation Usage Description
      JavaScript Library for HTML5 canvas based heatmaps. - + Its Leaflet layer implementation supports large datasets because it is tile based and uses a quadtree index to store the data. Patrick Wied @@ -330,7 +330,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -### Geocoding (address lookup, a.k.a. geosearching) +### Geocoding (Address Lookup) From f9ebcf5fd06177c546dc09200ee981951c4655aa Mon Sep 17 00:00:00 2001 From: yarik ponomarenko Date: Thu, 9 May 2013 16:07:56 +0300 Subject: [PATCH 0402/2207] HTMLElement was indicated as allowable type of content in L.Popup.setContent() In accordance with https://github.com/Leaflet/Leaflet/issues/9 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 6efa00232b0..55963020ac9 100644 --- a/reference.html +++ b/reference.html @@ -1423,7 +1423,7 @@

      Methods

      From 59f8bfe1c1ffb9c0f44ce1da65793dc4afe57840 Mon Sep 17 00:00:00 2001 From: dwilhelm89 Date: Mon, 20 May 2013 22:50:55 +0200 Subject: [PATCH 0403/2207] Added Time Slider plugin to dynamically add/remove layers --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 186a0c55a7c..ce2adbdb35e 100644 --- a/plugins.md +++ b/plugins.md @@ -532,6 +532,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + +
      setContent( - <String> htmlContent ) + <String|HTMLElement> htmlContent ) this
      + Leaflet Time-Slider + + The Leaflet Time-Slider enables you to dynamically add and remove Markers on a map by using a JQuery UI slider + + Dennis Wilhelm +
      From a16dd5cd559a98becac8ead8f19d5e6b37e97f22 Mon Sep 17 00:00:00 2001 From: Ardhi Lukianto Date: Tue, 21 May 2013 15:45:05 +0700 Subject: [PATCH 0404/2207] Add Leaflet.MousePosition control --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index ce2adbdb35e..b9d98e7a631 100644 --- a/plugins.md +++ b/plugins.md @@ -541,6 +541,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Dennis Wilhelm + + + Leaflet MousePosition Control + + A decent MousePosition control for Leaflet + + Ardhi Lukianto + + From 9de1b8d8d6c0391f2e5f9c1dc763c4666da57844 Mon Sep 17 00:00:00 2001 From: Ardhi Lukianto Date: Tue, 21 May 2013 15:45:59 +0700 Subject: [PATCH 0405/2207] Update plugins.md --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b9d98e7a631..597b31e1ab7 100644 --- a/plugins.md +++ b/plugins.md @@ -543,7 +543,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - Leaflet MousePosition Control + Leaflet.MousePosition A decent MousePosition control for Leaflet From 2e3e36260906fb06a01163d76d5d670a9c1c5ba6 Mon Sep 17 00:00:00 2001 From: stefano cudini Date: Wed, 22 May 2013 00:04:42 +0200 Subject: [PATCH 0406/2207] update description L.Control.Search in plugins page --- plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index ce2adbdb35e..328eccb0a42 100644 --- a/plugins.md +++ b/plugins.md @@ -453,9 +453,9 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s leaflet-search - Simple Leaflet Control for searching markers by attribute. + A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service - Stefano Cudini + Stefano Cudini From 1ee249dbec5f1a79ddff7cb43edc963b49545f1b Mon Sep 17 00:00:00 2001 From: Ardhi Lukianto Date: Wed, 22 May 2013 07:11:05 +0700 Subject: [PATCH 0407/2207] Update description --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 597b31e1ab7..85086e90b71 100644 --- a/plugins.md +++ b/plugins.md @@ -545,7 +545,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.MousePosition - A decent MousePosition control for Leaflet + A simple MousePosition control that displays geographic coordinates of the mouse pointer, as it is moved about the map Ardhi Lukianto From cc113ff778f971eadc026bef36669fad99a517f1 Mon Sep 17 00:00:00 2001 From: Michael Dougherty Date: Tue, 28 May 2013 15:18:19 -0600 Subject: [PATCH 0408/2207] added 'overlayadd' and 'overlayremove' descriptions (closes #1709) --- reference.html | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 4053d5fd5b9..d2c6b0b47a8 100644 --- a/reference.html +++ b/reference.html @@ -527,7 +527,17 @@

      Events

      baselayerchange LayerEvent - Fired when the base layer is changed through the layer control. + Fired when the base layer is changed through the layer control. + + + overlayadd + LayerEvent + Fired when an overlay is selected through the layer control. + + + overlayremove + LayerEvent + Fired when an overlay is deselected through the layer control. locationfound @@ -4016,6 +4026,16 @@

      Events

      LayerEvent Fired when the base layer is changed through the control. + + overlayadd + LayerEvent + Fired when an overlay is selected through the control. + + + overlayremove + LayerEvent + Fired when an overlay is deselected through the control. + From e44da8691b609846d64b81043289bdd4f2928a10 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 29 May 2013 01:23:44 -0300 Subject: [PATCH 0409/2207] Fix typo in noConflict section --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 4053d5fd5b9..8717fce1789 100644 --- a/reference.html +++ b/reference.html @@ -5725,7 +5725,7 @@

      Global Switches

      L.noConflict()

      -

      This method restores the L global variale to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      +

      This method restores the L global variable to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      // L points to some other library
       ...
      
      From 918b57e95bf2e5714341f4630d3c386ba664f845 Mon Sep 17 00:00:00 2001
      From: Yohan Boniface 
      Date: Wed, 29 May 2013 12:59:26 +0200
      Subject: [PATCH 0410/2207] Add Leaflet.RevealOSM plugin
      
      ---
       plugins.md | 9 +++++++++
       1 file changed, 9 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index 328eccb0a42..8ace55465f3 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -541,6 +541,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
       			Dennis Wilhelm
       		
       	
      +	
      +		
      +			Leaflet.RevealOSM
      +		
      +			Very simple but extendable Leaflet plugin to display OSM POIs data on map click.
      +		
      +			Yohan Boniface
      +		
      +	
       
       
       
      
      From c4c37a40c0cf6468cd46972b0c81d6c79b5152b0 Mon Sep 17 00:00:00 2001
      From: Yohan Boniface 
      Date: Wed, 29 May 2013 13:00:53 +0200
      Subject: [PATCH 0411/2207] Add Leaflet.i18n plugin
      
      ---
       plugins.md | 9 +++++++++
       1 file changed, 9 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index 8ace55465f3..49e874073bd 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -642,6 +642,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
       			Benjamin Becquet, Mathieu Leplatre
       		
       	
      +	
      +		
      +			Leaflet.i18n
      +		
      +			Internationalization for Leaflet plugins.
      +		
      +			Yohan Boniface
      +		
      +	
       
       
       To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file).
      
      From 9643e0b2d6a9a3294b927552ca9db74728706c6b Mon Sep 17 00:00:00 2001
      From: Steve 
      Date: Thu, 30 May 2013 13:08:55 -0300
      Subject: [PATCH 0412/2207] Fix wrong word (Number instead of Point) in
       closestPointonSegment
      
      Issue #1720
      ---
       reference.html | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/reference.html b/reference.html
      index 5a2ab7ca0d8..3002d7ab363 100644
      --- a/reference.html
      +++ b/reference.html
      @@ -4882,7 +4882,7 @@ 

      Methods

      <Point> p2 )
      - Number + Point Returns the closest point from a point p on a segment p1 to p2. From 95cb21af57607e9dfa69c4f1e8026e115a64e8f3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 4 Jun 2013 14:37:02 +0300 Subject: [PATCH 0413/2207] fix jekyll 1.0 config --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index fb96b8041a7..dbbd68f211a 100644 --- a/_config.yml +++ b/_config.yml @@ -1,4 +1,4 @@ -exclude: build, debug, node_modules, spec, src, CNAME, Jakefile.js, reference-tpl.html, CHANGELOG.md, README.md, LICENSE, DOCS-TODO.md +exclude: [build, debug, node_modules, spec, src, CNAME, Jakefile.js, reference-tpl.html, CHANGELOG.md, README.md, LICENSE, DOCS-TODO.md] markdown: kramdown From 9e1f3bdc20f9df5337390260762fa2352c52100a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 4 Jun 2013 15:15:50 +0300 Subject: [PATCH 0414/2207] rename section titles; rename creation column to factory --- reference.html | 218 ++++++++++++++++++++++++------------------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/reference.html b/reference.html index a89808db0ec..8ae779137ef 100644 --- a/reference.html +++ b/reference.html @@ -125,7 +125,7 @@

      Misc


      This reference reflects Leaflet 0.5. You can find docs for the in-progress master version in reference.html of gh-pages-master branch.

      -

      L.map

      +

      Map

      The central class of the API — it is used to create a map on a page and manipulate it.

      @@ -141,7 +141,7 @@

      Creation

      - + @@ -150,7 +150,7 @@

      Creation

      <Map options> options? ) - +
      CreationFactory Description
      Instantiates a map object given a div element (or its id) and optionally an object literal with map options described below.
      @@ -1060,7 +1060,7 @@

      Map Panes

      -

      L.marker

      +

      Marker

      Used to put markers on the map.

      @@ -1070,8 +1070,8 @@

      Creation

      - - + + @@ -1095,9 +1095,9 @@

      Options

      - + - + @@ -1316,7 +1316,7 @@

      Interaction handlers

      - +

      Used to open popups in certain places of the map. Use Map#openPopup to open popups while making sure that only one popup is open at one time (recommended for usability), or use Map#addLayer to open as many as you want.

      @@ -1334,8 +1334,8 @@

      Creation

      CreationFactoryDescription
      iconL.iconL.Icon *Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to L.icon.Default() by default.Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default.
      clickable
      - - + + @@ -1454,7 +1454,7 @@

      Methods

      -

      L.tileLayer

      +

      TileLayer

      Used to load and display tile layers on the map, implements ILayer interface.

      @@ -1469,8 +1469,8 @@

      Creation

      CreationFactoryDescription
      - - + + @@ -1699,7 +1699,7 @@

      Methods

      -

      L.tileLayer.wms

      +

      TileLayer.WMS

      Used to display WMS services as tile layers on the map. Extends TileLayer.

      @@ -1716,7 +1716,7 @@

      Creation

      CreationFactoryDescription
      - + @@ -1724,7 +1724,7 @@

      Creation

      @@ -1792,7 +1792,7 @@

      Methods

      CreationFactory Description
      L.tileLayer.wms( <String> baseUrl, <TileLayer.WMS options> options ) - + Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
      -

      L.tileLayer.canvas

      +

      TileLayer.Canvas

      Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer.

      @@ -1809,15 +1809,15 @@

      Creation

      - - + + - +
      CreationFactoryDescription
      L.tileLayer.canvas( <TileLayer options> options? ) Instantiates a Canvas tile layer object given an options object (optionally).
      @@ -1863,7 +1863,7 @@

      Methods

      -

      L.imageOverlay

      +

      ImageOverlay

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      @@ -1878,8 +1878,8 @@

      Creation

      - - + + @@ -1946,7 +1946,7 @@

      Methods

      CreationFactoryDescription
      -

      L.path

      +

      Path

      An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly.

      Options

      @@ -2173,7 +2173,7 @@

      Static properties

      -

      L.polyline

      +

      Polyline

      A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      @@ -2188,8 +2188,8 @@

      Creation

      - - + + @@ -2278,7 +2278,7 @@

      Methods

      -

      L.multiPolyline

      +

      MultiPolyline

      Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

      @@ -2286,17 +2286,17 @@

      Creation

      CreationFactoryDescription
      - - + + - - + @@ -2304,7 +2304,7 @@

      Creation

      -

      L.polygon

      +

      Polygon

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      @@ -2314,8 +2314,8 @@

      Creation

      CreationFactoryDescription
      L.MultiPolyline( + L.multiPolyline( <LatLng[][]> latlngs, <Polyline options> options? ) Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      - - + + @@ -2333,7 +2333,7 @@

      Creation

      -

      L.multiPolygon

      +

      MultiPolygon

      Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

      @@ -2341,8 +2341,8 @@

      Creation

      CreationFactoryDescription
      - - + + @@ -2356,7 +2356,7 @@

      Creation

      CreationFactoryDescription
      -

      L.rectangle

      +

      Rectangle

      A class for drawing rectangle overlays on a map. Extends Polygon. Use Map#addLayer to add it to the map.

      @@ -2374,7 +2374,7 @@

      Creation

      - + @@ -2410,7 +2410,7 @@

      Methods

      CreationFactory Description
      -

      L.circle

      +

      Circle

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      @@ -2420,8 +2420,8 @@

      Creation

      - - + + @@ -2474,7 +2474,7 @@

      Methods

      -

      L.circleMarker

      +

      CircleMarker

      A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

      @@ -2482,8 +2482,8 @@

      Creation

      CreationFactoryDescription
      - - + + @@ -2492,7 +2492,7 @@

      Creation

      <Path options> options? ) - +
      CreationFactoryDescription
      Instantiates a circle marker given a geographical point and optionally an options object. The default radius is 10 and can be altered by passing a "radius" member in the path options object.
      @@ -2525,7 +2525,7 @@

      Methods

      -

      L.layerGroup

      +

      LayerGroup

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      @@ -2537,7 +2537,7 @@

      Creation

      - + @@ -2603,7 +2603,7 @@

      Methods

      -

      L.featureGroup

      +

      FeatureGroup

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      @@ -2616,8 +2616,8 @@

      Creation

      CreationFactory Description
      - - + + @@ -2625,7 +2625,7 @@

      Creation

      <ILayer[]> layers? ) - + @@ -2727,7 +2727,7 @@

      Events

      CreationFactoryDescription
      Create a layer group, optionally given an initial set of layers.
      -

      L.geoJson

      +

      GeoJson

      Represents a GeoJSON layer. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

      @@ -2746,7 +2746,7 @@

      Creation

      - + @@ -2875,7 +2875,7 @@

      Static methods

      -

      L.latLng

      +

      LatLng

      Represents a geographical point with a certain latitude and longitude.

      var latlng = L.latLng(50.5, 30.5);
      @@ -2889,8 +2889,8 @@

      Creation

      CreationFactory Description
      - - + + @@ -2899,7 +2899,7 @@

      Creation

      <Number> longitude ) - +
      CreationFactoryDescription
      Creates an object representing a geographical point with the given latitude and longitude.
      @@ -2996,7 +2996,7 @@

      Constants

      -

      L.latLngBounds

      +

      LatLngBounds

      Represents a rectangular geographical area on a map.

      var southWest = L.latLng(40.712, -74.227),
      @@ -3014,7 +3014,7 @@ 

      Creation

      - + @@ -3024,7 +3024,7 @@

      Creation

      <LatLng> northEast ) - + @@ -3032,7 +3032,7 @@

      Creation

      - +
      CreationFactory Description
      Creates a latLngBounds object by defining south-west and north-east corners of the rectangle.
      L.latLngBounds( <LatLng[]> latlngs ) Creates a LatLngBounds object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with fitBounds.
      @@ -3155,7 +3155,7 @@

      Methods

      -

      L.point

      +

      Point

      Represents a point with x and y coordinates in pixels.

      @@ -3170,7 +3170,7 @@

      Creation

      - + @@ -3281,7 +3281,7 @@

      Methods

      -

      L.bounds

      +

      Bounds

      Represents a rectangular area in pixel coordinates.

      var p1 = L.point(10, 10),
      @@ -3296,7 +3296,7 @@ 

      Creation

      CreationFactory Usage Description
      - + @@ -3314,7 +3314,7 @@

      Creation

      <Point[]> points )
      - + @@ -3400,7 +3400,7 @@

      Methods

      CreationFactory Description
      Creates a Bounds object defined by the points it contains.
      -

      L.icon

      +

      Icon

      Represents an icon to provide when creating a marker.

      @@ -3424,8 +3424,8 @@

      Creation

      - - + + @@ -3433,7 +3433,7 @@

      Creation

      <Icon options> options ) - +
      CreationFactoryDescription
      Creates an icon instance with the given options.
      @@ -3499,7 +3499,7 @@

      Options

      -

      L.divIcon

      +

      DivIcon

      Represents a lightweight icon for markers that uses a simple div element instead of an image.

      @@ -3514,8 +3514,8 @@

      Creation

      - - + + @@ -3523,7 +3523,7 @@

      Creation

      <DivIcon options> options ) - + @@ -3562,7 +3562,7 @@

      Options

      -

      L.control

      +

      Control

      The base class for all Leaflet controls. Implements IControl interface. You can add controls to the map like this:

      @@ -3573,8 +3573,8 @@

      L.control

      Creation

      CreationFactoryDescription
      Creates a div icon instance with the given options.
      - - + + @@ -3582,7 +3582,7 @@

      Creation

      <Control options> options? ) - + @@ -3670,14 +3670,14 @@

      Control Positions

      CreationFactoryDescription
      Creates a control with the given options.
      -

      L.control.zoom

      +

      Control.zoom

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      Creation

      - + @@ -3709,14 +3709,14 @@

      Options

      -

      L.control.attribution

      +

      Control.Attribution

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      Creation

      CreationFactory Description
      - + @@ -3725,7 +3725,7 @@

      Creation

      <Control.Attribution options> options? ) - + @@ -3784,7 +3784,7 @@

      Methods

      CreationFactory Description
      Creates an attribution control.
      -

      L.control.layers

      +

      Control.Layers

      The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the detailed example). Extends Control.

      @@ -3803,8 +3803,8 @@

      L.control.layers

      Creation

      - - + + @@ -3813,7 +3813,7 @@

      Creation

      <Layer Config> overlays?, <Control.Layers options> options? ) - +
      CreationFactoryDescription
      Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes.
      @@ -3922,7 +3922,7 @@

      Events

      -

      L.control.scale

      +

      Control.Scale

      A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Implements IControl interface.

      @@ -3931,8 +3931,8 @@

      L.control.scale

      Creation

      - - + + @@ -3940,7 +3940,7 @@

      Creation

      <Control.Scale options> options? ) - + @@ -4275,7 +4275,7 @@ -

      L.Class

      +

      Class

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      @@ -4430,7 +4430,7 @@

      Constructor Hooks

      MyClass.addInitHook('methodName', arg1, arg2, …);
      -

      L.Browser

      +

      Browser

      A namespace with properties for browser/feature detection used by Leaflet internally.

      @@ -4522,7 +4522,7 @@

      L.Browser

      CreationFactoryDescription
      Creates an scale control with the given options.
      -

      L.Util

      +

      Util

      Various utility functions, used by Leaflet internally.

      @@ -4655,7 +4655,7 @@

      Properties

      -

      L.Transformation

      +

      Transformation

      Represents an affine transformation: a set of coefficients a, b, c, d for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing the reverse. Used by Leaflet in its projections code.

      @@ -4669,7 +4669,7 @@

      Creation

      - + @@ -4722,7 +4722,7 @@

      Methods

      -

      L.LineUtil

      +

      LineUtil

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      @@ -4781,7 +4781,7 @@

      Methods

      -

      L.PolyUtil

      +

      PolyUtil

      Various utility functions for polygon geometries.

      @@ -4808,7 +4808,7 @@

      Methods

      -

      L.DomEvent

      +

      DomEvent

      Utility functions to work with the DOM events, used by Leaflet internally.

      @@ -4900,7 +4900,7 @@

      Methods

      -

      L.DomUtil

      +

      DomUtil

      Utility functions to work with the DOM tree, used by Leaflet internally.

      @@ -5066,7 +5066,7 @@

      Properties

      -

      L.PosAnimation

      +

      PosAnimation

      Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

      @@ -5077,7 +5077,7 @@

      Creation

      CreationFactory Usage Description
      - + @@ -5142,7 +5142,7 @@

      Events

      -

      L.Draggable

      +

      Draggable

      A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging.

      @@ -5154,7 +5154,7 @@

      Creation

      CreationFactory Usage Description
      - + @@ -5623,7 +5623,7 @@

      Global Switches

      CreationFactory Usage Description
      -

      L.noConflict()

      +

      noConflict

      This method restores the L global variable to the original value it had before Leaflet inclusion, and returns the real Leaflet namespace so you can put it elsewhere, like this:

      @@ -5635,7 +5635,7 @@

      L.noConflict()

      // now L points to that other library again, and you can use Leaflet.Map etc.
      -

      L.version

      +

      version

      A constant that represents the Leaflet version in use.

      From 18e0061450a4b1602822ba3f6c7950fd1ef07688 Mon Sep 17 00:00:00 2001 From: vogdb Date: Tue, 4 Jun 2013 17:46:57 +0400 Subject: [PATCH 0415/2207] Add Leaflet.SelectLayers plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 13f42428fef..f77d186c7ba 100644 --- a/plugins.md +++ b/plugins.md @@ -559,6 +559,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Ardhi Lukianto + + + Leaflet.SelectLayers + + a Leaflet plugin which adds new control to switch between different layers on the map. New control replaces L.Control.Layers radio button panel with select tag. + + vogdb + + From 7e080fa263c33388de9d2fcc21d82a2d46e75746 Mon Sep 17 00:00:00 2001 From: Felix Bache Date: Tue, 4 Jun 2013 22:44:52 +0200 Subject: [PATCH 0416/2207] Add Leaflet.Coordinates plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 49e874073bd..efdd0e04fa7 100644 --- a/plugins.md +++ b/plugins.md @@ -550,6 +550,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Yohan Boniface + + + Leaflet.Coordinates + + A simple Leaflet plugin viewing the mouse LatLng-coordinates. Also views a marker with coordinate popup on userinput. + + Felix Bache + + From ace70493e5359e38f1d1f2aa15b0c344d89481cc Mon Sep 17 00:00:00 2001 From: Felix Bache Date: Tue, 4 Jun 2013 22:44:52 +0200 Subject: [PATCH 0417/2207] Add Leaflet.Coordinates plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index f77d186c7ba..dd8de2d0ef4 100644 --- a/plugins.md +++ b/plugins.md @@ -568,6 +568,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s vogdb + + + Leaflet.Coordinates + + A simple Leaflet plugin viewing the mouse LatLng-coordinates. Also views a marker with coordinate popup on userinput. + + Felix Bache + + From 0e2c75e982e66b62e6dfa115268427cc31007dec Mon Sep 17 00:00:00 2001 From: Andrey Geonya Date: Thu, 6 Jun 2013 18:55:01 +0300 Subject: [PATCH 0418/2207] Update reference.html --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 3002d7ab363..4da1952677e 100644 --- a/reference.html +++ b/reference.html @@ -2397,7 +2397,7 @@

      Constructor

      L.multiPolygon() - Instantiates a multi-polyline object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline). + Instantiates a multi-polygon object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline). From d2ecc7b96c2d160751aa055e15612ad41d3f023f Mon Sep 17 00:00:00 2001 From: Felix Bache Date: Tue, 18 Jun 2013 19:59:47 +0200 Subject: [PATCH 0419/2207] Add Leaflet.Elevation plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index dd8de2d0ef4..46108531820 100644 --- a/plugins.md +++ b/plugins.md @@ -577,6 +577,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Felix Bache + + + Leaflet.Elevation + + A Leaflet plugin to a interactive height profiles of GeoJSON lines using d3. + + Felix Bache + + From b4b26bdd6a2d7576b75aec4f64e80b34e03fb84f Mon Sep 17 00:00:00 2001 From: Felix Bache Date: Tue, 18 Jun 2013 20:04:38 +0200 Subject: [PATCH 0420/2207] Typo fixed --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 46108531820..171823059eb 100644 --- a/plugins.md +++ b/plugins.md @@ -581,7 +581,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.Elevation - A Leaflet plugin to a interactive height profiles of GeoJSON lines using d3. + A Leaflet plugin to view interactive height profiles of GeoJSON lines using d3. Felix Bache From c308bc1ce4b3886aa950f36ec726b17f14163666 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Sandvik?= Date: Thu, 20 Jun 2013 02:20:25 +0200 Subject: [PATCH 0421/2207] Added zoomify plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 171823059eb..75efde2d9d7 100644 --- a/plugins.md +++ b/plugins.md @@ -208,6 +208,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Glen Robertson + + + TileLayer.Zoomify + + A TileLayer for Zoomify images. + + Bjørn Sandvik + + From 88e5124e54168584deaf4bf0e3724362037759e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Sandvik?= Date: Fri, 21 Jun 2013 18:58:42 +0200 Subject: [PATCH 0422/2207] Added Leaflet.Sync plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 75efde2d9d7..b04426930f4 100644 --- a/plugins.md +++ b/plugins.md @@ -595,6 +595,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Felix Bache + + + Leaflet.Sync + + Synchronized view of two maps. + + Bjørn Sandvik + + From 728ddb82d4cee27468c68a77880c80941618a371 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Mon, 24 Jun 2013 13:32:56 -0400 Subject: [PATCH 0423/2207] Fixes #1741 - adds documentation for setLatLngs + getLatLngs for Multi* --- reference.html | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/reference.html b/reference.html index 41af9619681..8992598892c 100644 --- a/reference.html +++ b/reference.html @@ -2278,6 +2278,37 @@

      Constructor

      +

      Methods

      + +

      MultiPolylines accept all Polyline methods but +have different behavior around their coordinate contents since they can contain +multiple line features:

      + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setLatLngs( + <LatLng[][]> latlngs ) + thisReplace all lines and their paths with the given array of arrays of + geographical points.
      getLatLngs()<LatLng[][]> latlngs + Returns an array of arrays of geographical points in each line.
      + +

      L.Polygon

      @@ -2339,6 +2370,36 @@

      Constructor

      +

      Methods

      + +

      MultiPolygons accept all Polyline methods but +have different behavior around their coordinate contents since they can contain +multiple polygon features:

      + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setLatLngs( + <LatLng[][]> latlngs ) + thisReplace all polygons and their paths with the given array of arrays of + geographical points.
      getLatLngs()<LatLng[][]> latlngs + Returns an array of arrays of geographical points in each polygon.
      +

      L.Rectangle

      A class for drawing rectangle overlays on a map. Extends Polygon. Use Map#addLayer to add it to the map.

      From f3b4fb5469e91e166a2dc6f2fff77d42ad799233 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 25 Jun 2013 10:14:11 -0400 Subject: [PATCH 0424/2207] fix facebook like button misposition --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 07db2917e39..708a736ad0f 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -67,7 +67,7 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv - +
      -

      This reference reflects Leaflet 0.5. You can find docs for the in-progress master version in reference.html of gh-pages-master branch.

      +

      This reference reflects Leaflet 0.6.
      +Docs for the previous stable version (0.5) are available in the source form (see instructions for running docs).

      L.Map

      From 951addabcd071067a49eaef442e218ab47e254cd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 09:08:40 -0400 Subject: [PATCH 0430/2207] finish 0.6 docs --- reference.html | 132 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 92 insertions(+), 40 deletions(-) diff --git a/reference.html b/reference.html index a21dbf886f0..b2d358c2454 100644 --- a/reference.html +++ b/reference.html @@ -398,6 +398,12 @@

      Animation options

      depends Whether the tile zoom animation is enabled. By default it's enabled in all browsers that support CSS3 Transitions except Android. + + zoomAnimationThreshold + Number + 4 + Won't animate zoom if the zoom difference exceeds this value. + markerZoomAnimation Boolean @@ -602,51 +608,63 @@

      Methods for Modifying Map State

      setView( <LatLng> center, <Number> zoom, - <Boolean> forceReset? ) + <zoom/pan options> options? ) this - Sets the view of the map (geographical center and zoom). If forceReset is set to true, the map is reloaded even if it's eligible for pan or zoom animation (false by default). + Sets the view of the map (geographical center and zoom) with the given animation options. setZoom( - <Number> zoom ) + <Number> zoom, + <zoom options> options? ) this Sets the zoom of the map. - zoomIn( <Number> delta? ) + zoomIn( + <Number> delta?, + <zoom options> options? ) + this Increases the zoom of the map by delta (1 by default). - zoomOut( <Number> delta? ) + zoomOut( + <Number> delta?, + <zoom options> options? ) + this Decreases the zoom of the map by delta (1 by default). setZoomAround( <LatLng> latlng, - <Number> zoom ) + <Number> zoom, + <zoom options> options? ) this Zooms the map while keeping a specified point on the map stationary (e.g. used internally for scroll zoom and double-click zoom). fitBounds( - <LatLngBounds> bounds ) + <LatLngBounds> bounds, + <fitBounds options> options? ) this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. - fitWorld() + fitWorld( + <fitBounds options> options? ) + this Sets a map view that mostly contains the whole world with the maximum zoom level possible. panTo( - <LatLng> latlng ) + <LatLng> latlng, + <pan options> options? ) this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. @@ -660,17 +678,19 @@

      Methods for Modifying Map State

      panBy( - <Point> point ) + <Point> point, + <pan options> options? ) this Pans the map by a given number of pixels (animated). invalidateSize( - <Boolean> animate? ) + <Boolean> options?, + <zoom/pan options> options? ) this - Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically. If animate is true, map animates the update. + Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. setMaxBounds( @@ -1011,7 +1031,7 @@

      Locate options

      -

      zoom/pan options

      +

      Zoom/pan options

      @@ -1026,6 +1046,12 @@

      zoom/pan options

      + + + + + + @@ -1033,14 +1059,14 @@

      zoom/pan options

      - - - - + + + +
      false If true, the map view will be completely reset (without any animations).
      panpan options-Sets the options for the panning (without the zoom change) if it occurs.
      zoom zoom options Sets the options for the zoom change if it occurs.
      zoomzoom options-Sets the options for the panning (without the zoom change) if it occurs.animateBoolean-An equivalent of passing animate to both zoom and pan options (see below).
      -

      zoom/pan options

      +

      Pan options

      @@ -1050,26 +1076,51 @@

      zoom/pan options

      - + + + + + + + + + + + + + + + + + + + - + +
      Description
      resetanimateBoolean-If true, panning will always be animated if possible. If false, it will not animate panning, either resetting the map view if panning more than a screen away, or just setting a new offset for the map pane (except for `panBy` which always does the latter).
      durationNumber0.25Duration of animated panning.
      easeLinearityNumber0.25The curvature factor of panning animation easing (third parameter of the Cubic Bezier curve). 1.0 means linear animation, the less the more bowed the curve.
      noMoveStart Boolean falseIf true, the map view will be completely reset (without any animations).If true, panning won't fire movestart event on start (used internally for panning inertia).
      + +

      Zoom options

      + + - - - - + + + + - - + + - +
      zoomzoom options-Sets the options for the zoom change if it occurs.OptionTypeDefaultDescription
      zoomzoom optionsanimateBoolean -Sets the options for the panning (without the zoom change) if it occurs.If not specified, zoom animation will happen if the zoom origin is inside the current view. If true, the map will attempt animating zoom disregarding where zoom origin is. Setting false will make it always reset the view completely without animation.
      -

      zoom/pan options

      +

      fitBounds options

      + +

      The same as zoom/pan options and additionally:

      @@ -1079,25 +1130,26 @@

      zoom/pan options

      - - - - + + + - - - - + + + - - - - + + +
      Description
      resetBooleanfalseIf true, the map view will be completely reset (without any animations).paddingTopLeftPoint[0, 0] + Sets the amount of padding in the top left corner of a map container that shouldn't be accounted for when setting the view to fit bounds. Useful if you have some control overlays on the map like a sidebar and you don't want them to obscure objects you're zooming to.
      zoomzoom options-Sets the options for the zoom change if it occurs.paddingBottomRightPoint[0, 0] + The same for bottom right corner of the map.
      zoomzoom options-Sets the options for the panning (without the zoom change) if it occurs.paddingPoint[0, 0] + Equivalent of setting both top left and bottom right padding to the same value.
      +

      Properties

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      From f1342d32ef5467c4565518d15798ad6d613af4a2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 09:13:19 -0400 Subject: [PATCH 0431/2207] update download links --- download.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/download.md b/download.md index 9fe078d6a59..a11958cdf68 100644 --- a/download.md +++ b/download.md @@ -13,15 +13,15 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.5.1 - Stable version, released on January 17, 2013 and last updated on February 6, 2013 + Leaflet 0.6 + Stable version, released on June 26, 2013 - Leaflet 0.4.5 - Previous stable version, released on July 30, 2012 and last updated on October 25, 2012 + Leaflet 0.5.1 + Previous stable version, released on January 17, 2013 and last updated on February 6, 2013 - Leaflet master + Leaflet master In-progress version, developed on the master branch @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source @@ -50,9 +50,7 @@ Leaflet build system is powered by the [Node.js](http://nodejs.org) platform and 2. Run the following commands in the command line:
      npm install -g jake
      -npm install jshint
      -npm install uglify-js
      -
      +npm install
      Now that you have everything installed, run `jake` inside the Leaflet directory. This will check Leaflet source files for JavaScript errors and inconsistencies, and then combine and compress it to the `dist` folder. From 524d32179bbdd76d809792664a931f1f6487cff4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 11:01:43 -0400 Subject: [PATCH 0432/2207] post title fixes (capitalized) --- ...2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md | 2 +- _posts/2013-02-20-guest-post-draw.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md b/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md index c044b56786b..d5ea237ed50 100644 --- a/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md +++ b/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md @@ -1,6 +1,6 @@ --- layout: post -title: Leaflet 0.4.5 bugfix release and plans for 0.5 +title: Leaflet 0.4.5 Bugfix Release and Plans for 0.5 description: Leaflet 0.4.5 released, containing a small but important zoom animation bugfix for upcoming Chrome 23+ (currently beta) and IE10. Work on future 0.5 release goes on! author: Vladimir Agafonkin authorsite: http://agafonkin.com/en diff --git a/_posts/2013-02-20-guest-post-draw.md b/_posts/2013-02-20-guest-post-draw.md index 0797fac266e..9a0587813c0 100644 --- a/_posts/2013-02-20-guest-post-draw.md +++ b/_posts/2013-02-20-guest-post-draw.md @@ -1,6 +1,6 @@ --- layout: post -title: Leaflet.draw 0.2 released +title: Leaflet.draw 0.2 Released description: Leaflet.draw 0.2 released — brings vector drawing and editing tools to your Leaflet map. author: Jacob Toye authorsite: https://github.com/jacobtoye/ From 08b66c7f5fe9f767d5f614c88648b9232c62d2d8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 11:05:57 -0400 Subject: [PATCH 0433/2207] website updates, release blog post --- ...flet-0-6-released-dc-code-sprint-mapbox.md | 24 +++++++++++++++++++ features.html | 2 +- index.md | 8 +++---- 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 _posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md new file mode 100644 index 00000000000..ff1712bc6fa --- /dev/null +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -0,0 +1,24 @@ +--- +layout: post +title: Leaflet 0.6 Released, Code Sprint in DC with MapBox +description: Leaflet 0.6 released — with nicer controls, better usability and tons of API improvements and various bugfixes — more than 120 changes! The first ever Leaflet Code Sprint happening in Washington, DC with the MapBox team +author: Vladimir Agafonkin +authorsite: http://agafonkin.com/en +--- + +_Leaflet 0.6 released — with nicer controls, better usability and tons of API improvements and various bugfixes — more than 120 changes! The first ever Leaflet Code Sprint happening in Washington, DC with the MapBox team..._ + +After 5 months of active development with [36 contributors involved](https://github.com/Leaflet/Leaflet/graphs/contributors?from=2013-01-18&to=2013-06-26&type=c) since the previous major version, today I'm excited to finally announce the **release of Leaflet 0.6** stable. + +0.6 highlights include nicer controls, lots of interaction usability improvements, many new API methods, events and options, much better test infrastructure and TONS of bugfixes that made Leaflet significantly more reliable. Checkout the huge detailed list of changes (**120+ changes**!) [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). The [API reference](../../../reference.html) was also updated to reflect all these changes. + +The final push for the release (last 2 days) was a part of the first ever **Leaflet Code Sprint**, organized in Washington DC by the amazing [MapBox](http://mapbox.com), a company responsible for perhaps the greatest innovations and awesome tools in the geospatial world of recent years. The sprint will go on for a week and there are many more awesome improvements to come in upcoming days (and lots of partying as well). + +Special thanks go to [Universal Mind](http://universalmind.com/), my awesome employer and sponsor of Leaflet development for the past 5 months, to the most active contributors — [John Firebaugh](https://github.com/jfirebaugh) and [Tom MacWright](https://github.com/tmcw) of [MapBox](http://mapbox.com), [Dave Leaver](https://github.com/danzel) and [Jacob Toye](https://github.com/jacobtoye) of [Smartrak](http://www.smartrak.co.nz/), [Steve Kashis](https://github.com/snkashis) of [CaerusGeo](http://www.caerusgeo.com/), and to everyone else involved in contributions, bug reports, mailing list, Twitter, making awesome apps, etc. You're such an amazing community! I'm really happy to be a part of it. + +Grab the CDN links or downloads for the new release on the [download page](../../../download.html) as always. Enjoy! And be sure try it out and report any regressions in your apps so that we can patch them up immediately. + +P.S. Everyone who tweets/posts about the new Leaflet release or why he loves Leaflet over the next few days will get a karma boost of over 9000 points. I heard that from a passing monk in Georgetown yesterday, true story! + +Cheers,
      +Vladimir, Leaflet creator and maintainer. diff --git a/features.html b/features.html index a96e467cdc1..08b049bcfb2 100644 --- a/features.html +++ b/features.html @@ -139,7 +139,7 @@

      On Mobile

      Misc

        -
      • Extremely lightweight — around 28 KB of gzipped JS code
      • +
      • Extremely lightweight — around 31 KB of gzipped JS code
      • No external dependencies
      • Keeps your JS environment clean — no global or native prototypes pollution
      diff --git a/index.md b/index.md index 8bef6b402b2..0c988ea77fc 100644 --- a/index.md +++ b/index.md @@ -2,11 +2,11 @@ layout: default --- - +

      June 26, 2013 — Leaflet 0.6 Released, Code Sprint in DC with MapBox — Read More in the Blog

      Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. -Weighing just about 28 KB of JS code, +Weighing just about 31 KB of JS code, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. @@ -20,13 +20,13 @@ Used by: [Flickr](http://flickr.com/map) [foursquare](https://foursquare.com/) [craigslist](http://t.co/V4EiURIA) +[Data.gov](http://data.gov) [IGN](http://www.ign.com/wikis/the-elder-scrolls-5-skyrim/interactive-maps/Skyrim) [Wikimedia](http://blog.wikimedia.org/2012/04/05/new-wikipedia-app-for-ios-and-an-update-for-our-android-app/) [OSM](http://openstreetmap.org) [Meetup](http://www.meetup.com/) [WSJ](http://projects.wsj.com/campaign2012/maps/) -[Geocaching](http://geocaching.com) -[StreetEasy](http://streeteasy.com/) +[MapBox](http://mapbox.com) [CloudMade](http://cloudmade.com) [CartoDB](http://cartodb.com) [GIS Cloud](http://www.giscloud.com/) From e306733ac8ed7135b7325eb0a8fac8bdd544eca3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 11:16:14 -0400 Subject: [PATCH 0434/2207] bigger font and minor tweaks --- docs/css/screen.css | 7 +++++++ index.md | 4 ++-- reference.html | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index afa4cf71150..01668fc2dda 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -149,6 +149,13 @@ p code, td:last-child code { color: #666; } +p, ul, ol, table { + font-size: 13px; +} +code { + font-size: 12px; +} + /*.api-page td:last-child pre { margin-top: 0.5em; }*/ diff --git a/index.md b/index.md index 0c988ea77fc..ce9f5978fe2 100644 --- a/index.md +++ b/index.md @@ -6,14 +6,14 @@ layout: default Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. -Weighing just about 31 KB of JS code, +Weighing just about 31 KB of JS, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. It works efficiently across all major desktop and mobile platforms out of the box, taking advantage of HTML5 and CSS3 on modern browsers while still being accessible on older ones. It can be extended with many [plugins][], has a beautiful, easy to use and [well-documented API][] -and a simple, readable [source code][] that is a joy to [contribute][] to. +and a simple, readable [source code][] that is a joy to [contribute][] to. {: .usedby} Used by: diff --git a/reference.html b/reference.html index b2d358c2454..c5ef982b904 100644 --- a/reference.html +++ b/reference.html @@ -5,7 +5,7 @@ ---
      -
      +

      Map

      • Usage example
      • @@ -80,7 +80,7 @@

        Controls

        Events

        Utility

        From db2f28fef4a1caef7f96b258920950d878c81659 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 11:47:27 -0400 Subject: [PATCH 0435/2207] fix Steve's name in the blog post --- .../2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md index ff1712bc6fa..6fff0738b92 100644 --- a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -10,11 +10,11 @@ _Leaflet 0.6 released — with nicer controls, better usability and tons of After 5 months of active development with [36 contributors involved](https://github.com/Leaflet/Leaflet/graphs/contributors?from=2013-01-18&to=2013-06-26&type=c) since the previous major version, today I'm excited to finally announce the **release of Leaflet 0.6** stable. -0.6 highlights include nicer controls, lots of interaction usability improvements, many new API methods, events and options, much better test infrastructure and TONS of bugfixes that made Leaflet significantly more reliable. Checkout the huge detailed list of changes (**120+ changes**!) [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). The [API reference](../../../reference.html) was also updated to reflect all these changes. +0.6 highlights include nicer controls, lots of interaction usability improvements, many new API methods, events and options, much better test infrastructure and TONS of bugfixes that made Leaflet significantly more reliable. Checkout the huge detailed list of changes (**120+ total**!) [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). The [API reference](../../../reference.html) was also updated to reflect all these changes. The final push for the release (last 2 days) was a part of the first ever **Leaflet Code Sprint**, organized in Washington DC by the amazing [MapBox](http://mapbox.com), a company responsible for perhaps the greatest innovations and awesome tools in the geospatial world of recent years. The sprint will go on for a week and there are many more awesome improvements to come in upcoming days (and lots of partying as well). -Special thanks go to [Universal Mind](http://universalmind.com/), my awesome employer and sponsor of Leaflet development for the past 5 months, to the most active contributors — [John Firebaugh](https://github.com/jfirebaugh) and [Tom MacWright](https://github.com/tmcw) of [MapBox](http://mapbox.com), [Dave Leaver](https://github.com/danzel) and [Jacob Toye](https://github.com/jacobtoye) of [Smartrak](http://www.smartrak.co.nz/), [Steve Kashis](https://github.com/snkashis) of [CaerusGeo](http://www.caerusgeo.com/), and to everyone else involved in contributions, bug reports, mailing list, Twitter, making awesome apps, etc. You're such an amazing community! I'm really happy to be a part of it. +Special thanks go to [Universal Mind](http://universalmind.com/), my awesome employer and sponsor of Leaflet development for the past 5 months, to the most active contributors — [John Firebaugh](https://github.com/jfirebaugh) and [Tom MacWright](https://github.com/tmcw) of [MapBox](http://mapbox.com), [Dave Leaver](https://github.com/danzel) and [Jacob Toye](https://github.com/jacobtoye) of [Smartrak](http://www.smartrak.co.nz/), [Steve Kashishian](https://github.com/snkashis) of [CaerusGeo](http://www.caerusgeo.com/), and to everyone else involved in contributions, bug reports, mailing list, Twitter, making awesome apps, etc. You're such an amazing community! I'm really happy to be a part of it. Grab the CDN links or downloads for the new release on the [download page](../../../download.html) as always. Enjoy! And be sure try it out and report any regressions in your apps so that we can patch them up immediately. From bbc466762abd254f072aef38574714e9a999c6c5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 12:26:16 -0400 Subject: [PATCH 0436/2207] add a note about GitHub and Mapbox.js --- .../2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md index 6fff0738b92..60f2bbdea54 100644 --- a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -12,7 +12,9 @@ After 5 months of active development with [36 contributors involved](https://git 0.6 highlights include nicer controls, lots of interaction usability improvements, many new API methods, events and options, much better test infrastructure and TONS of bugfixes that made Leaflet significantly more reliable. Checkout the huge detailed list of changes (**120+ total**!) [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). The [API reference](../../../reference.html) was also updated to reflect all these changes. -The final push for the release (last 2 days) was a part of the first ever **Leaflet Code Sprint**, organized in Washington DC by the amazing [MapBox](http://mapbox.com), a company responsible for perhaps the greatest innovations and awesome tools in the geospatial world of recent years. The sprint will go on for a week and there are many more awesome improvements to come in upcoming days (and lots of partying as well). +The final push for the release (last 2 days) was a part of the first ever **Leaflet Code Sprint**, organized in Washington DC by the amazing [MapBox](http://mapbox.com), a company responsible for perhaps the greatest innovations and awesome tools in the geospatial world of recent years, now [using Leaflet for its JS API](mapbox.com/blog/mapbox-js-with-leaflet/) too. The sprint will go on for a week and there are many more awesome improvements to come in upcoming days (and lots of partying as well). + +On a related note, even GitHub itself is now [using Leaflet for GeoJSON visualizations](https://github.com/blog/1541-geojson-rendering-improvements), along with [Leaflet.markercluster](github.com/Leaflet/Leaflet.markercluster) & MapBox tiles! How cool is that? Special thanks go to [Universal Mind](http://universalmind.com/), my awesome employer and sponsor of Leaflet development for the past 5 months, to the most active contributors — [John Firebaugh](https://github.com/jfirebaugh) and [Tom MacWright](https://github.com/tmcw) of [MapBox](http://mapbox.com), [Dave Leaver](https://github.com/danzel) and [Jacob Toye](https://github.com/jacobtoye) of [Smartrak](http://www.smartrak.co.nz/), [Steve Kashishian](https://github.com/snkashis) of [CaerusGeo](http://www.caerusgeo.com/), and to everyone else involved in contributions, bug reports, mailing list, Twitter, making awesome apps, etc. You're such an amazing community! I'm really happy to be a part of it. From d498f442e821c40c7238ac8111dec52641ffacf8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 26 Jun 2013 12:34:56 -0400 Subject: [PATCH 0437/2207] mention saving to geojson in release post --- _posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md index 60f2bbdea54..4f6a1ad006d 100644 --- a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -10,7 +10,7 @@ _Leaflet 0.6 released — with nicer controls, better usability and tons of After 5 months of active development with [36 contributors involved](https://github.com/Leaflet/Leaflet/graphs/contributors?from=2013-01-18&to=2013-06-26&type=c) since the previous major version, today I'm excited to finally announce the **release of Leaflet 0.6** stable. -0.6 highlights include nicer controls, lots of interaction usability improvements, many new API methods, events and options, much better test infrastructure and TONS of bugfixes that made Leaflet significantly more reliable. Checkout the huge detailed list of changes (**120+ total**!) [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). The [API reference](../../../reference.html) was also updated to reflect all these changes. +0.6 highlights include nicer controls, lots of interaction usability improvements, many new API methods, events and options, ability to save layers as [GeoJSON](http://en.wikipedia.org/wiki/GeoJSON), much better test infrastructure and TONS of bugfixes that made Leaflet significantly more reliable. Checkout the huge detailed list of changes (**120+ total**!) [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md). The [API reference](../../../reference.html) was also updated to reflect all these changes. The final push for the release (last 2 days) was a part of the first ever **Leaflet Code Sprint**, organized in Washington DC by the amazing [MapBox](http://mapbox.com), a company responsible for perhaps the greatest innovations and awesome tools in the geospatial world of recent years, now [using Leaflet for its JS API](mapbox.com/blog/mapbox-js-with-leaflet/) too. The sprint will go on for a week and there are many more awesome improvements to come in upcoming days (and lots of partying as well). From e03567f7963d6a757a676060b3ed18ab561b81e1 Mon Sep 17 00:00:00 2001 From: Ishmael Smyrnow Date: Wed, 26 Jun 2013 14:30:50 -0400 Subject: [PATCH 0438/2207] Add Leaflet.GroupedLayerControl to plugin list --- plugins.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b04426930f4..4bbd9c062c8 100644 --- a/plugins.md +++ b/plugins.md @@ -603,7 +603,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bjørn Sandvik - + + + + Leaflet.GroupedLayerControl + + Leaflet layer control with support for grouping overlays together. + + Ishmael Smyrnow + + From 00123f1327f5a1c54d68be7757e466d54bd5e6ad Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 27 Jun 2013 10:47:20 -0400 Subject: [PATCH 0439/2207] update links to 0.6.1 and a note in the blog post --- ...06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md | 2 ++ download.md | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md index 4f6a1ad006d..5891156f134 100644 --- a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -20,6 +20,8 @@ Special thanks go to [Universal Mind](http://universalmind.com/), my awesome emp Grab the CDN links or downloads for the new release on the [download page](../../../download.html) as always. Enjoy! And be sure try it out and report any regressions in your apps so that we can patch them up immediately. +**update** (June 27): 0.6.1 released with a couple of regressions fixed (particularly the one with FF scroll-zooming too fast). + P.S. Everyone who tweets/posts about the new Leaflet release or why he loves Leaflet over the next few days will get a karma boost of over 9000 points. I heard that from a passing monk in Georgetown yesterday, true story! Cheers,
        diff --git a/download.md b/download.md index a11958cdf68..db13bf96aac 100644 --- a/download.md +++ b/download.md @@ -13,8 +13,8 @@ Besides the library itself, the download package contains full source code, unit Description - Leaflet 0.6 - Stable version, released on June 26, 2013 + Leaflet 0.6.1 + Stable version, released on June 26, 2013 and last updated on June 27, 2013 Leaflet 0.5.1 @@ -35,12 +35,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this code in the `head` section of your HTML: - + - + ### Building Leaflet from the Source From 946647257d95a8d6295eeefd900e85b6cc44e14d Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Thu, 27 Jun 2013 14:30:40 -0400 Subject: [PATCH 0440/2207] First swipe at a member reference link --- reference.html | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/reference.html b/reference.html index c5ef982b904..496d72a1389 100644 --- a/reference.html +++ b/reference.html @@ -168,7 +168,7 @@

        Options

        Map State Options

        - +
        @@ -221,7 +221,7 @@

        Map State Options

        Interaction Options

        -
        Option Type
        +
        @@ -292,7 +292,7 @@

        Interaction Options

        Keyboard Navigation Options

        -
        Option Type
        +
        @@ -321,7 +321,7 @@

        Keyboard Navigation Options

        Panning Inertia Options

        -
        Option Type
        +
        @@ -356,7 +356,7 @@

        Panning Inertia Options

        Control options

        -
        Option Type
        +
        @@ -379,7 +379,7 @@

        Control options

        Animation options

        -
        Option Type
        +
        @@ -417,7 +417,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Option Type
        +
        @@ -598,7 +598,7 @@

        Events

        Methods for Modifying Map State

        -
        Event Data
        +
        @@ -720,7 +720,7 @@

        Methods for Modifying Map State

        Methods for Getting Map State

        -
        Method Returns
        +
        @@ -780,7 +780,7 @@

        Methods for Getting Map State

        Methods for Layers and Controls

        -
        Method Returns
        +
        @@ -858,7 +858,7 @@

        Methods for Layers and Controls

        Conversion Methods

        -
        Method Returns
        +
        @@ -6294,3 +6294,16 @@

        L.version

        A constant that represents the Leaflet version in use.

        L.version // returns "0.5" (or whatever version is currently in use)
        + + From a6360cc91e5a8e442694978afb5e1d130f832681 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Thu, 27 Jun 2013 14:49:02 -0400 Subject: [PATCH 0441/2207] Add links to all sections, do lowercase with dashes --- reference.html | 252 ++++++++++++++++++++++++------------------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/reference.html b/reference.html index 496d72a1389..14a9eb5046f 100644 --- a/reference.html +++ b/reference.html @@ -958,7 +958,7 @@

        Conversion Methods

        Other Methods

        -
        Method Returns
        +
        @@ -969,12 +969,12 @@

        Other Methods

        - + - + @@ -985,7 +985,7 @@

        Other Methods

        Locate options

        -
        Method Returns HTMLElement Returns the container element of the map.
        getPanes() MapPanes Returns an object with different map panes (to render overlays in).
        whenReady( <Function> fn, <Object> context? )
        +
        @@ -1033,7 +1033,7 @@

        Locate options

        Zoom/pan options

        -
        Option Type
        +
        @@ -1068,7 +1068,7 @@

        Zoom/pan options

        Pan options

        -
        Option Type
        +
        @@ -1103,7 +1103,7 @@

        Pan options

        Zoom options

        -
        Option Type
        +
        @@ -1122,7 +1122,7 @@

        fitBounds options

        The same as zoom/pan options and additionally:

        -
        Option Type
        +
        @@ -1160,7 +1160,7 @@

        Properties

        map.attributionControl.addAttribution("Earthquake data &copy; GeoNames");
        -
        Option Type
        +
        @@ -1218,7 +1218,7 @@

        Map Panes

        An object literal (returned by map.getPanes) that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

        -
        Property Type
        +
        @@ -1270,7 +1270,7 @@

        L.Marker

        Constructor

        -
        Property Type
        +
        @@ -1293,7 +1293,7 @@

        Constructor

        Options

        -
        Constructor Usage
        +
        @@ -1360,7 +1360,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Option Type
        +
        @@ -1435,7 +1435,7 @@

        Events

        Methods

        -
        Event Data
        +
        @@ -1543,7 +1543,7 @@

        Interaction handlers

        marker.dragging.disable();
        -
        Method Returns
        +
        @@ -1574,7 +1574,7 @@

        Usage example

        Constructor

        -
        Property Type
        +
        @@ -1597,7 +1597,7 @@

        Constructor

        -
        Constructor Usage
        +
        @@ -1670,7 +1670,7 @@

        Methods

        -
        Option Type
        +
        @@ -1725,7 +1725,7 @@

        Usage example

        Constructor

        -
        Method Returns
        +
        @@ -1760,7 +1760,7 @@

        URL template

        Options

        -
        Constructor Usage
        +
        @@ -1875,7 +1875,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Option Type
        +
        @@ -1905,7 +1905,7 @@

        Events

        Methods

        -
        Event Data
        +
        @@ -1982,7 +1982,7 @@

        Usage example

        Constructor

        -
        Method Returns
        +
        @@ -2007,7 +2007,7 @@

        Options

        Includes all TileLayer options and additionally:

        -
        Constructor Usage
        +
        @@ -2054,7 +2054,7 @@

        Options

        Methods

        -
        Option Type
        +
        @@ -2086,7 +2086,7 @@

        Usage example

        Constructor

        -
        Method Returns
        +
        @@ -2105,7 +2105,7 @@

        Constructor

        Constructor Usage

        Options

        - +
        @@ -2122,7 +2122,7 @@

        Options

        Methods

        -
        Option Type
        +
        @@ -2158,7 +2158,7 @@

        Usage example

        Constructor

        -
        Method Returns
        +
        @@ -2181,7 +2181,7 @@

        Constructor

        Constructor Usage

        Options

        - +
        @@ -2197,7 +2197,7 @@

        Options

        Option Type

        Methods

        - +
        @@ -2236,7 +2236,7 @@

        L.Path

        An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly.

        Options

        -
        Method Returns
        +
        @@ -2309,7 +2309,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Option Type
        +
        @@ -2368,7 +2368,7 @@

        Events

        Event Data

        Methods

        - +
        @@ -2450,7 +2450,7 @@

        Methods

        Method Returns

        Static properties

        - +
        @@ -2497,7 +2497,7 @@

        Usage example

        Constructor

        -
        Constant Type
        +
        @@ -2522,7 +2522,7 @@

        Options

        You can use Path options and additionally the following options:

        -
        Constructor Usage
        +
        @@ -2547,7 +2547,7 @@

        Methods

        You can use Path methods and additionally the following methods:

        -
        Option Type
        +
        @@ -2604,7 +2604,7 @@

        L.MultiPolyline

        Constructor

        -
        Method Returns
        +
        @@ -2632,7 +2632,7 @@

        Methods

        have different behavior around their coordinate contents since they can contain multiple line features:

        -
        Constructor Usage
        +
        @@ -2671,7 +2671,7 @@

        L.Polygon

        Constructor

        -
        Method Returns
        +
        @@ -2696,7 +2696,7 @@

        Methods

        Polygon has the same options and methods as Polyline, with the following differences:

        -
        Constructor Usage
        +
        @@ -2716,7 +2716,7 @@

        L.MultiPolygon

        Constructor

        -
        Method Returns
        +
        @@ -2743,7 +2743,7 @@

        Methods

        have different behavior around their coordinate contents since they can contain multiple polygon features:

        -
        Constructor Usage
        +
        @@ -2788,7 +2788,7 @@

        Usage example

        Constructor

        -
        Method Returns
        +
        @@ -2813,7 +2813,7 @@

        Methods

        You can use Path methods and additionally the following methods:

        -
        Constructor Usage
        +
        @@ -2838,7 +2838,7 @@

        L.Circle

        Constructor

        -
        Method Returns
        +
        @@ -2862,7 +2862,7 @@

        Constructor

        Methods

        -
        Constructor Usage
        +
        @@ -2909,7 +2909,7 @@

        L.CircleMarker

        Constructor

        -
        Method Returns
        +
        @@ -2932,7 +2932,7 @@

        Constructor

        Methods

        -
        Constructor Usage
        +
        @@ -2973,7 +2973,7 @@

        L.LayerGroup

        Constructor

        -
        Method Returns
        +
        @@ -2995,7 +2995,7 @@

        Constructor

        Methods

        -
        Constructor Usage
        +
        @@ -3091,7 +3091,7 @@

        L.FeatureGroup

        Constructor

        -
        Method Returns
        +
        @@ -3115,7 +3115,7 @@

        Methods

        Has all LayerGroup methods and additionally:

        -
        Constructor Usage
        +
        @@ -3158,7 +3158,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Method Returns
        +
        @@ -3224,7 +3224,7 @@

        L.GeoJSON

        Constructor

        -
        Event Data
        +
        @@ -3247,7 +3247,7 @@

        Constructor

        Options

        -
        Constructor Usage
        +
        @@ -3295,7 +3295,7 @@

        Options

        Methods

        -
        Option Description
        +
        @@ -3329,7 +3329,7 @@

        Methods

        Static methods

        -
        Method Returns
        +
        @@ -3382,7 +3382,7 @@

        L.LatLng

        Constructor

        -
        Method Returns
        +
        @@ -3406,7 +3406,7 @@

        Constructor

        Properties

        -
        Constructor Usage
        +
        @@ -3426,7 +3426,7 @@

        Properties

        Methods

        -
        Property Type
        +
        @@ -3466,7 +3466,7 @@

        Methods

        Constants

        -
        Method Returns
        +
        @@ -3512,7 +3512,7 @@

        L.LatLngBounds

        Constructor

        -
        Constant Type
        +
        @@ -3547,7 +3547,7 @@

        Constructor

        Methods

        -
        Constructor Usage
        +
        @@ -3676,7 +3676,7 @@

        L.Point

        Constructor

        -
        Method Returns
        +
        @@ -3700,7 +3700,7 @@

        Constructor

        Properties

        -
        Constructor Usage
        +
        @@ -3720,7 +3720,7 @@

        Properties

        Methods

        -
        Property Type
        +
        @@ -3807,7 +3807,7 @@

        L.Bounds

        Constructor

        -
        Method Returns
        +
        @@ -3843,7 +3843,7 @@

        Constructor

        Properties

        -
        Constructor Usage
        +
        @@ -3863,7 +3863,7 @@

        Properties

        Methods

        -
        Property Type
        +
        @@ -3943,7 +3943,7 @@

        L.Icon

        Constructor

        -
        Method Returns
        +
        @@ -3965,7 +3965,7 @@

        Constructor

        Options

        -
        Constructor Usage
        +
        @@ -4037,7 +4037,7 @@

        L.DivIcon

        Constructor

        -
        Option Type
        +
        @@ -4059,7 +4059,7 @@

        Constructor

        Options

        -
        Constructor Usage
        +
        @@ -4099,7 +4099,7 @@

        L.Control

        map.addControl(control);

        Constructor

        -
        Option Type
        +
        @@ -4120,7 +4120,7 @@

        Constructor

        Constructor Usage

        Options

        - +
        @@ -4136,7 +4136,7 @@

        Options

        Option Type

        Methods

        - +
        @@ -4182,7 +4182,7 @@

        Control Positions

        Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.

        -
        Method Returns
        +
        @@ -4211,7 +4211,7 @@

        L.Control.Zoom

        A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

        Constructor

        -
        Position Description
        +
        @@ -4232,7 +4232,7 @@

        Constructor

        Constructor Usage

        Options

        - +
        @@ -4254,7 +4254,7 @@

        L.Control.Attribution

        The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

        Constructor

        -
        Option Type
        +
        @@ -4275,7 +4275,7 @@

        Constructor

        Constructor Usage

        Options

        - +
        @@ -4297,7 +4297,7 @@

        Options

        Option Type

        Methods

        - +
        @@ -4344,7 +4344,7 @@

        L.Control.Layers

        L.control.layers(baseLayers, overlays).addTo(map);

        Constructor

        -
        Method Returns
        +
        @@ -4365,7 +4365,7 @@

        Constructor

        Constructor Usage

        Methods

        - +
        @@ -4398,7 +4398,7 @@

        Methods

        Options

        -
        Method Returns
        +
        @@ -4444,7 +4444,7 @@

        Events

        You can subscribe to the following events on the Map object using these methods.

        -
        Option Type
        +
        @@ -4475,7 +4475,7 @@

        L.Control.Scale

        L.control.scale().addTo(map);

        Constructor

        -
        Event Data
        +
        @@ -4497,7 +4497,7 @@

        Constructor

        Options

        -
        Constructor Usage
        +
        @@ -4556,7 +4556,7 @@

        Example

        map.off('click', onClick);

        Methods

        -
        Option Type
        +
        @@ -4674,7 +4674,7 @@

        Event

        The base event object. All other event objects contain these properties too.

        -
        Method Returns
        +
        @@ -4724,7 +4724,7 @@

        MouseEvent

        LocationEvent

        -
        property type
        +
        @@ -4779,7 +4779,7 @@

        LocationEvent

        ErrorEvent

        -
        property type
        +
        @@ -4799,7 +4799,7 @@

        ErrorEvent

        LayerEvent

        -
        property type
        +
        @@ -4814,7 +4814,7 @@

        LayerEvent

        LayersControlEvent

        -
        property type
        +
        @@ -4834,7 +4834,7 @@

        LayersControlEvent

        TileEvent

        -
        property type
        +
        @@ -4854,7 +4854,7 @@

        TileEvent

        ResizeEvent

        -
        property type
        +
        @@ -4874,7 +4874,7 @@

        ResizeEvent

        GeoJSON event

        -
        property type
        +
        @@ -4904,7 +4904,7 @@

        GeoJSON event

        -
        property type
        +
        @@ -5084,7 +5084,7 @@

        L.Browser

        alert('Upgrade your browser, dude!'); } -
        property type
        +
        @@ -5174,7 +5174,7 @@

        L.Util

        Methods

        -
        property type
        +
        @@ -5294,7 +5294,7 @@

        Methods

        Properties

        -
        Method Returns
        +
        @@ -5321,7 +5321,7 @@

        L.Transformation

        Constructor

        -
        Property Type
        +
        @@ -5347,7 +5347,7 @@

        Constructor

        Methods

        -
        Constructor Usage
        +
        @@ -5382,7 +5382,7 @@

        L.LineUtil

        Methods

        -
        Method Returns
        +
        @@ -5441,7 +5441,7 @@

        L.PolyUtil

        Methods

        -
        Method Returns
        +
        @@ -5468,7 +5468,7 @@

        L.DomEvent

        Methods

        -
        Method Returns
        +
        @@ -5560,7 +5560,7 @@

        L.DomUtil

        Methods

        -
        Method Returns
        +
        @@ -5698,7 +5698,7 @@

        Methods

        Properties

        -
        Method Returns
        +
        @@ -5729,7 +5729,7 @@

        L.PosAnimation

        Constructor

        -
        Property Type
        +
        @@ -5748,7 +5748,7 @@

        Constructor

        Methods

        -
        Constructor Usage
        +
        @@ -5771,7 +5771,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Method Returns
        +
        @@ -5806,7 +5806,7 @@

        L.Draggable

        Constructor

        -
        Event Data
        +
        @@ -5831,7 +5831,7 @@

        Events

        You can subscribe to the following events using these methods.

        -
        Constructor Usage
        +
        @@ -5861,7 +5861,7 @@

        Events

        Methods

        -
        Event Data
        +
        @@ -5909,7 +5909,7 @@

        Methods

        IHandler

        An interface implemented by interaction handlers.

        -
        Method Returns
        +
        @@ -5939,7 +5939,7 @@

        ILayer

        Methods

        -
        Method Returns
        +
        @@ -6020,7 +6020,7 @@

        Methods

        Every control in Leaflet should extend from Control class and additionally have the following methods:

        -
        Method Returns
        +
        @@ -6087,7 +6087,7 @@

        IProjection

        Methods

        -
        Method Returns
        +
        @@ -6115,7 +6115,7 @@

        Defined Projections

        Leaflet comes with a set of already defined projections out of the box:

        -
        Method Returns
        +
        @@ -6146,7 +6146,7 @@

        ICRS

        Methods

        -
        Projection Description
        +
        @@ -6190,7 +6190,7 @@

        Methods

        Properties

        -
        Method Returns
        +
        @@ -6221,7 +6221,7 @@

        Defined CRS

        Leaflet comes with a set of already defined CRS to use out of the box:

        -
        Property Type
        +
        @@ -6258,7 +6258,7 @@

        Global Switches

        <script>L_PREFER_CANVAS = true;</script>
         <script src="leaflet.js"></script>
        -
        Projection Description
        +
        @@ -6302,7 +6302,7 @@

        L.version

        tds = tables[i].getElementsByTagName('td'), tdl = tds.length; for (var j = 0; j < tdl; j++) { if (tds[j].cellIndex === 0) { - tds[j].id = id + '.' + tds[j].innerText.split('(')[0]; + tds[j].id = id + '-' + tds[j].innerText.split('(')[0].toLowerCase(); } } } From c7668676f1af9bd5cc390d48ae910d1e8f193a24 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 27 Jun 2013 18:15:50 -0400 Subject: [PATCH 0442/2207] add anchor highlighting to the reference --- docs/css/screen.css | 21 +++++++++++++++++++++ reference.html | 10 +++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 01668fc2dda..abe7ca63f1c 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -548,3 +548,24 @@ p.notice { #disqus_thread { margin-top: 3em; } + +tr:target { + background: yellow; + -webkit-animation: highlight 2s ease 0.5s 1 normal forwards; + -moz-animation: highlight 2s ease 0.5s 1 normal forwards; + -o-animation: highlight 2s ease 0.5s 1 normal forwards; + animation: highlight 2s ease 0.5s 1 normal forwards; +} + +@-webkit-keyframes highlight { + 0% { background: yellow; } + 100% { background: white; } +} +@-moz-keyframes highlight { + 0% { background: yellow; } + 100% { background: white; } +} +@keyframes highlight { + 0% { background: yellow; } + 100% { background: white; } +} diff --git a/reference.html b/reference.html index 14a9eb5046f..119bc32fe55 100644 --- a/reference.html +++ b/reference.html @@ -6296,13 +6296,13 @@

        L.version

        L.version // returns "0.5" (or whatever version is currently in use)
        + ### Building Leaflet from the Source From 7a1394790e52b3cfaf7f5f9cd467ffecbe72b9eb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 28 Jun 2013 16:46:11 -0400 Subject: [PATCH 0445/2207] update build --- dist/leaflet-src.js | 7 +++---- dist/leaflet.js | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index 3cdaea8c3df..06561d19fa8 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -3607,8 +3607,7 @@ L.Marker = L.Class.extend({ // TODO refactor into something shared with Map/Path/etc. to DRY it up var icon = this._icon, - events = ['mousedown', 'mouseup', 'mouseover', 'mouseout', - 'mousemove', 'dblclick', 'contextmenu']; + events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; L.DomUtil.addClass(icon, 'leaflet-clickable'); L.DomEvent.on(icon, 'click', this._onMouseClick, this); @@ -4588,8 +4587,8 @@ L.Path = L.Path.extend({ L.DomEvent.on(this._container, 'click', this._onMouseClick, this); - var events = ['mousedown', 'mouseup', 'mouseover', 'mouseout', - 'mousemove', 'dblclick', 'contextmenu']; + var events = ['dblclick', 'mousedown', 'mouseover', + 'mouseout', 'mousemove', 'contextmenu']; for (var i = 0; i < events.length; i++) { L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); } diff --git a/dist/leaflet.js b/dist/leaflet.js index 8899c340670..5aa723800a8 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -4,6 +4,6 @@ (c) 2010-2011, CloudMade */ !function(t,e,i){var n=t.L,o={};o.version="0.6.2","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],i?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=i&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n=!!t.ActiveXObject,s=n&&!t.XMLHttpRequest,a=n&&!e.querySelector,r=n&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("phantom"),d=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",m=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,L="MozPerspective"in g.style,P="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||L||P)&&!c,w=!t.L_NO_TOUCH&&!c&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ie6:s,ie7:a,ielt9:r,webkit:l,android:d,android23:p,chrome:u,ie3d:v,webkit3d:y,gecko3d:L,opera3d:P,any3d:x,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&y,mobileOpera:_&&t.opera,touch:w,msTouch:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement,l=o.Browser.ie7;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var u=o.DomUtil.getStyle(a,"width"),c=o.DomUtil.getStyle(a,"max-width"),d=a.getBoundingClientRect();("none"!==u||"none"!==c)&&(s+=d.left+a.clientLeft),n+=d.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==o.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){return t.className.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){o.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){t.className=o.Util.trim((" "+t.className+" ").replace(" "+e+" "," "))},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?new o.LatLng(t[0],t[1]):t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){return t?(t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this):this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this.setView(this.getCenter(),t,{zoom:e})},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=o.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this.off("moveend",this._panInsideMaxBounds,this),this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(this._zooma.x&&(r=Math.floor(a.x-n.x)),i.y>s.y&&(h=Math.floor(s.y-i.y)),i.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&this.dragging&&this.dragging.moved()||t._leaflet_stop||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!t._leaflet_stop){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new o.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update() -},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container leaflet-zoom-animated";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i)||t.y<0||t.y>=i)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs;var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,n=this.options.tileSize,s=t.multiplyBy(n),a=s.add([n,n]),r=this._crs.project(i.unproject(s,e)),h=this._crs.project(i.unproject(a,e)),l=[r.x,h.y,h.x,r.y].join(","),u=o.Util.template(this._url,{s:this._getSubdomain(t)});return u+o.Util.getParamString(this.wmsParams,u,!0)+"&BBOX="+l},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return o.Browser.ie6?(i||(i=e.createElement("div")),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i||(i=e.createElement("img")),i.src=t),i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0,r&&o.DomUtil.addClass(r,n)),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["mousedown","mouseup","mouseover","mouseout","mousemove","dblclick","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=t.getSize(),h=0,l=0;s.x+i>r.x&&(h=s.x+i-r.x+a.x),s.x-h<0&&(h=s.x-a.x),s.y+e>r.y&&(l=s.y+e-r.y+a.y),s.y-l<0&&(l=s.y-a.y),(h||l)&&t.fire("autopanstart").panBy([h,l])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popup||this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:(t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:o.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["mousedown","mouseup","mouseover","mouseout","mousemove","dblclick","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t) +},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container leaflet-zoom-animated";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i)||t.y<0||t.y>=i)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs;var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,n=this.options.tileSize,s=t.multiplyBy(n),a=s.add([n,n]),r=this._crs.project(i.unproject(s,e)),h=this._crs.project(i.unproject(a,e)),l=[r.x,h.y,h.x,r.y].join(","),u=o.Util.template(this._url,{s:this._getSubdomain(t)});return u+o.Util.getParamString(this.wmsParams,u,!0)+"&BBOX="+l},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return o.Browser.ie6?(i||(i=e.createElement("div")),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i||(i=e.createElement("img")),i.src=t),i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0,r&&o.DomUtil.addClass(r,n)),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=t.getSize(),h=0,l=0;s.x+i>r.x&&(h=s.x+i-r.x+a.x),s.x-h<0&&(h=s.x-a.x),s.y+e>r.y&&(l=s.y+e-r.y+a.y),s.y-l<0&&(l=s.y-a.y),(h||l)&&t.fire("autopanstart").panBy([h,l])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popup||this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:(t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:o.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t) },_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){var i,n,s;if(o.Polyline.prototype.initialize.call(this,t,e),t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),i=0,n=this._holes.length;n>i;i++)s=this._holes[i]=this._convertLatLngs(this._holes[i]),s[0].equals(s[s.length-1])&&s.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n=o.Util.isArray(t)?t:t.features;if(n){for(e=0,i=n.length;i>e;e++)(n[e].geometries||n[e].geometry||n[e].features)&&this.addData(n[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=o.GeoJSON.geometryToLayer(t,s.pointToLayer,s.coordsToLatLng);return a.feature=o.GeoJSON.asFeature(t),a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i){var n,s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return n=i(u),e?e(t,n):new o.Marker(n);case"MultiPoint":for(a=0,r=u.length;r>a;a++)n=i(u[a]),h=e?e(t,n):new o.Marker(n),c.push(h);return new o.FeatureGroup(c);case"LineString":return s=this.coordsToLatLngs(u,0,i),new o.Polyline(s);case"Polygon":return s=this.coordsToLatLngs(u,1,i),new o.Polygon(s);case"MultiLineString":return s=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(s);case"MultiPolygon":return s=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(s);case"GeometryCollection":for(a=0,r=l.geometries.length;r>a;a++)h=this.geometryToLayer({geometry:l.geometries[a],type:"Feature",properties:t.properties},e,i),c.push(h);return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){return[t.lng,t.lat]},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t,e){t.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){t.push(e.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:e,coordinates:t})}})}t(o.MultiPolyline,"MultiLineString"),t(o.MultiPolygon,"MultiPolygon")}(),o.LayerGroup.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){e.toGeoJSON&&t.push(o.GeoJSON.asFeature(e.toGeoJSON()))}),{type:"FeatureCollection",features:t}}}),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.addListener(t,o.Draggable.START[i],e);return o.DomEvent.addListener(t,"click",o.DomEvent._fakeStop).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+n.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+n.scrollTop+s.scrollTop,h=new o.Point(a,r);return i?h._subtract(o.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_fakeStop:function(t){t._leaflet_stop=!0},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled)){o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection();var i=t.touches?t.touches[0]:t,n=i.target;o.Browser.touch&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.Browser.touch||o.DomUtil.addClass(e.body,"leaflet-dragging")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.Browser.touch||o.DomUtil.removeClass(e.body,"leaflet-dragging");for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),n)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),d=u/(e.inertiaDeceleration*r),p=c.multiplyBy(-d/2).round();p.x&&p.y?o.Util.requestAnimFrame(function(){t.panBy(p,{duration:d,easeLinearity:r,noMoveStart:!0})}):t.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setZoomAround(t.containerPoint,this._zoom+1)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&t.setZoomAround(this._lastMousePos,i+e)}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:o.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.msTouch?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.msTouch){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.msTouch){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.msTouch?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;i0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i)) },this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.msTouch&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),this._map.fire("boxzoomstart"),void 0)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._pane.removeChild(this._box),this._container.style.cursor="",o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollTop||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable()},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):(o.DomEvent.disableClickPropagation(e),o.DomEvent.on(e,"mousewheel",o.DomEvent.stopPropagation));var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){this._el._leaflet_pos=this._getPos(),this.fire("step")},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);return o.Browser.any3d?(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),e=n?parseFloat(n[1]):0,i=n?parseFloat(n[2]):0):(e=parseFloat(a.left),i=parseFloat(a.top)),new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=this._limitZoom(e),t=o.latLng(t),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file From 2585d71a5af3f94c02cb684220e0151e0ce4a032 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 28 Jun 2013 17:00:25 -0400 Subject: [PATCH 0446/2207] blog post with plugin authoring guide --- ...13-06-28-leaflet-plugin-authoring-guide.md | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 _posts/2013-06-28-leaflet-plugin-authoring-guide.md diff --git a/_posts/2013-06-28-leaflet-plugin-authoring-guide.md b/_posts/2013-06-28-leaflet-plugin-authoring-guide.md new file mode 100644 index 00000000000..8fd5f4ace0f --- /dev/null +++ b/_posts/2013-06-28-leaflet-plugin-authoring-guide.md @@ -0,0 +1,111 @@ +--- +layout: post +title: Leaflet Plugin Authoring Guide +description: A number of best practices and tips for publishing your own perfect Leaflet plugin +author: Vladimir Agafonkin +authorsite: http://agafonkin.com/en +--- + +One of the greatest things about Leaflet is its powerful plugin ecosystem. +The [Leaflet plugins page](http://leafletjs.com/plugins.html) lists dozens of awesome plugins, and more are being added every week. + +This guide lists a number of best practices for publishing a Leaflet plugin that meets the quality standards of Leaflet itself. Also available [in the repo](https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md). + +### Presentation + +#### Repository + +The best place to put your Leaflet plugin to is a separate [GitHub](http://github.com) repository. +If you create a collection of plugins for different uses, +don't put them in one repo — +it's usually easier to work with small, self-contained plugins in individual repositories. + +#### Demo + +The most essential thing to do when publishing a plugin is to include a demo that showcases what the plugin does — +it's usually the first thing people will look for. + +The easiest way to put up a demo is using [GitHub Pages](http://pages.github.com/). +A good [starting point](https://help.github.com/articles/creating-project-pages-manually) is creating a `gh-pages` branch in your repo and adding an `index.html` page to it — +after pushing, it'll be published as `http://.github.io/`. + +#### Readme + +The next thing you need to have is a descriptive `README.md` in the root of the repo (or a link to a website with a similar content). +At a minimum it should contain the following items: + +- name of the plugin +- a simple, concise description of what it does +- requirements + - Leaflet version + - other external dependencies (if any) + - browser / device compatibility +- links to demos +- instructions for including the plugin +- simple usage code example +- API reference (methods, options, events) + +#### License + +Every open source repository should include a license. +If you don't know what open source license to choose for your code, +[MIT License](http://opensource.org/licenses/MIT) and [BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause) are both good choices. +You can either put it in the repo as a `LICENSE` file or just link to the license from the Readme. + +### Code + +#### File Structure + +Keep the file structure clean and simple, +don't pile up lots of files in one place — +make it easy for a new person to find their way in your repo. + +A barebones repo for a simple plugin would like this: + + my-plugin.js + README.md + +An example of a file structure for a more sophisticated plugin: + + /src JS source files + /dist minified plugin JS, CSS, images + /spec test files + /examples HTML examples of plugin usage + README.md + LICENSE + package.json + +#### Code Conventions + +Everyone's tastes are different, but it's important to be consistent with whatever conventions you choose for your plugin. + +For a good starting point, check out [Airbnb JavaScript Guide](https://github.com/airbnb/javascript). +Leaflet follows pretty much the same conventions +except for using smart tabs (hard tabs for indentation, spaces for alignment) +and putting a space after the `function` keyword. + +#### Plugin API + +Never expose global variables in your plugin.
        +If you have a new class, put it directly in the `L` namespace (`L.MyPlugin`).
        +If you inherit one of the existing classes, make it a sub-property (`L.TileLayer.Banana`).
        +If you want to add new methods to existing Leaflet classes, you can do it like this: `L.Marker.include({myPlugin: …})`. + +Function, method and property names should be in `camelCase`.
        +Class names should be in `CapitalizedCamelCase`. + +If you have a lot of arguments in your function, consider accepting an options object instead (putting default values where possible so that users don't need specify all of them): + + // bad + marker.myPlugin('bla', 'foo', null, {}, 5, 0); + + // good + marker.myPlugin('bla', { + optionOne: 'foo', + optionThree: 5 + }); + +And most importantly, keep it simple. Leaflet is all about *simplicity*. + +Cheers,
        +Vladimir. From e795e484465251dff18f8131d86b6304b005e4d9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 28 Jun 2013 17:10:45 -0400 Subject: [PATCH 0447/2207] fix typo --- _posts/2013-06-28-leaflet-plugin-authoring-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2013-06-28-leaflet-plugin-authoring-guide.md b/_posts/2013-06-28-leaflet-plugin-authoring-guide.md index 8fd5f4ace0f..38c22d854e1 100644 --- a/_posts/2013-06-28-leaflet-plugin-authoring-guide.md +++ b/_posts/2013-06-28-leaflet-plugin-authoring-guide.md @@ -60,7 +60,7 @@ Keep the file structure clean and simple, don't pile up lots of files in one place — make it easy for a new person to find their way in your repo. -A barebones repo for a simple plugin would like this: +A barebones repo for a simple plugin would look like this: my-plugin.js README.md From 02090a32811b028d86e5867f71b16aad67f18715 Mon Sep 17 00:00:00 2001 From: Jason Sanford Date: Sat, 29 Jun 2013 00:38:03 -0600 Subject: [PATCH 0448/2207] Note that only one base layer should be added to the map at instantiation. --- examples/layers-control.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/layers-control.md b/examples/layers-control.md index 0b85c3bf720..6ce2622f388 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -64,6 +64,8 @@ Now, all that's left to do is to create a [Layers Control](../reference.html#con Note that we added `minimal`, `motorways` and `cities` layers to the map but didn't add `midnight`. The layers control is smart enough to detect what layers we've already added and have corresponding checkboxes and radioboxes set. +Also note that when using multiple base layers, only one of them should be added to the map at instantiation, but all of them should be present in the base layers object when creating the layers control. + Now lets [view the result on a separate page →](layers-control-example.html) - + + + + + + * Put a `div` element with a certain `id` where you want your map to be: From 2e9cb136b23067d612c81afb323991cb725081be Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 10 Jul 2013 17:13:39 +0300 Subject: [PATCH 0461/2207] update download links according to #1354 --- download.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/download.md b/download.md index fc96bd2cd3b..1521cf5c9a9 100644 --- a/download.md +++ b/download.md @@ -5,24 +5,26 @@ title: Download ## Download Leaflet -Besides the library itself, the download package contains full source code, unit tests, files for debugging and a build system. The production files are in the `dist` folder. -
        Switch Description
        - - + + + + + + - - + + - - + +
        Version Description
        Leaflet 0.6.2Stable version, released on June 26, 2013 and last updated on June 28, 2013Leaflet 0.6.2Stable version, released on June 26, 2013 and last updated on June 28, 2013.
        Leaflet 0.5.1Previous stable version, released on January 17, 2013 and last updated on February 6, 2013.
        Leaflet 0.5.1Previous stable version, released on January 17, 2013 and last updated on February 6, 2013Leaflet 0.7-devIn-progress major version, developed on the master branch.
        Leaflet masterIn-progress version, developed on the master branchLeaflet 0.6.3-devIn-progress minor version, developed on the stable branch.
        @@ -33,7 +35,7 @@ Note that the master version can contain incompatible changes, so please read th ### Using a Hosted Version of Leaflet The latest stable release of Leaflet is hosted on a CDN — to start using -it straight away, place this code in the `head` section of your HTML: +it straight away, place this in the `head` section of your HTML code: - + ### Leaflet Source Code diff --git a/examples/quick-start.md b/examples/quick-start.md index 62792958747..b01e1e0ebe8 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,14 +19,14 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS files in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From 460ffba599fb2f9d1fb7eff737fd659e3651adef Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 17 Jul 2013 19:52:27 +0300 Subject: [PATCH 0468/2207] remove link to stable branch dev --- download.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/download.md b/download.md index 107b91b5ab5..e51b5ad1987 100644 --- a/download.md +++ b/download.md @@ -22,10 +22,10 @@ title: Download Leaflet 0.7-dev In-progress major version, developed on the master branch. - + [View Changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) From 189914f750e083ddeca6b7be46f0da1d22cc980e Mon Sep 17 00:00:00 2001 From: "David\\ Beitey" Date: Thu, 18 Jul 2013 13:56:07 +1000 Subject: [PATCH 0469/2207] Update documentation regarding addition of options to panInsideBounds and setMaxBounds. Refs #1879 --- reference.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 7081bd24c4e..bbb9331c052 100644 --- a/reference.html +++ b/reference.html @@ -671,10 +671,11 @@

        Methods for Modifying Map State

        panInsideBounds( - <LatLngBounds> bounds ) + <LatLngBounds> bounds, + <pan options> options? ) this - Pans the map to the closest view that would lie inside the given bounds (if it's not already). + Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. panBy( @@ -698,7 +699,7 @@

        Methods for Modifying Map State

        <zoom/pan options> options? )
        this - Restricts the map view to the given bounds (see map maxBounds option), passing the given animation options through to `setView`, if required. + Restricts the map view to the given bounds (see map maxBounds option), animating the map view if bounds are changed. The given animation options are passed through to `setView` or `panInsideBounds`, depending on map zoom level, and can be used to control how the map animates during this change. locate( From 3bff3c3eddcf66f351347aefbc81286c705054a8 Mon Sep 17 00:00:00 2001 From: Jonatan Heyman Date: Fri, 19 Jul 2013 17:47:23 +0200 Subject: [PATCH 0470/2207] Added leaflet-usermarker to list of plugins --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 1705aa12d72..3b79734a81d 100644 --- a/plugins.md +++ b/plugins.md @@ -226,6 +226,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bjørn Sandvik + + + leaflet-usermarker + + Plugin for plotting a marker representing a user - or multiple users - on a map, + with support for drawing an accuraccy circle. Can be seen in action on + Longitude.me. + + Jonatan Heyman + + From ecec4c190916af739c3a823f07100dfbfb7d5530 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Fri, 19 Jul 2013 12:37:40 -0400 Subject: [PATCH 0471/2207] Fix #1867 --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 7081bd24c4e..7fe1b2c5bf0 100644 --- a/reference.html +++ b/reference.html @@ -6299,8 +6299,8 @@

        L.version

        for (var j = 0, tdLen = tds.length; j < tdLen; j++) { if (tds[j].cellIndex === 0) { tds[j].parentNode.id = id + '-' + (tds[j].textContent || tds[j].innerText).split('(')[0].toLowerCase(); - tds[j].parentNode.onclick = function() { - window.location.hash = '#' + this.id; + tds[j].parentNode.onclick = function(e) { + if ((window.innerWidth / 2) - e.clientX > 394) window.location.hash = '#' + this.id; }; } } From 98c5e7ab845b7e6da400c40f0a9b91f9f3840239 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 19 Jul 2013 19:15:53 +0200 Subject: [PATCH 0472/2207] [reference.html] Add cursor=pointer to anchor icon (cf #1867) --- docs/css/screen.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/css/screen.css b/docs/css/screen.css index 0a436667035..97171eadecf 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -95,6 +95,7 @@ h2 { text-indent:-9999px; border-radius:50%; overflow:hidden; + cursor: pointer; } .api-page tr[id] td:first-child:before { From b73ed6afb8426dd70e44c065a09d36a8d90533b7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 25 Jul 2013 12:42:09 +0300 Subject: [PATCH 0473/2207] fix infinite loop in getBounds and setMaxBounds, close #1895, close #1866 --- src/map/Map.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 0df345c560e..62f16efbe4a 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -345,8 +345,8 @@ L.Map = L.Class.extend({ }, getMinZoom: function () { - var z1 = this._layersMinZoom === undefined ? -Infinity : this._layersMinZoom, - z2 = this._boundsMinZoom === undefined ? -Infinity : this._boundsMinZoom; + var z1 = this._layersMinZoom === undefined ? 0 : this._layersMinZoom, + z2 = this._boundsMinZoom === undefined ? 0 : this._boundsMinZoom; return this.options.minZoom === undefined ? Math.max(z1, z2) : this.options.minZoom; }, From 8248c6b1d0f7f739d45c9e800c8ae16e1d7d4f6a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 25 Jul 2013 12:49:16 +0300 Subject: [PATCH 0474/2207] fix map scrolling right on click with horizontal scroll on page, close #1901 --- src/map/handler/Map.Keyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index dabbc02cb7c..ddf67597f87 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -65,7 +65,7 @@ L.Map.Keyboard = L.Handler.extend({ var body = document.body, docEl = document.documentElement, top = body.scrollTop || docEl.scrollTop, - left = body.scrollTop || docEl.scrollLeft; + left = body.scrollLeft || docEl.scrollLeft; this._map._container.focus(); From 3a8cff69e4797d05005382c4b01e55797d329756 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 25 Jul 2013 13:10:35 +0300 Subject: [PATCH 0475/2207] bump version --- package.json | 2 +- src/Leaflet.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5e755ffe55b..688dfc63e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet", - "version": "0.6.3", + "version": "0.6.4", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "jshint": "~2.1.4", diff --git a/src/Leaflet.js b/src/Leaflet.js index d1294d04856..ea330280049 100644 --- a/src/Leaflet.js +++ b/src/Leaflet.js @@ -2,7 +2,7 @@ var oldL = window.L, L = {}; -L.version = '0.6.3'; +L.version = '0.6.4'; // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { From 985dd00c89a7748ae2e633f37289a3495da08b87 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 25 Jul 2013 13:15:06 +0300 Subject: [PATCH 0476/2207] update build to 0.6.4 --- dist/leaflet-src.js | 8 ++++---- dist/leaflet.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index 794496b3513..2466f5619ed 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -7,7 +7,7 @@ var oldL = window.L, L = {}; -L.version = '0.6.3'; +L.version = '0.6.4'; // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { @@ -1844,8 +1844,8 @@ L.Map = L.Class.extend({ }, getMinZoom: function () { - var z1 = this._layersMinZoom === undefined ? -Infinity : this._layersMinZoom, - z2 = this._boundsMinZoom === undefined ? -Infinity : this._boundsMinZoom; + var z1 = this._layersMinZoom === undefined ? 0 : this._layersMinZoom, + z2 = this._boundsMinZoom === undefined ? 0 : this._boundsMinZoom; return this.options.minZoom === undefined ? Math.max(z1, z2) : this.options.minZoom; }, @@ -7499,7 +7499,7 @@ L.Map.Keyboard = L.Handler.extend({ var body = document.body, docEl = document.documentElement, top = body.scrollTop || docEl.scrollTop, - left = body.scrollTop || docEl.scrollLeft; + left = body.scrollLeft || docEl.scrollLeft; this._map._container.focus(); diff --git a/dist/leaflet.js b/dist/leaflet.js index becaaf91956..1d4c6e5450b 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -3,7 +3,7 @@ (c) 2010-2013, Vladimir Agafonkin (c) 2010-2011, CloudMade */ -!function(t,e,i){var n=t.L,o={};o.version="0.6.3","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],i?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=i&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n=!!t.ActiveXObject,s=n&&!t.XMLHttpRequest,a=n&&!e.querySelector,r=n&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("phantom"),d=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",m=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,L="MozPerspective"in g.style,P="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||L||P)&&!c,w=!t.L_NO_TOUCH&&!c&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ie6:s,ie7:a,ielt9:r,webkit:l,android:d,android23:p,chrome:u,ie3d:v,webkit3d:y,gecko3d:L,opera3d:P,any3d:x,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&y,mobileOpera:_&&t.opera,touch:w,msTouch:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement,l=o.Browser.ie7;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var u=o.DomUtil.getStyle(a,"width"),c=o.DomUtil.getStyle(a,"max-width"),d=a.getBoundingClientRect();("none"!==u||"none"!==c)&&(s+=d.left+a.clientLeft),n+=d.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==o.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){return t.className.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){o.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){t.className=o.Util.trim((" "+t.className+" ").replace(" "+e+" "," "))},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?new o.LatLng(t[0],t[1]):t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){return t?(t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this):this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this.setView(this.getCenter(),t,{zoom:e})},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t,e){if(t=o.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this.off("moveend",this._panInsideMaxBounds,this),this;var i=this.getBoundsZoom(t,!0);return this._boundsMinZoom=i,this._loaded&&(this._zooma.x&&(r=Math.floor(a.x-n.x)),i.y>s.y&&(h=Math.floor(s.y-i.y)),i.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&this.dragging&&this.dragging.moved()||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new o.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update() +!function(t,e,i){var n=t.L,o={};o.version="0.6.4","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],i?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=i&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n=!!t.ActiveXObject,s=n&&!t.XMLHttpRequest,a=n&&!e.querySelector,r=n&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("phantom"),d=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",m=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,L="MozPerspective"in g.style,P="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||L||P)&&!c,w=!t.L_NO_TOUCH&&!c&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ie6:s,ie7:a,ielt9:r,webkit:l,android:d,android23:p,chrome:u,ie3d:v,webkit3d:y,gecko3d:L,opera3d:P,any3d:x,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&y,mobileOpera:_&&t.opera,touch:w,msTouch:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement,l=o.Browser.ie7;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var u=o.DomUtil.getStyle(a,"width"),c=o.DomUtil.getStyle(a,"max-width"),d=a.getBoundingClientRect();("none"!==u||"none"!==c)&&(s+=d.left+a.clientLeft),n+=d.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==o.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){return t.className.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){o.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){t.className=o.Util.trim((" "+t.className+" ").replace(" "+e+" "," "))},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?new o.LatLng(t[0],t[1]):t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){return t?(t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this):this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this.setView(this.getCenter(),t,{zoom:e})},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t,e){if(t=o.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this.off("moveend",this._panInsideMaxBounds,this),this;var i=this.getBoundsZoom(t,!0);return this._boundsMinZoom=i,this._loaded&&(this._zooma.x&&(r=Math.floor(a.x-n.x)),i.y>s.y&&(h=Math.floor(s.y-i.y)),i.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&this.dragging&&this.dragging.moved()||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new o.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update() },addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container leaflet-zoom-animated";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i)||t.y<0||t.y>=i)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs;var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,n=this.options.tileSize,s=t.multiplyBy(n),a=s.add([n,n]),r=this._crs.project(i.unproject(s,e)),h=this._crs.project(i.unproject(a,e)),l=[r.x,h.y,h.x,r.y].join(","),u=o.Util.template(this._url,{s:this._getSubdomain(t)});return u+o.Util.getParamString(this.wmsParams,u,!0)+"&BBOX="+l},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return o.Browser.ie6?(i||(i=e.createElement("div")),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i||(i=e.createElement("img")),i.src=t),i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=t.getSize(),h=0,l=0;s.x+i>r.x&&(h=s.x+i-r.x+a.x),s.x-h<0&&(h=s.x-a.x),s.y+e>r.y&&(l=s.y+e-r.y+a.y),s.y-l<0&&(l=s.y-a.y),(h||l)&&t.fire("autopanstart").panBy([h,l])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popup||this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:(t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape"); o.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){var i,n,s;if(o.Polyline.prototype.initialize.call(this,t,e),t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),i=0,n=this._holes.length;n>i;i++)s=this._holes[i]=this._convertLatLngs(this._holes[i]),s[0].equals(s[s.length-1])&&s.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i){var n,s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return n=i(u),e?e(t,n):new o.Marker(n);case"MultiPoint":for(a=0,r=u.length;r>a;a++)n=i(u[a]),h=e?e(t,n):new o.Marker(n),c.push(h);return new o.FeatureGroup(c);case"LineString":return s=this.coordsToLatLngs(u,0,i),new o.Polyline(s);case"Polygon":return s=this.coordsToLatLngs(u,1,i),new o.Polygon(s);case"MultiLineString":return s=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(s);case"MultiPolygon":return s=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(s);case"GeometryCollection":for(a=0,r=l.geometries.length;r>a;a++)h=this.geometryToLayer({geometry:l.geometries[a],type:"Feature",properties:t.properties},e,i),c.push(h);return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){return[t.lng,t.lat]},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t,e){t.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){t.push(e.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:e,coordinates:t})}})}t(o.MultiPolyline,"MultiLineString"),t(o.MultiPolygon,"MultiPolygon")}(),o.LayerGroup.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){e.toGeoJSON&&t.push(o.GeoJSON.asFeature(e.toGeoJSON()))}),{type:"FeatureCollection",features:t}}}),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.addListener(t,o.Draggable.START[i],e);return o.DomEvent.addListener(t,"click",o.DomEvent._fakeStop).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=o.Browser.ie7,s=e.body,a=e.documentElement,r=t.pageX?t.pageX-s.scrollLeft-a.scrollLeft:t.clientX,h=t.pageY?t.pageY-s.scrollTop-a.scrollTop:t.clientY,l=new o.Point(r,h),u=i.getBoundingClientRect(),c=u.left-i.clientLeft,d=u.top-i.clientTop;return o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!n||(c+=i.scrollWidth-i.clientWidth,n&&"hidden"!==o.DomUtil.getStyle(i,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(i,"overflow")&&(c+=17)),l._subtract(new o.Point(c,d))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled)){o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection();var i=t.touches?t.touches[0]:t,n=i.target;o.Browser.touch&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.Browser.touch||o.DomUtil.addClass(e.body,"leaflet-dragging")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.Browser.touch||o.DomUtil.removeClass(e.body,"leaflet-dragging");for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),this._onViewReset())}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),n)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),d=u/(e.inertiaDeceleration*r),p=c.multiplyBy(-d/2).round();p.x&&p.y?o.Util.requestAnimFrame(function(){t.panBy(p,{duration:d,easeLinearity:r,noMoveStart:!0})}):t.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setZoomAround(t.containerPoint,this._zoom+1)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&t.setZoomAround(this._lastMousePos,i+e)}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:o.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.msTouch?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.msTouch){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.msTouch){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.msTouch?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;i0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this) -},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.msTouch&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),this._map.fire("boxzoomstart"),void 0)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._pane.removeChild(this._box),this._container.style.cursor="",o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollTop||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable()},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):(o.DomEvent.disableClickPropagation(e),o.DomEvent.on(e,"mousewheel",o.DomEvent.stopPropagation));var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=this._limitZoom(e),t=o.latLng(t),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file +},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.msTouch&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),this._map.fire("boxzoomstart"),void 0)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._pane.removeChild(this._box),this._container.style.cursor="",o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable()},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):(o.DomEvent.disableClickPropagation(e),o.DomEvent.on(e,"mousewheel",o.DomEvent.stopPropagation));var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=this._limitZoom(e),t=o.latLng(t),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file From e3cd252d2db72d70d07b4975bdfb560113c472c9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 25 Jul 2013 13:15:13 +0300 Subject: [PATCH 0477/2207] update links to 0.6.4 --- download.md | 12 ++++++------ examples/quick-start.md | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/download.md b/download.md index e51b5ad1987..def33da73f5 100644 --- a/download.md +++ b/download.md @@ -11,8 +11,8 @@ title: Download Description - Leaflet 0.6.3 - Stable version, released on June 26, 2013 and last updated on July 17, 2013. + Leaflet 0.6.4 + Stable version, released on June 26, 2013 and last updated on July 25, 2013. Leaflet 0.5.1 @@ -23,7 +23,7 @@ title: Download In-progress major version, developed on the master branch. @@ -37,12 +37,12 @@ Note that the master version can contain incompatible changes, so please read th The latest stable release of Leaflet is hosted on a CDN — to start using it straight away, place this in the `head` section of your HTML code: - + - + ### Leaflet Source Code diff --git a/examples/quick-start.md b/examples/quick-start.md index b01e1e0ebe8..0919c871be6 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,14 +19,14 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS files in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From d4f515137efdaf1da75410044a5d75c46ce8c81e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 25 Jul 2013 13:16:40 +0300 Subject: [PATCH 0478/2207] add notes about 0.6 updates to blog post --- _posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md index f9e53a6bdea..f2b7e6c08ca 100644 --- a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -22,6 +22,8 @@ Grab the CDN links or downloads for the new release on the [download page](../.. **update** (June 27): 0.6.1 hotfix released with a couple of regressions fixed (particularly the one with FF scroll-zooming too fast). **update** (June 28): 0.6.2 hotfix released with a couple more minor issues fixed. +**update** (July 17): 0.6.3 released with lots of regressions and bugs fixed. +**update** (July 25): 0.6.4 released with a fix to 0.6.3 regression. P.S. Everyone who tweets/posts about the new Leaflet release or why he loves Leaflet over the next few days will get a karma boost of over 9000 points. I heard that from a passing monk in Georgetown yesterday, true story! From e6a9414567b68ea4a1b94ff7ae32ab8e6df6d7e5 Mon Sep 17 00:00:00 2001 From: Nicholas Hallahan Date: Fri, 26 Jul 2013 12:36:24 -0700 Subject: [PATCH 0479/2207] Submit LeafletPlayback plug-in --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 3b79734a81d..e822f836913 100644 --- a/plugins.md +++ b/plugins.md @@ -651,6 +651,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Yohan Boniface + + + LeafletPlayback + + Play back time-stamped GPS Tracks synchronized to a clock. + + Nicholas Hallahan + + From 20ba826f754e84bfab9d5455ea1bf583937746e1 Mon Sep 17 00:00:00 2001 From: Adam Ratcliffe Date: Wed, 31 Jul 2013 12:44:02 +1200 Subject: [PATCH 0480/2207] Add Leaflet.print plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index e822f836913..ae3545e4b3f 100644 --- a/plugins.md +++ b/plugins.md @@ -761,6 +761,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Yohan Boniface + + + Leaflet.print + + Implements the Mapfish print protocol allowing a Leaflet map to be printed using either the Mapfish or GeoServer print module. + + Adam Ratcliffe + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From 74e4f399e63bc1a4ddd12c3ebbf809c706529561 Mon Sep 17 00:00:00 2001 From: Ubergesundheit Date: Sat, 3 Aug 2013 17:02:31 +0200 Subject: [PATCH 0481/2207] Addition of Leaflet.EdgeMarker Plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index e822f836913..df41f95c41a 100644 --- a/plugins.md +++ b/plugins.md @@ -237,6 +237,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jonatan Heyman + + + Leaflet.EdgeMarker + + Plugin to indicate the existence of Features outside of the current view. + + Gerald Pape + + From 4a71f3163c341932d401efdfda1c5d5f02b82e0e Mon Sep 17 00:00:00 2001 From: Glen Robertson Date: Mon, 5 Aug 2013 08:43:30 +1200 Subject: [PATCH 0482/2207] Removed JQuery dependency note from TileLayer.GeoJSON plugin. --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index e822f836913..b0090d4fdd3 100644 --- a/plugins.md +++ b/plugins.md @@ -203,7 +203,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s TileLayer.GeoJSON - A TileLayer for GeoJSON tiles (requires JQuery). + A TileLayer for GeoJSON tiles. Glen Robertson From c40940874dfd7c03850a33f9eb7ea3267e038492 Mon Sep 17 00:00:00 2001 From: Eric Brelsford Date: Mon, 5 Aug 2013 11:44:33 -0400 Subject: [PATCH 0483/2207] Add Leaflet.loading control --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index b0090d4fdd3..e18fcdd9097 100644 --- a/plugins.md +++ b/plugins.md @@ -660,6 +660,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Nicholas Hallahan + + + Leaflet.loading + + A simple control that adds a loading indicator as tiles and other data are loaded. + + Eric Brelsford + + From 9ed6d487fe87f82d6eb53305acea34c1997317b4 Mon Sep 17 00:00:00 2001 From: Jan Marsch Date: Wed, 7 Aug 2013 00:42:35 +0200 Subject: [PATCH 0484/2207] Updated plugins.md for correct OSM Buildings url --- plugins.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins.md b/plugins.md index f3e52a8c67f..ebb06d1bc1a 100644 --- a/plugins.md +++ b/plugins.md @@ -691,11 +691,11 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - OSM Buildings + OSM Buildings - Amazing JS library for visualizing 3D OSM building data on top of Leaflet. + Amazing JS library for visualizing 3D OSM building geometry on top of Leaflet. - Jan Marsch + Jan Marsch From a762331356bf3ef75344fd358f1057ec59bc4e48 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Thu, 8 Aug 2013 13:03:16 -0400 Subject: [PATCH 0485/2207] shapefile plugin --- plugins.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index f88b135611a..34e4d876919 100644 --- a/plugins.md +++ b/plugins.md @@ -245,7 +245,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Gerald Pape - + + + + Leaflet.Shapefile + + Put a shapefile onto your map as a layer. + + Calvin Metcalf + + From 4eaa3ac47eb7ea8425058e04bae0b0aab8bb4c6b Mon Sep 17 00:00:00 2001 From: pwldp Date: Fri, 23 Aug 2013 13:57:30 +0200 Subject: [PATCH 0486/2207] Update plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 34e4d876919..322d3d3031c 100644 --- a/plugins.md +++ b/plugins.md @@ -687,6 +687,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Eric Brelsford + + + Leaflet.viewcenter + + A simple control that adds a button to change view and zoom to predefinied values in options. + + Dariusz Pawlak + + From 702ed96e75656d4fd35a0def051cba76f324f96f Mon Sep 17 00:00:00 2001 From: Adam Ratcliffe Date: Tue, 27 Aug 2013 12:33:38 +1200 Subject: [PATCH 0487/2207] Add context menu plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 322d3d3031c..ec014c62214 100644 --- a/plugins.md +++ b/plugins.md @@ -695,6 +695,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Dariusz Pawlak + + + + Leaflet.contextmenu + + A context menu for Leaflet. + + Adam Ratcliffe + From 230ee48dcb9bde2953ac9d7e7cb9408338dadfc8 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Wed, 28 Aug 2013 12:23:14 +0200 Subject: [PATCH 0488/2207] Add Leaflet.MeasureControl --- plugins.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/plugins.md b/plugins.md index ec014c62214..3fa54e70f4c 100644 --- a/plugins.md +++ b/plugins.md @@ -688,23 +688,32 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - - Leaflet.viewcenter + + Leaflet.viewcenter A simple control that adds a button to change view and zoom to predefinied values in options. Dariusz Pawlak - - - - Leaflet.contextmenu + + + + Leaflet.contextmenu A context menu for Leaflet. Adam Ratcliffe + + + Leaflet.MeasureControl + + A simple tool to measure distances on maps (*relies on Leaflet.Draw*). + + Makina Corpus + + From 1e22eef01abef886e8251f53184303c26a9e140b Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Tue, 3 Sep 2013 12:19:25 +0200 Subject: [PATCH 0489/2207] Add Leaflet.OverIntent plugin --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 3fa54e70f4c..d599b2fb5fa 100644 --- a/plugins.md +++ b/plugins.md @@ -714,6 +714,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Makina Corpus + + + Leaflet.OverIntent + + Adds a new event ``mouseintent``, that differs from ``mouseover`` since it reflects user + intentions to aim a particular layer. + + Mathieu Leplatre + + From da083da135cefdf8ab44c6236793bb41f6cbc9dd Mon Sep 17 00:00:00 2001 From: Sagie Maoz Date: Tue, 3 Sep 2013 16:40:35 +0300 Subject: [PATCH 0490/2207] Describe new autoPanPadding{TopLeft,BottomRight} Popup options Options were added in #1972. --- reference.html | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 7fe1b2c5bf0..5695f3fdf82 100644 --- a/reference.html +++ b/reference.html @@ -1648,12 +1648,26 @@
        The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays. + + autoPanPaddingTopLeft + Point + null + + The margin between the popup and the top left corner of the map view after autopanning was performed. + + + autoPanPaddingBottomRight + Point + null + + The margin between the popup and the bottom right corner of the map view after autopanning was performed. + autoPanPadding Point - Point(5, 5) + (5, 5) - The margin between the popup and the edges of the map view after autopanning was performed. + Equivalent of setting both top left and bottom right autopan padding to the same value. zoomAnimation From 24b1f252a191b0e335c15981d00b903ced678a27 Mon Sep 17 00:00:00 2001 From: Sagie Maoz Date: Tue, 3 Sep 2013 16:52:13 +0300 Subject: [PATCH 0491/2207] Undo (accidental) removal of 'Point' --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 5695f3fdf82..7ba4a338e5f 100644 --- a/reference.html +++ b/reference.html @@ -1665,7 +1665,7 @@ autoPanPadding Point - (5, 5) + Point(5, 5) Equivalent of setting both top left and bottom right autopan padding to the same value. From 0d443e3f78539cc46bb1bf6b484d142733961f2b Mon Sep 17 00:00:00 2001 From: kr1 Date: Thu, 19 Sep 2013 04:26:46 +0200 Subject: [PATCH 0492/2207] adds Leaflet.dbpediaLayer to plugin list puts the plugin in the "Services, Providers and Formats" section. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index d599b2fb5fa..2d52c317d3c 100644 --- a/plugins.md +++ b/plugins.md @@ -374,6 +374,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s K. Arthur Endsley + + + Leaflet.dbpediaLayer + + A layer with Points of interest from Wikipedia - loaded via ajax from DBpedia's SPARQL endpoint. + + Kr1 + + From 6057d3419c0af75e069e83a8e0c520d71d82fb06 Mon Sep 17 00:00:00 2001 From: Vladimir Zotov Date: Sat, 21 Sep 2013 13:53:10 +0400 Subject: [PATCH 0493/2207] Update reference.html changed invalid signature of `invalidateSize` L.Control.Scale extends L.Control, not IControl --- reference.html | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index c5ef982b904..fa603f4394f 100644 --- a/reference.html +++ b/reference.html @@ -686,8 +686,14 @@

        Methods for Modifying Map State

        invalidateSize( - <Boolean> options?, - <zoom/pan options> options? ) + <Boolean> animate ) + + this + Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. + + + invalidateSize( + <zoom/pan options> options ) this Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. @@ -4470,7 +4476,7 @@

        Events

        L.Control.Scale

        -

        A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Implements IControl interface.

        +

        A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends Control.

        L.control.scale().addTo(map);
        From 2518fee82af25b441102d1ce61562c1ec2815844 Mon Sep 17 00:00:00 2001 From: Eugene Mikhalev Date: Tue, 24 Sep 2013 17:00:32 +0700 Subject: [PATCH 0494/2207] Add Leaflet-2gis plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 2d52c317d3c..d5fb123bf71 100644 --- a/plugins.md +++ b/plugins.md @@ -383,6 +383,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Kr1 + + + Leaflet-2gis + + This plugin add 2GIS support to the leaflet + + Eugene Mikhalev + + From 5a40ba5ad35f00a5bf2d91fb934f2915bac98e3e Mon Sep 17 00:00:00 2001 From: Eugene Mikhalev Date: Tue, 24 Sep 2013 19:03:04 +0700 Subject: [PATCH 0495/2207] Update plugins.md description of Leaflet-2gis --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index d5fb123bf71..671121256df 100644 --- a/plugins.md +++ b/plugins.md @@ -387,7 +387,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet-2gis - This plugin add 2GIS support to the leaflet + Adds support for 2GIS tile layer Eugene Mikhalev From cdd179a427000bc67563bb2b320569fb7b6bf24b Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Tue, 24 Sep 2013 17:49:36 +0200 Subject: [PATCH 0496/2207] Add Leaflet.AlmostOver plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 671121256df..1ffd3c2241d 100644 --- a/plugins.md +++ b/plugins.md @@ -742,6 +742,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet.AlmostOver + + Trigger mouse events when cursor is "almost" over a layer. + + Mathieu Leplatre + + From 1589ae2fb75999419431bb44e3d98efeff23a981 Mon Sep 17 00:00:00 2001 From: Ben Welsh Date: Thu, 26 Sep 2013 13:14:02 -0700 Subject: [PATCH 0497/2207] Added simple docs for lineJoin and lineCap settings on a path --- reference.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/reference.html b/reference.html index 7fe1b2c5bf0..69489ff25cd 100644 --- a/reference.html +++ b/reference.html @@ -2292,6 +2292,18 @@

        Options

        null A string that defines the stroke dash pattern. Doesn't work on canvas-powered layers (e.g. Android 2). + + lineCap + String + null + A string that defines shape to be used at the end of the stroke. + + + lineJoin + String + null + A string that defines shape to be used at the corners of the stroke. + clickable Boolean From 6a60c0f79135d611c8c93e1d18f8930dac220070 Mon Sep 17 00:00:00 2001 From: Michael Salgado Date: Thu, 26 Sep 2013 15:38:49 -0500 Subject: [PATCH 0498/2207] Add Plugin Control Order Layers Add support to control layers for reorder overlays. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 1ffd3c2241d..24b8ecf81d2 100644 --- a/plugins.md +++ b/plugins.md @@ -751,6 +751,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mathieu Leplatre + + + Leaflet Control Order Layers + + Control for order overlay layers. + + Michael Salgado + + From 986745d46cfe79980f990530253d67a765db57d9 Mon Sep 17 00:00:00 2001 From: Michael Salgado Date: Thu, 26 Sep 2013 16:30:47 -0500 Subject: [PATCH 0499/2207] Add Plugin Control Order Layers Adds the ability to change overlay order in the layers control --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 24b8ecf81d2..f15e4d5a034 100644 --- a/plugins.md +++ b/plugins.md @@ -755,7 +755,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet Control Order Layers - Control for order overlay layers. + Adds the ability to change overlay order in the layers control. Michael Salgado From 2fc94037083364de8fd1271e4fa51039fc868f4c Mon Sep 17 00:00:00 2001 From: Vladimir Zotov Date: Fri, 4 Oct 2013 22:20:05 +0400 Subject: [PATCH 0500/2207] fixed return type --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index fa603f4394f..1f78acd2e33 100644 --- a/reference.html +++ b/reference.html @@ -3052,7 +3052,7 @@

        Methods

        <String> id )
        - Boolean + ILayer Returns the layer with the given id. From efd24f1d3acc9e7a4ae221fd15f9ed543ff3939e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Dietrich?= Date: Sat, 5 Oct 2013 19:30:53 +0200 Subject: [PATCH 0501/2207] Add Leaflet.Terminator plugin to overlay section. --- plugins.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins.md b/plugins.md index f15e4d5a034..5af26c988d7 100644 --- a/plugins.md +++ b/plugins.md @@ -255,6 +255,14 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Calvin Metcalf + + + Leaflet.Terminator + Overlay day and night regions on a map. + + Jörg Dietrich + + From d568667422279b7580c7ab1a988c2220bacc4edf Mon Sep 17 00:00:00 2001 From: Vladimir Zotov Date: Sun, 6 Oct 2013 01:44:17 +0400 Subject: [PATCH 0502/2207] Fixed setPopupContent description --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 1f78acd2e33..d44a7aadd28 100644 --- a/reference.html +++ b/reference.html @@ -1534,7 +1534,7 @@

        Methods

        this - Binds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method. + Sets an HTML content of the popup of this marker. toGeoJSON() From 8caf04f09c9d2dc292268a4580d5f1b5aea44f3e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 7 Oct 2013 22:50:47 +0300 Subject: [PATCH 0503/2207] fit incorrect closing tag, #2070 --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 5af26c988d7..59e77ac9c62 100644 --- a/plugins.md +++ b/plugins.md @@ -262,7 +262,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jörg Dietrich - + From e88e01b60912681ab8ae70f1b8f52339ea5a9270 Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Fri, 11 Oct 2013 11:01:46 +0200 Subject: [PATCH 0504/2207] Add Leaflet.layerscontrol-minimap http://jieter.github.io/Leaflet.layerscontrol-minimap/ --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 59e77ac9c62..2411eb62a3e 100644 --- a/plugins.md +++ b/plugins.md @@ -768,6 +768,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Michael Salgado + + + Leaflet.layerscontrol-minimap + + Extends the default Leaflet layers control with synced minimaps. + + Jieter + + From e39886766f488b14ae1eb8150e9acd54508ce8a9 Mon Sep 17 00:00:00 2001 From: Daniele Piccone Date: Sat, 12 Oct 2013 10:44:29 +0200 Subject: [PATCH 0505/2207] Update plugins.md I added the link to my version of a leaflet heatmap layer extending featureGroup suited for small and middle datasets https://github.com/dpiccone/leaflet-heatmap. --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 2411eb62a3e..17fe90eff2f 100644 --- a/plugins.md +++ b/plugins.md @@ -91,6 +91,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Patrick Wied + + + Leaflet Heatmap + + Lightweight and versatile heatmap layer based on CSS3 and divIcons + + + Daniele Piccone + + Leaflet.MultiTileLayer From 0a0a223e50747bd0bb5a1c8449980c49c53791ac Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Mon, 14 Oct 2013 17:26:35 +0300 Subject: [PATCH 0506/2207] popup getLatLng method added to the reference --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index d44a7aadd28..924dabbca60 100644 --- a/reference.html +++ b/reference.html @@ -1706,6 +1706,11 @@

        Methods

        this Sets the geographical point where the popup will open. + + getLatLng() + LatLng + Returns the geographical point of popup. + setContent( <String|HTMLElement> htmlContent ) From 9514eec7ede819bd810e36104f95fa71c3d53686 Mon Sep 17 00:00:00 2001 From: Daniele Piccone Date: Mon, 14 Oct 2013 16:51:06 +0200 Subject: [PATCH 0507/2207] Update plugins.md changed name to div-heatmap --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 17fe90eff2f..572061e5f9b 100644 --- a/plugins.md +++ b/plugins.md @@ -93,7 +93,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - Leaflet Heatmap + Leaflet divHeatmap Lightweight and versatile heatmap layer based on CSS3 and divIcons From bc5131305bff90aa60f12a41999a7b1c21866df3 Mon Sep 17 00:00:00 2001 From: Dave Leaver Date: Thu, 24 Oct 2013 08:59:46 +1300 Subject: [PATCH 0508/2207] Update reference.html This is a layers control, not an attribution control. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 7fe1b2c5bf0..1cf137a93c6 100644 --- a/reference.html +++ b/reference.html @@ -4361,7 +4361,7 @@

        Constructor

        new L.Control.Layers()
        L.control.layers() - Creates an attribution control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation. + Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation. From f69ca7e61728ee2056e3fb3a16416415716f1444 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 30 Oct 2013 22:00:14 +0100 Subject: [PATCH 0509/2207] plugins: Added leaflet-sidebar project --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 572061e5f9b..fb3f0a1ca64 100644 --- a/plugins.md +++ b/plugins.md @@ -787,6 +787,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jieter + + + leaflet-sidebar + + A responsive sidebar plugin. + + Tobias Bieniek + + From 63742ad6ba784119191442904373abe652664852 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Fri, 1 Nov 2013 11:59:43 -0400 Subject: [PATCH 0510/2207] add filegeodatabase plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index fb3f0a1ca64..ceac6a8f491 100644 --- a/plugins.md +++ b/plugins.md @@ -265,6 +265,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Calvin Metcalf + + + Leaflet.FileGDB + + Put an ESRI File GeoDatabase onto your map as a layer. + + Calvin Metcalf + + Leaflet.Terminator From 22f1c792a5b347fea6a480458a42451e29a6ed1c Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Fri, 1 Nov 2013 14:21:41 -0400 Subject: [PATCH 0511/2207] Document tileloadstart event --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index 924dabbca60..15b5c373f5f 100644 --- a/reference.html +++ b/reference.html @@ -1902,6 +1902,11 @@

        Events

        Event Fired when the tile layer loaded all visible tiles. + + tileloadstart + TileEvent + Fired when a tile is requested and starts loading. + tileload TileEvent From 00a8820b5bf69508aeb5aa7fa2ee4c28aa60966c Mon Sep 17 00:00:00 2001 From: Benny Lichtner Date: Tue, 5 Nov 2013 20:58:45 -0800 Subject: [PATCH 0512/2207] Updated description of L.Popup source arg https://github.com/Leaflet/Leaflet/issues/2146 --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 1cf137a93c6..0814b768665 100644 --- a/reference.html +++ b/reference.html @@ -1584,7 +1584,7 @@

        Constructor

        L.Popup( <Popup options> options?, - <object> source? ) + <ILayer> source? ) @@ -1592,7 +1592,7 @@

        Constructor

        L.popup() - Instantiates a Popup object given an optional options object that describes its appearance and location and an optional object that is used to tag the popup with a reference to the source object to which it refers. + Instantiates a Popup object given an optional options object that describes its appearance and location and an optional source object that is used to tag the popup with a reference to the ILayer to which it refers. From 3ca464f95a0d5e58350f0ddeaa3b24717c86462d Mon Sep 17 00:00:00 2001 From: Vladimir Zotov Date: Thu, 7 Nov 2013 12:44:33 +0300 Subject: [PATCH 0513/2207] an accidentally :) fixed typo --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 0814b768665..270ac071f92 100644 --- a/reference.html +++ b/reference.html @@ -4635,7 +4635,7 @@

        Methods

        Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. - cleanAllEventListeners() + clearAllEventListeners() this Removes all listeners to all events on the object.
        From c2c9f30ae7a0936f3722870629fe1f225602614c Mon Sep 17 00:00:00 2001 From: Ilya Vassilevsky Date: Sat, 9 Nov 2013 10:30:22 +0400 Subject: [PATCH 0514/2207] Fix grammar related to the word "milliseconds" --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 270ac071f92..5dfd6eafb5c 100644 --- a/reference.html +++ b/reference.html @@ -350,7 +350,7 @@

        Panning Inertia Options

        inertiaThreshold Number depends - Amount of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default. + Number of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default. @@ -1015,7 +1015,7 @@

        Locate options

        timeout Number 10000 - Number of millisecond to wait for a response from geolocation before firing a locationerror event. + Number of milliseconds to wait for a response from geolocation before firing a locationerror event. maximumAge From b439f5fc93cb8245c758bfdfd21a2c16abcf4f5f Mon Sep 17 00:00:00 2001 From: Martin Raifer Date: Thu, 14 Nov 2013 19:34:49 +0100 Subject: [PATCH 0515/2207] proper title for GeoJSON example page --- examples/geojson-example.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/geojson-example.html b/examples/geojson-example.html index 59e90b9048f..3b3f1ed8b4b 100644 --- a/examples/geojson-example.html +++ b/examples/geojson-example.html @@ -1,7 +1,7 @@ - Leaflet Layers Control Example + Leaflet GeoJSON Example From 02313757d530dfe2642dcc369e1c95bdfab51f98 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 13:40:03 +0200 Subject: [PATCH 0516/2207] remove UserVoice widget (now it's ridden with spam) --- _layouts/default.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 708a736ad0f..9fe219b983c 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -199,13 +199,13 @@

        An Open-Source JavaScript Library for Mobile-Friendly Interactiv })(); - --> From 355b0f5ed22bfe6dd63b99e24d3f295d559d4430 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 13:40:40 +0200 Subject: [PATCH 0517/2207] remove notice on the frontpage --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index ce9f5978fe2..7af1c8592e1 100644 --- a/index.md +++ b/index.md @@ -2,7 +2,7 @@ layout: default --- -

        June 26, 2013 — Leaflet 0.6 Released, Code Sprint in DC with MapBox — Read More in the Blog

        + Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. From 1c5c7f9a7e122333de3d5e0dd43dea79d7f7dc97 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 18:41:40 +0200 Subject: [PATCH 0518/2207] fix build and commit built 0.7 --- dist/leaflet-src.js | 1058 ++++++++++++++++++++----------- dist/leaflet.js | 8 +- src/layer/tile/TileLayer.WMS.js | 2 +- 3 files changed, 678 insertions(+), 390 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index 2466f5619ed..c6c6bde2daf 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -7,7 +7,7 @@ var oldL = window.L, L = {}; -L.version = '0.6.4'; +L.version = '0.7'; // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { @@ -135,19 +135,23 @@ L.Util = { return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); }, - template: function (str, data) { - return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { - var value = data[key]; - if (value === undefined) { - throw new Error('No value provided for variable ' + str); - } else if (typeof value === 'function') { - value = value(data); - } - return value; + compileTemplate: function (str, data) { + // based on https://gist.github.com/padolsey/6008842 + str = str.replace(/"/g, '\\\"'); + str = str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { + return '" + o["' + key + '"]' + (typeof data[key] === 'function' ? '(o)' : '') + ' + "'; }); + // jshint evil: true + return new Function('o', 'return "' + str + '";'); + }, + + template: function (str, data) { + var cache = L.Util._templateCache = L.Util._templateCache || {}; + cache[str] = cache[str] || L.Util.compileTemplate(str, data); + return cache[str](data); }, - isArray: function (obj) { + isArray: Array.isArray || function (obj) { return (Object.prototype.toString.call(obj) === '[object Array]'); }, @@ -337,7 +341,7 @@ L.Mixin.Events = { if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; } var events = this[eventsKey] = this[eventsKey] || {}, - contextId = context && L.stamp(context), + contextId = context && context !== this && L.stamp(context), i, len, event, type, indexKey, indexLenKey, typeIndex; // types can be a string of space-separated words @@ -350,7 +354,7 @@ L.Mixin.Events = { }; type = types[i]; - if (context) { + if (contextId) { // store listeners of a particular context in a separate hash (if it has an id) // gives a major performance boost when removing thousands of map layers @@ -397,7 +401,7 @@ L.Mixin.Events = { if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; } var events = this[eventsKey], - contextId = context && L.stamp(context), + contextId = context && context !== this && L.stamp(context), i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed; types = L.Util.splitWords(types); @@ -413,9 +417,10 @@ L.Mixin.Events = { // clear all listeners for a type if function isn't specified delete events[type]; delete events[indexKey]; + delete events[indexLenKey]; } else { - listeners = context && typeIndex ? typeIndex[contextId] : events[type]; + listeners = contextId && typeIndex ? typeIndex[contextId] : events[type]; if (listeners) { for (j = listeners.length - 1; j >= 0; j--) { @@ -458,7 +463,7 @@ L.Mixin.Events = { listeners = events[type].slice(); for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); + listeners[i].action.call(listeners[i].context, event); } } @@ -470,7 +475,7 @@ L.Mixin.Events = { if (listeners) { for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context || this, event); + listeners[i].action.call(listeners[i].context, event); } } } @@ -506,9 +511,7 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; (function () { - var ie = !!window.ActiveXObject, - ie6 = ie && !window.XMLHttpRequest, - ie7 = ie && !document.querySelector, + var ie = 'ActiveXObject' in window, ielt9 = ie && !document.addEventListener, // terrible browser detection to work around Safari / iOS / Android browser bugs @@ -518,10 +521,13 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; phantomjs = ua.indexOf('phantom') !== -1, android = ua.indexOf('android') !== -1, android23 = ua.search('android [23]') !== -1, + gecko = ua.indexOf('gecko') !== -1, mobile = typeof orientation !== undefined + '', - msTouch = window.navigator && window.navigator.msPointerEnabled && - window.navigator.msMaxTouchPoints, + msPointer = window.navigator && window.navigator.msPointerEnabled && + window.navigator.msMaxTouchPoints && !window.PointerEvent, + pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || + msPointer, retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && window.matchMedia('(min-resolution:144dpi)').matches), @@ -541,8 +547,8 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; var startName = 'ontouchstart'; - // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.MsTouch) or WebKit, etc. - if (msTouch || (startName in doc)) { + // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc. + if (pointer || (startName in doc)) { return true; } @@ -568,10 +574,9 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; L.Browser = { ie: ie, - ie6: ie6, - ie7: ie7, ielt9: ielt9, webkit: webkit, + gecko: gecko && !webkit && !window.opera && !ie, android: android, android23: android23, @@ -590,7 +595,8 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; mobileOpera: mobile && window.opera, touch: touch, - msTouch: msTouch, + msPointer: msPointer, + pointer: pointer, retina: retina }; @@ -881,8 +887,7 @@ L.DomUtil = { el = element, docBody = document.body, docEl = document.documentElement, - pos, - ie7 = L.Browser.ie7; + pos; do { top += el.offsetTop || 0; @@ -929,19 +934,6 @@ L.DomUtil = { top -= el.scrollTop || 0; left -= el.scrollLeft || 0; - // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else - // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js - if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { - left += el.scrollWidth - el.clientWidth; - - // ie7 shows the scrollbar by default and provides clientWidth counting it, so we - // need to add it back in if it is visible; scrollbar is on the left as we are RTL - if (ie7 && L.DomUtil.getStyle(el, 'overflow-y') !== 'hidden' && - L.DomUtil.getStyle(el, 'overflow') !== 'hidden') { - left += 17; - } - } - el = el.parentNode; } while (el); @@ -969,18 +961,44 @@ L.DomUtil = { }, hasClass: function (el, name) { - return (el.className.length > 0) && - new RegExp('(^|\\s)' + name + '(\\s|$)').test(el.className); + if (el.classList !== undefined) { + return el.classList.contains(name); + } + var className = L.DomUtil._getClass(el); + return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); }, addClass: function (el, name) { - if (!L.DomUtil.hasClass(el, name)) { - el.className += (el.className ? ' ' : '') + name; + if (el.classList !== undefined) { + var classes = L.Util.splitWords(name); + for (var i = 0, len = classes.length; i < len; i++) { + el.classList.add(classes[i]); + } + } else if (!L.DomUtil.hasClass(el, name)) { + var className = L.DomUtil._getClass(el); + L.DomUtil._setClass(el, (className ? className + ' ' : '') + name); } }, removeClass: function (el, name) { - el.className = L.Util.trim((' ' + el.className + ' ').replace(' ' + name + ' ', ' ')); + if (el.classList !== undefined) { + el.classList.remove(name); + } else { + L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' '))); + } + }, + + _setClass: function (el, name) { + if (el.className.baseVal === undefined) { + el.className = name; + } else { + // in case of SVG element + el.className.baseVal = name; + } + }, + + _getClass: function (el) { + return el.className.baseVal === undefined ? el.className : el.className.baseVal; }, setOpacity: function (el, value) { @@ -1089,27 +1107,39 @@ L.DomUtil.TRANSITION_END = L.DomUtil.TRANSITION + 'End' : 'transitionend'; (function () { - var userSelectProperty = L.DomUtil.testProp( - ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + if ('onselectstart' in document) { + L.extend(L.DomUtil, { + disableTextSelection: function () { + L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); + }, + + enableTextSelection: function () { + L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); + } + }); + } else { + var userSelectProperty = L.DomUtil.testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + L.extend(L.DomUtil, { + disableTextSelection: function () { + if (userSelectProperty) { + var style = document.documentElement.style; + this._userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }, + + enableTextSelection: function () { + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = this._userSelect; + delete this._userSelect; + } + } + }); + } L.extend(L.DomUtil, { - disableTextSelection: function () { - L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); - if (userSelectProperty) { - var style = document.documentElement.style; - this._userSelect = style[userSelectProperty]; - style[userSelectProperty] = 'none'; - } - }, - - enableTextSelection: function () { - L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); - if (userSelectProperty) { - document.documentElement.style[userSelectProperty] = this._userSelect; - delete this._userSelect; - } - }, - disableImageDrag: function () { L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); }, @@ -1125,16 +1155,20 @@ L.DomUtil.TRANSITION_END = * L.LatLng represents a geographical point with latitude and longitude coordinates. */ -L.LatLng = function (rawLat, rawLng) { // (Number, Number) - var lat = parseFloat(rawLat), - lng = parseFloat(rawLng); +L.LatLng = function (lat, lng, alt) { // (Number, Number, Number) + lat = parseFloat(lat); + lng = parseFloat(lng); if (isNaN(lat) || isNaN(lng)) { - throw new Error('Invalid LatLng object: (' + rawLat + ', ' + rawLng + ')'); + throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); } this.lat = lat; this.lng = lng; + + if (alt !== undefined) { + this.alt = parseFloat(alt); + } }; L.extend(L.LatLng, { @@ -1198,7 +1232,11 @@ L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Numbe return a; } if (L.Util.isArray(a)) { - return new L.LatLng(a[0], a[1]); + if (typeof a[0] === 'number' || typeof a[0] === 'string') { + return new L.LatLng(a[0], a[1], a[2]); + } else { + return null; + } } if (a === undefined || a === null) { return a; @@ -1206,6 +1244,9 @@ L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Numbe if (typeof a === 'object' && 'lat' in a) { return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); } + if (b === undefined) { + return null; + } return new L.LatLng(a, b); }; @@ -1230,8 +1271,9 @@ L.LatLngBounds.prototype = { extend: function (obj) { // (LatLng) or (LatLngBounds) if (!obj) { return this; } - if (typeof obj[0] === 'number' || typeof obj[0] === 'string' || obj instanceof L.LatLng) { - obj = L.latLng(obj); + var latLng = L.latLng(obj); + if (latLng !== null) { + obj = latLng; } else { obj = L.latLngBounds(obj); } @@ -1444,6 +1486,11 @@ L.CRS = { scale: function (zoom) { return 256 * Math.pow(2, zoom); + }, + + getSize: function (zoom) { + var s = this.scale(zoom); + return L.point(s, s); } }; @@ -1522,8 +1569,13 @@ L.Map = L.Class.extend({ initialize: function (id, options) { // (HTMLElement or String, Object) options = L.setOptions(this, options); + this._initContainer(id); this._initLayout(); + + // hack for https://github.com/Leaflet/Leaflet/issues/1980 + this._onResize = L.bind(this._onResize, this); + this._initEvents(); if (options.maxBounds) { @@ -1550,11 +1602,16 @@ L.Map = L.Class.extend({ // replaced by animation-powered implementation in Map.PanAnimation.js setView: function (center, zoom) { + zoom = zoom === undefined ? this.getZoom() : zoom; this._resetView(L.latLng(center), this._limitZoom(zoom)); return this; }, setZoom: function (zoom, options) { + if (!this._loaded) { + this._zoom = this._limitZoom(zoom); + return this; + } return this.setView(this.getCenter(), zoom, {zoom: options}); }, @@ -1592,6 +1649,8 @@ L.Map = L.Class.extend({ nePoint = this.project(bounds.getNorthEast(), zoom), center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); + zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom; + return this.setView(center, zoom, options); }, @@ -1604,7 +1663,7 @@ L.Map = L.Class.extend({ }, panBy: function (offset) { // (Point) - // replaced with animated panBy in Map.Animation.js + // replaced with animated panBy in Map.PanAnimation.js this.fire('movestart'); this._rawPanBy(L.point(offset)); @@ -1613,63 +1672,29 @@ L.Map = L.Class.extend({ return this.fire('moveend'); }, - setMaxBounds: function (bounds, options) { + setMaxBounds: function (bounds) { bounds = L.latLngBounds(bounds); this.options.maxBounds = bounds; if (!bounds) { - this._boundsMinZoom = null; - this.off('moveend', this._panInsideMaxBounds, this); - return this; + return this.off('moveend', this._panInsideMaxBounds, this); } - var minZoom = this.getBoundsZoom(bounds, true); - - this._boundsMinZoom = minZoom; - if (this._loaded) { - if (this._zoom < minZoom) { - this.setView(bounds.getCenter(), minZoom, options); - } else { - this.panInsideBounds(bounds); - } + this._panInsideMaxBounds(); } - this.on('moveend', this._panInsideMaxBounds, this); - - return this; + return this.on('moveend', this._panInsideMaxBounds, this); }, - panInsideBounds: function (bounds) { - bounds = L.latLngBounds(bounds); + panInsideBounds: function (bounds, options) { + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, bounds); - var viewBounds = this.getPixelBounds(), - viewSw = viewBounds.getBottomLeft(), - viewNe = viewBounds.getTopRight(), - sw = this.project(bounds.getSouthWest()), - ne = this.project(bounds.getNorthEast()), - dx = 0, - dy = 0; + if (center.equals(newCenter)) { return this; } - if (viewNe.y < ne.y) { // north - dy = Math.ceil(ne.y - viewNe.y); - } - if (viewNe.x > ne.x) { // east - dx = Math.floor(ne.x - viewNe.x); - } - if (viewSw.y > sw.y) { // south - dy = Math.floor(sw.y - viewSw.y); - } - if (viewSw.x < sw.x) { // west - dx = Math.ceil(sw.x - viewSw.x); - } - - if (dx || dy) { - return this.panBy([dx, dy]); - } - - return this; + return this.panTo(newCenter, options); }, addLayer: function (layer) { @@ -1704,7 +1729,7 @@ L.Map = L.Class.extend({ removeLayer: function (layer) { var id = L.stamp(layer); - if (!this._layers[id]) { return; } + if (!this._layers[id]) { return this; } if (this._loaded) { layer.onRemove(this); @@ -1752,15 +1777,14 @@ L.Map = L.Class.extend({ var oldSize = this.getSize(); this._sizeChanged = true; - - if (this.options.maxBounds) { - this.setMaxBounds(this.options.maxBounds); - } + this._initialCenter = null; if (!this._loaded) { return this; } var newSize = this.getSize(), - offset = oldSize.subtract(newSize).divideBy(2).round(); + oldCenter = oldSize.divideBy(2).round(), + newCenter = newSize.divideBy(2).round(), + offset = oldCenter.subtract(newCenter); if (!offset.x && !offset.y) { return this; } @@ -1774,9 +1798,12 @@ L.Map = L.Class.extend({ this.fire('move'); - // make sure moveend is not fired too often on resize - clearTimeout(this._sizeTimer); - this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); + if (options.debounceMoveend) { + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); + } else { + this.fire('moveend'); + } } return this.fire('resize', { @@ -1787,7 +1814,7 @@ L.Map = L.Class.extend({ // TODO handler.addTo addHandler: function (name, HandlerClass) { - if (!HandlerClass) { return; } + if (!HandlerClass) { return this; } var handler = this[name] = new HandlerClass(this); @@ -1807,7 +1834,12 @@ L.Map = L.Class.extend({ this._initEvents('off'); - delete this._container._leaflet; + try { + // throws error in IE6-8 + delete this._container._leaflet; + } catch (e) { + this._container._leaflet = undefined; + } this._clearPanes(); if (this._clearControlPos) { @@ -1825,7 +1857,7 @@ L.Map = L.Class.extend({ getCenter: function () { // (Boolean) -> LatLng this._checkIfLoaded(); - if (!this._moved()) { + if (this._initialCenter && !this._moved()) { return this._initialCenter; } return this.layerPointToLatLng(this._getCenterLayerPoint()); @@ -1844,9 +1876,9 @@ L.Map = L.Class.extend({ }, getMinZoom: function () { - var z1 = this._layersMinZoom === undefined ? 0 : this._layersMinZoom, - z2 = this._boundsMinZoom === undefined ? 0 : this._boundsMinZoom; - return this.options.minZoom === undefined ? Math.max(z1, z2) : this.options.minZoom; + return this.options.minZoom === undefined ? + (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) : + this.options.minZoom; }, getMaxZoom: function () { @@ -1998,6 +2030,7 @@ L.Map = L.Class.extend({ L.DomUtil.addClass(container, 'leaflet-container' + (L.Browser.touch ? ' leaflet-touch' : '') + (L.Browser.retina ? ' leaflet-retina' : '') + + (L.Browser.ielt9 ? ' leaflet-oldie' : '') + (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); var position = L.DomUtil.getStyle(container, 'position'); @@ -2168,12 +2201,14 @@ L.Map = L.Class.extend({ _onResize: function () { L.Util.cancelAnimFrame(this._resizeRequest); this._resizeRequest = L.Util.requestAnimFrame( - this.invalidateSize, this, false, this._container); + function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); }, _onMouseClick: function (e) { - if (!this._loaded || (!e._simulated && this.dragging && this.dragging.moved()) || - L.DomEvent._skipped(e)) { return; } + if (!this._loaded || (!e._simulated && + ((this.dragging && this.dragging.moved()) || + (this.boxZoom && this.boxZoom.moved()))) || + L.DomEvent._skipped(e)) { return; } this.fire('preclick'); this._fireMouseEvent(e); @@ -2268,6 +2303,46 @@ L.Map = L.Class.extend({ return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); }, + // adjust center for view to get inside bounds + _limitCenter: function (center, zoom, bounds) { + + if (!bounds) { return center; } + + var centerPoint = this.project(center, zoom), + viewHalf = this.getSize().divideBy(2), + viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), + offset = this._getBoundsOffset(viewBounds, bounds, zoom); + + return this.unproject(centerPoint.add(offset), zoom); + }, + + // adjust offset for view to get inside bounds + _limitOffset: function (offset, bounds) { + if (!bounds) { return offset; } + + var viewBounds = this.getPixelBounds(), + newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset)); + + return offset.add(this._getBoundsOffset(newBounds, bounds)); + }, + + // returns offset needed for pxBounds to get inside maxBounds at a specified zoom + _getBoundsOffset: function (pxBounds, maxBounds, zoom) { + var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min), + seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max), + + dx = this._rebound(nwOffset.x, -seOffset.x), + dy = this._rebound(nwOffset.y, -seOffset.y); + + return new L.Point(dx, dy); + }, + + _rebound: function (left, right) { + return left + right > 0 ? + Math.round(left - right) / 2 : + Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right)); + }, + _limitZoom: function (zoom) { var min = this.getMinZoom(), max = this.getMaxZoom(); @@ -2348,9 +2423,9 @@ L.CRS.EPSG3395 = L.extend({}, L.CRS, { transformation: (function () { var m = L.Projection.Mercator, r = m.R_MAJOR, - r2 = m.R_MINOR; + scale = 0.5 / (Math.PI * r); - return new L.Transformation(0.5 / (Math.PI * r), 0.5, -0.5 / (Math.PI * r2), 0.5); + return new L.Transformation(scale, 0.5, -scale, 0.5); }()) }); @@ -2587,7 +2662,7 @@ L.TileLayer = L.Class.extend({ this._updateZIndex(); if (this._animated) { - var className = 'leaflet-tile-container leaflet-zoom-animated'; + var className = 'leaflet-tile-container'; this._bgBuffer = L.DomUtil.create('div', className, this._container); this._tileContainer = L.DomUtil.create('div', className, this._container); @@ -2625,6 +2700,19 @@ L.TileLayer = L.Class.extend({ this._initContainer(); }, + _getTileSize: function () { + var map = this._map, + zoom = map.getZoom() + this.options.zoomOffset, + zoomN = this.options.maxNativeZoom, + tileSize = this.options.tileSize; + + if (zoomN && zoom > zoomN) { + tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); + } + + return tileSize; + }, + _update: function () { if (!this._map) { return; } @@ -2700,8 +2788,8 @@ L.TileLayer = L.Class.extend({ var limit = this._getWrapTileNum(); // don't load if exceeds world bounds - if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit)) || - tilePoint.y < 0 || tilePoint.y >= limit) { return false; } + if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) || + tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; } } if (options.bounds) { @@ -2816,8 +2904,9 @@ L.TileLayer = L.Class.extend({ }, _getWrapTileNum: function () { - // TODO refactor, limit is not valid for non-standard projections - return Math.pow(2, this._getZoomForUrl()); + var crs = this._map.options.crs, + size = crs.getSize(this._map.getZoom()); + return size.divideBy(this.options.tileSize); }, _adjustTilePoint: function (tilePoint) { @@ -2826,11 +2915,11 @@ L.TileLayer = L.Class.extend({ // wrap tile coordinates if (!this.options.continuousWorld && !this.options.noWrap) { - tilePoint.x = ((tilePoint.x % limit) + limit) % limit; + tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x; } if (this.options.tms) { - tilePoint.y = limit - tilePoint.y - 1; + tilePoint.y = limit.y - tilePoint.y - 1; } tilePoint.z = this._getZoomForUrl(); @@ -2866,6 +2955,11 @@ L.TileLayer = L.Class.extend({ if (L.Browser.ielt9 && this.options.opacity !== undefined) { L.DomUtil.setOpacity(tile, this.options.opacity); } + // without this hack, tiles disappear after zoom on Chrome for Android + // https://github.com/Leaflet/Leaflet/issues/2078 + if (L.Browser.mobileWebkit3d) { + tile.style.WebkitBackfaceVisibility = 'hidden'; + } return tile; }, @@ -2876,10 +2970,20 @@ L.TileLayer = L.Class.extend({ this._adjustTilePoint(tilePoint); tile.src = this.getTileUrl(tilePoint); + + this.fire('tileloadstart', { + tile: tile, + url: tile.src + }); }, _tileLoaded: function () { this._tilesToLoad--; + + if (this._animated) { + L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated'); + } + if (!this._tilesToLoad) { this.fire('load'); @@ -2974,13 +3078,15 @@ L.TileLayer.WMS = L.TileLayer.extend({ this._crs = this.options.crs || map.options.crs; - var projectionKey = parseFloat(this.wmsParams.version) >= 1.3 ? 'crs' : 'srs'; + this._wmsVersion = parseFloat(this.wmsParams.version); + + var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; this.wmsParams[projectionKey] = this._crs.code; L.TileLayer.prototype.onAdd.call(this, map); }, - getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String + getTileUrl: function (tilePoint) { // (Point, Number) -> String var map = this._map, tileSize = this.options.tileSize, @@ -2988,10 +3094,11 @@ L.TileLayer.WMS = L.TileLayer.extend({ nwPoint = tilePoint.multiplyBy(tileSize), sePoint = nwPoint.add([tileSize, tileSize]), - nw = this._crs.project(map.unproject(nwPoint, zoom)), - se = this._crs.project(map.unproject(sePoint, zoom)), - - bbox = [nw.x, se.y, se.x, nw.y].join(','), + nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)), + se = this._crs.project(map.unproject(sePoint, tilePoint.z)), + bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ? + [se.y, nw.x, nw.y, se.x].join(',') : + [nw.x, se.y, se.x, nw.y].join(','), url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); @@ -3034,7 +3141,7 @@ L.TileLayer.Canvas = L.TileLayer.extend({ this._reset({hard: true}); this._update(); } - + for (var i in this._tiles) { this._redrawTile(this._tiles[i]); } @@ -3155,6 +3262,15 @@ L.ImageOverlay = L.Class.extend({ return this; }, + setUrl: function (url) { + this._url = url; + this._image.src = this._url; + }, + + getAttribution: function () { + return this.options.attribution; + }, + _initImage: function () { this._image = L.DomUtil.create('img', 'leaflet-image-layer'); @@ -3298,19 +3414,8 @@ L.Icon = L.Class.extend({ }, _createImg: function (src, el) { - - if (!L.Browser.ie6) { - if (!el) { - el = document.createElement('img'); - } - el.src = src; - } else { - if (!el) { - el = document.createElement('div'); - } - el.style.filter = - 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")'; - } + el = el || document.createElement('img'); + el.src = src; return el; }, @@ -3391,6 +3496,7 @@ L.Marker = L.Class.extend({ options: { icon: new L.Icon.Default(), title: '', + alt: '', clickable: true, draggable: false, keyboard: true, @@ -3412,6 +3518,7 @@ L.Marker = L.Class.extend({ this._initIcon(); this.update(); + this.fire('add'); if (map.options.zoomAnimation && map.options.markerZoomAnimation) { map.on('zoomanim', this._animateZoom, this); @@ -3469,6 +3576,10 @@ L.Marker = L.Class.extend({ this.update(); } + if (this._popup) { + this.bindPopup(this._popup); + } + return this; }, @@ -3500,6 +3611,10 @@ L.Marker = L.Class.extend({ if (options.title) { icon.title = options.title; } + + if (options.alt) { + icon.alt = options.alt; + } } L.DomUtil.addClass(icon, classToAdd); @@ -3584,7 +3699,7 @@ L.Marker = L.Class.extend({ }, _animateZoom: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); this._setPos(pos); }, @@ -3665,7 +3780,7 @@ L.Marker = L.Class.extend({ if (this._map) { this._updateOpacity(); } - + return this; }, @@ -3751,11 +3866,13 @@ L.Popup = L.Class.extend({ options: { minWidth: 50, maxWidth: 300, - maxHeight: null, + // maxHeight: null, autoPan: true, closeButton: true, offset: [0, 7], autoPanPadding: [5, 5], + // autoPanPaddingTopLeft: null, + // autoPanPaddingBottomRight: null, keepInView: false, className: '', zoomAnimation: true @@ -3775,7 +3892,6 @@ L.Popup = L.Class.extend({ if (!this._container) { this._initLayout(); } - this._updateContent(); var animFade = map.options.fadeAnimation; @@ -3786,7 +3902,7 @@ L.Popup = L.Class.extend({ map.on(this._getEvents(), this); - this._update(); + this.update(); if (animFade) { L.DomUtil.setOpacity(this._container, 1); @@ -3833,18 +3949,43 @@ L.Popup = L.Class.extend({ } }, + getLatLng: function () { + return this._latlng; + }, + setLatLng: function (latlng) { this._latlng = L.latLng(latlng); - this._update(); + if (this._map) { + this._updatePosition(); + this._adjustPan(); + } return this; }, + getContent: function () { + return this._content; + }, + setContent: function (content) { this._content = content; - this._update(); + this.update(); return this; }, + update: function () { + if (!this._map) { return; } + + this._container.style.visibility = 'hidden'; + + this._updateContent(); + this._updateLayout(); + this._updatePosition(); + + this._container.style.visibility = ''; + + this._adjustPan(); + }, + _getEvents: function () { var events = { viewreset: this._updatePosition @@ -3891,27 +4032,14 @@ L.Popup = L.Class.extend({ L.DomEvent.disableClickPropagation(wrapper); this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); - L.DomEvent.on(this._contentNode, 'mousewheel', L.DomEvent.stopPropagation); - L.DomEvent.on(this._contentNode, 'MozMousePixelScroll', L.DomEvent.stopPropagation); + + L.DomEvent.disableScrollPropagation(this._contentNode); L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); + this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); }, - _update: function () { - if (!this._map) { return; } - - this._container.style.visibility = 'hidden'; - - this._updateContent(); - this._updateLayout(); - this._updatePosition(); - - this._container.style.visibility = ''; - - this._adjustPan(); - }, - _updateContent: function () { if (!this._content) { return; } @@ -3996,21 +4124,23 @@ L.Popup = L.Class.extend({ var containerPos = map.layerPointToContainerPoint(layerPos), padding = L.point(this.options.autoPanPadding), + paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding), + paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding), size = map.getSize(), dx = 0, dy = 0; - if (containerPos.x + containerWidth > size.x) { // right - dx = containerPos.x + containerWidth - size.x + padding.x; + if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right + dx = containerPos.x + containerWidth - size.x + paddingBR.x; } - if (containerPos.x - dx < 0) { // left - dx = containerPos.x - padding.x; + if (containerPos.x - dx - paddingTL.x < 0) { // left + dx = containerPos.x - paddingTL.x; } - if (containerPos.y + containerHeight > size.y) { // bottom - dy = containerPos.y + containerHeight - size.y + padding.y; + if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom + dy = containerPos.y + containerHeight - size.y + paddingBR.y; } - if (containerPos.y - dy < 0) { // top - dy = containerPos.y - padding.y; + if (containerPos.y - dy - paddingTL.y < 0) { // top + dy = containerPos.y - paddingTL.y; } if (dx || dy) { @@ -4105,11 +4235,12 @@ L.Marker.include({ options = L.extend({offset: anchor}, options); - if (!this._popup) { + if (!this._popupHandlersAdded) { this .on('click', this.togglePopup, this) .on('remove', this.closePopup, this) .on('move', this._movePopup, this); + this._popupHandlersAdded = true; } if (content instanceof L.Popup) { @@ -4134,13 +4265,18 @@ L.Marker.include({ if (this._popup) { this._popup = null; this - .off('click', this.togglePopup) - .off('remove', this.closePopup) - .off('move', this._movePopup); + .off('click', this.togglePopup, this) + .off('remove', this.closePopup, this) + .off('move', this._movePopup, this); + this._popupHandlersAdded = false; } return this; }, + getPopup: function () { + return this._popup; + }, + _movePopup: function (e) { this._popup.setLatLng(e.latlng); } @@ -4281,7 +4417,9 @@ L.FeatureGroup = L.LayerGroup.extend({ return this; } - layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); + if ('on' in layer) { + layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); + } L.LayerGroup.prototype.addLayer.call(this, layer); @@ -4317,6 +4455,15 @@ L.FeatureGroup = L.LayerGroup.extend({ return this.invoke('bindPopup', content, options); }, + openPopup: function (latlng) { + // open popup on the first layer + for (var id in this._layers) { + this._layers[id].openPopup(latlng); + break; + } + return this; + }, + setStyle: function (style) { return this.invoke('setStyle', style); }, @@ -4340,11 +4487,10 @@ L.FeatureGroup = L.LayerGroup.extend({ }, _propagateEvent: function (e) { - if (!e.layer) { - e.layer = e.target; - } - e.target = this; - + e = L.extend({}, e, { + layer: e.target, + target: this + }); this.fire(e.type, e); } }); @@ -4376,6 +4522,8 @@ L.Path = L.Class.extend({ stroke: true, color: '#0033ff', dashArray: null, + lineCap: null, + lineJoin: null, weight: 5, opacity: 0.5, @@ -4525,6 +4673,11 @@ L.Path = L.Path.extend({ this._container = this._createElement('g'); this._path = this._createElement('path'); + + if (this.options.className) { + L.DomUtil.addClass(this._path, this.options.className); + } + this._container.appendChild(this._path); }, @@ -4555,6 +4708,12 @@ L.Path = L.Path.extend({ } else { this._path.removeAttribute('stroke-dasharray'); } + if (this.options.lineCap) { + this._path.setAttribute('stroke-linecap', this.options.lineCap); + } + if (this.options.lineJoin) { + this._path.setAttribute('stroke-linejoin', this.options.lineJoin); + } } else { this._path.setAttribute('stroke', 'none'); } @@ -4579,7 +4738,7 @@ L.Path = L.Path.extend({ _initEvents: function () { if (this.options.clickable) { if (L.Browser.svg || !L.Browser.vml) { - this._path.setAttribute('class', 'leaflet-clickable'); + L.DomUtil.addClass(this._path, 'leaflet-clickable'); } L.DomEvent.on(this._container, 'click', this._onMouseClick, this); @@ -4629,14 +4788,14 @@ L.Map.include({ this._panes.overlayPane.appendChild(this._pathRoot); if (this.options.zoomAnimation && L.Browser.any3d) { - this._pathRoot.setAttribute('class', ' leaflet-zoom-animated'); + L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated'); this.on({ 'zoomanim': this._animatePathZoom, 'zoomend': this._endPathZoom }); } else { - this._pathRoot.setAttribute('class', ' leaflet-zoom-hide'); + L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide'); } this.on('moveend', this._updateSvgViewport); @@ -4803,10 +4962,14 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ _initPath: function () { var container = this._container = this._createElement('shape'); - L.DomUtil.addClass(container, 'leaflet-vml-shape'); + + L.DomUtil.addClass(container, 'leaflet-vml-shape' + + (this.options.className ? ' ' + this.options.className : '')); + if (this.options.clickable) { L.DomUtil.addClass(container, 'leaflet-clickable'); } + container.coordsize = '1 1'; this._path = this._createElement('path'); @@ -4839,12 +5002,18 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ stroke.opacity = options.opacity; if (options.dashArray) { - stroke.dashStyle = options.dashArray instanceof Array ? + stroke.dashStyle = L.Util.isArray(options.dashArray) ? options.dashArray.join(' ') : options.dashArray.replace(/( *, *)/g, ' '); } else { stroke.dashStyle = ''; } + if (options.lineCap) { + stroke.endcap = options.lineCap.replace('butt', 'flat'); + } + if (options.lineJoin) { + stroke.joinstyle = options.lineJoin; + } } else if (stroke) { container.removeChild(stroke); @@ -5524,10 +5693,12 @@ L.Polygon = L.Polyline.extend({ }, initialize: function (latlngs, options) { - var i, len, hole; - L.Polyline.prototype.initialize.call(this, latlngs, options); + this._initWithHoles(latlngs); + }, + _initWithHoles: function (latlngs) { + var i, len, hole; if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { this._latlngs = this._convertLatLngs(latlngs[0]); this._holes = latlngs.slice(1); @@ -5568,6 +5739,15 @@ L.Polygon = L.Polyline.extend({ } }, + setLatLngs: function (latlngs) { + if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { + this._initWithHoles(latlngs); + return this.redraw(); + } else { + return L.Polyline.prototype.setLatLngs.call(this, latlngs); + } + }, + _clipPoints: function () { var points = this._originalPoints, newParts = []; @@ -5809,9 +5989,20 @@ L.CircleMarker = L.Circle.extend({ this.setRadius(this.options.radius); }, + setLatLng: function (latlng) { + L.Circle.prototype.setLatLng.call(this, latlng); + if (this._popup && this._popup._isOpen) { + this._popup.setLatLng(latlng); + } + }, + setRadius: function (radius) { this.options.radius = this._radius = radius; return this.redraw(); + }, + + getRadius: function () { + return this._radius; } }); @@ -5957,7 +6148,7 @@ L.GeoJSON = L.FeatureGroup.extend({ if (options.filter && !options.filter(geojson)) { return; } - var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng); + var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options); layer.feature = L.GeoJSON.asFeature(geojson); layer.defaultOptions = layer.options; @@ -5997,11 +6188,11 @@ L.GeoJSON = L.FeatureGroup.extend({ }); L.extend(L.GeoJSON, { - geometryToLayer: function (geojson, pointToLayer, coordsToLatLng) { + geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) { var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, coords = geometry.coordinates, layers = [], - latlng, latlngs, i, len, layer; + latlng, latlngs, i, len; coordsToLatLng = coordsToLatLng || this.coordsToLatLng; @@ -6013,37 +6204,37 @@ L.extend(L.GeoJSON, { case 'MultiPoint': for (i = 0, len = coords.length; i < len; i++) { latlng = coordsToLatLng(coords[i]); - layer = pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); - layers.push(layer); + layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); } return new L.FeatureGroup(layers); case 'LineString': latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); - return new L.Polyline(latlngs); + return new L.Polyline(latlngs, vectorOptions); case 'Polygon': + if (coords.length === 2 && !coords[1].length) { + throw new Error('Invalid GeoJSON object.'); + } latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.Polygon(latlngs); + return new L.Polygon(latlngs, vectorOptions); case 'MultiLineString': latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.MultiPolyline(latlngs); + return new L.MultiPolyline(latlngs, vectorOptions); case 'MultiPolygon': latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); - return new L.MultiPolygon(latlngs); + return new L.MultiPolygon(latlngs, vectorOptions); case 'GeometryCollection': for (i = 0, len = geometry.geometries.length; i < len; i++) { - layer = this.geometryToLayer({ + layers.push(this.geometryToLayer({ geometry: geometry.geometries[i], type: 'Feature', properties: geojson.properties - }, pointToLayer, coordsToLatLng); - - layers.push(layer); + }, pointToLayer, coordsToLatLng, vectorOptions)); } return new L.FeatureGroup(layers); @@ -6053,7 +6244,7 @@ L.extend(L.GeoJSON, { }, coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng - return new L.LatLng(coords[1], coords[0]); + return new L.LatLng(coords[1], coords[0], coords[2]); }, coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array @@ -6071,8 +6262,13 @@ L.extend(L.GeoJSON, { return latlngs; }, - latLngToCoords: function (latLng) { - return [latLng.lng, latLng.lat]; + latLngToCoords: function (latlng) { + var coords = [latlng.lng, latlng.lat]; + + if (latlng.alt !== undefined) { + coords.push(latlng.alt); + } + return coords; }, latLngsToCoords: function (latLngs) { @@ -6147,43 +6343,58 @@ L.Polygon.include({ }); (function () { - function includeMulti(Klass, type) { - Klass.include({ - toGeoJSON: function () { - var coords = []; + function multiToGeoJSON(type) { + return function () { + var coords = []; - this.eachLayer(function (layer) { - coords.push(layer.toGeoJSON().geometry.coordinates); - }); + this.eachLayer(function (layer) { + coords.push(layer.toGeoJSON().geometry.coordinates); + }); - return L.GeoJSON.getFeature(this, { - type: type, - coordinates: coords - }); - } - }); + return L.GeoJSON.getFeature(this, { + type: type, + coordinates: coords + }); + }; } - includeMulti(L.MultiPolyline, 'MultiLineString'); - includeMulti(L.MultiPolygon, 'MultiPolygon'); -}()); + L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')}); + L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')}); -L.LayerGroup.include({ - toGeoJSON: function () { - var features = []; + L.LayerGroup.include({ + toGeoJSON: function () { - this.eachLayer(function (layer) { - if (layer.toGeoJSON) { - features.push(L.GeoJSON.asFeature(layer.toGeoJSON())); + var geometry = this.feature && this.feature.geometry, + jsons = [], + json; + + if (geometry && geometry.type === 'MultiPoint') { + return multiToGeoJSON('MultiPoint').call(this); } - }); - return { - type: 'FeatureCollection', - features: features - }; - } -}); + var isGeometryCollection = geometry && geometry.type === 'GeometryCollection'; + + this.eachLayer(function (layer) { + if (layer.toGeoJSON) { + json = layer.toGeoJSON(); + jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json)); + } + }); + + if (isGeometryCollection) { + return L.GeoJSON.getFeature(this, { + geometries: jsons, + type: 'GeometryCollection' + }); + } + + return { + type: 'FeatureCollection', + features: jsons + }; + } + }); +}()); L.geoJson = function (geojson, options) { return new L.GeoJSON(geojson, options); @@ -6208,8 +6419,8 @@ L.DomEvent = { return fn.call(context || obj, e || L.DomEvent._getEvent()); }; - if (L.Browser.msTouch && type.indexOf('touch') === 0) { - return this.addMsTouchListener(obj, type, handler, id); + if (L.Browser.pointer && type.indexOf('touch') === 0) { + return this.addPointerListener(obj, type, handler, id); } if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { this.addDoubleTapListener(obj, handler, id); @@ -6261,8 +6472,8 @@ L.DomEvent = { if (!handler) { return this; } - if (L.Browser.msTouch && type.indexOf('touch') === 0) { - this.removeMsTouchListener(obj, type, id); + if (L.Browser.pointer && type.indexOf('touch') === 0) { + this.removePointerListener(obj, type, id); } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { this.removeDoubleTapListener(obj, id); @@ -6293,19 +6504,29 @@ L.DomEvent = { } else { e.cancelBubble = true; } + L.DomEvent._skipped(e); + return this; }, + disableScrollPropagation: function (el) { + var stop = L.DomEvent.stopPropagation; + + return L.DomEvent + .on(el, 'mousewheel', stop) + .on(el, 'MozMousePixelScroll', stop); + }, + disableClickPropagation: function (el) { var stop = L.DomEvent.stopPropagation; for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.addListener(el, L.Draggable.START[i], stop); + L.DomEvent.on(el, L.Draggable.START[i], stop); } return L.DomEvent - .addListener(el, 'click', L.DomEvent._fakeStop) - .addListener(el, 'dblclick', stop); + .on(el, 'click', L.DomEvent._fakeStop) + .on(el, 'dblclick', stop); }, preventDefault: function (e) { @@ -6319,34 +6540,31 @@ L.DomEvent = { }, stop: function (e) { - return L.DomEvent.preventDefault(e).stopPropagation(e); + return L.DomEvent + .preventDefault(e) + .stopPropagation(e); }, getMousePosition: function (e, container) { - - var ie7 = L.Browser.ie7, - body = document.body, + var body = document.body, docEl = document.documentElement, - x = e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft: e.clientX, + //gecko makes scrollLeft more negative as you scroll in rtl, other browsers don't + //ref: https://code.google.com/p/closure-library/source/browse/closure/goog/style/bidi.js + x = L.DomUtil.documentIsLtr() ? + (e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft : e.clientX) : + (L.Browser.gecko ? e.pageX - body.scrollLeft - docEl.scrollLeft : + e.pageX ? e.pageX - body.scrollLeft + docEl.scrollLeft : e.clientX), y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop: e.clientY, - pos = new L.Point(x, y), - rect = container.getBoundingClientRect(), - left = rect.left - container.clientLeft, - top = rect.top - container.clientTop; - - // webkit (and ie <= 7) handles RTL scrollLeft different to everyone else - // https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js - if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) { - left += container.scrollWidth - container.clientWidth; + pos = new L.Point(x, y); - // ie7 shows the scrollbar by default and provides clientWidth counting it, so we - // need to add it back in if it is visible; scrollbar is on the left as we are RTL - if (ie7 && L.DomUtil.getStyle(container, 'overflow-y') !== 'hidden' && - L.DomUtil.getStyle(container, 'overflow') !== 'hidden') { - left += 17; - } + if (!container) { + return pos; } + var rect = container.getBoundingClientRect(), + left = rect.left - container.clientLeft, + top = rect.top - container.clientTop; + return pos._subtract(new L.Point(left, top)); }, @@ -6446,11 +6664,13 @@ L.Draggable = L.Class.extend({ END: { mousedown: 'mouseup', touchstart: 'touchend', + pointerdown: 'touchend', MSPointerDown: 'touchend' }, MOVE: { mousedown: 'mousemove', touchstart: 'touchmove', + pointerdown: 'touchmove', MSPointerDown: 'touchmove' } }, @@ -6482,28 +6702,21 @@ L.Draggable = L.Class.extend({ }, _onDown: function (e) { + this._moved = false; + if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } - L.DomEvent - .stopPropagation(e); + L.DomEvent.stopPropagation(e); if (L.Draggable._disabled) { return; } L.DomUtil.disableImageDrag(); L.DomUtil.disableTextSelection(); - var first = e.touches ? e.touches[0] : e, - el = first.target; - - // if touching a link, highlight it - if (L.Browser.touch && el.tagName.toLowerCase() === 'a') { - L.DomUtil.addClass(el, 'leaflet-active'); - } - - this._moved = false; - if (this._moving) { return; } + var first = e.touches ? e.touches[0] : e; + this._startPoint = new L.Point(first.clientX, first.clientY); this._startPos = this._newPos = L.DomUtil.getPosition(this._element); @@ -6513,7 +6726,10 @@ L.Draggable = L.Class.extend({ }, _onMove: function (e) { - if (e.touches && e.touches.length > 1) { return; } + if (e.touches && e.touches.length > 1) { + this._moved = true; + return; + } var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), newPoint = new L.Point(first.clientX, first.clientY), @@ -6529,9 +6745,8 @@ L.Draggable = L.Class.extend({ this._moved = true; this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); - if (!L.Browser.touch) { - L.DomUtil.addClass(document.body, 'leaflet-dragging'); - } + L.DomUtil.addClass(document.body, 'leaflet-dragging'); + L.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target'); } this._newPos = this._startPos.add(offset); @@ -6547,10 +6762,9 @@ L.Draggable = L.Class.extend({ this.fire('drag'); }, - _onUp: function () { - if (!L.Browser.touch) { - L.DomUtil.removeClass(document.body, 'leaflet-dragging'); - } + _onUp: function (e) { + L.DomUtil.removeClass(document.body, 'leaflet-dragging'); + L.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target'); for (var i in L.Draggable.MOVE) { L.DomEvent @@ -6565,7 +6779,9 @@ L.Draggable = L.Class.extend({ // ensure drag is not fired after dragend L.Util.cancelAnimFrame(this._animRequest); - this.fire('dragend'); + this.fire('dragend', { + distance: this._newPos.distanceTo(this._startPos) + }); } this._moving = false; @@ -6637,7 +6853,7 @@ L.Map.Drag = L.Handler.extend({ this._draggable.on('predrag', this._onPreDrag, this); map.on('viewreset', this._onViewReset, this); - this._onViewReset(); + map.whenReady(this._onViewReset, this); } } this._draggable.enable(); @@ -6709,14 +6925,14 @@ L.Map.Drag = L.Handler.extend({ this._draggable._newPos.x = newX; }, - _onDragEnd: function () { + _onDragEnd: function (e) { var map = this._map, options = map.options, delay = +new Date() - this._lastTime, noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; - map.fire('dragend'); + map.fire('dragend', e); if (noInertia) { map.fire('moveend'); @@ -6740,6 +6956,8 @@ L.Map.Drag = L.Handler.extend({ map.fire('moveend'); } else { + offset = map._limitOffset(offset, map.options.maxBounds); + L.Util.requestAnimFrame(function () { map.panBy(offset, { duration: decelerationDuration, @@ -6765,15 +6983,22 @@ L.Map.mergeOptions({ L.Map.DoubleClickZoom = L.Handler.extend({ addHooks: function () { - this._map.on('dblclick', this._onDoubleClick); + this._map.on('dblclick', this._onDoubleClick, this); }, removeHooks: function () { - this._map.off('dblclick', this._onDoubleClick); + this._map.off('dblclick', this._onDoubleClick, this); }, _onDoubleClick: function (e) { - this.setZoomAround(e.containerPoint, this._zoom + 1); + var map = this._map, + zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1); + + if (map.options.doubleClickZoom === 'center') { + map.setZoom(zoom); + } else { + map.setZoomAround(e.containerPoint, zoom); + } } }); @@ -6833,7 +7058,11 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ if (!delta) { return; } - map.setZoomAround(this._lastMousePos, zoom + delta); + if (map.options.scrollWheelZoom === 'center') { + map.setZoom(zoom + delta); + } else { + map.setZoomAround(this._lastMousePos, zoom + delta); + } } }); @@ -6846,8 +7075,8 @@ L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); L.extend(L.DomEvent, { - _touchstart: L.Browser.msTouch ? 'MSPointerDown' : 'touchstart', - _touchend: L.Browser.msTouch ? 'MSPointerUp' : 'touchend', + _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', + _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', // inspired by Zepto touch code by Thomas Fuchs addDoubleTapListener: function (obj, handler, id) { @@ -6863,7 +7092,7 @@ L.extend(L.DomEvent, { function onTouchStart(e) { var count; - if (L.Browser.msTouch) { + if (L.Browser.pointer) { trackedTouches.push(e.pointerId); count = trackedTouches.length; } else { @@ -6882,7 +7111,7 @@ L.extend(L.DomEvent, { } function onTouchEnd(e) { - if (L.Browser.msTouch) { + if (L.Browser.pointer) { var idx = trackedTouches.indexOf(e.pointerId); if (idx === -1) { return; @@ -6891,7 +7120,7 @@ L.extend(L.DomEvent, { } if (doubleTap) { - if (L.Browser.msTouch) { + if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events var newTouch = { }, prop; @@ -6915,15 +7144,15 @@ L.extend(L.DomEvent, { obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; - // on msTouch we need to listen on the document, otherwise a drag starting on the map and moving off screen + // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen // will not come through to us, so we will lose track of how many touches are ongoing - var endElement = L.Browser.msTouch ? document.documentElement : obj; + var endElement = L.Browser.pointer ? document.documentElement : obj; obj.addEventListener(touchstart, onTouchStart, false); endElement.addEventListener(touchend, onTouchEnd, false); - if (L.Browser.msTouch) { - endElement.addEventListener('MSPointerCancel', onTouchEnd, false); + if (L.Browser.pointer) { + endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); } return this; @@ -6933,11 +7162,12 @@ L.extend(L.DomEvent, { var pre = '_leaflet_'; obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - (L.Browser.msTouch ? document.documentElement : obj).removeEventListener( + (L.Browser.pointer ? document.documentElement : obj).removeEventListener( this._touchend, obj[pre + this._touchend + id], false); - if (L.Browser.msTouch) { - document.documentElement.removeEventListener('MSPointerCancel', obj[pre + this._touchend + id], false); + if (L.Browser.pointer) { + document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], + false); } return this; @@ -6951,81 +7181,90 @@ L.extend(L.DomEvent, { L.extend(L.DomEvent, { - _msTouches: [], - _msDocumentListener: false, + //static + POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', + POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', + POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', + POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', - // Provides a touch events wrapper for msPointer events. + _pointers: [], + _pointerDocumentListener: false, + + // Provides a touch events wrapper for (ms)pointer events. // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 + //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 - addMsTouchListener: function (obj, type, handler, id) { + addPointerListener: function (obj, type, handler, id) { switch (type) { case 'touchstart': - return this.addMsTouchListenerStart(obj, type, handler, id); + return this.addPointerListenerStart(obj, type, handler, id); case 'touchend': - return this.addMsTouchListenerEnd(obj, type, handler, id); + return this.addPointerListenerEnd(obj, type, handler, id); case 'touchmove': - return this.addMsTouchListenerMove(obj, type, handler, id); + return this.addPointerListenerMove(obj, type, handler, id); default: throw 'Unknown touch event type'; } }, - addMsTouchListenerStart: function (obj, type, handler, id) { + addPointerListenerStart: function (obj, type, handler, id) { var pre = '_leaflet_', - touches = this._msTouches; + pointers = this._pointers; var cb = function (e) { + L.DomEvent.preventDefault(e); + var alreadyInArray = false; - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { + for (var i = 0; i < pointers.length; i++) { + if (pointers[i].pointerId === e.pointerId) { alreadyInArray = true; break; } } if (!alreadyInArray) { - touches.push(e); + pointers.push(e); } - e.touches = touches.slice(); + e.touches = pointers.slice(); e.changedTouches = [e]; handler(e); }; obj[pre + 'touchstart' + id] = cb; - obj.addEventListener('MSPointerDown', cb, false); + obj.addEventListener(this.POINTER_DOWN, cb, false); - // need to also listen for end events to keep the _msTouches list accurate + // need to also listen for end events to keep the _pointers list accurate // this needs to be on the body and never go away - if (!this._msDocumentListener) { + if (!this._pointerDocumentListener) { var internalCb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); + for (var i = 0; i < pointers.length; i++) { + if (pointers[i].pointerId === e.pointerId) { + pointers.splice(i, 1); break; } } }; //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener('MSPointerUp', internalCb, false); - document.documentElement.addEventListener('MSPointerCancel', internalCb, false); + document.documentElement.addEventListener(this.POINTER_UP, internalCb, false); + document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false); - this._msDocumentListener = true; + this._pointerDocumentListener = true; } return this; }, - addMsTouchListenerMove: function (obj, type, handler, id) { + addPointerListenerMove: function (obj, type, handler, id) { var pre = '_leaflet_', - touches = this._msTouches; + touches = this._pointers; function cb(e) { // don't fire touch moves when mouse isn't down - if (e.pointerType === e.MSPOINTER_TYPE_MOUSE && e.buttons === 0) { return; } + if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } for (var i = 0; i < touches.length; i++) { if (touches[i].pointerId === e.pointerId) { @@ -7041,14 +7280,14 @@ L.extend(L.DomEvent, { } obj[pre + 'touchmove' + id] = cb; - obj.addEventListener('MSPointerMove', cb, false); + obj.addEventListener(this.POINTER_MOVE, cb, false); return this; }, - addMsTouchListenerEnd: function (obj, type, handler, id) { + addPointerListenerEnd: function (obj, type, handler, id) { var pre = '_leaflet_', - touches = this._msTouches; + touches = this._pointers; var cb = function (e) { for (var i = 0; i < touches.length; i++) { @@ -7065,26 +7304,26 @@ L.extend(L.DomEvent, { }; obj[pre + 'touchend' + id] = cb; - obj.addEventListener('MSPointerUp', cb, false); - obj.addEventListener('MSPointerCancel', cb, false); + obj.addEventListener(this.POINTER_UP, cb, false); + obj.addEventListener(this.POINTER_CANCEL, cb, false); return this; }, - removeMsTouchListener: function (obj, type, id) { + removePointerListener: function (obj, type, id) { var pre = '_leaflet_', cb = obj[pre + type + id]; switch (type) { case 'touchstart': - obj.removeEventListener('MSPointerDown', cb, false); + obj.removeEventListener(this.POINTER_DOWN, cb, false); break; case 'touchmove': - obj.removeEventListener('MSPointerMove', cb, false); + obj.removeEventListener(this.POINTER_MOVE, cb, false); break; case 'touchend': - obj.removeEventListener('MSPointerUp', cb, false); - obj.removeEventListener('MSPointerCancel', cb, false); + obj.removeEventListener(this.POINTER_UP, cb, false); + obj.removeEventListener(this.POINTER_CANCEL, cb, false); break; } @@ -7098,7 +7337,8 @@ L.extend(L.DomEvent, { */ L.Map.mergeOptions({ - touchZoom: L.Browser.touch && !L.Browser.android23 + touchZoom: L.Browser.touch && !L.Browser.android23, + bounceAtZoomLimits: true }); L.Map.TouchZoom = L.Handler.extend({ @@ -7151,6 +7391,11 @@ L.Map.TouchZoom = L.Handler.extend({ if (this._scale === 1) { return; } + if (!map.options.bounceAtZoomLimits) { + if ((map.getZoom() === map.getMinZoom() && this._scale < 1) || + (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; } + } + if (!this._moved) { L.DomUtil.addClass(map._mapPane, 'leaflet-touching'); @@ -7254,7 +7499,7 @@ L.Map.Tap = L.Handler.extend({ this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); // if touching a link, highlight it - if (el.tagName.toLowerCase() === 'a') { + if (el.tagName && el.tagName.toLowerCase() === 'a') { L.DomUtil.addClass(el, 'leaflet-active'); } @@ -7284,7 +7529,7 @@ L.Map.Tap = L.Handler.extend({ var first = e.changedTouches[0], el = first.target; - if (el.tagName.toLowerCase() === 'a') { + if (el && el.tagName && el.tagName.toLowerCase() === 'a') { L.DomUtil.removeClass(el, 'leaflet-active'); } @@ -7320,7 +7565,7 @@ L.Map.Tap = L.Handler.extend({ } }); -if (L.Browser.touch && !L.Browser.msTouch) { +if (L.Browser.touch && !L.Browser.pointer) { L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); } @@ -7339,6 +7584,7 @@ L.Map.BoxZoom = L.Handler.extend({ this._map = map; this._container = map._container; this._pane = map._panes.overlayPane; + this._moved = false; }, addHooks: function () { @@ -7347,9 +7593,16 @@ L.Map.BoxZoom = L.Handler.extend({ removeHooks: function () { L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); + this._moved = false; + }, + + moved: function () { + return this._moved; }, _onMouseDown: function (e) { + this._moved = false; + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } L.DomUtil.disableTextSelection(); @@ -7357,21 +7610,22 @@ L.Map.BoxZoom = L.Handler.extend({ this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); - L.DomUtil.setPosition(this._box, this._startLayerPoint); - - //TODO refactor: move cursor to styles - this._container.style.cursor = 'crosshair'; - L.DomEvent .on(document, 'mousemove', this._onMouseMove, this) .on(document, 'mouseup', this._onMouseUp, this) .on(document, 'keydown', this._onKeyDown, this); - - this._map.fire('boxzoomstart'); }, _onMouseMove: function (e) { + if (!this._moved) { + this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); + L.DomUtil.setPosition(this._box, this._startLayerPoint); + + //TODO refactor: move cursor to styles + this._container.style.cursor = 'crosshair'; + this._map.fire('boxzoomstart'); + } + var startPoint = this._startLayerPoint, box = this._box, @@ -7384,14 +7638,18 @@ L.Map.BoxZoom = L.Handler.extend({ L.DomUtil.setPosition(box, newPos); + this._moved = true; + // TODO refactor: remove hardcoded 4 pixels box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; }, _finish: function () { - this._pane.removeChild(this._box); - this._container.style.cursor = ''; + if (this._moved) { + this._pane.removeChild(this._box); + this._container.style.cursor = ''; + } L.DomUtil.enableTextSelection(); L.DomUtil.enableImageDrag(); @@ -7449,7 +7707,7 @@ L.Map.Keyboard = L.Handler.extend({ right: [39], down: [40], up: [38], - zoomIn: [187, 107, 61], + zoomIn: [187, 107, 61, 171], zoomOut: [189, 109, 173] }, @@ -7604,6 +7862,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ .on('drag', this._onDrag, this) .on('dragend', this._onDragEnd, this); this._draggable.enable(); + L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable'); }, removeHooks: function () { @@ -7613,6 +7872,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ .off('dragend', this._onDragEnd, this); this._draggable.disable(); + L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); }, moved: function () { @@ -7644,10 +7904,10 @@ L.Handler.MarkerDrag = L.Handler.extend({ .fire('drag'); }, - _onDragEnd: function () { + _onDragEnd: function (e) { this._marker .fire('moveend') - .fire('dragend'); + .fire('dragend', e); } }); @@ -7720,6 +7980,12 @@ L.Control = L.Class.extend({ } return this; + }, + + _refocusOnMap: function () { + if (this._map) { + this._map.getContainer().focus(); + } } }); @@ -7771,7 +8037,11 @@ L.Map.include({ L.Control.Zoom = L.Control.extend({ options: { - position: 'topleft' + position: 'topleft', + zoomInText: '+', + zoomInTitle: 'Zoom in', + zoomOutText: '-', + zoomOutTitle: 'Zoom out' }, onAdd: function (map) { @@ -7781,10 +8051,13 @@ L.Control.Zoom = L.Control.extend({ this._map = map; this._zoomInButton = this._createButton( - '+', 'Zoom in', zoomName + '-in', container, this._zoomIn, this); + this.options.zoomInText, this.options.zoomInTitle, + zoomName + '-in', container, this._zoomIn, this); this._zoomOutButton = this._createButton( - '-', 'Zoom out', zoomName + '-out', container, this._zoomOut, this); + this.options.zoomOutText, this.options.zoomOutTitle, + zoomName + '-out', container, this._zoomOut, this); + this._updateDisabled(); map.on('zoomend zoomlevelschange', this._updateDisabled, this); return container; @@ -7815,7 +8088,8 @@ L.Control.Zoom = L.Control.extend({ .on(link, 'mousedown', stop) .on(link, 'dblclick', stop) .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', fn, context); + .on(link, 'click', fn, context) + .on(link, 'click', this._refocusOnMap, context); return link; }, @@ -7873,6 +8147,12 @@ L.Control.Attribution = L.Control.extend({ this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); L.DomEvent.disableClickPropagation(this._container); + for (var i in map._layers) { + if (map._layers[i].getAttribution) { + this.addAttribution(map._layers[i].getAttribution()); + } + } + map .on('layeradd', this._onLayerAdd, this) .on('layerremove', this._onLayerRemove, this); @@ -8155,8 +8435,9 @@ L.Control.Layers = L.Control.extend({ container.setAttribute('aria-haspopup', true); if (!L.Browser.touch) { - L.DomEvent.disableClickPropagation(container); - L.DomEvent.on(container, 'mousewheel', L.DomEvent.stopPropagation); + L.DomEvent + .disableClickPropagation(container) + .disableScrollPropagation(container); } else { L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); } @@ -8181,6 +8462,10 @@ L.Control.Layers = L.Control.extend({ else { L.DomEvent.on(link, 'focus', this._expand, this); } + //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033 + L.DomEvent.on(form, 'click', function () { + setTimeout(L.bind(this._onInputClick, this), 0); + }, this); this._map.on('click', this._collapse, this); // TODO keyboard accessibility @@ -8315,6 +8600,8 @@ L.Control.Layers = L.Control.extend({ } this._handlingClick = false; + + this._refocusOnMap(); }, _expand: function () { @@ -8435,8 +8722,8 @@ L.Map.include({ setView: function (center, zoom, options) { - zoom = this._limitZoom(zoom); - center = L.latLng(center); + zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); + center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds); options = options || {}; if (this._panAnim) { @@ -8892,7 +9179,8 @@ L.Map.include({ var data = { latlng: latlng, - bounds: bounds + bounds: bounds, + timestamp: pos.timestamp }; for (var i in pos.coords) { diff --git a/dist/leaflet.js b/dist/leaflet.js index 1d4c6e5450b..d778359c89d 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -3,7 +3,7 @@ (c) 2010-2013, Vladimir Agafonkin (c) 2010-2011, CloudMade */ -!function(t,e,i){var n=t.L,o={};o.version="0.6.4","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],i?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=i&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context||this,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n=!!t.ActiveXObject,s=n&&!t.XMLHttpRequest,a=n&&!e.querySelector,r=n&&!e.addEventListener,h=navigator.userAgent.toLowerCase(),l=-1!==h.indexOf("webkit"),u=-1!==h.indexOf("chrome"),c=-1!==h.indexOf("phantom"),d=-1!==h.indexOf("android"),p=-1!==h.search("android [23]"),_=typeof orientation!=i+"",m=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,L="MozPerspective"in g.style,P="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||L||P)&&!c,w=!t.L_NO_TOUCH&&!c&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ie6:s,ie7:a,ielt9:r,webkit:l,android:d,android23:p,chrome:u,ie3d:v,webkit3d:y,gecko3d:L,opera3d:P,any3d:x,mobile:_,mobileWebkit:_&&l,mobileWebkit3d:_&&y,mobileOpera:_&&t.opera,touch:w,msTouch:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement,l=o.Browser.ie7;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var u=o.DomUtil.getStyle(a,"width"),c=o.DomUtil.getStyle(a,"max-width"),d=a.getBoundingClientRect();("none"!==u||"none"!==c)&&(s+=d.left+a.clientLeft),n+=d.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!l||(s+=a.scrollWidth-a.clientWidth,l&&"hidden"!==o.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){return t.className.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){o.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){t.className=o.Util.trim((" "+t.className+" ").replace(" "+e+" "," "))},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?new o.LatLng(t[0],t[1]):t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){return t?(t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this):this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this.setView(this.getCenter(),t,{zoom:e})},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t,e){if(t=o.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this.off("moveend",this._panInsideMaxBounds,this),this;var i=this.getBoundsZoom(t,!0);return this._boundsMinZoom=i,this._loaded&&(this._zooma.x&&(r=Math.floor(a.x-n.x)),i.y>s.y&&(h=Math.floor(s.y-i.y)),i.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&this.dragging&&this.dragging.moved()||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new o.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update() -},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container leaflet-zoom-animated";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i)||t.y<0||t.y>=i)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs;var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){var i=this._map,n=this.options.tileSize,s=t.multiplyBy(n),a=s.add([n,n]),r=this._crs.project(i.unproject(s,e)),h=this._crs.project(i.unproject(a,e)),l=[r.x,h.y,h.x,r.y].join(","),u=o.Util.template(this._url,{s:this._getSubdomain(t)});return u+o.Util.getParamString(this.wmsParams,u,!0)+"&BBOX="+l},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return o.Browser.ie6?(i||(i=e.createElement("div")),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i||(i=e.createElement("img")),i.src=t),i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=t.getSize(),h=0,l=0;s.x+i>r.x&&(h=s.x+i-r.x+a.x),s.x-h<0&&(h=s.x-a.x),s.y+e>r.y&&(l=s.y+e-r.y+a.y),s.y-l<0&&(l=s.y-a.y),(h||l)&&t.fire("autopanstart").panBy([h,l])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popup||this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:(t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer||(t.layer=t.target),t.target=this,this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape"); -o.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){var i,n,s;if(o.Polyline.prototype.initialize.call(this,t,e),t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),i=0,n=this._holes.length;n>i;i++)s=this._holes[i]=this._convertLatLngs(this._holes[i]),s[0].equals(s[s.length-1])&&s.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i){var n,s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return n=i(u),e?e(t,n):new o.Marker(n);case"MultiPoint":for(a=0,r=u.length;r>a;a++)n=i(u[a]),h=e?e(t,n):new o.Marker(n),c.push(h);return new o.FeatureGroup(c);case"LineString":return s=this.coordsToLatLngs(u,0,i),new o.Polyline(s);case"Polygon":return s=this.coordsToLatLngs(u,1,i),new o.Polygon(s);case"MultiLineString":return s=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(s);case"MultiPolygon":return s=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(s);case"GeometryCollection":for(a=0,r=l.geometries.length;r>a;a++)h=this.geometryToLayer({geometry:l.geometries[a],type:"Feature",properties:t.properties},e,i),c.push(h);return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){return[t.lng,t.lat]},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t,e){t.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){t.push(e.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:e,coordinates:t})}})}t(o.MultiPolyline,"MultiLineString"),t(o.MultiPolygon,"MultiPolygon")}(),o.LayerGroup.include({toGeoJSON:function(){var t=[];return this.eachLayer(function(e){e.toGeoJSON&&t.push(o.GeoJSON.asFeature(e.toGeoJSON()))}),{type:"FeatureCollection",features:t}}}),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.addListener(t,o.Draggable.START[i],e);return o.DomEvent.addListener(t,"click",o.DomEvent._fakeStop).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=o.Browser.ie7,s=e.body,a=e.documentElement,r=t.pageX?t.pageX-s.scrollLeft-a.scrollLeft:t.clientX,h=t.pageY?t.pageY-s.scrollTop-a.scrollTop:t.clientY,l=new o.Point(r,h),u=i.getBoundingClientRect(),c=u.left-i.clientLeft,d=u.top-i.clientTop;return o.DomUtil.documentIsLtr()||!o.Browser.webkit&&!n||(c+=i.scrollWidth-i.clientWidth,n&&"hidden"!==o.DomUtil.getStyle(i,"overflow-y")&&"hidden"!==o.DomUtil.getStyle(i,"overflow")&&(c+=17)),l._subtract(new o.Point(c,d))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled)){o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection();var i=t.touches?t.touches[0]:t,n=i.target;o.Browser.touch&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.Browser.touch||o.DomUtil.addClass(e.body,"leaflet-dragging")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.Browser.touch||o.DomUtil.removeClass(e.body,"leaflet-dragging");for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),this._onViewReset())}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(t.fire("dragend"),n)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),d=u/(e.inertiaDeceleration*r),p=c.multiplyBy(-d/2).round();p.x&&p.y?o.Util.requestAnimFrame(function(){t.panBy(p,{duration:d,easeLinearity:r,noMoveStart:!0})}):t.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setZoomAround(t.containerPoint,this._zoom+1)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&t.setZoomAround(this._lastMousePos,i+e)}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:o.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.msTouch?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.msTouch){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.msTouch){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.msTouch?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;i0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this) -},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.msTouch&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),this._map.fire("boxzoomstart"),void 0)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._pane.removeChild(this._box),this._container.style.cursor="",o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable()},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out",i,this._zoomOut,this),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):(o.DomEvent.disableClickPropagation(e),o.DomEvent.on(e,"mousewheel",o.DomEvent.stopPropagation));var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=this._limitZoom(e),t=o.latLng(t),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file +!function(t,e,i){var n=t.L,o={};o.version="0.7","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},compileTemplate:function(t,e){return t=t.replace(/"/g,'\\"'),t=t.replace(/\{ *([\w_]+) *\}/g,function(t,i){return'" + o["'+i+'"]'+("function"==typeof e[i]?"(o)":"")+' + "'}),new Function("o",'return "'+t+'";')},template:function(t,e){var i=o.Util._templateCache=o.Util._templateCache||{};return i[t]=i[t]||o.Util.compileTemplate(t,e),i[t](e)},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints&&!t.PointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return s=e&&e.maxZoom?Math.min(e.maxZoom,s):s,this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();if(this._sizeChanged=!0,this._initialCenter=null,!this._loaded)return this;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c; +return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this.options.tileSize)},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({},t,{layer:t.target,target:this}),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=e.body,s=e.documentElement,a=o.DomUtil.documentIsLtr()?t.pageX?t.pageX-n.scrollLeft-s.scrollLeft:t.clientX:o.Browser.gecko?t.pageX-n.scrollLeft-s.scrollLeft:t.pageX?t.pageX-n.scrollLeft+s.scrollLeft:t.clientX,r=t.pageY?t.pageY-n.scrollTop-s.scrollTop:t.clientY,h=new o.Point(a,r);if(!i)return h;var l=i.getBoundingClientRect(),u=l.left-i.clientLeft,c=l.top-i.clientTop;return h._subtract(new o.Point(u,c))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return this._moved=!0,void 0;var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),o.DomUtil.addClass(t.target||t.srcElement,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){o.DomUtil.removeClass(e.body,"leaflet-dragging"),o.DomUtil.removeClass(t.target||t.srcElement,"leaflet-drag-target");for(var i in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[i],this._onMove).off(e,o.Draggable.END[i],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this +}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return this._zooming=!1,void 0;var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),void 0)},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file diff --git a/src/layer/tile/TileLayer.WMS.js b/src/layer/tile/TileLayer.WMS.js index 3632436f3f8..7c895088a5b 100644 --- a/src/layer/tile/TileLayer.WMS.js +++ b/src/layer/tile/TileLayer.WMS.js @@ -51,7 +51,7 @@ L.TileLayer.WMS = L.TileLayer.extend({ L.TileLayer.prototype.onAdd.call(this, map); }, - getTileUrl: function (tilePoint, zoom) { // (Point, Number) -> String + getTileUrl: function (tilePoint) { // (Point, Number) -> String var map = this._map, tileSize = this.options.tileSize, From b1afb43e5d5a4a050ef3ef6224999d439dc3ab7e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 18:56:20 +0200 Subject: [PATCH 0519/2207] update features page --- features.html | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/features.html b/features.html index 08b049bcfb2..8c0ab6b7c8d 100644 --- a/features.html +++ b/features.html @@ -19,10 +19,10 @@

        Available Map Layers

      • Markers
      • Popups
      • Vector layers: polylines, polygons, circles, rectangles, circle markers
      • +
      • GeoJSON layers
      • Image overlays
      • WMS layers
      • Layer groups
      • -
      • GeoJSON layers
      @@ -80,7 +80,6 @@

      Customization Features

      • Pure CSS3 popups and controls for easy restyling
      • Image- and HTML-based markers
      • -
      • A simple interface for implementing custom map layers
      • The same for custom map controls
      • Custom map projections (with EPSG:4326, EPSG:3857 and EPSG:3395 out of the box)
      • @@ -119,27 +118,26 @@

        On Desktop

      • Chrome
      • Firefox
      • Safari 5+
      • -
      • Opera 11.11+
      • -
      • IE 7–10
      • -
      • IE 6 (not perfect but accessible)
      • +
      • Opera 12+
      • +
      • IE 7–11

      On Mobile

        -
      • Safari for iOS 3/4/5/6+
      • +
      • Safari for iOS 3–7+
      • Android browser 2.2+, 3.1+, 4+
      • Chrome for Android 4+ and iOS
      • Firefox for Android
      • -
      • Other webkit-based browsers (webOS, Blackberry 7+, etc.)
      • -
      • IE10 for Win8-based devices
      • +
      • Other WebKit browsers (webOS, Blackberry 7+, etc.)
      • +
      • IE10/11 for Win8 devices

      Misc

        -
      • Extremely lightweight — around 31 KB of gzipped JS code
      • +
      • Extremely lightweight — around 34 KB of gzipped JS code
      • No external dependencies
      • Keeps your JS environment clean — no global or native prototypes pollution
      From fadfb53c92945a1d7cbd3978c220fc577df0a3f6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 18:58:23 +0200 Subject: [PATCH 0520/2207] update index regarding lib size --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 7af1c8592e1..7d355b76674 100644 --- a/index.md +++ b/index.md @@ -6,7 +6,7 @@ layout: default Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. -Weighing just about 31 KB of JS, +Weighing just about 34 KB of JS, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. From 37b6f3e62679fb3df8c136322d445dcfcb41e445 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 19:10:26 +0200 Subject: [PATCH 0521/2207] minor fixes before 0.7 --- index.md | 5 +++-- reference.html | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/index.md b/index.md index 7d355b76674..c893c8baca6 100644 --- a/index.md +++ b/index.md @@ -6,13 +6,14 @@ layout: default Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. -Weighing just about 34 KB of JS, +Weighing just about 34 KB of JS, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. It works efficiently across all major desktop and mobile platforms out of the box, taking advantage of HTML5 and CSS3 on modern browsers while still being accessible on older ones. -It can be extended with many [plugins][], has a beautiful, easy to use and [well-documented API][] +It can be extended with a huge amount of [plugins][], +has a beautiful, easy to use and [well-documented API][] and a simple, readable [source code][] that is a joy to [contribute][] to. {: .usedby} diff --git a/reference.html b/reference.html index 104b7fd7c59..3dcd570d44e 100644 --- a/reference.html +++ b/reference.html @@ -123,8 +123,8 @@

      Misc


      -

      This reference reflects Leaflet 0.6.
      -Docs for the previous stable version (0.5) are available in the source form (see instructions for running docs).

      +

      This reference reflects Leaflet 0.7. +Docs for 0.6 are available in the source form (see instructions for running docs).

      L.Map

      @@ -140,7 +140,7 @@

      Usage example

      Constructor

      - +
      @@ -4711,7 +4711,7 @@

      Event

      MouseEvent

      -
      Constructor Usage
      +
      From 9cd8f5dc8a79b5be86c9b728060e5e774836bb60 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 19:18:22 +0200 Subject: [PATCH 0522/2207] download page updates --- download.md | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/download.md b/download.md index def33da73f5..9ac6f7c5022 100644 --- a/download.md +++ b/download.md @@ -11,46 +11,44 @@ title: Download - - + + - - + + - - + + -
      property typeDescription
      Leaflet 0.6.4Stable version, released on June 26, 2013 and last updated on July 25, 2013.Leaflet 0.7Stable version, released on November 18, 2013.
      Leaflet 0.5.1Previous stable version, released on January 17, 2013 and last updated on February 6, 2013.Leaflet 0.6.4Previous stable version, released on June 26, 2013 and last updated on July 25, 2013.
      Leaflet 0.7-devIn-progress major version, developed on the master branch.Leaflet 0.8-devIn-progress version, developed on the master branch.
      [View Changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) -Note that the master version can contain incompatible changes, so please read the changelog carefully when upgrading to it. +Note that the master version can contain incompatible changes, +so please read the changelog carefully when upgrading to it. ### Using a Hosted Version of Leaflet -The latest stable release of Leaflet is hosted on a CDN — to start using -it straight away, place this in the `head` section of your HTML code: - - - +The latest stable Leaflet release is hosted on a CDN — to start using +it straight away, place this in the `head` of your HTML code: - + + ### Leaflet Source Code -These download packages above only contain the library itself. If you want to download the full source code, including unit tests, files for debugging, build scripts, etc., you can download it from the GitHub repository. +These download packages above only contain the library itself. +If you want to download the full source code, including unit tests, files for debugging, build scripts, etc., +you can download it +from the GitHub repository. ### Building Leaflet from the Source -Leaflet build system is powered by the [Node.js](http://nodejs.org) platform and Jake, JSHint and UglifyJS libraries, which install easily and work well across all major platforms. Here are the steps to install it: +Leaflet build system is powered by the [Node.js](http://nodejs.org) platform, +which installs easily and works well across all major platforms. +Here are the steps to set it up: 1. [Download and install Node](http://nodejs.org) 2. Run the following commands in the command line: @@ -58,8 +56,11 @@ Leaflet build system is powered by the [Node.js](http://nodejs.org) platform and
      npm install -g jake
       npm install
      -Now that you have everything installed, run `jake` inside the Leaflet directory. This will check Leaflet source files for JavaScript errors and inconsistencies, and then combine and compress it to the `dist` folder. +Now that you have everything installed, run `jake build` inside the Leaflet directory. +This will combine and compress the Leaflet source files, saving the build to the `dist` folder. ### Building a Custom Version of Leaflet -To make a custom build of the library with only the things you need, open `build/build.html` page of the Leaflet source code contents, choose the components (it figures out dependencies for you) and then run the command generated with it. +To make a custom build of the library with only the things you need, +open `build/build.html` page of the Leaflet source code contents, choose the components +(it figures out dependencies for you) and then run the command generated with it. From 7a1b3719046063750e28ce3553ac19f2d334cb42 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 15 Nov 2013 19:43:36 +0200 Subject: [PATCH 0523/2207] update setMaxBounds description --- reference.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index e917558b66f..ffb509a9c93 100644 --- a/reference.html +++ b/reference.html @@ -701,11 +701,11 @@

      Methods for Modifying Map State

      setMaxBounds( - <LatLngBounds> bounds, - <zoom/pan options> options? ) + <LatLngBounds> bounds this - Restricts the map view to the given bounds (see map maxBounds option), animating the map view if bounds are changed. The given animation options are passed through to `setView` or `panInsideBounds`, depending on map zoom level, and can be used to control how the map animates during this change. + Restricts the map view to the given bounds (see map maxBounds option). locate( From 37af19e6b0f2ff9982d666201e025b8ae4c5e818 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 13:07:10 +0200 Subject: [PATCH 0524/2207] add Point floor and contains reference, close #2123 --- reference.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reference.html b/reference.html index ffb509a9c93..803eb55e7e7 100644 --- a/reference.html +++ b/reference.html @@ -3821,6 +3821,11 @@

      Methods

      Point Returns a copy of the current point with rounded coordinates. + + floor() + Point + Returns a copy of the current point with floored coordinates (rounded down). + equals( <Point> otherPoint ) @@ -3829,6 +3834,14 @@

      Methods

      Boolean Returns true if the given point has the same coordinates. + + contains( + <Point> otherPoint ) + + + Boolean + Returns true if the both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). + toString() String From e8f4411d7df61f0aedd5d8469c1bb30a19690da8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 13:08:08 +0200 Subject: [PATCH 0525/2207] fix geojson addData return type, close #2105 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 803eb55e7e7..36af40f5474 100644 --- a/reference.html +++ b/reference.html @@ -3350,7 +3350,7 @@

      Methods

      <GeoJSON> data )
      - Boolean + this Adds a GeoJSON object to the layer. From 4e9ad828f4e24e77734786dcdbb2a7d0fb942b5d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 13:10:18 +0200 Subject: [PATCH 0526/2207] add a note about Draggable & setPosition, close #1743 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 36af40f5474..5a7567c2a2d 100644 --- a/reference.html +++ b/reference.html @@ -5850,7 +5850,7 @@

      Events

      L.Draggable

      -

      A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging.

      +

      A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging. Only works for elements that were positioned with DomUtil#setPosition

      var draggable = new L.Draggable(elementToDrag);
       draggable.enable();
      
      From 948c43ea60d8d0814329f06f89654e9bb001c0f4 Mon Sep 17 00:00:00 2001
      From: Vladimir Agafonkin 
      Date: Mon, 18 Nov 2013 14:11:15 +0200
      Subject: [PATCH 0527/2207] first batch of docs updates for 0.7
      
      ---
       reference.html | 94 +++++++++++++++++++++++++++++++++++++++++++++-----
       1 file changed, 86 insertions(+), 8 deletions(-)
      
      diff --git a/reference.html b/reference.html
      index 5a7567c2a2d..f4ef0f73010 100644
      --- a/reference.html
      +++ b/reference.html
      @@ -244,13 +244,13 @@ 

      Interaction Options

      scrollWheelZoom Boolean true - Whether the map can be zoomed by using the mouse wheel. + Whether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was. doubleClickZoom Boolean true - Whether the map can be zoomed in by double clicking on it. + Whether the map can be zoomed in by double clicking on it and zoomed out by double clicking while holding shift. If passed 'center', double-click zoom will zoom to the center of the view regardless of where the mouse was. boxZoom @@ -288,6 +288,12 @@

      Interaction Options

      true Set it to false if you don't want popups to close when user clicks the map. + + bounceZoomAtLimits + Boolean + true + Set it to false if you don't want the map to zoom beyound min/max zoom and then bounce back when pinch-zooming. +

      Keyboard Navigation Options

      @@ -520,7 +526,7 @@

      Events

      dragend - Event + DragEndEvent Fired when the user stops dragging the map. @@ -607,7 +613,7 @@

      Methods for Modifying Map State

      setView( <LatLng> center, - <Number> zoom, + <Number> zoom?, <zoom/pan options> options? ) this @@ -697,7 +703,7 @@

      Methods for Modifying Map State

      <zoom/pan options> options )
      this - Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. + Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. If options.debounceMoveend is true, it will delay moveend event so that it doesn't happen often even if the method is called many times in a row. setMaxBounds( @@ -1155,6 +1161,12 @@

      fitBounds options

      [0, 0] Equivalent of setting both top left and bottom right padding to the same value. + + maxZoom + Number + null + The maximum possible zoom to use. + @@ -1338,6 +1350,12 @@

      Options

      '' Text for the browser tooltip that appear on marker hover (no tooltip by default). + + alt + String + '' + Text for the alt attribute of the icon image (useful for accessibility). + zIndexOffset Number @@ -1416,7 +1434,7 @@

      Events

      dragend - Event + DragEndEvent Fired when the user stops dragging the marker. @@ -1424,6 +1442,11 @@

      Events

      Event Fired when the marker is moved via setLatLng. New coordinate include in event arguments. + + add + Event + Fired when the marker is added to the map. + remove Event @@ -1519,6 +1542,11 @@

      Methods

      this Opens the popup previously bound by the bindPopup method. + + getPopup() + Popup> popup + Returns the popup previously bound by the bindPopup method. + closePopup() this @@ -1806,6 +1834,12 @@

      Options

      18 Maximum zoom number. + + maxNativeZoom + Number + null + Maximum zoom number the tiles source has available. If it is specified, the tiles on all zoom levels higher than maxNativeZoom will be loaded from maxZoom level and auto-scaled. + tileSize Number @@ -2347,6 +2381,12 @@

      Options

      null Sets the pointer-events attribute on the path if SVG backend is used. + + className + String + '' + Custom class name set on an element. +

      Events

      @@ -2697,6 +2737,12 @@

      Methods

      <LatLng[][]> latlngs Returns an array of arrays of geographical points in each line. + + + openPopup() + + this + Opens the popup previously bound by bindPopup. toGeoJSON() @@ -2808,6 +2854,12 @@

      Methods

      <LatLng[][]> latlngs Returns an array of arrays of geographical points in each polygon. + + + openPopup() + + this + Opens the popup previously bound by bindPopup. toGeoJSON() @@ -3336,6 +3388,7 @@

      Options

      +

      Additionally accepts all Path options for polylines and polygons.

      Methods

      @@ -3435,7 +3488,8 @@

      Constructor

      L.LatLng( <Number> latitude, - <Number> longitude ) + <Number> longitude, + <Number> altitude? ) @@ -3444,7 +3498,7 @@

      Constructor

      L.latLng([]) - Creates an object representing a geographical point with the given latitude and longitude. + Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude). @@ -4969,6 +5023,22 @@ +

      DragEndEvent

      + + + + + + + + + + + + +
      propertytypedescription
      distanceNumberThe distance in pixels the draggable element was moved by.
      + + @@ -6238,6 +6308,14 @@

      Methods

      Number Returns the scale used when transforming projected coordinates into pixel coordinates for a particular zoom. For example, it returns 256 * 2^zoom for Mercator-based CRS. + + getSize( + <Number> zoom ) + + + Point + Returns the size of the world in pixels for a particular zoom. +

      Properties

      From 5666865cc6d5bbfaf585d6db46817b44dad071d6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 14:20:57 +0200 Subject: [PATCH 0528/2207] second batch of 0.7 docs updates --- reference.html | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/reference.html b/reference.html index f4ef0f73010..b6b913f08a5 100644 --- a/reference.html +++ b/reference.html @@ -1763,6 +1763,17 @@

      Methods

      this Sets the HTML content of the popup. + + getContent() + <String|HTMLElement> + Returns the content of the popup. + + + update() + + this + Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded. + @@ -2260,6 +2271,12 @@

      Options

      1.0 The opacity of the image overlay. + + attribution + String + '' + The attribution text of the image overlay. +

      Methods

      @@ -2285,6 +2302,14 @@

      Methods

      this Sets the opacity of the overlay. + + setUrl( + <String> imageUrl ) + + + this + Changes the URL of the image. + bringToFront() this @@ -4356,6 +4381,30 @@

      Options

      'topleft' The position of the control (one of the map corners). See control positions. + + zoomInText + String + '+' + The text set on the zoom in button. + + + zoomOutText + String + '-' + The text set on the zoom out button. + + + zoomInTitle + String + 'Zoom in' + The title set on the zoom in button. + + + zoomInTitle + String + 'Zoom out' + The title set on the zoom out button. + From 3c0e6ab14ba7fa55e01e6ae607638b0f781e4e25 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 14:33:54 +0200 Subject: [PATCH 0529/2207] css cleanup and minor layout fix --- docs/css/screen.css | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/docs/css/screen.css b/docs/css/screen.css index 97171eadecf..cac0b998967 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -72,8 +72,6 @@ h2 { filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#b0de5c', EndColorStr='#82cb00'); /* IE6�IE9 */ border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; text-shadow: 0 -1px 1px rgba(0,0,0,0.35); @@ -82,20 +80,20 @@ h2 { .api-page h2[id]:before, .api-page tr[id] td:first-child:before { - content:'Permalink'; - display:inline-block; - margin:0px 5px 0px -35px; - width:30px; - height:20px; - line-height:20px; - vertical-align:baseline; - background:url(../images/sprite.png) -0px -0px no-repeat; - opacity:0.2; - border-radius:50%; - text-indent:-9999px; - border-radius:50%; - overflow:hidden; + content: 'Permalink'; + display: inline-block; + margin: 0px 5px 0px -35px; + width: 30px; + height: 20px; + line-height: 20px; + vertical-align: baseline; + background: url(../images/sprite.png) -0px -0px no-repeat; + opacity: 0.2; + border-radius: 50%; + text-indent: -9999px; + overflow: hidden; cursor: pointer; + position: absolute; } .api-page tr[id] td:first-child:before { @@ -143,8 +141,6 @@ h3.alt { color: #444; box-shadow: 0 0 15px #ddd; - -moz-box-shadow: 0 0 15px #ddd; - -webkit-box-shadow: 0 0 15px #ddd; border-radius: 5px; } @@ -210,15 +206,10 @@ td { background-image: -webkit-linear-gradient(top, #ffffff, #eaebec); /* Chrome 10+, Saf5.1+, iOS 5+ */ background-image: -moz-linear-gradient(top, #ffffff, #eaebec); /* FF3.6+ */ background-image: -o-linear-gradient(top, #ffffff, #eaebec); /* Opera 11.10+ */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eff0f1'); /* IE6�IE9 */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eff0f1'); /* IE6-IE9 */ border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - box-shadow: 0 0 8px #eee; - -moz-box-shadow: 0 0 8px #eee; - -webkit-box-shadow: 0 0 8px #eee; } .nav li a, .nav li span { From 1d21d76a5d740cf14e6f53246de2c204735ca80a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 14:53:26 +0200 Subject: [PATCH 0530/2207] update screenshots on tutorials page --- docs/images/custom-icons.png | Bin 26323 -> 13104 bytes docs/images/layers-control.png | Bin 20262 -> 6851 bytes docs/images/quick-start.png | Bin 7927 -> 11051 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/custom-icons.png b/docs/images/custom-icons.png index f160b8ecc2b14c9d43633caaa36afd291fb76dee..68424029dd6175665c998ef831a9ef3680d34fa5 100644 GIT binary patch delta 12575 zcmZu&RaBm_vc;jeyHniVU5gZoYfEu0?(*U84uv0gcP;Mj?)KyE*4uOMeLR_!m(1)v z`zb3kN#-UXYs}&Z5TGF-AgbAW>EbEqAgSWzW2m{AjoH|_$a(o$*tyxc_}H1qIoQ}a zS=l&Q**TfnIRx1F1=zW3-zgwbB+2QNei~c;a<+4_piiWOBG%{Omf_)G<7VUH7H5~?laQ9=kd~q(cek}yQWB7|Gj_2x{pI{cN|^HB3X6%QiNOD3|E2uz z*u)$tHgYMhe{>QuGXH`&|678@D=6as3zB5}kBa{u!~`t?9Jpa%KtMo4s3@vS*Y0Wm z`SWN0;9zBCWpHqCV{;=tJ-x23?&9KNSwi<9qi}k9+TPyo;o+g8q9QLZ?{!e(>FH@= za&l*FMp02QppS23XXCk-Z)9X-VP@=bcPTU^WF*h9@z8K~toH2e?C;;d-QC?c&2)qW z1V?I)3+?caz=YZ2;^LW}Ti(3v$;rvW%KX2vySux+y*1W_eKr@CmZdRoV0UzMG=E$h zJ0dxDlCgX^&+dn%wQnoI?bvkx= zb?(tAu)MxJKGJ`6anLO;G(NL3y|_`+I@sPfb-4$$6i&JB%-2;a7`(l`?e6b(MW@Uy zZw(8G9)b^6mu3zc3D&mu&yIKN^Kmx@zAnvA9bT>+og9@n^sM)p?)>S!Iv6de?z%o* znOT^wsP|1TXdE5t{-IBKb91+~yH&lV+CMmad9br{aB_ZjGBiATa&{ub&v$llw!N{^ zQB($;ogUrXKAfIh%+AhEe$%hd&O6xO-P#3r9eS;Jv}|%-d^nQZjOzQ-Q7LD zyu3U;yxiU0)YR16-rdeFEH2DVFD=eJK0UAZFh4##Jv`j?_xE33T&=IK&n?XrmX!7O z_73%RU0vPYT;GgOj!usLlQCG9lXrP_c?ukZA0Hnd?jN#;zWez4USFJTZtb+Tww|6{ zfIy)2watZvh4b_Cx3`bs(aFop%h8FM*VosfhQ`9e!i9y!hr9cKwC88%3yVwRW0S|n z$6zpcXJ@B!7ZQUtQln+~3{a-P{7Vw>SU1 zH+OgU|Lp4O`tJ6oq@?8L=Jx6z>>udv{_X8`X=&;8_3i!RKjZqJ>eJJIj^mT#sHmv9 zxw*Bqwfm>X#>U3+>e_^agxueu<<*75>qWyuL)WVreSLlZ5}sfDvr|JuLtQN`cSlz6 z5jcsH`~CeL_+LR+vA@d}=a+W(4o;3wH10_AAt0DizetIzyRSxh0p4qOS`9sKj1ySHQ7v3U@Ly9G5lPqbp3llC~0&+zrW zvGyU&1|B7D4BF&ZcdF8N!L<`Nhu=5!dv>gICIT+U2cC~MQ@76o$7nKt-8&tP25JwQ zMMO8VAHn6-Mm$Krr!I@Uwvta^6RVb*&Ru=_?zd$Vdat^mYF|?N>Xx~M&UPXahK3(~ z#w0o}Jrfw0doD>mf?f`J$vm!yM12cWQ@mqMb$D}}Na&YBdRB*dkvC0`5xhXB?IN)X z{s5QsL+##k$0d@83_{PA5LqBv4QlLG(o3)I#=K63Z{VXo=&>f!w&GZHI0~0(%1Ecb zeb}@<^W-+{p6w7ewwbZhKaf$RoeeJK0e2qQ&UPgU)xfuFV3xg-tFXR;i*>3yyt3C{ zx?N8A@~tV_W67mv?+NZQF|mL7(a4X?25^}6ZN{`WqLGZG{@mT{(RALTnrzHl{XwWi zurK7(=UQVhO^l~gwc{o03(Dt@_)GtOnk6{3@nx`B^yfId_e1L(S zuWAurpk#=*`u%3`Rbio{Ul+845I`n{35P|+SA`XxvA>O1&ByC{aSfTHx$%%p`<<(B z>CIhlKQP{w?21pdU@xT}xh6P0=OM6C7y$`>9VSiRU9QnnK*rTWE3Xy79KN%|^*nWt zMk8{(EpOPl;Qi^4^?l%^7oigS1mI9p2X6Zx^R`|7qCnQlxeIe}54oNnMPz{ozfwXe zX6w2PLKC%h^S)h z5_w!-en@mTGAz_^ZDQ?YLYa}5NCU5g!OO zi}v->F_U>=j6;9-|Go_>8m7W6Wf>*2cV2M-l{c|$UBz=z<=83M=dfzT;F~9iPLe2@N6~{d<7fX zN-E>}74LUuO7Q1MSVa}ql4YK;{CtvYiPC%wIxgn1hOYql*9h-2Tcqulkw*#(c3OMN z#W#>ThBxe#S%$iBo{|*K!vzfX+K-J+1X^4wQ9-Tu%kWJ27N7l|P#}^?Dn==R5ZRb7 z*m(io&Hp`a!pf+vO4pDsJJufyf3ZB`dUOZW7wYB7L-L(i6d=F0HR~c5qv<8^@UBu( zKi%1Tbb*8AjAdpOB%B)O@c*TyXr_VGle}hJ9FvtTH^a@~>_hbGkzPlFW<(^h_cf9s4Ty(teyPnt=L?wNE)ymrP!AWB;8-|7nZhX34?~m|Oj=-=n8^TZ z(wAA`rANF3u9i9JAyjqTs0*!CzureiNLZ_X9i3@Ac#2Wt8w$O?{-OV>xYZ72EN(jV%MbJ=eOM`owzNm zxenq&`V316+Ld$otEL`{m6mRk*-#<;%25U36(ra|i&K>)E!s{&3dJ0>c}J<5q+|UK z@B2sn**UV&pOu{SJO?BRr;)?Jg<=W~O(~skSsPzvc|$c=rj0cGz{u(c4mP;azJJo= zDP(v2^D6@qIPm)^Cn8SIf&4p?(JC!}4mQFQ;)(#&Z@3w@a7tWRwtiL{yW3MwxmVM< z&Ch}sWL+OZjW-?;#g?G2D6LPk-tjWVK&u66IbT1oU35KwHOxDY+*`>de*)8}RA z>L=IukB`-8UfNOpNp72Jo(&!>QHXvnY{vPhcb~Qd{$FH2Sv-i*BJk=_=RL)_7d%NL zNGa0*^??AP?f40=`)Ww9$aKp2ktq-xA_V2Ku4t`>3c9*Za0UUc>59p)EW42;aiLwO z*&eqMCG%+fU{f@>F-(EF%qXf!2yM!V_R4)Mm4p|E0gpN~3?h61k!imJ<m%shMYWQ#XG%u01|zKf99Xo_R1w`=(LE$b&Qz9;b_7J62a4dgh%= zLr&D$<8r`PnaZIacT4K~R1g0Ce6rhe6QIm;_T%}40b53VKwO)yiI%#RNwQNOkreR?wlGn7JlXR#GY-;urE6g$?=ugY6QZU04 z@}g+y#nJVB6I*O3ak68km`=k!bs7V;t$qouf#LYf z#XfW`c}TQfRFkNTFM`KSE%bvhQ@x}by5rS9I{t3n)IKUdAzkg`w?W`EMd$-@swu3N zEJ~7-h*AxP^4PK$V8>3BlcRH6h?3xgSlpp=!1o2*iIV8R*M!G$Ep;~)|t=0k&5T5q|3X`;ZwL_%s`w0pcEyhD#@26dzrxN!WS;H?Y zHYqbXjyK{X96=PN>dol$=#;ZUPv@)b-|Y?Btw3SsK+QQHX%p4=-3UVhO%4BFFjDIW z9*XEjtPM421XFudcFOm{5R+Uv2d+ z^WZpPV3(YHdClZF3n7r$!tQ)tJ;mjaBZ4Rq3f!UNtyo1pq6Dt^*&rUMP7kf^QcAks z&s?%!*TIt_uQ#`%P)D_#muiBDIW5~AFtpi?^3I?+gFqY{BrHCbBptw451Fg-R9&IC zFL2Zu_ontzw)%b}E3_N3FF*~sQVdTihQf+ilIr-nQ~a;*dFoQ<)vhfJYLqfM4C7+f z-=A1nD~pe)?!W*$4DSyI={biSW~Trebyar)s9u*??I6Hg^MIpx0Qyh#CA-4(X1iDF z*&2%c=yK=>tTSUJo&_ELXV6INrcY2 z&d4;X8eQEKT6uXA^xua1BVl6fg4s!R1tGgIe1sgFe!IxE2!+M25)H-_uslX! zOHps(9Cb_z5_S(XEmCKVk%%L#X!cij?sK#dhE%GYWTu7e{G1(?^7;Jcb;qsQNnu2s zfTA-7mhXqXS$@>AA><_P)po_i^6+mk@d7eP$5I#s-8b5KR8kqJvj$h*$n)se zOUJwE=XAxV(}c6mwfNEkSU5}F%c@&-Ni$S%HYsYkd=gryNgpp2N*#eYe{%8-81_b?>6 zI(-&iN&7E3Cn{sk(ckE3;WO4HQ|<}3#aSk^c)HF;6ierAXk^Uvj0^4)kGLM0-jxJ6 z6Zk~Te$z0Agl5`^uRZ$6pSSNuFnS6CtQ3dZOD`^iZ7!AXE~kqIA4`3Gr8_44Skp!l z$oNMAwq!FI(w@-eU9kiZfd8(*pRR%?^|$>cmKf*aI`iZDW3}&OS&EZ1{YM_rMJILZg@GRX{W-P?AP9N}`e07pN^kD|M$y3^xZl=5{TAJ>f^4 zR(E|&>hajP9~ZuUDM?)795cfVpJcXfitB<~aJsb`=ZQ<#w~1^J;?bb!pPx|bUYt1$D=J@> z2F!G4oLM$(Qkuqd~#HQF;y@a}s($g)M8IazD_%pxYQ8wn`QVFxxiuzmz z)=%=EK52g;7sl4K*-75el;OsRbZ@3p}rkX z$md~98%G@iJ&gh{w6OZ3BxC{(YLtdKgz7KU!~4Z7&_duhioC6lq$$Pft$JfEa!^>q zBy+X5^)H(Tt<)brdjypZdt`sF4ZYS(BocK)t&6CM^59MC14($te=?1xjb{z{gFChbe$>7WiDBd0YO`&26?%b_jPzUujz3 z=YHX{-zY#lpxdgCjaR;)ZxK(rF4NLWPU%I#p>%9M+jeW@@7M;d;vqac2L$-THo7o{rRkpx)l4`0b4g(RkiAwk6{sJe+ZWbDfx>C`?0S5_!?krh4u!~anMtXD z^af6sJG+S%m3f?*$=dg7iA05}NYCUaXk<7{ORh)wqQ=kUG7=kwq#1|%rZFgShn}j* zP6;G*-}14-df(G4n@g}w!4|E90fwV!d}v#Zju=xO;H(-{p~HLU^f3 zX%ap`dax(EDrRmQ&gj9)1-LwCVBcsnu)eweq%)N4!w;gR0rp7MsBqEsxDe0ap0t(0 zC~-wi$_2Rz{?2FW{Ujuk^?Uc-LL_U~PWyS_+(f?x|0j1jZoMs1{~%X;wp9@Sj7r#hNvHBM^apsu`FNz( z@%Xph&m$&-BQ#=9o0@CVQ%i9$iQBpZ4MEq-Vu%;#+}KbCx`^TL`OnBt-0Kih*9}#? zjdHiODA!mpjTz?(Dm^j@`vy~rs6cU#5W3ZBOeHKoTY3bTN)9@F;Pvf!oeD3j+kR6C zoV6@`Ith^1M{aYb%qloJafiBqJf*hQ*8cWw>@@jvXX5V@1)ir%6~zZVrDtZQk;ir0 zj<|<^N+SpTWV_R^E%_Q>#BS~=UbIe_Cy!&w{kxG=S4|5$Wc9FBqw#|yAE4|}Jx&#I zos@;_nH%~JGoZ{wN-y4Ooqj;Rwq3c!sIM|+E&s{evB3S#;_buH*u4(cJTKUSV<9Zk z-b8P2Hf67dT`AX_d~iDH{*aDtf2JX2hzB-$UoSzwda2RZKw_2ZclGnlWxeF{`cl=3 zJI3?Nz>pGe57x?L>&GKuK7ePblalORW}P;U=E0L(9-soUjc^eL`tw%dWmBWLRI%ux zLi%BPl1AwUZ1HdYc*ZSOhJrq?Q86%txP$HN`@C0HWC<%?#>BevG^Ohe@KU z32b%Jl5DqnT}`~mZ+|WjFlCnzqjz83DupiRvOn%TYI>lVoL}#&yN>Y#409;ec4**+ z()77jk>w9$JYYD+9LgchQ^2YsV~hSUY9@-V4HFH8t7fC0TIZQe#>0yzTz;2N#lnw>zbds{fXsVyR)ppCsvpc*pwnyzG(irsMSe<+_-r zk=mxFpRE{ninMCA&{l@xrF`CoNAw~Y2R6&+$1D500EJ^Mx-aV0paeBP6M|%AmT|B8 z-``v9ADLKwA2#-iE=6=zEhh3yB=jo_8mfha&$@JKmKmd3;;Su%tudatgWRKj3H=-` zNN0(J7Zya>mIW=U`8q6(6a73I3WMH4&dQNEdmpM7MJ z>z~~;qI!!)*kN{t&!`|Qc(JlAw1whs)f+-03ZJUN)nNEzg>Bx+2I0zC_6IL2F_wN8 zQ0%2O6>|^&0S|yH$!Pa_gRjj2{$8=>d4K9kV&IKGUEblu6P~BKLAQG>|iga4{29RvF*RL@wVU0OVh**1VKe`K@ zzm=7G*;{v2@Log@>$etDuSoVR9ak^_NIi>j^VQJ@S1P;B#$JB`G2Hz`Fu~R`-pCy3 zdVF~%N_Dz*zkeU5^sEnEw~u7+I#V`sA|7q0)?&ThII`XsZJS^L?ePk&61dTpuG%*C zGskk~H%w->`+K|8BjT;>)(q!<(dL7J(oz9?#9Dm6eK)?!&?wQCyu@k4a1wI>lZ~O@+0{D7Y)3*NGp7RgVFFjTc0ar<0^m z2M?CA>0^-(#C$_^65ICjjQa5))K%*(yQ=bq87z;#`=$t?rtCAp=#@%QSEOnL4c_ZXBW$#lh(J*qq%hJzpNCkRU} zN$lEFQ?&B1(us7^Ob$Rj34OY$PMrFtL|k}yS|Q#{QQzfdC|+k>gVXV22oH%M zPZBp0qAiN8fMFa#ypphR7leSiWryV)O;3-c@pQ#xBC(JN5mu7cGNG0z>W#ScnRy9=NOH zIi}i)blq1mTb6O=^PlWZbs9P|49W6G*VDf73_H)D)MV~Dd}$;bl|p6V`zzB_1J`#P z1<|g{9XD74I)2&o^v?*>`&`TLWmxff;W-gHmTTjNR->-IA@bpfnn?PVT&RX~j2vUQOdzf@Z;o9LcsmYOOjLYZVMJ zW*M2Pq0?oa_!+KRN>Ma*evo-1F$WQjs2<-NhGXLrIre}(N|XT3v9Rug0a@lH+X<6a z#W;AOI#|Q*_{+B>&%zTi!5Df^Py60-T=Gg)=2}#kImmG>TmowbZ>>{8tj54wv?BsS z9Sw~yPDWC}6ch9~bPY{lH7Y7>Gj?Yvx*|?Lc-?@3R^E6;`_fi17m6d>s+Na?-;8BD z0^b$N@QwinBPf_fcKsk`nML*JpJ`&&L`+B?EU4Nci3O?tLV*G+i{lrUo8K~Wu z>m`~Ct2^;TbZ&P2`}~$}sieClm&QBJDNG@i!-*h&?b7kz<<0;++U*aA z6RaobQk@jU6&J=7vcz04Qef9Yy!h!7oAGY3ad)YSwf6)=YJQn<)Ep>es{;Td0M(;tP!0=3@2M% zj{TRAoF>E4bX%rpRv$r$x%S4|%g>AqI-C!0)0=0Rn8NDA?} z`A&J0S2-o@KrbTs9I-vgBFYO)cl}@f&lfiT88xQ^s?Ah)am{-YG1!=3b$7p5bYLriZKP2 zhh;z<;4Nt*Ku=-N#<19Bqd+MuDGf@SZPtyLQg3rnHXHaWaG8FM-Ub3J(wg>3<7hD?UM{#x(tAUgq47Snsqq zkLFN`TKQe!C7%7;XdO&kJ-smBa*sWCH9rWG`*#f^By?p!Ak(Mzq*(l4?kmgA-tJLf zQ;bBaN7XMkrG>s#(VV^`H{k#4oYIg~U$SG|Er62dP7#fDJkbA^eVQ=Vm27MSh+%My ztt#Hv-hW0%D#x%!HKnItJF+7wqA4wS9rUz{@syekxl2e3kyGG7*h(!{>jXIn70jA_ zn~|BLag0v8EEflU`1pfXoc-_%I!<22e`QBBy)K1S~h5kT`jfB8o<|<0ZSiPg~{84xzAdo1s zc*QknSgx_qoSie4J%#s$YlLm%<={@UOqq?o{xsu=zsh8i?FKB}DG-saO`33bFSlqsS=O`qdXw?8_5k}Pns1vr^W}C3;IoXKJpd6s|6|kWO+Kmo7;PdWS~N=BB{NNhC>|nP62d? zI51r*#{3wkz+zCdPZ`oDh^s(|0uf{^A`?|-J?3<5=CluwZ2PH0y%GnSKY(V57U`Nq zAwT}|4{sw(0CBy7O&H|VF5;5Ocig=`17rSFS}nfe7wo_#8H$nJj35tX<}{D}!`YFC z)}M5`=xZ^FXh2S$^$L~jVKGx38z$5zn}cgqOHN`AfCQR-bpBso-1XPW>L1Bs##Y@K zWaqK~Z@QCd0|@GJGlbotzGVLh=mMDe9wZE(+ttSEq*Rni>^pDLdG^fAOL@nlZ!A-b z`e^KhMwU{@v+1go>5JN!t786g$^4!S%J&MmI=u+Fl0d>ZI9$a!Oe)I14(jl|hxABA z(CsWfvS=Ive-m;<(u6(}=E@;uoqxykl}YME#Jj%xPshvZ!tXg_gFdAa4z2;u<&>KN zE-wBI2L7g$%^F!78Z+66nv80Baz}DAZTJ8k@ZHDrhcBa7oPiw2R$tW^71Anc7#aFW zR4epZJzzEg5{^(^s#^~29Y{o{F8}32G)dnt(u(1iiD>`%!5c)R^FCnRmD@nJa4XHC z6oi#}UynocLP~f>t@1|D{mo?Fb)A z)-2t#K9e%hfB!|vIx0%SiFa1N>#%aslv#09GSaodtN=UBJH@bG{N_3cciI{?-2px} zz(;>#9`SP*Xg-OM$D7pCwO9X&EIFTinJa_ZHg_jMLj#GiD#|>)S1ypzO&A*Cd>Zxs z8$gFmm06`~Rhd$)IH5v}UTx|OdM~RjY`MnOU z4)VdsP*G_{*Qp#*vgl$v+MCh6CMi3catY45LF%H8;`ArFrLR~g-#mnd9j+OidFXoa z`LmEg#E`5>7-iqqWgArM6tpRsL46~CJ8-|X8Av5zB33GaF4nC^M`X`oF^fxTfvp|O zpz#7C7ltD0TV6WJSkYAx=Zsq}fQBTydRtRxz0H9KN~Kj&pxC2N;|$@jRu$mrYWW40 zG_HJr2&36+cluee5@L$Tn=h)pU)nF11u^RpP2!cR6rh&Gjwu_!HIR60J`|L007kqX z+dlGKxjc*&@;s-S#SVrw%>k=@CEB;0Ki7t!pGDnMxH8 zLI?9Tt%XK z#aMhwvxHLllg?tKM~BiJvWblvD=vn!!RH=1%$1ZRU{R26g3SLyj@!wE1Q1dF1&Eon z;%P9L{@@eP*0hwboQm;Vzs{BPo2Lfvk`f=CkLiJAaVprdcC;nBy8F}`1HS`^DcvYP%Mi?4N$Lqezf$NJDzZSB zFq-rZB-ACrF%)&ybi!UI<L%Ci(km={i5PoLdYFk0U?nKiM zI;Pn}B}qTUjK_~P4{NY=C=?f1q2igIn8R1TZ>}OVw*3q#kDv}01aNyej>sFAb znP!4A(DpK~bS8X9b%K(2GhW~C#X8RG5?wB=6uqL)vr%lSfU%P3F>`UkAK?jt0j4)p zn*#+FCpjFVP}Y4e23YanGz!azrG)$Wf$}=+JFG29?q>DeY3t7w#^uhNDKg3$U!#Q6 zY8H^V&DZ*nuP?k3KTmO(^BLXOaVOBkQaB7VR!RgP=IbBOPK9QtR}dVNmOXPFF&-uf zK4IpRWj8eGjx-O=F_M<6pAXm7qq?X{v%9dqoLP zGon%zjDmc|D1rA*R^(^s+pF)9MY?Zux^++m#5}S+FhK=7Ac0@^KCg%*${M21=%%u+Pr#F5@?)`ujzPRMu`-4U~trd}0tiz<@%e%e_vsSQSk zIvNNFh6;N*t80R2=FFB9*tVHYVZ}N_TIN_uYZ2s_!hlo}=DoDDb5rA4D1IngA{J+3 zibn>QWPOnCNLIxD*l@IOL28n=)Dp3yon8r-c-r&#xXIVFj)OlRW)&F8XgP9?qQfLjWTjyY=0=h^K@WAeE$VG|k{4&L|YAnHT)T9WY*vYBYo!4)PU<3=RBKn(q z7)7T{Q@9Zm=2i%#e3y4B3xtC!%hZMp;1;vp^#%&S+x8~(3;=p!?8_T#>E^T_rAz|s za>lq-d@0-59A-Y(T|gWilsj@iiH?K>BEvFV*G0pkXy8XUt{J9zAy(_dxiblo+K`rUuv$tzfHjCFYUdzq(rzx<6AY zC4jH-&Q;v9r|xoo7UYaCBT&|{VPBOK&N}}%#`~XC?k-=4!$hNo&ypw4TPq31t*L); zXso|iZL12vmBmqF?Vp>5>nnflc(1!!(%5X&*luj=d}pn5F8{flHG9qF%-*x7 z!E#|5JP{ub1`G@=^NO7yiJT6cEJ-e&8pLb{;s%j%v$3#oaPsi*Fp;r?*g&ixc2+ia zW;Pyv4t9PJsPTgw96^nXOv~EA+|koDg%N^CUy_%dQ=F5JkC%;;lZ{OhB*p{c_$JN) z0!d1-aY^z>QjmGsJ1HviOE{Xj+gmue$w~-O{Fh-dw>Ibhe^{~qg-t1j0R8_4JpZeR zg3Q%T)xwhB{C_v#{a@G=R!DI`A#1n_49rYcRzghOYptdmw!z%moyLp(u58Ay=QQot z=Hg<{+FUv}nIHt`iisEo*@YAnU1l6SeT&SwLug5o=Gx*Ag}n@&r7<=kXa$E1t?2l9@i_+ZSU1Zp;%KR&k^4=@4Kz-oUfd#=b^nl)B0`TidF)^hzc!P zuzsh%@X)*WA2(;8zj~mSfn^sEVEixGxw$Rtb!%zv?(XL8xGlWAw8O*0sj?K-o}5VE zFFk%g8kR34*>N*YGETDp1~I~aIJyj$m~-gxxgN!0#YnEUI~V5&c>c)~5f)|gNvmMovGax9$08YEop|IQ@+j9V`J z7I84OO5braLiiBi?)`dVCFw)ladMPx;o-bgH*IyNI)-hBeC@b_>pFn=w4;B6|9OPy zI*f;lgLAOudzBVJ8le5TOZwSA5{TO~NE#2{`{Gz9bQSkz+yi8D+b63tP~*P#zm+TH zHXUECHjgd^J@r|&qdpFZ;ELce=3R}3k_r>{vRQsaTxzuEJ;!fVlZHOY4jB#fHI8dT zG2sOGyc%`uWF#e_S1zA5wX~S$YgKE!@i;^x*PPMNDdLG;8+xI^!7saBZ-mA>oT^yL zOdK|$Q*)C_qyT?PO4m=MBqFDkh7m)rf>o{uW=>D5ga`?z-fq1+pWNDJyoZEX;=Yn`qzW1sz$+KiPJ8LjtXMgM6 zP9eh{E2=}s`DmJC;Se9z-TfUR(#~@k;cJZY-0w()-~jM`j@+?I@NSrY8YA-p800+> z+wBQP5!c4<7Xn^1b;m*?z&`x|DoUb-_K2J883`*_Ww3Fng zs5$NAkO9Jjp`tln34|feDWXmY<3i44AkwaOdNOrCl%m|cpXuT~=F4Tt_~WIn$&*&p z`Skc!Ra`brT`e}Dxd^EOZtJQHse23EU0rsBg7wQ&EPuuiwA)eiemSI#kIQ=RMbRES zt~(|~?X?Ctv64XOOFM*x2#giBe{L9ec~!g+y8sFSf36Y=snuUI5;?HZu{t+{Kfec%C}P& zmw?p2DQXnM_}1lC7KQ#Y1eNr%=GCeMvg1RR)OB{^1YFqt@E-!T8}xhOQdr}ns##rj zn@y4!)`#joiPv3c^}U9Mem9boF3P+k{>2Ye%e(zM$J&&6eh&ORDcNynHv`>ZY)+Bc zxn)8LtimC0{ZCFJHN=-zu(WF;F5(ys82|wuX30!7?@U2t|2Ot%V(xhRzbU`$2oZ~R zkJ0!_+%S-E1BWmiR4B><_E7C^ZAw|DJ+xR>f2*aZSF6@8J{-^*4o8p2cl;Q#I-u}^ z=^#_a#qH3oUVAGw9lu_@zi*jFByxMY-0a+$7)i@kpben7II6kFV4kBMp0CtxZwoJ%{UIsL-vQn2N-K~U z=uu%aLyj(vGYVdG{U+oS$c#7NR7n6HMyMR?x9nRYBbf63R$8T;21#v0LpD3`b4V3L zbkQoBeq(Si2#N-aCs;7$N-th-4>1CSSoyFnJCYfBc}Xao*zG5x5jZq6$i!vj0Y@g1 zOJWCcv`H<-UwcMsKpri}hcG$Aj9SUt}`!x^l_?(o5F-#kA0#RN9D`yPyCK>&cve zGN{ePX>0@DarrtPnvSFPSg5yDwaS4+!j!bdaHd*y^U)<|>^X9hwJz^weZQOG+hWoW znXRwSr)-xXu0EQbm$pLwOMUL*{b_=>fmh@1sGD{el4dl7>%M*donPs77Tmd93gfnd zkK~O`SMcawq{@lU;N>@F(BuGQ7c3b9m^6gB@RWAJ7L*s%@(!Z5+t_zIFfgmuxg^)S z$tKr3DeEOIBv=!OOirHECpL$`ltd&+d~WQRmd++B%0cQwQLaNIJ{|o`t-h?5VD|NS5Cb3(!27p+`Q3M1>-PPp;l>3Qmf~?%Y{J`Xfu^E zB7O{8%ZO!EnK&cq2L0tWqnAm`$h}qHf9F)2alIte{r)eXwT3_wa0jEa^y2Aikj;uh z8#OQ!hZfin7(oO}cn5GwmVHm?KtyF+p6yl0j&G56AtiC5qg;V~A2}xT+4(L*IN0(x zvyV$As+}GVCO-%bEcr&Vfe8(z&t9`NsZ+Q*b8><)B0;X+AS3K0OM8(9d!Gjm1=IH1 z-Q1uaOB(W1AQ}nq?%W}xe5g6B!I)M>B+N(2Q{5RGWvY*rI|K-MIT|X9(a6Y=Z>9xf zpt`}8%I0$7bd!d-qcX9X#DX^wm_hOMxvPhevo{r8xyMYby5-1mUT7M;2AP(tk0m|8 z$rP18$>U+4071LdXc{7gG2i)VN3%WUeLI*2DVra=l6`2UKXHdSW0H+Y8$8iAQ)dU`DUEz#rioKQKZ(ep zsFC4d&H}qfgugKa{)n_~j96hcRixy74~n@4uOvQ)zuM(!pjFr_j38l8kBrOF=;Pz> z`EHqE<70!3X|cf0MifmL%FjyiyV0*sK)Om&s=RNdq=SbTe?L zD>Tg49c-?fUGg(`xm6`ScT83dp3eM4=bGfu(`RPOhnmu4rl`M^GRqm8cs$}j!SwrM z**4=k&lQlkK&zDX0i7Mv+K8+kUC* zIr4Bklh1<^sz{qrQ~|+etO(!KEd>7tqX0M1&rv{c+6`X;FHKhnp~BLR)EXdjw^~z75_}`H*N4U|0ZzEC>}+TWfLeX0%1Gq78kZxAwtj-F8_60 z-2`dX;40!^@ePS)5*kA;K`!4k>?WED1=aTnA>B!G3&=sbp!mTyR}d~EQzJ*Bz#`Hh ziQ)%4?XX4RiOuXtS4>gepb4+Un#pnQa0ABmUe9XELKZOzPhy-SC=W*qYHG=f9_B3t zYIUrP!+G%*tlT70!*Z>rQasve8Cn_0V;Wjjk9=FSo&&v=K}l(<>AsA#I5eep<)t~L zgh=w%Zq2D_+0Y*0tjt`<)zIfeb36u zY7LQL6BOZK&bZ7;ob<3yEbVaRAJL%1uwz-uaowrpIVv;re;ubiY>Xh~zVv_I5$kxe z5@~MLoA36y?}sfduzlzTUTOJ!PXYDVEKmmU`N#7hYLuk;%+TwS@6AqU*+P=9(N z!pLkR_ro-rX2MQm4kmcx5DVKip5l(g}m5P-{(|JbU9 z5ZrSYe<#_C6lPdXzC+$wAzY5XNBrOX*s(gHpvT|Hgu8xO>h+P4z|8BWlofdiO+#$h zO7z7%k4d*XHjUzD^bA?L zrvmj^|4mN%h z5*sEKsiyWC!d1JPW}#~+7q!M8>ZB*sBdDJ=XyMBrH>0E}bEafhU1vTWCw;;ey9t>a zePzY~2^f%xh=bw^Ew<-KFv{yGu-RR9U>*_+^Co_7>e6Oaui{t5UAl~nE%(};9_-Hh z?RQyEh}x=qcVfYgis2japEvyrcde>p+9KrJz+cZ+;{7a#9OI<`ReQQYVuh4i7%Up z4MhSgr%;#*?1>PcAPPSGiK2p|Jo^)QpucP(wr_fbi?@-A=7%Dp>q0WJxY@GsFv=|O z&Z`-$Y=<=x4!lhdptjfGlTq3`yFOX+srjn>>bCA%)>dh80$Y$hRIymZ%TTA+uBw?p z8^OCRRJn?l(1yx7N6n0=+PqUeQ4d;mN@bVr=?V#Za9J`Kx zez+XWlCM^;Ew=x`)rML|mYhS~5%mVzx$k|PQ0;_KFpfHcY9qA$d=__uy$;i~On>*K zA^f?vXmTcKsQZ1%zcBH6p!_NE`JC{z(xZG#BP`-_5E)E{ zb=bJe;KwV%*gd1t#>6E_>7FL24h>K=)3#$`!{e->3Zs;)qzc6-~54Unjwn zl^qIQ)|QEG1bk?BMotkl&*zx5uqh;@^A7CM(;Ieqn0Wv5I@664Z-2;bF#EWkQ+@9GhrM9(!p9?c#ntIx5O{+)X=jug3fCV~HaL zJn3yGi}ILh1bI?+Xv}9vcj9w3>q**Zj0GXhgzjNWG^^H+2mkSu!R-Yz-ae~kBTmk7 zDGq32W+nF1kFSsmcmUkBR#(8?`pNqwQRr~N0*85f>!3a|ZN6(&BquN3gfI%<4PkO` zK`tBG+FJiC|Ko1hcnU5wq<+DMOC%ACiU9f8QMLgG6+IX<^UOgy%w$q~bnh4`s7944 zn*0aszzLtCeL}f$j3?NLKq0P3j`GQexCIjN|TYOp;M{( z;$bBjNRar$bqc{)% zdsvv@YlNrwH?gx)%Kd9=lw7^lD$l-dnB-AxTL(u8XG~DFmtW;SO;%``nr8^L^$)!A7Ng3cOKn z5!`n)rQBos6NW(vHa9ybsj>e1qQfMFjf!`-_sO@{Y8miLT zsgL4=kAd%pGEQRm;>Q`_XNI(igs5GL9^LykFCw2$Uu3XGKI3_?(?`x+=!YnH zSETQ|q;iLM`8;*tX@0s!y_IX|?FU9*hekhNk&+8_pj1%m*S|M{!ZVIgDQh6`BM@%M(bql38)WA*Fb>OIc$jrH34 zxb&PP{g@+NjT$BEI3b~XYk(ll4aaRK>yfTIh)OrXeinvXh`^;%3$p)L$-&X7Z9tFX z(q!B0vOtDqWTBM}vz2Ts z+yKb0_2ZXjN{oq{I{!t~aHdXn)8Oh-*PXA5s-5E2;Hv+3G85$xcdshfQdu&UH#Qz6 zDmk`ySGWqX{|6D*&@8?do8I5Sr)ZKj4WqzAF4dT$W^?y@kAoCM#` zb*^fR(a@E0Hwzuw>u*jzy4!sf5@b7~?*b%sWMM%^BTm1#^F2?X>*(h27%MmrDweaM zLk91n@k9thTMi5fm6K^7g1ux9*_;};5@51K;@{?qsR&oZ#waj_vWbSXGBe9nYOB<# zrHHc>?=&(D-!!fWo0iK)!Tp3+dg&JVEgerP;P6<`jcZ^hp|NDO<@0uN3rSsL^bWiq z--->p2|U?l40lj>Se%U>zLb73am1BVRUQ}<;AQGnvA!&ddTjHMuTl?dxF1Hp)HxS< z6w|hn6W>L;h%Q2vaxxHR3mi6vppGFP=4?FVc}}ieN7@(^>IxOY;=6XKv+XM~bOwB; zugvKJQx2X7JO|FbV>%nCiFI6GWBS32KI_q1A`U4JUe^)6oEvH|&_4hoSG zS~r0^!zD!`r2m^)h)I<5kd}eFh8;w?mzj!y4&8^{f#%UmJkBa6l`!Nl2;j5xwF*+M zZ?LILH;JQMxeBkF4+X6_vZxyZantVa^o8+dDobR$iSu|DkDsWBrl3m%#F?IBx4}_* z`9a#L)}j7~$wD4R5+4Mj&%>`@<0G_k^W%~uDoD-0VCuxoqk5uO@-P-?s83@& zQZfhqn=G#gQsQ3;i^ok(PZ59zZYpoEFh+^g>2+8emd5`T=%_^bh&s~j_B8j%CVz2qCF`gDZ9i! zc{~gE?_@}3Urde7rDvQv)g6(dNCSO`dFaZI)yIAH)Y?89;PX3g;Uw`l{5eCMJc7w8 z@XJK8vzi?m)*pBg~nse!7X~ zb@lHig}rwz(O%$@PTP**)F@iSY^7>c1L^mWE1ccO(HpPzgb6TGL8cEGbM|50xZWS8 z=aT{TiCl*e9|{)W>UjE<4r!79bP!dZmsF@aHy}aFh4WDcTX#)NLBvb2uKiDFRYBjv-@rpd7}1g5xNh;5-yn`N zjx5}Ma9ZMl^MsTWWP9l9eCFlqm29t;GVH)FivF1>8*g}& zl`N)nEO0bg4~7ocxpjVIt{by?F^IOCM?tMNsAO~RvjcpQX?WbS*HV9E2k@YdoXLO# z+*?hDs)8JmeM6^<#VQKrX{M^zUZ!tmgw)xm1hBfNxyjOhK1Ivas}b(I#ibgRI_cL( z8JgTJB!bMP_@~o3AMQBqsIU75%QDXEhardi&FFn~h-UA*?*DADMwJ_-U*_`2y#6^u z=d&X8p9Z*=Ge2Tr`0KNL*y4qXL@-=oV1w}}cTEi2Q56`T?WiF3LVni&I?J+LihECg zCB2=uL;b;1u)JX^ZQoZ2DRwtI{;1-hvc1<|uLF`h0D&h(=@HxW;}) zb(=d9A$}*&4(W^mE0Ys?OojpnZsug)M+>8{cL>zYh*OjAzBtinKK#xUQQldqUEjNo zLbL{mAV<-qo=c}3TN_%60$XT*|FTaXKGdN9=dZaodQh0gO211qf2QGA_1IdX?_IZ= zGPobp^sv&v=dYHu_zN9fg&&sy1$J*NXRebqDMj{mmZ103>?Bv1cGYu(=J=12ENfO| z6ArM3Lm$6{E!@Mr&qrpk4V)Iz}2I@MZk-gv_Xc#8R9v{+Q$6}%Tk^t_JZAAFr zyi`JcnoY;Ap|?kJ+QY(mAzx_n)l!$)#U!)h>HcR#ep#BxiuS z8ii1Ag;xVFmNbr+9u6NXJi;Ah25i!7g4AU1aLCNe=!uHki9Q_ct|<98oKUq&je&0h z{Eg$m%jokuEU1z%yX3<-F{OCMJ_3l!waWoyWtsM3;=yuo>iMm5L<@mPVWwFh|lPCWx;wGdE7Q&rDCX3$~qg8~)z(rP_j zde^wgEX*R5<=pZ{BW2T9kv)Q;`&LwypwJhx4%#6vJhuF1s0;O?u@8BfY^98iBB!}W z4b6J_Btp?|DOAwavD>+OrpOv&a)fFJvD&RI;UvJGKQVUy z9&9pGsJbO#&E2u}dRB}nBe;S(!nMnTg7t)}Px4hZa+bRwxFLLoyDd%UoEQsnYlW*x z^^XS$?NR>2U5bo}Hwe4?3XNw-P}mn!^HA(N%wF*GPw_DZ(9ojRy6+aboaxSZ`Gb#) zGERM?*S~*!#MrbS>I3@FJLbT&l)MeYo|8{@Z5w7m0; z81Z+Z5?Jd14?_ewsAPx9W=4@jT-<<4v=ZY`$Yt6RLz+#V0a+?_d0Dr^zik$)&X!~1 zoUe_HOyn=7VyCU0>PaK&Dwl*MgR^mP-=rJOY-xpkSSxdU&yu6(M^SBY^i8raoTUb{Yl1#V80py3qV;*B=52?RU zCK}U5Qz;o7P8j+vlG9ICGq_OZAz|en4qGs0P@=qIg?r-OPp>Yo$td3icz)%&jNend}IXNZ##y>}$8v7m)yz(Jpk9rA9$^mdPq! zWrxj5U4=n7_>EqyD53mb=pu-umk^FjmP^3Y*ZBUUAW?DRe9F6-91YeO{RX6eZsxs1 zO75{US?#hV@aIX)>6zr4QvWO2pFSnnxH#OZ_dcfB%*lR_zq0LU@N5duzlQp8^O6W1 z+cnoVYl!&$6f}W!Tx8G!!zn6^hN=sN3#mS=<{!MGyXFP{aJCNbXHWCCw=VQ~xvLz` z-x~WwmQbmwQRT7oZyQq7OXJub|HiyHyZ&W;faXCdAr}nPt&7-*w$tXWCIxskiaVO= z&FJ9^5fschw&KH1FNX`NE5dcgf*@x>BkNFY)niccjwf*Tc)`#ntwFwOESnmK@Ysk) z%aQooEI_bp3a->PBsrv19fqxt2N`NplWWTfCMe0cVpGK&opZrsPcrpb{D3UAcj}Mv zDcmLW9u)a21JWm#b_Y2Ux?;4FZ1U#X8r47__KD*vlO7F^Omo#azfPh&O9wBF8yXZ_ zR>nn3+719sL92HJUZgkTv|=MR@xa`~+^%sXAbsff#+U1-#b94T&MMcerD0z~6=$cX zWT2WxJR0Gi6Q$x7#l!nFoe2N4qLxMHqQI|^DGA`tL6np_2t*c7 zsx+!=TPfUSOHZ;iB9QLcgBgatOqX>|!E$sZhchT_)O23@Zas)-Gr}-B1Q%_)hBx-u z;m_!_=!*y0Ni81h9IngEBvl}c>o?Yq=@6S{Y7zCsajxtSTmZY%a$sfo?x z5nj-{r5UJ5NZm$Q_v$sJn~*pEIb)M5Az1Y*B#~}W#c5DMR#<8xyZ#E~s|3w@ zMt1j^^dCpG zd}qs^!$eJ9?j*)5*PK3A&iMvOtOQ7`eZu& z?;cgoAinoWULku>;Sqen{WxLiI|jVIQu5!;k=(j7#i(|_UVHtv{sNX6x1M@vNk9Hc+Y1$}v7D^MqF`J2wHKIO{;W^P0e>2W zh>s1&W|i|Xs6%rQ$N0INCP3|eh;kz6j>M1!`D|;=4}b7Wui&%Y#x$m>%MDPH8~zSI zANH>)z)#%=sp`y)`Jc$@WsPfcu-A@L-Dx2-?0}W$rh5kTc#s!ddXgVJhXk8ZEVv6l z0^e{~P=a=7F!eiktV84`cf%7W#a#qCDvM{pYGC?ECqRe+s-G$Qq2)Ee>D_mnXjtu zU6|xtOm53%6a%l5e~JDd{B|m&ATMr|%8UGX#MTJB8HshmXgB=E>SusFuhq*sSHQ3U zy5eKyiT5uL#_tfrr@%+N1n+CdiX|MzVn}nFNFJm8?flojLc*xkaEid6h2qmWQNOPTP{SgGraDKP~{Ugff6*Z%{n|7DJq=g z#vP0p2-S(=GO(9Rrw)^+Ev8FUNEot@Nz!i`Z`c@Zcj*FAN=<{^oex^L z7Z7)BxnAUm%pt%xF|M;kAt`zqD}1QY(r>PZBw^Qad!L8haRA*xA?c$K39KnHhyP)xqL5w2W$O9pHq~am z5ZTA7zoLcJK&rYsQRK`9IVIQ#^5PwdZonq-;IUq+6+lE&AdPHX%K1YnCk8Wwl7=WAc|r9KUIGsxvw}59D{s3cz|4Vzh!iU8lvhk)$fzMV6!> zV`@Z&+sNjY$;cmixhPEV<=Qn-)edF0gecA{BFWNzZ}Hl4sCF=J-8QNZ-^&{72X4n{ zneU-s2E>(uTzJq&WX>KQGaGIZFHh35fRujC#Iof zV#H^C#qIuZC9pA3@GS+h;})+}-_Moj*byu6A6rpmM_hii*-+&f8pVH0-TYx|w8U%MHTle{CfJ6q z+2?4WFCQ(IxgCdJ&84A-%s|M=Q5!i8)vFDhnvMZ>bkK_g4Sk3Kg>)gIYk9L={iQ;J zPAT%iWX>s{UhvthZh=|v7vV2&;Io6){J1X0d_8`XEd$;j(i)Ktcn&fe%XJK>{*N;W zHuec82~ro%4IwXWRxD3xakEB^t;!q*2DVgZrz(^(b5|zvk~cYtcQPi(6#2CRZX;V&q3!FH ze@u7jvQp!FSsHBP^gQ|1N=hPC3$+}t@w!bn+e=0jY{n?yX z(Vi6oB&upLldr1iQ00;}SW=WMY7@nkhjHMn=v(Qg?G)?O6W?n{G>K>;`LT+`{|50? zdqvO?Pr5+|Wr9iWOodkfA+~U#;MPIy3_q-6`AhT=prCw=#Z*X{PyG$WWEcO;-5@_g z(DJ%GTV!o?ElNP~LH4+PzPC`1E7K>}pIJ-8>~EZVH!JOv;9)t$@>*%D;2s?_rNfxy zgo%#_pNY}oHT>E$tk~m)-1Efp&{n}S^{Juw?Y)9+Mi(H9{V3}Kyuj}V236HxXevg1 z({bU)EgKkW?X19uRMEy)c%xc1NSxXe!l)6Z&NVp%5pFY|3~&=adF#ziK3y$%w_ySQ zp0QJpA|}~akx?NAiD34BR1}(|d^hl{$V|_Fe?E3Oy~lrBn*XyId_9Hz~Q~*+m<^uWJA7b^h!HsLgoW0Pr*@&asE|FPAjZdXMF6Y!#-K`1Nnr#k3A`Bt( zl@Z|w=7pr}%x4Nz?SAsw&AO`237+RS87XL4u&fevbH=Ln=vmAhh1Y01dx~jj*wR!~ z1+1WjTmer*;PUhG>7b0K=R1wOg>}H&Zw$dZ2oD}^2yub)5_R(f-}!J{VH@8>Jy{v0 zD0fFnYHFd#m?~uDf>+6A`-cYS5I2un48nHKR`VqUV>ZS)=y%j8%zZf^Xo$H9mMiNzlNaAt8oAej@)uALUaq_h(O8DfY>xbZtz zxCS5KFfjz-660Z)r@{vDm=m3yg)~B*J#AvWHT4PC9*)0zFh9=g2KID``^Z3&m6~c} z@DVWo4?;|9T1sR1u*p1?k_MeSDbmjb-tnfKCkHt7!zD>kcht!9ZK5(O=IQfe`p_Kp zvrJY8YAMkj7;;C^z=wXs9)+;6E!IkEAJ=j*AlpZc$cFOxaZP1=XkY+ZeP2pBx1 zko^{_C-F$%Ma|<9V)d@EZnv_?gQE1f)Qu??J5@IsOL!ilZOCLXUFks^Po= zZKF?n=AptX2DDHLrDQ&9R?_5b8h2OE%}OUilsW9&>Z*5Qzuu3k3W(sP+4y93zczNQ z4B#E;WuV;8J}i_bNfCJ-{L*<;m>Hkye$w$%)-n>p4*O^!X=#hjL2>C=+Vf_LR8SaL z6R@T}kGb!7Qc_%fXHRkwV-(>vWMlvo!2G`1uM+zC^FohI6rny7Mg-=#&dyzM$<{M9 zfP9@^57@G_&P|QA`1(HO>p2GvySJii>y3RqH(qG)3Gvfi7pzLRq)^nPw{DkyO) zkFZcyb>BuaPO<4~et2w`X6THk>`RYYI0s0vpNLu-TUysm{2PPO(bsLn40;1NI0AQ& zYqB(0L1NYS4Nc}fSvPaej7@);4eIxw4b_tcMxm zGuyDw~QD9c%=({MUX>|xq-v%&zZ1$R!1v!*=ut?i9^h$Z1qSMxFa7Q`tNmiRb z=Xv(19o^wuZ+gc-%`gDyBqEg7#>MG|u&3ZX@{%_zAFT{k>GV}zuvJ_0J@O^3w%O)A zH^}li5(p@9ZX^kbz8v?dX@>qkkVh3gvCOhgQU>|=e|zPh@*nePlT!xM;b(g-6EwN+ z+esLL;YSmShk`oMbm0uO1q(dUQ0Mr~>0yyIdo`Q58EapwqEZ1}T5HMn<_;4bed{&L zeSS2Q%M&%Z3T8a3*k~YI3opL=Z-d*YL(=Ep$)w`%OGS^Vc=OS?7$;pCI}kh)GS*YU z=$EUA-FW^>HqjszW%}w_KixI|p*5sYXW5WTY#4R6Z{YiWJ3+7tcYga9o?~0xZ#AL| z=N1`qK2I!J>Qlf;6G7jEpOr{b78@;$7F3a3`6@^uI}Yaqq5UL(9o`u^{LPW5IlrwsW;$TCKC|AZv}{j>i#pI~h#&-v zjn|3L$bPYUaJFw21x`Xe%$`;)_55IZKKCQ2L>FNK(}V+)GO|MM_i&Ajtj&eSB19U9 zqqIR#t{gYQW$bm9kutAg_ACdMP52Sj!A2AT$jtH*zgF3@uh;yeO=1c09V5&a|yY>v2nW5X*a!G z6>0Nuo|E(NqB84)F?N1V#%#fo+KtZGDhHr6Jt{CIt}@)KQ>eN6K{0W~a)f_CF9*Nj zsTlnocDT%F{ER&CS*(!Ogo*?gqC|mW(~!ZgHFPc2NHQ(Zg^hMAUUFgYVo5TVFn#`5 z>@aIe&fzATl6>5Yxr5r(cK=R|;}oIi&_T^0x|p73qjw3MLt|$JZ8+a8ve&rcEdUu@ zLEq7Gy-Z@$~RHodTjeOUYsDzV5OogLmm2X>r{~5#xdh8h+cqmN3dA_gj@&Y&&7`KsQ7Feb^7rQ;V7e+I|-^=*qz3K=daD^PGYGM zDRx-!%)yDF%q^K7EW`I{*3652N-^A2s%25FxVK4+{X^$mMuX94DP*{Iorr-gvQ9kri+YViPW}#IB!49Vun`Q1}%?i@7=8v zpQTkea2w{HE(=4$78un?$#jPhhZ++d*LTb+{8gjxy879Ud*V7HM7i82I5UC#9WyN} z?2cWa9IDN|7_h@vTk1J(PR{uP)FFNKca>Qlt%iHwgiFAn)KfLSH~iGsC}NZWhnY7Q zGoO^E(%Z6t%5=%1%7ZjfvU3Or@_7RWTyDTKPk1Fex!@o}gI^lGuzM!yL~7u(N5wcB z7({%hNqr6z6>_tZX9A9zm+%SXVjWAQF~^NhxtVucfM`s9{a#Bk1=8Xk0<2^uah3*0++mGn1`Yyz_}RymP>9){U>Tw z&}JPT05fetNvb^K+o`!;1YFtwFN9N{$KAeZ;O1;6mhRd4m`Kp~$9$hls8-?xb;bh2U3- zsmszKE4;IrJpj8(4$&yaL^#S*x2T7*bPYd@fkSm^1VRg+$ip>WZAZCb?Xe?34yV#Z z+f8HmI&0OaK0xtZ463fz9GFch-k@qfM=kNRs~%gul51K>%)_Qi=5;|O!;gSCnGAda z2vxmb)&|`>u2v%76TU8`vJ_yYcrTO$9@Xz!np)tILKO7&s5}xacuY|Yv7x@#EP%nkL8B+I>;NLu z&ks(S8)oDa&DJKM;gUZ#F3xq8^H+fc?B2I?}iksjMkWbG=Cg!j5bl zw&2<5;F4RVX$nU1HEtTU!u0v-!3sKM{S6m~Zjq?bA?^XBH zT5o;tqYtHB4PzgtnYFeFR5;J$3l#0Z`;YD0QoDANii(69l$IaHR~$s3DdJ^Qd;FC1 zGguXJa$HkwnB|8DxMOkr)(v^V7?T=sN6Qf*;``0*=kT;e*mkpZv0#feNGG4~mMG35 zG^mtZ`7q)xbT~c(Pda7Pb?jUK$jb&oTLujk2X?6M=A|e$Hr_15wD-sC+AP>|tRFo# zb`#m;aGN{iRHbg-1w*6fKuNbDMtxlkjF668%y~CIV=-#jgU1RwnyU#Ei5=0f{#*b@ zK~9hsnzWWNbuZ;|4q&q-_LbD6R-C4n(2xrGiXfE7;C|0yryhF!S|3!;CVq z2Ca~r*0IW`2dSA#opZgGu1sdEz%F$9wWdyIL{5psvH+0L5o-+B21$i3p*sZe5?6nM z8P^O!{0V(BK^0q^sej)WnMkkIJG{8^$#7;$Z5S=^{C5)k0o|eKAzmEsA&hn+j=5vr zNVmhplqVZMdSw;_E@urSmUOPh{PZR(C-Nv8d8r?}jbf!UvXt+t@U~Pk&D4OP+Yc zZd}(fDp0a0jrVvDIeH`9`KC9$s`%n-{a`_H(g8Gy z5r}_$%n8{t)zgp@WX%4tJb(3VSvc``x=Sj8lG(7bs8UTQp@fo73CIl|bOWg!)%=oe z86E1$?oEqw=+JX=^|fzQpm@rjH9J3R0bXOH$KVxiVyM(+W_`{p;lX?a&4|M?9i#{Nfc_Q#-yC)C@M46Q^i84EV zrX|B6z-f>Oz>o-hADyJ3c_MHAGoSg4+;GDU#@Sdb9ru8SMt`-Q0NCRga%a}!!B{a) ztRpZNqX4Lq(^^kF`l}LC0I}1GOxy{UtBp1Ty{PaxHL-WS_q}rXl~?5PM;?)vUw9!N zXe!K#v+tr?9KM5%#|hn~|6Yaq?KsGwOM@raR~19*ELc2&A;Ug--C#&U7^9q$`r@;) zaO5vlJS|8km48)klL(XS;D%8SlaFfINLaZo43tkKqTW@Cdv+w{N56bopIZxKd-a|O zfG;VIT3%g=;&)dqT-OYEPLTi+0KYKv0GkaAR4j)keYT^b7-1A3?t!@?UgvNA=5Op? z5OHroivV3i*nq%=vC)iv!1e4{$Ogh(Pa0$~7KWRGSbxC%=-g!GTPPbKVwPE9<^_TF z>k(2w4q!knI`yfjHjRNJ^OhGZbmG}3pOh&bFm4Qvg9$wRzyp>^affm!G}yoZz{${P zBO3v_^HH-5UvYde8qSjNeUo_o4-3NdXI5@lOYK>o!77PBnw2T3p7}dTbY4+zlh@x} z$pA-ndw+2Vb1&gy_M&`o1cBin5O21l=wlDd+u!;YsdxH{H)a+4Dcetkwk{kt z5SuFTv8cfKK{UiWo=YP91NjlAd9EzW!s3EibPL5o90uz!~rKZyt84lkeK`>HZ?;1ZbR|M2Ng z8$S8HfB*08M!)sRPsVYvpZTBuoi)iA-!LJ2mXdvf_zSH1+h~qWj9I=pjR$PRg4Ru?{2Jq08m6{V&ShcYjk}IdsSf=ZecO*JljL z;Uhz;Untxc}P+W!)jvxqd zMV8|AP33&iPj764djvIdXlR5h0wM+?1g*nsQTQpcMOb)=WpG$e0HTS_fSF3;yDC!T zFoe_x&Qk#)=%-f4aAaRz*SCy}tDzu9#1>t_B~w)WX-2)BZ*y^kzp9?I_v88uv0P!1{~nv!GrP}zwsOKLi-YW43Oid!S}>?Bp?4x4U6+2C}y)> z7#{H+N}GTX-v0KtN8SF0LoSkxVz>2LU;d8GsLFtI_V&xQDhemFlq-^|TN*TItB?zJs6 zG@VWvVfm96M1LKB&8ew`3HA+_!(c6HUro%5-+Un-bE2L*MAT~73!XkEtFD$^>)n9^ z1wunzAj65uH8EG*kM0ecE__iYUz5;>yUTw8Odp;Iao8E3*2wo78?VMn)pA9RN86T|jIZ0Kg0aBEf;E ze6tw5Ab$>7;K1W8T#siN&SbBUsJTl37R?11tjhIz^@}MJeaq~@xL&H^G}U`9VS({^hPUwh1Cy0+BAGAc{&@gcmb7sE^6#oLC z#+c^OR8IdJ9}B^Lz=y&><~!v1wv4Z3W%MQZ2YasLgwV@QjltUqU~xwMqo-avYVD)n zaDUZ4^B>K)9#Cum=LxyGQVk0-ME_uwY-Xl*H!~6owVF&sD;x(xKsTnLc|W z41fZl*mWeg*{j=}&)pE!ZuSwSU43 zGqW@6Y6|&60wxCZKR7QrPUhKDOwbpG_d!6!GLJm+h^-kK$})GHA_HS#|4@cjfMc+G zjW2ENJ0J4jTrZkPSTKTZ$Z>y+gAoiY^6fhVEhw?I6ke2~YWU}7=M{IJ4~fS+D}A0% zx7U4L_r33kOKY^94kZSZf`gfVxqrHB1)~8Dk+#8~y-}R+(gK3Pr)5H~XZ1~%EFm${ zw!_#SEDX2>!6#K$8qyepL=gvkgU#{Wk_QDZ5DpDta7f;A^DVZK^gGQj&a0MIkL@T7 zFC}sL5KmlhzN4ssC!X(HHW3HnecTV);}3rD1DgjpogJ!3(ZGE$cBc1IOn-rR2nT#V zS?m{dZJ^dws*SicZ9r_H&G28Wo$s|p;z3ooY^f^`KlQS`fAh7M%CL?l7);WeAj9+((T2#ZbO znOI0{0*zVtHw~V+AI1mv4}Zb{;earGbR+}v8R3Y{``JA|vlN%#{H@;%T?xIg(mhhG z&Dq&##=a}Bg%V%I-4J^rP~|2Q3JiweV)Gt<{BiT7Uvb41hPNy~f_3K7XqkSTf8{iBURT z2mnRap0U+^&3F%nNtz)s3S`PhL0^rw4yMvrr#bmv7StU0JQh`?eTNm*@tc-dY&4t6 zvp}Qo6i9+JPN9T`anRQU&}Ri2qNqD&crsZJi#VqX^u>SpqFi^wby6r7%y|jyVw%m; za%i7gUNnNj`<_#?tbd7BI7vA3v95&Vnr(BYy)unKOU2F(m5M6`!Vz524H;D4R&wmS?gcyi`7pH`p4<=2m zg@I)BK7-r9PJw&iZ!R3O0DJ}afBxP-+jHLfwzrza9Cj8Q2ztun#x43EFp$?WeF=Wt z7g?7G#UQ@&zC5p`(P4_;EM1K2F=l9A?4SsaM0^uxuvlNy=Bw;m-mvPcwvz*r*u3?g z*TLhD<}0{%$A6X`@wm5a*%||Qwjhrxq^;%R#B8-M@#%W4^kU)$%1LX7y&6_nK=W3l zu5y9Q`kBtWDwv(8h;^75n?k>sZ?(;_u_YoVg3V_W6@HGnfSa)KJUD=7-TYw;44w@e z%h$g4HTmsN{I*BR(xz%wo6bGKVDQ6UY5#ibEKX(d)VYq)?p)|AzZ zjDw6P>wmQ%^Gw>lS8Z0!oIuAS2#BDWnWj9I5Nq^DSr@y%zxmPsD6Qr5hEE_?~wR54uDrN7I;%N z%d(PqUavz9!72uUiLcaFVuKk7DaHf(Z&Wfhl|7QRd?u?{vGZ;`iQ$mtL;j*sm`~V4 z%WM!Uu7TyZ64gcq-tme2__q%vW4M7=m%sh(ZyR96eE;mv{>&B#8%>|jx|+igfzYu# zh<_F77i4!J_HSV2P-cg6jEvf2;vh~l2%X%F>Nhnlie_IdonnZAbZhM!f_0TLDDrtP z?^N~}39qe_TW!5l$ye7$V%ihawF0s>E(Gm0DAO93J4?J;Y%wF!fNj4U+ZDow_U*XU zPAOk90_yeG8l13}4OL!d41n{1Fi$NTuCL#poH?!&6_<}hU(D{sJ10q+SP z!i*Wm_4e#9bk)5=;(SL;C#kG$*r1of~=6v4>ZzN37QHq8h{k7gzh^R|PwhDqq zq?cq8VGIw5hQ2MzN7@T`0%^_lAeVg(h&ha97E)Gi1Kb5_BuVZ^%eMJ)lh+ zHpLu+F)i3&5XkZ4$L-p5wt(zn z^*yA~_-iS?K)7tyVoh1}9$^0<2H2o@h-d`#)hlRxq}_;a1#n3gHM35FMMgY?FMgr9eEDTTnxb3sg9ZxVK>YRAak$HUr;Q&&uz6|A%>~E1l>Ix{yhT zD%Da{l1&U_5N%ngwsc_bL{^}Gz93$;8jIY6G z;4}o~I5^mRa$`KV*IH3gqRN0OAH#)|<%flYhN!+VJH5Csq6Y_Cix0XVe0@Q3A`mw) z6*xa?N21bM9Frw$nGuX;^j2qb5?@k>oYiw1MmO+%FMoOi#2$w=4nkIqw3<%4A>~|P zxk{Eu*;UF{o?maHZk`&ff}&;C*Ph|HeL9aX+6WWE&fUADtYbcL znvFOmi%*M23lLdI8`e*EA)`eSHU6I9wMO$?Em%wQ-*Vw#}3Of*b z6`m)0ZLED0`LNb@&A(mnH<61)7oYD5DDYH0=#3qWPquJ@ z$heh{QipxP0nZ+NG+SITT{i|{4e$nI!>ASTq`6vm@d+kz`qSdaItaSgQh$cJao!ZT zim#;u`ws99bHrn8g?5YzW*6o{Z#sY|hz5m~Ab${QvQiE0Rq&i!_rX+hojbvo=fiVx zk8-J~<AetY-h}&&ZkCiZrHXWlyfWF4v3q@SzkWPH$i1p0V5uRek!>SSbT*jcR5b z<6!cFx0G8Pw;r;T!W0nR)PMOY*)qAs4gj@Fs`3$|NUoE89)(}1nmc8%&+ufunDugB zVv8>AAr|OWDx1cHc$xWyc{{}pB zI#@?hx&)^b22L|%)~c~F5!V}Mn%rcf3S+iVTE&7j)z(l}&L0YnD}TmeiO}=`3<2&H z5_oh-GRnP5qn3S&6mRBA`8tIZO|J!L`8*by@&wDcW-0&>Jv0r_3ePxd`X+f_94Kgj z_zubmx<(z`lL5yw6{vk%|BI$!@V(9#~^^JS^Z?t=Or6 zeFE*6SOAkh3>$@b8-LWeJo@*V6~{&MI~D-%!+OiOo%`;)&rT%Nbjopak95}zfUsdO z1C(BK1W2Kz8#ZRg#E#f1?=86`YU|Aa+n1hRfY2kzup17gpoLLl}r=&f`L9UBm#a`hOI6JSf3na27X#-Bi5a z3mX6fnfI&s93kK1iPXu>p~c{=xI^8=~NExB&1y24?%N!oE_5Z_+{Y zI(=``Q=$5d6eHXZ5qe1JWu^q@jhgGj@C}TpnY3wVzyoY#!e{sc z!T>fDzl7F;d4DmZlVKs4JJuN5AWGGOco@{?vml6X=)&<=>??+>B#&O7-i=6r}Le_tpF%dEsvx^XrY z65+z~f@D%_0bkbe4YduUe0R?oeK(!K330LTK2&Y0m6_`FI zJQthg7Xpq;>!ms}Z0Wrap=KaVXJP}Mk3FWH$%|MElU1z|(Ezkmb1jj74}X(Y(}?Ef z?N~TW(3)6-5td`$h{TJnL2T+H0)1<1Dgg8s4u96o_U;c{3%3fb)?OhQG@X#}Vui{V z`eCR97KZ?H(38#+9|tv|X92*Vs>Eni;m3p|O$ZGKa{ArIi#a{vn& ziGP4U**^?-R%Im8V7+31?=aQ~#Dn!>4w=_r8QUGlN=4)G1mv?Gh)o7#mA$XZyN!HT z#X+&@Ij@gJ3Orh8)ZO4o_i-%*SgZq_L|emtLh_mXIz;Zd841SMTV^GVI2kRQlWH=| z2F2hQBg50raUo0tLG~b2fNX+Xc9HSH?SBlYVqZ;s#*Bv0?=>5{B0x0YP=iGbe1|;G z^PLixF>X;OC6}0rz389G1`V(t#y9t&U7hPnpJo7sL-23>*erWKg?cI4TJT&xBaS$>*sav=np0xG_`; z@HvVRkkE+7m?BML_d!;JZW@2mu{IE~xCU+qYBt`}&9XJ*5zZ)!oM@`A7%` z?1N!o&zUH|?{NLS`^s}JTMOE4*nftaRmr``BFp4pNqJT>MMVy@6B2`u(e*wV_=s>{ zVkC+;Xd2jf4?IaQT-?FrwsbN~S3W;;-mZrg7!FRHR*aD;$Ac;=IUd9n#$zR0lz0H3 z@jaecW@vcl>tM?ROJ!bJGJBP`rsHpn4I4x8#zRAb;3o5La(@>3#vvrwCx77#mcH?Y zx(A)8)P{X+BwtR(J9vF$C=beDFVYLevKwJBtdbT1UZ+8YZgPecDr+w33aONmaU zf0z$3U}-V}T)x1zDI$H#XS1gC5!D!d77 z!MtzJ5ou2Fo8?;{n0PriWq&{)W_)zt^VV@z9`PGaLZY#BP@HqT5FHREi3xm=!D2F)2H1b&~zq9De-xbk5WCuK{sZz_3k%QkL)VB8T<@5{@q>d7&so zUoq2XN3t3!#Sv3rd}hF)X25_lhytEy5D37q*MQ)!V!dG+(R^zrihm;Jiji;_dVx&? z3ulMr!G$MCw8d+;jA#&)2GIqhAPXYUlMN!rp+ImL50S4q?Fo`=!Odfh91uBvgB$r+ z>cP52gK;|RDtI|@<6SW<7Ug}0gPm|Z!TG)BJ_kI7aTU~ofOt-lVUJ|b{LLEwg-86JRrN@0~k#n(=OKF>EafRhYryklV4xHyR&B4&OsLeuzro z3oIVEEo~_bY$KO6@YxKb8YyxZnt{+)SdYPhP?QoxV;j@y#ew3)P1I6pgCfxkmZkBA zJcv?^3;2iHp!uqz6l>mtdoZ}^zUZc3Q{vjeLp<2l;X-ljet(~h=vnWDY=4k&D6^Sb z!VM;2(3nK)sP}S{L-{ZbZY1S3PmFhqP=sJSJbi3##*kK|`>fVh%{GMVm<%}B&wVgI z`{tW(UT4^(J%rtU*?!38mymTe5^2V;-dp)_&0rTgbM8#Yz0;YPQ~L65e%<0iRnCUu zGb?;;9S|Ts2Y<(fB^u(82My!FGp+7*6cgpu@z)A0^CE~LzkD_{*?>Q6I=dw`vrU6e|#p`RnBDD)dq+)zX?(T-XT!YR7# zZj9ZSk55A9qR>_}ShtuFd&qc*Eya2d>&)z$nSncU%mn=up+4A)PFwtqdy=aVUlEux z>jb!t`Dd*9fi?16#$!((Re7P>(9FBXVL}KC!YxNEPO00mb;9#mCWo25SYr^YzSsZ% a1Q-CkXpLok2=dAR6v1Y2#2ADm;nUo7NkQ$T0%r>=pMRDB%~XL zp=;p7_nh~f@5lFkdtZCi_1yP!KWjZ}U3*_UR7*qY?rqxJI5;?WRg~p*ZtAF;$NCoj zO-WX`pm9^txF{I8=sH-rxSKnJabztWEWiL2sJS&*2W)PMaOwsFad7ZiZ1s#>jMQIB zfE=K_=6`H>;ZVmLG!70>8t!Ngf`DBB7GP^zdr4+=T@y3F)>4w$P(+NQ) zq^<>!b8rR&M0iDbK>Py2fM?>o0wMy!VglR%L4E-tK7JuS0U;g%K?#0w2>}tnzc1z+ zZ_buh5<2pV|Mqp$lVrAWadDL3<8ya+=XDq2b#S)k6A%{{=i?XT6BOjRvEYFr>|M;^ zJoYe_zZvAgFp#sYql>MBJ>UoeGw5dFtXTfIa+HvB2AjJ$IO{n$ z*!?|=S~d;5ivEu)T{gVq& z#~aV`U}sx5u%)820~GLA%o4W$tVQ%6`TmWy{AVrC{t?S}BZlwK%KopF{(I;qef~86 zleagW|71Sc{wCd>Z}M6zCo}$LyWnWO)Klo$!VV7)`+FjUl@H{QbJSyC*z*6ciM~Bf^Iq+G?8n^pde5P;+0F;^3~?%=E22bOKVGa&q(Rp?0)x_)6-MT_|DYS z)F;!h3j3n9(s_r-LUT*=wc+KdzMsa%#;;-FbEy+SjhM#9#-E;j2P^y86Ib3Pv%0#v z86C@}7N&<=hv(<#wY9aO`Rzq^*<;9|_4RdqBmMB`h{eUl-9t2+pnSSXJg1yl?eD96 zv-B+6lnF$4h{lIlP~-!N{lwTiI&3d& zl~3=y)KbSBV+PW?O8Pd^Gcv};rq9r)Ev{AGKHd!lwP)D#z|bH^1G~!Vs^z8Sla-@i z9|k)5Pzi|%F}h*>qXXj!{jh}UjqKm%>TjFd`i`zn>gwy3H<$M@`@g1UQ}jQb?w%|z zu4w9OVfGGMI$Cn`b1%=&!xD1$4);2vnwD0U`Ul1XZ%m*(f^8|oVF?(XjG z?HwN*s zo}B#|9T)v8bl~XdXnbsJ=SIi&_Uh{D)a3N#`Q^gW!ok78(eX(-B6%x#wi=17s;tz~ z(n?NFLicW7-3Yq6DXuQBuR2kv(b3WKy|dAg(Vo8E!LI%izk-pO(VHNq=VqpV-9$EX zb3g`!MTCTew6(Rhx3^~v92JgkMMp=QS=n@Tb=lb3bar-nn7aZET~{}@Ha9m;j*lH( z9ZxP!$DXaH|t4hal3`K^V+sLIo8dM zjad>0t0Q+V54H(Qm2=V4_lhEko&{9>bn<*aN%HZ!Rt1l&xpH27?@@CyLw)>i+0vdq zJd%K(M;DH|+}vDT++1u*$jhXrjA2!#Q*aDkR+=1n+OpL#9=`#iSklef=1}fq`-UGA z&@|e5Si#IHily{&de!>e>&wVJ#&1G;D1w&_$$+CLy>ez1K5y$qfxvp16It78=huo2 z^Z{G`B#Q$q?p+P>!)^E$DBa%s=|bkQvMhxtrWiqYOp!d=K?F~I!CmZWkUCM zl2O3FQ-$}4qJ5vn3gcyBoL(A_FF+apcvmD9>*3*1tMU9kXA1LrPOUmE&Qn7@R1zv) z2(CwF=Ne$`M$f4dl)-6e*~@Ebm6sczz&;~IZ;-uRR!CdqLTFaedUr0_Q!L#$J6jbz zV$He=#}z7>`)1 zs%Y+W{mLOk|JdCkE;^?`yoX{{Ik#rS^U>ZM{Qw@k`B9(}txly`*H7)yK;Wrah@x)s zIM)XoN?J3SlwOXUw_ne@c{%xE7L9ecU<73M-WdR5cyWmd;J5S~>zI`D!A`;{(a`aQ zh5cnCZ{K>E&b6(Wv*xxJjA#Bb(dz^8_X$H!RXfOkeh3ey-E6dq%Y9ctlzFH5U~nO2 zF+q-4B&=2F!uTTtWC5~F7*(&1jASNjqU;Sr3{e`$ejwh8u*qe2K*vzAZMjH@FMon~ zk?mJ{WwiS60bOja1^nyh4f%znE>e0V$=RrP@~z-xuG%J7xYD$$T~}RQlU0hr&2lwWf~&V=d3#_>%e(l% zIbVFpT%dK^r;*ehM1P3^_#oub9JG#&mX5qQdif(E>qJHE+S%_R?XPlTJeGs;UCe=a z?MyYIb(c+CFIQ4^YPtwCAQTn?=_g)IlHV_a`4~@+IVHvDXudVKjqR`))xM59E(?A6 zm?UCbeLeCWnHDi`t5D|WI}I#ymDO~MR5NS&q6I#lb5n0#@AfP1;vw|?hE$PjHCM^# zYRJKa&&m4h-#)lKIwvXiU$;6ytqUe_n8W4D@&>p*DFX1~@K__V0$4((R+ z^4wzGom;!~x2wYOMy2X#tCGB9>hn}p#w6f5gU_epx60{WmR|dba_Eemc=j|_5m>Xu< zEIF8yQ8Xr(yxW&#=kMEZ5q8(R#=-Z7_5`H=ea z2u<@J$C-mI4>Mk5ywFPW!ZZiN5UfVb;}wF8?LdR-P_)iR_Qo&Vc*&0}a5O9G&y9M$ zrLMKYd5^WiaVc$w4-mEWLC(5FKO+J!`~kX8Bd9GkYjgSA?u$u{1udoRTs^D?_8Efj zVrVC#NejRG!5{oriiY{6p#s|9MS>SmJ099vP%$TF@8a2H@Mcc)&SM~?{~8(<=} z3JZDci6S18xAr3Q6@H$`(c9}cz2io|6>Pm(K`|5OJpR-=i(8TtAj#Cn_dXG))87;G zV>c{MlH@@@yBZ-f2O_HZHd;df-1UBw@|nm$c~qw_*ZTGp@_`eLQ|Hp+fYs+NxZ^vM ze0VKU>Y)~^2JPqM*BmG%qK+ky1rRA-h^N^Fg#@=13?yfciK8S9BU>o)NY?f~V^l?u z^+0_qyDgd7@$E!LG1twp4Ax4`@2=Vhnm#_8alLiBd&{@)iDHH{?o3F38R!#~#pcvf zky8?Sg$Ao&Q@>Ee6PmP*+U?w zPI^+C4SLhqMI-av_tsYfg3pB2bH!6h#$PB2s};|c*rxn*q3n|02YC{jLzHf1#U}=F zEIKBsYtMp%!@HWJOHF&SO2XaPZsiDlDWDw)wKR+-+)q^CWR)ceTvco?FS7bvbDV0x zNkJ{B0QSum*u_-z?eWwbz4NbI)g_n9>%0?$yw6oC2{=VjAei@apCibxD`B%&19R zh@x8VlJl;A+|yxq?Z3_Kmf!T-v|Y|$^hg9m$NA-`0<>#GF(c#=0C+;G;0Sa+Imh)G z=U(rAt?jjnFXv_j-hg@(ja#KXq`TM9rm|TwPX!P?ed;8`80m?H1AMS;-(+4`lrdGL zrv=myB;mFKl9FFg2Mv$jk=vq>gks}H2jA@jFIIyoq4=w+yh9aPKZzwb9ko10f&_Ul zw2PSsuLY=~#ud+1ep36%a0?GDaFAeLYfV43ys$bb2za_Xx$+Wo`DsEo+?@j&;xBV3 zN=IEgEnDnEm3vpP{IIQ$e%q6x2oy#t2JuXEyO6MiswqMmyhf6{D=tghA24e|m_? z>We$of1U1=(&Q^?DmKnbpP`_LV(qRQA`iMf;+LraSr!x#NnDG(D^qppj5V+Fwnrjh zHY`u7x5cDH+ok&Ye!v(p;pU*{9Trq*-URboV?^u+M|aDHaw;*AZ`SG4dHD7}0BbNu z(k1kc)ww3$qO&hh6i#L+T}FR7*>Ab*I3l6#GXmfzW-UHaW9sFyPu^>}9v zk7F-STlc;C!L5SHHa(Dc76i#}MET+AxQMn0ZW;^jBlhtI^H*0bEfl&~>nd5F6QG_2 zXB}gXGLIp1IXq=z`*ZK z%J+EmHhaFv)$ic z_uu`!7aT@1cQkVd=M68u8kn#efwA)X8=2nwqo2#+1d!dPYwu|Obie#OiqEPUl!qZB z0dLYyW%z=Wwp$E>gKKr-?;L`<2DdZ1VW75fVmR>k(QjGT&l(T#GVJfWM;(bnh}?;y zlJOp(f(+x8K0);a%J&l;=8A~Z`wjwEq8$B#NFAtR{hoMn=f2!=;8wfG#?v#3&;&O3 z7GM0tjO6Tw$;iG+6BABrN}oBMJvVg!e)jY|WfP5C<$LFQdtL_Y2IKCYiJcm=b#BsuNIpx$Ijm00`$D+PgDUtmJ&rkmh9B zN52iwL4`%nwq8DAKSGzGke=2<|jUy&-LWbLm10xCsQ=yBH)^M~Zdp(kR_ukld@_9pD z$KRL|={KAo+c&mfS$SEVN6OCpC)`e<}X;J;KW+~|>2>CfB>K*7k8RI^uovq45K)a+9 z|8*a^_r3NjnW@KvQk1^ac}ZObIcaLjCj~mL);?o8o3H?Dg8{-<9)s0cIVzH0;zg!Ez@|M@#F; z7y}bS?&eMWWO3M#KY-kJj{qACL!fC1eErul2e=NMruOPxT-Ed61CkH=ZSDNxQM$l4L$RMsSadpvcS z(6Kra^K|ST%YuZFQm2ydr!uDD&+U16c^;iPp&Fh9AgA?S6 zBYsa&Nil_4mwHmq9cyErvTopFk;gN9c2c9~$sp-s?d%>8Od|mZp;C-TX&rW|$gxC{ z-Z2`eCJoyOR)Zd1#Enh8u2sQj_Ve}mf`_Hsn@Jyua$zJlF8U&RU29bJ_F7K1| zQm{67wVYSflLqDr&xyonNr!o5K2CLA5OAG2wz_cFzmR&3xO`=irhj`<(+vGp`@__F zAfGe+agc;w7qGcaMz&?}<}(kAM5%?XLrLGdq$~}4Sk&7U8y!{!vi08C=J>oKV7)PG z0zS(079$aI3?-Iib2uk-izZpC?4lZJSs?{ z*L8lCO9AfL_YLi%RQ$9Z% z-%GWVVcK_BUpotwn4r2zfwy;f`stu}D*OD*2bTzkj`i{Lb&8;kKfje!6g1?&y)g6p E9~*&r)c^nh literal 20262 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 From 88abdd06e0db363f2cac9d916bb07525524840fa Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 14:56:48 +0200 Subject: [PATCH 0531/2207] add link to FAQ --- index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index c893c8baca6..d4fc64f2994 100644 --- a/index.md +++ b/index.md @@ -50,7 +50,8 @@ In this basic example, we create a map with Point

      All Leaflet methods and options that accept Point objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent:

      map.panBy([200, 300]);
      -map.panBy( L.point(200, 300));
      +map.panBy(L.point(200, 300));

      Creation

      - @@ -3727,7 +3726,6 @@

      Creation

      <Boolean> round? ) -
      FactoryUsage Description
      Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values.
      @@ -4994,6 +4992,21 @@

      Class

      a.greet("World");
      + +

      Class Factories

      + +

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      + +
      new L.Map('map'); // becomes:
      +L.map('map');
      + +

      The factories are implemented very easily, and you can do this for your own classes:

      + +
      L.map = function (id, options) {
      +	return new L.Map(id, options);
      +};
      + +

      Inheritance

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      @@ -5098,20 +5111,6 @@

      Statics

      MyClass.FOO; // 'bar'
      -

      Class Factories

      - -

      You may have noticed that you can create Leaflet class instances in two ways — using the new keyword, or using lowercase factory method:

      - -
      new L.Map('map');
      -L.map('map');
      - -

      The second way is implemented very easily, and you can do this for your own classes:

      - -
      L.map = function (id, options) {
      -	return new L.Map(id, options);
      -};
      - -

      Constructor Hooks

      If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

      @@ -5373,24 +5372,17 @@

      Creation

      - - + - - -
      FactoryUsageCreation Description
      L.Transformation( + new L.Transformation( <Number> a, <Number> b, <Number> c, <Number> d ) - new L.Transformation()
      - -
      Creates a transformation object with the given coefficients.
      @@ -5781,16 +5773,11 @@

      Creation

      - - + - - - + @@ -5858,21 +5845,15 @@

      Creation

      FactoryUsageCreation Description
      L.PosAnimation() - new L.PosAnimation() - new L.PosAnimation() Creates a PosAnimation object.
      - - + - - -
      FactoryUsageCreation Description
      L.Draggable( + new L.Draggable( <HTMLElement> element, <HTMLElement> dragHandle? ) - new L.Draggable() - Creates a Draggable object for moving the given element when you start dragging the dragHandle element (equals the element itself by default).
      From d037c23b2dc7cea128a3a556c7338b774653fa1d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 16:40:13 +0200 Subject: [PATCH 0533/2207] fix prefix default value --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 62a2af37af2..e4afb1c5e1f 100644 --- a/reference.html +++ b/reference.html @@ -4335,7 +4335,7 @@

      Options

      prefix String - 'Powered by Leaflet' + 'Leaflet' The HTML text shown before the attributions. Pass false to disable. From 81cbb20c8657cbe4217779d18c162a1bb3d67965 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 16:47:38 +0200 Subject: [PATCH 0534/2207] add some breaks to 0.6 post --- ...2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md index f2b7e6c08ca..b241d1120c2 100644 --- a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md +++ b/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md @@ -20,9 +20,9 @@ Special thanks go to [Universal Mind](http://universalmind.com/), my awesome emp Grab the CDN links or downloads for the new release on the [download page](../../../download.html) as always. Enjoy! And be sure try it out and report any regressions in your apps so that we can patch them up immediately. -**update** (June 27): 0.6.1 hotfix released with a couple of regressions fixed (particularly the one with FF scroll-zooming too fast). -**update** (June 28): 0.6.2 hotfix released with a couple more minor issues fixed. -**update** (July 17): 0.6.3 released with lots of regressions and bugs fixed. +**update** (June 27): 0.6.1 hotfix released with a couple of regressions fixed (particularly the one with FF scroll-zooming too fast).
      +**update** (June 28): 0.6.2 hotfix released with a couple more minor issues fixed.
      +**update** (July 17): 0.6.3 released with lots of regressions and bugs fixed.
      **update** (July 25): 0.6.4 released with a fix to 0.6.3 regression. P.S. Everyone who tweets/posts about the new Leaflet release or why he loves Leaflet over the next few days will get a karma boost of over 9000 points. I heard that from a passing monk in Georgetown yesterday, true story! From f52bc2323aea540a29c0e0692d8e319c4b0e7fec Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 17:20:23 +0200 Subject: [PATCH 0535/2207] add post about 0.7 release and plans for future --- ...8-leaflet-0-7-released-plans-for-future.md | 56 +++++++++++++++++++ index.md | 2 +- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 _posts/2013-11-18-leaflet-0-7-released-plans-for-future.md diff --git a/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md b/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md new file mode 100644 index 00000000000..290f754c105 --- /dev/null +++ b/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md @@ -0,0 +1,56 @@ +--- +layout: post +title: Leaflet 0.7 Release, MapBox and Plans for Future +description: Leaflet 0.7 Released — with IE11 touch support, upscaling tiles and tons of other improvements and bugfixes! Meanwhile, I've joined the MapBox team full-time. +author: Vladimir Agafonkin +authorsite: http://agafonkin.com/en +--- + +_Leaflet 0.7 Released — with IE11 touch support, upscaling tiles and tons of other improvements and bugfixes! Meanwhile, I've joined the MapBox team full-time..._ + +After another 5 months of active development with [lots of contributors involved](https://github.com/Leaflet/Leaflet/graphs/contributors?from=2013-06-27&to=2013-11-18&type=c), I'm happy to announce the **release of Leaflet 0.7** stable. + +This is a bugfix-heavy release — as Leaflet becomes more and more stable feature-wise, the focus shifts towards stability, usability and API improvements over new features. I've also been holding back some of the planned deep refactorings (which I'll talk about later in the post) until 0.7 is released, so that the heavy risky stuff is done at the beginning of the release cycle, leaving plenty of room to catch bugs and incompatible changes that can unintentionally break existing apps. + +### Joining MapBox + +In other news, I [joined the MapBox team full-time](https://www.mapbox.com/blog/vladimir-agafonkin-joins-mapbox/). This is extremely exciting for me, as this was my dream job for quite a while — [MapBox](https://www.mapbox.com) have changed the world of interactive mapping forever with all their amazing work, having some of the greatest geomapping engineers and designers of the world working together, pushing the boundaries of what's possible and inspiring others every day. + +For Leaflet, this can only mean very good things — much more time on Leaflet development, more enthusiasm, more play, more crazy experiments with maps (like [this one](https://www.mapbox.com/blog/dynamic-hill-shading/)), and lots of learning. I'm now one of the happiest map geeks ever. Stay tuned for tons of awesome! + +### 0.7 changes + +You can check out the [detailed changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md#07-dev-master) of what's already done over the recent months for 0.7 (about 90 improvements and bugfixes), but I'd like to mention some highlights: + +* Added the ability to **upscale tiles** to higher zoom levels (e.g. have zoom 19-20 when the source has 18 max). +* Added support for **IE11 touch devices**. MS unexpectedly broke their pointer API compatibility between Developer Preview and final IE11 release, and we eventually rewrote quite a bit of code to make everything work smoothly across all IE versions (both dekstop & mobile), fixing a bunch of IE10 bugs along the way as well. +* Officially **dropped IE6 support** (nobody cares anyway) and cleaned up/fixed IE7-8 styles. +* Dropped the need for **IE conditional comment** when including Leaflet, making the snippet much simpler — all IE7/8-specific styles got simplified and moved to the main `leaflet.css` file. +* Fixed an **obscure iOS7 memory leak** that crashed Safari when you tried to create several thousands of layers (e.g. markers for clustering). I still don't understand why it happens, but we managed to fix it with a bit of trickery. +* Fixed a critical **Chrome for Android** bug that made the tiles disappear after zooming on some devices. +* Removed some **Earth-related hardcode** in TileLayer implementation to make it easier for plugins like Proj4Leaflet to handle complex projections without horrible hacks. Some other work in this direction to follow in 0.8. +* Improved **panning performance** on complex pages with significant number of elements — we found out that simple things like setting a different cursor to `document` (for a "grabbing" hand) caused noticeable performance hit on some browsers (Chrome in particular). +* **Changed the way maxBounds works**, not enforcing a derived `minZoom` from it but restricting panning across lower zoom levels, along with some tricks to make it play better with panning inertia or offset zooming, etc. + +### Plans for 0.8 + +There are several big undertakings in refactoring Leaflet that I'd want to switch to immediately after releasing 0.7 — I've been holding them off for too long, and they'll be extremely beneficial for plugin and Leaflet-based API authors. Some of them are already in progress. + +* Refactoring the **layers** architecture. Currently there's a lot of duplication of logic across implementation of different layers (map, markers, vector layers, etc.), specifically event handling, zoom animation logic, zIndex and pane handling (what appears on top of what etc.). Making the code consistent, more universal and shared across different layers will make it much easier to customize layers and make your own (e.g. integrate d3, etc.) +* Splitting the huge TileLayer implementation into **GridLayer and TileLayer**, separating image tiles-related logic and grid-logic that will make other grid-like layer implementations (e.g. UTFGrid interaction or tiled GeoJSON) much simpler. +* Refactoring **zoom animation logic** to make the long-awaited Easey-style animations (mapbox.js 0.6-style) possible. +* Refactoring **projections** code to make it easier to set up flat maps and weird projections and customize how Leaflet handles them. +* Refactoring the **vector layers** code to make it possible to use different rendering backends (Canvas, SVG, etc.) for different layers on the same map and switch between them easily. This will also open it up for interesting extensions, like indexing layers with [RBush](https://github.com/mourner/rbush) for fast interaction features. + +While it's an ambitious plan and it may take more than one stable release, finishing all those refactorings will mean that Leaflet is getting ready for a 1.0 release. + +Another direction I'd like to focus on after releasing 0.7 is **website and documentation improvements**. First, Leaflet is begging for **more step-by-step tutorials** (with more advanced features like custom layers, custom controls, etc.), and I'd love to do a docs/tutorials sprint some time in future. Second, the presentation could be significantly improved — adding a prominent visual **showcase** or app gallery, making Leaflet users more prominent with some logos and quotes/testimonials, and updating the layout/design for a more stylish, clean look, etc. + +Hope that gives a good glimpse of the stuff to expect from Leafet in near future, and don't hesitate to ask any questions in comments — I'll be happy to answer! + +Grab the CDN links or downloads for the new release on the [download page](../../../download.html) as always. Be sure to try it out on your apps and report any regressions so that we can patch them up immediately. And lets make some nice Twitter buzz about the release as usual! + +To all the people wo've been involved in Leaflet contributions, bug reports, mailing list, Twitter buzz, making awesome apps and spreading the word about Leaflet — thank you! You are the most awesome community ever. + +Cheers,
      +Vladimir. diff --git a/index.md b/index.md index d4fc64f2994..1112c02fe0e 100644 --- a/index.md +++ b/index.md @@ -2,7 +2,7 @@ layout: default --- - +

      November 18, 2013 — Leaflet 0.7 Release, MapBox & Plans for Future (Blog Post)

      Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. From a26834f3e1d78092131d02cb57f342df2b0b5b19 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 17:36:53 +0200 Subject: [PATCH 0536/2207] minor post fix --- _posts/2013-11-18-leaflet-0-7-released-plans-for-future.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md b/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md index 290f754c105..96b5d2a4d93 100644 --- a/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md +++ b/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md @@ -38,7 +38,7 @@ There are several big undertakings in refactoring Leaflet that I'd want to switc * Refactoring the **layers** architecture. Currently there's a lot of duplication of logic across implementation of different layers (map, markers, vector layers, etc.), specifically event handling, zoom animation logic, zIndex and pane handling (what appears on top of what etc.). Making the code consistent, more universal and shared across different layers will make it much easier to customize layers and make your own (e.g. integrate d3, etc.) * Splitting the huge TileLayer implementation into **GridLayer and TileLayer**, separating image tiles-related logic and grid-logic that will make other grid-like layer implementations (e.g. UTFGrid interaction or tiled GeoJSON) much simpler. -* Refactoring **zoom animation logic** to make the long-awaited Easey-style animations (mapbox.js 0.6-style) possible. +* Refactoring **zoom animation logic** to make the long-awaited Easey-style animations (zoom-panning between points) possible. * Refactoring **projections** code to make it easier to set up flat maps and weird projections and customize how Leaflet handles them. * Refactoring the **vector layers** code to make it possible to use different rendering backends (Canvas, SVG, etc.) for different layers on the same map and switch between them easily. This will also open it up for interesting extensions, like indexing layers with [RBush](https://github.com/mourner/rbush) for fast interaction features. From 7fe1f804d327fc3e1c7699162956428dd4eb72c2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 17:56:33 +0200 Subject: [PATCH 0537/2207] fix download link --- download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.md b/download.md index 9ac6f7c5022..efad0395c0f 100644 --- a/download.md +++ b/download.md @@ -11,7 +11,7 @@ title: Download Description - Leaflet 0.7 + Leaflet 0.7 Stable version, released on November 18, 2013. From fb5c2484f0c0a1746213f39f64d872875c2cf80d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 18:15:44 +0200 Subject: [PATCH 0538/2207] fix cursor on headings --- docs/css/screen.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/css/screen.css b/docs/css/screen.css index cac0b998967..08c9245c900 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -74,7 +74,9 @@ h2 { border-radius: 5px; text-shadow: 0 -1px 1px rgba(0,0,0,0.35); + } +.api-page h2 { cursor: pointer; } From 8a2a0ae6e433dc7d8faf634a85908ba664f9f304 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 18:25:37 +0200 Subject: [PATCH 0539/2207] remove metadata on non-title pages --- _layouts/default.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_layouts/default.html b/_layouts/default.html index 9fe219b983c..eb23ae5e1e9 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -7,6 +7,7 @@ + {% if page.title %} @@ -14,6 +15,7 @@ + {% endif %} From 838549253cb29a118a6860b4df284868e07edd8e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 18:26:47 +0200 Subject: [PATCH 0540/2207] one more attempt at metadata --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index eb23ae5e1e9..6ea9bfc2bca 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -7,7 +7,7 @@ - {% if page.title %} + {% unless page.title %} From ebc62771cfcc28faf075ca148a60a5049c45bcb3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 18 Nov 2013 18:29:29 +0200 Subject: [PATCH 0541/2207] and one more metadata fix --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 6ea9bfc2bca..06cd11b92b9 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -7,7 +7,7 @@ - {% unless page.title %} + {% if title == '' %} From 087a14916c0363754ef0f323a303de85d739b00b Mon Sep 17 00:00:00 2001 From: Benjamin J DeLong Date: Tue, 19 Nov 2013 10:13:13 -0700 Subject: [PATCH 0542/2207] Added WebGL heatmap plugin I added it next to and after the other heatmap plugins. --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index ceac6a8f491..699725e9012 100644 --- a/plugins.md +++ b/plugins.md @@ -101,6 +101,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Daniele Piccone + + + WebGL Heatmap + + High performance javascript heatmap plugin using WebGL + + + Benjamin J DeLong + + Leaflet.MultiTileLayer From 86f3995ce79691f84f0d70f5bb6064f06cf5557b Mon Sep 17 00:00:00 2001 From: Trevor Powell Date: Tue, 19 Nov 2013 15:37:08 -0600 Subject: [PATCH 0543/2207] Fixing bounceAtZoomLimits option name --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index e4afb1c5e1f..3faaf386894 100644 --- a/reference.html +++ b/reference.html @@ -284,7 +284,7 @@

      Interaction Options

      Set it to false if you don't want popups to close when user clicks the map. - bounceZoomAtLimits + bounceAtZoomLimits Boolean true Set it to false if you don't want the map to zoom beyound min/max zoom and then bounce back when pinch-zooming. From 7dd54d0d2bdea8670db1cd58e64718ec5dd236c8 Mon Sep 17 00:00:00 2001 From: Trevor Powell Date: Tue, 19 Nov 2013 15:45:42 -0600 Subject: [PATCH 0544/2207] Spelling fix --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 3faaf386894..7caf53689be 100644 --- a/reference.html +++ b/reference.html @@ -287,7 +287,7 @@

      Interaction Options

      bounceAtZoomLimits Boolean true - Set it to false if you don't want the map to zoom beyound min/max zoom and then bounce back when pinch-zooming. + Set it to false if you don't want the map to zoom beyond min/max zoom and then bounce back when pinch-zooming. From 280fb14a2a0aa9273fe2ffd5208c68acf3a8f02f Mon Sep 17 00:00:00 2001 From: Benjamin J DeLong Date: Tue, 19 Nov 2013 15:37:28 -0700 Subject: [PATCH 0545/2207] Spelling/punctuation adjustments --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 699725e9012..1577a6d81b2 100644 --- a/plugins.md +++ b/plugins.md @@ -105,7 +105,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s WebGL Heatmap - High performance javascript heatmap plugin using WebGL + High performance Javascript heatmap plugin using WebGL. Benjamin J DeLong From 6ccdd4934ba4f7a75a3adfb927a57a28827a69a4 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 20 Nov 2013 16:52:34 +0000 Subject: [PATCH 0546/2207] add leaflet.plotter plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index ceac6a8f491..3f4e3055b94 100644 --- a/plugins.md +++ b/plugins.md @@ -17,6 +17,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Description Maintainer + + + Leaflet.plotter + + leaflet-plotter allows you to create routes using a leaflet powered map. You can click on the mid-points to create a new, draggable point. + + Dave Leaver + + Leaflet.markercluster From cfa0d04a16fd00d7be116a84dd6d60bddf822fc0 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 21 Nov 2013 10:16:59 +0000 Subject: [PATCH 0547/2207] missed the namechange from last commit --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 3f4e3055b94..3b0270c11f1 100644 --- a/plugins.md +++ b/plugins.md @@ -23,7 +23,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s leaflet-plotter allows you to create routes using a leaflet powered map. You can click on the mid-points to create a new, draggable point. - Dave Leaver + Nathan Mahdavi From 71e8dfa38265d12d61ec9a7f6dc092a028b44f9d Mon Sep 17 00:00:00 2001 From: Seong Choi Date: Mon, 25 Nov 2013 19:47:37 +0900 Subject: [PATCH 0548/2207] Update plugins.md I added Leaflet.KoreanTmsProviders at the Services, Providers and Formats table. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 3b0270c11f1..5e9d0d48767 100644 --- a/plugins.md +++ b/plugins.md @@ -428,6 +428,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Eugene Mikhalev + + + Leaflet.KoreanTmsProviders + + Contains configurations for various (South) Korean tile providers — Daum, Naver, VWorld, etc. + + Seong Choi + + From 26d5952b825abc88828c934d21826695be188752 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Thu, 28 Nov 2013 21:50:39 -0500 Subject: [PATCH 0549/2207] Add Leaflet.FeatureSelect --- plugins.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/plugins.md b/plugins.md index 5e9d0d48767..478b0ca6310 100644 --- a/plugins.md +++ b/plugins.md @@ -235,7 +235,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bjørn Sandvik - + Leaflet.Graticule @@ -244,13 +244,13 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bjørn Sandvik - + leaflet-usermarker - Plugin for plotting a marker representing a user - or multiple users - on a map, - with support for drawing an accuraccy circle. Can be seen in action on + Plugin for plotting a marker representing a user - or multiple users - on a map, + with support for drawing an accuraccy circle. Can be seen in action on Longitude.me. Jonatan Heyman @@ -291,6 +291,14 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jörg Dietrich + + + Leaflet.FeatureSelect + Use a configurable centerpoint marker to select any geometry type from a GeoJSON layer. + + Aaron Ogle + + @@ -766,7 +774,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s A context menu for Leaflet. Adam Ratcliffe - + @@ -775,7 +783,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s A simple tool to measure distances on maps (*relies on Leaflet.Draw*). Makina Corpus - + @@ -785,7 +793,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s intentions to aim a particular layer. Mathieu Leplatre - + @@ -794,7 +802,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Trigger mouse events when cursor is "almost" over a layer. Mathieu Leplatre - + @@ -803,7 +811,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Adds the ability to change overlay order in the layers control. Michael Salgado - + From 6f1784fc9aceb4ba4ab9c8cb6069166ac292f2eb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Dec 2013 19:13:46 +0200 Subject: [PATCH 0550/2207] update changelog [skip ci] --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99efcf86d30..1ab3e2f75c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,19 @@ Leaflet Changelog ## 0.8-dev (master) -An in-progress version being developed on the `master` branch. No changes since 0.7 release yet. +An in-progress version being developed on the `master` branch. Includes `stable` branch fixes. + +* Improved the build system (`jake build`) to report gzipped library size. + +## 0.7.1-dev (stable) + +An in-progress version being developed on the `stable` branch. + +* Fixed tile flickering issues on some old Android 2/3 devices by disabling buggy hardware accelerated CSS there (by [@danzel](https://github.com/danzel)). [#2216](https://github.com/Leaflet/Leaflet/pull/2216) [#2198](https://github.com/Leaflet/Leaflet/issues/2198) +* Reverted `L.Util.template` optimizations to allow Leaflet to be used in eval-banning environments like browser extensions (performance gain was insignificant anyway) (by [@calvinmetcalf](https://github.com/calvinmetcalf)). [#2217](https://github.com/Leaflet/Leaflet/issues/2217) [#2209](https://github.com/Leaflet/Leaflet/issues/2209) [#1968](https://github.com/Leaflet/Leaflet/issues/1968) +* Fixed a regression where `Map` `invalidateSize` could lead to unexpected results when called before map initialization (by [@Zverik](https://github.com/Zverik)). [#2250](https://github.com/Leaflet/Leaflet/issues/2250) [#2249](https://github.com/Leaflet/Leaflet/issues/2249) +* Fixed a regression where `FeatureGroup` containing other group overwrote original `e.layer` value in mouse events (by [@gumballhead](https://github.com/gumballhead)). [#2253](https://github.com/Leaflet/Leaflet/pull/2253) [#2252](https://github.com/Leaflet/Leaflet/issues/2252) +* Fixed a regression where `CircleMarker` `setLatLngs` didn't return `this` (by [@radicalbiscuit](https://github.com/radicalbiscuit)). [#2206](https://github.com/Leaflet/Leaflet/pull/2206) ## 0.7 (November 18, 2013) From 87520df2e22594ed3f537f12be87a0fdddc9b7b0 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Thu, 3 Oct 2013 13:08:19 -0400 Subject: [PATCH 0551/2207] Spherical Radius is used in Spherical Mercator --- spec/suites/geo/ProjectionSpec.js | 48 +++++++++++++++++++ .../Projection.SphericalMercator.js | 10 ++-- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/spec/suites/geo/ProjectionSpec.js b/spec/suites/geo/ProjectionSpec.js index 41c469d701f..f3ca8a5ccd3 100644 --- a/spec/suites/geo/ProjectionSpec.js +++ b/spec/suites/geo/ProjectionSpec.js @@ -46,3 +46,51 @@ describe("Projection.Mercator", function () { }); }); }); +describe("Projection.SphericalMercator", function() { + var p = L.Projection.SphericalMercator; + + describe("#project", function() { + it("projects a center point", function() { + //edge cases + expect(p.project(new L.LatLng(0, 0))).near(new L.Point(0, 0)); + }); + + it("projects the northeast corner of the world", function() { + expect(p.project(new L.LatLng(90, 180))).near(new L.Point(20037508, 20037508)); + }); + + it("projects the southwest corner of the world", function() { + expect(p.project(new L.LatLng(-90, -180))).near(new L.Point(-20037508, -20037508)); + }); + + it("projects other points", function() { + expect(p.project(new L.LatLng(50, 30))).near(new L.Point(3339584, 6446275)); + + // from https://github.com/Leaflet/Leaflet/issues/1578 + expect(p.project(new L.LatLng(51.9371170300465, 80.11230468750001))) + .near(new L.Point(8918060.96409, 6788763.38325)); + }); + }); + + describe("#unproject", function() { + function pr(point) { + return p.project(p.unproject(point)); + } + + it("unprojects a center point", function() { + expect(pr(new L.Point(0, 0))).near(new L.Point(0, 0)); + }); + + it("unprojects pi points", function() { + expect(pr(new L.Point(-Math.PI, Math.PI))).near(new L.Point(-Math.PI, Math.PI)); + expect(pr(new L.Point(-Math.PI, -Math.PI))).near(new L.Point(-Math.PI, -Math.PI)); + + expect(pr(new L.Point(0.523598775598, 1.010683188683))).near(new L.Point(0.523598775598, 1.010683188683)); + }); + + it('unprojects other points', function () { + // from https://github.com/Leaflet/Leaflet/issues/1578 + expect(pr(new L.Point(8918060.964088084, 6755099.410887127))); + }); + }); +}); \ No newline at end of file diff --git a/src/geo/projection/Projection.SphericalMercator.js b/src/geo/projection/Projection.SphericalMercator.js index 0cf969f8d72..a3a6e03b497 100644 --- a/src/geo/projection/Projection.SphericalMercator.js +++ b/src/geo/projection/Projection.SphericalMercator.js @@ -4,23 +4,23 @@ L.Projection.SphericalMercator = { MAX_LATITUDE: 85.0511287798, - + R_MAJOR: 6378137, project: function (latlng) { // (LatLng) -> Point var d = L.LatLng.DEG_TO_RAD, max = this.MAX_LATITUDE, lat = Math.max(Math.min(max, latlng.lat), -max), - x = latlng.lng * d, + x = latlng.lng * d * this.R_MAJOR, y = lat * d; y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); - + y *= this.R_MAJOR; return new L.Point(x, y); }, unproject: function (point) { // (Point, Boolean) -> LatLng var d = L.LatLng.RAD_TO_DEG, - lng = point.x * d, - lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; + lng = point.x * d / this.R_MAJOR, + lat = (2 * Math.atan(Math.exp(point.y / this.R_MAJOR)) - (Math.PI / 2)) * d; return new L.LatLng(lat, lng); } From b2acd4e26d224544e92b0575256258eade8a279d Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Thu, 10 Oct 2013 08:24:42 -0400 Subject: [PATCH 0552/2207] update 3857 based on 3395 --- src/geo/crs/CRS.EPSG3857.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/geo/crs/CRS.EPSG3857.js b/src/geo/crs/CRS.EPSG3857.js index 23551a14c22..670ca49a831 100644 --- a/src/geo/crs/CRS.EPSG3857.js +++ b/src/geo/crs/CRS.EPSG3857.js @@ -7,13 +7,13 @@ L.CRS.EPSG3857 = L.extend({}, L.CRS, { code: 'EPSG:3857', projection: L.Projection.SphericalMercator, - transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), + transformation: (function () { + var m = L.Projection.SphericalMercator, + r = m.R_MAJOR, + scale = 0.5 / (Math.PI * r); - project: function (latlng) { // (LatLng) -> Point - var projectedPoint = this.projection.project(latlng), - earthRadius = 6378137; - return projectedPoint.multiplyBy(earthRadius); - } + return new L.Transformation(scale, 0.5, -scale, 0.5); + }()) }); L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { From e8c504b5f94e882ec7b121c9065b0d32a8e37e6a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 25 Nov 2013 18:41:27 +0200 Subject: [PATCH 0553/2207] working GridLayer implementation, #1180 --- build/deps.js | 8 +- debug/map/grid.html | 39 +++ src/layer/tile/GridLayer.js | 502 ++++++++++++++++++++++++++++++++++++ 3 files changed, 548 insertions(+), 1 deletion(-) create mode 100644 debug/map/grid.html create mode 100644 src/layer/tile/GridLayer.js diff --git a/build/deps.js b/build/deps.js index 5e37e0e21d4..cb53a33cd3f 100644 --- a/build/deps.js +++ b/build/deps.js @@ -29,10 +29,16 @@ var deps = { heading: 'Additional projections' }, + GridLayer: { + src: ['layer/tile/GridLayer.js'], + desc: 'Grid Layer.', + heading: 'Layers' + }, + TileLayer: { src: ['layer/tile/TileLayer.js'], desc: 'The base class for displaying tile layers on the map.', - heading: 'Layers' + deps: ['GridLayer'] }, TileLayerWMS: { diff --git a/debug/map/grid.html b/debug/map/grid.html new file mode 100644 index 00000000000..52efa3549cf --- /dev/null +++ b/debug/map/grid.html @@ -0,0 +1,39 @@ + + + + Leaflet debug page + + + + + + + + + + + + +
      + + + + diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js new file mode 100644 index 00000000000..a622d8a8e06 --- /dev/null +++ b/src/layer/tile/GridLayer.js @@ -0,0 +1,502 @@ +/* + * L.GridLayer is used as base class for grid-like layers like TileLayer. + */ + +L.GridLayer = L.Class.extend({ + + includes: L.Mixin.Events, + + options: { + tileSize: 256, + opacity: 1, + + // minZoom: , + // maxZoom: , + + async: false, + unloadInvisibleTiles: L.Browser.mobile, + updateWhenIdle: L.Browser.mobile, + updateInterval: 150 + }, + + initialize: function (options) { + options = L.setOptions(this, options); + }, + + onAdd: function (map) { + this._map = map; + this._animated = map._zoomAnimated; + + this._initContainer(); + + if (!this.options.updateWhenIdle) { + // update tiles on move, but not more often than once per given interval + this._update = L.Util.limitExecByInterval(this._update, this.options.updateInterval, this); + } + + map.on(this._getEvents(), this); + + this._reset(); + this._update(); + }, + + onRemove: function (map) { + this._getPane().removeChild(this._container); + + map.on(this._getEvents(), this); + + this._container = null; + this._map = null; + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + bringToFront: function () { + var pane = this._getPane(); + + if (this._container) { + pane.appendChild(this._container); + this._setAutoZIndex(pane, Math.max); + } + return this; + }, + + bringToBack: function () { + var pane = this._map._panes.tilePane; + + if (this._container) { + pane.insertBefore(this._container, pane.firstChild); + this._setAutoZIndex(pane, Math.min); + } + return this; + }, + + getAttribution: function () { + return this.options.attribution; + }, + + getContainer: function () { + return this._container; + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._map) { + this._updateOpacity(); + } + return this; + }, + + setZIndex: function (zIndex) { + this.options.zIndex = zIndex; + this._updateZIndex(); + + return this; + }, + + redraw: function () { + if (this._map) { + this._reset({hard: true}); //TODO wtf hard? + this._update(); + } + return this; + }, + + isValidTile: function (coords) { + if (!this.options.bounds) { return true; } + + var tileBounds = this._tileCoordsToBounds(coords), + bounds = L.latLngBounds(this.options.bounds); + + return bounds.contains(tileBounds); + }, + + _getPane: function () { + // TODO pane in options? + return this._map._panes.tilePane; + }, + + _getEvents: function () { + var events = { + viewreset: this._reset, + moveend: this._update + }; + + if (!this.options.updateWhenIdle) { + events.move = this._update; + } + + if (this._animated) { + events.zoomanim = this._animateZoom; + events.zoomend = this._endZoomAnim; + } + + return events; + }, + + _updateZIndex: function () { + if (this._container && this.options.zIndex !== undefined) { + this._container.style.zIndex = this.options.zIndex; + } + }, + + _setAutoZIndex: function (pane, compare) { + + var layers = pane.children, + edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min + zIndex, i, len; + + for (i = 0, len = layers.length; i < len; i++) { + + if (layers[i] !== this._container) { + zIndex = parseInt(layers[i].style.zIndex, 10); + + if (!isNaN(zIndex)) { + edgeZIndex = compare(edgeZIndex, zIndex); + } + } + } + + this.options.zIndex = this._container.style.zIndex = + (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); + }, + + _updateOpacity: function () { + var i, + tiles = this._tiles; + + if (L.Browser.ielt9) { + for (i in tiles) { + L.DomUtil.setOpacity(tiles[i], this.options.opacity); + } + } else { + L.DomUtil.setOpacity(this._container, this.options.opacity); + } + }, + + _initContainer: function () { + if (this._container) { return; } + + this._container = L.DomUtil.create('div', 'leaflet-layer'); + this._updateZIndex(); + + if (this._animated) { + var className = 'leaflet-tile-container leaflet-zoom-animated'; + + this._bgBuffer = L.DomUtil.create('div', className, this._container); + this._tileContainer = L.DomUtil.create('div', className, this._container); + + } else { + this._tileContainer = this._container; + } + + // TODO check if opacity works when setting before appendChild + if (this.options.opacity < 1) { + this._updateOpacity(); + } + + this._getPane().appendChild(this._container); + }, + + _reset: function (e) { + for (var key in this._tiles) { + this.fire('tileunload', { + tile: this._tiles[key] + }); + } + + this._tiles = {}; + this._tilesToLoad = 0; + + this._tileContainer.innerHTML = ''; + + if (this._animated && e && e.hard) { + this._clearBgBuffer(); + } + + // this._initContainer(); + // TODO OK? + }, + + _getTileSize: function () { + var map = this._map, + zoom = map.getZoom() + this.options.zoomOffset, + zoomN = this.options.maxNativeZoom, + tileSize = this.options.tileSize; + + if (zoomN && zoom > zoomN) { + tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); + } + + return tileSize; + }, + + _update: function () { + + if (!this._map) { return; } + + var bounds = this._map.getPixelBounds(), + zoom = this._map.getZoom(), + tileSize = this._getTileSize(); + + if (zoom > this.options.maxZoom || + zoom < this.options.minZoom) { return; } + + // TODO clear bg buffer? + + var tileBounds = L.bounds( + bounds.min.divideBy(tileSize).floor(), + bounds.max.divideBy(tileSize).floor()); + + this._addTilesFromCenterOut(tileBounds); + + if (this.options.unloadInvisibleTiles) { + this._removeOtherTiles(tileBounds); + } + }, + + _addTilesFromCenterOut: function (bounds) { + var queue = [], + center = bounds.getCenter(), + zoom = this._map.getZoom(); + + var j, i, coords; + + for (j = bounds.min.y; j <= bounds.max.y; j++) { + for (i = bounds.min.x; i <= bounds.max.x; i++) { + + coords = new L.Point(i, j); + coords.z = zoom; + + if (!this._tileIsAdded(coords) && this.isValidTile(coords)) { + queue.push(coords); + } + } + } + + var tilesToLoad = queue.length; + + if (tilesToLoad === 0) { return; } + + // if its the first batch of tiles to load + if (!this._tilesToLoad) { + this.fire('loading'); + } + + this._tilesToLoad += tilesToLoad; + + // load tiles to load tiles in order of their distance to center + queue.sort(function (a, b) { + return a.distanceTo(center) - b.distanceTo(center); + }); + + var fragment = document.createDocumentFragment(); + + for (i = 0; i < tilesToLoad; i++) { + this._addTile(queue[i], fragment); + } + + this._tileContainer.appendChild(fragment); + }, + + _tileIsAdded: function (coords) { + return this._tileCoordsToKey(coords) in this._tiles; + }, + + _tileCoordsToBounds: function (coords) { + + var tileSize = this.options.tileSize, + + nwPoint = coords.multiplyBy(tileSize), + sePoint = nwPoint.add([tileSize, tileSize]), + + nw = this._map.unproject(nwPoint), + se = this._map.unproject(sePoint); + + // TODO rectangular + + return new L.LatLngBounds(nw, se); + }, + + _tileCoordsToKey: function (coords) { + return coords.x + ':' + coords.y; + }, + + _keyToTileCoords: function (key) { + var kArr = key.split(':'), + x = parseInt(kArr[0], 10), + y = parseInt(kArr[1], 10); + + return new L.Point(x, y); + }, + + _removeOtherTiles: function (bounds) { + for (var key in this._tiles) { + if (!bounds.contains(this._keyToTileCoords(key))) { + this._removeTile(key); + } + } + }, + + _removeTile: function (key) { + var tile = this._tiles[key]; + + if (tile.parentNode) { + tile.parentNode.removeChild(tile); + } + + delete this._tiles[key]; + + this.fire('tileunload', {tile: tile}); + }, + + _initTile: function (tile) { + var size = this._getTileSize(); + + L.DomUtil.addClass(tile, 'leaflet-tile'); + + tile.style.width = size + 'px'; + tile.style.height = size + 'px'; + + tile.onselectstart = L.Util.falseFn; + tile.onmousemove = L.Util.falseFn; + + if (L.Browser.ielt9 && this.options.opacity !== undefined) { + L.DomUtil.setOpacity(tile, this.options.opacity); + } + + // without this hack, tiles disappear after zoom on Chrome for Android + // https://github.com/Leaflet/Leaflet/issues/2078 + if (L.Browser.mobileWebkit3d) { + tile.style.WebkitBackfaceVisibility = 'hidden'; + } + }, + + _addTile: function (coords, container) { + var tile = this.createTile(coords, this._tileReady); + + // TODO wrapping happens here? + + this._initTile(tile); + + if (this.createTile.length < 2) { + this._tileReady(tile); + // TODO pass tileReady to createTile for async + } + + var tilePos = this._getTilePos(coords); + + /* + Chrome 20 layouts much faster with top/left (verify with timeline, frames) + Android 4 browser has display issues with top/left and requires transform instead + Android 2 browser requires top/left or tiles disappear on load or first drag + (reappear after zoom) https://github.com/CloudMade/Leaflet/issues/866 + (other browsers don't currently care) - see debug/hacks/jitter.html for an example + */ + L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23); + + this._tiles[this._tileCoordsToKey(coords)] = tile; + + container.appendChild(tile); + }, + + _tileReady: function (tile) { + L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); + + this.fire('tileload', {tile: tile}); + + this._tilesToLoad--; + + if (this._tilesToLoad === 0) { + this._visibleTilesReady(); + } + }, + + _visibleTilesReady: function () { + this.fire('load'); + + if (this._animated) { + // clear scaled tiles after all new tiles are loaded (for performance) + this._clearBgBuffer(); + + // TODO find out why timeout was needed + // clearTimeout(this._clearBgBufferTimer); + // this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); + } + }, + + _getTilePos: function (tilePoint) { + var origin = this._map.getPixelOrigin(), + tileSize = this._getTileSize(); + + return tilePoint.multiplyBy(tileSize).subtract(origin); + }, + + _animateZoom: function (e) { + if (!this._animating) { + this._animating = true; + this._prepareBgBuffer(); + } + + var bg = this._bgBuffer, + transform = L.DomUtil.TRANSFORM, + initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], + scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); + + bg.style[transform] = e.backwards ? + scaleStr + ' ' + initialTransform : + initialTransform + ' ' + scaleStr; + }, + + _endZoomAnim: function () { + var front = this._tileContainer, + bg = this._bgBuffer; + + front.style.visibility = ''; + front.parentNode.appendChild(front); // Bring to fore + + // force reflow + L.Util.falseFn(bg.offsetWidth); + + this._animating = false; + }, + + _clearBgBuffer: function () { + var map = this._map; + + if (map && !map._animatingZoom && !map.touchZoom._zooming) { + this._bgBuffer.innerHTML = ''; + this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; + } + }, + + _prepareBgBuffer: function () { + this._swapBgBuffer(); + // TODO override in TileLayer + }, + + _swapBgBuffer: function () { + + var front = this._tileContainer, + bg = this._bgBuffer; + + // prepare the buffer to become the front tile pane + bg.style.visibility = 'hidden'; + bg.style[L.DomUtil.TRANSFORM] = ''; + + // switch out the current layer to be the new bg layer (and vice-versa) + this._tileContainer = bg; + this._bgBuffer = front; + + // prevent bg buffer from clearing right after zoom + clearTimeout(this._clearBgBufferTimer); + } +}); + +L.gridLayer = function (options) { + return new L.GridLayer(options); +}; From 8f97ca619e8958ecd5512f27817c888c1405a4fd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 25 Nov 2013 19:13:30 +0200 Subject: [PATCH 0554/2207] easy async loading for GridLayer --- debug/map/grid.html | 9 ++++++++- src/layer/tile/GridLayer.js | 15 +++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/debug/map/grid.html b/debug/map/grid.html index 52efa3549cf..06e71d7f58c 100644 --- a/debug/map/grid.html +++ b/debug/map/grid.html @@ -23,10 +23,17 @@ attribution: 'Grid Layer' }); - grid.createTile = function (coords) { + grid.createTile = function (coords, done) { var tile = document.createElement('div'); tile.innerHTML = [coords.x, coords.y, coords.z].join(','); tile.style.outline = '1px solid red'; + tile.style.background = 'white'; + + // test async + setTimeout(function () { + done(tile); + }, Math.random() * 500); + return tile; }; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index a622d8a8e06..1bae815439d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -13,7 +13,6 @@ L.GridLayer = L.Class.extend({ // minZoom: , // maxZoom: , - async: false, unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile, updateInterval: 150 @@ -21,6 +20,9 @@ L.GridLayer = L.Class.extend({ initialize: function (options) { options = L.setOptions(this, options); + + // make sure it can be passed safely without losing context + this._tileReady = L.bind(this._tileReady, this); }, onAdd: function (map) { @@ -384,8 +386,8 @@ L.GridLayer = L.Class.extend({ this._initTile(tile); if (this.createTile.length < 2) { - this._tileReady(tile); - // TODO pass tileReady to createTile for async + // if tiles are sync, delay one frame for opacity anim to happen + setTimeout(L.bind(this._tileReady, this, tile), 0); } var tilePos = this._getTilePos(coords); @@ -421,11 +423,8 @@ L.GridLayer = L.Class.extend({ if (this._animated) { // clear scaled tiles after all new tiles are loaded (for performance) - this._clearBgBuffer(); - - // TODO find out why timeout was needed - // clearTimeout(this._clearBgBufferTimer); - // this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); + clearTimeout(this._clearBgBufferTimer); + this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 300); } }, From 82e43019eecd554d0491747a2ff63a481dfae058 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 26 Nov 2013 17:16:18 +0200 Subject: [PATCH 0555/2207] proper GridLayer wrapping/bounding --- debug/map/grid.html | 2 +- src/geo/crs/CRS.EPSG3857.js | 2 ++ src/layer/tile/GridLayer.js | 65 +++++++++++++++++++++++++++---------- 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/debug/map/grid.html b/debug/map/grid.html index 06e71d7f58c..fb73383070f 100644 --- a/debug/map/grid.html +++ b/debug/map/grid.html @@ -31,7 +31,7 @@ // test async setTimeout(function () { - done(tile); + done(null, tile); }, Math.random() * 500); return tile; diff --git a/src/geo/crs/CRS.EPSG3857.js b/src/geo/crs/CRS.EPSG3857.js index 670ca49a831..6d668b79ed9 100644 --- a/src/geo/crs/CRS.EPSG3857.js +++ b/src/geo/crs/CRS.EPSG3857.js @@ -14,6 +14,8 @@ L.CRS.EPSG3857 = L.extend({}, L.CRS, { return new L.Transformation(scale, 0.5, -scale, 0.5); }()) + + wrapLng: true }); L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 1bae815439d..66bce929a6a 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -108,15 +108,6 @@ L.GridLayer = L.Class.extend({ return this; }, - isValidTile: function (coords) { - if (!this.options.bounds) { return true; } - - var tileBounds = this._tileCoordsToBounds(coords), - bounds = L.latLngBounds(this.options.bounds); - - return bounds.contains(tileBounds); - }, - _getPane: function () { // TODO pane in options? return this._map._panes.tilePane; @@ -274,7 +265,7 @@ L.GridLayer = L.Class.extend({ coords = new L.Point(i, j); coords.z = zoom; - if (!this._tileIsAdded(coords) && this.isValidTile(coords)) { + if (!this._tileIsAdded(coords) && this._isValidTile(coords)) { queue.push(coords); } } @@ -305,6 +296,21 @@ L.GridLayer = L.Class.extend({ this._tileContainer.appendChild(fragment); }, + _isValidTile: function (coords) { + var crs = this._map.options.crs, + limit = this._getWrapTileNum(); + + if (!crs.wrapLng && (coords.x < 0 || coords.x >= limit.x)) { return; } + if (!crs.wrapLat && (coords.y < 0 || coords.y >= limit.y)) { return; } + + if (!this.options.bounds) { return true; } + + var tileBounds = this._tileCoordsToBounds(coords), + bounds = L.latLngBounds(this.options.bounds); + + return bounds.contains(tileBounds); + }, + _tileIsAdded: function (coords) { return this._tileCoordsToKey(coords) in this._tiles; }, @@ -319,8 +325,6 @@ L.GridLayer = L.Class.extend({ nw = this._map.unproject(nwPoint), se = this._map.unproject(sePoint); - // TODO rectangular - return new L.LatLngBounds(nw, se); }, @@ -379,19 +383,23 @@ L.GridLayer = L.Class.extend({ }, _addTile: function (coords, container) { + var tilePos = this._getTilePos(coords); + + this._wrapCoords(coords); + var tile = this.createTile(coords, this._tileReady); - // TODO wrapping happens here? + this.fire('tileloadstart', {tile: tile}); this._initTile(tile); + // if createTile is defined with a second argument ("done" callback), + // we know that tile is async and will be ready later; otherwise if (this.createTile.length < 2) { - // if tiles are sync, delay one frame for opacity anim to happen - setTimeout(L.bind(this._tileReady, this, tile), 0); + // mark tile as ready, but delay one frame for opacity anim to happen + setTimeout(L.bind(this._tileReady, this, null, tile), 0); } - var tilePos = this._getTilePos(coords); - /* Chrome 20 layouts much faster with top/left (verify with timeline, frames) Android 4 browser has display issues with top/left and requires transform instead @@ -406,7 +414,11 @@ L.GridLayer = L.Class.extend({ container.appendChild(tile); }, - _tileReady: function (tile) { + _tileReady: function (err, tile) { + if (err) { + this.fire('tileerror', {error: err}); + } + L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); this.fire('tileload', {tile: tile}); @@ -435,6 +447,23 @@ L.GridLayer = L.Class.extend({ return tilePoint.multiplyBy(tileSize).subtract(origin); }, + _wrapCoords: function (coords) { + var crs = this._map.options.crs, + limit = this._getWrapTileNum(); + + if (crs.wrapLng) { + coords.x = ((coords.x % limit.x) + limit.x) % limit.x; + } + if (crs.wrapLat) { + coords.y = ((coords.y % limit.y) + limit.y) % limit.y; + } + }, + + _getWrapTileNum: function () { + var size = this._map.options.crs.getSize(this._map.getZoom()); + return size.divideBy(this.options.tileSize); + }, + _animateZoom: function (e) { if (!this._animating) { this._animating = true; From 7a3e63ea53ff2d7e4361098c9a2694fb2780fe12 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 26 Nov 2013 18:55:10 +0200 Subject: [PATCH 0556/2207] handle simple CRS in GridLayer --- debug/map/grid.html | 3 +-- debug/map/simple-proj.html | 13 +++++++++++++ src/geo/crs/CRS.Simple.js | 4 +++- src/layer/tile/GridLayer.js | 13 +++++++++---- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/debug/map/grid.html b/debug/map/grid.html index fb73383070f..2b2d620d7a9 100644 --- a/debug/map/grid.html +++ b/debug/map/grid.html @@ -19,13 +19,12 @@ diff --git a/src/geo/crs/CRS.Simple.js b/src/geo/crs/CRS.Simple.js index a492492563f..61e947ec877 100644 --- a/src/geo/crs/CRS.Simple.js +++ b/src/geo/crs/CRS.Simple.js @@ -8,5 +8,7 @@ L.CRS.Simple = L.extend({}, L.CRS, { scale: function (zoom) { return Math.pow(2, zoom); - } + }, + + infinite: true }); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 66bce929a6a..a166b8e3e4d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -300,8 +300,10 @@ L.GridLayer = L.Class.extend({ var crs = this._map.options.crs, limit = this._getWrapTileNum(); - if (!crs.wrapLng && (coords.x < 0 || coords.x >= limit.x)) { return; } - if (!crs.wrapLat && (coords.y < 0 || coords.y >= limit.y)) { return; } + if (!crs.infinite && ((!crs.wrapLng && (coords.x < 0 || coords.x >= limit.x)) || + (!crs.wrapLat && (coords.y < 0 || coords.y >= limit.y)))) { + return false; + } if (!this.options.bounds) { return true; } @@ -448,8 +450,11 @@ L.GridLayer = L.Class.extend({ }, _wrapCoords: function (coords) { - var crs = this._map.options.crs, - limit = this._getWrapTileNum(); + var crs = this._map.options.crs; + + if (crs.infinite) { return; } + + var limit = this._getWrapTileNum(); if (crs.wrapLng) { coords.x = ((coords.x % limit.x) + limit.x) % limit.x; From 6c4d607e4d0d10f9ec2ec3b3e51c57dece1477ce Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Tue, 26 Nov 2013 21:38:12 +0100 Subject: [PATCH 0557/2207] Add bounds to Projection, to calculate size --- src/geo/crs/CRS.js | 8 ++++++-- src/geo/projection/Projection.LonLat.js | 4 +++- src/geo/projection/Projection.SphericalMercator.js | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js index e577d8f42b0..ecd12b6bb9f 100644 --- a/src/geo/crs/CRS.js +++ b/src/geo/crs/CRS.js @@ -26,7 +26,11 @@ L.CRS = { }, getSize: function (zoom) { - var s = this.scale(zoom); - return L.point(s, s); + var b = this.projection.bounds, + s = this.scale(zoom), + min = this.transformation.transform(b.min, s), + max = this.transformation.transform(b.max, s); + + return L.point(Math.abs(max.x - min.x), Math.abs(max.y - min.y)); } }; diff --git a/src/geo/projection/Projection.LonLat.js b/src/geo/projection/Projection.LonLat.js index 449dabae75f..08fd7901d15 100644 --- a/src/geo/projection/Projection.LonLat.js +++ b/src/geo/projection/Projection.LonLat.js @@ -9,5 +9,7 @@ L.Projection.LonLat = { unproject: function (point) { return new L.LatLng(point.y, point.x); - } + }, + + bounds: L.bounds([-180, -90], [180, 90]) }; diff --git a/src/geo/projection/Projection.SphericalMercator.js b/src/geo/projection/Projection.SphericalMercator.js index a3a6e03b497..6a501241fed 100644 --- a/src/geo/projection/Projection.SphericalMercator.js +++ b/src/geo/projection/Projection.SphericalMercator.js @@ -23,5 +23,7 @@ L.Projection.SphericalMercator = { lat = (2 * Math.atan(Math.exp(point.y / this.R_MAJOR)) - (Math.PI / 2)) * d; return new L.LatLng(lat, lng); - } + }, + + bounds: L.bounds([-Math.PI, -Math.PI], [Math.PI, Math.PI]) }; From 294a7250d0261c0b6bd7b0124d2b023a496f56fd Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Wed, 27 Nov 2013 09:05:08 +0100 Subject: [PATCH 0558/2207] Added tests to verify size of EPSG3857 and 4326 --- spec/suites/geo/CRSSpec.js | 33 +++++++++++++++++++++++++ src/geo/projection/Projection.LonLat.js | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js index 5a7aee3c2c1..fefc00ac1fe 100644 --- a/spec/suites/geo/CRSSpec.js +++ b/spec/suites/geo/CRSSpec.js @@ -44,4 +44,37 @@ describe("CRS.EPSG3857", function () { expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng(L.latLng(85.0511287798, 180)); }); }); + + describe("#getSize", function () { + it("gives correct size", function () { + var i, + worldSize = 256, + crsSize; + for (i = 0; i <= 22; i++) { + crsSize = crs.getSize(i); + expect(crsSize.x).equal(worldSize); + expect(crsSize.y).equal(worldSize); + worldSize *= 2; + } + }); + }); +}); + +describe("CRS.EPSG4326", function () { + var crs = L.CRS.EPSG4326; + + describe("#getSize", function () { + it("gives correct size", function () { + var i, + worldSize = 256, + crsSize; + for (i = 0; i <= 22; i++) { + crsSize = crs.getSize(i); + expect(crsSize.x).equal(worldSize); + // Lat bounds are half as high (-90/+90 compared to -180/+180) + expect(crsSize.y).equal(worldSize / 2); + worldSize *= 2; + } + }); + }); }); diff --git a/src/geo/projection/Projection.LonLat.js b/src/geo/projection/Projection.LonLat.js index 08fd7901d15..c106422dab2 100644 --- a/src/geo/projection/Projection.LonLat.js +++ b/src/geo/projection/Projection.LonLat.js @@ -11,5 +11,5 @@ L.Projection.LonLat = { return new L.LatLng(point.y, point.x); }, - bounds: L.bounds([-180, -90], [180, 90]) + bounds: L.bounds([-180, -90], [180, 90]) }; From 88f21d01af5684aeab30b6956655ceafda78e965 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 27 Nov 2013 18:27:29 +0200 Subject: [PATCH 0559/2207] better bind, use native fn.bind if available --- spec/suites/core/UtilSpec.js | 7 ++++--- src/core/Util.js | 13 ++++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index 3e7d3ec027b..d66e6236b99 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -49,13 +49,14 @@ describe('Util', function () { var fn = sinon.spy(), foo = {}, a = {}, - b = {}; + b = {}, + c = {}; var fn2 = L.Util.bind(fn, foo, a, b); - fn2(); + fn2(c); - expect(fn.calledWith(a, b)).to.be.ok(); + expect(fn.calledWith(a, b, c)).to.be.ok(); }); }); diff --git a/src/core/Util.js b/src/core/Util.js index b903098930c..5f7e5dd6ea3 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -18,10 +18,17 @@ L.Util = { return dest; }, - bind: function (fn, obj) { // (Function, Object) -> Function - var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; + bind: function (fn, obj) { + var slice = Array.prototype.slice; + + if (fn.bind) { + return fn.bind.apply(fn, slice.call(arguments, 1)); + } + + var args = slice.call(arguments, 2); + return function () { - return fn.apply(obj, args || arguments); + return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments); }; }, From 5e6f95dc9ce86fcd2f191f0abbe7a8ea0d4f888f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 27 Nov 2013 18:28:36 +0200 Subject: [PATCH 0560/2207] implement TileLayer on top of GridLayer --- build/deps.js | 4 +- src/layer/tile/GridLayer.js | 43 +-- src/layer/tile/TileLayer.Anim.js | 105 ------ src/layer/tile/TileLayer.js | 554 +++++-------------------------- 4 files changed, 93 insertions(+), 613 deletions(-) delete mode 100644 src/layer/tile/TileLayer.Anim.js diff --git a/build/deps.js b/build/deps.js index cb53a33cd3f..5a21bf575ff 100644 --- a/build/deps.js +++ b/build/deps.js @@ -31,7 +31,7 @@ var deps = { GridLayer: { src: ['layer/tile/GridLayer.js'], - desc: 'Grid Layer.', + desc: 'Used as base class for grid-like layers like TileLayer.', heading: 'Layers' }, @@ -248,7 +248,7 @@ var deps = { }, AnimationZoom: { - src: ['map/anim/Map.ZoomAnimation.js', 'layer/tile/TileLayer.Anim.js'], + src: ['map/anim/Map.ZoomAnimation.js'], deps: ['AnimationPan'], desc: 'Smooth zooming animation. Works only on browsers that support CSS3 Transitions.' }, diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index a166b8e3e4d..9dd4efe0139 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -10,19 +10,21 @@ L.GridLayer = L.Class.extend({ tileSize: 256, opacity: 1, - // minZoom: , - // maxZoom: , - unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile, updateInterval: 150 + + /* + minZoom: , + maxZoom: , + attribution: , + zIndex: , + bounds: + */ }, initialize: function (options) { options = L.setOptions(this, options); - - // make sure it can be passed safely without losing context - this._tileReady = L.bind(this._tileReady, this); }, onAdd: function (map) { @@ -45,7 +47,7 @@ L.GridLayer = L.Class.extend({ onRemove: function (map) { this._getPane().removeChild(this._container); - map.on(this._getEvents(), this); + map.off(this._getEvents(), this); this._container = null; this._map = null; @@ -102,7 +104,7 @@ L.GridLayer = L.Class.extend({ redraw: function () { if (this._map) { - this._reset({hard: true}); //TODO wtf hard? + this._reset({hard: true}); this._update(); } return this; @@ -210,22 +212,10 @@ L.GridLayer = L.Class.extend({ if (this._animated && e && e.hard) { this._clearBgBuffer(); } - - // this._initContainer(); - // TODO OK? }, _getTileSize: function () { - var map = this._map, - zoom = map.getZoom() + this.options.zoomOffset, - zoomN = this.options.maxNativeZoom, - tileSize = this.options.tileSize; - - if (zoomN && zoom > zoomN) { - tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); - } - - return tileSize; + return this.options.tileSize; }, _update: function () { @@ -389,7 +379,7 @@ L.GridLayer = L.Class.extend({ this._wrapCoords(coords); - var tile = this.createTile(coords, this._tileReady); + var tile = this.createTile(coords, L.bind(this._tileReady, this)); this.fire('tileloadstart', {tile: tile}); @@ -405,11 +395,9 @@ L.GridLayer = L.Class.extend({ /* Chrome 20 layouts much faster with top/left (verify with timeline, frames) Android 4 browser has display issues with top/left and requires transform instead - Android 2 browser requires top/left or tiles disappear on load or first drag - (reappear after zoom) https://github.com/CloudMade/Leaflet/issues/866 (other browsers don't currently care) - see debug/hacks/jitter.html for an example */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23); + L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome); this._tiles[this._tileCoordsToKey(coords)] = tile; @@ -418,7 +406,10 @@ L.GridLayer = L.Class.extend({ _tileReady: function (err, tile) { if (err) { - this.fire('tileerror', {error: err}); + this.fire('tileerror', { + error: err, + tile: tile + }); } L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); diff --git a/src/layer/tile/TileLayer.Anim.js b/src/layer/tile/TileLayer.Anim.js deleted file mode 100644 index 4610c092c19..00000000000 --- a/src/layer/tile/TileLayer.Anim.js +++ /dev/null @@ -1,105 +0,0 @@ -/* - Zoom animation logic for L.TileLayer. -*/ - -L.TileLayer.include({ - _animateZoom: function (e) { - if (!this._animating) { - this._animating = true; - this._prepareBgBuffer(); - } - - var bg = this._bgBuffer, - transform = L.DomUtil.TRANSFORM, - initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], - scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); - - bg.style[transform] = e.backwards ? - scaleStr + ' ' + initialTransform : - initialTransform + ' ' + scaleStr; - }, - - _endZoomAnim: function () { - var front = this._tileContainer, - bg = this._bgBuffer; - - front.style.visibility = ''; - front.parentNode.appendChild(front); // Bring to fore - - // force reflow - L.Util.falseFn(bg.offsetWidth); - - this._animating = false; - }, - - _clearBgBuffer: function () { - var map = this._map; - - if (map && !map._animatingZoom && !map.touchZoom._zooming) { - this._bgBuffer.innerHTML = ''; - this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; - } - }, - - _prepareBgBuffer: function () { - - var front = this._tileContainer, - bg = this._bgBuffer; - - // if foreground layer doesn't have many tiles but bg layer does, - // keep the existing bg layer and just zoom it some more - - var bgLoaded = this._getLoadedTilesPercentage(bg), - frontLoaded = this._getLoadedTilesPercentage(front); - - if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { - - front.style.visibility = 'hidden'; - this._stopLoadingImages(front); - return; - } - - // prepare the buffer to become the front tile pane - bg.style.visibility = 'hidden'; - bg.style[L.DomUtil.TRANSFORM] = ''; - - // switch out the current layer to be the new bg layer (and vice-versa) - this._tileContainer = bg; - bg = this._bgBuffer = front; - - this._stopLoadingImages(bg); - - //prevent bg buffer from clearing right after zoom - clearTimeout(this._clearBgBufferTimer); - }, - - _getLoadedTilesPercentage: function (container) { - var tiles = container.getElementsByTagName('img'), - i, len, count = 0; - - for (i = 0, len = tiles.length; i < len; i++) { - if (tiles[i].complete) { - count++; - } - } - return count / len; - }, - - // stops loading all tiles in the background layer - _stopLoadingImages: function (container) { - var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), - i, len, tile; - - for (i = 0, len = tiles.length; i < len; i++) { - tile = tiles[i]; - - if (!tile.complete) { - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; - tile.src = L.Util.emptyImageUrl; - - tile.parentNode.removeChild(tile); - } - } - } -}); diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index fe44759e44c..bfa88a2da65 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -2,31 +2,22 @@ * L.TileLayer is used for standard xyz-numbered tile layers. */ -L.TileLayer = L.Class.extend({ - includes: L.Mixin.Events, +L.TileLayer = L.GridLayer.extend({ options: { minZoom: 0, maxZoom: 18, - tileSize: 256, + subdomains: 'abc', errorTileUrl: '', - attribution: '', zoomOffset: 0, - opacity: 1, + /* - maxNativeZoom: null, - zIndex: null, - tms: false, - continuousWorld: false, - noWrap: false, - zoomReverse: false, - detectRetina: false, - reuseTiles: false, - bounds: false, + maxNativeZoom: , + tms: , + zoomReverse: , + detectRetina: , */ - unloadInvisibleTiles: L.Browser.mobile, - updateWhenIdle: L.Browser.mobile }, initialize: function (url, options) { @@ -37,128 +28,15 @@ L.TileLayer = L.Class.extend({ options.tileSize = Math.floor(options.tileSize / 2); options.zoomOffset++; - - if (options.minZoom > 0) { - options.minZoom--; - } - this.options.maxZoom--; - } - - if (options.bounds) { - options.bounds = L.latLngBounds(options.bounds); + options.minZoom = Math.max(0, options.minZoom); + options.maxZoom--; } this._url = url; - var subdomains = this.options.subdomains; - - if (typeof subdomains === 'string') { - this.options.subdomains = subdomains.split(''); - } - }, - - onAdd: function (map) { - this._map = map; - this._animated = map._zoomAnimated; - - // create a container div for tiles - this._initContainer(); - - // set up events - map.on({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.on({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); - map.on('move', this._limitedUpdate, this); + if (typeof options.subdomains === 'string') { + options.subdomains = options.subdomains.split(''); } - - this._reset(); - this._update(); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - this._container.parentNode.removeChild(this._container); - - map.off({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.off({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - map.off('move', this._limitedUpdate, this); - } - - this._container = null; - this._map = null; - }, - - bringToFront: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.appendChild(this._container); - this._setAutoZIndex(pane, Math.max); - } - - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.insertBefore(this._container, pane.firstChild); - this._setAutoZIndex(pane, Math.min); - } - - return this; - }, - - getAttribution: function () { - return this.options.attribution; - }, - - getContainer: function () { - return this._container; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - setZIndex: function (zIndex) { - this.options.zIndex = zIndex; - this._updateZIndex(); - - return this; }, setUrl: function (url, noRedraw) { @@ -179,263 +57,61 @@ L.TileLayer = L.Class.extend({ return this; }, - _updateZIndex: function () { - if (this._container && this.options.zIndex !== undefined) { - this._container.style.zIndex = this.options.zIndex; - } - }, - - _setAutoZIndex: function (pane, compare) { - - var layers = pane.children, - edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min - zIndex, i, len; + createTile: function (coords, done) { + var tile = document.createElement('img'); - for (i = 0, len = layers.length; i < len; i++) { + tile.onload = L.bind(this._tileOnLoad, this); + tile.onerror = L.bind(this._tileOnError, this); - if (layers[i] !== this._container) { - zIndex = parseInt(layers[i].style.zIndex, 10); + tile.src = this.getTileUrl(coords); - if (!isNaN(zIndex)) { - edgeZIndex = compare(edgeZIndex, zIndex); - } - } - } - - this.options.zIndex = this._container.style.zIndex = - (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); + return done && tile; }, - _updateOpacity: function () { - var i, - tiles = this._tiles; + getTileUrl: function (coords) { + var limit = this._getWrapTileNum(); - if (L.Browser.ielt9) { - for (i in tiles) { - L.DomUtil.setOpacity(tiles[i], this.options.opacity); - } - } else { - L.DomUtil.setOpacity(this._container, this.options.opacity); - } + return L.Util.template(this._url, L.extend({ + s: this._getSubdomain(coords), + x: coords.x, + y: this.options.tms ? limit.y - coords.y - 1 : coords.y, + z: this._getZoomForUrl() + }, this.options)); }, - _initContainer: function () { - var tilePane = this._map._panes.tilePane; - - if (!this._container) { - this._container = L.DomUtil.create('div', 'leaflet-layer'); - - this._updateZIndex(); - - if (this._animated) { - var className = 'leaflet-tile-container'; - - this._bgBuffer = L.DomUtil.create('div', className, this._container); - this._tileContainer = L.DomUtil.create('div', className, this._container); - - } else { - this._tileContainer = this._container; - } - - tilePane.appendChild(this._container); - - if (this.options.opacity < 1) { - this._updateOpacity(); - } - } + _tileOnLoad: function (e) { + this._tileReady(null, e.target); }, - _reset: function (e) { - for (var key in this._tiles) { - this.fire('tileunload', {tile: this._tiles[key]}); - } - - this._tiles = {}; - this._tilesToLoad = 0; - - if (this.options.reuseTiles) { - this._unusedTiles = []; - } - - this._tileContainer.innerHTML = ''; - - if (this._animated && e && e.hard) { - this._clearBgBuffer(); + _tileOnError: function (e) { + var errorUrl = this.options.errorTileUrl; + if (errorUrl) { + e.target.src = errorUrl; } - - this._initContainer(); + this._tileReady(e, e.target); }, _getTileSize: function () { var map = this._map, - zoom = map.getZoom() + this.options.zoomOffset, - zoomN = this.options.maxNativeZoom, - tileSize = this.options.tileSize; - - if (zoomN && zoom > zoomN) { - tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); - } + options = this.options, + zoom = map.getZoom() + options.zoomOffset, + zoomN = options.maxNativeZoom; - return tileSize; - }, - - _update: function () { - - if (!this._map) { return; } - - var map = this._map, - bounds = map.getPixelBounds(), - zoom = map.getZoom(), - tileSize = this._getTileSize(); - - if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { - return; - } - - var tileBounds = L.bounds( - bounds.min.divideBy(tileSize)._floor(), - bounds.max.divideBy(tileSize)._floor()); - - this._addTilesFromCenterOut(tileBounds); - - if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { - this._removeOtherTiles(tileBounds); - } - }, - - _addTilesFromCenterOut: function (bounds) { - var queue = [], - center = bounds.getCenter(); - - var j, i, point; - - for (j = bounds.min.y; j <= bounds.max.y; j++) { - for (i = bounds.min.x; i <= bounds.max.x; i++) { - point = new L.Point(i, j); - - if (this._tileShouldBeLoaded(point)) { - queue.push(point); - } - } - } - - var tilesToLoad = queue.length; - - if (tilesToLoad === 0) { return; } - - // load tiles in order of their distance to center - queue.sort(function (a, b) { - return a.distanceTo(center) - b.distanceTo(center); - }); - - var fragment = document.createDocumentFragment(); - - // if its the first batch of tiles to load - if (!this._tilesToLoad) { - this.fire('loading'); - } - - this._tilesToLoad += tilesToLoad; - - for (i = 0; i < tilesToLoad; i++) { - this._addTile(queue[i], fragment); - } - - this._tileContainer.appendChild(fragment); - }, - - _tileShouldBeLoaded: function (tilePoint) { - if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { - return false; // already loaded - } - - var options = this.options; - - if (!options.continuousWorld) { - var limit = this._getWrapTileNum(); - - // don't load if exceeds world bounds - if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) || - tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; } - } - - if (options.bounds) { - var tileSize = options.tileSize, - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - nw = this._map.unproject(nwPoint), - se = this._map.unproject(sePoint); - - // TODO temporary hack, will be removed after refactoring projections - // https://github.com/Leaflet/Leaflet/issues/1618 - if (!options.continuousWorld && !options.noWrap) { - nw = nw.wrap(); - se = se.wrap(); - } - - if (!options.bounds.intersects([nw, se])) { return false; } - } - - return true; - }, - - _removeOtherTiles: function (bounds) { - var kArr, x, y, key; - - for (key in this._tiles) { - kArr = key.split(':'); - x = parseInt(kArr[0], 10); - y = parseInt(kArr[1], 10); - - // remove tile if it's out of bounds - if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { - this._removeTile(key); - } - } + return zoomN && zoom > zoomN ? + Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * options.tileSize) : + options.tileSize; }, _removeTile: function (key) { - var tile = this._tiles[key]; - - this.fire('tileunload', {tile: tile, url: tile.src}); + L.GridLayer.prototype._removeTile.call(this, key); - if (this.options.reuseTiles) { - L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); - this._unusedTiles.push(tile); - - } else if (tile.parentNode === this._tileContainer) { - this._tileContainer.removeChild(tile); - } + var tile = this._tiles[key]; - // for https://github.com/CloudMade/Leaflet/issues/137 + // for https://github.com/Leaflet/Leaflet/issues/137 if (!L.Browser.android) { tile.onload = null; tile.src = L.Util.emptyImageUrl; } - - delete this._tiles[key]; - }, - - _addTile: function (tilePoint, container) { - var tilePos = this._getTilePos(tilePoint); - - // get unused tile - or create a new tile - var tile = this._getTile(); - - /* - Chrome 20 layouts much faster with top/left (verify with timeline, frames) - Android 4 browser has display issues with top/left and requires transform instead - (other browsers don't currently care) - see debug/hacks/jitter.html for an example - */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome); - - this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; - - this._loadTile(tile, tilePoint); - - if (tile.parentNode !== this._tileContainer) { - container.appendChild(tile); - } }, _getZoomForUrl: function () { @@ -452,143 +128,61 @@ L.TileLayer = L.Class.extend({ return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom; }, - _getTilePos: function (tilePoint) { - var origin = this._map.getPixelOrigin(), - tileSize = this._getTileSize(); - - return tilePoint.multiplyBy(tileSize).subtract(origin); - }, - - // image-specific code (override to implement e.g. Canvas or SVG tile layer) - - getTileUrl: function (tilePoint) { - return L.Util.template(this._url, L.extend({ - s: this._getSubdomain(tilePoint), - z: tilePoint.z, - x: tilePoint.x, - y: tilePoint.y - }, this.options)); - }, - - _getWrapTileNum: function () { - var crs = this._map.options.crs, - size = crs.getSize(this._map.getZoom()); - return size.divideBy(this.options.tileSize); - }, - - _adjustTilePoint: function (tilePoint) { - - var limit = this._getWrapTileNum(); - - // wrap tile coordinates - if (!this.options.continuousWorld && !this.options.noWrap) { - tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x; - } - - if (this.options.tms) { - tilePoint.y = limit.y - tilePoint.y - 1; - } - - tilePoint.z = this._getZoomForUrl(); - }, - _getSubdomain: function (tilePoint) { var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; return this.options.subdomains[index]; }, - _getTile: function () { - if (this.options.reuseTiles && this._unusedTiles.length > 0) { - var tile = this._unusedTiles.pop(); - this._resetTile(tile); - return tile; - } - return this._createTile(); - }, - - // Override if data stored on a tile needs to be cleaned up before reuse - _resetTile: function (/*tile*/) {}, + _prepareBgBuffer: function () { - _createTile: function () { - var tile = L.DomUtil.create('img', 'leaflet-tile'); - tile.style.width = tile.style.height = this._getTileSize() + 'px'; - tile.galleryimg = 'no'; + var front = this._tileContainer, + bg = this._bgBuffer; - tile.onselectstart = tile.onmousemove = L.Util.falseFn; + // if foreground layer doesn't have many tiles but bg layer does, + // keep the existing bg layer and just zoom it some more - if (L.Browser.ielt9 && this.options.opacity !== undefined) { - L.DomUtil.setOpacity(tile, this.options.opacity); - } - // without this hack, tiles disappear after zoom on Chrome for Android - // https://github.com/Leaflet/Leaflet/issues/2078 - if (L.Browser.mobileWebkit3d) { - tile.style.WebkitBackfaceVisibility = 'hidden'; - } - return tile; - }, + var bgLoaded = this._getLoadedTilesPercentage(bg), + frontLoaded = this._getLoadedTilesPercentage(front); - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile.onload = this._tileOnLoad; - tile.onerror = this._tileOnError; + if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { - this._adjustTilePoint(tilePoint); - tile.src = this.getTileUrl(tilePoint); + front.style.visibility = 'hidden'; + this._stopLoadingImages(front); + return; + } - this.fire('tileloadstart', { - tile: tile, - url: tile.src - }); + this._swapBgBuffer(); + this._stopLoadingImages(bg); }, - _tileLoaded: function () { - this._tilesToLoad--; - - if (this._animated) { - L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated'); - } - - if (!this._tilesToLoad) { - this.fire('load'); + _getLoadedTilesPercentage: function (container) { + var tiles = container.getElementsByTagName('img'), + i, len, count = 0; - if (this._animated) { - // clear scaled tiles after all new tiles are loaded (for performance) - clearTimeout(this._clearBgBufferTimer); - this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); + for (i = 0, len = tiles.length; i < len; i++) { + if (tiles[i].complete) { + count++; } } + return count / len; }, - _tileOnLoad: function () { - var layer = this._layer; + // stops loading all tiles in the background layer + _stopLoadingImages: function (container) { + var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), + i, len, tile; - //Only if we are loading an actual image - if (this.src !== L.Util.emptyImageUrl) { - L.DomUtil.addClass(this, 'leaflet-tile-loaded'); + for (i = 0, len = tiles.length; i < len; i++) { + tile = tiles[i]; - layer.fire('tileload', { - tile: this, - url: this.src - }); - } + if (!tile.complete) { + tile.onload = L.Util.falseFn; + tile.onerror = L.Util.falseFn; + tile.src = L.Util.emptyImageUrl; - layer._tileLoaded(); - }, - - _tileOnError: function () { - var layer = this._layer; - - layer.fire('tileerror', { - tile: this, - url: this.src - }); - - var newUrl = layer.options.errorTileUrl; - if (newUrl) { - this.src = newUrl; + tile.parentNode.removeChild(tile); + } } - - layer._tileLoaded(); } }); From ce79ea1e8156bf4122332884f5b635507f1936db Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 27 Nov 2013 18:43:12 +0200 Subject: [PATCH 0561/2207] remove TileLayer.Canvas in favor of GridLayer --- build/deps.js | 6 --- debug/map/canvas.html | 15 +++++--- src/layer/tile/TileLayer.Canvas.js | 61 ------------------------------ 3 files changed, 9 insertions(+), 73 deletions(-) delete mode 100644 src/layer/tile/TileLayer.Canvas.js diff --git a/build/deps.js b/build/deps.js index 5a21bf575ff..48015b47fff 100644 --- a/build/deps.js +++ b/build/deps.js @@ -47,12 +47,6 @@ var deps = { deps: ['TileLayer'] }, - TileLayerCanvas: { - src: ['layer/tile/TileLayer.Canvas.js'], - desc: 'Tile layer made from canvases (for custom drawing purposes).', - deps: ['TileLayer'] - }, - ImageOverlay: { src: ['layer/ImageOverlay.js'], desc: 'Used to display an image over a particular rectangular area of the map.' diff --git a/debug/map/canvas.html b/debug/map/canvas.html index 1dad9f39a78..77228b1c239 100644 --- a/debug/map/canvas.html +++ b/debug/map/canvas.html @@ -16,18 +16,19 @@ - + + + + diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js new file mode 100644 index 00000000000..602140782a7 --- /dev/null +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -0,0 +1,54 @@ + +describe('GridLayer', function () { + + var div; + + beforeEach(function () { + div = document.createElement('div'); + div.style.width = '800px'; + div.style.height = '600px'; + div.style.visibility = 'hidden'; + + document.body.appendChild(div); + }); + + afterEach(function () { + document.body.removeChild(div); + }); + + it('positions tiles correctly with wrapping and bounding', function () { + + var map = L.map(div).setView([0, 0], 1); + + var tiles = []; + + var grid = L.gridLayer(); + grid.createTile = function (coords) { + var tile = document.createElement('div'); + tiles.push({coords: coords, tile: tile}); + return tile; + }; + + map.addLayer(grid); + + var loaded = {}; + + for (var i = 0; i < tiles.length; i++) { + var coords = tiles[i].coords, + pos = L.DomUtil.getPosition(tiles[i].tile); + + loaded[pos.x + ':' + pos.y] = [coords.x, coords.y]; + } + + expect(loaded).to.eql({ + '144:44': [0, 0], + '400:44': [1, 0], + '144:300': [0, 1], + '400:300': [1, 1], + '-112:44': [1, 0], + '656:44': [0, 0], + '-112:300': [1, 1], + '656:300': [0, 1] + }); + }); +}); diff --git a/spec/suites/layer/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js similarity index 100% rename from spec/suites/layer/TileLayerSpec.js rename to spec/suites/layer/tile/TileLayerSpec.js From 9cb36d0a62e07709f17fa722af730628306ff912 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Dec 2013 20:05:31 +0200 Subject: [PATCH 0585/2207] document refactoring in changelog, bump version --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ src/Leaflet.js | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ab3e2f75c4..c3eb0eeabb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,35 @@ Leaflet Changelog An in-progress version being developed on the `master` branch. Includes `stable` branch fixes. +### TileLayer & Projections refactoring + +TileLayer code and everything projections-related has undergone a major refactoring, documented in [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): + +#### TileLayer-related changes + +These changes make implementing custom grid-like layers for Leaflet much easier. + +* Moved most of the `TileLayer` logic into the new `GridLayer` class (which `TileLayer` now inherits, extending it with logic specific to tile servers). +* Removed `TileLayer.Canvas` in favor of the much more flexible and powerful `GridLayer`. +* Improved tile wrapping and bounding logic in `TileLayer` to work transparently and completely depent on the CRS used; removed the need for `TileLayer` hacks when using custom projections. + +#### Projections-related changes + +These changes were targeted at removing any hardcoded projection-specific logic accross Leaflet classes, making it transparent and driven by the chosen CRS. They make using Leaflet with custom projections (including flat maps) much easier, and remove the need for ugly hacks in the [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. + +* Added `Projection` `bounds` property that defines bounds for different projections (`Mercator`, etc.) in projected coordinates. +* Added `CRS` `wrapLat` and `wrapLng` properties which define whether the world wraps on a given axis and in what range. Set as `[-180, 180]` for `EPSG:3857`, `EPSG:4326`, `EPSG:3395` by default. +* Removed `LatLng` `wrap` method; added `CRS` and `Map` `wrapLatLng` instead (so that wrapping depends on the chosen CRS). +* Added `CRS` `infinite` property that disables boundaries (the world can go on infinitely in any direction), default for `CRS.Simple`. +* Added `CRS` `getProjectedBounds` and `Map` `getPixelWorldBounds` methods that returns world bounds in projected coordinates depending on zoom (derived from `Projection` `bounds`). +* Added `CRS` `unproject` method that converts coordinates in CRS-dependent units into `LatLng` coordinates. +* Fixed `EPSG:4326` to have correct tile pyramid (2x1 tiles at root). +* Fixed `Projection.SphericalMercator` to project to meter units. +* Fixed `Map` `worldCopyJump` option to work for other projections. + +### Misc improvements + +* Improved `L.bind` to use native `Function` `bind` on modern browsers and prepend real arguments to bound ones. * Improved the build system (`jake build`) to report gzipped library size. ## 0.7.1-dev (stable) diff --git a/src/Leaflet.js b/src/Leaflet.js index 6303605b87f..4525e19e711 100644 --- a/src/Leaflet.js +++ b/src/Leaflet.js @@ -2,7 +2,7 @@ var oldL = window.L, L = {}; -L.version = '0.7'; +L.version = '0.8-dev'; // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { From 93b01f1c0207b328e976afbbf97a81c5cad8ad47 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Dec 2013 20:36:25 +0200 Subject: [PATCH 0586/2207] update changelog [skip ci] --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3eb0eeabb0..2b246166032 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ An in-progress version being developed on the `master` branch. Includes `stable` ### TileLayer & Projections refactoring -TileLayer code and everything projections-related has undergone a major refactoring, documented in [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): +TileLayer code and everything projections-related has undergone a major refactoring by [@mourner](https://github.com/mourner) with help from [@perliedman](https://github.com/perliedman), documented in [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): #### TileLayer-related changes @@ -18,6 +18,7 @@ These changes make implementing custom grid-like layers for Leaflet much easier. * Moved most of the `TileLayer` logic into the new `GridLayer` class (which `TileLayer` now inherits, extending it with logic specific to tile servers). * Removed `TileLayer.Canvas` in favor of the much more flexible and powerful `GridLayer`. * Improved tile wrapping and bounding logic in `TileLayer` to work transparently and completely depent on the CRS used; removed the need for `TileLayer` hacks when using custom projections. +* Removed `url` property in `tileload` and tileloadstart` events (get it through `tile.src`). #### Projections-related changes @@ -33,11 +34,14 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed `Projection.SphericalMercator` to project to meter units. * Fixed `Map` `worldCopyJump` option to work for other projections. -### Misc improvements +#### Misc. changes +* Added `Point` `ceil` method. +* Added `Util.wrapNum` method for wrapping a number to lie in a certain range. * Improved `L.bind` to use native `Function` `bind` on modern browsers and prepend real arguments to bound ones. * Improved the build system (`jake build`) to report gzipped library size. + ## 0.7.1-dev (stable) An in-progress version being developed on the `stable` branch. From 8b97ecd716a4cd46de975f2b14c193fb698db47a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Dec 2013 20:41:02 +0200 Subject: [PATCH 0587/2207] update changelog once more [skip ci] --- CHANGELOG.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b246166032..1068bf86ddf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ An in-progress version being developed on the `master` branch. Includes `stable` ### TileLayer & Projections refactoring -TileLayer code and everything projections-related has undergone a major refactoring by [@mourner](https://github.com/mourner) with help from [@perliedman](https://github.com/perliedman), documented in [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): +TileLayer code and everything projections-related has undergone a major refactoring, documented in [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): #### TileLayer-related changes @@ -18,25 +18,25 @@ These changes make implementing custom grid-like layers for Leaflet much easier. * Moved most of the `TileLayer` logic into the new `GridLayer` class (which `TileLayer` now inherits, extending it with logic specific to tile servers). * Removed `TileLayer.Canvas` in favor of the much more flexible and powerful `GridLayer`. * Improved tile wrapping and bounding logic in `TileLayer` to work transparently and completely depent on the CRS used; removed the need for `TileLayer` hacks when using custom projections. -* Removed `url` property in `tileload` and tileloadstart` events (get it through `tile.src`). +* Removed `url` property in `tileload` and `tileloadstart` events (get it through `tile.src`). #### Projections-related changes These changes were targeted at removing any hardcoded projection-specific logic accross Leaflet classes, making it transparent and driven by the chosen CRS. They make using Leaflet with custom projections (including flat maps) much easier, and remove the need for ugly hacks in the [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. -* Added `Projection` `bounds` property that defines bounds for different projections (`Mercator`, etc.) in projected coordinates. +* Added `Projection` `bounds` property that defines bounds for different projections (`Mercator`, etc.) in projected coordinates (by [@perliedman](https://github.com/perliedman)). * Added `CRS` `wrapLat` and `wrapLng` properties which define whether the world wraps on a given axis and in what range. Set as `[-180, 180]` for `EPSG:3857`, `EPSG:4326`, `EPSG:3395` by default. * Removed `LatLng` `wrap` method; added `CRS` and `Map` `wrapLatLng` instead (so that wrapping depends on the chosen CRS). * Added `CRS` `infinite` property that disables boundaries (the world can go on infinitely in any direction), default for `CRS.Simple`. -* Added `CRS` `getProjectedBounds` and `Map` `getPixelWorldBounds` methods that returns world bounds in projected coordinates depending on zoom (derived from `Projection` `bounds`). -* Added `CRS` `unproject` method that converts coordinates in CRS-dependent units into `LatLng` coordinates. +* Added `CRS` `getProjectedBounds` and `Map` `getPixelWorldBounds` methods that returns world bounds in projected coordinates depending on zoom (derived from `Projection` `bounds`) (by [@perliedman](https://github.com/perliedman)). +* Added `CRS` `unproject` method that converts coordinates in CRS-dependent units into `LatLng` coordinates (by [@sowelie](https://github.com/sowelie)). * Fixed `EPSG:4326` to have correct tile pyramid (2x1 tiles at root). -* Fixed `Projection.SphericalMercator` to project to meter units. +* Fixed `Projection.SphericalMercator` to project to meter units (by [@calvinmetcalf](https://github.com/calvinmetcalf)). * Fixed `Map` `worldCopyJump` option to work for other projections. #### Misc. changes -* Added `Point` `ceil` method. +* Added `Point` `ceil` method (by [@perliedman](https://github.com/perliedman)). * Added `Util.wrapNum` method for wrapping a number to lie in a certain range. * Improved `L.bind` to use native `Function` `bind` on modern browsers and prepend real arguments to bound ones. * Improved the build system (`jake build`) to report gzipped library size. From abd82daa27749b0687cb65f78ba9bbde0e852096 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 14:40:33 +0200 Subject: [PATCH 0588/2207] update changelog [skip ci] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1068bf86ddf..3031419072c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ These changes were targeted at removing any hardcoded projection-specific logic An in-progress version being developed on the `stable` branch. * Fixed tile flickering issues on some old Android 2/3 devices by disabling buggy hardware accelerated CSS there (by [@danzel](https://github.com/danzel)). [#2216](https://github.com/Leaflet/Leaflet/pull/2216) [#2198](https://github.com/Leaflet/Leaflet/issues/2198) +* Fixed a regression that sometimes led to an error when you started pinch-zoom as the first action on the map (by [@danzel](https://github.com/danzel)). [#2259](https://github.com/Leaflet/Leaflet/pull/2259) [#2256](https://github.com/Leaflet/Leaflet/issues/2256) * Reverted `L.Util.template` optimizations to allow Leaflet to be used in eval-banning environments like browser extensions (performance gain was insignificant anyway) (by [@calvinmetcalf](https://github.com/calvinmetcalf)). [#2217](https://github.com/Leaflet/Leaflet/issues/2217) [#2209](https://github.com/Leaflet/Leaflet/issues/2209) [#1968](https://github.com/Leaflet/Leaflet/issues/1968) * Fixed a regression where `Map` `invalidateSize` could lead to unexpected results when called before map initialization (by [@Zverik](https://github.com/Zverik)). [#2250](https://github.com/Leaflet/Leaflet/issues/2250) [#2249](https://github.com/Leaflet/Leaflet/issues/2249) * Fixed a regression where `FeatureGroup` containing other group overwrote original `e.layer` value in mouse events (by [@gumballhead](https://github.com/gumballhead)). [#2253](https://github.com/Leaflet/Leaflet/pull/2253) [#2252](https://github.com/Leaflet/Leaflet/issues/2252) From ea0650b39992699947b737f1324de19720b72432 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 16:14:12 +0200 Subject: [PATCH 0589/2207] cleanup DomUtil code --- src/dom/DomUtil.js | 142 +++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 81 deletions(-) diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index d9c6bf278e1..acf2c068996 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -4,16 +4,12 @@ L.DomUtil = { get: function (id) { - return (typeof id === 'string' ? document.getElementById(id) : id); + return typeof id === 'string' ? document.getElementById(id) : id; }, getStyle: function (el, style) { - var value = el.style[style]; - - if (!value && el.currentStyle) { - value = el.currentStyle[style]; - } + var value = el.style[style] || (el.currentStyle && el.currentStyle[style]); if ((!value || value === 'auto') && document.defaultView) { var css = document.defaultView.getComputedStyle(el, null); @@ -84,10 +80,7 @@ L.DomUtil = { }, documentIsLtr: function () { - if (!L.DomUtil._docIsLtrCached) { - L.DomUtil._docIsLtrCached = true; - L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; - } + L.DomUtil._docIsLtr = L.DomUtil._docIsLtr || L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; return L.DomUtil._docIsLtr; }, @@ -107,7 +100,7 @@ L.DomUtil = { if (el.classList !== undefined) { return el.classList.contains(name); } - var className = L.DomUtil._getClass(el); + var className = L.DomUtil.getClass(el); return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); }, @@ -118,8 +111,8 @@ L.DomUtil = { el.classList.add(classes[i]); } } else if (!L.DomUtil.hasClass(el, name)) { - var className = L.DomUtil._getClass(el); - L.DomUtil._setClass(el, (className ? className + ' ' : '') + name); + var className = L.DomUtil.getClass(el); + L.DomUtil.setClass(el, (className ? className + ' ' : '') + name); } }, @@ -127,11 +120,11 @@ L.DomUtil = { if (el.classList !== undefined) { el.classList.remove(name); } else { - L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' '))); + L.DomUtil.setClass(el, L.Util.trim((' ' + L.DomUtil.getClass(el) + ' ').replace(' ' + name + ' ', ' '))); } }, - _setClass: function (el, name) { + setClass: function (el, name) { if (el.className.baseVal === undefined) { el.className = name; } else { @@ -140,7 +133,7 @@ L.DomUtil = { } }, - _getClass: function (el) { + getClass: function (el) { return el.className.baseVal === undefined ? el.className : el.className.baseVal; }, @@ -187,23 +180,17 @@ L.DomUtil = { }, getTranslateString: function (point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d + // on WebKit browsers, using translate3d instead of translate makes animation smoother + // as it ensures HW accel is used. Firefox doesn't care (same speed either way). + var is3d = L.Browser.webkit3d; - var is3d = L.Browser.webkit3d, - open = 'translate' + (is3d ? '3d' : '') + '(', - close = (is3d ? ',0' : '') + ')'; - - return open + point.x + 'px,' + point.y + 'px' + close; + return 'translate' + (is3d ? '3d(' : '(') + + point.x + 'px,' + + point.y + 'px' + (is3d ? ',0)' : ')'); }, getScaleString: function (scale, origin) { - - var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), - scaleStr = ' scale(' + scale + ') '; - - return preTranslateStr + scaleStr; + return L.DomUtil.getTranslateString(origin.multiplyBy(1 - scale)) + ' scale(' + scale + ') '; }, setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) @@ -229,61 +216,54 @@ L.DomUtil = { }; -// prefix style property names +(function () { + // prefix style property names -L.DomUtil.TRANSFORM = L.DomUtil.testProp( - ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + L.DomUtil.TRANSFORM = L.DomUtil.testProp( + ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); -// webkitTransition comes first because some browser versions that drop vendor prefix don't do -// the same for the transitionend event, in particular the Android 4.1 stock browser -L.DomUtil.TRANSITION = L.DomUtil.testProp( - ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + // webkitTransition comes first because some browser versions that drop vendor prefix don't do + // the same for the transitionend event, in particular the Android 4.1 stock browser -L.DomUtil.TRANSITION_END = - L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? - L.DomUtil.TRANSITION + 'End' : 'transitionend'; + var transition = L.DomUtil.TRANSITION = L.DomUtil.testProp( + ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); -(function () { - if ('onselectstart' in document) { - L.extend(L.DomUtil, { - disableTextSelection: function () { - L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); - }, - - enableTextSelection: function () { - L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); - } - }); - } else { - var userSelectProperty = L.DomUtil.testProp( - ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); - - L.extend(L.DomUtil, { - disableTextSelection: function () { - if (userSelectProperty) { - var style = document.documentElement.style; - this._userSelect = style[userSelectProperty]; - style[userSelectProperty] = 'none'; - } - }, - - enableTextSelection: function () { - if (userSelectProperty) { - document.documentElement.style[userSelectProperty] = this._userSelect; - delete this._userSelect; - } - } - }); - } - - L.extend(L.DomUtil, { - disableImageDrag: function () { - L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); - }, - - enableImageDrag: function () { - L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); - } - }); + L.DomUtil.TRANSITION_END = + transition === 'webkitTransition' || transition === 'OTransition' ? transition + 'End' : 'transitionend'; + + + if ('onselectstart' in document) { + L.DomUtil.disableTextSelection = function () { + L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); + }; + L.DomUtil.enableTextSelection = function () { + L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); + }; + + } else { + var userSelectProperty = L.DomUtil.testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + L.DomUtil.disableTextSelection = function () { + if (userSelectProperty) { + var style = document.documentElement.style; + this._userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }; + L.DomUtil.enableTextSelection = function () { + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = this._userSelect; + delete this._userSelect; + } + }; + } + + L.DomUtil.disableImageDrag = function () { + L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); + }; + L.DomUtil.enableImageDrag = function () { + L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); + }; })(); From fa69db10822665e44dc02b721bf14e0e0a57a79c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 16:57:24 +0200 Subject: [PATCH 0590/2207] clean up DomEvent, remove now irrelevant legacy IE magic --- src/dom/DomEvent.js | 68 +++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 6a0a5884f9f..fdf720cc859 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -7,15 +7,16 @@ L.DomEvent = { addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler, originalHandler, newType; + key = '_leaflet_' + type + id; if (obj[key]) { return this; } - handler = function (e) { - return fn.call(context || obj, e || L.DomEvent._getEvent()); + var handler = function (e) { + return fn.call(context || obj, e || window.event); }; + var originalHandler = handler; + if (L.Browser.pointer && type.indexOf('touch') === 0) { return this.addPointerListener(obj, type, handler, id); } @@ -30,25 +31,19 @@ L.DomEvent = { obj.addEventListener(type, handler, false); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - - originalHandler = handler; - newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); - handler = function (e) { + e = e || window.event; if (!L.DomEvent._checkMouse(obj, e)) { return; } return originalHandler(e); }; + obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); - obj.addEventListener(newType, handler, false); - - } else if (type === 'click' && L.Browser.android) { - originalHandler = handler; - handler = function (e) { - return L.DomEvent._filterClick(e, originalHandler); - }; - - obj.addEventListener(type, handler, false); } else { + if (type === 'click' && L.Browser.android) { + handler = function (e) { + return L.DomEvent._filterClick(e, originalHandler); + }; + } obj.addEventListener(type, handler, false); } @@ -71,6 +66,7 @@ L.DomEvent = { if (L.Browser.pointer && type.indexOf('touch') === 0) { this.removePointerListener(obj, type, id); + } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { this.removeDoubleTapListener(obj, id); @@ -80,11 +76,12 @@ L.DomEvent = { obj.removeEventListener('DOMMouseScroll', handler, false); obj.removeEventListener(type, handler, false); - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); } else { - obj.removeEventListener(type, handler, false); + obj.removeEventListener( + type === 'mouseenter' ? 'mouseover' : + type === 'mouseleave' ? 'mouseout' : type, handler, false); } + } else if ('detachEvent' in obj) { obj.detachEvent('on' + type, handler); } @@ -145,13 +142,14 @@ L.DomEvent = { getMousePosition: function (e, container) { var body = document.body, docEl = document.documentElement, - //gecko makes scrollLeft more negative as you scroll in rtl, other browsers don't - //ref: https://code.google.com/p/closure-library/source/browse/closure/goog/style/bidi.js - x = L.DomUtil.documentIsLtr() ? - (e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft : e.clientX) : - (L.Browser.gecko ? e.pageX - body.scrollLeft - docEl.scrollLeft : - e.pageX ? e.pageX - body.scrollLeft + docEl.scrollLeft : e.clientX), - y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop: e.clientY, + + // gecko makes scrollLeft more negative as you scroll in rtl, other browsers don't + // ref: https://code.google.com/p/closure-library/source/browse/closure/goog/style/bidi.js + + x = e.pageX ? e.pageX - body.scrollLeft - + docEl.scrollLeft * (L.DomUtil.documentIsLtr() || L.Browser.gecko ? 1 : -1) : e.clientX, + y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop : e.clientY, + pos = new L.Point(x, y); if (!container) { @@ -209,22 +207,6 @@ L.DomEvent = { return (related !== el); }, - _getEvent: function () { // evil magic for IE - /*jshint noarg:false */ - var e = window.event; - if (!e) { - var caller = arguments.callee.caller; - while (caller) { - e = caller['arguments'][0]; - if (e && window.Event === e.constructor) { - break; - } - caller = caller.caller; - } - } - return e; - }, - // this is a horrible workaround for a bug in Android where a single touch triggers two click events _filterClick: function (e, handler) { var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), From f2da891ff20834b0a86aadc65778316704219e5b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 17:05:51 +0200 Subject: [PATCH 0591/2207] clean up DomEvent.DoubleTap --- src/dom/DomEvent.DoubleTap.js | 47 +++++++++++++++-------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index 50d9bbac2fa..73655d3a4e6 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -9,13 +9,9 @@ L.extend(L.DomEvent, { // inspired by Zepto touch code by Thomas Fuchs addDoubleTapListener: function (obj, handler, id) { - var last, + var last, touch, doubleTap = false, delay = 250, - touch, - pre = '_leaflet_', - touchstart = this._touchstart, - touchend = this._touchend, trackedTouches = []; function onTouchStart(e) { @@ -27,12 +23,11 @@ L.extend(L.DomEvent, { } else { count = e.touches.length; } - if (count > 1) { - return; - } + + if (count > 1) { return; } var now = Date.now(), - delta = now - (last || now); + delta = now - (last || now); touch = e.touches ? e.touches[0] : e; doubleTap = (delta > 0 && delta <= delay); @@ -42,26 +37,19 @@ L.extend(L.DomEvent, { function onTouchEnd(e) { if (L.Browser.pointer) { var idx = trackedTouches.indexOf(e.pointerId); - if (idx === -1) { - return; - } + if (idx === -1) { return; } trackedTouches.splice(idx, 1); } if (doubleTap) { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events - var newTouch = { }, - prop; + var newTouch = {}, + prop, i; - // jshint forin:false - for (var i in touch) { + for (i in touch) { prop = touch[i]; - if (typeof prop === 'function') { - newTouch[i] = prop.bind(touch); - } else { - newTouch[i] = prop; - } + newTouch[i] = prop.bind ? prop.bind(touch) : prop; } touch = newTouch; } @@ -70,6 +58,11 @@ L.extend(L.DomEvent, { last = null; } } + + var pre = '_leaflet_', + touchstart = this._touchstart, + touchend = this._touchend; + obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; @@ -78,8 +71,8 @@ L.extend(L.DomEvent, { var endElement = L.Browser.pointer ? document.documentElement : obj; obj.addEventListener(touchstart, onTouchStart, false); - endElement.addEventListener(touchend, onTouchEnd, false); + endElement.addEventListener(touchend, onTouchEnd, false); if (L.Browser.pointer) { endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); } @@ -88,15 +81,15 @@ L.extend(L.DomEvent, { }, removeDoubleTapListener: function (obj, id) { - var pre = '_leaflet_'; + var pre = '_leaflet_', + endElement = L.Browser.pointer ? document.documentElement : obj, + touchend = obj[pre + this._touchend + id]; obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - (L.Browser.pointer ? document.documentElement : obj).removeEventListener( - this._touchend, obj[pre + this._touchend + id], false); + endElement.removeEventListener(this._touchend, touchend, false); if (L.Browser.pointer) { - document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], - false); + endElement.removeEventListener(L.DomEvent.POINTER_CANCEL, touchend, false); } return this; From 3d7520ff270d1ab77733d4929b23ef93d48388b2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 18:47:43 +0200 Subject: [PATCH 0592/2207] clean up Browser.js, simplify old FF touch detection --- src/core/Browser.js | 84 ++++++++++++++------------------------------- 1 file changed, 25 insertions(+), 59 deletions(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 7b0c8adad5c..ae327c5dc42 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -4,94 +4,60 @@ (function () { - var ie = 'ActiveXObject' in window, - ielt9 = ie && !document.addEventListener, + var ua = navigator.userAgent.toLowerCase(), + doc = document.documentElement, + + ie = 'ActiveXObject' in window, - // terrible browser detection to work around Safari / iOS / Android browser bugs - ua = navigator.userAgent.toLowerCase(), - webkit = ua.indexOf('webkit') !== -1, - chrome = ua.indexOf('chrome') !== -1, + webkit = ua.indexOf('webkit') !== -1, phantomjs = ua.indexOf('phantom') !== -1, - android = ua.indexOf('android') !== -1, android23 = ua.search('android [23]') !== -1, - gecko = ua.indexOf('gecko') !== -1, - mobile = typeof orientation !== undefined + '', - msPointer = window.navigator && window.navigator.msPointerEnabled && - window.navigator.msMaxTouchPoints && !window.PointerEvent, - pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || - msPointer, - retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || - ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && - window.matchMedia('(min-resolution:144dpi)').matches), + mobile = typeof orientation !== 'undefined', + msPointer = navigator.msPointerEnabled && navigator.msMaxTouchPoints && !window.PointerEvent, + pointer = (window.PointerEvent && navigator.pointerEnabled && navigator.maxTouchPoints) || msPointer, - doc = document.documentElement, ie3d = ie && ('transition' in doc.style), webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, gecko3d = 'MozPerspective' in doc.style, - opera3d = 'OTransition' in doc.style, - any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; - - - // PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch. - // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151 - - var touch = !window.L_NO_TOUCH && !phantomjs && (function () { + opera3d = 'OTransition' in doc.style; - var startName = 'ontouchstart'; - // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc. - if (pointer || (startName in doc)) { - return true; - } + var retina = 'devicePixelRatio' in window && window.devicePixelRatio > 1; - // Firefox/Gecko - var div = document.createElement('div'), - supported = false; - - if (!div.setAttribute) { - return false; - } - div.setAttribute(startName, 'return;'); - - if (typeof div[startName] === 'function') { - supported = true; - } - - div.removeAttribute(startName); - div = null; - - return supported; - }()); + if (!retina && 'matchMedia' in window) { + var matches = window.matchMedia('(min-resolution:144dpi)'); + retina = matches && matches.matches; + } + var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in doc || + (window.DocumentTouch && document instanceof window.DocumentTouch)); L.Browser = { ie: ie, - ielt9: ielt9, + ielt9: ie && !document.addEventListener, webkit: webkit, - gecko: gecko && !webkit && !window.opera && !ie, - - android: android, + gecko: (ua.indexOf('gecko') !== -1) && !webkit && !window.opera && !ie, + android: ua.indexOf('android') !== -1, android23: android23, - - chrome: chrome, + chrome: ua.indexOf('chrome') !== -1, ie3d: ie3d, webkit3d: webkit3d, gecko3d: gecko3d, opera3d: opera3d, - any3d: any3d, + any3d: !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs, mobile: mobile, mobileWebkit: mobile && webkit, mobileWebkit3d: mobile && webkit3d, mobileOpera: mobile && window.opera, - touch: touch, - msPointer: msPointer, - pointer: pointer, + touch: !!touch, + msPointer: !!msPointer, + pointer: !!pointer, - retina: retina + retina: !!retina }; }()); From b151ceb63f5913bbd37bd3968c5bc30ca1824737 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 19:09:36 +0200 Subject: [PATCH 0593/2207] remove LatLng constants, add move maxMargin to equals arguments --- src/geo/LatLng.js | 26 +++++++------------ src/geo/projection/Projection.Mercator.js | 4 +-- .../Projection.SphericalMercator.js | 4 +-- src/layer/vector/Circle.js | 2 +- src/map/ext/Map.Geolocation.js | 2 +- 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index e7deb5f0a05..1a16d687712 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -2,7 +2,7 @@ * L.LatLng represents a geographical point with latitude and longitude coordinates. */ -L.LatLng = function (lat, lng, alt) { // (Number, Number, Number) +L.LatLng = function (lat, lng, alt) { lat = parseFloat(lat); lng = parseFloat(lng); @@ -18,14 +18,8 @@ L.LatLng = function (lat, lng, alt) { // (Number, Number, Number) } }; -L.extend(L.LatLng, { - DEG_TO_RAD: Math.PI / 180, - RAD_TO_DEG: 180 / Math.PI, - MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check -}); - L.LatLng.prototype = { - equals: function (obj) { // (LatLng) -> Boolean + equals: function (obj, maxMargin) { if (!obj) { return false; } obj = L.latLng(obj); @@ -34,10 +28,10 @@ L.LatLng.prototype = { Math.abs(this.lat - obj.lat), Math.abs(this.lng - obj.lng)); - return margin <= L.LatLng.MAX_MARGIN; + return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin); }, - toString: function (precision) { // (Number) -> String + toString: function (precision) { return 'LatLng(' + L.Util.formatNum(this.lat, precision) + ', ' + L.Util.formatNum(this.lng, precision) + ')'; @@ -45,15 +39,15 @@ L.LatLng.prototype = { // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula // TODO move to projection code, LatLng shouldn't know about Earth - distanceTo: function (other) { // (LatLng) -> Number + distanceTo: function (other) { other = L.latLng(other); var R = 6378137, // earth radius in meters - d2r = L.LatLng.DEG_TO_RAD, - dLat = (other.lat - this.lat) * d2r, - dLon = (other.lng - this.lng) * d2r, - lat1 = this.lat * d2r, - lat2 = other.lat * d2r, + rad = Math.PI / 180, + dLat = (other.lat - this.lat) * rad, + dLon = (other.lng - this.lng) * rad, + lat1 = this.lat * rad, + lat2 = other.lat * rad, sin1 = Math.sin(dLat / 2), sin2 = Math.sin(dLon / 2); diff --git a/src/geo/projection/Projection.Mercator.js b/src/geo/projection/Projection.Mercator.js index 71ae21fb4c4..9965e67a6f0 100644 --- a/src/geo/projection/Projection.Mercator.js +++ b/src/geo/projection/Projection.Mercator.js @@ -12,7 +12,7 @@ L.Projection.Mercator = { bounds: L.bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]), project: function (latlng) { - var d = L.LatLng.DEG_TO_RAD, + var d = Math.PI / 180, max = this.MAX_LATITUDE, lat = Math.max(Math.min(max, latlng.lat), -max), r = this.R_MAJOR, @@ -32,7 +32,7 @@ L.Projection.Mercator = { }, unproject: function (point) { - var d = L.LatLng.RAD_TO_DEG, + var d = 180 / Math.PI, r = this.R_MAJOR, r2 = this.R_MINOR, lng = point.x * d / r, diff --git a/src/geo/projection/Projection.SphericalMercator.js b/src/geo/projection/Projection.SphericalMercator.js index 8e5c8ce0fd8..8068efb00b1 100644 --- a/src/geo/projection/Projection.SphericalMercator.js +++ b/src/geo/projection/Projection.SphericalMercator.js @@ -9,7 +9,7 @@ L.Projection.SphericalMercator = { R: 6378137, project: function (latlng) { - var d = L.LatLng.DEG_TO_RAD, + var d = Math.PI / 180, max = this.MAX_LATITUDE, x = this.R * latlng.lng * d, y = Math.max(Math.min(max, latlng.lat), -max) * d; @@ -20,7 +20,7 @@ L.Projection.SphericalMercator = { }, unproject: function (point) { - var d = L.LatLng.RAD_TO_DEG, + var d = 180 / Math.PI, lng = point.x * d / this.R, lat = (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d; diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index abdd8bcdd1d..c8659e4500d 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -77,7 +77,7 @@ L.Circle = L.Path.extend({ }, _getLngRadius: function () { - return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); + return this._getLatRadius() / Math.cos((Math.PI / 180) * this._latlng.lat); }, _checkIfEmpty: function () { diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index 84f5487dfa9..d1b3ca1e537 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -68,7 +68,7 @@ L.Map.include({ latlng = new L.LatLng(lat, lng), latAccuracy = 180 * pos.coords.accuracy / 40075017, - lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat), + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * lat), bounds = L.latLngBounds( [lat - latAccuracy, lng - lngAccuracy], From 81aa8e72980142a3ca040d670a2489c2b4dd4cac Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 13:25:44 +0200 Subject: [PATCH 0594/2207] update changelog [skip ci] --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3031419072c..aa9fb07cb5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,11 +34,14 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed `Projection.SphericalMercator` to project to meter units (by [@calvinmetcalf](https://github.com/calvinmetcalf)). * Fixed `Map` `worldCopyJump` option to work for other projections. -#### Misc. changes +### Other improvements * Added `Point` `ceil` method (by [@perliedman](https://github.com/perliedman)). * Added `Util.wrapNum` method for wrapping a number to lie in a certain range. * Improved `L.bind` to use native `Function` `bind` on modern browsers and prepend real arguments to bound ones. +* Added `DomUtil` `setClass` and `getClass` methods. +* Removed `LatLng` `RAD_TO_DEG`, `DEG_TO_RAD` and `MAX_MARGIN` constants. +* Added `LatLng` `equals` second argument `maxMargin`. * Improved the build system (`jake build`) to report gzipped library size. From 14afb4fa8fe4b46850271351d8eef933761bb486 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 14:18:00 +0200 Subject: [PATCH 0595/2207] clean up Control.Layers --- src/control/Control.Layers.js | 68 +++++++++++++++-------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 6fc2cbcbeb7..99dfffab138 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -29,43 +29,35 @@ L.Control.Layers = L.Control.extend({ this._initLayout(); this._update(); - map - .on('layeradd', this._onLayerChange, this) - .on('layerremove', this._onLayerChange, this); + map.on('layeradd layerremove', this._onLayerChange, this); return this._container; }, onRemove: function (map) { - map - .off('layeradd', this._onLayerChange) - .off('layerremove', this._onLayerChange); + map.off('layeradd layerremove', this._onLayerChange, this); }, addBaseLayer: function (layer, name) { this._addLayer(layer, name); - this._update(); - return this; + return this._update(); }, addOverlay: function (layer, name) { this._addLayer(layer, name, true); - this._update(); - return this; + return this._update(); }, removeLayer: function (layer) { - var id = L.stamp(layer); - delete this._layers[id]; - this._update(); - return this; + delete this._layers[L.stamp(layer)]; + return this._update(); }, _initLayout: function () { var className = 'leaflet-control-layers', container = this._container = L.DomUtil.create('div', className); - //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released + // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released container.setAttribute('aria-haspopup', true); if (!L.Browser.touch) { @@ -84,6 +76,7 @@ L.Control.Layers = L.Control.extend({ .on(container, 'mouseover', this._expand, this) .on(container, 'mouseout', this._collapse, this); } + var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); link.href = '#'; link.title = 'Layers'; @@ -92,11 +85,11 @@ L.Control.Layers = L.Control.extend({ L.DomEvent .on(link, 'click', L.DomEvent.stop) .on(link, 'click', this._expand, this); - } - else { + } else { L.DomEvent.on(link, 'focus', this._expand, this); } - //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033 + + // work around for Firefox Android issue https://github.com/Leaflet/Leaflet/issues/2033 L.DomEvent.on(form, 'click', function () { setTimeout(L.bind(this._onInputClick, this), 0); }, this); @@ -130,16 +123,12 @@ L.Control.Layers = L.Control.extend({ }, _update: function () { - if (!this._container) { - return; - } + if (!this._container) { return; } this._baseLayersList.innerHTML = ''; this._overlaysList.innerHTML = ''; - var baseLayersPresent = false, - overlaysPresent = false, - i, obj; + var baseLayersPresent, overlaysPresent, i, obj; for (i in this._layers) { obj = this._layers[i]; @@ -149,6 +138,8 @@ L.Control.Layers = L.Control.extend({ } this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; + + return this; }, _onLayerChange: function (e) { @@ -172,11 +163,8 @@ L.Control.Layers = L.Control.extend({ // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) _createRadioElement: function (name, checked) { - var radioHtml = ''; var radioFragment = document.createElement('div'); radioFragment.innerHTML = radioHtml; @@ -186,8 +174,8 @@ L.Control.Layers = L.Control.extend({ _addItem: function (obj) { var label = document.createElement('label'), - input, - checked = this._map.hasLayer(obj.layer); + checked = this._map.hasLayer(obj.layer), + input; if (obj.overlay) { input = document.createElement('input'); @@ -215,21 +203,21 @@ L.Control.Layers = L.Control.extend({ }, _onInputClick: function () { - var i, input, obj, - inputs = this._form.getElementsByTagName('input'), - inputsLen = inputs.length; + var inputs = this._form.getElementsByTagName('input'), + input, layer, hasLayer; this._handlingClick = true; - for (i = 0; i < inputsLen; i++) { + for (var i = 0, len = inputs.length; i < len; i++) { input = inputs[i]; - obj = this._layers[input.layerId]; + layer = this._layers[input.layerId].layer; + hasLayer = this._map.hasLayer(layer); - if (input.checked && !this._map.hasLayer(obj.layer)) { - this._map.addLayer(obj.layer); + if (input.checked && !hasLayer) { + this._map.addLayer(layer); - } else if (!input.checked && this._map.hasLayer(obj.layer)) { - this._map.removeLayer(obj.layer); + } else if (!input.checked && hasLayer) { + this._map.removeLayer(layer); } } From a00360bef69c562278a6823587ef138026e5e035 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 14:44:52 +0200 Subject: [PATCH 0596/2207] clean up Control.Scale --- src/control/Control.Scale.js | 40 +++++++++++++++--------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/control/Control.Scale.js b/src/control/Control.Scale.js index 6043b0231e3..6f36b248b2e 100644 --- a/src/control/Control.Scale.js +++ b/src/control/Control.Scale.js @@ -18,7 +18,7 @@ L.Control.Scale = L.Control.extend({ container = L.DomUtil.create('div', className), options = this.options; - this._addScales(options, className, container); + this._addScales(options, className + '-line', container); map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); map.whenReady(this._update, this); @@ -32,10 +32,10 @@ L.Control.Scale = L.Control.extend({ _addScales: function (options, className, container) { if (options.metric) { - this._mScale = L.DomUtil.create('div', className + '-line', container); + this._mScale = L.DomUtil.create('div', className, container); } if (options.imperial) { - this._iScale = L.DomUtil.create('div', className + '-line', container); + this._iScale = L.DomUtil.create('div', className, container); } }, @@ -43,15 +43,11 @@ L.Control.Scale = L.Control.extend({ var bounds = this._map.getBounds(), centerLat = bounds.getCenter().lat, halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), - dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180, + dist = halfWorldMeters * (bounds.getEast() - bounds.getWest()) / 180, size = this._map.getSize(), options = this.options, - maxMeters = 0; - - if (size.x > 0) { - maxMeters = dist * (options.maxWidth / size.x); - } + maxMeters = size.x > 0 ? dist * (options.maxWidth / size.x) : 0; this._updateScales(options, maxMeters); }, @@ -60,48 +56,46 @@ L.Control.Scale = L.Control.extend({ if (options.metric && maxMeters) { this._updateMetric(maxMeters); } - if (options.imperial && maxMeters) { this._updateImperial(maxMeters); } }, _updateMetric: function (maxMeters) { - var meters = this._getRoundNum(maxMeters); + var meters = this._getRoundNum(maxMeters), + label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; - this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; - this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + this._updateScale(this._mScale, label, meters / maxMeters); }, _updateImperial: function (maxMeters) { var maxFeet = maxMeters * 3.2808399, - scale = this._iScale, maxMiles, miles, feet; if (maxFeet > 5280) { maxMiles = maxFeet / 5280; miles = this._getRoundNum(maxMiles); - - scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; - scale.innerHTML = miles + ' mi'; + this._updateScale(this._iScale, miles + ' mi', miles / maxMiles); } else { feet = this._getRoundNum(maxFeet); - - scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; - scale.innerHTML = feet + ' ft'; + this._updateScale(this._iScale, feet + ' ft', feet / maxFeet); } }, - _getScaleWidth: function (ratio) { - return Math.round(this.options.maxWidth * ratio) - 10; + _updateScale: function (scale, text, ratio) { + scale.style.width = (Math.round(this.options.maxWidth * ratio) - 10) + 'px'; + scale.innerHTML = text; }, _getRoundNum: function (num) { var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), d = num / pow10; - d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; + d = d >= 10 ? 10 : + d >= 5 ? 5 : + d >= 3 ? 3 : + d >= 2 ? 2 : 1; return pow10 * d; } From ee334476f7e433154e7da9dc1760c362cd4da1c4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 14:51:18 +0200 Subject: [PATCH 0597/2207] clean up Control.Zoom --- src/control/Control.Zoom.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 5acfc560e49..9e4f5c76c8a 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -13,15 +13,14 @@ L.Control.Zoom = L.Control.extend({ onAdd: function (map) { var zoomName = 'leaflet-control-zoom', - container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); + container = L.DomUtil.create('div', zoomName + ' leaflet-bar'), + options = this.options; this._map = map; - this._zoomInButton = this._createButton( - this.options.zoomInText, this.options.zoomInTitle, + this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, zoomName + '-in', container, this._zoomIn, this); - this._zoomOutButton = this._createButton( - this.options.zoomOutText, this.options.zoomOutTitle, + this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, zoomName + '-out', container, this._zoomOut, this); this._updateDisabled(); @@ -42,7 +41,7 @@ L.Control.Zoom = L.Control.extend({ this._map.zoomOut(e.shiftKey ? 3 : 1); }, - _createButton: function (html, title, className, container, fn, context) { + _createButton: function (html, title, className, container, fn) { var link = L.DomUtil.create('a', className, container); link.innerHTML = html; link.href = '#'; @@ -51,12 +50,11 @@ L.Control.Zoom = L.Control.extend({ var stop = L.DomEvent.stopPropagation; L.DomEvent - .on(link, 'click', stop) + .on(link, 'click', L.DomEvent.stop) .on(link, 'mousedown', stop) .on(link, 'dblclick', stop) - .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', fn, context) - .on(link, 'click', this._refocusOnMap, context); + .on(link, 'click', fn, this) + .on(link, 'click', this._refocusOnMap, this); return link; }, From 5bc104237eb50e45cb2d86f627c0d956b8228565 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 16:43:24 +0200 Subject: [PATCH 0598/2207] clean up Popup, add popup fade out animation --- src/layer/Popup.js | 97 ++++++++++++++++---------------- src/layer/marker/Marker.Popup.js | 2 +- src/layer/vector/CircleMarker.js | 2 +- 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 290499ef8d3..1797f2c5124 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -12,13 +12,15 @@ L.Popup = L.Class.extend({ options: { minWidth: 50, maxWidth: 300, - // maxHeight: null, - autoPan: true, - closeButton: true, + // maxHeight: , offset: [0, 7], + + autoPan: true, autoPanPadding: [5, 5], - // autoPanPaddingTopLeft: null, - // autoPanPaddingBottomRight: null, + // autoPanPaddingTopLeft: , + // autoPanPaddingBottomRight: , + + closeButton: true, keepInView: false, className: '', zoomAnimation: true @@ -29,7 +31,6 @@ L.Popup = L.Class.extend({ this._source = source; this._animated = L.Browser.any3d && this.options.zoomAnimation; - this._isOpen = false; }, onAdd: function (map) { @@ -44,8 +45,8 @@ L.Popup = L.Class.extend({ if (animFade) { L.DomUtil.setOpacity(this._container, 0); } - map._panes.popupPane.appendChild(this._container); + this._getPane().appendChild(this._container); map.on(this._getEvents(), this); this.update(); @@ -55,7 +56,6 @@ L.Popup = L.Class.extend({ } this.fire('open'); - map.fire('popupopen', {popup: this}); if (this._source) { @@ -74,20 +74,24 @@ L.Popup = L.Class.extend({ }, onRemove: function (map) { - map._panes.popupPane.removeChild(this._container); - - L.Util.falseFn(this._container.offsetWidth); // force reflow + var pane = this._getPane(); - map.off(this._getEvents(), this); + var removeFromPane = function () { + pane.removeChild(this._container); + }; if (map.options.fadeAnimation) { L.DomUtil.setOpacity(this._container, 0); + setTimeout(L.bind(removeFromPane, this), 200); + } else { + removeFromPane(); } + map.off(this._getEvents(), this); + this._map = null; this.fire('close'); - map.fire('popupclose', {popup: this}); if (this._source) { @@ -132,21 +136,23 @@ L.Popup = L.Class.extend({ this._adjustPan(); }, + _getPane: function () { + return this._map._panes.popupPane; + }, + _getEvents: function () { - var events = { - viewreset: this._updatePosition - }; + var events = {viewreset: this._updatePosition}, + options = this.options; if (this._animated) { events.zoomanim = this._zoomAnimation; } - if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { + if ('closeOnClick' in options ? options.closeOnClick : this._map.options.closePopupOnClick) { events.preclick = this._close; } - if (this.options.keepInView) { + if (options.keepInView) { events.moveend = this._adjustPan; } - return events; }, @@ -158,29 +164,26 @@ L.Popup = L.Class.extend({ _initLayout: function () { var prefix = 'leaflet-popup', - containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + - (this._animated ? 'animated' : 'hide'), - container = this._container = L.DomUtil.create('div', containerClass), - closeButton; + container = this._container = L.DomUtil.create('div', + prefix + ' ' + this.options.className + ' leaflet-zoom-' + (this._animated ? 'animated' : 'hide')); if (this.options.closeButton) { - closeButton = this._closeButton = - L.DomUtil.create('a', prefix + '-close-button', container); + var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container); closeButton.href = '#close'; closeButton.innerHTML = '×'; - L.DomEvent.disableClickPropagation(closeButton); - L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); + L.DomEvent + .disableClickPropagation(closeButton) + .on(closeButton, 'click', this._onCloseButtonClick, this); } - var wrapper = this._wrapper = - L.DomUtil.create('div', prefix + '-content-wrapper', container); - L.DomEvent.disableClickPropagation(wrapper); - + var wrapper = this._wrapper = L.DomUtil.create('div', prefix + '-content-wrapper', container); this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); - L.DomEvent.disableScrollPropagation(this._contentNode); - L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); + L.DomEvent + .disableClickPropagation(wrapper) + .disableScrollPropagation(this._contentNode) + .on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); @@ -189,13 +192,15 @@ L.Popup = L.Class.extend({ _updateContent: function () { if (!this._content) { return; } + var node = this._contentNode; + if (typeof this._content === 'string') { - this._contentNode.innerHTML = this._content; + node.innerHTML = this._content; } else { - while (this._contentNode.hasChildNodes()) { - this._contentNode.removeChild(this._contentNode.firstChild); + while (node.hasChildNodes()) { + node.removeChild(node.firstChild); } - this._contentNode.appendChild(this._content); + node.appendChild(this._content); } this.fire('contentupdate'); }, @@ -239,19 +244,20 @@ L.Popup = L.Class.extend({ if (animated) { L.DomUtil.setPosition(this._container, pos); + } else { + offset = offset.add(pos); } - this._containerBottom = -offset.y - (animated ? 0 : pos.y); - this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); + var bottom = this._containerBottom = -offset.y, + left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = this._containerBottom + 'px'; - this._container.style.left = this._containerLeft + 'px'; + this._container.style.bottom = bottom + 'px'; + this._container.style.left = left + 'px'; }, - _zoomAnimation: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); - + _zoomAnimation: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center); L.DomUtil.setPosition(this._container, pos); }, @@ -261,7 +267,6 @@ L.Popup = L.Class.extend({ var map = this._map, containerHeight = this._container.offsetHeight, containerWidth = this._containerWidth, - layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); if (this._animated) { @@ -318,7 +323,6 @@ L.Map.include({ .setLatLng(latlng) .setContent(content); } - popup._isOpen = true; this._popup = popup; return this.addLayer(popup); @@ -331,7 +335,6 @@ L.Map.include({ } if (popup) { this.removeLayer(popup); - popup._isOpen = false; } return this; } diff --git a/src/layer/marker/Marker.Popup.js b/src/layer/marker/Marker.Popup.js index e414d1bbcaf..4acbd1428b8 100644 --- a/src/layer/marker/Marker.Popup.js +++ b/src/layer/marker/Marker.Popup.js @@ -21,7 +21,7 @@ L.Marker.include({ togglePopup: function () { if (this._popup) { - if (this._popup._isOpen) { + if (this._popup._map) { this.closePopup(); } else { this.openPopup(); diff --git a/src/layer/vector/CircleMarker.js b/src/layer/vector/CircleMarker.js index 6b93df08e68..4e62639c2c0 100644 --- a/src/layer/vector/CircleMarker.js +++ b/src/layer/vector/CircleMarker.js @@ -24,7 +24,7 @@ L.CircleMarker = L.Circle.extend({ setLatLng: function (latlng) { L.Circle.prototype.setLatLng.call(this, latlng); - if (this._popup && this._popup._isOpen) { + if (this._popup) { this._popup.setLatLng(latlng); } return this; From 3a0b1bf1d53c8d8595af048008403333edaa86b0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 17:38:55 +0200 Subject: [PATCH 0599/2207] don't overwrite default options if not specified (faster construction) --- src/core/Util.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/Util.js b/src/core/Util.js index afc7a04967c..92a05c2e0da 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -107,7 +107,9 @@ L.Util = { }, setOptions: function (obj, options) { - obj.options = L.extend({}, obj.options, options); + if (options) { + obj.options = L.extend({}, obj.options, options); + } return obj.options; }, From 57a0866bcfc7cd84b70c8dc73d282ce511632196 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 18:00:37 +0200 Subject: [PATCH 0600/2207] set empty options object if no options given, fixes build --- src/core/Util.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/Util.js b/src/core/Util.js index 92a05c2e0da..2bf7ed93d25 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -107,9 +107,7 @@ L.Util = { }, setOptions: function (obj, options) { - if (options) { - obj.options = L.extend({}, obj.options, options); - } + obj.options = options ? L.extend({}, obj.options, options) : obj.options || {}; return obj.options; }, @@ -120,6 +118,7 @@ L.Util = { } return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); }, + template: function (str, data) { return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { var value = data[key]; From 5b77ec33de4d5f01865e2353a038110fe87f9750 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 18:01:52 +0200 Subject: [PATCH 0601/2207] optimize fire event in V8 when there are no context listeners --- src/core/Events.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/Events.js b/src/core/Events.js index cd8b17af964..982dec58e50 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -143,6 +143,8 @@ L.Mixin.Events = { // fire event for the context-indexed listeners as well typeIndex = events[type + '_idx']; + if (!typeIndex) { return this; } + for (contextId in typeIndex) { listeners = typeIndex[contextId].slice(); From efba6b4d1c92ecbfe6505c7ada3ff3a3114f8753 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Dec 2013 18:42:13 +0200 Subject: [PATCH 0602/2207] clean up Icon code --- src/layer/marker/DivIcon.js | 11 +++-------- src/layer/marker/Icon.Default.js | 18 ++++++------------ src/layer/marker/Icon.js | 25 ++++--------------------- 3 files changed, 13 insertions(+), 41 deletions(-) diff --git a/src/layer/marker/DivIcon.js b/src/layer/marker/DivIcon.js index 8c9a151f9bd..c1e1cdd380d 100644 --- a/src/layer/marker/DivIcon.js +++ b/src/layer/marker/DivIcon.js @@ -20,18 +20,13 @@ L.DivIcon = L.Icon.extend({ var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), options = this.options; - if (options.html !== false) { - div.innerHTML = options.html; - } else { - div.innerHTML = ''; - } + div.innerHTML = options.html !== false ? options.html : ''; if (options.bgPos) { - div.style.backgroundPosition = - (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; + div.style.backgroundPosition = (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; } - this._setIconStyles(div, 'icon'); + return div; }, diff --git a/src/layer/marker/Icon.Default.js b/src/layer/marker/Icon.Default.js index 3174040c5dc..46c21d2c2d0 100644 --- a/src/layer/marker/Icon.Default.js +++ b/src/layer/marker/Icon.Default.js @@ -5,11 +5,10 @@ L.Icon.Default = L.Icon.extend({ options: { - iconSize: [25, 41], - iconAnchor: [12, 41], + iconSize: [25, 41], + iconAnchor: [12, 41], popupAnchor: [1, -34], - - shadowSize: [41, 41] + shadowSize: [41, 41] }, _getIconUrl: function (name) { @@ -19,17 +18,13 @@ L.Icon.Default = L.Icon.extend({ return this.options[key]; } - if (L.Browser.retina && name === 'icon') { - name += '-2x'; - } - var path = L.Icon.Default.imagePath; if (!path) { throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.'); } - return path + '/marker-' + name + '.png'; + return path + '/marker-' + name + (L.Browser.retina && name === 'icon' ? '-2x' : '') + '.png'; } }); @@ -37,13 +32,12 @@ L.Icon.Default.imagePath = (function () { var scripts = document.getElementsByTagName('script'), leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/; - var i, len, src, matches, path; + var i, len, src, path; for (i = 0, len = scripts.length; i < len; i++) { src = scripts[i].src; - matches = src.match(leafletRe); - if (matches) { + if (src.match(leafletRe)) { path = src.split(leafletRe)[0]; return (path ? path + '/' : '') + 'images'; } diff --git a/src/layer/marker/Icon.js b/src/layer/marker/Icon.js index 705462ac5c7..cb9349398da 100644 --- a/src/layer/marker/Icon.js +++ b/src/layer/marker/Icon.js @@ -40,12 +40,7 @@ L.Icon = L.Class.extend({ return null; } - var img; - if (!oldIcon || oldIcon.tagName !== 'IMG') { - img = this._createImg(src); - } else { - img = this._createImg(src, oldIcon); - } + var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null); this._setIconStyles(img, name); return img; @@ -54,17 +49,8 @@ L.Icon = L.Class.extend({ _setIconStyles: function (img, name) { var options = this.options, size = L.point(options[name + 'Size']), - anchor; - - if (name === 'shadow') { - anchor = L.point(options.shadowAnchor || options.iconAnchor); - } else { - anchor = L.point(options.iconAnchor); - } - - if (!anchor && size) { - anchor = size.divideBy(2, true); - } + anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor || + size && size.divideBy(2, true)); img.className = 'leaflet-marker-' + name + ' ' + options.className; @@ -86,10 +72,7 @@ L.Icon = L.Class.extend({ }, _getIconUrl: function (name) { - if (L.Browser.retina && this.options[name + 'RetinaUrl']) { - return this.options[name + 'RetinaUrl']; - } - return this.options[name + 'Url']; + return L.Browser.retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; } }); From 401297d3cd70314c07b2a1cc43f0333603b118c8 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Wed, 4 Dec 2013 17:19:08 +0000 Subject: [PATCH 0603/2207] Add link to leaflet-zoom-min plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 12a903a2b1f..ab53d0017d7 100644 --- a/plugins.md +++ b/plugins.md @@ -841,6 +841,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Tobias Bieniek + + + leaflet-zoom-min + + Adds a button to the zoom control that allows you to zoom to the map minimum zoom level in a single click. + + Alan Shaw + + From cf3e63adadfd06ccdc4ef595efbb48897d2a4a88 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 13:21:16 +0200 Subject: [PATCH 0604/2207] update deps --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 08477f80dce..aa6b0b72a55 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,14 @@ "version": "0.7.0", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { - "jake": "~0.7.4", + "jake": "~0.7.6", "jshint": "~2.3.0", - "uglify-js": "~2.4.3", - "mocha": "~1.14.0", + "uglify-js": "~2.4.6", + "mocha": "~1.15.1", "happen": "~0.1.3", - "karma": "~0.10.4", - "karma-mocha": "~0.1.0", - "karma-coverage": "~0.1.3" + "karma": "~0.10.8", + "karma-mocha": "~0.1.1", + "karma-coverage": "~0.1.4" }, "main": "dist/leaflet-src.js", "scripts": { From 6b9731283d5aabe489bc00331c05421b3e916503 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 14:35:39 +0200 Subject: [PATCH 0605/2207] add and use DomUtil.remove --- src/control/Control.js | 6 ++---- src/dom/DomUtil.js | 7 +++++++ src/layer/ImageOverlay.js | 2 +- src/layer/Popup.js | 10 ++-------- src/layer/tile/GridLayer.js | 6 ++---- src/layer/tile/TileLayer.js | 2 +- src/layer/vector/Path.SVG.js | 2 +- src/layer/vector/Path.js | 2 +- src/map/Map.js | 7 ++----- src/map/handler/Map.BoxZoom.js | 2 +- 10 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/control/Control.js b/src/control/Control.js index 0e65cf50e2f..09340d79eba 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -55,10 +55,8 @@ L.Control = L.Class.extend({ }, removeFrom: function (map) { - var pos = this.getPosition(), - corner = map._controlCorners[pos]; + L.DomUtil.remove(this._container); - corner.removeChild(this._container); this._map = null; if (this.onRemove) { @@ -112,6 +110,6 @@ L.Map.include({ }, _clearControlPos: function () { - this._container.removeChild(this._controlContainer); + L.DomUtil.remove(this._controlContainer); } }); diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index acf2c068996..33739317966 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -96,6 +96,13 @@ L.DomUtil = { return el; }, + remove: function (el) { + var parent = el.parentNode; + if (parent) { + parent.removeChild(el); + } + }, + hasClass: function (el, name) { if (el.classList !== undefined) { return el.classList.contains(name); diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 0248fa7e09f..cde2fd841db 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -35,7 +35,7 @@ L.ImageOverlay = L.Class.extend({ }, onRemove: function (map) { - map.getPanes().overlayPane.removeChild(this._image); + L.DomUtil.remove(this._image); map.off('viewreset', this._reset, this); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 1797f2c5124..31d0233a5a0 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -74,17 +74,11 @@ L.Popup = L.Class.extend({ }, onRemove: function (map) { - var pane = this._getPane(); - - var removeFromPane = function () { - pane.removeChild(this._container); - }; - if (map.options.fadeAnimation) { L.DomUtil.setOpacity(this._container, 0); - setTimeout(L.bind(removeFromPane, this), 200); + setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200); } else { - removeFromPane(); + L.DomUtil.remove(this._container); } map.off(this._getEvents(), this); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 23e14d27368..56ab8b24c24 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -46,7 +46,7 @@ L.GridLayer = L.Class.extend({ onRemove: function (map) { this._clearBgBuffer(); - this._getPane().removeChild(this._container); + L.DomUtil.remove(this._container); map.off(this._getEvents(), this); @@ -368,9 +368,7 @@ L.GridLayer = L.Class.extend({ _removeTile: function (key) { var tile = this._tiles[key]; - if (tile.parentNode) { - tile.parentNode.removeChild(tile); - } + L.DomUtil.remove(tile); delete this._tiles[key]; diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index b72505851ae..800a21f9fb6 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -172,7 +172,7 @@ L.TileLayer = L.GridLayer.extend({ tile.onerror = L.Util.falseFn; tile.src = L.Util.emptyImageUrl; - tile.parentNode.removeChild(tile); + L.DomUtil.remove(tile); } } } diff --git a/src/layer/vector/Path.SVG.js b/src/layer/vector/Path.SVG.js index 30c11ad7055..90d7f31984c 100644 --- a/src/layer/vector/Path.SVG.js +++ b/src/layer/vector/Path.SVG.js @@ -215,7 +215,7 @@ L.Map.include({ // Hack to make flicker on drag end on mobile webkit less irritating if (L.Browser.mobileWebkit) { - pane.removeChild(root); + L.DomUtil.remove(root); } L.DomUtil.setPosition(root, min); diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 47f7b0125c5..483b3676b1b 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -65,7 +65,7 @@ L.Path = L.Class.extend({ }, onRemove: function (map) { - map._pathRoot.removeChild(this._container); + L.DomUtil.remove(this._container); // Need to fire remove event before we set _map to null as the event hooks might need the object this.fire('remove'); diff --git a/src/map/Map.js b/src/map/Map.js index 99e00947dca..fe078f736ea 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -295,7 +295,8 @@ L.Map = L.Class.extend({ this._container._leaflet = undefined; } - this._clearPanes(); + L.DomUtil.remove(this._mapPane); + if (this._clearControlPos) { this._clearControlPos(); } @@ -533,10 +534,6 @@ L.Map = L.Class.extend({ return L.DomUtil.create('div', className, container || this._panes.objectsPane); }, - _clearPanes: function () { - this._container.removeChild(this._mapPane); - }, - _addLayers: function (layers) { layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js index 7198854d6f5..e69a035abad 100644 --- a/src/map/handler/Map.BoxZoom.js +++ b/src/map/handler/Map.BoxZoom.js @@ -75,7 +75,7 @@ L.Map.BoxZoom = L.Handler.extend({ _finish: function () { if (this._moved) { - this._pane.removeChild(this._box); + L.DomUtil.remove(this._box); this._container.style.cursor = ''; } From 3b0e6d79b0eb504bd9740b2b0881eb8a3c07694b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 14:39:51 +0200 Subject: [PATCH 0606/2207] clean up Marker.js --- src/layer/marker/Marker.js | 42 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index d0a0f7d047b..abf32e97e2b 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -8,14 +8,14 @@ L.Marker = L.Class.extend({ options: { icon: new L.Icon.Default(), - title: '', - alt: '', + // title: '', + // alt: '', clickable: true, - draggable: false, + // draggable: false, keyboard: true, zIndexOffset: 0, opacity: 1, - riseOnHover: false, + // riseOnHover: false, riseOffset: 250 }, @@ -26,14 +26,16 @@ L.Marker = L.Class.extend({ onAdd: function (map) { this._map = map; + this._animated = map.options.zoomAnimation && map.options.markerZoomAnimation; map.on('viewreset', this.update, this); this._initIcon(); this.update(); + this.fire('add'); - if (map.options.zoomAnimation && map.options.markerZoomAnimation) { + if (this._animated) { map.on('zoomanim', this._animateZoom, this); } }, @@ -70,14 +72,12 @@ L.Marker = L.Class.extend({ this.update(); - return this.fire('move', { latlng: this._latlng }); + return this.fire('move', {latlng: this._latlng}); }, setZIndexOffset: function (offset) { this.options.zIndexOffset = offset; - this.update(); - - return this; + return this.update(); }, setIcon: function (icon) { @@ -107,9 +107,7 @@ L.Marker = L.Class.extend({ _initIcon: function () { var options = this.options, - map = this._map, - animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), - classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide'; + classToAdd = 'leaflet-zoom-' + (this._animated ? 'animated' : 'hide'); var icon = options.icon.createIcon(this._icon), addIcon = false; @@ -124,7 +122,6 @@ L.Marker = L.Class.extend({ if (options.title) { icon.title = options.title; } - if (options.alt) { icon.alt = options.alt; } @@ -137,7 +134,6 @@ L.Marker = L.Class.extend({ } this._icon = icon; - this._initInteraction(); if (options.riseOnHover) { @@ -170,7 +166,6 @@ L.Marker = L.Class.extend({ if (addIcon) { panes.markerPane.appendChild(this._icon); } - if (newShadow && addShadow) { panes.shadowPane.appendChild(this._shadow); } @@ -183,14 +178,14 @@ L.Marker = L.Class.extend({ .off(this._icon, 'mouseout', this._resetZIndex); } - this._map._panes.markerPane.removeChild(this._icon); + L.DomUtil.remove(this._icon); this._icon = null; }, _removeShadow: function () { if (this._shadow) { - this._map._panes.shadowPane.removeChild(this._shadow); + L.DomUtil.remove(this._shadow); } this._shadow = null; }, @@ -227,8 +222,10 @@ L.Marker = L.Class.extend({ events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; L.DomUtil.addClass(icon, 'leaflet-clickable'); - L.DomEvent.on(icon, 'click', this._onMouseClick, this); - L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); + + L.DomEvent + .on(icon, 'click', this._onMouseClick, this) + .on(icon, 'keypress', this._onKeyPress, this); for (var i = 0; i < events.length; i++) { L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); @@ -298,9 +295,12 @@ L.Marker = L.Class.extend({ }, _updateOpacity: function () { - L.DomUtil.setOpacity(this._icon, this.options.opacity); + var opacity = this.options.opacity; + + L.DomUtil.setOpacity(this._icon, opacity); + if (this._shadow) { - L.DomUtil.setOpacity(this._shadow, this.options.opacity); + L.DomUtil.setOpacity(this._shadow, opacity); } }, From b8b6e3e8528f0f1270f98dbbac9723b5c0079eab Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 14:43:41 +0200 Subject: [PATCH 0607/2207] clean up Marker.Drag.js --- src/layer/marker/Marker.Drag.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js index 812439f83b0..e03fa7168a0 100644 --- a/src/layer/marker/Marker.Drag.js +++ b/src/layer/marker/Marker.Drag.js @@ -9,6 +9,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ addHooks: function () { var icon = this._marker._icon; + if (!this._draggable) { this._draggable = new L.Draggable(icon, icon); } @@ -16,18 +17,19 @@ L.Handler.MarkerDrag = L.Handler.extend({ this._draggable .on('dragstart', this._onDragStart, this) .on('drag', this._onDrag, this) - .on('dragend', this._onDragEnd, this); - this._draggable.enable(); - L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable'); + .on('dragend', this._onDragEnd, this) + .enable(); + + L.DomUtil.addClass(icon, 'leaflet-marker-draggable'); }, removeHooks: function () { this._draggable .off('dragstart', this._onDragStart, this) .off('drag', this._onDrag, this) - .off('dragend', this._onDragEnd, this); + .off('dragend', this._onDragEnd, this) + .disable(); - this._draggable.disable(); L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); }, From b0d6bcb0aab0291c4b21b52d9c751f1b2c2dd095 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 14:57:18 +0200 Subject: [PATCH 0608/2207] clean up ImageOverlay --- src/layer/ImageOverlay.js | 59 ++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index cde2fd841db..361224afae0 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -18,18 +18,15 @@ L.ImageOverlay = L.Class.extend({ onAdd: function (map) { this._map = map; + this._animated = this._map.options.zoomAnimation && L.Browser.any3d; if (!this._image) { this._initImage(); } - map._panes.overlayPane.appendChild(this._image); + this._getPane().appendChild(this._image); - map.on('viewreset', this._reset, this); - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } + map.on(this._getEvents(), this); this._reset(); }, @@ -37,11 +34,7 @@ L.ImageOverlay = L.Class.extend({ onRemove: function (map) { L.DomUtil.remove(this._image); - map.off('viewreset', this._reset, this); - - if (map.options.zoomAnimation) { - map.off('zoomanim', this._animateZoom, this); - } + map.off(this._getEvents(), this); }, addTo: function (map) { @@ -58,13 +51,13 @@ L.ImageOverlay = L.Class.extend({ // TODO remove bringToFront/bringToBack duplication from TileLayer/Path bringToFront: function () { if (this._image) { - this._map._panes.overlayPane.appendChild(this._image); + this._getPane().appendChild(this._image); } return this; }, bringToBack: function () { - var pane = this._map._panes.overlayPane; + var pane = this._getPane(); if (this._image) { pane.insertBefore(this._image, pane.firstChild); } @@ -80,15 +73,25 @@ L.ImageOverlay = L.Class.extend({ return this.options.attribution; }, - _initImage: function () { - this._image = L.DomUtil.create('img', 'leaflet-image-layer'); + _getPane: function () { + return this._map._panes.overlayPane; + }, + + _getEvents: function () { + var events = {viewreset: this._reset}; - if (this._map.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); - } else { - L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); + if (this._animated) { + events.zoomanim = this._animateZoom; } + return events; + }, + + _initImage: function () { + this._image = L.DomUtil.create('img', + 'leaflet-image-layer ' + + 'leaflet-zoom-' + (this._animated ? 'animated' : 'hide')); + this._updateOpacity(); //TODO createImage util method to remove duplication @@ -96,7 +99,7 @@ L.ImageOverlay = L.Class.extend({ galleryimg: 'no', onselectstart: L.Util.falseFn, onmousemove: L.Util.falseFn, - onload: L.bind(this._onImageLoad, this), + onload: L.bind(this.fire, this, 'load'), src: this._url }); }, @@ -105,15 +108,11 @@ L.ImageOverlay = L.Class.extend({ var map = this._map, image = this._image, scale = map.getZoomScale(e.zoom), - nw = this._bounds.getNorthWest(), - se = this._bounds.getSouthEast(), + topLeft = map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center), + size = map._latLngToNewLayerPoint(this._bounds.getSouthEast(), e.zoom, e.center)._subtract(topLeft), + origin = topLeft._add(size._multiplyBy((1 - 1 / scale) / 2)); - topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), - size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), - origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); - - image.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; + image.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; }, _reset: function () { @@ -127,10 +126,6 @@ L.ImageOverlay = L.Class.extend({ image.style.height = size.y + 'px'; }, - _onImageLoad: function () { - this.fire('load'); - }, - _updateOpacity: function () { L.DomUtil.setOpacity(this._image, this.options.opacity); } From 42b39bf24777cf411a198742aeac728659be84ed Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 15:14:52 +0200 Subject: [PATCH 0609/2207] clean up GeoJSON.js also changes geometryToLayer & coordsToLatLngs signatures --- src/layer/GeoJSON.js | 53 +++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 6cc89c6b185..c70fd62ff3a 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -23,7 +23,7 @@ L.GeoJSON = L.FeatureGroup.extend({ // Only add this if geometry or geometries are set and not null feature = features[i]; if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { - this.addData(features[i]); + this.addData(feature); } } return this; @@ -33,7 +33,7 @@ L.GeoJSON = L.FeatureGroup.extend({ if (options.filter && !options.filter(geojson)) { return; } - var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options); + var layer = L.GeoJSON.geometryToLayer(geojson, options); layer.feature = L.GeoJSON.asFeature(geojson); layer.defaultOptions = layer.options; @@ -73,44 +73,49 @@ L.GeoJSON = L.FeatureGroup.extend({ }); L.extend(L.GeoJSON, { - geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) { + geometryToLayer: function (geojson, options) { var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, coords = geometry.coordinates, layers = [], + coordsToLatLng = options.coordsToLatLng || this.coordsToLatLng, latlng, latlngs, i, len; - coordsToLatLng = coordsToLatLng || this.coordsToLatLng; - switch (geometry.type) { case 'Point': latlng = coordsToLatLng(coords); - return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); + + return options.pointToLayer ? + options.pointToLayer(geojson, latlng) : + new L.Marker(latlng); case 'MultiPoint': for (i = 0, len = coords.length; i < len; i++) { latlng = coordsToLatLng(coords[i]); - layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); + + layers.push(options.pointToLayer ? + options.pointToLayer(geojson, latlng) : + new L.Marker(latlng)); } return new L.FeatureGroup(layers); case 'LineString': latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); - return new L.Polyline(latlngs, vectorOptions); + return new L.Polyline(latlngs, options); case 'Polygon': if (coords.length === 2 && !coords[1].length) { throw new Error('Invalid GeoJSON object.'); } latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.Polygon(latlngs, vectorOptions); + return new L.Polygon(latlngs, options); case 'MultiLineString': latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.MultiPolyline(latlngs, vectorOptions); + return new L.MultiPolyline(latlngs, options); case 'MultiPolygon': latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); - return new L.MultiPolygon(latlngs, vectorOptions); + return new L.MultiPolygon(latlngs, options); case 'GeometryCollection': for (i = 0, len = geometry.geometries.length; i < len; i++) { @@ -119,7 +124,7 @@ L.extend(L.GeoJSON, { geometry: geometry.geometries[i], type: 'Feature', properties: geojson.properties - }, pointToLayer, coordsToLatLng, vectorOptions)); + }, options)); } return new L.FeatureGroup(layers); @@ -128,18 +133,17 @@ L.extend(L.GeoJSON, { } }, - coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng + coordsToLatLng: function (coords) { return new L.LatLng(coords[1], coords[0], coords[2]); }, - coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array - var latlng, i, len, - latlngs = []; + coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { + var latlngs = []; - for (i = 0, len = coords.length; i < len; i++) { + for (var i = 0, len = coords.length, latlng; i < len; i++) { latlng = levelsDeep ? this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : - (coordsToLatLng || this.coordsToLatLng)(coords[i]); + coordsToLatLng(coords[i]); latlngs.push(latlng); } @@ -148,12 +152,9 @@ L.extend(L.GeoJSON, { }, latLngToCoords: function (latlng) { - var coords = [latlng.lng, latlng.lat]; - - if (latlng.alt !== undefined) { - coords.push(latlng.alt); - } - return coords; + return latlng.alt !== undefined ? + [latlng.lng, latlng.lat, latlng.alt] : + [latlng.lng, latlng.lat]; }, latLngsToCoords: function (latLngs) { @@ -167,7 +168,9 @@ L.extend(L.GeoJSON, { }, getFeature: function (layer, newGeometry) { - return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry); + return layer.feature ? + L.extend({}, layer.feature, {geometry: newGeometry}) : + L.GeoJSON.asFeature(newGeometry); }, asFeature: function (geoJSON) { From 674b7cbc3f8907ab4c75f0e25a7de08ae3052e48 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 16:01:25 +0200 Subject: [PATCH 0610/2207] clean up Path classes --- src/layer/vector/Path.SVG.js | 116 +++++++++++++------------ src/layer/vector/Path.VML.js | 9 +- src/layer/vector/Path.js | 29 ++++--- src/layer/vector/canvas/Path.Canvas.js | 15 ++-- 4 files changed, 87 insertions(+), 82 deletions(-) diff --git a/src/layer/vector/Path.SVG.js b/src/layer/vector/Path.SVG.js index 90d7f31984c..72cb55a3ae7 100644 --- a/src/layer/vector/Path.SVG.js +++ b/src/layer/vector/Path.SVG.js @@ -32,9 +32,11 @@ L.Path = L.Path.extend({ return this; }, + /* getPathString: function () { // form path string here }, + */ _createElement: function (name) { return document.createElementNS(L.Path.SVG_NS, name); @@ -48,7 +50,6 @@ L.Path = L.Path.extend({ _initPath: function () { this._container = this._createElement('g'); - this._path = this._createElement('path'); if (this.options.className) { @@ -59,72 +60,76 @@ L.Path = L.Path.extend({ }, _initStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke-linejoin', 'round'); - this._path.setAttribute('stroke-linecap', 'round'); + var path = this._path, + options = this.options; + + if (options.stroke) { + path.setAttribute('stroke-linejoin', 'round'); + path.setAttribute('stroke-linecap', 'round'); } - if (this.options.fill) { - this._path.setAttribute('fill-rule', 'evenodd'); + if (options.fill) { + path.setAttribute('fill-rule', 'evenodd'); } - if (this.options.pointerEvents) { - this._path.setAttribute('pointer-events', this.options.pointerEvents); + if (options.pointerEvents) { + path.setAttribute('pointer-events', options.pointerEvents); } - if (!this.options.clickable && !this.options.pointerEvents) { - this._path.setAttribute('pointer-events', 'none'); + if (!options.clickable && !options.pointerEvents) { + path.setAttribute('pointer-events', 'none'); } this._updateStyle(); }, _updateStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke', this.options.color); - this._path.setAttribute('stroke-opacity', this.options.opacity); - this._path.setAttribute('stroke-width', this.options.weight); - if (this.options.dashArray) { - this._path.setAttribute('stroke-dasharray', this.options.dashArray); + var path = this._path, + options = this.options; + + if (options.stroke) { + path.setAttribute('stroke', options.color); + path.setAttribute('stroke-opacity', options.opacity); + path.setAttribute('stroke-width', options.weight); + + if (options.dashArray) { + path.setAttribute('stroke-dasharray', options.dashArray); } else { - this._path.removeAttribute('stroke-dasharray'); + path.removeAttribute('stroke-dasharray'); } - if (this.options.lineCap) { - this._path.setAttribute('stroke-linecap', this.options.lineCap); + + if (options.lineCap) { + path.setAttribute('stroke-linecap', options.lineCap); } - if (this.options.lineJoin) { - this._path.setAttribute('stroke-linejoin', this.options.lineJoin); + if (options.lineJoin) { + path.setAttribute('stroke-linejoin', options.lineJoin); } + } else { - this._path.setAttribute('stroke', 'none'); + path.setAttribute('stroke', 'none'); } - if (this.options.fill) { - this._path.setAttribute('fill', this.options.fillColor || this.options.color); - this._path.setAttribute('fill-opacity', this.options.fillOpacity); + + if (options.fill) { + path.setAttribute('fill', options.fillColor || options.color); + path.setAttribute('fill-opacity', options.fillOpacity); } else { - this._path.setAttribute('fill', 'none'); + path.setAttribute('fill', 'none'); } }, _updatePath: function () { - var str = this.getPathString(); - if (!str) { - // fix webkit empty string parsing bug - str = 'M0 0'; - } - this._path.setAttribute('d', str); + this._path.setAttribute('d', this.getPathString() || 'M0 0'); }, // TODO remove duplication with L.Map _initEvents: function () { - if (this.options.clickable) { - if (L.Browser.svg || !L.Browser.vml) { - L.DomUtil.addClass(this._path, 'leaflet-clickable'); - } + if (L.Browser.svg || !L.Browser.vml) { + L.DomUtil.addClass(this._path, 'leaflet-clickable'); + } - L.DomEvent.on(this._container, 'click', this._onMouseClick, this); + L.DomEvent.on(this._container, 'click', this._onMouseClick, this); - var events = ['dblclick', 'mousedown', 'mouseover', - 'mouseout', 'mousemove', 'contextmenu']; - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); - } + var events = ['dblclick', 'mousedown', 'mouseover', + 'mouseout', 'mousemove', 'contextmenu']; + + for (var i = 0; i < events.length; i++) { + L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); } }, @@ -161,18 +166,18 @@ L.Path = L.Path.extend({ L.Map.include({ _initPathRoot: function () { if (!this._pathRoot) { - this._pathRoot = L.Path.prototype._createElement('svg'); - this._panes.overlayPane.appendChild(this._pathRoot); + var root = this._pathRoot = L.Path.prototype._createElement('svg'); + this._panes.overlayPane.appendChild(root); + + var animated = this.options.zoomAnimation && L.Browser.any3d; - if (this.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated'); + L.DomUtil.addClass(root, 'leaflet-zoom-' + (animated ? 'animated' : 'hide')); + if (animated) { this.on({ 'zoomanim': this._animatePathZoom, 'zoomend': this._endPathZoom }); - } else { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide'); } this.on('moveend', this._updateSvgViewport); @@ -206,22 +211,19 @@ L.Map.include({ this._updatePathViewport(); var vp = this._pathViewport, - min = vp.min, - max = vp.max, - width = max.x - min.x, - height = max.y - min.y, + size = vp.getSize(), root = this._pathRoot, pane = this._panes.overlayPane; // Hack to make flicker on drag end on mobile webkit less irritating if (L.Browser.mobileWebkit) { - L.DomUtil.remove(root); + pane.removeChild(root); } - L.DomUtil.setPosition(root, min); - root.setAttribute('width', width); - root.setAttribute('height', height); - root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); + L.DomUtil.setPosition(root, vp.min); + root.setAttribute('width', size.x); + root.setAttribute('height', size.y); + root.setAttribute('viewBox', [vp.min.x, vp.min.y, size.x, size.y].join(' ')); if (L.Browser.mobileWebkit) { pane.appendChild(root); diff --git a/src/layer/vector/Path.VML.js b/src/layer/vector/Path.VML.js index 541060405c9..bec3b585e41 100644 --- a/src/layer/vector/Path.VML.js +++ b/src/layer/vector/Path.VML.js @@ -41,12 +41,9 @@ L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ _initPath: function () { var container = this._container = this._createElement('shape'); - L.DomUtil.addClass(container, 'leaflet-vml-shape' + - (this.options.className ? ' ' + this.options.className : '')); - - if (this.options.clickable) { - L.DomUtil.addClass(container, 'leaflet-clickable'); - } + L.DomUtil.addClass(container, 'leaflet-vml-shape ' + + (this.options.className || '') + + (this.options.clickable ? ' leaflet-clickable' : '')); container.coordsize = '1 1'; diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 483b3676b1b..4f90b5eac4e 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -19,16 +19,18 @@ L.Path = L.Class.extend({ options: { stroke: true, color: '#0033ff', - dashArray: null, - lineCap: null, - lineJoin: null, + // dashArray: null, + // lineCap: null, + // lineJoin: null, weight: 5, opacity: 0.5, - fill: false, - fillColor: null, //same as color by default + // fill: false, + // fillColor: null, same as color by default fillOpacity: 0.2, + // className: '' + clickable: true }, @@ -41,7 +43,10 @@ L.Path = L.Class.extend({ if (!this._container) { this._initElements(); - this._initEvents(); + + if (this.options.clickable) { + this._initEvents(); + } } this.projectLatlngs(); @@ -54,8 +59,8 @@ L.Path = L.Class.extend({ this.fire('add'); map.on({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath + viewreset: this.projectLatlngs, + moveend: this._updatePath }, this); }, @@ -69,8 +74,10 @@ L.Path = L.Class.extend({ // Need to fire remove event before we set _map to null as the event hooks might need the object this.fire('remove'); + this._map = null; + // TODO move to Path.VML if (L.Browser.vml) { this._container = null; this._stroke = null; @@ -78,14 +85,16 @@ L.Path = L.Class.extend({ } map.off({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath + viewreset: this.projectLatlngs, + moveend: this._updatePath }, this); }, + /* projectLatlngs: function () { // do all projection stuff here }, + */ setStyle: function (style) { L.setOptions(this, style); diff --git a/src/layer/vector/canvas/Path.Canvas.js b/src/layer/vector/canvas/Path.Canvas.js index 8d0380103ce..d22f05756cd 100644 --- a/src/layer/vector/canvas/Path.Canvas.js +++ b/src/layer/vector/canvas/Path.Canvas.js @@ -123,11 +123,9 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : }, _initEvents: function () { - if (this.options.clickable) { - // TODO dblclick - this._map.on('mousemove', this._onMouseMove, this); - this._map.on('click', this._onClick, this); - } + // TODO dblclick + this._map.on('mousemove', this._onMouseMove, this); + this._map.on('click', this._onClick, this); }, _onClick: function (e) { @@ -184,14 +182,13 @@ L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} this._updatePathViewport(); var vp = this._pathViewport, - min = vp.min, - size = vp.max.subtract(min), + size = vp.getSize(), root = this._pathRoot; //TODO check if this works properly on mobile webkit - L.DomUtil.setPosition(root, min); + L.DomUtil.setPosition(root, vp.min); root.width = size.x; root.height = size.y; - root.getContext('2d').translate(-min.x, -min.y); + root.getContext('2d').translate(-vp.min.x, -vp.min.y); } }); From a0ad7b6c0e1b2ff60d7b2ce130fc4a9652d65f40 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 16:44:50 +0200 Subject: [PATCH 0611/2207] clean up Poly code --- src/layer/vector/Polygon.js | 6 +++-- src/layer/vector/Polyline.js | 46 ++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index 5fd5dd40e19..ee7aa8236bb 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -14,6 +14,7 @@ L.Polygon = L.Polyline.extend({ _initWithHoles: function (latlngs) { var i, len, hole; + if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { this._latlngs = this._convertLatLngs(latlngs[0]); this._holes = latlngs.slice(1); @@ -65,14 +66,15 @@ L.Polygon = L.Polyline.extend({ _clipPoints: function () { var points = this._originalPoints, - newParts = []; + newParts = [], + vp = this._map._pathViewport; this._parts = [points].concat(this._holePoints); if (this.options.noClip) { return; } for (var i = 0, len = this._parts.length; i < len; i++) { - var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); + var clipped = L.PolyUtil.clipPolygon(this._parts[i], vp); if (clipped.length) { newParts.push(clipped); } diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 8cb836b5ff3..b8290f30f49 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -12,8 +12,8 @@ L.Polyline = L.Path.extend({ options: { // how much to simplify the polyline on each zoom level // more = better performance and smoother look, less = more accurate - smoothFactor: 1.0, - noClip: false + smoothFactor: 1.0 + // noClip: false }, projectLatlngs: function () { @@ -53,17 +53,23 @@ L.Polyline = L.Path.extend({ }, closestLayerPoint: function (p) { - var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; + var minDistance = Infinity, + minPoint = null, + closest = L.LineUtil._sqClosestPointOnSegment, + p1, p2; + + for (var j = 0, jLen = this._parts.length; j < jLen; j++) { + var points = this._parts[j]; - for (var j = 0, jLen = parts.length; j < jLen; j++) { - var points = parts[j]; for (var i = 1, len = points.length; i < len; i++) { p1 = points[i - 1]; p2 = points[i]; - var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); + + var sqDist = closest(p, p1, p2, true); + if (sqDist < minDistance) { minDistance = sqDist; - minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); + minPoint = closest(p, p1, p2); } } } @@ -78,12 +84,10 @@ L.Polyline = L.Path.extend({ }, _convertLatLngs: function (latlngs, overwrite) { - var i, len, target = overwrite ? latlngs : []; + var target = overwrite ? latlngs : []; - for (i = 0, len = latlngs.length; i < len; i++) { - if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { - return; - } + for (var i = 0, len = latlngs.length; i < len; i++) { + if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { return; } target[i] = L.latLng(latlngs[i]); } return target; @@ -94,11 +98,9 @@ L.Polyline = L.Path.extend({ }, _getPathPartStr: function (points) { - var round = L.Path.VML; - for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { p = points[j]; - if (round) { + if (L.Path.VML) { p._round(); } str += (j ? 'L' : 'M') + p.x + ' ' + p.y; @@ -119,14 +121,12 @@ L.Polyline = L.Path.extend({ this._parts = []; var parts = this._parts, - vp = this._map._pathViewport, - lu = L.LineUtil; + vp = this._map._pathViewport; for (i = 0, k = 0; i < len - 1; i++) { - segment = lu.clipSegment(points[i], points[i + 1], vp, i); - if (!segment) { - continue; - } + segment = L.LineUtil.clipSegment(points[i], points[i + 1], vp, i); + + if (!segment) { continue; } parts[k] = parts[k] || []; parts[k].push(segment[0]); @@ -142,10 +142,10 @@ L.Polyline = L.Path.extend({ // simplify each clipped part of the polyline _simplifyPoints: function () { var parts = this._parts, - lu = L.LineUtil; + tolerance = this.options.smoothFactor; for (var i = 0, len = parts.length; i < len; i++) { - parts[i] = lu.simplify(parts[i], this.options.smoothFactor); + parts[i] = L.LineUtil.simplify(parts[i], tolerance); } }, From db8f888c17e78bbe448773d7c8075aa0be7a960a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Dec 2013 17:46:53 +0200 Subject: [PATCH 0612/2207] significantly clean up DomEvent.Pointer code --- src/dom/DomEvent.Pointer.js | 180 +++++++++++++----------------------- 1 file changed, 66 insertions(+), 114 deletions(-) diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 4957fcd10e8..824ecc3b871 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -4,152 +4,104 @@ L.extend(L.DomEvent, { - //static - POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', - POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', - POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', + POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', + POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', + POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', - _pointers: [], - _pointerDocumentListener: false, + _pointers: {}, // Provides a touch events wrapper for (ms)pointer events. - // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 - //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 + // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 addPointerListener: function (obj, type, handler, id) { - switch (type) { - case 'touchstart': - return this.addPointerListenerStart(obj, type, handler, id); - case 'touchend': - return this.addPointerListenerEnd(obj, type, handler, id); - case 'touchmove': - return this.addPointerListenerMove(obj, type, handler, id); - default: - throw 'Unknown touch event type'; + if (type === 'touchstart') { + this._addPointerStart(obj, handler, id); + + } else if (type === 'touchmove') { + this._addPointerMove(obj, handler, id); + + } else if (type === 'touchend') { + this._addPointerEnd(obj, handler, id); } + + return this; }, - addPointerListenerStart: function (obj, type, handler, id) { - var pre = '_leaflet_', - pointers = this._pointers; + removePointerListener: function (obj, type, id) { + var handler = obj['_leaflet_' + type + id]; - var cb = function (e) { + if (type === 'touchstart') { + obj.removeEventListener(this.POINTER_DOWN, handler, false); - L.DomEvent.preventDefault(e); + } else if (type === 'touchmove') { + obj.removeEventListener(this.POINTER_MOVE, handler, false); - var alreadyInArray = false; - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - alreadyInArray = true; - break; - } - } - if (!alreadyInArray) { - pointers.push(e); - } - - e.touches = pointers.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchstart' + id] = cb; - obj.addEventListener(this.POINTER_DOWN, cb, false); - - // need to also listen for end events to keep the _pointers list accurate - // this needs to be on the body and never go away - if (!this._pointerDocumentListener) { - var internalCb = function (e) { - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - pointers.splice(i, 1); - break; - } - } - }; - //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(this.POINTER_UP, internalCb, false); - document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false); - - this._pointerDocumentListener = true; + } else if (type === 'touchend') { + obj.removeEventListener(this.POINTER_UP, handler, false); + obj.removeEventListener(this.POINTER_CANCEL, handler, false); } return this; }, - addPointerListenerMove: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; + _addPointerStart: function (obj, handler, id) { + var onDown = L.bind(function (e) { + L.DomEvent.preventDefault(e); - function cb(e) { + this._pointers[e.pointerId] = e; + this._handlePointer(e, handler); + }, this); - // don't fire touch moves when mouse isn't down - if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } + obj['_leaflet_touchstart' + id] = onDown; + obj.addEventListener(this.POINTER_DOWN, onDown, false); - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches[i] = e; - break; - } - } + // need to also listen for end events to keep the _pointers object accurate + if (!this._pointerDocListener) { + var removePointer = L.bind(function (e) { + delete this._pointers[e.pointerId]; + }, this); - e.touches = touches.slice(); - e.changedTouches = [e]; + // we listen documentElement as any drags that end by moving the touch off the screen get fired there + document.documentElement.addEventListener(this.POINTER_UP, removePointer, false); + document.documentElement.addEventListener(this.POINTER_CANCEL, removePointer, false); - handler(e); + this._pointerDocListener = true; } - - obj[pre + 'touchmove' + id] = cb; - obj.addEventListener(this.POINTER_MOVE, cb, false); - - return this; }, - addPointerListenerEnd: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; - - var cb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); - break; - } - } + _handlePointer: function (e, handler) { + e.touches = []; + for (var i in this._pointers) { + e.touches.push(this._pointers[i]); + } + e.changedTouches = [e]; - e.touches = touches.slice(); - e.changedTouches = [e]; + handler(e); + }, - handler(e); - }; + _addPointerMove: function (obj, handler, id) { + var onMove = L.bind(function (e) { + // don't fire touch moves when mouse isn't down + if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } - obj[pre + 'touchend' + id] = cb; - obj.addEventListener(this.POINTER_UP, cb, false); - obj.addEventListener(this.POINTER_CANCEL, cb, false); + this._pointers[e.pointerId] = e; + this._handlePointer(e, handler); + }, this); - return this; + obj['_leaflet_touchmove' + id] = onMove; + obj.addEventListener(this.POINTER_MOVE, onMove, false); }, - removePointerListener: function (obj, type, id) { - var pre = '_leaflet_', - cb = obj[pre + type + id]; - - switch (type) { - case 'touchstart': - obj.removeEventListener(this.POINTER_DOWN, cb, false); - break; - case 'touchmove': - obj.removeEventListener(this.POINTER_MOVE, cb, false); - break; - case 'touchend': - obj.removeEventListener(this.POINTER_UP, cb, false); - obj.removeEventListener(this.POINTER_CANCEL, cb, false); - break; - } + _addPointerEnd: function (obj, handler, id) { + var onUp = L.bind(function (e) { + delete this._pointers[e.pointerId]; + this._handlePointer(e, handler); + }, this); - return this; + obj['_leaflet_touchend' + id] = onUp; + obj.addEventListener(this.POINTER_UP, onUp, false); + obj.addEventListener(this.POINTER_CANCEL, onUp, false); } }); From c287eccef3de7bd8b33e662d8551d4e09497a09e Mon Sep 17 00:00:00 2001 From: danzel Date: Fri, 6 Dec 2013 14:36:56 +1300 Subject: [PATCH 0613/2207] Don't crash when double tap zooming on pointer if a property is null. --- src/dom/DomEvent.DoubleTap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index 73655d3a4e6..1e981d98448 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -49,7 +49,7 @@ L.extend(L.DomEvent, { for (i in touch) { prop = touch[i]; - newTouch[i] = prop.bind ? prop.bind(touch) : prop; + newTouch[i] = prop && prop.bind ? prop.bind(touch) : prop; } touch = newTouch; } From 46a379adb72978ddd1a78342d68c494c5cdad1ba Mon Sep 17 00:00:00 2001 From: danzel Date: Fri, 6 Dec 2013 14:54:48 +1300 Subject: [PATCH 0614/2207] A transitionEnd event only finished a zoom animation if it is for a transform. Fixes #2255 --- src/map/anim/Map.ZoomAnimation.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index e40a840f1e0..ead4fbd1a12 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -24,8 +24,8 @@ if (L.DomUtil.TRANSITION) { L.Map.include(!L.DomUtil.TRANSITION ? {} : { - _catchTransitionEnd: function () { - if (this._animatingZoom) { + _catchTransitionEnd: function (e) { + if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { this._onZoomTransitionEnd(); } }, From a30a872a78b939835ddfda9e75bcbbe7aa060c16 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 19:16:17 +0200 Subject: [PATCH 0615/2207] initial Layer commit (base class for all layers) --- build/deps.js | 1 + src/layer/FeatureGroup.js | 1 - src/layer/ImageOverlay.js | 18 ++++-------------- src/layer/Layer.js | 18 ++++++++++++++++++ src/layer/LayerGroup.js | 8 ++------ src/layer/Popup.js | 16 ++++------------ src/layer/marker/Marker.js | 9 +-------- src/layer/tile/GridLayer.js | 22 ++++++---------------- src/layer/vector/Path.js | 8 +------- 9 files changed, 37 insertions(+), 64 deletions(-) create mode 100644 src/layer/Layer.js diff --git a/build/deps.js b/build/deps.js index 40a9974214a..202c0d40813 100644 --- a/build/deps.js +++ b/build/deps.js @@ -17,6 +17,7 @@ var deps = { 'geo/crs/CRS.Simple.js', 'geo/crs/CRS.EPSG3857.js', 'geo/crs/CRS.EPSG4326.js', + 'layer/Layer.js', 'map/Map.js'], desc: 'The core of the library, including OOP, events, DOM facilities, basic units, projections (EPSG:3857 and EPSG:4326) and the base Map class.' }, diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index dbff15de04c..79bde8810f4 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -4,7 +4,6 @@ */ L.FeatureGroup = L.LayerGroup.extend({ - includes: L.Mixin.Events, statics: { EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose' diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 361224afae0..c62b03fbeb2 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -2,8 +2,7 @@ * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). */ -L.ImageOverlay = L.Class.extend({ - includes: L.Mixin.Events, +L.ImageOverlay = L.Layer.extend({ options: { opacity: 1 @@ -24,7 +23,7 @@ L.ImageOverlay = L.Class.extend({ this._initImage(); } - this._getPane().appendChild(this._image); + this.getPane().appendChild(this._image); map.on(this._getEvents(), this); @@ -37,11 +36,6 @@ L.ImageOverlay = L.Class.extend({ map.off(this._getEvents(), this); }, - addTo: function (map) { - map.addLayer(this); - return this; - }, - setOpacity: function (opacity) { this.options.opacity = opacity; this._updateOpacity(); @@ -51,13 +45,13 @@ L.ImageOverlay = L.Class.extend({ // TODO remove bringToFront/bringToBack duplication from TileLayer/Path bringToFront: function () { if (this._image) { - this._getPane().appendChild(this._image); + this.getPane().appendChild(this._image); } return this; }, bringToBack: function () { - var pane = this._getPane(); + var pane = this.getPane(); if (this._image) { pane.insertBefore(this._image, pane.firstChild); } @@ -73,10 +67,6 @@ L.ImageOverlay = L.Class.extend({ return this.options.attribution; }, - _getPane: function () { - return this._map._panes.overlayPane; - }, - _getEvents: function () { var events = {viewreset: this._reset}; diff --git a/src/layer/Layer.js b/src/layer/Layer.js new file mode 100644 index 00000000000..89f244c29ce --- /dev/null +++ b/src/layer/Layer.js @@ -0,0 +1,18 @@ + +L.Layer = L.Class.extend({ + includes: L.Mixin.Events, + + options: { + pane: 'overlayPane' + }, + + addTo: function (map) { + map.addLayer(this); + return this; + }, + + getPane: function () { + // TODO make pane if not present + return this._map._panes[this.options.pane]; + } +}); diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index 396df1aa4eb..3673849b086 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -3,7 +3,8 @@ * you can manipulate the group (e.g. add/remove it) as one layer. */ -L.LayerGroup = L.Class.extend({ +L.LayerGroup = L.Layer.extend({ + initialize: function (layers) { this._layers = {}; @@ -76,11 +77,6 @@ L.LayerGroup = L.Class.extend({ this._map = null; }, - addTo: function (map) { - map.addLayer(this); - return this; - }, - eachLayer: function (method, context) { for (var i in this._layers) { method.call(context, this._layers[i]); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 31d0233a5a0..de6ae14fdb1 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -6,10 +6,11 @@ L.Map.mergeOptions({ closePopupOnClick: true }); -L.Popup = L.Class.extend({ - includes: L.Mixin.Events, +L.Popup = L.Layer.extend({ options: { + pane: 'popupPane', + minWidth: 50, maxWidth: 300, // maxHeight: , @@ -46,7 +47,7 @@ L.Popup = L.Class.extend({ L.DomUtil.setOpacity(this._container, 0); } - this._getPane().appendChild(this._container); + this.getPane().appendChild(this._container); map.on(this._getEvents(), this); this.update(); @@ -63,11 +64,6 @@ L.Popup = L.Class.extend({ } }, - addTo: function (map) { - map.addLayer(this); - return this; - }, - openOn: function (map) { map.openPopup(this); return this; @@ -130,10 +126,6 @@ L.Popup = L.Class.extend({ this._adjustPan(); }, - _getPane: function () { - return this._map._panes.popupPane; - }, - _getEvents: function () { var events = {viewreset: this._updatePosition}, options = this.options; diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index abf32e97e2b..18ca962ff59 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -2,9 +2,7 @@ * L.Marker is used to display clickable/draggable icons on the map. */ -L.Marker = L.Class.extend({ - - includes: L.Mixin.Events, +L.Marker = L.Layer.extend({ options: { icon: new L.Icon.Default(), @@ -40,11 +38,6 @@ L.Marker = L.Class.extend({ } }, - addTo: function (map) { - map.addLayer(this); - return this; - }, - onRemove: function (map) { if (this.dragging) { this.dragging.disable(); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 56ab8b24c24..38c670e8513 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -2,11 +2,11 @@ * L.GridLayer is used as base class for grid-like layers like TileLayer. */ -L.GridLayer = L.Class.extend({ - - includes: L.Mixin.Events, +L.GridLayer = L.Layer.extend({ options: { + pane: 'tilePane', + tileSize: 256, opacity: 1, @@ -53,14 +53,9 @@ L.GridLayer = L.Class.extend({ this._container = this._map = null; }, - addTo: function (map) { - map.addLayer(this); - return this; - }, - bringToFront: function () { if (this._map) { - var pane = this._getPane(); + var pane = this.getPane(); pane.appendChild(this._container); this._setAutoZIndex(pane, Math.max); } @@ -69,7 +64,7 @@ L.GridLayer = L.Class.extend({ bringToBack: function () { if (this._map) { - var pane = this._getPane(); + var pane = this.getPane(); pane.insertBefore(this._container, pane.firstChild); this._setAutoZIndex(pane, Math.min); } @@ -108,11 +103,6 @@ L.GridLayer = L.Class.extend({ return this; }, - _getPane: function () { - // TODO pane in options? - return this._map._panes.tilePane; - }, - _getEvents: function () { var events = { viewreset: this._reset, @@ -191,7 +181,7 @@ L.GridLayer = L.Class.extend({ this._updateOpacity(); } - this._getPane().appendChild(this._container); + this.getPane().appendChild(this._container); }, _reset: function (e) { diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 4f90b5eac4e..d8ad26d91b6 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -2,8 +2,7 @@ * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. */ -L.Path = L.Class.extend({ - includes: [L.Mixin.Events], +L.Path = L.Layer.extend({ statics: { // how much to extend the clip area around the map view @@ -64,11 +63,6 @@ L.Path = L.Class.extend({ }, this); }, - addTo: function (map) { - map.addLayer(this); - return this; - }, - onRemove: function (map) { L.DomUtil.remove(this._container); From 4011a6199f3895e1e43bb2f3d8fa77efa3180676 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 19:47:58 +0200 Subject: [PATCH 0616/2207] move add/removeLayer logic to Layer; ditch tilelayersload event --- spec/suites/map/MapSpec.js | 36 ++++++++++++-------- src/layer/Layer.js | 43 +++++++++++++++++++++++- src/map/Map.js | 69 ++------------------------------------ 3 files changed, 66 insertions(+), 82 deletions(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 122bba96e0c..064f1f0ef4d 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -199,16 +199,24 @@ describe("Map", function () { }); }); + function layerSpy() { + var layer = new L.Layer(); + layer.onAdd = sinon.spy(); + layer.onRemove = sinon.spy(); + return layer; + } + describe("#addLayer", function () { + it("calls layer.onAdd immediately if the map is ready", function () { - var layer = { onAdd: sinon.spy() }; + var layer = layerSpy(); map.setView([0, 0], 0); map.addLayer(layer); expect(layer.onAdd.called).to.be.ok(); }); it("calls layer.onAdd when the map becomes ready", function () { - var layer = { onAdd: sinon.spy() }; + var layer = layerSpy(); map.addLayer(layer); expect(layer.onAdd.called).not.to.be.ok(); map.setView([0, 0], 0); @@ -216,7 +224,7 @@ describe("Map", function () { }); it("does not call layer.onAdd if the layer is removed before the map becomes ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; + var layer = layerSpy(); map.addLayer(layer); map.removeLayer(layer); map.setView([0, 0], 0); @@ -224,7 +232,7 @@ describe("Map", function () { }); it("fires a layeradd event immediately if the map is ready", function () { - var layer = { onAdd: sinon.spy() }, + var layer = layerSpy(), spy = sinon.spy(); map.on('layeradd', spy); map.setView([0, 0], 0); @@ -233,7 +241,7 @@ describe("Map", function () { }); it("fires a layeradd event when the map becomes ready", function () { - var layer = { onAdd: sinon.spy() }, + var layer = layerSpy(), spy = sinon.spy(); map.on('layeradd', spy); map.addLayer(layer); @@ -243,7 +251,7 @@ describe("Map", function () { }); it("does not fire a layeradd event if the layer is removed before the map becomes ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, + var layer = layerSpy(), spy = sinon.spy(); map.on('layeradd', spy); map.addLayer(layer); @@ -253,7 +261,7 @@ describe("Map", function () { }); it("adds the layer before firing layeradd", function (done) { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; + var layer = layerSpy(); map.on('layeradd', function () { expect(map.hasLayer(layer)).to.be.ok(); done(); @@ -299,7 +307,7 @@ describe("Map", function () { describe("#removeLayer", function () { it("calls layer.onRemove if the map is ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; + var layer = layerSpy(); map.setView([0, 0], 0); map.addLayer(layer); map.removeLayer(layer); @@ -307,21 +315,21 @@ describe("Map", function () { }); it("does not call layer.onRemove if the layer was not added", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; + var layer = layerSpy(); map.setView([0, 0], 0); map.removeLayer(layer); expect(layer.onRemove.called).not.to.be.ok(); }); it("does not call layer.onRemove if the map is not ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; + var layer = layerSpy(); map.addLayer(layer); map.removeLayer(layer); expect(layer.onRemove.called).not.to.be.ok(); }); it("fires a layerremove event if the map is ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, + var layer = layerSpy(), spy = sinon.spy(); map.on('layerremove', spy); map.setView([0, 0], 0); @@ -331,7 +339,7 @@ describe("Map", function () { }); it("does not fire a layerremove if the layer was not added", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, + var layer = layerSpy(), spy = sinon.spy(); map.on('layerremove', spy); map.setView([0, 0], 0); @@ -340,7 +348,7 @@ describe("Map", function () { }); it("does not fire a layerremove if the map is not ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, + var layer = layerSpy(), spy = sinon.spy(); map.on('layerremove', spy); map.addLayer(layer); @@ -349,7 +357,7 @@ describe("Map", function () { }); it("removes the layer before firing layerremove", function (done) { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; + var layer = layerSpy(); map.on('layerremove', function () { expect(map.hasLayer(layer)).not.to.be.ok(); done(); diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 89f244c29ce..be91af7e5b0 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -7,10 +7,51 @@ L.Layer = L.Class.extend({ }, addTo: function (map) { - map.addLayer(this); + this._map = map; + + var id = L.stamp(this); + if (map._layers[id]) { return this; } + map._layers[id] = this; + + // TODO getMaxZoom, getMinZoom in ILayer (instead of options) + if (this.options && (!isNaN(this.options.maxZoom) || !isNaN(this.options.minZoom))) { + map._zoomBoundLayers[id] = this; + map._updateZoomLevels(); + } + + map.whenReady(this._layerAdd, this); + return this; }, + _layerAdd: function () { + // check in case layer gets added and then removed before the map is ready + if (!this._map.hasLayer(this)) { return; } + + this.onAdd(this._map); + this._map.fire('layeradd', {layer: this}); + }, + + removeFrom: function (map) { + var id = L.stamp(this); + if (!map._layers[id]) { return this; } + + if (map._loaded) { + this.onRemove(map); + } + + delete map._layers[id]; + + if (map._loaded) { + map.fire('layerremove', {layer: this}); + } + + if (map._zoomBoundLayers[id]) { + delete map._zoomBoundLayers[id]; + map._updateZoomLevels(); + } + }, + getPane: function () { // TODO make pane if not present return this._map._panes[this.options.pane]; diff --git a/src/map/Map.js b/src/map/Map.js index fe078f736ea..2a12a30261b 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -44,7 +44,6 @@ L.Map = L.Class.extend({ this._layers = {}; this._zoomBoundLayers = {}; - this._tileLayersNum = 0; this.callInitHooks(); @@ -152,61 +151,12 @@ L.Map = L.Class.extend({ }, addLayer: function (layer) { - // TODO method is too big, refactor - - var id = L.stamp(layer); - - if (this._layers[id]) { return this; } - - this._layers[id] = layer; - - // TODO getMaxZoom, getMinZoom in ILayer (instead of options) - if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { - this._zoomBoundLayers[id] = layer; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor!!! - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum++; - this._tileLayersToLoad++; - layer.on('load', this._onTileLayerLoad, this); - } - - if (this._loaded) { - this._layerAdd(layer); - } - + layer.addTo(this); return this; }, removeLayer: function (layer) { - var id = L.stamp(layer); - - if (!this._layers[id]) { return this; } - - if (this._loaded) { - layer.onRemove(this); - } - - delete this._layers[id]; - - if (this._loaded) { - this.fire('layerremove', {layer: layer}); - } - - if (this._zoomBoundLayers[id]) { - delete this._zoomBoundLayers[id]; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum--; - this._tileLayersToLoad--; - layer.off('load', this._onTileLayerLoad, this); - } - + layer.removeFrom(this); return this; }, @@ -568,14 +518,11 @@ L.Map = L.Class.extend({ this._initialTopLeftPoint._add(this._getMapPanePos()); } - this._tileLayersToLoad = this._tileLayersNum; - var loading = !this._loaded; this._loaded = true; if (loading) { this.fire('load'); - this.eachLayer(this._layerAdd, this); } this.fire('viewreset', {hard: !preserveMapOffset}); @@ -698,13 +645,6 @@ L.Map = L.Class.extend({ }); }, - _onTileLayerLoad: function () { - this._tileLayersToLoad--; - if (this._tileLayersNum && !this._tileLayersToLoad) { - this.fire('tilelayersload'); - } - }, - _clearHandlers: function () { for (var i = 0, len = this._handlers.length; i < len; i++) { this._handlers[i].disable(); @@ -720,11 +660,6 @@ L.Map = L.Class.extend({ return this; }, - _layerAdd: function (layer) { - layer.onAdd(this); - this.fire('layeradd', {layer: layer}); - }, - // private methods for getting map state From 36b8c7cf4dff080d989d86983082ac799958bdc0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 20:27:08 +0200 Subject: [PATCH 0617/2207] move zoom restricting logic to GridLayer --- src/layer/Layer.js | 11 ++--------- src/layer/tile/GridLayer.js | 5 +++++ src/map/Map.js | 36 +++++++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index be91af7e5b0..a8a4d792e66 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -13,10 +13,8 @@ L.Layer = L.Class.extend({ if (map._layers[id]) { return this; } map._layers[id] = this; - // TODO getMaxZoom, getMinZoom in ILayer (instead of options) - if (this.options && (!isNaN(this.options.maxZoom) || !isNaN(this.options.minZoom))) { - map._zoomBoundLayers[id] = this; - map._updateZoomLevels(); + if (this.beforeAdd) { + this.beforeAdd(map); } map.whenReady(this._layerAdd, this); @@ -45,11 +43,6 @@ L.Layer = L.Class.extend({ if (map._loaded) { map.fire('layerremove', {layer: this}); } - - if (map._zoomBoundLayers[id]) { - delete map._zoomBoundLayers[id]; - map._updateZoomLevels(); - } }, getPane: function () { diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 38c670e8513..1bdbbd5def1 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -44,11 +44,16 @@ L.GridLayer = L.Layer.extend({ this._update(); }, + beforeAdd: function (map) { + map._addZoomLimit(this); + }, + onRemove: function (map) { this._clearBgBuffer(); L.DomUtil.remove(this._container); map.off(this._getEvents(), this); + map._removeZoomLimit(this); this._container = this._map = null; }, diff --git a/src/map/Map.js b/src/map/Map.js index 2a12a30261b..d18ef685cc5 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -544,23 +544,37 @@ L.Map = L.Class.extend({ return this.getMaxZoom() - this.getMinZoom(); }, + _addZoomLimit: function (layer) { + if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + this._zoomBoundLayers[L.stamp(layer)] = layer; + this._updateZoomLevels(); + } + }, + + _removeZoomLimit: function (layer) { + var id = L.stamp(layer); + + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); + } + }, + _updateZoomLevels: function () { - var i, - minZoom = Infinity, + var minZoom = Infinity, maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); + oldZoomSpan = this._getZoomSpan(), + i; for (i in this._zoomBoundLayers) { - var layer = this._zoomBoundLayers[i]; - if (!isNaN(layer.options.minZoom)) { - minZoom = Math.min(minZoom, layer.options.minZoom); - } - if (!isNaN(layer.options.maxZoom)) { - maxZoom = Math.max(maxZoom, layer.options.maxZoom); - } + var options = this._zoomBoundLayers[i].options; + + minZoom = isNaN(options.minZoom) ? minZoom : Math.min(minZoom, options.minZoom); + maxZoom = isNaN(options.maxZoom) ? maxZoom : Math.max(maxZoom, options.maxZoom); } - if (i === undefined) { // we have no tilelayers + if (i === undefined) { + // we have no zoom restricting layers this._layersMaxZoom = this._layersMinZoom = undefined; } else { this._layersMaxZoom = maxZoom; From 789c35601775d47cbbd4747aa586b78a94c787c1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 20:47:43 +0200 Subject: [PATCH 0618/2207] fire add/remove events and manage _map in Layer --- src/control/Control.Scale.js | 2 -- src/control/Control.Zoom.js | 2 -- src/layer/ImageOverlay.js | 1 - src/layer/Layer.js | 6 +++++- src/layer/LayerGroup.js | 2 -- src/layer/Popup.js | 4 ---- src/layer/marker/Marker.js | 7 ------- src/layer/tile/GridLayer.js | 3 +-- src/layer/vector/Path.js | 9 --------- src/layer/vector/canvas/Path.Canvas.js | 2 -- 10 files changed, 6 insertions(+), 32 deletions(-) diff --git a/src/control/Control.Scale.js b/src/control/Control.Scale.js index 6f36b248b2e..b7b26b79b32 100644 --- a/src/control/Control.Scale.js +++ b/src/control/Control.Scale.js @@ -12,8 +12,6 @@ L.Control.Scale = L.Control.extend({ }, onAdd: function (map) { - this._map = map; - var className = 'leaflet-control-scale', container = L.DomUtil.create('div', className), options = this.options; diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 9e4f5c76c8a..92fdba77a3d 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -16,8 +16,6 @@ L.Control.Zoom = L.Control.extend({ container = L.DomUtil.create('div', zoomName + ' leaflet-bar'), options = this.options; - this._map = map; - this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, zoomName + '-in', container, this._zoomIn, this); this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index c62b03fbeb2..fa94c0b0f54 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -16,7 +16,6 @@ L.ImageOverlay = L.Layer.extend({ }, onAdd: function (map) { - this._map = map; this._animated = this._map.options.zoomAnimation && L.Browser.any3d; if (!this._image) { diff --git a/src/layer/Layer.js b/src/layer/Layer.js index a8a4d792e66..4c9f9b9902e 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -24,9 +24,10 @@ L.Layer = L.Class.extend({ _layerAdd: function () { // check in case layer gets added and then removed before the map is ready - if (!this._map.hasLayer(this)) { return; } + if (!this._map) { return; } this.onAdd(this._map); + this.fire('add'); this._map.fire('layeradd', {layer: this}); }, @@ -42,7 +43,10 @@ L.Layer = L.Class.extend({ if (map._loaded) { map.fire('layerremove', {layer: this}); + this.fire('remove'); } + + this._map = null; }, getPane: function () { diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index 3673849b086..03294553fa9 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -68,13 +68,11 @@ L.LayerGroup = L.Layer.extend({ }, onAdd: function (map) { - this._map = map; this.eachLayer(map.addLayer, map); }, onRemove: function (map) { this.eachLayer(map.removeLayer, map); - this._map = null; }, eachLayer: function (method, context) { diff --git a/src/layer/Popup.js b/src/layer/Popup.js index de6ae14fdb1..c27f602488d 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -35,8 +35,6 @@ L.Popup = L.Layer.extend({ }, onAdd: function (map) { - this._map = map; - if (!this._container) { this._initLayout(); } @@ -79,8 +77,6 @@ L.Popup = L.Layer.extend({ map.off(this._getEvents(), this); - this._map = null; - this.fire('close'); map.fire('popupclose', {popup: this}); diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 18ca962ff59..1fa1bd91110 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -23,7 +23,6 @@ L.Marker = L.Layer.extend({ }, onAdd: function (map) { - this._map = map; this._animated = map.options.zoomAnimation && map.options.markerZoomAnimation; map.on('viewreset', this.update, this); @@ -31,8 +30,6 @@ L.Marker = L.Layer.extend({ this._initIcon(); this.update(); - this.fire('add'); - if (this._animated) { map.on('zoomanim', this._animateZoom, this); } @@ -46,14 +43,10 @@ L.Marker = L.Layer.extend({ this._removeIcon(); this._removeShadow(); - this.fire('remove'); - map.off({ 'viewreset': this.update, 'zoomanim': this._animateZoom }, this); - - this._map = null; }, getLatLng: function () { diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 1bdbbd5def1..0d47a9f518c 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -28,7 +28,6 @@ L.GridLayer = L.Layer.extend({ }, onAdd: function (map) { - this._map = map; this._animated = map._zoomAnimated; this._initContainer(); @@ -55,7 +54,7 @@ L.GridLayer = L.Layer.extend({ map.off(this._getEvents(), this); map._removeZoomLimit(this); - this._container = this._map = null; + this._container = null; }, bringToFront: function () { diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index d8ad26d91b6..ad7fe9f4525 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -38,8 +38,6 @@ L.Path = L.Layer.extend({ }, onAdd: function (map) { - this._map = map; - if (!this._container) { this._initElements(); @@ -55,8 +53,6 @@ L.Path = L.Layer.extend({ this._map._pathRoot.appendChild(this._container); } - this.fire('add'); - map.on({ viewreset: this.projectLatlngs, moveend: this._updatePath @@ -66,11 +62,6 @@ L.Path = L.Layer.extend({ onRemove: function (map) { L.DomUtil.remove(this._container); - // Need to fire remove event before we set _map to null as the event hooks might need the object - this.fire('remove'); - - this._map = null; - // TODO move to Path.VML if (L.Browser.vml) { this._container = null; diff --git a/src/layer/vector/canvas/Path.Canvas.js b/src/layer/vector/canvas/Path.Canvas.js index d22f05756cd..2920b59863d 100644 --- a/src/layer/vector/canvas/Path.Canvas.js +++ b/src/layer/vector/canvas/Path.Canvas.js @@ -42,8 +42,6 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : } this._requestUpdate(); - - this._map = null; }, _requestUpdate: function () { From 57bfbc45e61a545c82072ad91a5713c4e70a2d1d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 20:48:00 +0200 Subject: [PATCH 0619/2207] simpler Map getMinZoom --- src/map/Map.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index d18ef685cc5..a730a39efa4 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -281,9 +281,7 @@ L.Map = L.Class.extend({ }, getMinZoom: function () { - return this.options.minZoom === undefined ? - (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) : - this.options.minZoom; + return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom; }, getMaxZoom: function () { From eeaec502ac3d21cfbf1d5ead304a57b904d0a1c2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 21:07:25 +0200 Subject: [PATCH 0620/2207] optimize layer add/remove with layers control present --- src/control/Control.Layers.js | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 99dfffab138..0a89837ad95 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -25,19 +25,13 @@ L.Control.Layers = L.Control.extend({ } }, - onAdd: function (map) { + onAdd: function () { this._initLayout(); this._update(); - map.on('layeradd layerremove', this._onLayerChange, this); - return this._container; }, - onRemove: function (map) { - map.off('layeradd layerremove', this._onLayerChange, this); - }, - addBaseLayer: function (layer, name) { this._addLayer(layer, name); return this._update(); @@ -49,6 +43,8 @@ L.Control.Layers = L.Control.extend({ }, removeLayer: function (layer) { + layer.off('add remove', this._onLayerChange, this); + delete this._layers[L.stamp(layer)]; return this._update(); }, @@ -108,6 +104,8 @@ L.Control.Layers = L.Control.extend({ }, _addLayer: function (layer, name, overlay) { + layer.on('add remove', this._onLayerChange, this); + var id = L.stamp(layer); this._layers[id] = { @@ -143,20 +141,16 @@ L.Control.Layers = L.Control.extend({ }, _onLayerChange: function (e) { - var obj = this._layers[L.stamp(e.layer)]; - - if (!obj) { return; } - if (!this._handlingClick) { this._update(); } - var type = obj.overlay ? - (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') : - (e.type === 'layeradd' ? 'baselayerchange' : null); + var type = e.target.overlay ? + (e.type === 'add' ? 'overlayadd' : 'overlayremove') : + (e.type === 'add' ? 'baselayerchange' : null); if (type) { - this._map.fire(type, obj); + this._map.fire(type, e.target); } }, From edca4a6075933a633341127d70a694c3bf98f9a8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 21:27:40 +0200 Subject: [PATCH 0621/2207] groups cleanup; fix getBounds when containing CircleMarkers --- src/layer/FeatureGroup.js | 6 ++---- src/layer/LayerGroup.js | 4 +--- src/map/Map.js | 4 +--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index 79bde8810f4..f7df9b857ce 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -14,9 +14,7 @@ L.FeatureGroup = L.LayerGroup.extend({ return this; } - if ('on' in layer) { - layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); - } + layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); L.LayerGroup.prototype.addLayer.call(this, layer); @@ -77,7 +75,7 @@ L.FeatureGroup = L.LayerGroup.extend({ var bounds = new L.LatLngBounds(); this.eachLayer(function (layer) { - bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); + bounds.extend((layer.getBounds || layer.getLatLng)()); }); return bounds; diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index 03294553fa9..bfd59703a7c 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -42,9 +42,7 @@ L.LayerGroup = L.Layer.extend({ }, hasLayer: function (layer) { - if (!layer) { return false; } - - return (layer in this._layers || this.getLayerId(layer) in this._layers); + return !layer || layer in this._layers || this.getLayerId(layer) in this._layers; }, clearLayers: function () { diff --git a/src/map/Map.js b/src/map/Map.js index a730a39efa4..03d679336ff 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -161,9 +161,7 @@ L.Map = L.Class.extend({ }, hasLayer: function (layer) { - if (!layer) { return false; } - - return (L.stamp(layer) in this._layers); + return !layer || L.stamp(layer) in this._layers; }, eachLayer: function (method, context) { From 64320fe3fa94d1330d7d229237e7cd2446af23f4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 21:34:58 +0200 Subject: [PATCH 0622/2207] remove Popup open/close (there are add/remove now) --- src/layer/Popup.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index c27f602488d..14da2bd1f22 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -54,7 +54,6 @@ L.Popup = L.Layer.extend({ L.DomUtil.setOpacity(this._container, 1); } - this.fire('open'); map.fire('popupopen', {popup: this}); if (this._source) { @@ -77,7 +76,6 @@ L.Popup = L.Layer.extend({ map.off(this._getEvents(), this); - this.fire('close'); map.fire('popupclose', {popup: this}); if (this._source) { From 6e0e00620969bec170fa958f4de9fcaebb36f8b7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 21:46:08 +0200 Subject: [PATCH 0623/2207] add Layer getEvents and manage listeners on map automatically --- src/layer/ImageOverlay.js | 10 +++------- src/layer/Layer.js | 18 +++++++++++++++--- src/layer/Popup.js | 5 +---- src/layer/marker/Marker.js | 22 +++++++++++----------- src/layer/tile/GridLayer.js | 5 +---- src/layer/vector/Path.js | 15 ++++++--------- 6 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index fa94c0b0f54..c8ebf75b7bb 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -16,7 +16,7 @@ L.ImageOverlay = L.Layer.extend({ }, onAdd: function (map) { - this._animated = this._map.options.zoomAnimation && L.Browser.any3d; + this._animated = map.options.zoomAnimation && L.Browser.any3d; if (!this._image) { this._initImage(); @@ -24,15 +24,11 @@ L.ImageOverlay = L.Layer.extend({ this.getPane().appendChild(this._image); - map.on(this._getEvents(), this); - this._reset(); }, - onRemove: function (map) { + onRemove: function () { L.DomUtil.remove(this._image); - - map.off(this._getEvents(), this); }, setOpacity: function (opacity) { @@ -66,7 +62,7 @@ L.ImageOverlay = L.Layer.extend({ return this.options.attribution; }, - _getEvents: function () { + getEvents: function () { var events = {viewreset: this._reset}; if (this._animated) { diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 4c9f9b9902e..25b803ef74b 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -23,15 +23,23 @@ L.Layer = L.Class.extend({ }, _layerAdd: function () { + var map = this._map; + // check in case layer gets added and then removed before the map is ready - if (!this._map) { return; } + if (!map) { return; } + + this.onAdd(map); + + if (this.getEvents) { + map.on(this.getEvents(), this); + } - this.onAdd(this._map); this.fire('add'); - this._map.fire('layeradd', {layer: this}); + map.fire('layeradd', {layer: this}); }, removeFrom: function (map) { + var id = L.stamp(this); if (!map._layers[id]) { return this; } @@ -39,6 +47,10 @@ L.Layer = L.Class.extend({ this.onRemove(map); } + if (this.getEvents) { + map.off(this.getEvents(), this); + } + delete map._layers[id]; if (map._loaded) { diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 14da2bd1f22..3d199372f6d 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -46,7 +46,6 @@ L.Popup = L.Layer.extend({ } this.getPane().appendChild(this._container); - map.on(this._getEvents(), this); this.update(); @@ -74,8 +73,6 @@ L.Popup = L.Layer.extend({ L.DomUtil.remove(this._container); } - map.off(this._getEvents(), this); - map.fire('popupclose', {popup: this}); if (this._source) { @@ -120,7 +117,7 @@ L.Popup = L.Layer.extend({ this._adjustPan(); }, - _getEvents: function () { + getEvents: function () { var events = {viewreset: this._updatePosition}, options = this.options; diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 1fa1bd91110..1eabdea15c2 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -25,28 +25,27 @@ L.Marker = L.Layer.extend({ onAdd: function (map) { this._animated = map.options.zoomAnimation && map.options.markerZoomAnimation; - map.on('viewreset', this.update, this); - this._initIcon(); this.update(); - - if (this._animated) { - map.on('zoomanim', this._animateZoom, this); - } }, - onRemove: function (map) { + onRemove: function () { if (this.dragging) { this.dragging.disable(); } this._removeIcon(); this._removeShadow(); + }, - map.off({ - 'viewreset': this.update, - 'zoomanim': this._animateZoom - }, this); + getEvents: function () { + var events = {viewreset: this.update}; + + if (this._animated) { + events.zoomanim = this._animateZoom; + } + + return events; }, getLatLng: function () { @@ -83,6 +82,7 @@ L.Marker = L.Layer.extend({ }, update: function () { + if (this._icon) { var pos = this._map.latLngToLayerPoint(this._latlng).round(); this._setPos(pos); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 0d47a9f518c..79955de9561 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -37,8 +37,6 @@ L.GridLayer = L.Layer.extend({ this._update = L.Util.limitExecByInterval(this._update, this.options.updateInterval, this); } - map.on(this._getEvents(), this); - this._reset(); this._update(); }, @@ -51,7 +49,6 @@ L.GridLayer = L.Layer.extend({ this._clearBgBuffer(); L.DomUtil.remove(this._container); - map.off(this._getEvents(), this); map._removeZoomLimit(this); this._container = null; @@ -107,7 +104,7 @@ L.GridLayer = L.Layer.extend({ return this; }, - _getEvents: function () { + getEvents: function () { var events = { viewreset: this._reset, moveend: this._update diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index ad7fe9f4525..263b7a4f37b 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -37,7 +37,7 @@ L.Path = L.Layer.extend({ L.setOptions(this, options); }, - onAdd: function (map) { + onAdd: function () { if (!this._container) { this._initElements(); @@ -52,14 +52,9 @@ L.Path = L.Layer.extend({ if (this._container) { this._map._pathRoot.appendChild(this._container); } - - map.on({ - viewreset: this.projectLatlngs, - moveend: this._updatePath - }, this); }, - onRemove: function (map) { + onRemove: function () { L.DomUtil.remove(this._container); // TODO move to Path.VML @@ -68,11 +63,13 @@ L.Path = L.Layer.extend({ this._stroke = null; this._fill = null; } + }, - map.off({ + getEvents: function () { + return { viewreset: this.projectLatlngs, moveend: this._updatePath - }, this); + }; }, /* From d70d03dbe1772e039eae2ba8785926f1fa8ada57 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 22:04:22 +0200 Subject: [PATCH 0624/2207] more implicit falsy options to save bytes / memory; --- src/control/Control.Scale.js | 4 ++-- src/layer/Popup.js | 7 ++++--- src/layer/marker/Icon.js | 8 ++++---- src/layer/tile/TileLayer.js | 2 +- src/map/ext/Map.Geolocation.js | 16 ++++++++-------- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/control/Control.Scale.js b/src/control/Control.Scale.js index b7b26b79b32..83b4ceaf079 100644 --- a/src/control/Control.Scale.js +++ b/src/control/Control.Scale.js @@ -7,8 +7,8 @@ L.Control.Scale = L.Control.extend({ position: 'bottomleft', maxWidth: 100, metric: true, - imperial: true, - updateWhenIdle: false + imperial: true + // updateWhenIdle: false }, onAdd: function (map) { diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 3d199372f6d..2206ab52154 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -22,8 +22,8 @@ L.Popup = L.Layer.extend({ // autoPanPaddingBottomRight: , closeButton: true, - keepInView: false, - className: '', + // keepInView: false, + // className: '', zoomAnimation: true }, @@ -142,7 +142,8 @@ L.Popup = L.Layer.extend({ _initLayout: function () { var prefix = 'leaflet-popup', container = this._container = L.DomUtil.create('div', - prefix + ' ' + this.options.className + ' leaflet-zoom-' + (this._animated ? 'animated' : 'hide')); + prefix + ' ' + (this.options.className || '') + + ' leaflet-zoom-' + (this._animated ? 'animated' : 'hide')); if (this.options.closeButton) { var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container); diff --git a/src/layer/marker/Icon.js b/src/layer/marker/Icon.js index cb9349398da..af6c9cdbadc 100644 --- a/src/layer/marker/Icon.js +++ b/src/layer/marker/Icon.js @@ -3,8 +3,8 @@ */ L.Icon = L.Class.extend({ + /* options: { - /* iconUrl: (String) (required) iconRetinaUrl: (String) (optional, used for retina devices if detected) iconSize: (Point) (can be set through CSS) @@ -14,9 +14,9 @@ L.Icon = L.Class.extend({ shadowRetinaUrl: (String) (optional, used for retina devices if detected) shadowSize: (Point) shadowAnchor: (Point) - */ - className: '' + className: (String) }, + */ initialize: function (options) { L.setOptions(this, options); @@ -52,7 +52,7 @@ L.Icon = L.Class.extend({ anchor = L.point(name === 'shadow' && options.shadowAnchor || options.iconAnchor || size && size.divideBy(2, true)); - img.className = 'leaflet-marker-' + name + ' ' + options.className; + img.className = 'leaflet-marker-' + name + ' ' + (options.className || ''); if (anchor) { img.style.marginLeft = (-anchor.x) + 'px'; diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 800a21f9fb6..76e983266f3 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -9,7 +9,7 @@ L.TileLayer = L.GridLayer.extend({ maxZoom: 18, subdomains: 'abc', - errorTileUrl: '', + // errorTileUrl: '', zoomOffset: 0, /* diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index d1b3ca1e537..0b135d5f5dc 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -4,12 +4,12 @@ L.Map.include({ _defaultLocateOptions: { - watch: false, - setView: false, - maxZoom: Infinity, - timeout: 10000, - maximumAge: 0, - enableHighAccuracy: false + timeout: 10000 + // watch: false + // setView: false + // maxZoom: + // maximumAge: 0 + // enableHighAccuracy: false }, locate: function (/*Object*/ options) { @@ -77,8 +77,8 @@ L.Map.include({ options = this._locateOptions; if (options.setView) { - var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); - this.setView(latlng, zoom); + var zoom = this.getBoundsZoom(bounds); + this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom); } var data = { From d55ffb07ec07450ced39e8878dcf1d814a6b026a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 5 Dec 2013 22:52:45 +0200 Subject: [PATCH 0625/2207] cleaner and more consistent zoom animation options --- src/layer/ImageOverlay.js | 9 +++------ src/layer/Layer.js | 2 ++ src/layer/Popup.js | 25 +++++++++++-------------- src/layer/marker/Marker.js | 6 +++--- src/layer/tile/GridLayer.js | 12 +++++------- src/layer/vector/Path.SVG.js | 7 ++----- src/layer/vector/canvas/Path.Canvas.js | 2 +- src/map/Map.js | 8 +++++--- src/map/anim/Map.ZoomAnimation.js | 9 +++++---- 9 files changed, 37 insertions(+), 43 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index c8ebf75b7bb..21355372ee3 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -15,9 +15,7 @@ L.ImageOverlay = L.Layer.extend({ L.setOptions(this, options); }, - onAdd: function (map) { - this._animated = map.options.zoomAnimation && L.Browser.any3d; - + onAdd: function () { if (!this._image) { this._initImage(); } @@ -65,7 +63,7 @@ L.ImageOverlay = L.Layer.extend({ getEvents: function () { var events = {viewreset: this._reset}; - if (this._animated) { + if (this._zoomAnimated) { events.zoomanim = this._animateZoom; } @@ -74,8 +72,7 @@ L.ImageOverlay = L.Layer.extend({ _initImage: function () { this._image = L.DomUtil.create('img', - 'leaflet-image-layer ' + - 'leaflet-zoom-' + (this._animated ? 'animated' : 'hide')); + 'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : '')); this._updateOpacity(); diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 25b803ef74b..06182225d4a 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -13,6 +13,8 @@ L.Layer = L.Class.extend({ if (map._layers[id]) { return this; } map._layers[id] = this; + this._zoomAnimated = map._zoomAnimated; + if (this.beforeAdd) { this.beforeAdd(map); } diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 2206ab52154..8d524e93d24 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -31,25 +31,23 @@ L.Popup = L.Layer.extend({ L.setOptions(this, options); this._source = source; - this._animated = L.Browser.any3d && this.options.zoomAnimation; }, onAdd: function (map) { + this._zoomAnimated = this._zoomAnimated && this.options.zoomAnimation; + if (!this._container) { this._initLayout(); } - var animFade = map.options.fadeAnimation; - - if (animFade) { + if (map._fadeAnimated) { L.DomUtil.setOpacity(this._container, 0); } this.getPane().appendChild(this._container); - this.update(); - if (animFade) { + if (map._fadeAnimated) { L.DomUtil.setOpacity(this._container, 1); } @@ -66,7 +64,7 @@ L.Popup = L.Layer.extend({ }, onRemove: function (map) { - if (map.options.fadeAnimation) { + if (map._fadeAnimated) { L.DomUtil.setOpacity(this._container, 0); setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200); } else { @@ -121,8 +119,8 @@ L.Popup = L.Layer.extend({ var events = {viewreset: this._updatePosition}, options = this.options; - if (this._animated) { - events.zoomanim = this._zoomAnimation; + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; } if ('closeOnClick' in options ? options.closeOnClick : this._map.options.closePopupOnClick) { events.preclick = this._close; @@ -143,7 +141,7 @@ L.Popup = L.Layer.extend({ var prefix = 'leaflet-popup', container = this._container = L.DomUtil.create('div', prefix + ' ' + (this.options.className || '') + - ' leaflet-zoom-' + (this._animated ? 'animated' : 'hide')); + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide')); if (this.options.closeButton) { var closeButton = this._closeButton = L.DomUtil.create('a', prefix + '-close-button', container); @@ -217,10 +215,9 @@ L.Popup = L.Layer.extend({ if (!this._map) { return; } var pos = this._map.latLngToLayerPoint(this._latlng), - animated = this._animated, offset = L.point(this.options.offset); - if (animated) { + if (this._zoomAnimated) { L.DomUtil.setPosition(this._container, pos); } else { offset = offset.add(pos); @@ -234,7 +231,7 @@ L.Popup = L.Layer.extend({ this._container.style.left = left + 'px'; }, - _zoomAnimation: function (e) { + _animateZoom: function (e) { var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center); L.DomUtil.setPosition(this._container, pos); }, @@ -247,7 +244,7 @@ L.Popup = L.Layer.extend({ containerWidth = this._containerWidth, layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); - if (this._animated) { + if (this._zoomAnimated) { layerPos._add(L.DomUtil.getPosition(this._container)); } diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 1eabdea15c2..dcec27ded1b 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -23,7 +23,7 @@ L.Marker = L.Layer.extend({ }, onAdd: function (map) { - this._animated = map.options.zoomAnimation && map.options.markerZoomAnimation; + this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation; this._initIcon(); this.update(); @@ -41,7 +41,7 @@ L.Marker = L.Layer.extend({ getEvents: function () { var events = {viewreset: this.update}; - if (this._animated) { + if (this._zoomAnimated) { events.zoomanim = this._animateZoom; } @@ -93,7 +93,7 @@ L.Marker = L.Layer.extend({ _initIcon: function () { var options = this.options, - classToAdd = 'leaflet-zoom-' + (this._animated ? 'animated' : 'hide'); + classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); var icon = options.icon.createIcon(this._icon), addIcon = false; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 79955de9561..143ac35d329 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -27,9 +27,7 @@ L.GridLayer = L.Layer.extend({ options = L.setOptions(this, options); }, - onAdd: function (map) { - this._animated = map._zoomAnimated; - + onAdd: function () { this._initContainer(); if (!this.options.updateWhenIdle) { @@ -114,7 +112,7 @@ L.GridLayer = L.Layer.extend({ events.move = this._update; } - if (this._animated) { + if (this._zoomAnimated) { events.zoomanim = this._animateZoom; events.zoomend = this._endZoomAnim; } @@ -168,7 +166,7 @@ L.GridLayer = L.Layer.extend({ this._container = L.DomUtil.create('div', 'leaflet-layer'); this._updateZIndex(); - if (this._animated) { + if (this._zoomAnimated) { var className = 'leaflet-tile-container leaflet-zoom-animated'; this._bgBuffer = L.DomUtil.create('div', className, this._container); @@ -197,7 +195,7 @@ L.GridLayer = L.Layer.extend({ this._tileContainer.innerHTML = ''; - if (this._animated && e && e.hard) { + if (this._zoomAnimated && e && e.hard) { this._clearBgBuffer(); } @@ -440,7 +438,7 @@ L.GridLayer = L.Layer.extend({ _visibleTilesReady: function () { this.fire('load'); - if (this._animated) { + if (this._zoomAnimated) { // clear scaled tiles after all new tiles are loaded (for performance) clearTimeout(this._clearBgBufferTimer); this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 300); diff --git a/src/layer/vector/Path.SVG.js b/src/layer/vector/Path.SVG.js index 72cb55a3ae7..26460f3f787 100644 --- a/src/layer/vector/Path.SVG.js +++ b/src/layer/vector/Path.SVG.js @@ -169,11 +169,8 @@ L.Map.include({ var root = this._pathRoot = L.Path.prototype._createElement('svg'); this._panes.overlayPane.appendChild(root); - var animated = this.options.zoomAnimation && L.Browser.any3d; - - L.DomUtil.addClass(root, 'leaflet-zoom-' + (animated ? 'animated' : 'hide')); - - if (animated) { + if (this._zoomAnimated) { + L.DomUtil.addClass(root, 'leaflet-zoom-animated'); this.on({ 'zoomanim': this._animatePathZoom, 'zoomend': this._endPathZoom diff --git a/src/layer/vector/canvas/Path.Canvas.js b/src/layer/vector/canvas/Path.Canvas.js index 2920b59863d..18c7d8830e0 100644 --- a/src/layer/vector/canvas/Path.Canvas.js +++ b/src/layer/vector/canvas/Path.Canvas.js @@ -164,7 +164,7 @@ L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} this._panes.overlayPane.appendChild(root); - if (this.options.zoomAnimation) { + if (this._zoomAnimated) { this._pathRoot.className = 'leaflet-zoom-animated'; this.on('zoomanim', this._animatePathZoom); this.on('zoomend', this._endPathZoom); diff --git a/src/map/Map.js b/src/map/Map.js index 03d679336ff..d6d41c720b8 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -15,9 +15,9 @@ L.Map = L.Class.extend({ layers: Array, */ - fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, + fadeAnimation: true, trackResize: true, - markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d + markerZoomAnimation: true }, initialize: function (id, options) { // (HTMLElement or String, Object) @@ -436,11 +436,13 @@ L.Map = L.Class.extend({ _initLayout: function () { var container = this._container; + this._fadeAnimated = this.options.fadeAnimation && L.Browser.any3d; + L.DomUtil.addClass(container, 'leaflet-container' + (L.Browser.touch ? ' leaflet-touch' : '') + (L.Browser.retina ? ' leaflet-retina' : '') + (L.Browser.ielt9 ? ' leaflet-oldie' : '') + - (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); + (this._fadeAnimated ? ' leaflet-fade-anim' : '')); var position = L.DomUtil.getStyle(container, 'position'); diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index ead4fbd1a12..bc1de154266 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -7,12 +7,13 @@ L.Map.mergeOptions({ zoomAnimationThreshold: 4 }); -if (L.DomUtil.TRANSITION) { +var zoomAnimated = L.DomUtil.TRANSITION && L.Browser.any3d && !L.Browser.mobileOpera; + +if (zoomAnimated) { L.Map.addInitHook(function () { // don't animate on browsers without hardware-accelerated transitions or old Android/Opera - this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION && - L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera; + this._zoomAnimated = this.options.zoomAnimation; // zoom transitions run with the same duration for all layers, so if one of transitionend events // happens after starting zoom animation (propagating to the map pane), we know that it ended globally @@ -22,7 +23,7 @@ if (L.DomUtil.TRANSITION) { }); } -L.Map.include(!L.DomUtil.TRANSITION ? {} : { +L.Map.include(!zoomAnimated ? {} : { _catchTransitionEnd: function (e) { if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { From 7f03570b8dd7d854b3d0c4b03c62866a1ae12c81 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 13:56:38 +0200 Subject: [PATCH 0626/2207] move Layer-related Map code from Map.js to Layer.js --- build/deps.js | 5 +-- src/layer/Layer.js | 74 ++++++++++++++++++++++++++++++++++++++++++++ src/map/Map.js | 76 ---------------------------------------------- 3 files changed, 77 insertions(+), 78 deletions(-) diff --git a/build/deps.js b/build/deps.js index 202c0d40813..9f632455deb 100644 --- a/build/deps.js +++ b/build/deps.js @@ -17,8 +17,9 @@ var deps = { 'geo/crs/CRS.Simple.js', 'geo/crs/CRS.EPSG3857.js', 'geo/crs/CRS.EPSG4326.js', - 'layer/Layer.js', - 'map/Map.js'], + 'map/Map.js', + 'layer/Layer.js' + ], desc: 'The core of the library, including OOP, events, DOM facilities, basic units, projections (EPSG:3857 and EPSG:4326) and the base Map class.' }, diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 06182225d4a..f99012a2603 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -68,3 +68,77 @@ L.Layer = L.Class.extend({ return this._map._panes[this.options.pane]; } }); + + +L.Map.addInitHook(function () { + this._layers = {}; + this._zoomBoundLayers = {}; + this._addLayers(this.options.layers); +}); + +L.Map.include({ + addLayer: function (layer) { + layer.addTo(this); + return this; + }, + + removeLayer: function (layer) { + layer.removeFrom(this); + return this; + }, + + hasLayer: function (layer) { + return !layer || L.stamp(layer) in this._layers; + }, + + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + _addLayers: function (layers) { + layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; + + for (var i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + }, + + _addZoomLimit: function (layer) { + if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + this._zoomBoundLayers[L.stamp(layer)] = layer; + this._updateZoomLevels(); + } + }, + + _removeZoomLimit: function (layer) { + var id = L.stamp(layer); + + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); + } + }, + + _updateZoomLevels: function () { + var minZoom = Infinity, + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); + + for (var i in this._zoomBoundLayers) { + var options = this._zoomBoundLayers[i].options; + + minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom); + maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom); + } + + this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom; + this._layersMinZoom = minZoom === Infinity ? undefined : minZoom; + + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire('zoomlevelschange'); + } + } +}); diff --git a/src/map/Map.js b/src/map/Map.js index d6d41c720b8..137ddc54088 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -42,12 +42,7 @@ L.Map = L.Class.extend({ this._handlers = []; - this._layers = {}; - this._zoomBoundLayers = {}; - this.callInitHooks(); - - this._addLayers(options.layers); }, @@ -150,27 +145,6 @@ L.Map = L.Class.extend({ return this.panTo(newCenter, options); }, - addLayer: function (layer) { - layer.addTo(this); - return this; - }, - - removeLayer: function (layer) { - layer.removeFrom(this); - return this; - }, - - hasLayer: function (layer) { - return !layer || L.stamp(layer) in this._layers; - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - invalidateSize: function (options) { if (!this._loaded) { return this; } @@ -482,14 +456,6 @@ L.Map = L.Class.extend({ return L.DomUtil.create('div', className, container || this._panes.objectsPane); }, - _addLayers: function (layers) { - layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; - - for (var i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - }, - // private methods that modify map state @@ -542,48 +508,6 @@ L.Map = L.Class.extend({ return this.getMaxZoom() - this.getMinZoom(); }, - _addZoomLimit: function (layer) { - if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { - this._zoomBoundLayers[L.stamp(layer)] = layer; - this._updateZoomLevels(); - } - }, - - _removeZoomLimit: function (layer) { - var id = L.stamp(layer); - - if (this._zoomBoundLayers[id]) { - delete this._zoomBoundLayers[id]; - this._updateZoomLevels(); - } - }, - - _updateZoomLevels: function () { - var minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(), - i; - - for (i in this._zoomBoundLayers) { - var options = this._zoomBoundLayers[i].options; - - minZoom = isNaN(options.minZoom) ? minZoom : Math.min(minZoom, options.minZoom); - maxZoom = isNaN(options.maxZoom) ? maxZoom : Math.max(maxZoom, options.maxZoom); - } - - if (i === undefined) { - // we have no zoom restricting layers - this._layersMaxZoom = this._layersMinZoom = undefined; - } else { - this._layersMaxZoom = maxZoom; - this._layersMinZoom = minZoom; - } - - if (oldZoomSpan !== this._getZoomSpan()) { - this.fire('zoomlevelschange'); - } - }, - _panInsideMaxBounds: function () { this.panInsideBounds(this.options.maxBounds); }, From d53bc0e4f81298092d919adfad82bca9883bc8f7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 14:34:04 +0200 Subject: [PATCH 0627/2207] accept name in Layer getPane, make Marker panes configurable --- src/layer/Layer.js | 5 +++-- src/layer/marker/Marker.js | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index f99012a2603..20cf3df98d0 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -63,9 +63,10 @@ L.Layer = L.Class.extend({ this._map = null; }, - getPane: function () { + getPane: function (name) { // TODO make pane if not present - return this._map._panes[this.options.pane]; + var paneName = name ? this.options[name] || name : this.options.pane; + return this._map._panes[paneName]; } }); diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index dcec27ded1b..876dedf084b 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -5,6 +5,8 @@ L.Marker = L.Layer.extend({ options: { + pane: 'markerPane', + icon: new L.Icon.Default(), // title: '', // alt: '', @@ -147,13 +149,11 @@ L.Marker = L.Layer.extend({ } - var panes = this._map._panes; - if (addIcon) { - panes.markerPane.appendChild(this._icon); + this.getPane().appendChild(this._icon); } if (newShadow && addShadow) { - panes.shadowPane.appendChild(this._shadow); + this.getPane('shadowPane').appendChild(this._shadow); } }, From 07f7c3c53f00128b32560f6056b37d54d0939a9e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 15:04:36 +0200 Subject: [PATCH 0628/2207] update changelog --- CHANGELOG.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa9fb07cb5d..90c56c2108a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,26 @@ Leaflet Changelog An in-progress version being developed on the `master` branch. Includes `stable` branch fixes. +This version contains a lot of beneficial but potentially breaking changes (especially if you're a plugin author), so please read through the changes carefully before upgrading. + +### Layers refactoring + +All Leaflet layers (including markers, popups, tile and vector layers) have been refactored to have a common parent, `Layer` class, that shares the basic logic of adding and removing. The leads to the following changes (documented in PR [#2266](https://github.com/Leaflet/Leaflet/pull/2266)): + +* Added `Layer` class which all layers added to a map should inherit from. +* Added `add` and `remove` events to all layers. +* Added `pane` option to all layers that can be changed (e.g. you can set `pane: 'overlayPane'` to a tile layer). +* Added `shadowPane` option to markers as well. +* Added `getEvents` method to all layers that returns an `{event: listener, ...}` hash; layers now manage its listeners automatically without having to do this in `onAdd`/`onRemove`. +* Improved performance of adding/removing layers with layers control present (instead of listening to any layer add/remove, the control only listens to layers added in configuration). +* Fixed `FeatureGroup` `getBounds` to work correctly when containing circle markers. +* Removed `Map` `tilelayersload` event. +* Removed `Popup` `open` and `close` events in favor of `add` and `remove` for consistency. +* Moved all layer-related logic in `Map.js` to `Layer.js`. + ### TileLayer & Projections refactoring -TileLayer code and everything projections-related has undergone a major refactoring, documented in [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): +TileLayer code and everything projections-related has undergone a major refactoring, documented in PR [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): #### TileLayer-related changes From 08b60749414ca4d919f3c3064b4339f75c1e4f4a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 15:45:48 +0200 Subject: [PATCH 0629/2207] update changelog [skip ci] --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c56c2108a..36fa81abf11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,8 @@ These changes were targeted at removing any hardcoded projection-specific logic * Added `DomUtil` `setClass` and `getClass` methods. * Removed `LatLng` `RAD_TO_DEG`, `DEG_TO_RAD` and `MAX_MARGIN` constants. * Added `LatLng` `equals` second argument `maxMargin`. +* Improved performance of layer objects construction. +* Added popup fade out animation. * Improved the build system (`jake build`) to report gzipped library size. @@ -66,6 +68,7 @@ These changes were targeted at removing any hardcoded projection-specific logic An in-progress version being developed on the `stable` branch. +* Fixed a bug where pinch-zooming quickly could occasionally leave the map at a fractional zoom thus breaking tile loading (by [@danzel](https://github.com/danzel)). [#2269](https://github.com/Leaflet/Leaflet/pull/2269) [#2255](https://github.com/Leaflet/Leaflet/issues/2255) [#1934](https://github.com/Leaflet/Leaflet/issues/1934) * Fixed tile flickering issues on some old Android 2/3 devices by disabling buggy hardware accelerated CSS there (by [@danzel](https://github.com/danzel)). [#2216](https://github.com/Leaflet/Leaflet/pull/2216) [#2198](https://github.com/Leaflet/Leaflet/issues/2198) * Fixed a regression that sometimes led to an error when you started pinch-zoom as the first action on the map (by [@danzel](https://github.com/danzel)). [#2259](https://github.com/Leaflet/Leaflet/pull/2259) [#2256](https://github.com/Leaflet/Leaflet/issues/2256) * Reverted `L.Util.template` optimizations to allow Leaflet to be used in eval-banning environments like browser extensions (performance gain was insignificant anyway) (by [@calvinmetcalf](https://github.com/calvinmetcalf)). [#2217](https://github.com/Leaflet/Leaflet/issues/2217) [#2209](https://github.com/Leaflet/Leaflet/issues/2209) [#1968](https://github.com/Leaflet/Leaflet/issues/1968) From eec19a441bc56e2c6db0dedc1719932464523cf0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 16:49:50 +0200 Subject: [PATCH 0630/2207] add Control & Layer remove method --- CHANGELOG.md | 1 + src/control/Control.js | 10 +++++----- src/layer/Layer.js | 12 ++++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36fa81abf11..b06c28a0e45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Added `Layer` class which all layers added to a map should inherit from. * Added `add` and `remove` events to all layers. * Added `pane` option to all layers that can be changed (e.g. you can set `pane: 'overlayPane'` to a tile layer). +* Added `remove` method to layers and controls (`marker.remove()` is now equivalent to `map.removeLayer(marker)`). * Added `shadowPane` option to markers as well. * Added `getEvents` method to all layers that returns an `{event: listener, ...}` hash; layers now manage its listeners automatically without having to do this in `onAdd`/`onRemove`. * Improved performance of adding/removing layers with layers control present (instead of listening to any layer add/remove, the control only listens to layers added in configuration). diff --git a/src/control/Control.js b/src/control/Control.js index 09340d79eba..d8750fc31aa 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -54,15 +54,15 @@ L.Control = L.Class.extend({ return this; }, - removeFrom: function (map) { + remove: function () { L.DomUtil.remove(this._container); - this._map = null; - if (this.onRemove) { - this.onRemove(map); + this.onRemove(this._map); } + this._map = null; + return this; }, @@ -87,7 +87,7 @@ L.Map.include({ }, removeControl: function (control) { - control.removeFrom(this); + control.remove(); return this; }, diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 20cf3df98d0..f73a96badbd 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -40,10 +40,12 @@ L.Layer = L.Class.extend({ map.fire('layeradd', {layer: this}); }, - removeFrom: function (map) { + remove: function () { - var id = L.stamp(this); - if (!map._layers[id]) { return this; } + var id = L.stamp(this), + map = this._map; + + if (!map || !map._layers[id]) { return this; } if (map._loaded) { this.onRemove(map); @@ -61,6 +63,8 @@ L.Layer = L.Class.extend({ } this._map = null; + + return this; }, getPane: function (name) { @@ -84,7 +88,7 @@ L.Map.include({ }, removeLayer: function (layer) { - layer.removeFrom(this); + layer.remove(); return this; }, From 512063d06fc2741e2e4558736b829a02b48c83d5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 17:50:21 +0200 Subject: [PATCH 0631/2207] update build to 0.7.1 --- dist/leaflet-src.js | 53 ++++++++++++++++++--------------------------- dist/leaflet.js | 8 +++---- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js index c6c6bde2daf..6928837f6f1 100644 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -7,7 +7,7 @@ var oldL = window.L, L = {}; -L.version = '0.7'; +L.version = '0.7.1'; // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { @@ -134,21 +134,16 @@ L.Util = { } return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); }, - - compileTemplate: function (str, data) { - // based on https://gist.github.com/padolsey/6008842 - str = str.replace(/"/g, '\\\"'); - str = str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { - return '" + o["' + key + '"]' + (typeof data[key] === 'function' ? '(o)' : '') + ' + "'; - }); - // jshint evil: true - return new Function('o', 'return "' + str + '";'); - }, - template: function (str, data) { - var cache = L.Util._templateCache = L.Util._templateCache || {}; - cache[str] = cache[str] || L.Util.compileTemplate(str, data); - return cache[str](data); + return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { + var value = data[key]; + if (value === undefined) { + throw new Error('No value provided for variable ' + str); + } else if (typeof value === 'function') { + value = value(data); + } + return value; + }); }, isArray: Array.isArray || function (obj) { @@ -534,7 +529,7 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; doc = document.documentElement, ie3d = ie && ('transition' in doc.style), - webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()), + webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, gecko3d = 'MozPerspective' in doc.style, opera3d = 'OTransition' in doc.style, any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; @@ -1070,11 +1065,6 @@ L.DomUtil = { if (!disable3D && L.Browser.any3d) { el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); - - // workaround for Android 2/3 stability (https://github.com/CloudMade/Leaflet/issues/69) - if (L.Browser.mobileWebkit3d) { - el.style.WebkitBackfaceVisibility = 'hidden'; - } } else { el.style.left = point.x + 'px'; el.style.top = point.y + 'px'; @@ -1770,6 +1760,8 @@ L.Map = L.Class.extend({ }, invalidateSize: function (options) { + if (!this._loaded) { return this; } + options = L.extend({ animate: false, pan: true @@ -1779,8 +1771,6 @@ L.Map = L.Class.extend({ this._sizeChanged = true; this._initialCenter = null; - if (!this._loaded) { return this; } - var newSize = this.getSize(), oldCenter = oldSize.divideBy(2).round(), newCenter = newSize.divideBy(2).round(), @@ -2858,11 +2848,9 @@ L.TileLayer = L.Class.extend({ /* Chrome 20 layouts much faster with top/left (verify with timeline, frames) Android 4 browser has display issues with top/left and requires transform instead - Android 2 browser requires top/left or tiles disappear on load or first drag - (reappear after zoom) https://github.com/CloudMade/Leaflet/issues/866 (other browsers don't currently care) - see debug/hacks/jitter.html for an example */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome || L.Browser.android23); + L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome); this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; @@ -4487,10 +4475,10 @@ L.FeatureGroup = L.LayerGroup.extend({ }, _propagateEvent: function (e) { - e = L.extend({}, e, { + e = L.extend({ layer: e.target, target: this - }); + }, e); this.fire(e.type, e); } }); @@ -5261,7 +5249,7 @@ L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} * and polylines (clipping, simplification, distances, etc.) */ -/*jshint bitwise:false */ // allow bitwise oprations for this file +/*jshint bitwise:false */ // allow bitwise operations for this file L.LineUtil = { @@ -5994,6 +5982,7 @@ L.CircleMarker = L.Circle.extend({ if (this._popup && this._popup._isOpen) { this._popup.setLatLng(latlng); } + return this; }, setRadius: function (radius) { @@ -6775,7 +6764,7 @@ L.Draggable = L.Class.extend({ L.DomUtil.enableImageDrag(); L.DomUtil.enableTextSelection(); - if (this._moved) { + if (this._moved && this._moving) { // ensure drag is not fired after dragend L.Util.cancelAnimFrame(this._animRequest); @@ -8909,8 +8898,8 @@ if (L.DomUtil.TRANSITION) { L.Map.include(!L.DomUtil.TRANSITION ? {} : { - _catchTransitionEnd: function () { - if (this._animatingZoom) { + _catchTransitionEnd: function (e) { + if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { this._onZoomTransitionEnd(); } }, diff --git a/dist/leaflet.js b/dist/leaflet.js index d778359c89d..59c843174be 100644 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -3,7 +3,7 @@ (c) 2010-2013, Vladimir Agafonkin (c) 2010-2011, CloudMade */ -!function(t,e,i){var n=t.L,o={};o.version="0.7","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},compileTemplate:function(t,e){return t=t.replace(/"/g,'\\"'),t=t.replace(/\{ *([\w_]+) *\}/g,function(t,i){return'" + o["'+i+'"]'+("function"==typeof e[i]?"(o)":"")+' + "'}),new Function("o",'return "'+t+'";')},template:function(t,e){var i=o.Util._templateCache=o.Util._templateCache||{};return i[t]=i[t]||o.Util.compileTemplate(t,e),i[t](e)},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints&&!t.PointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return s=e&&e.maxZoom?Math.min(e.maxZoom,s):s,this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();if(this._sizeChanged=!0,this._initialCenter=null,!this._loaded)return this;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c; -return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome||o.Browser.android23),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this.options.tileSize)},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({},t,{layer:t.target,target:this}),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=e.body,s=e.documentElement,a=o.DomUtil.documentIsLtr()?t.pageX?t.pageX-n.scrollLeft-s.scrollLeft:t.clientX:o.Browser.gecko?t.pageX-n.scrollLeft-s.scrollLeft:t.pageX?t.pageX-n.scrollLeft+s.scrollLeft:t.clientX,r=t.pageY?t.pageY-n.scrollTop-s.scrollTop:t.clientY,h=new o.Point(a,r);if(!i)return h;var l=i.getBoundingClientRect(),u=l.left-i.clientLeft,c=l.top-i.clientTop;return h._subtract(new o.Point(u,c))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return this._moved=!0,void 0;var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),o.DomUtil.addClass(t.target||t.srcElement,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){o.DomUtil.removeClass(e.body,"leaflet-dragging"),o.DomUtil.removeClass(t.target||t.srcElement,"leaflet-drag-target");for(var i in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[i],this._onMove).off(e,o.Draggable.END[i],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this -}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return this._zooming=!1,void 0;var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),void 0)},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file +!function(t,e,i){var n=t.L,o={};o.version="0.7.1","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints&&!t.PointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return s=e&&e.maxZoom?Math.min(e.maxZoom,s):s,this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_; +return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this.options.tileSize)},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var n=e.body,s=e.documentElement,a=o.DomUtil.documentIsLtr()?t.pageX?t.pageX-n.scrollLeft-s.scrollLeft:t.clientX:o.Browser.gecko?t.pageX-n.scrollLeft-s.scrollLeft:t.pageX?t.pageX-n.scrollLeft+s.scrollLeft:t.clientX,r=t.pageY?t.pageY-n.scrollTop-s.scrollTop:t.clientY,h=new o.Point(a,r);if(!i)return h;var l=i.getBoundingClientRect(),u=l.left-i.clientLeft,c=l.top-i.clientTop;return h._subtract(new o.Point(u,c))},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return this._moved=!0,void 0;var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),o.DomUtil.addClass(t.target||t.srcElement,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){o.DomUtil.removeClass(e.body,"leaflet-dragging"),o.DomUtil.removeClass(t.target||t.srcElement,"leaflet-drag-target");for(var i in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[i],this._onMove).off(e,o.Draggable.END[i],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t); +for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return this._zooming=!1,void 0;var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),void 0)},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file From cb37d25dbe4325cecf4537cb5a965c28f66b3b04 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 17:53:40 +0200 Subject: [PATCH 0632/2207] update index and download pages for 0.7.1 --- download.md | 8 ++++---- index.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/download.md b/download.md index efad0395c0f..778ce2fda41 100644 --- a/download.md +++ b/download.md @@ -11,8 +11,8 @@ title: Download Description - Leaflet 0.7 - Stable version, released on November 18, 2013. + Leaflet 0.7.1 + Stable version, released on November 18, 2013 and last updated on December 6, 2013. Leaflet 0.6.4 @@ -34,8 +34,8 @@ so please read the changelog carefully when upgrading to it. The latest stable Leaflet release is hosted on a CDN — to start using it straight away, place this in the `head` of your HTML code: - - + + ### Leaflet Source Code diff --git a/index.md b/index.md index 1112c02fe0e..d66d63b9baf 100644 --- a/index.md +++ b/index.md @@ -6,7 +6,7 @@ layout: default Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. -Weighing just about 34 KB of JS, +Weighing just about 33 KB of JS, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. From f3b2e74a3a77249dd03b9dc809e7c94c837e8644 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Dec 2013 17:59:33 +0200 Subject: [PATCH 0633/2207] update changelog [skip ci] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b06c28a0e45..283a0c8f7b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,9 +65,9 @@ These changes were targeted at removing any hardcoded projection-specific logic * Improved the build system (`jake build`) to report gzipped library size. -## 0.7.1-dev (stable) +## 0.7.1 (December 6, 2013) -An in-progress version being developed on the `stable` branch. +A follow-up bugfix release to the recent stable version. * Fixed a bug where pinch-zooming quickly could occasionally leave the map at a fractional zoom thus breaking tile loading (by [@danzel](https://github.com/danzel)). [#2269](https://github.com/Leaflet/Leaflet/pull/2269) [#2255](https://github.com/Leaflet/Leaflet/issues/2255) [#1934](https://github.com/Leaflet/Leaflet/issues/1934) * Fixed tile flickering issues on some old Android 2/3 devices by disabling buggy hardware accelerated CSS there (by [@danzel](https://github.com/danzel)). [#2216](https://github.com/Leaflet/Leaflet/pull/2216) [#2198](https://github.com/Leaflet/Leaflet/issues/2198) From 5cc602ec0a89885fe8693b5c5b93bff8026711aa Mon Sep 17 00:00:00 2001 From: Lyzi Diamond Date: Fri, 6 Dec 2013 14:30:02 -0800 Subject: [PATCH 0634/2207] Change example to use Leaflet 0.7 --- examples/quick-start.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 0919c871be6..6b77f6b101c 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,14 +19,14 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS files in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From e0e3721f13f73e697a86a66c7ec114009c3254a3 Mon Sep 17 00:00:00 2001 From: Lyzi Diamond Date: Fri, 6 Dec 2013 14:40:07 -0800 Subject: [PATCH 0635/2207] Update to 0.7.1 --- examples/quick-start.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 6b77f6b101c..46114f954dd 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,14 +19,14 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS files in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From 369290d90db71994abed0a064423e14fbe5326b1 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 9 Dec 2013 15:59:20 +0100 Subject: [PATCH 0636/2207] Firefox has a Object.prototype.watch method --- src/map/ext/Map.Geolocation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index 0b135d5f5dc..09d84cf095d 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -27,7 +27,7 @@ L.Map.include({ var onResponse = L.bind(this._handleGeolocationResponse, this), onError = L.bind(this._handleGeolocationError, this); - if (options.watch) { + if (options.hasOwnProperty('watch') && options.watch) { this._locationWatchId = navigator.geolocation.watchPosition(onResponse, onError, options); } else { From 4a42dc07d792e27f1224bd34b5438ac060b824d3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 10 Dec 2013 01:53:19 +0100 Subject: [PATCH 0637/2207] minor code readability fix --- src/layer/Layer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index f73a96badbd..efd5c4d02fc 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -69,7 +69,7 @@ L.Layer = L.Class.extend({ getPane: function (name) { // TODO make pane if not present - var paneName = name ? this.options[name] || name : this.options.pane; + var paneName = name ? (this.options[name] || name) : this.options.pane; return this._map._panes[paneName]; } }); From f1d2b0d5df071c884afebadfbe4ea282961b6cc4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 10 Dec 2013 11:17:40 +0100 Subject: [PATCH 0638/2207] revert commenting out watch for terser code #2274 --- src/map/ext/Map.Geolocation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index 09d84cf095d..515db2ab155 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -4,8 +4,8 @@ L.Map.include({ _defaultLocateOptions: { - timeout: 10000 - // watch: false + timeout: 10000, + watch: false // setView: false // maxZoom: // maximumAge: 0 @@ -27,7 +27,7 @@ L.Map.include({ var onResponse = L.bind(this._handleGeolocationResponse, this), onError = L.bind(this._handleGeolocationError, this); - if (options.hasOwnProperty('watch') && options.watch) { + if (options.watch) { this._locationWatchId = navigator.geolocation.watchPosition(onResponse, onError, options); } else { From 27cd306e6b757c13937eefefca69bbcca65a3921 Mon Sep 17 00:00:00 2001 From: danzel Date: Thu, 12 Dec 2013 09:30:11 +1300 Subject: [PATCH 0639/2207] Change touch detection check for ontouchstart in window like modernizr does. Fixes chrome touch emulation. Fixes #2277 --- src/core/Browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index ae327c5dc42..5015e730462 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -30,7 +30,7 @@ retina = matches && matches.matches; } - var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in doc || + var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch)); L.Browser = { From 83f10b60395d688f56f70cc21981a19cfb8282c5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Dec 2013 17:33:56 -0500 Subject: [PATCH 0640/2207] bump CDN link (the original was a bit broken) --- download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.md b/download.md index 778ce2fda41..f192581de4f 100644 --- a/download.md +++ b/download.md @@ -35,7 +35,7 @@ The latest stable Leaflet release is hosted on a CDN — to start using it straight away, place this in the `head` of your HTML code: - + ### Leaflet Source Code From 972386c965978ce49ff7278e059907e4dcd9d647 Mon Sep 17 00:00:00 2001 From: davidcalhoun Date: Wed, 11 Dec 2013 14:51:56 -0800 Subject: [PATCH 0641/2207] fix typo (attching -> attaching) --- examples/quick-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 46114f954dd..fe9988facfc 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -101,7 +101,7 @@ Popups are usually used when you want to attach some information to a particular Try clicking on our objects. The `bindPopup` method attaches a popup with the specified HTML content to your marker so the popup appears when you click on the object, and the `openPopup` method (for markers only) immediately opens the attached popup. -You can also use popups as layers (when you need something more than attching a popup to an object): +You can also use popups as layers (when you need something more than attaching a popup to an object): var popup = L.popup() .setLatLng([51.5, -0.09]) From 4e9b8a42e98222affb94b225be30dbc26e9d87a5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 11 Dec 2013 18:13:00 -0500 Subject: [PATCH 0642/2207] call addLayers after initHooks where anim is detected, fixes #2281 --- src/layer/Layer.js | 6 ------ src/map/Map.js | 5 ++++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index efd5c4d02fc..bf15720789c 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -75,12 +75,6 @@ L.Layer = L.Class.extend({ }); -L.Map.addInitHook(function () { - this._layers = {}; - this._zoomBoundLayers = {}; - this._addLayers(this.options.layers); -}); - L.Map.include({ addLayer: function (layer) { layer.addTo(this); diff --git a/src/map/Map.js b/src/map/Map.js index 137ddc54088..5ed1b6f6cc1 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -23,7 +23,6 @@ L.Map = L.Class.extend({ initialize: function (id, options) { // (HTMLElement or String, Object) options = L.setOptions(this, options); - this._initContainer(id); this._initLayout(); @@ -41,8 +40,12 @@ L.Map = L.Class.extend({ } this._handlers = []; + this._layers = {}; + this._zoomBoundLayers = {}; this.callInitHooks(); + + this._addLayers(this.options.layers); }, From 8c3010ca88f074e7a8ae1f21c4f6764eb59fad40 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Dec 2013 16:38:24 -0500 Subject: [PATCH 0643/2207] fix FeatureGroup getBounds --- src/layer/FeatureGroup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index f7df9b857ce..a917db1d026 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -75,7 +75,7 @@ L.FeatureGroup = L.LayerGroup.extend({ var bounds = new L.LatLngBounds(); this.eachLayer(function (layer) { - bounds.extend((layer.getBounds || layer.getLatLng)()); + bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng()); }); return bounds; From de4f0353e15ff327816b1c094ef971aaef9aaebd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Dec 2013 16:47:58 -0500 Subject: [PATCH 0644/2207] fix Map hasLayer --- src/layer/Layer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index bf15720789c..13e0abd1e06 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -87,7 +87,7 @@ L.Map.include({ }, hasLayer: function (layer) { - return !layer || L.stamp(layer) in this._layers; + return layer || L.stamp(layer) in this._layers; }, eachLayer: function (method, context) { From 40a67a21139bad9e5420cee3a0fc9fd69b40e61f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Dec 2013 16:52:03 -0500 Subject: [PATCH 0645/2207] fix LayerGroup hasLayer --- src/layer/LayerGroup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index bfd59703a7c..feba709c8d6 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -42,7 +42,7 @@ L.LayerGroup = L.Layer.extend({ }, hasLayer: function (layer) { - return !layer || layer in this._layers || this.getLayerId(layer) in this._layers; + return layer && (layer in this._layers || this.getLayerId(layer) in this._layers); }, clearLayers: function () { From 69890a29cf2fed10fbc919d7e807363436b82c53 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Dec 2013 17:21:39 -0500 Subject: [PATCH 0646/2207] fix build --- src/layer/Layer.js | 2 +- src/layer/LayerGroup.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 13e0abd1e06..0a6cced0247 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -87,7 +87,7 @@ L.Map.include({ }, hasLayer: function (layer) { - return layer || L.stamp(layer) in this._layers; + return !!layer && (L.stamp(layer) in this._layers); }, eachLayer: function (method, context) { diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js index feba709c8d6..b11727525b3 100644 --- a/src/layer/LayerGroup.js +++ b/src/layer/LayerGroup.js @@ -42,7 +42,7 @@ L.LayerGroup = L.Layer.extend({ }, hasLayer: function (layer) { - return layer && (layer in this._layers || this.getLayerId(layer) in this._layers); + return !!layer && (layer in this._layers || this.getLayerId(layer) in this._layers); }, clearLayers: function () { From 773fa91d1e11327d2f3491ac3df59da312cea3ee Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Dec 2013 17:24:43 -0500 Subject: [PATCH 0647/2207] fix old IE and stricter jshinting --- build/hintrc.js | 1 + src/layer/tile/TileLayer.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/build/hintrc.js b/build/hintrc.js index 851591ad2d4..596aeafe6ee 100644 --- a/build/hintrc.js +++ b/build/hintrc.js @@ -7,6 +7,7 @@ "define": true }, "strict": false, + "es3": true, // code style "bitwise": true, diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 76e983266f3..f4885b4bbe5 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -10,7 +10,7 @@ L.TileLayer = L.GridLayer.extend({ subdomains: 'abc', // errorTileUrl: '', - zoomOffset: 0, + zoomOffset: 0 /* maxNativeZoom: , @@ -53,8 +53,8 @@ L.TileLayer = L.GridLayer.extend({ createTile: function (coords, done) { var tile = document.createElement('img'); - tile.onload = L.bind(this._tileOnLoad, this, done); - tile.onerror = L.bind(this._tileOnError, this, done); + tile.onload = L.bind(this._tileOnLoad, this, done, tile); + tile.onerror = L.bind(this._tileOnError, this, done, tile); tile.src = this.getTileUrl(coords); @@ -70,16 +70,16 @@ L.TileLayer = L.GridLayer.extend({ }, this.options)); }, - _tileOnLoad: function (done, e) { - done(null, e.target); + _tileOnLoad: function (done, tile, e) { + done(null, tile); }, - _tileOnError: function (done, e) { + _tileOnError: function (done, tile, e) { var errorUrl = this.options.errorTileUrl; if (errorUrl) { - e.target.src = errorUrl; + tile.src = errorUrl; } - done(e, e.target); + done(e, tile); }, _getTileSize: function () { From 5e0d3435012d5c32ad789855a1cc8fe12b4f705a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 13 Dec 2013 17:50:32 -0500 Subject: [PATCH 0648/2207] Fix build --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index f4885b4bbe5..77352bf5861 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -70,7 +70,7 @@ L.TileLayer = L.GridLayer.extend({ }, this.options)); }, - _tileOnLoad: function (done, tile, e) { + _tileOnLoad: function (done, tile) { done(null, tile); }, From c1654c46268ac1b085d3855438a3fd0f5374f03e Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 13 Dec 2013 17:51:37 -0500 Subject: [PATCH 0649/2207] Add hasLayer tests --- spec/suites/layer/LayerGroupSpec.js | 13 +++++++++++++ spec/suites/map/MapSpec.js | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/spec/suites/layer/LayerGroupSpec.js b/spec/suites/layer/LayerGroupSpec.js index 98ce5e2b511..21220f8e198 100644 --- a/spec/suites/layer/LayerGroupSpec.js +++ b/spec/suites/layer/LayerGroupSpec.js @@ -1,4 +1,13 @@ describe('LayerGroup', function () { + describe("#hasLayer", function () { + it("returns false when passed undefined, null, or false", function () { + var lg = L.layerGroup(); + expect(lg.hasLayer(undefined)).to.equal(false); + expect(lg.hasLayer(null)).to.equal(false); + expect(lg.hasLayer(false)).to.equal(false); + }); + }); + describe("#addLayer", function () { it('adds a layer', function () { var lg = L.layerGroup(), @@ -9,6 +18,7 @@ expect(lg.hasLayer(marker)).to.be(true); }); }); + describe("#removeLayer", function () { it('removes a layer', function () { var lg = L.layerGroup(), @@ -20,6 +30,7 @@ expect(lg.hasLayer(marker)).to.be(false); }); }); + describe("#clearLayers", function () { it('removes all layers', function () { var lg = L.layerGroup(), @@ -31,6 +42,7 @@ expect(lg.hasLayer(marker)).to.be(false); }); }); + describe("#getLayers", function () { it('gets all layers', function () { var lg = L.layerGroup(), @@ -41,6 +53,7 @@ expect(lg.getLayers()).to.eql([marker]); }); }); + describe("#eachLayer", function () { it('iterates over all layers', function () { var lg = L.layerGroup(), diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 064f1f0ef4d..6d846f097dc 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -199,6 +199,15 @@ describe("Map", function () { }); }); + describe("#hasLayer", function () { + it("returns false when passed undefined, null, or false", function () { + var map = L.map(document.createElement('div')); + expect(map.hasLayer(undefined)).to.equal(false); + expect(map.hasLayer(null)).to.equal(false); + expect(map.hasLayer(false)).to.equal(false); + }); + }); + function layerSpy() { var layer = new L.Layer(); layer.onAdd = sinon.spy(); From af9302ce19c8d2825fed61f8dd9a367a575dde4d Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 13 Dec 2013 18:01:06 -0500 Subject: [PATCH 0650/2207] Make GridLayer methods safe to call pre-setView --- spec/suites/layer/tile/GridLayerSpec.js | 16 ++++++++++++++++ src/layer/tile/GridLayer.js | 8 ++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index 602140782a7..1a48ce70dff 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -16,6 +16,22 @@ describe('GridLayer', function () { document.body.removeChild(div); }); + describe('#redraw', function () { + it('can be called before map.setView', function () { + var map = L.map(div), + grid = L.gridLayer().addTo(map); + expect(grid.redraw()).to.equal(grid); + }); + }); + + describe('#setOpacity', function () { + it('can be called before map.setView', function () { + var map = L.map(div), + grid = L.gridLayer().addTo(map); + expect(grid.setOpacity(0.5)).to.equal(grid); + }); + }); + it('positions tiles correctly with wrapping and bounding', function () { var map = L.map(div).setView([0, 0], 1); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 143ac35d329..0138b9d6870 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -53,7 +53,7 @@ L.GridLayer = L.Layer.extend({ }, bringToFront: function () { - if (this._map) { + if (this._container) { var pane = this.getPane(); pane.appendChild(this._container); this._setAutoZIndex(pane, Math.max); @@ -62,7 +62,7 @@ L.GridLayer = L.Layer.extend({ }, bringToBack: function () { - if (this._map) { + if (this._container) { var pane = this.getPane(); pane.insertBefore(this._container, pane.firstChild); this._setAutoZIndex(pane, Math.min); @@ -81,7 +81,7 @@ L.GridLayer = L.Layer.extend({ setOpacity: function (opacity) { this.options.opacity = opacity; - if (this._map) { + if (this._container) { this._updateOpacity(); } return this; @@ -95,7 +95,7 @@ L.GridLayer = L.Layer.extend({ }, redraw: function () { - if (this._map) { + if (this._container) { this._reset({hard: true}); this._update(); } From f619e3b242ecc1abd6535169c17184bc2acab54d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 13 Dec 2013 18:35:51 -0500 Subject: [PATCH 0651/2207] bring this._map check back --- src/layer/Layer.js | 12 +++++++----- src/layer/tile/GridLayer.js | 8 ++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 0a6cced0247..b82bac01fbf 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -7,8 +7,6 @@ L.Layer = L.Class.extend({ }, addTo: function (map) { - this._map = map; - var id = L.stamp(this); if (map._layers[id]) { return this; } map._layers[id] = this; @@ -19,17 +17,21 @@ L.Layer = L.Class.extend({ this.beforeAdd(map); } + this._mapToAdd = map; map.whenReady(this._layerAdd, this); return this; }, _layerAdd: function () { - var map = this._map; + var map = this._mapToAdd; // check in case layer gets added and then removed before the map is ready if (!map) { return; } + this._map = map; + this._mapToAdd = null; + this.onAdd(map); if (this.getEvents) { @@ -43,7 +45,7 @@ L.Layer = L.Class.extend({ remove: function () { var id = L.stamp(this), - map = this._map; + map = this._map || this._mapToAdd; if (!map || !map._layers[id]) { return this; } @@ -62,7 +64,7 @@ L.Layer = L.Class.extend({ this.fire('remove'); } - this._map = null; + this._map = this._mapToAdd = null; return this; }, diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 0138b9d6870..143ac35d329 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -53,7 +53,7 @@ L.GridLayer = L.Layer.extend({ }, bringToFront: function () { - if (this._container) { + if (this._map) { var pane = this.getPane(); pane.appendChild(this._container); this._setAutoZIndex(pane, Math.max); @@ -62,7 +62,7 @@ L.GridLayer = L.Layer.extend({ }, bringToBack: function () { - if (this._container) { + if (this._map) { var pane = this.getPane(); pane.insertBefore(this._container, pane.firstChild); this._setAutoZIndex(pane, Math.min); @@ -81,7 +81,7 @@ L.GridLayer = L.Layer.extend({ setOpacity: function (opacity) { this.options.opacity = opacity; - if (this._container) { + if (this._map) { this._updateOpacity(); } return this; @@ -95,7 +95,7 @@ L.GridLayer = L.Layer.extend({ }, redraw: function () { - if (this._container) { + if (this._map) { this._reset({hard: true}); this._update(); } From de1a62fa529b392da76225d38aa49518ae58c23c Mon Sep 17 00:00:00 2001 From: Krzysztof Urbaniak Date: Sat, 14 Dec 2013 16:40:19 +0100 Subject: [PATCH 0652/2207] add {r} format to url, which returns @2x when retina detected and enabled --- src/layer/tile/TileLayer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 77352bf5861..15821897866 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -63,6 +63,7 @@ L.TileLayer = L.GridLayer.extend({ getTileUrl: function (coords) { return L.Util.template(this._url, L.extend({ + r: this.options.detectRetina && L.Browser.retina && this.options.maxZoom > 0 ? '' : '@2x', s: this._getSubdomain(coords), x: coords.x, y: this.options.tms ? this._tileNumBounds.max.y - coords.y : coords.y, From 4d4aa733aecb91ee920b0d858a116eff76bb2423 Mon Sep 17 00:00:00 2001 From: alfarisi Date: Sat, 14 Dec 2013 22:49:13 +0700 Subject: [PATCH 0653/2207] Update plugins.md --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index ab53d0017d7..3f998d9829a 100644 --- a/plugins.md +++ b/plugins.md @@ -246,6 +246,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bjørn Sandvik + + + TileLayer.DeepZoom + + A TileLayer for DeepZoom images. + + Al Farisi, + Indokreatif Teknologi + + Leaflet.Graticule From caa9d8622bf40a4ed8c40457ec31ea8ead4a701b Mon Sep 17 00:00:00 2001 From: Krzysztof Urbaniak Date: Sat, 14 Dec 2013 16:54:29 +0100 Subject: [PATCH 0654/2207] fix retina condition --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 15821897866..aafa06fc8ec 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -63,7 +63,7 @@ L.TileLayer = L.GridLayer.extend({ getTileUrl: function (coords) { return L.Util.template(this._url, L.extend({ - r: this.options.detectRetina && L.Browser.retina && this.options.maxZoom > 0 ? '' : '@2x', + r: this.options.detectRetina && L.Browser.retina && this.options.maxZoom > 0 ? '@2x' : '', s: this._getSubdomain(coords), x: coords.x, y: this.options.tms ? this._tileNumBounds.max.y - coords.y : coords.y, From f5054d3b7a9054fe275936eb90b96a0fb927006b Mon Sep 17 00:00:00 2001 From: Benjamin Becquet Date: Sun, 15 Dec 2013 17:43:20 +0100 Subject: [PATCH 0655/2207] Add Leaflet.MagnifyingGlass plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index ab53d0017d7..868a0c62d74 100644 --- a/plugins.md +++ b/plugins.md @@ -850,6 +850,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Alan Shaw + + + leaflet-zoom-min + + Allows you to display a small portion of the map at another zoom level, either at a fixed position or linked to the mouse movement, for a magnifying glass effect. + + Benjamin Becquet + + From ad9d0f8c7fbb080fa628f302bddb52e6c035c9d2 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Sun, 15 Dec 2013 13:30:22 -0800 Subject: [PATCH 0656/2207] Make options object prototype-inherited Fixes #2294 --- spec/suites/core/ClassSpec.js | 20 ++++++++++++----- spec/suites/core/UtilSpec.js | 42 ++++++++++++++++++++++++++++++++++- src/core/Class.js | 4 ++-- src/core/Util.js | 14 ++++++++++-- 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index 81673e3f2bd..81efe789f18 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -99,12 +99,22 @@ describe("Class", function () { }); var a = new KlassWithOptions2(); + expect(a.options.foo1).to.eql(1); + expect(a.options.foo2).to.eql(3); + expect(a.options.foo3).to.eql(4); + }); - expect(a.options).to.eql({ - foo1: 1, - foo2: 3, - foo3: 4 - }); + it("gives new classes a distinct options object", function () { + var K1 = L.Class.extend({options: {}}); + var K2 = K1.extend({}); + expect(K2.prototype.options).not.to.equal(K1.prototype.options); + }); + + it("inherits options prototypally", function () { + var K1 = L.Class.extend({options: {}}); + var K2 = K1.extend({options: {}}); + K1.prototype.options.foo = 'bar'; + expect(K2.prototype.options.foo).to.eql('bar'); }); it("adds constructor hooks correctly", function () { diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index d66e6236b99..799016f024b 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -185,7 +185,47 @@ describe('Util', function () { }); }); - // TODO setOptions + describe('#setOptions', function () { + it('sets specified options on object', function () { + var o = {}; + L.Util.setOptions(o, {foo: 'bar'}); + expect(o.options.foo).to.eql('bar'); + }); + + it('returns options', function () { + var o = {}; + var r = L.Util.setOptions(o, {foo: 'bar'}); + expect(r).to.equal(o.options); + }); + + it('accepts undefined', function () { + var o = {}; + L.Util.setOptions(o, undefined); + expect(o.options).to.eql({}); + }); + + it('creates a distinct options object', function () { + var opts = {}, + o = L.Util.create({options: opts}); + L.Util.setOptions(o, {}); + expect(o.options).not.to.equal(opts); + }); + + it("doesn't create a distinct options object if object already has own options", function () { + var opts = {}, + o = {options: opts}; + L.Util.setOptions(o, {}); + expect(o.options).to.equal(opts); + }); + + it('inherits options prototypally', function () { + var opts = {}, + o = L.Util.create({options: opts}); + L.Util.setOptions(o, {}); + opts.foo = 'bar'; + expect(o.options.foo).to.eql('bar'); + }); + }); describe('#template', function () { it('evaluates templates with a given data object', function () { diff --git a/src/core/Class.js b/src/core/Class.js index e5fc37844ef..69f0f2741bf 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -50,8 +50,8 @@ L.Class.extend = function (props) { } // merge options - if (props.options && proto.options) { - props.options = L.extend({}, proto.options, props.options); + if (proto.options) { + props.options = L.Util.extend(L.Util.create(proto.options), props.options); } // mix given properties into the prototype diff --git a/src/core/Util.js b/src/core/Util.js index 2bf7ed93d25..3effa4ef903 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -18,6 +18,14 @@ L.Util = { return dest; }, + create: Object.create || (function () { + function F() {} + return function (proto) { + F.prototype = proto; + return new F(); + }; + })(), + bind: function (fn, obj) { var slice = Array.prototype.slice; @@ -107,8 +115,10 @@ L.Util = { }, setOptions: function (obj, options) { - obj.options = options ? L.extend({}, obj.options, options) : obj.options || {}; - return obj.options; + if (!obj.hasOwnProperty('options')) { + obj.options = obj.options ? L.Util.create(obj.options) : {}; + } + return L.extend(obj.options, options); }, getParamString: function (obj, existingUrl, uppercase) { From f2b34cd012ad0d5517a7c368efd7c1827a1a2669 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Sun, 15 Dec 2013 14:35:02 -0800 Subject: [PATCH 0657/2207] Use L.Util.create for class extension --- src/core/Class.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/core/Class.js b/src/core/Class.js index 69f0f2741bf..9c3635cfea1 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -21,11 +21,7 @@ L.Class.extend = function (props) { } }; - // instantiate class without calling constructor - var F = function () {}; - F.prototype = this.prototype; - - var proto = new F(); + var proto = L.Util.create(this.prototype); proto.constructor = NewClass; NewClass.prototype = proto; From 90a5c69b3617d6a011687197a72b9a11086070e6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 16 Dec 2013 10:59:51 -0500 Subject: [PATCH 0658/2207] remove Leaflet IE stylesheet that's not needed anymore --- _layouts/default.html | 1 - examples/choropleth-example.html | 1 - examples/custom-icons-example.html | 1 - examples/geojson-example.html | 1 - examples/layers-control-example.html | 1 - examples/mobile-example.html | 1 - examples/quick-start-example.html | 1 - examples/quick-start.md | 5 +---- 8 files changed, 1 insertion(+), 11 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 06cd11b92b9..1da4d70996d 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -28,7 +28,6 @@ - diff --git a/examples/choropleth-example.html b/examples/choropleth-example.html index 6c1295b6efc..98632dbad71 100644 --- a/examples/choropleth-example.html +++ b/examples/choropleth-example.html @@ -7,7 +7,6 @@ - + + + + + + +
      + +
      + + + +
      + + + + diff --git a/src/map/anim/Map.ZoomPan.js b/src/map/anim/Map.ZoomPan.js index 300fb6185f2..3b1c3aa7aa9 100644 --- a/src/map/anim/Map.ZoomPan.js +++ b/src/map/anim/Map.ZoomPan.js @@ -29,11 +29,11 @@ L.Map.include({ function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); } function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; } - function easeOut(t) { return 1 - Math.pow(1 - t, 2); } + function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); } var start = Date.now(), S = (r(1) - r0) / rho, - duration = 1000 * S; + duration = 1000 * S * 0.8; function frame() { var t = (Date.now() - start) / duration, From 04158e97e9d1180df825b6178517cad5cb0160b9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 21 Jan 2014 20:34:00 +0200 Subject: [PATCH 0951/2207] manage tile pyramid levels; always animate tile fade --- src/layer/tile/GridLayer.js | 51 +++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index a57132e5e48..160749964cd 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -12,7 +12,7 @@ L.GridLayer = L.Layer.extend({ unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile, - updateInterval: 150 + updateInterval: 200 /* minZoom: , @@ -169,24 +169,45 @@ L.GridLayer = L.Layer.extend({ this.getPane().appendChild(this._container); }, - _updateLevel: function () { - var zoom = this._tileZoom, - level = this._levels[zoom]; + _updateLevels: function () { + var zoom = this._tileZoom; - if (!level) { - level = this._levels[zoom] = {}; - level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); - level.el.style.zIndex = zoom; - level.zoom = zoom; - level.tiles = {}; - var map = this._map; - level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + for (var z in this._levels) { + z = parseInt(z, 10); + if (z > zoom + 2 || z < zoom - 2) { + this._destroyLevel(this._levels[z]); + delete this._levels[z]; + } else { + this._levels[z].el.style.zIndex = -Math.abs(zoom - z); + } } + var level = this._levels[zoom]; + + if (level) { + this._destroyLevel(level); + } + + level = this._levels[zoom] = {}; + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = 0; + level.zoom = zoom; + level.tiles = {}; + + var map = this._map; + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + this._level = level; return level; }, + _destroyLevel: function (level) { + for (var i in level.tiles) { + level.tiles[i].onload = null; + } + L.DomUtil.remove(level.el); + }, + _reset: function (e) { var map = this._map, zoom = map.getZoom(), @@ -197,7 +218,7 @@ L.GridLayer = L.Layer.extend({ // this._clearTiles(); this._tileZoom = tileZoom; - this._updateLevel(); + this._updateLevels(); this._resetGrid(); } @@ -448,7 +469,9 @@ L.GridLayer = L.Layer.extend({ }); } - L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); + L.Util.requestAnimFrame(function () { + L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); + }); this.fire('tileload', {tile: tile}); From d748adc55bac8dcbffac82a3056b35ee8047fd3f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 24 Jan 2014 16:24:27 +0200 Subject: [PATCH 0952/2207] zoom to the nearest round zoom with pinch or dblclick --- src/map/handler/Map.DoubleClickZoom.js | 3 ++- src/map/handler/Map.TouchZoom.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/map/handler/Map.DoubleClickZoom.js b/src/map/handler/Map.DoubleClickZoom.js index 6399734ee7e..8f38140696a 100644 --- a/src/map/handler/Map.DoubleClickZoom.js +++ b/src/map/handler/Map.DoubleClickZoom.js @@ -17,7 +17,8 @@ L.Map.DoubleClickZoom = L.Handler.extend({ _onDoubleClick: function (e) { var map = this._map, - zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1); + oldZoom = map.getZoom(), + zoom = e.originalEvent.shiftKey ? Math.ceil(oldZoom) - 1 : Math.floor(oldZoom) + 1; if (map.options.doubleClickZoom === 'center') { map.setZoom(zoom); diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 741f83eacb1..a161554ac62 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -101,7 +101,7 @@ L.Map.TouchZoom = L.Handler.extend({ var map = this._map, oldZoom = map.getZoom(), zoomDelta = this._zoom - oldZoom, - finalZoom = map._limitZoom(oldZoom + (zoomDelta > 0 ? Math.ceil(zoomDelta) : Math.floor(zoomDelta))); + finalZoom = map._limitZoom(zoomDelta > 0 ? Math.ceil(this._zoom) : Math.floor(this._zoom)); map._animateZoom(this._center, finalZoom, true); }, From a8f8d873623b6769954273e7c4ded17a0bc1f2d7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 24 Jan 2014 20:24:30 +0200 Subject: [PATCH 0953/2207] code cleanup; don't reload tile level that's already loaded --- src/layer/tile/GridLayer.js | 70 ++++++++++++++++--------------------- src/layer/tile/TileLayer.js | 19 +++++----- 2 files changed, 39 insertions(+), 50 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 160749964cd..15139c6c898 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -182,20 +182,19 @@ L.GridLayer = L.Layer.extend({ } } - var level = this._levels[zoom]; + var level = this._levels[zoom], + map = this._map; - if (level) { - this._destroyLevel(level); - } + if (!level) { + level = this._levels[zoom] = {}; - level = this._levels[zoom] = {}; - level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); - level.el.style.zIndex = 0; - level.zoom = zoom; - level.tiles = {}; + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = 0; - var map = this._map; - level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.zoom = zoom; + level.tiles = {}; + } this._level = level; return level; @@ -215,8 +214,6 @@ L.GridLayer = L.Layer.extend({ tileZoomChanged = this._tileZoom !== tileZoom; if (tileZoomChanged || e && e.hard) { - // this._clearTiles(); - this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); @@ -259,7 +256,10 @@ L.GridLayer = L.Layer.extend({ tileSize = this._tileSize = this._getTileSize(), tileZoom = this._tileZoom; - this._tileRange = this._getTileRange(); + var bounds = this._map.getPixelWorldBounds(this._tileZoom); + if (bounds) { + this._globalTileRange = this._pxBoundsToTileRange(bounds); + } this._wrapX = crs.wrapLng && [ Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize), @@ -279,18 +279,12 @@ L.GridLayer = L.Layer.extend({ if (!this._map) { return; } // TODO move to reset - var zoom = this._map.getZoom(); - - if (zoom > this.options.maxZoom || - zoom < this.options.minZoom) { return; } + // var zoom = this._map.getZoom(); - var bounds = this._map.getBounds(), - pxBounds = new L.Bounds( - this._map.project(bounds.getNorthWest(), this._tileZoom), - this._map.project(bounds.getSouthEast(), this._tileZoom)); + // if (zoom > this.options.maxZoom || + // zoom < this.options.minZoom) { return; } - // tile coordinates range for the current view - var tileRange = this._boundsToTileRange(pxBounds); + var tileRange = this._getTileRange(this._map.getBounds(), this._tileZoom); // if (this.options.unloadInvisibleTiles) { // this._removeOtherTiles(tileRange); @@ -299,6 +293,14 @@ L.GridLayer = L.Layer.extend({ this._addTiles(tileRange); }, + // tile coordinates range for particular geo bounds and zoom + _getTileRange: function (bounds, zoom) { + var pxBounds = new L.Bounds( + this._map.project(bounds.getNorthWest(), zoom), + this._map.project(bounds.getSouthEast(), zoom)); + return this._pxBoundsToTileRange(pxBounds); + }, + _addTiles: function (tileRange) { var queue = [], center = tileRange.getCenter(); @@ -351,7 +353,7 @@ L.GridLayer = L.Layer.extend({ if (!crs.infinite) { // don't load tile if it's out of bounds and not wrapped - var bounds = this._tileRange; + var bounds = this._globalTileRange; if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) || (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; } } @@ -469,23 +471,17 @@ L.GridLayer = L.Layer.extend({ }); } - L.Util.requestAnimFrame(function () { - L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); - }); + L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); this.fire('tileload', {tile: tile}); this._tilesToLoad--; if (this._tilesToLoad === 0) { - this._visibleTilesReady(); + this.fire('load'); } }, - _visibleTilesReady: function () { - this.fire('load'); - }, - _getTilePos: function (coords) { return coords.multiplyBy(this._tileSize).subtract(this._level.origin); }, @@ -495,13 +491,7 @@ L.GridLayer = L.Layer.extend({ coords.y = this._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y; }, - // get the global tile coordinates range for the current zoom - _getTileRange: function () { - var bounds = this._map.getPixelWorldBounds(this._tileZoom); - return bounds ? this._boundsToTileRange(bounds) : null; - }, - - _boundsToTileRange: function (bounds) { + _pxBoundsToTileRange: function (bounds) { return new L.Bounds( bounds.min.divideBy(this._tileSize).floor(), bounds.max.divideBy(this._tileSize).ceil().subtract([1, 1])); diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 40c64eef1cd..66c1dada842 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -39,6 +39,11 @@ L.TileLayer = L.GridLayer.extend({ if (typeof options.subdomains === 'string') { options.subdomains = options.subdomains.split(''); } + + // for https://github.com/Leaflet/Leaflet/issues/137 + if (!L.Browser.android) { + this.on('tileunload', this._onTileRemove); + } }, setUrl: function (url, noRedraw) { @@ -101,16 +106,10 @@ L.TileLayer = L.GridLayer.extend({ options.tileSize; }, - _removeTile: function (key) { - var tile = this._tiles[key]; - - L.GridLayer.prototype._removeTile.call(this, key); - - // for https://github.com/Leaflet/Leaflet/issues/137 - if (!L.Browser.android) { - tile.onload = null; - tile.src = L.Util.emptyImageUrl; - } + _onTileRemove: function (e) { + e.tile.onload = null; + e.tile.src = L.Util.emptyImageUrl; + console.log('hello'); }, _getZoomForUrl: function () { From 5a4deff548dbdc8dbd8dbbccecb0d59b0f7d6be0 Mon Sep 17 00:00:00 2001 From: Nathan Mascitelli Date: Wed, 19 Mar 2014 14:52:49 -0400 Subject: [PATCH 0954/2207] Fixed whitespace. --- src/layer/Popup.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 17bb95818e6..51d4fcc448c 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -131,13 +131,13 @@ L.Popup = L.Layer.extend({ } return events; }, - - isOpen: function () { - if (this._map) { - return this._map.hasLayer(this); - } - return false; - }, + + isOpen: function () { + if (this._map) { + return this._map.hasLayer(this); + } + return false; + }, _close: function () { if (this._map) { From 4d072048c41cba08552c64a35f0b8ae81160be2e Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 19 Mar 2014 11:53:39 -0700 Subject: [PATCH 0955/2207] Add safari and firefox launchers --- package.json | 4 +++- spec/karma.conf.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a2fec006939..9cb24cca76a 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "karma-mocha": "~0.1.1", "karma-coverage": "~0.2.0", "karma-phantomjs-launcher": "^0.1.2", - "karma-chrome-launcher": "^0.1.2" + "karma-chrome-launcher": "^0.1.2", + "karma-firefox-launcher": "~0.1.3", + "karma-safari-launcher": "~0.1.1" }, "main": "dist/leaflet-src.js", "style": "dist/leaflet.css", diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 703c506b355..d287ddacfb3 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -22,7 +22,9 @@ module.exports = function (config) { 'karma-mocha', 'karma-coverage', 'karma-phantomjs-launcher', - 'karma-chrome-launcher'], + 'karma-chrome-launcher', + 'karma-safari-launcher', + 'karma-firefox-launcher'], // frameworks to use frameworks: ['mocha'], From 8ea611512af6675d471220af36e123b9e156ade7 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 19 Mar 2014 11:58:19 -0700 Subject: [PATCH 0956/2207] Fix MarkerSpec in retina browsers. --- spec/suites/layer/marker/MarkerSpec.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index cc8f34fd6a2..c7520c4c7bb 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -58,7 +58,11 @@ describe("Marker", function () { expect(oldIcon).to.not.be(marker._icon); expect(oldIcon.parentNode).to.be(null); - expect(marker._icon.src).to.contain('marker-icon.png'); + if (L.Browser.retina) { + expect(marker._icon.src).to.contain('marker-icon-2x.png'); + } else { + expect(marker._icon.src).to.contain('marker-icon.png'); + } expect(marker._icon.parentNode).to.be(map._panes.markerPane); }); From ed06a5269768f81cd36a82575dd52c5575c8f316 Mon Sep 17 00:00:00 2001 From: Nathan Mascitelli Date: Wed, 19 Mar 2014 16:40:55 -0400 Subject: [PATCH 0957/2207] Fixed whitespace. Second crack at fixing the whitespace. --- src/layer/Popup.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 51d4fcc448c..b08befdcc27 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -133,11 +133,11 @@ L.Popup = L.Layer.extend({ }, isOpen: function () { - if (this._map) { - return this._map.hasLayer(this); - } - return false; - }, + if (this._map) { + return this._map.hasLayer(this); + } + return false; + }, _close: function () { if (this._map) { From 5c073a3e29877d49485e4738bdc913b0ed19e304 Mon Sep 17 00:00:00 2001 From: Dave Leaver Date: Thu, 20 Mar 2014 10:26:29 +1300 Subject: [PATCH 0958/2207] Add an element for tracking zoom animations. Use it for trying to stop a map zoom. Still doesn't quite work right. Stopping a zoomPan or PanAnimation does work however. Code is all cludgy :) refs #2560 --- debug/map/zoompan.html | 6 ++- src/map/Map.js | 75 ++++++++++++++++++++++++++++++++++++- src/map/anim/Map.ZoomPan.js | 3 +- 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 7fb61ceed24..cf5957f25a1 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -27,6 +27,7 @@ --> + + + ### Leaflet Source Code diff --git a/examples/quick-start.md b/examples/quick-start.md index 5b62aa9b3e1..b0c76606187 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,11 +19,11 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS file in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From 50012a66d051db043da2fb57cb683889a11a0c9f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 23 May 2014 12:20:32 +0300 Subject: [PATCH 1034/2207] update Leaflet to 0.7.3 & Mapbox URL to http --- _layouts/default.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 74e813ccf7b..dd1a6fa02fb 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -35,9 +35,8 @@ - - - + + {% if page.css %}{% endif %} @@ -46,7 +45,7 @@ 'CC-BY-SA, ' + 'Imagery © Mapbox'; - MB_URL = 'https://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png'; + MB_URL = 'http://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png'; OSM_URL = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; OSM_ATTRIB = '© OpenStreetMap contributors'; From 005fef5b6c82f4efe81b54cbb55cd3a95e93a96e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 23 May 2014 12:21:24 +0300 Subject: [PATCH 1035/2207] remove release notice --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 3cd8f95d23f..59b80d4be4e 100644 --- a/index.md +++ b/index.md @@ -2,7 +2,7 @@ layout: default --- -

      November 18, 2013 — Leaflet 0.7 Release, MapBox & Plans for Future (Blog Post)

      + Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. From 433ff94110aa4b150f4b283cb381ca55c169ce14 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 23 May 2014 12:23:46 +0300 Subject: [PATCH 1036/2207] add 0.7.3 changelog --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a56fb04ecaf..5cd50f422bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -133,7 +133,6 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed `ImageOverlay` mercator distortion on lower zoom levels. * Fixed a bug where layers didn't fire `popupopen` and `popupclose` events when manually creating a popup object and passing it to `bindPopup`. [#2354](https://github.com/Leaflet/Leaflet/issues/2354) * Fixed box-zoom overlay appearing under markers. [#1813](https://github.com/Leaflet/Leaflet/issues/1813) -* Fixed an issue where clicks on Android were skipped when happened too fast. [#2303](https://github.com/Leaflet/Leaflet/issues/2303) ### Misc improvements @@ -143,6 +142,19 @@ These changes were targeted at removing any hardcoded projection-specific logic * Added reference to Leaflet CSS in `package.json` (by [@bclinkinbeard](https://github.com/bclinkinbeard)). [#2432](https://github.com/Leaflet/Leaflet/pull/2432) +## 0.7.3 (May 23, 2014) + +* Added proper **bower** and **component** support (by [@calvinmetcalf](https://github.com/calvinmetcalf)). [#2561](https://github.com/Leaflet/Leaflet/pull/2561) [#1903](https://github.com/Leaflet/Leaflet/issues/1903) +* Fixed a bug where dragging the map outside the window caused an error on FF. [#2610](https://github.com/Leaflet/Leaflet/issues/2610) +* Fixed a bug where some taps on Android where not working, often falsely perceived as drags (by [@axefrog](https://github.com/axefrog)). [#2503](https://github.com/Leaflet/Leaflet/pull/2503) +* Fixed a bug where clicks on Android were skipped when happened too fast. [#2303](https://github.com/Leaflet/Leaflet/issues/2303) +* Fixed a bug where calling `setView` (or similar methods) several times in succession could freeze the map. [#2521](https://github.com/Leaflet/Leaflet/issues/2521) [#2236](https://github.com/Leaflet/Leaflet/issues/2236) [#2485](https://github.com/Leaflet/Leaflet/issues/2485) +* Fixed a bug where `Control.Layers` wasn't properly removed (by [@jack-kerouac](https://github.com/jack-kerouac)). [#2569](https://github.com/Leaflet/Leaflet/pull/2569) +* Fixed a bug that caused `TileLayer` `load` event not to fire properly. [#2510](https://github.com/Leaflet/Leaflet/issues/2510) +* Fixed Canvas-based paths not triggering `remove` event when removed (by @adimitrov). [#2486](https://github.com/Leaflet/Leaflet/pull/2486) +* Fixed a bug where you could end up with fractional zoom after pinch-zooming in some cases (by [@danzel](https://github.com/danzel). [#2400](https://github.com/Leaflet/Leaflet/pull/2400) [#1943](https://github.com/Leaflet/Leaflet/issues/1934) + + ## 0.7.2 (January 17, 2014) * Fixed a bug that appeared with **Chrome 32 update** that made all **mouse events shifted on scrolled pages**. [#2352](https://github.com/Leaflet/Leaflet/issues/2352) From 2885f2bf45867ca406206aa1c4101ee6723a6200 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 23 May 2014 23:52:38 +0300 Subject: [PATCH 1037/2207] upgrade deps --- package.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 802f5d23662..33bf5f43fd9 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,18 @@ "version": "0.7.0", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { - "jake": "~0.7.9", - "jshint": "~2.4.4", + "jake": "~0.7.14", + "jshint": "~2.5.1", "uglify-js": "~2.4.13", - "mocha": "~1.17.1", + "mocha": "~1.19.0", "happen": "~0.1.3", - "karma": "~0.12.0", - "karma-mocha": "~0.1.1", - "karma-coverage": "~0.2.0", - "karma-phantomjs-launcher": "^0.1.2", - "karma-chrome-launcher": "^0.1.2", - "tin": "^0.4.0", - "copyfiles": "0.0.1" + "karma": "~0.12.16", + "karma-mocha": "~0.1.3", + "karma-coverage": "~0.2.3", + "karma-phantomjs-launcher": "^0.1.4", + "karma-chrome-launcher": "^0.1.4", + "tin": "^0.5.0", + "copyfiles": "0.1.0" }, "main": "dist/leaflet-src.js", "style": "dist/leaflet.css", From 53048500b1a41d049f3a6583ba261fbc80c4f2ca Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 26 May 2014 17:10:09 +0300 Subject: [PATCH 1038/2207] fix vector rendering regression --- src/layer/Layer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index a0f3cb30e90..32b2c44b58f 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -34,15 +34,15 @@ L.Layer = L.Evented.extend({ this._map = map; this._zoomAnimated = map._zoomAnimated; - if (this.getEvents) { - map.on(this.getEvents(), this); - } + this.onAdd(map); if (this.getAttribution && this._map.attributionControl) { this._map.attributionControl.addAttribution(this.getAttribution()); } - this.onAdd(map); + if (this.getEvents) { + map.on(this.getEvents(), this); + } this.fire('add'); map.fire('layeradd', {layer: this}); From 1d0dc6dcad00321acde0fd41b57922343b6b415e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 26 May 2014 18:47:11 +0300 Subject: [PATCH 1039/2207] add and use L.DomUtil.empty, close #2600 --- src/control/Control.Layers.js | 4 ++-- src/dom/DomUtil.js | 6 ++++++ src/layer/tile/GridLayer.js | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 3e8417ff10a..f5234a007cc 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -124,8 +124,8 @@ L.Control.Layers = L.Control.extend({ _update: function () { if (!this._container) { return; } - this._baseLayersList.innerHTML = ''; - this._overlaysList.innerHTML = ''; + L.DomUtil.empty(this._baseLayersList); + L.DomUtil.empty(this._overlaysList); var baseLayersPresent, overlaysPresent, i, obj; diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index ba77e735a3a..c13c41e7314 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -38,6 +38,12 @@ L.DomUtil = { } }, + empty: function (el) { + while (el.firstChild) { + el.removeChild(el.firstChild); + } + }, + toFront: function (el) { el.parentNode.appendChild(el); }, diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7a2f99136eb..513bb01b36e 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -195,7 +195,7 @@ L.GridLayer = L.Layer.extend({ this._tilesToLoad = 0; this._tilesTotal = 0; - this._tileContainer.innerHTML = ''; + L.DomUtil.empty(this._tileContainer); if (this._zoomAnimated && e && e.hard) { this._clearBgBuffer(); @@ -494,7 +494,7 @@ L.GridLayer = L.Layer.extend({ bg = this._bgBuffer; if (map && !map._animatingZoom && !map.touchZoom._zooming && bg) { - bg.innerHTML = ''; + L.DomUtil.empty(bg); L.DomUtil.setTransform(bg); } }, From b16daa39b941f9ce5158564955976a8b8c0babb9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 26 May 2014 18:52:24 +0300 Subject: [PATCH 1040/2207] fix rare error when dragging vectors, close #2706 --- src/layer/vector/SVG.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index 196a269d216..d807d22d622 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -152,7 +152,10 @@ L.SVG = L.Renderer.extend({ }, _fireMouseEvent: function (e) { - this._paths[L.stamp(e.target || e.srcElement)]._fireMouseEvent(e); + var path = this._paths[L.stamp(e.target || e.srcElement)]; + if (path) { + path._fireMouseEvent(e); + } } }); From 0aeca1a4e780712dba4763f3372d41cee12dfacc Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 26 May 2014 23:21:33 +0300 Subject: [PATCH 1041/2207] remove element argument in requestAnimFrame --- src/core/Util.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Util.js b/src/core/Util.js index bd9ccafc8a2..5573343e69e 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -174,11 +174,11 @@ L.Util = { getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; - L.Util.requestAnimFrame = function (fn, context, immediate, element) { + L.Util.requestAnimFrame = function (fn, context, immediate) { if (immediate && requestFn === timeoutDefer) { fn.call(context); } else { - return requestFn.call(window, L.bind(fn, context), element); + return requestFn.call(window, L.bind(fn, context)); } }; From cea1eff73280cd4fb808df4cf85dcec79130d9a6 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Tue, 27 May 2014 15:30:47 -0400 Subject: [PATCH 1042/2207] Set detectRetina's expected type as Boolean at code level to match documentation and usage --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 5e6d996e86e..5c259f593c6 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -16,7 +16,7 @@ L.TileLayer = L.GridLayer.extend({ maxNativeZoom: , tms: , zoomReverse: , - detectRetina: , + detectRetina: , crossOrigin: , */ }, From 760c730f92508d6b0cc9d5dee3bdf7fd2a1c3929 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 28 May 2014 17:26:37 +0300 Subject: [PATCH 1043/2207] fix LatLng.distanceTo race condition, close #2705 --- spec/suites/geo/LatLngSpec.js | 6 ++++++ src/geo/crs/CRS.Earth.js | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js index 5552aff9490..1c050df0208 100644 --- a/spec/suites/geo/LatLngSpec.js +++ b/spec/suites/geo/LatLngSpec.js @@ -64,6 +64,12 @@ describe('LatLng', function () { expect(Math.abs(Math.round(a.distanceTo(b) / 1000) - 2084) < 5).to.eql(true); }); + it('does not return NaN if input points are equal', function () { + var a = new L.LatLng(50.5, 30.5); + var b = new L.LatLng(50.5, 30.5); + + expect(a.distanceTo(b)).to.eql(0); + }); }); describe('L.latLng factory', function () { diff --git a/src/geo/crs/CRS.Earth.js b/src/geo/crs/CRS.Earth.js index 3eb098733fb..b1fb4458a47 100644 --- a/src/geo/crs/CRS.Earth.js +++ b/src/geo/crs/CRS.Earth.js @@ -11,9 +11,10 @@ L.CRS.Earth = L.extend({}, L.CRS, { distance: function (latlng1, latlng2) { var rad = Math.PI / 180, lat1 = latlng1.lat * rad, - lat2 = latlng2.lat * rad; + lat2 = latlng2.lat * rad, + a = Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); - return this.R * Math.acos(Math.sin(lat1) * Math.sin(lat2) + - Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad)); + return this.R * Math.acos(Math.min(a, 1)); } }); From ada4e22bcbea19c9e589dd1fce25ba2e0f46bcf7 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Wed, 4 Jun 2014 08:06:49 +0200 Subject: [PATCH 1044/2207] Remove extra "the". Close #2723 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 914b411c7fa..b32b0f977e6 100644 --- a/reference.html +++ b/reference.html @@ -3374,7 +3374,7 @@

      Methods

      this - Resets the the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. + Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. From 9288f7fbd839a4ef585b8f7c8292f4ca63765da2 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Wed, 16 Apr 2014 09:20:58 +0200 Subject: [PATCH 1045/2207] Document requestAnimFrame and cancelAnimFrame --- reference.html | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/reference.html b/reference.html index 1a545e28eb1..b5fb01fe502 100644 --- a/reference.html +++ b/reference.html @@ -5258,19 +5258,23 @@

      Methods

      String Applies a unique key to the object and returns that key. Has an L.stamp shortcut. - limitExecByInterval( <Function> fn, From 5c7bf0268a70c7c0f17844f2de7a406256acdb59 Mon Sep 17 00:00:00 2001 From: Malte Legenhausen Date: Wed, 4 Jun 2014 09:24:50 +0200 Subject: [PATCH 1046/2207] Bugfix for #2704 --- src/layer/tile/GridLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 513bb01b36e..cc39f29314d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -324,7 +324,7 @@ L.GridLayer = L.Layer.extend({ _tileCoordsToBounds: function (coords) { var map = this._map, - tileSize = this.options.tileSize, + tileSize = this._getTileSize(), nwPoint = coords.multiplyBy(tileSize), sePoint = nwPoint.add([tileSize, tileSize]), From 6ebd9f1ac78d22038116e4fa1d3c45c303fb77f8 Mon Sep 17 00:00:00 2001 From: Sonny Gupta Date: Wed, 4 Jun 2014 09:06:54 -0700 Subject: [PATCH 1047/2207] Issue #2722 Removed minified source from bower distribution, as is the convention now. --- build/bower.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/bower.json b/build/bower.json index 7dde378822c..ca85bde2744 100644 --- a/build/bower.json +++ b/build/bower.json @@ -2,7 +2,6 @@ "name": "leaflet", "description": "JavaScript library for mobile-friendly interactive maps", "main": [ - "dist/leaflet.js", "dist/leaflet.css", "dist/leaflet-src.js", "dist/images/layers-2x.png", @@ -20,4 +19,4 @@ "src", "build" ] -} \ No newline at end of file +} From 0ec0e40609275f725c95551c7fc99c7697893b10 Mon Sep 17 00:00:00 2001 From: ikokostya Date: Thu, 5 Jun 2014 02:02:00 +0400 Subject: [PATCH 1048/2207] Convert Map#getPixelBounds result to link --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b918dad5bf7..d5a0878c246 100644 --- a/reference.html +++ b/reference.html @@ -777,7 +777,7 @@

      Methods for Getting Map State

      getPixelBounds() - Bounds + Bounds Returns the bounds of the current map view in projected pixel coordinates (sometimes useful in layer and overlay implementations). From 05c3f93757a124965a5e04bc9968d2ec343a56a8 Mon Sep 17 00:00:00 2001 From: davidchouse Date: Mon, 16 Jun 2014 23:50:05 -0400 Subject: [PATCH 1049/2207] Adding Leaflet.NavBar plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 85f68bfd143..63e4c9855f8 100644 --- a/plugins.md +++ b/plugins.md @@ -1106,6 +1106,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Robbie Trencheny + + + Leaflet Navigation Toolbar + + Leaflet control for simple back, forward and home navigation. + + David C + + From b08e2f7a3de74d8d7c046a1faad002c3b7d5fd64 Mon Sep 17 00:00:00 2001 From: Fabian Zeindl Date: Tue, 17 Jun 2014 14:34:16 +0200 Subject: [PATCH 1050/2207] removed 1 unnecessary array-creation --- src/core/Util.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/core/Util.js b/src/core/Util.js index 5573343e69e..fc66a76e62c 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -5,11 +5,10 @@ L.Util = { // extend an object with properties of one or more other objects extend: function (dest) { - var sources = Array.prototype.slice.call(arguments, 1), - i, j, len, src; + var i, j, len, src; - for (j = 0, len = sources.length; j < len; j++) { - src = sources[j]; + for (j = 1, len = arguments.length; j < len; j++) { + src = arguments[j]; for (i in src) { dest[i] = src[i]; } From 132e5b6f7cc1a3b31feb21b6a53cd16d971eb455 Mon Sep 17 00:00:00 2001 From: Fabian Zeindl Date: Tue, 17 Jun 2014 15:01:42 +0200 Subject: [PATCH 1051/2207] =?UTF-8?q?Performance:=20don=E2=80=99t=20set=20?= =?UTF-8?q?width/height=20on=20SVG=20if=20unchanged.=20Saves=20a=20costly?= =?UTF-8?q?=20layout/repaint=20in=20some=20situations.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layer/vector/SVG.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index d807d22d622..1bc01eb2865 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -31,11 +31,17 @@ L.SVG = L.Renderer.extend({ L.DomUtil.setPosition(container, b.min); - // update container viewBox so that we don't have to change coordinates of individual layers - container.setAttribute('width', size.x); - container.setAttribute('height', size.y); - container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' ')); + // set size of svg-container if changed + if (!this._svgSize || !this._svgSize.equals(size)) { + this._svgSize = size; + container.setAttribute('width', size.x); + container.setAttribute('height', size.y); + } + // movement: update container viewBox so that we don't have to change coordinates of individual layers + L.DomUtil.setPosition(container, b.min); + container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' ')); + if (L.Browser.mobileWebkit) { pane.appendChild(container); } From 0416bd473feefd73ea93b2a0c49e69503e582ae5 Mon Sep 17 00:00:00 2001 From: Fabian Zeindl Date: Tue, 17 Jun 2014 15:02:56 +0200 Subject: [PATCH 1052/2207] =?UTF-8?q?Performance:=20this=20triggers=20a=20?= =?UTF-8?q?reflow,=20but=20newest=20Chrome=20doesn=E2=80=99t=20flicker=20a?= =?UTF-8?q?nymore.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dom/PosAnimation.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/dom/PosAnimation.js b/src/dom/PosAnimation.js index a3ee932ce55..ff67853a8ce 100644 --- a/src/dom/PosAnimation.js +++ b/src/dom/PosAnimation.js @@ -19,9 +19,6 @@ L.PosAnimation = L.Evented.extend({ L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); L.DomUtil.setPosition(el, newPos); - // toggle reflow, Chrome flickers for some reason if you don't do this - L.Util.falseFn(el.offsetWidth); - // there's no native way to track value updates of transitioned properties, so we imitate this this._stepTimer = setInterval(L.bind(this._onStep, this), 50); }, From 3b1512b6a0485c171372f32236063cbf89fde51f Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Tue, 17 Jun 2014 14:31:00 -0700 Subject: [PATCH 1053/2207] Esri Leaflet and Esri Leaflet Geocoder plugins --- plugins.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins.md b/plugins.md index 63e4c9855f8..8c28345aa4d 100644 --- a/plugins.md +++ b/plugins.md @@ -553,6 +553,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Tao Huang + + + Esri Leaflet + + A set of tools for using ArcGIS services with Leaflet. Support for map services, feature layers, ArcGIS Online tiles and more. + + Patrick Arlt + + @@ -610,6 +619,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jakub Dostal + + + Esri Leaflet Geocoder + + A geocoding control with suggestions powered by the ArcGIS Online geocoder. + + Patrick Arlt + + From 04ed2571fb0a18a7af57037bcdfeb8dd2dd1f5f8 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Tue, 24 Jun 2014 22:58:54 +0200 Subject: [PATCH 1054/2207] Fixed jake build if leaflet copy is not a git repository --- Jakefile.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index bb965e419d5..1e3599c9152 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -23,7 +23,7 @@ function hint(msg, paths) { console.log('\tCheck passed.\n'); complete(); }); - } + }; } desc('Check Leaflet source for errors with JSHint'); @@ -36,12 +36,14 @@ desc('Combine and compress Leaflet source files'); task('build', {async: true}, function (compsBase32, buildName) { var v; - jake.exec('git log -1 --pretty=format:"%h"', {}, function () { + jake.exec('git log -1 --pretty=format:"%h"', {breakOnError: false}, function () { build.build(complete, v, compsBase32, buildName); }).on('stdout', function (data) { v = version + ' (' + data.toString() + ')'; - }) + }).on('error', function () { + v = version; + }); }); desc('Run PhantomJS tests'); From cb26ff59f35d7657da1c4f8152dbb91076b42094 Mon Sep 17 00:00:00 2001 From: Ilya Zverev Date: Thu, 26 Jun 2014 15:39:24 +0400 Subject: [PATCH 1055/2207] added some plugins --- plugins.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/plugins.md b/plugins.md index 8c28345aa4d..11f39759f42 100644 --- a/plugins.md +++ b/plugins.md @@ -1133,6 +1133,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s David C + + + Leaflet LimitZoom + + Limits available zoom levels to a given list. + + Ilya Zverev + + @@ -1263,6 +1272,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Benjamin J DeLong + + + MapBBCode-related leaflet plugins + + Seven plugins for various features, independent of the MapBBCode library. + From circular and popup icons to buttons, layer switcher, better search and attribution. + + Ilya Zverev + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From 64e149f0a78e8f2ba20ab0ef34f7c45acd4edaab Mon Sep 17 00:00:00 2001 From: vicchi Date: Thu, 26 Jun 2014 13:01:56 +0100 Subject: [PATCH 1056/2207] Add OpenCage Data's geocoding search control plugin --- plugins.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/plugins.md b/plugins.md index 8c28345aa4d..6bc53462f9d 100644 --- a/plugins.md +++ b/plugins.md @@ -21,7 +21,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.ellipse - Leaflet.ellipse place ellipses on map by specifying center point, semi-major axis, + Leaflet.ellipse place ellipses on map by specifying center point, semi-major axis, semi-minor axis, and tilt degrees from west. JD Fergason @@ -375,7 +375,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.ImageTransform Add support of image overlays with arbitrary perspective transformation. - Alexander Parshin, + Alexander Parshin, Sergey Alekseev @@ -628,6 +628,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Patrick Arlt + + + Leaflet.OpenCage.Search + + + A search plugin plugin that uses OpenCage Data's geocoding API. + + + The OpenCage team + + @@ -1257,7 +1268,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s WordPress Leaflet Map - Interactive and flexible shortcode to create multiple maps in posts and pages, + Interactive and flexible shortcode to create multiple maps in posts and pages, and to add multiple markers on those maps. Benjamin J DeLong From f754fb2f99bccbfe3df5b073c36a14532f015de1 Mon Sep 17 00:00:00 2001 From: Ilya Zverev Date: Fri, 27 Jun 2014 15:12:28 +0400 Subject: [PATCH 1057/2207] update LimitZoom repository --- plugins.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 11f39759f42..6fe41369b0e 100644 --- a/plugins.md +++ b/plugins.md @@ -1135,9 +1135,10 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - Leaflet LimitZoom + Leaflet LimitZoom - Limits available zoom levels to a given list. + Plugins to limit available zoom levels to a given list, either by + restricting zooming or by interpolating tiles. Ilya Zverev From 07d5b6448887cd36ae1ab8c660f8e43f80712802 Mon Sep 17 00:00:00 2001 From: zimmicz Date: Fri, 27 Jun 2014 21:12:35 +0200 Subject: [PATCH 1058/2207] Leaflet Coordinates Control pull request --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index e650a933e78..ec31ad12377 100644 --- a/plugins.md +++ b/plugins.md @@ -1153,6 +1153,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Ilya Zverev + + + Leaflet Coordinates Control + + Captures mouseclick and displays its coordinates with easy way to copy them. + + Michal Zimmermann + + From f50806e1cab6ef26db7503c8382a5283fc1676ce Mon Sep 17 00:00:00 2001 From: "francis.chan" Date: Sun, 29 Jun 2014 20:22:44 +0800 Subject: [PATCH 1059/2207] invoke _clearBgBuffer function to reset layer div container when zoom out of max or minZoom. --- src/layer/tile/GridLayer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index cc39f29314d..65a2c74b711 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -241,7 +241,10 @@ L.GridLayer = L.Layer.extend({ tileSize = this._getTileSize(); if (zoom > this.options.maxZoom || - zoom < this.options.minZoom) { return; } + zoom < this.options.minZoom) { + this._clearBgBuffer(); + return; + } // tile coordinates range for the current view var tileBounds = L.bounds( From ac615cb89e50cbc9762107dbf9ae03d25fa1bd3e Mon Sep 17 00:00:00 2001 From: "francis.chan" Date: Mon, 30 Jun 2014 10:28:48 +0800 Subject: [PATCH 1060/2207] can customize alt attribute of the image in imageOverlay. --- src/layer/ImageOverlay.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 42deb3b8b77..b2ac282b308 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -5,7 +5,8 @@ L.ImageOverlay = L.Layer.extend({ options: { - opacity: 1 + opacity: 1, + alt: '' }, initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) @@ -90,6 +91,7 @@ L.ImageOverlay = L.Layer.extend({ img.onload = L.bind(this.fire, this, 'load'); img.src = this._url; + img.alt = this.options.alt; }, _animateZoom: function (e) { From d68cab7322ccb45eae1f98a25ebc3154efbb651b Mon Sep 17 00:00:00 2001 From: ericdahl Date: Mon, 30 Jun 2014 18:35:13 -0500 Subject: [PATCH 1061/2207] fix FAQ links --- FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.md b/FAQ.md index 669662ae526..e44e363d3ff 100644 --- a/FAQ.md +++ b/FAQ.md @@ -29,7 +29,7 @@ Check out [this example](http://leaflet-extras.github.io/leaflet-providers/previ with half a hundred different layers to choose from. Popular commercial options, free up to a particular number of requests, include [MapBox](http://mapbox.com), -[Bing Maps](http://www.microsoft.com/maps/choose-your-binge's-maps-API.aspx) (using a [plugin](https://github.com/shramov/leaflet-plugins)), +[Bing Maps](http://www.microsoft.com/maps/choose-your-bing-maps-API.aspx) (using a [plugin](https://github.com/shramov/leaflet-plugins)), [Esri ArcGIS](http://www.arcgis.com/features/maps/imagery.html) ([official plugin](https://github.com/Esri/esri-leaflet)) and [Nokia Here](http://developer.here.com/web-experiences). A notable exception is [MapQuest Open](http://developer.mapquest.com/web/products/open/map), which is free for any number of requests. @@ -45,7 +45,7 @@ and [MapQuest Open](http://developer.mapquest.com/web/products/open/map) provide #### I want to use Google Maps API tiles with Leaflet, can I do that? -The problem with Google is that its [Terms of Use](https://developers.google.com/maps/terms?hl=ru) forbid any means of tile access other than through the Google Maps API. +The problem with Google is that its [Terms of Use](https://developers.google.com/maps/terms) forbid any means of tile access other than through the Google Maps API. You can add the Google Maps API as a Leaflet layer with a [plugin](https://github.com/shramov/leaflet-plugins). But note that the map experience will not be perfect, because Leaflet will just act as a proxy to the Google Maps JS engine, so you won't get all the performance and usability benefits of using Leaflet when the Google layer is on. From 9177b7080591d6f67db1880188c8e4ceed67e9dc Mon Sep 17 00:00:00 2001 From: ericdahl Date: Mon, 30 Jun 2014 18:46:20 -0500 Subject: [PATCH 1062/2207] Fix typos in CONTRIBUTING --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 052240d1955..1e4ec7f69ca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,7 @@ try asking [on the Leaflet forum](https://groups.google.com/forum/#!forum/leafle ### Considerations for Accepting Patches -While we happily accept patches, we're also commited to keeping Leaflet simple, lightweight and blazingly fast. +While we happily accept patches, we're also committed to keeping Leaflet simple, lightweight and blazingly fast. So bugfixes, performance optimizations and small improvements that don't add a lot of code are much more likely to get accepted quickly. @@ -53,7 +53,7 @@ Before sending a pull request with a new feature, first check if it's been discu or [Leaflet UserVoice](http://leaflet.uservoice.com/)), and then ask yourself two questions: - 1. Are you sure that this new feature is important enough to justify its presense in the Leaflet core? + 1. Are you sure that this new feature is important enough to justify its presence in the Leaflet core? Or will it look better as a plugin in a separate repository? 2. Is it written in a simple, concise way that doesn't add bulk to the codebase? @@ -85,7 +85,7 @@ Please do not commit to the `master` branch, or your unrelated changes will go i You should also follow the code style and whitespace conventions of the original codebase. In particular, use tabs for indentation and spaces for alignment. -Before commiting your changes, run `jake lint` to catch any JS errors in the code and fix them. +Before committing your changes, run `jake lint` to catch any JS errors in the code and fix them. If you add any new files to the Leaflet source, make sure to also add them to `build/deps.js` so that the build system knows about them. @@ -142,7 +142,7 @@ If you need to make edits in a local repository to see how it looks in the proce 4. Open `localhost:4000` in your browser. Now any file changes will be updated when you reload pages automatically. -After commiting the changes, just send a pull request. +After committing the changes, just send a pull request. If you need to update documentation according to a new feature that only appeared in the master version (not stable one), you need to make changes to `gh-pages-master` branch instead of `gh-pages`. From 685998821648814e4fc1f2e61e6747353e63a484 Mon Sep 17 00:00:00 2001 From: rowanwins Date: Fri, 4 Jul 2014 20:48:07 +1000 Subject: [PATCH 1063/2207] Added easyPrint plugin --- plugins.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins.md b/plugins.md index 5146de91571..ccdf45f6a0f 100644 --- a/plugins.md +++ b/plugins.md @@ -1274,6 +1274,14 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s + + Leaflet-easyPrint + + A simple leaflet plugin which adds an icon to print the map. The resulting print page will strip ot the other content on the page and only print the leaflet map div. + Rowan Winsemius + + + Leaflet-active-area From 2124c173df6b667f0cb118f01e9415bdff95a983 Mon Sep 17 00:00:00 2001 From: Austen Talbot Date: Sat, 5 Jul 2014 14:40:23 -0700 Subject: [PATCH 1064/2207] Make indentation consistent Update indentation on line 27 to be consistent with rest of file --- dist/leaflet.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 1edf2b1460a..06dd0512082 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -24,7 +24,7 @@ -webkit-user-select: none; -moz-user-select: none; user-select: none; - -webkit-user-drag: none; + -webkit-user-drag: none; } /* Safari renders non-retina tile on retina better with this, but Chrome is worse */ .leaflet-safari .leaflet-tile { From 7af5adaf0a2028225f6f70229f9cb41a5740344b Mon Sep 17 00:00:00 2001 From: Austen Talbot Date: Sat, 5 Jul 2014 20:17:57 -0700 Subject: [PATCH 1065/2207] Changed language referring to layers Adjusted language to sound more normal. Changed "half a hundred" to "over seventy." --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index e44e363d3ff..47f24966237 100644 --- a/FAQ.md +++ b/FAQ.md @@ -26,7 +26,7 @@ You can roll your own tiles as well. but there are providers that use other sources. Check out [this example](http://leaflet-extras.github.io/leaflet-providers/preview/) -with half a hundred different layers to choose from. +with over seventy different layers to choose from. Popular commercial options, free up to a particular number of requests, include [MapBox](http://mapbox.com), [Bing Maps](http://www.microsoft.com/maps/choose-your-bing-maps-API.aspx) (using a [plugin](https://github.com/shramov/leaflet-plugins)), From d1cf1b70beb340982bd2e452bd780e43e6b1afec Mon Sep 17 00:00:00 2001 From: gerbsen Date: Tue, 8 Jul 2014 18:17:07 +0200 Subject: [PATCH 1066/2207] =?UTF-8?q?Added=20Route360=C2=B0=20Library=20to?= =?UTF-8?q?=20routing=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hey, This is my first plugin, so I don't exactly know how this works. Our library is based on leaflet and we have used the project structure of leaflet, we implemented a custom polygon layer and added some custom controls. A demo about the capabilities can be found at the demo site: http://route360.net/project/tutorial/ Any feedback is kindly appreciated. Cheers, Daniel --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5146de91571..b536a45511d 100644 --- a/plugins.md +++ b/plugins.md @@ -669,6 +669,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Norwegian Trekking Association + + + Route360° + + Route360° visualizes the area which is reachable from a set of starting points in a given time and gives detailed routing information (walk, bike, car and public transportation) to targets. + + Motion Intelligence GmbH + + From 5fffe157506b6f8d6e3fbd290103d939a9f15e91 Mon Sep 17 00:00:00 2001 From: Antoine Pultier Date: Thu, 10 Jul 2014 10:58:04 +0200 Subject: [PATCH 1067/2207] Add Leaflet.GameController in the plugins list --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index b536a45511d..5a6937f457a 100644 --- a/plugins.md +++ b/plugins.md @@ -1172,6 +1172,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Michal Zimmermann + + + Leaflet GameController + + Interaction handler providing support for gamepads. + + Antoine Pultier + + From 597c4b51e5e81c332383e00d0301f07c7a69410e Mon Sep 17 00:00:00 2001 From: rowanwins Date: Fri, 11 Jul 2014 09:24:06 +1000 Subject: [PATCH 1068/2207] Update plugins.md --- plugins.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index ccdf45f6a0f..1253dbcffd8 100644 --- a/plugins.md +++ b/plugins.md @@ -1277,7 +1277,8 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet-easyPrint - A simple leaflet plugin which adds an icon to print the map. The resulting print page will strip ot the other content on the page and only print the leaflet map div. + A simple leaflet plugin which adds an icon to print the map. The resulting print page will strip ot the other content on the page and only print the leaflet map div. + Rowan Winsemius From c9118b118e90c06366d2dc6b77d092557ee4f761 Mon Sep 17 00:00:00 2001 From: rowanwins Date: Fri, 11 Jul 2014 09:25:27 +1000 Subject: [PATCH 1069/2207] Update plugins.md --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 1253dbcffd8..f00e762f7c4 100644 --- a/plugins.md +++ b/plugins.md @@ -1282,7 +1282,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Rowan Winsemius - + Leaflet-active-area From 410068c08fc1651474533c79ade81884dce90fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Orru=CC=80?= Date: Sun, 13 Jul 2014 11:41:52 +0200 Subject: [PATCH 1070/2207] Fixed 'bounceAtZoomLimits' when you don't start pinching from max\min level --- src/map/handler/Map.TouchZoom.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 741f83eacb1..ab90795ef85 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -54,9 +54,11 @@ L.Map.TouchZoom = L.Handler.extend({ this._scale = p1.distanceTo(p2) / this._startDist; this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); - if (!map.options.bounceAtZoomLimits && - ((map.getZoom() === map.getMinZoom() && this._scale < 1) || - (map.getZoom() === map.getMaxZoom() && this._scale > 1))) { return; } + if (!map.options.bounceAtZoomLimits) { + var currentZoom = map.getScaleZoom(this._scale); + if ((currentZoom <= map.getMinZoom() && this._scale < 1) || + (currentZoom >= map.getMaxZoom() && this._scale > 1)) { return; } + } if (!this._moved) { map From 390e925fe4096214e7a7b1c367b6acf8cd44f028 Mon Sep 17 00:00:00 2001 From: stefano cudini Date: Sun, 13 Jul 2014 18:29:24 +0200 Subject: [PATCH 1071/2207] add new plugin Leaflet Control Compass --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5a6f9a4a98e..91e06de2a6b 100644 --- a/plugins.md +++ b/plugins.md @@ -1181,6 +1181,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Antoine Pultier + + + Leaflet Control Compass + + A leaflet control plugin to build a simple rotating compass + + Stefano Cudini + + From f9d9489e7edad267a52c9feb540f0d28abad3a7d Mon Sep 17 00:00:00 2001 From: henrythasler Date: Tue, 15 Jul 2014 20:49:07 +0200 Subject: [PATCH 1072/2207] Update plugins.md Added Leaflet.Geodesic --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5a6f9a4a98e..ee06d3dfaad 100644 --- a/plugins.md +++ b/plugins.md @@ -397,6 +397,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Christopher Baines + + + Leaflet.Geodesic + + Draw geodesic (poly)lines. A geodesic line is the shortest path between two given positions on the earth surface. and You can also calculate the exact distance between two given points on the map. + + Henry Thasler + + From ba7dc5a5542623305b638e12debc78deb74546f5 Mon Sep 17 00:00:00 2001 From: Ondrej Zvara Date: Tue, 15 Jul 2014 21:44:24 +0200 Subject: [PATCH 1073/2207] Leaflet.MeasureAreaControl plugin pull request --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5a6f9a4a98e..87e3b72f12b 100644 --- a/plugins.md +++ b/plugins.md @@ -1181,6 +1181,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Antoine Pultier + + + Leaflet.MeasureAreaControl + + Control for measuring element's area. + + Ondrej Zvara + + From c4d99f33b2bec4a63d6c24e2725552417dbb7009 Mon Sep 17 00:00:00 2001 From: bullgare Date: Fri, 18 Jul 2014 16:21:31 +0400 Subject: [PATCH 1074/2207] mousemove event for marker --- src/layer/marker/Marker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 434b4e43208..d8a3d8e6dcd 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -205,7 +205,7 @@ L.Marker = L.Layer.extend({ L.DomUtil.addClass(this._icon, 'leaflet-clickable'); - L.DomEvent.on(this._icon, 'click dblclick mousedown mouseup mouseover mouseout contextmenu keypress', + L.DomEvent.on(this._icon, 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu keypress', this._fireMouseEvent, this); if (L.Handler.MarkerDrag) { From 173a37e976ebbd6fd9dc403760520a8c103fa643 Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Fri, 18 Jul 2014 15:40:44 +0200 Subject: [PATCH 1075/2207] Implement #2702 Add map.eachLayer() to reference page --- reference.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/reference.html b/reference.html index d5a0878c246..a5ced329ada 100644 --- a/reference.html +++ b/reference.html @@ -820,6 +820,18 @@

      Methods for Layers and Controls

      Boolean Returns true if the given layer is currently added to the map. + + eachLayer( + <Function> fn, + <Object> context? ) + + this + Iterates over the layers of the map, optionally specifying context of the iterator function. +
      map.eachLayer(function (layer) {
      +	layer.bindPopup('Hello');
      +});
      + + openPopup( From d5931ad35a55cc00a020f7268b6fab80e1a0e373 Mon Sep 17 00:00:00 2001 From: bennlich Date: Sun, 20 Jul 2014 22:14:30 -0700 Subject: [PATCH 1076/2207] added _abortLoading() to _reset() --- src/layer/tile/GridLayer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index cc39f29314d..0bb181b1177 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -191,6 +191,10 @@ L.GridLayer = L.Layer.extend({ }); } + if (this._abortLoading) { + this._abortLoading(); + } + this._tiles = {}; this._tilesToLoad = 0; this._tilesTotal = 0; From 412bbd7cdb1ede7af8797fd1a2c4d07b237be8a4 Mon Sep 17 00:00:00 2001 From: bennlich Date: Sun, 20 Jul 2014 22:16:11 -0700 Subject: [PATCH 1077/2207] always clear tile onload and onerror funs in _abortLoading() --- src/layer/tile/TileLayer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 5c259f593c6..2e5aa9d5d9e 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -143,11 +143,11 @@ L.TileLayer = L.GridLayer.extend({ for (i in this._tiles) { tile = this._tiles[i]; + tile.onload = L.Util.falseFn; + tile.onerror = L.Util.falseFn; + if (!tile.complete) { - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; tile.src = L.Util.emptyImageUrl; - L.DomUtil.remove(tile); } } From 311e988aa00e9424824055a21b527df47e0bcb14 Mon Sep 17 00:00:00 2001 From: Justin Manley Date: Wed, 23 Jul 2014 15:54:09 -0500 Subject: [PATCH 1078/2207] Add comment to removeEventListener doc noting that arguments to removeEventListener must be the same as those passed to addEventListener. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index d5a0878c246..6f67d10b43c 100644 --- a/reference.html +++ b/reference.html @@ -4645,7 +4645,7 @@

      Methods

      this - Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. + Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to addEventListener, you must pass the same context to removeEventListener in order to remove the listener. removeEventListener( From aeea88b9fcb785b9ae4894a96f265c8b39bdf392 Mon Sep 17 00:00:00 2001 From: jfgodoy Date: Thu, 24 Jul 2014 00:44:42 -0400 Subject: [PATCH 1079/2207] fix memory leak generated by setIcon when setIcon is called this.dragging is replaced without be disabled before, so hooks remains active. --- src/layer/marker/Marker.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index d8a3d8e6dcd..7a73b187638 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -209,6 +209,10 @@ L.Marker = L.Layer.extend({ this._fireMouseEvent, this); if (L.Handler.MarkerDrag) { + if (this.dragging) { + this.dragging.disable(); + } + this.dragging = new L.Handler.MarkerDrag(this); if (this.options.draggable) { From dde5e26a604ef2fde80452b0a42a044b92a61860 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Wed, 30 Jul 2014 10:02:31 +0200 Subject: [PATCH 1080/2207] Mention Leaflet.LineExtremities --- plugins.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index bfabfb3cbdb..6164dc44ac8 100644 --- a/plugins.md +++ b/plugins.md @@ -406,7 +406,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Henry Thasler - + + + Leaflet.LineExtremities + + Show symbols at the extremities of polylines, using SVG markers. + + Frédéric Bonifas + + From 9b8457b0125a46e8294c5c9007cc7bb5395bb007 Mon Sep 17 00:00:00 2001 From: Adam Ratcliffe Date: Thu, 31 Jul 2014 15:26:44 +1200 Subject: [PATCH 1081/2207] Added Leaflet.twoFingerZoom plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 6164dc44ac8..2013621e5ec 100644 --- a/plugins.md +++ b/plugins.md @@ -1207,6 +1207,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Ondrej Zvara + + + Leaflet.twofingerZoom + + Interaction handler for touch devices enabling zooming out with a two finger tap. + + Adam Ratcliffe + + From abfcd9ea59d03d05f266a3ce1909c6bce1d0c80e Mon Sep 17 00:00:00 2001 From: bennlich Date: Thu, 31 Jul 2014 15:38:21 -0600 Subject: [PATCH 1082/2207] Added TileLayerSpec.js tests for loading events --- spec/suites/layer/tile/TileLayerSpec.js | 102 ++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/spec/suites/layer/tile/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js index 34c9b49860b..0b79ed68996 100644 --- a/spec/suites/layer/tile/TileLayerSpec.js +++ b/spec/suites/layer/tile/TileLayerSpec.js @@ -105,4 +105,106 @@ describe('TileLayer', function () { }); }); }); + + describe("'loading' event", function() { + var tileUrl1 = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png', + tileUrl2 = 'http://{s}.tile.stamen.com/toner/{z}/{x}/{y}.png'; + + // Inject Leaflet css + var head = document.getElementsByTagName("head")[0], + link = document.createElement("link"); + link.href = "../dist/leaflet.css"; + link.type = "text/css"; + link.rel = "stylesheet"; + head.appendChild(link); + + // Add map div to DOM. The map panning tests do not work reliably unless + // the Leaflet map is properly styled and part of the DOM + var mapDiv = document.createElement('div'); + mapDiv.style.height = '256px'; + mapDiv.style.width = '256px'; + document.body.appendChild(mapDiv); + + this.afterAll(function() { + document.body.removeChild(mapDiv); + }); + + // Set the map zoom high enough that panning by 256 pixels necessarily loads more tiles + var myMap = L.map(mapDiv).setView([0, 0], 13); + + describe("after a tilelayer has been initialized with an empty string", function() { + var layer = L.tileLayer(''); + var updateInterval = layer.options.updateInterval + 500; + + var loadingSpy; + beforeEach(function() { + loadingSpy = sinon.spy(); + layer.on('loading', function() { loadingSpy(); }); + }); + afterEach(function() { + layer.off('loading'); + }); + + it("is fired when the tilelayer is added to the map", function() { + layer.addTo(myMap); + expect(loadingSpy.calledOnce).to.be.ok(); + }); + + it("is fired again when the tilelayer has its url set to a real tile url", function(done) { + layer.setUrl(tileUrl2); + + setTimeout(function() { + expect(loadingSpy.calledOnce).to.be.ok(); + done(); + }, updateInterval); + }); + + it("is fired again when the map is panned enough to load more tiles", function(done) { + myMap.panBy([256,256]); + + setTimeout(function() { + expect(loadingSpy.calledOnce).to.be.ok(); + done(); + }, updateInterval); + }); + }); + + describe("after a tilelayer has been initialized with a real tile url", function() { + var layer = L.tileLayer(tileUrl1); + var updateInterval = layer.options.updateInterval + 500; + + var loadingSpy; + beforeEach(function() { + loadingSpy = sinon.spy(); + layer.on('loading', function() { loadingSpy(); }); + }); + afterEach(function() { + layer.off('loading'); + }); + + it("is fired when the tilelayer is added to the map", function() { + layer.addTo(myMap); + expect(loadingSpy.calledOnce).to.be.ok(); + }); + + it("is fired again when the tilelayer has its url set to a real tile url", function(done) { + layer.setUrl(tileUrl2); + + setTimeout(function() { + expect(loadingSpy.calledOnce).to.be.ok(); + done(); + }, updateInterval); + }); + + it("is fired again when the map is panned enough to load more tiles", function(done) { + myMap.panBy([256,256]); + + setTimeout(function() { + expect(loadingSpy.calledOnce).to.be.ok(); + done(); + }, updateInterval); + }); + }); + }); + }); From 4eb033c7196a8b490e449efb238c84efd24262b0 Mon Sep 17 00:00:00 2001 From: bennlich Date: Thu, 31 Jul 2014 23:43:14 -0600 Subject: [PATCH 1083/2207] Included leaflet.css in html instead of TileLayerSpec.js --- spec/index.html | 1 + spec/suites/layer/tile/TileLayerSpec.js | 8 -------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/spec/index.html b/spec/index.html index 2be6539153d..fe8a8c1ba6c 100644 --- a/spec/index.html +++ b/spec/index.html @@ -4,6 +4,7 @@ Leaflet Spec Runner +
      diff --git a/spec/suites/layer/tile/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js index 0b79ed68996..f4439b9b5bc 100644 --- a/spec/suites/layer/tile/TileLayerSpec.js +++ b/spec/suites/layer/tile/TileLayerSpec.js @@ -110,14 +110,6 @@ describe('TileLayer', function () { var tileUrl1 = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png', tileUrl2 = 'http://{s}.tile.stamen.com/toner/{z}/{x}/{y}.png'; - // Inject Leaflet css - var head = document.getElementsByTagName("head")[0], - link = document.createElement("link"); - link.href = "../dist/leaflet.css"; - link.type = "text/css"; - link.rel = "stylesheet"; - head.appendChild(link); - // Add map div to DOM. The map panning tests do not work reliably unless // the Leaflet map is properly styled and part of the DOM var mapDiv = document.createElement('div'); From 64039917bd2cc6fe4610fcbd506628591ba25133 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 3 Aug 2014 22:53:00 +0200 Subject: [PATCH 1084/2207] Suggestion to add Leaflet.Editable in plugins list --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index b75b7f2c4df..23a3e02ca58 100644 --- a/plugins.md +++ b/plugins.md @@ -1225,6 +1225,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Stefano Cudini + + + Leaflet.Editable + + Lightweight fully customisable and controlable drawing/editing plugin. + + Yohan Boniface + + From b5091248e11514efa4d93673275cf8270df1e998 Mon Sep 17 00:00:00 2001 From: M165437 Date: Mon, 4 Aug 2014 16:23:06 -0400 Subject: [PATCH 1085/2207] Add Leaflet.AccuratePosition plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 23a3e02ca58..1abe3ec36ed 100644 --- a/plugins.md +++ b/plugins.md @@ -1234,6 +1234,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Yohan Boniface + + + Leaflet.AccuratePosition + + Leaflet.AccuratePosition aims to provide a desired device location accuracy. + + Michael Schmidt-Voigt + + From fd7ebcb5aaa14f32471bf554cf77c6b46841bd5e Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 00:09:01 +0300 Subject: [PATCH 1086/2207] Issue #2619 fixed. Now Map.js/_fireMouseEvent checks dragging.moved() on moved object instead on map --- debug/map/markers.html | 57 ++++++++++++++++++++++++++++++++++++++ src/layer/marker/Marker.js | 2 -- src/map/Map.js | 3 +- 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 debug/map/markers.html diff --git a/debug/map/markers.html b/debug/map/markers.html new file mode 100644 index 00000000000..e560718547f --- /dev/null +++ b/debug/map/markers.html @@ -0,0 +1,57 @@ + + + + Leaflet debug page + + + + + + + + + + + + +
      + + + + diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 7a73b187638..8636f35d959 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -227,8 +227,6 @@ L.Marker = L.Layer.extend({ L.DomEvent.preventDefault(e); } - if (e.type === 'click' && this.dragging && this.dragging.moved()) { return; } - if (e.type === 'keypress' && e.keyCode === 13) { type = 'click'; } diff --git a/src/map/Map.js b/src/map/Map.js index 31c7d072032..b3c6db958b7 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -566,9 +566,8 @@ L.Map = L.Evented.extend({ type = type || e.type; if (L.DomEvent._skipped(e)) { return; } - if (type === 'click') { - if (!e._simulated && ((this.dragging && this.dragging.moved()) || + if (!e._simulated && ((obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()))) { return; } obj.fire('preclick'); } From a2825920fa1b377a4d3dea0737732db7642cf0cd Mon Sep 17 00:00:00 2001 From: Kevin DeLoach Date: Mon, 4 Aug 2014 10:59:25 -0400 Subject: [PATCH 1087/2207] Add uppercase option for WMS TileLayer. In response to issue #1751, WMS TileLayer request parameter keys were cast to uppercase. This is a breaking change for services that are case sensitive and expect lowercase keys. This change adds a new option to uppercase keys, which is false by default, to preserve backwards compatibility. --- src/layer/tile/TileLayer.WMS.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/layer/tile/TileLayer.WMS.js b/src/layer/tile/TileLayer.WMS.js index b7386373fb7..c76dcee2053 100644 --- a/src/layer/tile/TileLayer.WMS.js +++ b/src/layer/tile/TileLayer.WMS.js @@ -22,7 +22,9 @@ L.TileLayer.WMS = L.TileLayer.extend({ // all keys that are not TileLayer options go to WMS params for (var i in options) { - if (!this.options.hasOwnProperty(i) && i !== 'crs') { + if (!this.options.hasOwnProperty(i) && + i !== 'crs' && + i !== 'uppercase') { wmsParams[i] = options[i]; } } @@ -38,6 +40,7 @@ L.TileLayer.WMS = L.TileLayer.extend({ onAdd: function (map) { this._crs = this.options.crs || map.options.crs; + this._uppercase = this.options.uppercase || false; this._wmsVersion = parseFloat(this.wmsParams.version); @@ -59,7 +62,9 @@ L.TileLayer.WMS = L.TileLayer.extend({ url = L.TileLayer.prototype.getTileUrl.call(this, coords); - return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; + return url + + L.Util.getParamString(this.wmsParams, url, this._uppercase) + + (this._uppercase ? '&BBOX=' : '&bbox=') + bbox; }, setParams: function (params, noRedraw) { From 38476615e61ab709b3a54e3b0665f4a93bb57303 Mon Sep 17 00:00:00 2001 From: bullgare Date: Tue, 5 Aug 2014 17:37:20 +0400 Subject: [PATCH 1088/2207] svg's attribute fill-rule supports two values: 'evenodd' and 'nonzero'. now we can set it via options and it's not hardcoded. https://developer.mozilla.org/ru/docs/Web/SVG/Attribute/fill-rule --- src/layer/vector/Path.js | 1 + src/layer/vector/SVG.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index d4dea2a28b3..7f65a306041 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -17,6 +17,7 @@ L.Path = L.Layer.extend({ // fill: false // fillColor: same as color by default fillOpacity: 0.2, + fillRule: 'evenodd', // className: '' clickable: true diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index 1bc01eb2865..ab21b736943 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -111,7 +111,7 @@ L.SVG = L.Renderer.extend({ if (options.fill) { path.setAttribute('fill', options.fillColor || options.color); path.setAttribute('fill-opacity', options.fillOpacity); - path.setAttribute('fill-rule', 'evenodd'); + path.setAttribute('fill-rule', options.fillRule || 'evenodd'); } else { path.setAttribute('fill', 'none'); } From f5cfddb60d174f1f8d098ca4257f84695e31e0c2 Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 16:49:33 +0300 Subject: [PATCH 1089/2207] #2501, wheelDebounceTime option added --- src/map/handler/Map.ScrollWheelZoom.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index df2e614bee2..b9242318a6f 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -3,7 +3,8 @@ */ L.Map.mergeOptions({ - scrollWheelZoom: true + scrollWheelZoom: true, + wheelDebounceTime: 40 }); L.Map.ScrollWheelZoom = L.Handler.extend({ @@ -24,7 +25,8 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ }, _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e); + var delta = L.DomEvent.getWheelDelta(e), + debounce = this._map.options.wheelDebounceTime; this._delta += delta; this._lastMousePos = this._map.mouseEventToContainerPoint(e); @@ -33,7 +35,7 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ this._startTime = +new Date(); } - var left = Math.max(40 - (+new Date() - this._startTime), 0); + var left = Math.max(debounce - (+new Date() - this._startTime), 0); clearTimeout(this._timer); this._timer = setTimeout(L.bind(this._performZoom, this), left); From 62ca8a825a4715be1ee2ace43c5df1c540aa6b1e Mon Sep 17 00:00:00 2001 From: Alexander Burtsev Date: Tue, 5 Aug 2014 17:50:00 +0400 Subject: [PATCH 1090/2207] Add Leaflet.geojsonCSS plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 1abe3ec36ed..30859668609 100644 --- a/plugins.md +++ b/plugins.md @@ -579,6 +579,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Patrick Arlt + + + Leaflet.geojsonCSS + + Geojson CSS implementation for Leaflet. + + Alexander Burtsev + + From a321406cf8a12ce15b453fa0df20da979e759bb4 Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 17:13:10 +0300 Subject: [PATCH 1091/2207] #2501, tab fixed --- src/map/handler/Map.ScrollWheelZoom.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index b9242318a6f..77ada01601e 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -25,8 +25,8 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ }, _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e), - debounce = this._map.options.wheelDebounceTime; + var delta = L.DomEvent.getWheelDelta(e); + var debounce = this._map.options.wheelDebounceTime; this._delta += delta; this._lastMousePos = this._map.mouseEventToContainerPoint(e); From 9445c2f9f277f74ae7176bdabacf3a9bfcd07aae Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 18:14:02 +0300 Subject: [PATCH 1092/2207] this commit fixes #2499 --- debug/tests/click_on_canvas.html | 2 +- debug/tests/svg_clicks.html | 2 +- dist/leaflet.css | 6 +++--- src/layer/marker/Marker.js | 6 +++--- src/layer/vector/Canvas.js | 6 +++--- src/layer/vector/Path.js | 2 +- src/layer/vector/SVG.js | 6 +++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/debug/tests/click_on_canvas.html b/debug/tests/click_on_canvas.html index f4a6b9c075b..ac9b21f4e12 100644 --- a/debug/tests/click_on_canvas.html +++ b/debug/tests/click_on_canvas.html @@ -35,7 +35,7 @@ opacity: 1, smoothFactor: 1, color: 'red', - clickable:true + interactive:true })); polygons.on('click', function(m) { diff --git a/debug/tests/svg_clicks.html b/debug/tests/svg_clicks.html index 11be258ecfd..706f3456817 100644 --- a/debug/tests/svg_clicks.html +++ b/debug/tests/svg_clicks.html @@ -43,7 +43,7 @@ [51, 7.000], [51.002, 7.004] ], - { clickable:false,color:'#f00' } + { interactive:false,color:'#f00' } ).addTo(map); // when the mouse hovers over the red route2, you cannot click through the blue route1 beneath diff --git a/dist/leaflet.css b/dist/leaflet.css index 06dd0512082..4f7461547bc 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -171,7 +171,7 @@ /* cursors */ -.leaflet-clickable { +.leaflet-interactive { cursor: pointer; } .leaflet-container { @@ -179,7 +179,7 @@ cursor: -moz-grab; } .leaflet-crosshair, -.leaflet-crosshair .leaflet-clickable { +.leaflet-crosshair .leaflet-interactive { cursor: crosshair; } .leaflet-popup-pane, @@ -187,7 +187,7 @@ cursor: auto; } .leaflet-dragging .leaflet-container, -.leaflet-dragging .leaflet-clickable { +.leaflet-dragging .leaflet-interactive { cursor: move; cursor: -webkit-grabbing; cursor: -moz-grabbing; diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 8636f35d959..2bc92a19e06 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -10,7 +10,7 @@ L.Marker = L.Layer.extend({ icon: new L.Icon.Default(), // title: '', // alt: '', - clickable: true, + interactive: true, // draggable: false, keyboard: true, zIndexOffset: 0, @@ -201,9 +201,9 @@ L.Marker = L.Layer.extend({ _initInteraction: function () { - if (!this.options.clickable) { return; } + if (!this.options.interactive) { return; } - L.DomUtil.addClass(this._icon, 'leaflet-clickable'); + L.DomUtil.addClass(this._icon, 'leaflet-interactive'); L.DomEvent.on(this._icon, 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu keypress', this._fireMouseEvent, this); diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 5958009060f..e05f2d3ec47 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -207,12 +207,12 @@ L.Canvas = L.Renderer.extend({ }, _handleHover: function (layer, e, point) { - if (!layer.options.clickable) { return; } + if (!layer.options.interactive) { return; } if (layer._containsPoint(point)) { // if we just got inside the layer, fire mouseover if (!layer._mouseInside) { - L.DomUtil.addClass(this._container, 'leaflet-clickable'); // change cursor + L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor layer._fireMouseEvent(e, 'mouseover'); layer._mouseInside = true; } @@ -221,7 +221,7 @@ L.Canvas = L.Renderer.extend({ } else if (layer._mouseInside) { // if we're leaving the layer, fire mouseout - L.DomUtil.removeClass(this._container, 'leaflet-clickable'); + L.DomUtil.removeClass(this._container, 'leaflet-interactive'); layer._fireMouseEvent(e, 'mouseout'); layer._mouseInside = false; } diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index d4dea2a28b3..70e575ad8cd 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -19,7 +19,7 @@ L.Path = L.Layer.extend({ fillOpacity: 0.2, // className: '' - clickable: true + interactive: true }, onAdd: function () { diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index 1bc01eb2865..553bb7e4dcc 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -56,8 +56,8 @@ L.SVG = L.Renderer.extend({ L.DomUtil.addClass(path, layer.options.className); } - if (layer.options.clickable) { - L.DomUtil.addClass(path, 'leaflet-clickable'); + if (layer.options.interactive) { + L.DomUtil.addClass(path, 'leaflet-interactive'); } this._updateStyle(layer); @@ -116,7 +116,7 @@ L.SVG = L.Renderer.extend({ path.setAttribute('fill', 'none'); } - path.setAttribute('pointer-events', options.pointerEvents || (options.clickable ? 'visiblePainted' : 'none')); + path.setAttribute('pointer-events', options.pointerEvents || (options.interactive ? 'visiblePainted' : 'none')); }, _updatePoly: function (layer, closed) { From d1f8aad7124376bb978eba43419677036beb698e Mon Sep 17 00:00:00 2001 From: "i.vasilevskiy" Date: Sat, 9 Aug 2014 21:54:42 +0400 Subject: [PATCH 1093/2207] Fix map click event name --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b1ddc0c413a..784c69afb6f 100644 --- a/reference.html +++ b/reference.html @@ -4598,7 +4598,7 @@

      Options

      Events methods

      -

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'fire' event).

      +

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

      Example

      From 1bdd7cf41a59b8810fbdf55a40ce6a16a6a9a360 Mon Sep 17 00:00:00 2001 From: b_b Date: Sun, 10 Aug 2014 18:44:14 +0200 Subject: [PATCH 1094/2207] Add getBounds() method to ImageOverlay Bugfix : ImageOverlay can be added to FeatueGroup, but calling getBounds on FeatureGroup throw an error cause ImageOverlay misses this method. --- src/layer/ImageOverlay.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index b2ac282b308..0c9bca02f30 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -81,6 +81,10 @@ L.ImageOverlay = L.Layer.extend({ return events; }, + + getBounds: function() { + return this._bounds; + }, _initImage: function () { var img = this._image = L.DomUtil.create('img', From f7ac72d073587c3f1c33076038f06a7d9f0eec9b Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Mon, 11 Aug 2014 15:14:37 +0300 Subject: [PATCH 1095/2207] issue #1871 fixed, set this._zoom on map init whenever options.zoom is provided --- src/map/Map.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/map/Map.js b/src/map/Map.js index b3c6db958b7..c84ae890180 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -33,6 +33,10 @@ L.Map = L.Evented.extend({ this.setMaxBounds(options.maxBounds); } + if (options.zoom !== undefined) { + this._zoom = options.zoom; + } + if (options.center && options.zoom !== undefined) { this.setView(L.latLng(options.center), options.zoom, {reset: true}); } From 31a09930b407bfae097959bbd3075b2631e0d8fe Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Mon, 11 Aug 2014 17:53:59 +0300 Subject: [PATCH 1096/2207] #1871, zoom limited --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index c84ae890180..9f986e21022 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -34,7 +34,7 @@ L.Map = L.Evented.extend({ } if (options.zoom !== undefined) { - this._zoom = options.zoom; + this._zoom = this._limitZoom(options.zoom); } if (options.center && options.zoom !== undefined) { From 773317c8f9e53f7f747105b02b4c547e92a4f69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oscar=20L=C3=B3pez?= Date: Wed, 13 Aug 2014 18:13:35 -0300 Subject: [PATCH 1097/2207] L.Class usage example Said L.Class where it should've said MyClass Usage example for L.Class options mechanism should refer to MyChildClass inheriting from MyClass instead of MyChildClass inheriting from L.Class directly. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b1ddc0c413a..5d72293d9bf 100644 --- a/reference.html +++ b/reference.html @@ -5069,7 +5069,7 @@

      Options

      } }); -var MyChildClass = L.Class.extend({ +var MyChildClass = MyClass.extend({ options: { myOption1: 'baz', myOption3: 5 From b2825f5ef576ba133ea6ea457be153c941ac1076 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 22 Aug 2014 16:11:25 +0400 Subject: [PATCH 1098/2207] Add leaflet.locationlist plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 30859668609..035c4c06aef 100644 --- a/plugins.md +++ b/plugins.md @@ -1252,6 +1252,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Michael Schmidt-Voigt + + + Leaflet Locationlist + + A control to jump between predefined locations and zooms. + + Ivan Ignatyev + + From 18938b0319b298055b2c45fe6393cf4213799b36 Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Sat, 23 Aug 2014 01:00:42 +0300 Subject: [PATCH 1099/2207] #2865, fixed bug with geometry/staticMarker click event after map dragging --- debug/map/markers.html | 11 +++++++++++ src/map/Map.js | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/debug/map/markers.html b/debug/map/markers.html index e560718547f..1bf803cf7d5 100644 --- a/debug/map/markers.html +++ b/debug/map/markers.html @@ -38,13 +38,24 @@ map.addLayer(markerDraggable); markerDraggable.bindPopup("Draggable"); + + var poly = new L.Polygon([[0, 10], [0, 15.5], [0, 50], [20, 20.5]]); + map.addLayer(poly); + + markerDraggable.on('click', function(e) { console.log('markerDraggable click'); }); + markerStatic.on('click', function(e) { + console.log('markerStatic click'); + }) map.on('click', function(e) { console.log('map click'); }); + poly.on('click', function(e) { + console.log('poly click'); + }); L.tileLayer('http://{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png', { attribution: "Map: Tiles Courtesy of MapQuest (OpenStreetMap, CC-BY-SA)", diff --git a/src/map/Map.js b/src/map/Map.js index 9f986e21022..7fda5050831 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -571,7 +571,8 @@ L.Map = L.Evented.extend({ if (L.DomEvent._skipped(e)) { return; } if (type === 'click') { - if (!e._simulated && ((obj.dragging && obj.dragging.moved()) || + var draggableObj = obj.options.draggable === true ? obj : this; + if (!e._simulated && ((draggableObj.dragging && draggableObj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()))) { return; } obj.fire('preclick'); } From 8a33e94c0e56634a749f378256905e9e23243483 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 25 Aug 2014 16:38:46 +0300 Subject: [PATCH 1100/2207] Fix scale control widths, close #2869 --- src/control/Control.Scale.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Control.Scale.js b/src/control/Control.Scale.js index 80b1a146ace..2dab310067e 100644 --- a/src/control/Control.Scale.js +++ b/src/control/Control.Scale.js @@ -80,7 +80,7 @@ L.Control.Scale = L.Control.extend({ }, _updateScale: function (scale, text, ratio) { - scale.style.width = (Math.round(this.options.maxWidth * ratio) - 10) + 'px'; + scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px'; scale.innerHTML = text; }, From b43da41575b64b21be97c349501658af9cd9d453 Mon Sep 17 00:00:00 2001 From: bullgare Date: Tue, 26 Aug 2014 15:35:58 +0400 Subject: [PATCH 1101/2207] it fixes marker's setIcon method, that flushes popup's options, which leads to breaking popup's custom offset --- src/layer/marker/Marker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 2bc92a19e06..6256cd84994 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -76,7 +76,7 @@ L.Marker = L.Layer.extend({ } if (this._popup) { - this.bindPopup(this._popup); + this.bindPopup(this._popup, this._popup.options); } return this; From 0c110985691e3562616a8d29f33d3329c5d1d003 Mon Sep 17 00:00:00 2001 From: Wildhoney Date: Tue, 26 Aug 2014 21:57:33 +0100 Subject: [PATCH 1102/2207] Added L.FreeDraw --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 035c4c06aef..22e9fe0f310 100644 --- a/plugins.md +++ b/plugins.md @@ -17,6 +17,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Description Maintainer + + + Leaflet.ellipse + + Zoopla inspired freehand polygon creation using Leaflet.js and D3. + + Wildhoney + + Leaflet.ellipse From 31ac409b94f83c4936ff13f91b9935600cf2f94d Mon Sep 17 00:00:00 2001 From: Alex Nguyen Date: Tue, 26 Aug 2014 16:27:37 -0500 Subject: [PATCH 1103/2207] add Leaflet.defaultextent --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 035c4c06aef..3e50e65b1fe 100644 --- a/plugins.md +++ b/plugins.md @@ -1261,6 +1261,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Ivan Ignatyev + + + Leaflet.defaultextent + + A control pan/zoom to the original (home) location when the map loaded. + + Alex Nguyen + + From 48effb1daf2f1737401e3213ef6a409c08f10471 Mon Sep 17 00:00:00 2001 From: Alex Nguyen Date: Tue, 26 Aug 2014 17:20:37 -0500 Subject: [PATCH 1104/2207] update description of Leaflet.defaultextent --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 3e50e65b1fe..4c9699af7a1 100644 --- a/plugins.md +++ b/plugins.md @@ -1265,7 +1265,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.defaultextent - A control pan/zoom to the original (home) location when the map loaded. + A control that returns to the original start extent of the map. Similar to the [HomeButton](https://developers.arcgis.com/javascript/jssamples/widget_home.html) widget. Alex Nguyen From 2a5ed5df1a0ab9bf4f16ba64be2b57670cf3e7cd Mon Sep 17 00:00:00 2001 From: Alex Nguyen Date: Tue, 26 Aug 2014 17:27:52 -0500 Subject: [PATCH 1105/2207] update description. Third time is a charm. --- plugins.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins.md b/plugins.md index 4c9699af7a1..e18a0cf653c 100644 --- a/plugins.md +++ b/plugins.md @@ -1264,9 +1264,11 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.defaultextent - - A control that returns to the original start extent of the map. Similar to the [HomeButton](https://developers.arcgis.com/javascript/jssamples/widget_home.html) widget. - + + + A control that returns to the original start extent of the map. Similar to the HomeButton widget. + + Alex Nguyen From 88b9d6e90e9864a05307d91e60d96b79ad2c2340 Mon Sep 17 00:00:00 2001 From: Wildhoney Date: Wed, 27 Aug 2014 07:55:47 +0100 Subject: [PATCH 1106/2207] Changed Leaflet.FreeDraw label --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 22e9fe0f310..ebdbbf176d7 100644 --- a/plugins.md +++ b/plugins.md @@ -19,7 +19,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - Leaflet.ellipse + Leaflet.FreeDraw Zoopla inspired freehand polygon creation using Leaflet.js and D3. From 972bc466eb196c3a11412b45dfbb391c6bcbbd11 Mon Sep 17 00:00:00 2001 From: moklick Date: Wed, 3 Sep 2014 00:58:16 +0200 Subject: [PATCH 1107/2207] Update plugins.md Add Leaflet Yeoman generator. --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 836734b6af3..d97b5f189cf 100644 --- a/plugins.md +++ b/plugins.md @@ -1430,6 +1430,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Ilya Zverev + + + Leaflet Yeoman Generator + + + Yeoman generator that scaffolds out a basic Leaflet map application. + + + Moritz Klack + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From ecb4af5e76db589d8022459308e4ec63c3ea3a1b Mon Sep 17 00:00:00 2001 From: David Jardin Date: Wed, 3 Sep 2014 17:46:35 +0200 Subject: [PATCH 1108/2207] CSS reset for svg max-width declarations Fix for https://github.com/Leaflet/Leaflet/issues/2881 --- dist/leaflet.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dist/leaflet.css b/dist/leaflet.css index 4f7461547bc..20d8162c4e5 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -44,6 +44,10 @@ .leaflet-container img { max-width: none !important; } +/* reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +.leaflet-container svg { + max-width: none !important; + } /* stupid Android 2 doesn't understand "max-width: none" properly */ .leaflet-container img.leaflet-image-layer { max-width: 15000px !important; From 1712b74363b2b7d599f27c3cb7af07faf3031c3c Mon Sep 17 00:00:00 2001 From: David Jardin Date: Wed, 3 Sep 2014 21:07:30 +0200 Subject: [PATCH 1109/2207] Merged css declarations --- dist/leaflet.css | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 20d8162c4e5..5f3d8abcfaa 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -40,14 +40,12 @@ .leaflet-marker-shadow { display: block; } -/* map is broken in FF if you have max-width: 100% on tiles */ +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container svg, .leaflet-container img { max-width: none !important; } -/* reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ -.leaflet-container svg { - max-width: none !important; - } /* stupid Android 2 doesn't understand "max-width: none" properly */ .leaflet-container img.leaflet-image-layer { max-width: 15000px !important; From 997d9ac76b9cbe1c378dc172a444273bc63b5a10 Mon Sep 17 00:00:00 2001 From: Mathias Schneider Date: Wed, 10 Sep 2014 23:02:46 +0200 Subject: [PATCH 1110/2207] New plugin for SVG markers Vector SVG markers for Leaflet, with an option for Font Awesome/Twitter Bootstrap icons. Inspired by Leaflet.AwesomeMarkers. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index d97b5f189cf..3b047ec4ec1 100644 --- a/plugins.md +++ b/plugins.md @@ -424,6 +424,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Frédéric Bonifas + + + Leaflet.VectorMarkers + + Vector SVG markers for Leaflet, with an option for Font Awesome/Twitter Bootstrap icons. + + Mathias Schneider + + From 9fe5f41fe09c43e3b4ccf634b5d90ce877f97b0d Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 11 Sep 2014 18:23:19 +0200 Subject: [PATCH 1111/2207] plugins: Added sidebar-v2 project see https://github.com/Turbo87/sidebar-v2 --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 3b047ec4ec1..0794e2d76ba 100644 --- a/plugins.md +++ b/plugins.md @@ -1116,6 +1116,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Tobias Bieniek + + + sidebar-v2 + + Another responsive sidebar plugin. This time with tabs! + + Tobias Bieniek + + leaflet-zoom-min From 8fbcb7fa920776e40282ca675773e40b3d8ee703 Mon Sep 17 00:00:00 2001 From: Aaron Lidman Date: Wed, 17 Sep 2014 18:05:29 -0700 Subject: [PATCH 1112/2207] Change map --- _posts/2012-07-30-leaflet-0-4-released.md | 2 +- .../2012-08-20-guest-post-markerclusterer-0-1-released.md | 2 +- examples/layers-control-example.html | 2 +- examples/layers-control.md | 6 +++--- examples/mobile-example.html | 2 +- examples/quick-start-example.html | 2 +- examples/quick-start.md | 8 ++++---- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/_posts/2012-07-30-leaflet-0-4-released.md index ef3861891ec..18ab66e1d7d 100644 --- a/_posts/2012-07-30-leaflet-0-4-released.md +++ b/_posts/2012-07-30-leaflet-0-4-released.md @@ -215,7 +215,7 @@ Vladimir Agafonkin, Leaflet maintainer. + + + + +
      + +
      + + + +
      + + + + diff --git a/src/map/anim/Map.ZoomPan.js b/src/map/anim/Map.ZoomPan.js index 300fb6185f2..3b1c3aa7aa9 100644 --- a/src/map/anim/Map.ZoomPan.js +++ b/src/map/anim/Map.ZoomPan.js @@ -29,11 +29,11 @@ L.Map.include({ function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); } function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; } - function easeOut(t) { return 1 - Math.pow(1 - t, 2); } + function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); } var start = Date.now(), S = (r(1) - r0) / rho, - duration = 1000 * S; + duration = 1000 * S * 0.8; function frame() { var t = (Date.now() - start) / duration, From fc655e45c7e9fef1c91bd23dc831bbf7832381ab Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 21 Jan 2014 20:34:00 +0200 Subject: [PATCH 1154/2207] manage tile pyramid levels; always animate tile fade --- src/layer/tile/GridLayer.js | 51 +++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index c2b49bae994..34422fc6659 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -12,7 +12,7 @@ L.GridLayer = L.Layer.extend({ unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile, - updateInterval: 150 + updateInterval: 200 /* minZoom: , @@ -169,24 +169,45 @@ L.GridLayer = L.Layer.extend({ this.getPane().appendChild(this._container); }, - _updateLevel: function () { - var zoom = this._tileZoom, - level = this._levels[zoom]; + _updateLevels: function () { + var zoom = this._tileZoom; - if (!level) { - level = this._levels[zoom] = {}; - level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); - level.el.style.zIndex = zoom; - level.zoom = zoom; - level.tiles = {}; - var map = this._map; - level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + for (var z in this._levels) { + z = parseInt(z, 10); + if (z > zoom + 2 || z < zoom - 2) { + this._destroyLevel(this._levels[z]); + delete this._levels[z]; + } else { + this._levels[z].el.style.zIndex = -Math.abs(zoom - z); + } } + var level = this._levels[zoom]; + + if (level) { + this._destroyLevel(level); + } + + level = this._levels[zoom] = {}; + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = 0; + level.zoom = zoom; + level.tiles = {}; + + var map = this._map; + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + this._level = level; return level; }, + _destroyLevel: function (level) { + for (var i in level.tiles) { + level.tiles[i].onload = null; + } + L.DomUtil.remove(level.el); + }, + _reset: function (e) { var map = this._map, zoom = map.getZoom(), @@ -200,7 +221,7 @@ L.GridLayer = L.Layer.extend({ // this._clearTiles(); this._tileZoom = tileZoom; - this._updateLevel(); + this._updateLevels(); this._resetGrid(); } @@ -454,7 +475,9 @@ L.GridLayer = L.Layer.extend({ }); } - L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); + L.Util.requestAnimFrame(function () { + L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); + }); this.fire('tileload', {tile: tile}); From 5912c365b7092e8e622e2cbba01cc573b97a5987 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 24 Jan 2014 16:24:27 +0200 Subject: [PATCH 1155/2207] zoom to the nearest round zoom with pinch or dblclick --- src/map/handler/Map.DoubleClickZoom.js | 3 ++- src/map/handler/Map.TouchZoom.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/map/handler/Map.DoubleClickZoom.js b/src/map/handler/Map.DoubleClickZoom.js index 6399734ee7e..8f38140696a 100644 --- a/src/map/handler/Map.DoubleClickZoom.js +++ b/src/map/handler/Map.DoubleClickZoom.js @@ -17,7 +17,8 @@ L.Map.DoubleClickZoom = L.Handler.extend({ _onDoubleClick: function (e) { var map = this._map, - zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1); + oldZoom = map.getZoom(), + zoom = e.originalEvent.shiftKey ? Math.ceil(oldZoom) - 1 : Math.floor(oldZoom) + 1; if (map.options.doubleClickZoom === 'center') { map.setZoom(zoom); diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index ab90795ef85..32e9d915045 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -103,7 +103,7 @@ L.Map.TouchZoom = L.Handler.extend({ var map = this._map, oldZoom = map.getZoom(), zoomDelta = this._zoom - oldZoom, - finalZoom = map._limitZoom(oldZoom + (zoomDelta > 0 ? Math.ceil(zoomDelta) : Math.floor(zoomDelta))); + finalZoom = map._limitZoom(zoomDelta > 0 ? Math.ceil(this._zoom) : Math.floor(this._zoom)); map._animateZoom(this._center, finalZoom, true); }, From acaea1c855bfe479d408e3a797a347d0db90c1ae Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 24 Jan 2014 20:24:30 +0200 Subject: [PATCH 1156/2207] code cleanup; don't reload tile level that's already loaded --- src/layer/tile/GridLayer.js | 73 +++++++++++++++---------------------- src/layer/tile/TileLayer.js | 19 +++++----- 2 files changed, 39 insertions(+), 53 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 34422fc6659..eca251a140a 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -182,20 +182,19 @@ L.GridLayer = L.Layer.extend({ } } - var level = this._levels[zoom]; + var level = this._levels[zoom], + map = this._map; - if (level) { - this._destroyLevel(level); - } + if (!level) { + level = this._levels[zoom] = {}; - level = this._levels[zoom] = {}; - level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); - level.el.style.zIndex = 0; - level.zoom = zoom; - level.tiles = {}; + level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); + level.el.style.zIndex = 0; - var map = this._map; - level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); + level.zoom = zoom; + level.tiles = {}; + } this._level = level; return level; @@ -218,8 +217,6 @@ L.GridLayer = L.Layer.extend({ this._abortLoading(); } if (tileZoomChanged || e && e.hard) { - // this._clearTiles(); - this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); @@ -262,7 +259,10 @@ L.GridLayer = L.Layer.extend({ tileSize = this._tileSize = this._getTileSize(), tileZoom = this._tileZoom; - this._tileRange = this._getTileRange(); + var bounds = this._map.getPixelWorldBounds(this._tileZoom); + if (bounds) { + this._globalTileRange = this._pxBoundsToTileRange(bounds); + } this._wrapX = crs.wrapLng && [ Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize), @@ -282,21 +282,12 @@ L.GridLayer = L.Layer.extend({ if (!this._map) { return; } // TODO move to reset - var zoom = this._map.getZoom(); - - if (zoom > this.options.maxZoom || - zoom < this.options.minZoom) { - this._clearBgBuffer(); - return; - } + // var zoom = this._map.getZoom(); - var bounds = this._map.getBounds(), - pxBounds = new L.Bounds( - this._map.project(bounds.getNorthWest(), this._tileZoom), - this._map.project(bounds.getSouthEast(), this._tileZoom)); + // if (zoom > this.options.maxZoom || + // zoom < this.options.minZoom) { return; } - // tile coordinates range for the current view - var tileRange = this._boundsToTileRange(pxBounds); + var tileRange = this._getTileRange(this._map.getBounds(), this._tileZoom); // if (this.options.unloadInvisibleTiles) { // this._removeOtherTiles(tileRange); @@ -305,6 +296,14 @@ L.GridLayer = L.Layer.extend({ this._addTiles(tileRange); }, + // tile coordinates range for particular geo bounds and zoom + _getTileRange: function (bounds, zoom) { + var pxBounds = new L.Bounds( + this._map.project(bounds.getNorthWest(), zoom), + this._map.project(bounds.getSouthEast(), zoom)); + return this._pxBoundsToTileRange(pxBounds); + }, + _addTiles: function (tileRange) { var queue = [], center = tileRange.getCenter(); @@ -357,7 +356,7 @@ L.GridLayer = L.Layer.extend({ if (!crs.infinite) { // don't load tile if it's out of bounds and not wrapped - var bounds = this._tileRange; + var bounds = this._globalTileRange; if ((!crs.wrapLng && (coords.x < bounds.min.x || coords.x > bounds.max.x)) || (!crs.wrapLat && (coords.y < bounds.min.y || coords.y > bounds.max.y))) { return false; } } @@ -475,23 +474,17 @@ L.GridLayer = L.Layer.extend({ }); } - L.Util.requestAnimFrame(function () { - L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); - }); + L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); this.fire('tileload', {tile: tile}); this._tilesToLoad--; if (this._tilesToLoad === 0) { - this._visibleTilesReady(); + this.fire('load'); } }, - _visibleTilesReady: function () { - this.fire('load'); - }, - _getTilePos: function (coords) { return coords.multiplyBy(this._tileSize).subtract(this._level.origin); }, @@ -501,13 +494,7 @@ L.GridLayer = L.Layer.extend({ coords.y = this._wrapY ? L.Util.wrapNum(coords.y, this._wrapY) : coords.y; }, - // get the global tile coordinates range for the current zoom - _getTileRange: function () { - var bounds = this._map.getPixelWorldBounds(this._tileZoom); - return bounds ? this._boundsToTileRange(bounds) : null; - }, - - _boundsToTileRange: function (bounds) { + _pxBoundsToTileRange: function (bounds) { return new L.Bounds( bounds.min.divideBy(this._tileSize).floor(), bounds.max.divideBy(this._tileSize).ceil().subtract([1, 1])); diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 593778a66d9..ddef6229db7 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -40,6 +40,11 @@ L.TileLayer = L.GridLayer.extend({ if (typeof options.subdomains === 'string') { options.subdomains = options.subdomains.split(''); } + + // for https://github.com/Leaflet/Leaflet/issues/137 + if (!L.Browser.android) { + this.on('tileunload', this._onTileRemove); + } }, setUrl: function (url, noRedraw) { @@ -106,16 +111,10 @@ L.TileLayer = L.GridLayer.extend({ options.tileSize; }, - _removeTile: function (key) { - var tile = this._tiles[key]; - - L.GridLayer.prototype._removeTile.call(this, key); - - // for https://github.com/Leaflet/Leaflet/issues/137 - if (!L.Browser.android) { - tile.onload = null; - tile.src = L.Util.emptyImageUrl; - } + _onTileRemove: function (e) { + e.tile.onload = null; + e.tile.src = L.Util.emptyImageUrl; + console.log('hello'); }, _getZoomForUrl: function () { From dc573b768a8534d0f7a404537c597b0abeff6a77 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 19 Mar 2014 11:53:39 -0700 Subject: [PATCH 1157/2207] Add safari and firefox launchers --- package.json | 2 ++ spec/karma.conf.js | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 33bf5f43fd9..52ec5ddd2da 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,8 @@ "karma-coverage": "~0.2.3", "karma-phantomjs-launcher": "^0.1.4", "karma-chrome-launcher": "^0.1.4", + "karma-firefox-launcher": "~0.1.3", + "karma-safari-launcher": "~0.1.1", "tin": "^0.5.0", "copyfiles": "0.1.0" }, diff --git a/spec/karma.conf.js b/spec/karma.conf.js index 703c506b355..d287ddacfb3 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -22,7 +22,9 @@ module.exports = function (config) { 'karma-mocha', 'karma-coverage', 'karma-phantomjs-launcher', - 'karma-chrome-launcher'], + 'karma-chrome-launcher', + 'karma-safari-launcher', + 'karma-firefox-launcher'], // frameworks to use frameworks: ['mocha'], From 74133f49f04ebf600ecc71cc2b0941479edf7a2d Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 19 Mar 2014 11:58:19 -0700 Subject: [PATCH 1158/2207] Fix MarkerSpec in retina browsers. --- spec/suites/layer/marker/MarkerSpec.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index cc8f34fd6a2..c7520c4c7bb 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -58,7 +58,11 @@ describe("Marker", function () { expect(oldIcon).to.not.be(marker._icon); expect(oldIcon.parentNode).to.be(null); - expect(marker._icon.src).to.contain('marker-icon.png'); + if (L.Browser.retina) { + expect(marker._icon.src).to.contain('marker-icon-2x.png'); + } else { + expect(marker._icon.src).to.contain('marker-icon.png'); + } expect(marker._icon.parentNode).to.be(map._panes.markerPane); }); From 00a66b47319ed4d7cc4adf53de3f309d9d48de11 Mon Sep 17 00:00:00 2001 From: Dave Leaver Date: Thu, 20 Mar 2014 10:26:29 +1300 Subject: [PATCH 1159/2207] Add an element for tracking zoom animations. Use it for trying to stop a map zoom. Still doesn't quite work right. Stopping a zoomPan or PanAnimation does work however. Code is all cludgy :) refs #2560 --- debug/map/zoompan.html | 6 ++- src/map/Map.js | 75 ++++++++++++++++++++++++++++++++++++- src/map/anim/Map.ZoomPan.js | 3 +- 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 7fb61ceed24..cf5957f25a1 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -27,6 +27,7 @@ --> + + + + + +
      + + + + + diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index d1ab325c5a7..4961bff08c1 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -55,6 +55,7 @@ L.GridLayer = L.Layer.extend({ L.DomUtil.remove(this._container); map._removeZoomLimit(this); this._container = null; + this._tileZoom = null; }, bringToFront: function () { From 1ddac9361a17601c903b74f15f0b540b5b5de05d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 26 Oct 2014 21:00:56 +0100 Subject: [PATCH 1196/2207] Fix array of array of LatLngs toGeoJSON edge case --- spec/suites/layer/GeoJSONSpec.js | 51 +++++++++++++++++++++++++++++--- src/layer/GeoJSON.js | 4 --- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index ec02fbf51d2..29be03fd6b0 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -120,7 +120,7 @@ describe("L.Polyline (multi) #toGeoJSON", function () { }); describe("L.Polygon#toGeoJSON", function () { - it("returns a 2D Polygon object (no holes)", function () { + it("returns a 2D Polygon object (no holes) from a flat LatLngs array", function () { var polygon = new L.Polygon([[1, 2], [3, 4], [5, 6]]); expect(polygon.toGeoJSON().geometry).to.eql({ type: 'Polygon', @@ -128,7 +128,7 @@ describe("L.Polygon#toGeoJSON", function () { }); }); - it("returns a 3D Polygon object (no holes)", function () { + it("returns a 3D Polygon object (no holes) from a flat LatLngs array", function () { var polygon = new L.Polygon([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); expect(polygon.toGeoJSON().geometry).to.eql({ type: 'Polygon', @@ -136,6 +136,26 @@ describe("L.Polygon#toGeoJSON", function () { }); }); + it("returns a 2D Polygon object from a simple GeoJSON like input", function () { + var multiPolygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]]]); + expect(multiPolygon.toGeoJSON().geometry).to.eql({ + type: 'Polygon', + coordinates: [ + [[2, 1], [4, 3], [6, 5], [2, 1]] + ] + }); + }); + + it("returns a 3D MultiPolygon object from a simple GeoJSON like input", function () { + var multiPolygon = new L.Polygon([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]); + expect(multiPolygon.toGeoJSON().geometry).to.eql({ + type: 'Polygon', + coordinates: [ + [[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]] + ] + }); + }); + it("returns a 2D Polygon object (with holes)", function () { var polygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]); expect(polygon.toGeoJSON().geometry).to.eql({ @@ -157,11 +177,12 @@ describe("L.Polygon#toGeoJSON", function () { ] }); }); + }); describe("L.Polygon (multi) #toGeoJSON", function () { it("returns a 2D MultiPolygon object", function () { - var multiPolygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]]]); + var multiPolygon = new L.Polygon([[[[1, 2], [3, 4], [5, 6]]]]); expect(multiPolygon.toGeoJSON().geometry).to.eql({ type: 'MultiPolygon', coordinates: [ @@ -171,7 +192,7 @@ describe("L.Polygon (multi) #toGeoJSON", function () { }); it("returns a 3D MultiPolygon object", function () { - var multiPolygon = new L.Polygon([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]); + var multiPolygon = new L.Polygon([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]]); expect(multiPolygon.toGeoJSON().geometry).to.eql({ type: 'MultiPolygon', coordinates: [ @@ -179,6 +200,28 @@ describe("L.Polygon (multi) #toGeoJSON", function () { ] }); }); + + it("returns a 2D MultiPolygon object with two polygons", function () { + var multiPolygon = new L.Polygon([[[[1, 2], [3, 4], [5, 6]]], [[[7, 8], [9, 10], [11, 12]]]]); + expect(multiPolygon.toGeoJSON().geometry).to.eql({ + type: 'MultiPolygon', + coordinates: [ + [[[2, 1], [4, 3], [6, 5], [2, 1]]], + [[[8, 7], [10, 9], [12, 11], [8, 7]]] + ] + }); + }); + + it("returns a 2D MultiPolygon object with polygon having a hole", function () { + var multiPolygon = new L.Polygon([[[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]]); + expect(multiPolygon.toGeoJSON().geometry).to.eql({ + type: 'MultiPolygon', + coordinates: [ + [[[2, 1], [4, 3], [6, 5], [2, 1]], [[8, 7], [10, 9], [12, 11], [8, 7]]] + ] + }); + }); + }); describe("L.LayerGroup#toGeoJSON", function () { diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 1f08729f24e..d8700a8a108 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -206,10 +206,6 @@ L.Polygon.prototype.toGeoJSON = function () { var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true); - if (holes && this._latlngs.length === 1) { - multi = true; - coords = [coords]; - } if (!holes) { coords = [coords]; } From 11b39edfa1b8b1dd7b00f859b0252f0e6e7dd950 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 29 Oct 2014 17:19:54 +0200 Subject: [PATCH 1197/2207] fix TileLayer loading event after setUrl --- src/layer/tile/GridLayer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 4961bff08c1..2e3e8120d71 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -245,6 +245,7 @@ L.GridLayer = L.Layer.extend({ for (var key in this._tiles) { this._removeTile(key); } + this._tilesToLoad = 0; }, _deferRemove: function (key) { From 0c70dcb581de3d29136f99198a61e63aa19419ab Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 29 Oct 2014 17:20:06 +0200 Subject: [PATCH 1198/2207] remove slow tests --- spec/suites/layer/tile/TileLayerSpec.js | 103 ------------------------ 1 file changed, 103 deletions(-) diff --git a/spec/suites/layer/tile/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js index 9096ea69e8c..e69de29bb2d 100644 --- a/spec/suites/layer/tile/TileLayerSpec.js +++ b/spec/suites/layer/tile/TileLayerSpec.js @@ -1,103 +0,0 @@ - -describe('TileLayer', function () { - var tileUrl = '', - map; - - beforeEach(function () { - map = L.map(document.createElement('div')); - }); - - describe("'loading' event", function() { - var tileUrl1 = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png', - tileUrl2 = 'http://{s}.tile.stamen.com/toner/{z}/{x}/{y}.png'; - - // Add map div to DOM. The map panning tests do not work reliably unless - // the Leaflet map is properly styled and part of the DOM - var mapDiv = document.createElement('div'); - mapDiv.style.height = '256px'; - mapDiv.style.width = '256px'; - document.body.appendChild(mapDiv); - - this.afterAll(function() { - document.body.removeChild(mapDiv); - }); - - // Set the map zoom high enough that panning by 256 pixels necessarily loads more tiles - var myMap = L.map(mapDiv).setView([0, 0], 13); - - describe("after a tilelayer has been initialized with an empty string", function() { - var layer = L.tileLayer(''); - var updateInterval = layer.options.updateInterval + 500; - - var loadingSpy; - beforeEach(function() { - loadingSpy = sinon.spy(); - layer.on('loading', function() { loadingSpy(); }); - }); - afterEach(function() { - layer.off('loading'); - }); - - it("is fired when the tilelayer is added to the map", function() { - layer.addTo(myMap); - expect(loadingSpy.calledOnce).to.be.ok(); - }); - - it("is fired again when the tilelayer has its url set to a real tile url", function(done) { - layer.setUrl(tileUrl2); - - setTimeout(function() { - expect(loadingSpy.calledOnce).to.be.ok(); - done(); - }, updateInterval); - }); - - it("is fired again when the map is panned enough to load more tiles", function(done) { - myMap.panBy([256,256]); - - setTimeout(function() { - expect(loadingSpy.calledOnce).to.be.ok(); - done(); - }, updateInterval); - }); - }); - - describe("after a tilelayer has been initialized with a real tile url", function() { - var layer = L.tileLayer(tileUrl1); - var updateInterval = layer.options.updateInterval + 500; - - var loadingSpy; - beforeEach(function() { - loadingSpy = sinon.spy(); - layer.on('loading', function() { loadingSpy(); }); - }); - afterEach(function() { - layer.off('loading'); - }); - - it("is fired when the tilelayer is added to the map", function() { - layer.addTo(myMap); - expect(loadingSpy.calledOnce).to.be.ok(); - }); - - it("is fired again when the tilelayer has its url set to a real tile url", function(done) { - layer.setUrl(tileUrl2); - - setTimeout(function() { - expect(loadingSpy.calledOnce).to.be.ok(); - done(); - }, updateInterval); - }); - - it("is fired again when the map is panned enough to load more tiles", function(done) { - myMap.panBy([256,256]); - - setTimeout(function() { - expect(loadingSpy.calledOnce).to.be.ok(); - done(); - }, updateInterval); - }); - }); - }); - -}); From bdc683d1c64e535128a096994bcd20100dcf2b8a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 29 Oct 2014 17:20:55 +0200 Subject: [PATCH 1199/2207] update package.json & deps --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index fcfe28a2c73..c4ac13cfffa 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "leaflet", - "version": "0.7.0", + "version": "0.8.0-dev", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "jake": "~8.0.10", - "jshint": "~2.5.6", + "jshint": "~2.5.7", "uglify-js": "~2.4.15", - "mocha": "~2.0.0", + "mocha": "~2.0.1", "happen": "~0.1.3", "karma": "~0.12.24", "karma-mocha": "~0.1.9", From f75133a4829280231b4920fc956cf404f47facfe Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 29 Oct 2014 17:28:50 +0200 Subject: [PATCH 1200/2207] fix blurry map after stopping inertia, close #2979 --- src/dom/PosAnimation.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/dom/PosAnimation.js b/src/dom/PosAnimation.js index a2013a4fb5b..70294d3ede8 100644 --- a/src/dom/PosAnimation.js +++ b/src/dom/PosAnimation.js @@ -24,7 +24,7 @@ L.PosAnimation = L.Evented.extend({ stop: function () { if (!this._inProgress) { return; } - this._step(); + this._step(true); this._complete(); }, @@ -34,20 +34,23 @@ L.PosAnimation = L.Evented.extend({ this._step(); }, - _step: function () { + _step: function (round) { var elapsed = (+new Date()) - this._startTime, duration = this._duration * 1000; if (elapsed < duration) { - this._runFrame(this._easeOut(elapsed / duration)); + this._runFrame(this._easeOut(elapsed / duration), round); } else { this._runFrame(1); this._complete(); } }, - _runFrame: function (progress) { + _runFrame: function (progress, round) { var pos = this._startPos.add(this._offset.multiplyBy(progress)); + if (round) { + pos._round(); + } L.DomUtil.setPosition(this._el, pos); this.fire('step'); From 36b958cad05f086f0fb243767d07ded1211bb360 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 29 Oct 2014 18:22:28 +0200 Subject: [PATCH 1201/2207] fix WMS passing all options as WMS params, close #2972 --- src/layer/tile/GridLayer.js | 17 ++++++++--------- src/layer/tile/TileLayer.WMS.js | 18 +++++++++--------- src/layer/tile/TileLayer.js | 23 ++++++++++------------- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 2e3e8120d71..90aa24d86d6 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -12,15 +12,14 @@ L.GridLayer = L.Layer.extend({ unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile, - updateInterval: 200 - - /* - minZoom: , - maxZoom: , - attribution: , - zIndex: , - bounds: - */ + updateInterval: 200, + + attribution: null, + zIndex: null, + bounds: null, + + minZoom: 0 + // maxZoom: }, initialize: function (options) { diff --git a/src/layer/tile/TileLayer.WMS.js b/src/layer/tile/TileLayer.WMS.js index c76dcee2053..407b46ba8ef 100644 --- a/src/layer/tile/TileLayer.WMS.js +++ b/src/layer/tile/TileLayer.WMS.js @@ -14,6 +14,11 @@ L.TileLayer.WMS = L.TileLayer.extend({ transparent: false }, + options: { + crs: null, + uppercase: false + }, + initialize: function (url, options) { this._url = url; @@ -22,17 +27,14 @@ L.TileLayer.WMS = L.TileLayer.extend({ // all keys that are not TileLayer options go to WMS params for (var i in options) { - if (!this.options.hasOwnProperty(i) && - i !== 'crs' && - i !== 'uppercase') { + if (!(i in this.options)) { wmsParams[i] = options[i]; } } options = L.setOptions(this, options); - wmsParams.width = wmsParams.height = - options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1); + wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1); this.wmsParams = wmsParams; }, @@ -40,8 +42,6 @@ L.TileLayer.WMS = L.TileLayer.extend({ onAdd: function (map) { this._crs = this.options.crs || map.options.crs; - this._uppercase = this.options.uppercase || false; - this._wmsVersion = parseFloat(this.wmsParams.version); var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; @@ -63,8 +63,8 @@ L.TileLayer.WMS = L.TileLayer.extend({ url = L.TileLayer.prototype.getTileUrl.call(this, coords); return url + - L.Util.getParamString(this.wmsParams, url, this._uppercase) + - (this._uppercase ? '&BBOX=' : '&bbox=') + bbox; + L.Util.getParamString(this.wmsParams, url, this.options.uppercase) + + (this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox; }, setParams: function (params, noRedraw) { diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index ce94368fdb0..b88f22abfbf 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -5,20 +5,17 @@ L.TileLayer = L.GridLayer.extend({ options: { - minZoom: 0, maxZoom: 18, subdomains: 'abc', - // errorTileUrl: '', - zoomOffset: 0 - - /* - maxNativeZoom: , - tms: , - zoomReverse: , - detectRetina: , - crossOrigin: , - */ + errorTileUrl: '', + zoomOffset: 0, + + maxNativeZoom: null, // Number + tms: false, + zoomReverse: false, + detectRetina: false, + crossOrigin: false }, initialize: function (url, options) { @@ -61,11 +58,11 @@ L.TileLayer = L.GridLayer.extend({ tile.onload = L.bind(this._tileOnLoad, this, done, tile); tile.onerror = L.bind(this._tileOnError, this, done, tile); - + if (this.options.crossOrigin) { tile.crossOrigin = ''; } - + /* Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons http://www.w3.org/TR/WCAG20-TECHS/H67 From d4354bc370180dfbb474363deaa7bcf5b985f950 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 29 Oct 2014 18:27:55 +0200 Subject: [PATCH 1202/2207] fix TileLayer tms option regression --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index b88f22abfbf..c5f54caaf52 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -79,7 +79,7 @@ L.TileLayer = L.GridLayer.extend({ r: this.options.detectRetina && L.Browser.retina && this.options.maxZoom > 0 ? '@2x' : '', s: this._getSubdomain(coords), x: coords.x, - y: this.options.tms ? this._tileNumBounds.max.y - coords.y : coords.y, + y: this.options.tms ? this._globalTileRange.max.y - coords.y : coords.y, z: this._getZoomForUrl() }, this.options)); }, From f10512f83608a90847c757222ec0b5d471eb29a1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 31 Oct 2014 13:57:23 +0200 Subject: [PATCH 1203/2207] fix map.fitBounds race condition, close #2957 Fixes a situation where map.fitBounds(map.getBounds()) sometimes zoomed out. --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 1d446d1c669..1b9bbb5f63c 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -304,7 +304,7 @@ L.Map = L.Evented.extend({ do { zoom++; - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); + boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding).floor(); zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; } while (zoomNotFound && zoom <= maxZoom); From 8dfba898de6bde6b40f9d9c44805f0a34e014306 Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 31 Oct 2014 11:12:00 -0500 Subject: [PATCH 1204/2207] add popupAnchor option to DivIcon --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index c9a50c81ad6..1626d44b93d 100644 --- a/reference.html +++ b/reference.html @@ -4125,6 +4125,11 @@

      Options

      Point The coordinates of the "tip" of the icon (relative to its top left corner). The icon will be aligned so that this point is at the marker's geographical location. Centered by default if size is specified, also can be set in CSS with negative margins. + + popupAnchor + Point + The coordinates of the point from which popups will "open", relative to the icon anchor. + className String From 1e42df6701cfa2f6ae1b21a4782acef4d7217868 Mon Sep 17 00:00:00 2001 From: Justin Manley Date: Mon, 3 Nov 2014 14:24:30 -0600 Subject: [PATCH 1205/2207] Add a sentence clarifying that L.bind is not a polyfill for ES5 bind. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 1626d44b93d..a3b5629c3eb 100644 --- a/reference.html +++ b/reference.html @@ -5270,7 +5270,7 @@

      Methods

      Function - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind). stamp( <Object> obj ) From 40376dc3be10878d549a834fb3e5a1db14559079 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 4 Nov 2014 13:46:53 +0200 Subject: [PATCH 1206/2207] simpler retina detection fallback, close #2258 --- src/core/Browser.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index f60e0390c13..f3ded60ad90 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -23,14 +23,6 @@ gecko3d = 'MozPerspective' in doc.style, opera3d = 'OTransition' in doc.style; - - var retina = 'devicePixelRatio' in window && window.devicePixelRatio > 1; - - if (!retina && 'matchMedia' in window) { - var matches = window.matchMedia('(min-resolution:144dpi)'); - retina = matches && matches.matches; - } - var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch)); @@ -59,7 +51,7 @@ msPointer: !!msPointer, pointer: !!pointer, - retina: !!retina + retina: (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1 }; }()); From eb46eb0b6f1fe013534155ae8e48931012ae71e7 Mon Sep 17 00:00:00 2001 From: Antoine Pultier Date: Wed, 5 Nov 2014 16:00:36 +0100 Subject: [PATCH 1207/2207] Leaflet.MapPaint added to plugins.md --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 30327617c8b..eb8eec46889 100644 --- a/plugins.md +++ b/plugins.md @@ -1364,6 +1364,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Alexander Milevski + + + Leaflet.MapPaint + + + Bitmap painting plugin designed for touch devices. + + Antoine Pultier + + From ea2c3975235b6f39b13af15ee9569c54873c3412 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 5 Nov 2014 15:13:28 -0800 Subject: [PATCH 1208/2207] No-op bringToFront/Back when Path is not on a map (fixes #2439) --- spec/index.html | 1 + spec/suites/layer/vector/PathSpec.js | 15 +++++++++++++++ src/layer/vector/Path.js | 8 ++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 spec/suites/layer/vector/PathSpec.js diff --git a/spec/index.html b/spec/index.html index fe8a8c1ba6c..f3898e005aa 100644 --- a/spec/index.html +++ b/spec/index.html @@ -71,6 +71,7 @@ + diff --git a/spec/suites/layer/vector/PathSpec.js b/spec/suites/layer/vector/PathSpec.js new file mode 100644 index 00000000000..326a28d14b5 --- /dev/null +++ b/spec/suites/layer/vector/PathSpec.js @@ -0,0 +1,15 @@ +describe('Path', function () { + describe('#bringToBack', function () { + it('is a no-op for layers not on a map', function () { + var path = new L.Path(); + expect(path.bringToBack()).to.equal(path); + }); + }); + + describe('#bringToFront', function () { + it('is a no-op for layers not on a map', function () { + var path = new L.Path(); + expect(path.bringToFront()).to.equal(path); + }); + }) +}); diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 6a1392f2e37..6247c997175 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -61,12 +61,16 @@ L.Path = L.Layer.extend({ }, bringToFront: function () { - this._renderer._bringToFront(this); + if (this._renderer) { + this._renderer._bringToFront(this); + } return this; }, bringToBack: function () { - this._renderer._bringToBack(this); + if (this._renderer) { + this._renderer._bringToBack(this); + } return this; }, From e6d857eb705fea9a0cdf01d650139f79878ac988 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 5 Nov 2014 15:21:51 -0800 Subject: [PATCH 1209/2207] jshint --- spec/suites/layer/vector/PathSpec.js | 2 +- src/layer/ImageOverlay.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/suites/layer/vector/PathSpec.js b/spec/suites/layer/vector/PathSpec.js index 326a28d14b5..ed935d17a92 100644 --- a/spec/suites/layer/vector/PathSpec.js +++ b/spec/suites/layer/vector/PathSpec.js @@ -11,5 +11,5 @@ describe('Path', function () { var path = new L.Path(); expect(path.bringToFront()).to.equal(path); }); - }) + }); }); diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 0c9bca02f30..9a1d37fb8be 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -82,7 +82,7 @@ L.ImageOverlay = L.Layer.extend({ return events; }, - getBounds: function() { + getBounds: function () { return this._bounds; }, From 4825fc05b389b9017e007197279c1ada65b12a45 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 5 Nov 2014 15:44:23 -0800 Subject: [PATCH 1210/2207] Add test for #1871 --- spec/suites/map/MapSpec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 9ea78e23144..e7261ce00ca 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -121,12 +121,19 @@ describe("Map", function () { expect(map.getZoom()).to.be(13); expect(map.getCenter().distanceTo([51.505, -0.09])).to.be.lessThan(5); }); + it("can be passed without a zoom specified", function () { map.setZoom(13); expect(map.setView([51.605, -0.11])).to.be(map); expect(map.getZoom()).to.be(13); expect(map.getCenter().distanceTo([51.605, -0.11])).to.be.lessThan(5); }); + + it("defaults to zoom passed as map option", function () { + map = L.map(document.createElement('div'), {zoom: 13}); + expect(map.setView([51.605, -0.11])).to.be(map); + expect(map.getZoom()).to.be(13); + }); }); describe("#getBounds", function () { From c6dea37d86cb5935d0f69f7e921cd40c7cd8c6fc Mon Sep 17 00:00:00 2001 From: Jeff Smale Date: Mon, 30 Jun 2014 11:27:04 +1200 Subject: [PATCH 1211/2207] Preserve marker draggability on setIcon (fixes #2578) --- spec/suites/layer/marker/MarkerSpec.js | 16 ++++++++++++++++ src/layer/marker/Marker.js | 6 ++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index c7520c4c7bb..fc42585073e 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -26,6 +26,22 @@ describe("Marker", function () { expect(afterIcon.src).to.contain(icon2._getIconUrl('icon')); }); + it("preserves draggability", function () { + var marker = new L.Marker([0, 0], {icon: icon1}); + map.addLayer(marker); + + marker.dragging.disable(); + marker.setIcon(icon2); + + expect(marker.dragging.enabled()).to.be(false); + + marker.dragging.enable(); + + marker.setIcon(icon1); + + expect(marker.dragging.enabled()).to.be(true); + }); + it("changes the icon to another DivIcon", function () { var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); map.addLayer(marker); diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 6256cd84994..efa81ec0517 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -209,13 +209,15 @@ L.Marker = L.Layer.extend({ this._fireMouseEvent, this); if (L.Handler.MarkerDrag) { + var draggable = this.options.draggable; if (this.dragging) { + draggable = this.dragging.enabled(); this.dragging.disable(); } - + this.dragging = new L.Handler.MarkerDrag(this); - if (this.options.draggable) { + if (draggable) { this.dragging.enable(); } } From 4f06ac30b0f1e8fac4778fe37114f3927a074db7 Mon Sep 17 00:00:00 2001 From: Fabian Zeindl Date: Tue, 17 Jun 2014 16:10:21 +0200 Subject: [PATCH 1212/2207] Don't append/remove the SVG container Tested this on IOS7, which has 85% adoption and I see no flicker. Reduces layout and paint-times. --- src/layer/vector/SVG.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index feffa80c8b5..cb538b35283 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -21,13 +21,7 @@ L.SVG = L.Renderer.extend({ var b = this._bounds, size = b.getSize(), - container = this._container, - pane = this.getPane(); - - // hack to make flicker on drag end on mobile webkit less irritating - if (L.Browser.mobileWebkit) { - pane.removeChild(container); - } + container = this._container; L.DomUtil.setPosition(container, b.min); @@ -41,10 +35,6 @@ L.SVG = L.Renderer.extend({ // movement: update container viewBox so that we don't have to change coordinates of individual layers L.DomUtil.setPosition(container, b.min); container.setAttribute('viewBox', [b.min.x, b.min.y, size.x, size.y].join(' ')); - - if (L.Browser.mobileWebkit) { - pane.appendChild(container); - } }, // methods below are called by vector layers implementations From ead96e500eb07858eb93d27e7d6d785ebf8f9522 Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Thu, 6 Nov 2014 12:48:13 -0600 Subject: [PATCH 1213/2207] closes an open popup with escape key --- src/map/handler/Map.Keyboard.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 085ee119a14..b7562a22f6b 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -143,6 +143,9 @@ L.Map.Keyboard = L.Handler.extend({ } else if (key in this._zoomKeys) { map.setZoom(map.getZoom() + this._zoomKeys[key]); + } else if (key === 27 && map._popup) { + map.closePopup(); + } else { return; } From 1eae1719bb51cef00382b882ec368c5238c873e7 Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Thu, 6 Nov 2014 13:02:21 -0600 Subject: [PATCH 1214/2207] no map._popup check needed --- src/map/handler/Map.Keyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index b7562a22f6b..bcc0362ee0f 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -143,7 +143,7 @@ L.Map.Keyboard = L.Handler.extend({ } else if (key in this._zoomKeys) { map.setZoom(map.getZoom() + this._zoomKeys[key]); - } else if (key === 27 && map._popup) { + } else if (key === 27) { map.closePopup(); } else { From f3b132e4144e3695e2909458fb2793460d94f641 Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Thu, 6 Nov 2014 13:23:14 -0600 Subject: [PATCH 1215/2207] extract bounds conversion from Map.Geolocation.Also fix geolocation test page. --- debug/map/geolocation.html | 2 +- src/geo/LatLng.js | 11 ++++++++++- src/map/ext/Map.Geolocation.js | 9 +-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/debug/map/geolocation.html b/debug/map/geolocation.html index 5fcd9ac0629..49f082ed874 100644 --- a/debug/map/geolocation.html +++ b/debug/map/geolocation.html @@ -8,7 +8,7 @@ - + diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index 4a89c4bf153..a2582509274 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -40,7 +40,16 @@ L.LatLng.prototype = { wrap: function () { return L.CRS.Earth.wrapLatLng(this); - } + }, + + toBounds: function (sizeInMeters) { + var latAccuracy = 180 * sizeInMeters / 40075017, + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); + + return L.latLngBounds( + [this.lat - latAccuracy, this.lng - lngAccuracy], + [this.lat + latAccuracy, this.lng + lngAccuracy]); + } }; diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index 515db2ab155..38235516b53 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -66,14 +66,7 @@ L.Map.include({ var lat = pos.coords.latitude, lng = pos.coords.longitude, latlng = new L.LatLng(lat, lng), - - latAccuracy = 180 * pos.coords.accuracy / 40075017, - lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * lat), - - bounds = L.latLngBounds( - [lat - latAccuracy, lng - lngAccuracy], - [lat + latAccuracy, lng + lngAccuracy]), - + bounds = latlng.toBounds(pos.coords.accuracy), options = this._locateOptions; if (options.setView) { From 78463e826bc1450b2e611c0ee51e4702b70a1b7a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 6 Nov 2014 16:27:32 -0800 Subject: [PATCH 1216/2207] jshint --- src/geo/LatLng.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index a2582509274..f56de66801f 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -49,7 +49,7 @@ L.LatLng.prototype = { return L.latLngBounds( [this.lat - latAccuracy, this.lng - lngAccuracy], [this.lat + latAccuracy, this.lng + lngAccuracy]); - } + } }; From 7b5168acecbe85b1e5ebd1b7555e3682b41e4b96 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 6 Nov 2014 16:25:59 -0800 Subject: [PATCH 1217/2207] Ensure that added tiles are retained Previously, quickly zooming out and then back in sometimes left only overzoomed tiles for the lower zoom level visible. The problem was a race condition with deferred pruning: 1. Start at z15. Zoom in. This triggers loading of z14 tiles. As each tile loads, _pruneTiles (throttled) is called. This results in deferred removal of z15 tiles (250ms setTimeout). The deferral is done to avoid flicker while the z14 tiles are faded in. 2. During the 250ms, zoom in. This triggers `_addTiles`, but since the deferred pruning of the z15 tiles hasn't happened yet, the tiles are still present in `this._tiles`. Therefore no tiles are queued for loading, triggering an early return in `_addTiles`, before `_pruneTiles` is called. 3. Deferred pruning of the z15 tiles happens. Since `_pruneTiles` was short-circuited at z15, these tiles were never retained, nor were the z14 tiles scheduled for pruning. End result is that the z15 tiles are removed from the DOM while the z14 tiles remain, scaled 2x. --- src/layer/tile/GridLayer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 90aa24d86d6..6661a5662c9 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -40,6 +40,7 @@ L.GridLayer = L.Layer.extend({ this._tiles = {}; this._loaded = {}; + this._retain = {}; this._tilesToLoad = 0; this._reset(); @@ -384,8 +385,11 @@ L.GridLayer = L.Layer.extend({ coords = new L.Point(i, j); coords.z = this._tileZoom; + var key = this._tileCoordsToKey(coords); + this._retain[key] = true; + // add tile to queue if it's not in cache or out of bounds - if (!(this._tileCoordsToKey(coords) in this._tiles) && this._isValidTile(coords)) { + if (!(key in this._tiles) && this._isValidTile(coords)) { queue.push(coords); } } From bfdb7d08c7075e6b69ae4245b59ffd58771a38f5 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 7 Nov 2014 12:11:59 -0800 Subject: [PATCH 1218/2207] Don't delay tile updates triggered by moveend --- src/layer/tile/GridLayer.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 6661a5662c9..cd0c7546474 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -29,11 +29,6 @@ L.GridLayer = L.Layer.extend({ onAdd: function () { this._initContainer(); - if (!this.options.updateWhenIdle) { - // update tiles on move, but not more often than once per given interval - this._update = L.Util.throttle(this._update, this.options.updateInterval, this); - } - this._pruneTiles = L.Util.throttle(this._pruneTiles, 200, this); this._levels = {}; @@ -113,7 +108,8 @@ L.GridLayer = L.Layer.extend({ }; if (!this.options.updateWhenIdle) { - events.move = this._update; + // update tiles on move, but not more often than once per given interval + events.move = L.Util.throttle(this._update, this.options.updateInterval, this); } if (this._zoomAnimated) { From e41c131dbbb64c8df3e5536e527fe7268ebebd63 Mon Sep 17 00:00:00 2001 From: David Leaver Date: Sat, 8 Nov 2014 09:40:01 +1300 Subject: [PATCH 1219/2207] Remove touch tracking from DoubleTap and improve DomEvent.Pointer e.touches emulation to provide a suitable replacement. Refs #2820 --- src/dom/DomEvent.DoubleTap.js | 30 ++++-------------------------- src/dom/DomEvent.Pointer.js | 22 ++++++++++++++++------ 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index 1e981d98448..a060fe09ad6 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -11,15 +11,13 @@ L.extend(L.DomEvent, { addDoubleTapListener: function (obj, handler, id) { var last, touch, doubleTap = false, - delay = 250, - trackedTouches = []; + delay = 250; function onTouchStart(e) { var count; if (L.Browser.pointer) { - trackedTouches.push(e.pointerId); - count = trackedTouches.length; + count = L.DomEvent._pointersCount; } else { count = e.touches.length; } @@ -35,12 +33,6 @@ L.extend(L.DomEvent, { } function onTouchEnd(e) { - if (L.Browser.pointer) { - var idx = trackedTouches.indexOf(e.pointerId); - if (idx === -1) { return; } - trackedTouches.splice(idx, 1); - } - if (doubleTap) { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events @@ -66,31 +58,17 @@ L.extend(L.DomEvent, { obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; - // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen - // will not come through to us, so we will lose track of how many touches are ongoing - var endElement = L.Browser.pointer ? document.documentElement : obj; - obj.addEventListener(touchstart, onTouchStart, false); - - endElement.addEventListener(touchend, onTouchEnd, false); - if (L.Browser.pointer) { - endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); - } - + obj.addEventListener(touchend, onTouchEnd, false); return this; }, removeDoubleTapListener: function (obj, id) { var pre = '_leaflet_', - endElement = L.Browser.pointer ? document.documentElement : obj, touchend = obj[pre + this._touchend + id]; obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - - endElement.removeEventListener(this._touchend, touchend, false); - if (L.Browser.pointer) { - endElement.removeEventListener(L.DomEvent.POINTER_CANCEL, touchend, false); - } + obj.removeEventListener(this._touchend, touchend, false); return this; } diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 824ecc3b871..170668c7896 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -10,6 +10,7 @@ L.extend(L.DomEvent, { POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', _pointers: {}, + _pointersCount: 0, // Provides a touch events wrapper for (ms)pointer events. // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 @@ -50,22 +51,33 @@ L.extend(L.DomEvent, { var onDown = L.bind(function (e) { L.DomEvent.preventDefault(e); - this._pointers[e.pointerId] = e; this._handlePointer(e, handler); }, this); obj['_leaflet_touchstart' + id] = onDown; obj.addEventListener(this.POINTER_DOWN, onDown, false); - // need to also listen for end events to keep the _pointers object accurate + // need to keep track of what pointers and how many are active to provide e.touches emulation if (!this._pointerDocListener) { + var addPointer = L.bind(function (e) { + this._pointers[e.pointerId] = e; + this._pointersCount++; + }, this); + var updatePointer = L.bind(function (e) { + if (this._pointers[e.pointerId]) { + this._pointers[e.pointerId] = e; + } + }, this); var removePointer = L.bind(function (e) { delete this._pointers[e.pointerId]; + this._pointersCount--; }, this); // we listen documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(this.POINTER_UP, removePointer, false); - document.documentElement.addEventListener(this.POINTER_CANCEL, removePointer, false); + document.documentElement.addEventListener(this.POINTER_DOWN, addPointer, true); + document.documentElement.addEventListener(this.POINTER_MOVE, updatePointer, true); + document.documentElement.addEventListener(this.POINTER_UP, removePointer, true); + document.documentElement.addEventListener(this.POINTER_CANCEL, removePointer, true); this._pointerDocListener = true; } @@ -86,7 +98,6 @@ L.extend(L.DomEvent, { // don't fire touch moves when mouse isn't down if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } - this._pointers[e.pointerId] = e; this._handlePointer(e, handler); }, this); @@ -96,7 +107,6 @@ L.extend(L.DomEvent, { _addPointerEnd: function (obj, handler, id) { var onUp = L.bind(function (e) { - delete this._pointers[e.pointerId]; this._handlePointer(e, handler); }, this); From 2dad982a6e047fd6daa430ae3c963aa152462618 Mon Sep 17 00:00:00 2001 From: David Leaver Date: Sat, 8 Nov 2014 09:44:43 +1300 Subject: [PATCH 1220/2207] Remove unused e parameter --- src/dom/DomEvent.DoubleTap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index a060fe09ad6..e7d916725b6 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -32,7 +32,7 @@ L.extend(L.DomEvent, { last = now; } - function onTouchEnd(e) { + function onTouchEnd() { if (doubleTap) { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events From 68f86d85d316bc660e82fe3cd329a987aa609d41 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 7 Nov 2014 16:20:21 -0800 Subject: [PATCH 1221/2207] Better fix for tile pruning Need to always prune in _addTiles, otherwise tiles can get stranded. --- spec/suites/layer/tile/GridLayerSpec.js | 64 +++++++++++++++++++++++++ src/layer/tile/GridLayer.js | 34 ++++++------- 2 files changed, 81 insertions(+), 17 deletions(-) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index a72b85baa04..d5cfdfe844c 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -68,6 +68,70 @@ describe('GridLayer', function () { }); }); + describe('tile pyramid', function () { + var clock; + + beforeEach(function () { + clock = sinon.useFakeTimers(); + }); + + afterEach(function () { + clock.restore(); + }); + + it('removes tiles for unused zoom levels', function (done) { + map.remove(); + map = L.map(div, {fadeAnimation: false}); + map.setView([0, 0], 1); + + var grid = L.gridLayer(); + var tiles = {}; + + grid.createTile = function (coords) { + tiles[grid._tileCoordsToKey(coords)] = true; + return document.createElement('div'); + }; + + grid.on('tileunload', function (e) { + delete tiles[grid._tileCoordsToKey(e.coords)]; + if (Object.keys(tiles).length === 1) { + expect(Object.keys(tiles)).to.eql(['0:0:0']); + done(); + } + }); + + map.addLayer(grid); + map.setZoom(0, {animate: false}); + clock.tick(250); + }); + + it('prunes and retains the correct tiles for back-to-back zooms', function () { + map.setView([0, 0], 1); + + var grid = L.gridLayer(); + var tiles = {}; + + grid.createTile = function (coords) { + tiles[grid._tileCoordsToKey(coords)] = true; + return document.createElement('div'); + }; + + map.addLayer(grid); + clock.tick(500); + + map.setZoom(0, {animate: false}); + clock.tick(250); + + map.setZoom(1, {animate: false}); + clock.tick(500); + + var tileContainers = div.querySelectorAll('.leaflet-tile-container'); + expect(tileContainers.length).to.eql(2); + expect(tileContainers[0].childNodes.length).to.equal(8); + expect(tileContainers[1].childNodes.length).to.equal(0); + }); + }); + describe("#onAdd", function () { it('is called after viewreset on first map load', function () { var layer = L.gridLayer().addTo(map); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index cd0c7546474..9d102efaae1 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -230,8 +230,10 @@ L.GridLayer = L.Layer.extend({ if (!this._loaded[key]) { this._removeTile(key); this._tilesToLoad--; - } else { + } else if (this._map._fadeAnimated) { setTimeout(L.bind(this._deferRemove, this, key), 250); + } else { + this._removeTile(key); } } } @@ -381,11 +383,8 @@ L.GridLayer = L.Layer.extend({ coords = new L.Point(i, j); coords.z = this._tileZoom; - var key = this._tileCoordsToKey(coords); - this._retain[key] = true; - // add tile to queue if it's not in cache or out of bounds - if (!(key in this._tiles) && this._isValidTile(coords)) { + if (!(this._tileCoordsToKey(coords) in this._tiles) && this._isValidTile(coords)) { queue.push(coords); } } @@ -398,23 +397,24 @@ L.GridLayer = L.Layer.extend({ var tilesToLoad = queue.length; - if (tilesToLoad === 0) { return; } - // if its the first batch of tiles to load - if (!this._tilesToLoad) { - this.fire('loading'); - } + if (tilesToLoad !== 0) { + // if its the first batch of tiles to load + if (!this._tilesToLoad) { + this.fire('loading'); + } - this._tilesToLoad += tilesToLoad; + this._tilesToLoad += tilesToLoad; - // create DOM fragment to append tiles in one batch - var fragment = document.createDocumentFragment(); + // create DOM fragment to append tiles in one batch + var fragment = document.createDocumentFragment(); - for (i = 0; i < tilesToLoad; i++) { - this._addTile(queue[i], fragment); - } + for (i = 0; i < tilesToLoad; i++) { + this._addTile(queue[i], fragment); + } - this._level.el.appendChild(fragment); + this._level.el.appendChild(fragment); + } this._pruneTiles(); }, From 8682511e2cfce438aa4c541e613831caeb5700b7 Mon Sep 17 00:00:00 2001 From: David Leaver Date: Sun, 9 Nov 2014 18:08:53 +1300 Subject: [PATCH 1222/2207] Move locally declared methods out. --- src/dom/DomEvent.Pointer.js | 38 ++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 170668c7896..4e4ced58de3 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -59,30 +59,34 @@ L.extend(L.DomEvent, { // need to keep track of what pointers and how many are active to provide e.touches emulation if (!this._pointerDocListener) { - var addPointer = L.bind(function (e) { - this._pointers[e.pointerId] = e; - this._pointersCount++; - }, this); - var updatePointer = L.bind(function (e) { - if (this._pointers[e.pointerId]) { - this._pointers[e.pointerId] = e; - } - }, this); - var removePointer = L.bind(function (e) { - delete this._pointers[e.pointerId]; - this._pointersCount--; - }, this); + var pointerUp = L.bind(this._globalPointerUp, this); // we listen documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(this.POINTER_DOWN, addPointer, true); - document.documentElement.addEventListener(this.POINTER_MOVE, updatePointer, true); - document.documentElement.addEventListener(this.POINTER_UP, removePointer, true); - document.documentElement.addEventListener(this.POINTER_CANCEL, removePointer, true); + document.documentElement.addEventListener(this.POINTER_DOWN, L.bind(this._globalPointerDown, this), true); + document.documentElement.addEventListener(this.POINTER_MOVE, L.bind(this._globalPointerMove, this), true); + document.documentElement.addEventListener(this.POINTER_UP, pointerUp, true); + document.documentElement.addEventListener(this.POINTER_CANCEL, pointerUp, true); this._pointerDocListener = true; } }, + _globalPointerDown: function (e) { + this._pointers[e.pointerId] = e; + this._pointersCount++; + }, + + _globalPointerMove: function (e) { + if (this._pointers[e.pointerId]) { + this._pointers[e.pointerId] = e; + } + }, + + _globalPointerUp: function (e) { + delete this._pointers[e.pointerId]; + this._pointersCount--; + }, + _handlePointer: function (e, handler) { e.touches = []; for (var i in this._pointers) { From 4317a10fc9394acf7a04dbb4c2e6b4ab439bef46 Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Sun, 9 Nov 2014 11:57:01 -0600 Subject: [PATCH 1223/2207] allow for setStyle option regarding opacity calls on FeatureGroup to reach ImageOverlays contained inside Brought from @opie implementation in #2246 --- src/layer/ImageOverlay.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 9a1d37fb8be..cf4e2d8041f 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -43,6 +43,13 @@ L.ImageOverlay = L.Layer.extend({ return this; }, + setStyle: function (styleOpts) { + if (styleOpts.opacity) { + this.setOpacity(styleOpts.opacity); + } + return this; + }, + bringToFront: function () { if (this._map) { L.DomUtil.toFront(this._image); From ca2f1171b7e325434a78696a32d2d537419af0b9 Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Sun, 9 Nov 2014 13:18:50 -0600 Subject: [PATCH 1224/2207] add interactive option on ImageOverlay --- debug/map/image-overlay.html | 7 ++++++- src/layer/ImageOverlay.js | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/debug/map/image-overlay.html b/debug/map/image-overlay.html index c3f01d0a743..f1068092631 100644 --- a/debug/map/image-overlay.html +++ b/debug/map/image-overlay.html @@ -34,10 +34,15 @@ map.fitBounds(bounds); var overlay = new L.ImageOverlay("https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg", bounds, { - opacity: 0.5 + opacity: 0.5, + interactive: true }); map.addLayer(overlay); + overlay.on('dblclick',function (e) { + console.log('Double click on image.') + }) + diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 9a1d37fb8be..bf4f3613960 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -6,7 +6,8 @@ L.ImageOverlay = L.Layer.extend({ options: { opacity: 1, - alt: '' + alt: '', + interactive: false }, initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) @@ -26,7 +27,7 @@ L.ImageOverlay = L.Layer.extend({ } this.getPane().appendChild(this._image); - + this._initInteraction(); this._reset(); }, @@ -57,6 +58,19 @@ L.ImageOverlay = L.Layer.extend({ return this; }, + _initInteraction: function () { + if (!this.options.interactive) { return; } + L.DomUtil.addClass(this._image, 'leaflet-interactive'); + L.DomEvent.on(this._image, 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu', + this._fireMouseEvent, this); + }, + + _fireMouseEvent: function (e, type) { + if (this._map) { + this._map._fireMouseEvent(this, e, type, true); + } + }, + setUrl: function (url) { this._url = url; From 65402d98ceff947c64faa2521781900f9df45684 Mon Sep 17 00:00:00 2001 From: florpor Date: Mon, 29 Sep 2014 19:34:47 +0300 Subject: [PATCH 1225/2207] Update plugins.md - add Leaflet.ShowAll --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index eb8eec46889..6fe3940a482 100644 --- a/plugins.md +++ b/plugins.md @@ -1372,6 +1372,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Bitmap painting plugin designed for touch devices. Antoine Pultier + + + + + Leaflet.ShowAll + + A control that can show a predefined extent while saving the current one so it can be jumped back to. + + Mor Yariv From 48677f2243339b2c1b38e39a695a497b3aeba272 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 10 Nov 2014 17:53:34 +0200 Subject: [PATCH 1226/2207] fix maxNativeZoom = 0 race condition, close #3004 --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index c5f54caaf52..180fb5e93b5 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -103,7 +103,7 @@ L.TileLayer = L.GridLayer.extend({ zoomN = options.maxNativeZoom; // increase tile size when overscaling - return zoomN && zoom > zoomN ? + return zoomN !== undefined && zoom > zoomN ? Math.round(map.getZoomScale(zoomN, zoom) * options.tileSize) : options.tileSize; }, From d0f5b51ad577d2226b61b8965f3f77f08cb212a5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 11 Nov 2014 12:38:42 +0200 Subject: [PATCH 1227/2207] fix awesome bug regression, close #3013 --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 180fb5e93b5..94f1f21ac33 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -103,7 +103,7 @@ L.TileLayer = L.GridLayer.extend({ zoomN = options.maxNativeZoom; // increase tile size when overscaling - return zoomN !== undefined && zoom > zoomN ? + return zoomN !== null && zoom > zoomN ? Math.round(map.getZoomScale(zoomN, zoom) * options.tileSize) : options.tileSize; }, From c6bcdb031bcb768899903caad21fd8478f0c845f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 11 Nov 2014 16:55:12 +0200 Subject: [PATCH 1228/2207] fix ImageOverlay anim in weird projections, close #3011 --- src/layer/ImageOverlay.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 9a1d37fb8be..192b4d7143f 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -81,7 +81,7 @@ L.ImageOverlay = L.Layer.extend({ return events; }, - + getBounds: function () { return this._bounds; }, @@ -99,9 +99,11 @@ L.ImageOverlay = L.Layer.extend({ }, _animateZoom: function (e) { - var topLeft = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center), - size = this._map._latLngToNewLayerPoint(this._bounds.getSouthEast(), e.zoom, e.center).subtract(topLeft), - offset = topLeft.add(size._multiplyBy((1 - 1 / e.scale) / 2)); + var bounds = new L.Bounds( + this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center), + this._map._latLngToNewLayerPoint(this._bounds.getSouthEast(), e.zoom, e.center)); + + var offset = bounds.min.add(bounds.getSize()._multiplyBy((1 - 1 / e.scale) / 2)); L.DomUtil.setTransform(this._image, offset, e.scale); }, From aa8be5451361db6c5044116fe275e05c16336cce Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 11 Nov 2014 17:08:27 -0800 Subject: [PATCH 1229/2207] stopPropagation of click event following drag operation (fixes #2930) --- src/map/Map.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 1b9bbb5f63c..9871eb985ed 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -581,7 +581,10 @@ L.Map = L.Evented.extend({ if (type === 'click') { var draggableObj = obj.options.draggable === true ? obj : this; if (!e._simulated && ((draggableObj.dragging && draggableObj.dragging.moved()) || - (this.boxZoom && this.boxZoom.moved()))) { return; } + (this.boxZoom && this.boxZoom.moved()))) { + L.DomEvent.stopPropagation(e); + return; + } obj.fire('preclick'); } From de868d6a838c1e6db04c37712dddcba777d2c6f0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 12 Nov 2014 12:21:39 +0200 Subject: [PATCH 1230/2207] don't require DomEvent for attrib & markers, close #2854 --- src/control/Control.Attribution.js | 4 +++- src/layer/marker/Marker.js | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/control/Control.Attribution.js b/src/control/Control.Attribution.js index d228d5a45e7..4803e04afcd 100644 --- a/src/control/Control.Attribution.js +++ b/src/control/Control.Attribution.js @@ -16,7 +16,9 @@ L.Control.Attribution = L.Control.extend({ onAdd: function (map) { this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); - L.DomEvent.disableClickPropagation(this._container); + if (L.DomEvent) { + L.DomEvent.disableClickPropagation(this._container); + } // TODO ugly, refactor for (var i in map._layers) { diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index efa81ec0517..d8b001da107 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -123,7 +123,7 @@ L.Marker = L.Layer.extend({ this._icon = icon; this._initInteraction(); - if (options.riseOnHover) { + if (L.DomEvent && options.riseOnHover) { L.DomEvent.on(icon, { mouseover: this._bringToFront, mouseout: this._resetZIndex @@ -158,7 +158,7 @@ L.Marker = L.Layer.extend({ }, _removeIcon: function () { - if (this.options.riseOnHover) { + if (L.DomEvent && this.options.riseOnHover) { L.DomEvent.off(this._icon, { mouseover: this._bringToFront, mouseout: this._resetZIndex @@ -205,8 +205,11 @@ L.Marker = L.Layer.extend({ L.DomUtil.addClass(this._icon, 'leaflet-interactive'); - L.DomEvent.on(this._icon, 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu keypress', + if (L.DomEvent) { + L.DomEvent.on(this._icon, + 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu keypress', this._fireMouseEvent, this); + } if (L.Handler.MarkerDrag) { var draggable = this.options.draggable; From d2871e68e57a3e35620d1f6f6a145e44d28e3856 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 12 Nov 2014 10:53:26 -0800 Subject: [PATCH 1231/2207] Add test for #3008 --- spec/index.html | 1 + spec/suites/layer/ImageOverlaySpec.js | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 spec/suites/layer/ImageOverlaySpec.js diff --git a/spec/index.html b/spec/index.html index f3898e005aa..9d9aa9a55f6 100644 --- a/spec/index.html +++ b/spec/index.html @@ -58,6 +58,7 @@ + diff --git a/spec/suites/layer/ImageOverlaySpec.js b/spec/suites/layer/ImageOverlaySpec.js new file mode 100644 index 00000000000..a3befa57ed0 --- /dev/null +++ b/spec/suites/layer/ImageOverlaySpec.js @@ -0,0 +1,8 @@ +describe('ImageOverlay', function () { + describe('#setStyle', function () { + it('sets opacity', function () { + var overlay = L.imageOverlay().setStyle({opacity: 0.5}); + expect(overlay.options.opacity).to.equal(0.5); + }); + }); +}); From 114ca1e6d4d6ead04281f2afbe6f87cc524a65e1 Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Wed, 12 Nov 2014 14:26:31 -0500 Subject: [PATCH 1232/2207] update api reference with section on class constructors --- reference.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reference.html b/reference.html index 9d272fef822..f8bf030c246 100644 --- a/reference.html +++ b/reference.html @@ -5018,6 +5018,19 @@

      Class

      +

      Class Constructors

      + +

      Class constructors can be created by assigning a constructor function to the initialize key:

      + +
      var MyClass = L.Class.extend({
      +	initialize: function (greeter) {
      +		this.greeter = greeter;
      +		// class constructor
      +});
      + +

      Please note that if you assign a new initialize method, it overwrites its parent initialize method.

      + +

      Class Factories

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      From b1f7bc8d549fb81baaa915061cb981d905f63d8a Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Wed, 12 Nov 2014 14:26:58 -0500 Subject: [PATCH 1233/2207] update gemfile to reflect github pages production env --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 4d3fad9b9bb..97355ea723a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,3 @@ source 'https://rubygems.org' -gem 'jekyll' -gem 'kramdown' \ No newline at end of file + +gem 'github-pages' From ad12e33dd9b631ed3dc7183897d38a8b30ecc4e8 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 12 Nov 2014 11:30:43 -0800 Subject: [PATCH 1234/2207] Fix trailing whitespace --- src/layer/ImageOverlay.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index c95345f2dc3..5862e96524d 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -45,11 +45,11 @@ L.ImageOverlay = L.Layer.extend({ }, setStyle: function (styleOpts) { - if (styleOpts.opacity) { - this.setOpacity(styleOpts.opacity); + if (styleOpts.opacity) { + this.setOpacity(styleOpts.opacity); } return this; - }, + }, bringToFront: function () { if (this._map) { From e1e456b975768f0f6c3d80984ca3e53cd6424348 Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Wed, 12 Nov 2014 15:15:56 -0500 Subject: [PATCH 1235/2207] simplify initialize clarification --- reference.html | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/reference.html b/reference.html index f8bf030c246..ecb64af2e5d 100644 --- a/reference.html +++ b/reference.html @@ -5017,18 +5017,7 @@

      Class

      a.greet("World");
      - -

      Class Constructors

      - -

      Class constructors can be created by assigning a constructor function to the initialize key:

      - -
      var MyClass = L.Class.extend({
      -	initialize: function (greeter) {
      -		this.greeter = greeter;
      -		// class constructor
      -});
      - -

      Please note that if you assign a new initialize method, it overwrites its parent initialize method.

      +

      The initialize method is your class's constructor function, meaning that it gets called when you do new MyClass(...).

      Class Factories

      From bad49e7612dac7aa008265f701385b43450f2dec Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 12 Nov 2014 12:52:50 -0800 Subject: [PATCH 1236/2207] Add autoClose option to Popup Fixes #2716 Fixes #1853 --- spec/suites/layer/PopupSpec.js | 52 ++++++++++++++++++++++++++++++++-- src/layer/Popup.js | 6 +++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index cef554f6cb8..09e8b725a80 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -70,7 +70,7 @@ describe('Popup', function () { marker.closePopup.restore(); }); - it("should trigger popupopen on marker when popup opens", function () { + it("triggers popupopen on marker when popup opens", function () { var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); @@ -91,7 +91,7 @@ describe('Popup', function () { expect(spy.called).to.be(true); }); - it("should trigger popupclose on marker when popup closes", function () { + it("triggers popupclose on marker when popup closes", function () { var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); @@ -117,3 +117,51 @@ describe('Popup', function () { expect(spy.callCount).to.be(2); }); }); + +describe("L.Map#openPopup", function () { + var c, map; + + beforeEach(function () { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + map = new L.Map(c); + map.setView(new L.LatLng(55.8, 37.6), 6); + }); + + it("adds the popup layer to the map", function () { + var popup = new L.Popup() + .setLatLng(new L.LatLng(55.8, 37.6)); + map.openPopup(popup); + expect(map.hasLayer(popup)).to.be(true); + }); + + it("sets popup location", function () { + var popup = new L.Popup(); + map.openPopup(popup, L.latLng(55.8, 37.6)); + expect(popup.getLatLng()).to.eql(L.latLng(55.8, 37.6)); + }); + + it("creates a popup from content", function () { + map.openPopup("

      Hello World

      ", L.latLng(55.8, 37.6)); + expect(map._popup).to.be.an(L.Popup); + expect(map._popup.getContent()).to.eql("

      Hello World

      "); + }); + + it("closes existing popup", function () { + var p1 = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + var p2 = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + map.openPopup(p1); + map.openPopup(p2); + expect(map.hasLayer(p1)).to.be(false); + }); + + it("does not close existing popup with autoClose: false option", function () { + var p1 = new L.Popup({autoClose: false}).setLatLng(new L.LatLng(55.8, 37.6)); + var p2 = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + map.openPopup(p1); + map.openPopup(p2); + expect(map.hasLayer(p1)).to.be(true); + expect(map.hasLayer(p2)).to.be(true); + }); +}); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index f991d9f1aa3..3a702971f24 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -22,6 +22,7 @@ L.Popup = L.Layer.extend({ // autoPanPaddingBottomRight: , closeButton: true, + autoClose: true, // keepInView: false, // className: '', zoomAnimation: true @@ -306,7 +307,10 @@ L.Map.include({ return this; } - this.closePopup(); + if (this._popup && this._popup.options.autoClose) { + this.closePopup(); + } + this._popup = popup; return this.addLayer(popup); }, From ef96884021020e7228cfac3c9223cc76e524b671 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 12 Nov 2014 14:44:50 -0800 Subject: [PATCH 1237/2207] Ensure parent init hooks are called (fixes #2545) --- spec/suites/core/ClassSpec.js | 11 +++++++++++ src/core/Class.js | 4 +--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index 81efe789f18..0d8cf81ea80 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -158,6 +158,17 @@ describe("Class", function () { expect(spy1.called).to.be.ok(); expect(spy2.called).to.eql(false); }); + + it("calls parent constructor hooks when child has none", function () { + var spy1 = sinon.spy(); + + Klass.addInitHook(spy1); + + var Klass2 = Klass.extend({}); + var a = new Klass2(); + + expect(spy1.called).to.be.ok(); + }); }); // TODO Class.include diff --git a/src/core/Class.js b/src/core/Class.js index f34c2ada3f2..c2d74cb2be8 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -16,9 +16,7 @@ L.Class.extend = function (props) { } // call all constructor hooks - if (this._initHooks.length) { - this.callInitHooks(); - } + this.callInitHooks(); }; // jshint camelcase: false From 0b86fa32662423d31e478ce7830ecb8bc0331d9e Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 13 Nov 2014 10:49:43 -0800 Subject: [PATCH 1238/2207] Remove control from existing map in onAdd (fixes #3020) --- spec/index.html | 1 + spec/suites/control/ControlSpec.js | 29 +++++++++++++++++++++++++++++ src/control/Control.js | 4 ++++ 3 files changed, 34 insertions(+) create mode 100644 spec/suites/control/ControlSpec.js diff --git a/spec/index.html b/spec/index.html index 9d9aa9a55f6..5c94956efde 100644 --- a/spec/index.html +++ b/spec/index.html @@ -30,6 +30,7 @@ + diff --git a/spec/suites/control/ControlSpec.js b/spec/suites/control/ControlSpec.js new file mode 100644 index 00000000000..6332a62d6ff --- /dev/null +++ b/spec/suites/control/ControlSpec.js @@ -0,0 +1,29 @@ +describe("Control", function () { + var map; + + beforeEach(function () { + map = L.map(document.createElement('div')); + }); + + function onAdd() { + return L.DomUtil.create('div', 'leaflet-test-control'); + } + + describe("#addTo", function () { + it("adds the container to the map", function () { + var control = new L.Control(); + control.onAdd = onAdd; + control.addTo(map); + expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(control.getContainer()); + }); + + it("removes the control from any existing map", function () { + var control = new L.Control(); + control.onAdd = onAdd; + control.addTo(map); + control.addTo(map); + expect(map.getContainer().querySelectorAll('.leaflet-test-control').length).to.equal(1); + expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(control.getContainer()); + }); + }); +}); diff --git a/src/control/Control.js b/src/control/Control.js index d8750fc31aa..4bae4401a26 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -37,6 +37,10 @@ L.Control = L.Class.extend({ }, addTo: function (map) { + if (this._map) { + this.remove(); + } + this._map = map; var container = this._container = this.onAdd(map), From 87c7d1d563fff99eff59825b3acd05c407cb66e7 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 13 Nov 2014 11:25:49 -0800 Subject: [PATCH 1239/2207] No-op Control#remove if not on a map (fixes #2877) --- spec/suites/control/ControlSpec.js | 22 ++++++++++++++++++++++ src/control/Control.js | 9 +++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/spec/suites/control/ControlSpec.js b/spec/suites/control/ControlSpec.js index 6332a62d6ff..6d2770b8046 100644 --- a/spec/suites/control/ControlSpec.js +++ b/spec/suites/control/ControlSpec.js @@ -26,4 +26,26 @@ describe("Control", function () { expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(control.getContainer()); }); }); + + describe("#remove", function () { + it("removes the container from the map", function () { + var control = new L.Control(); + control.onAdd = onAdd; + control.addTo(map).remove(); + expect(map.getContainer().querySelector('.leaflet-test-control')).to.equal(null); + }); + + it("calls onRemove if defined", function () { + var control = new L.Control(); + control.onAdd = onAdd; + control.onRemove = sinon.spy(); + control.addTo(map).remove(); + expect(control.onRemove.called).to.be(true); + }); + + it("is a no-op if the control has not been added", function () { + var control = new L.Control(); + expect(control.remove()).to.equal(control); + }); + }); }); diff --git a/src/control/Control.js b/src/control/Control.js index 4bae4401a26..786ba5599c4 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -37,10 +37,7 @@ L.Control = L.Class.extend({ }, addTo: function (map) { - if (this._map) { - this.remove(); - } - + this.remove(); this._map = map; var container = this._container = this.onAdd(map), @@ -59,6 +56,10 @@ L.Control = L.Class.extend({ }, remove: function () { + if (!this._map) { + return this; + } + L.DomUtil.remove(this._container); if (this.onRemove) { From 44a10690a7ad70b3b912c59bb7fc1d289ce62fe0 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 14 Nov 2014 12:35:34 +0100 Subject: [PATCH 1240/2207] Implement fast zoom on minus/plus keydown with shiftKey --- src/map/handler/Map.Keyboard.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index bcc0362ee0f..e64a59b6948 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -5,7 +5,8 @@ L.Map.mergeOptions({ keyboard: true, keyboardPanOffset: 80, - keyboardZoomOffset: 1 + keyboardZoomOffset: 1, + shiftZoomFactor: 3 }); L.Map.Keyboard = L.Handler.extend({ @@ -128,7 +129,7 @@ L.Map.Keyboard = L.Handler.extend({ if (e.altKey || e.ctrlKey || e.metaKey) { return; } var key = e.keyCode, - map = this._map; + map = this._map, zoomOffset; if (key in this._panKeys) { @@ -141,7 +142,8 @@ L.Map.Keyboard = L.Handler.extend({ } } else if (key in this._zoomKeys) { - map.setZoom(map.getZoom() + this._zoomKeys[key]); + zoomOffset = e.shiftKey ? this._zoomKeys[key] * this._map.options.shiftZoomFactor : this._zoomKeys[key]; + map.setZoom(map.getZoom() + zoomOffset); } else if (key === 27) { map.closePopup(); From 86de51ed9e999071edde1e8f39bdcfa7e55dff91 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 14 Nov 2014 14:16:41 +0100 Subject: [PATCH 1241/2207] We don't need an option for the zoom factor --- src/map/handler/Map.Keyboard.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index e64a59b6948..251150b1cd2 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -5,8 +5,7 @@ L.Map.mergeOptions({ keyboard: true, keyboardPanOffset: 80, - keyboardZoomOffset: 1, - shiftZoomFactor: 3 + keyboardZoomOffset: 1 }); L.Map.Keyboard = L.Handler.extend({ @@ -129,7 +128,7 @@ L.Map.Keyboard = L.Handler.extend({ if (e.altKey || e.ctrlKey || e.metaKey) { return; } var key = e.keyCode, - map = this._map, zoomOffset; + map = this._map; if (key in this._panKeys) { @@ -142,8 +141,7 @@ L.Map.Keyboard = L.Handler.extend({ } } else if (key in this._zoomKeys) { - zoomOffset = e.shiftKey ? this._zoomKeys[key] * this._map.options.shiftZoomFactor : this._zoomKeys[key]; - map.setZoom(map.getZoom() + zoomOffset); + map.setZoom(map.getZoom() + (e.shiftKey ? this._zoomKeys[key] * 3 : this._zoomKeys[key])); } else if (key === 27) { map.closePopup(); From f41f37c9c02925c0bc810c8fa13d8913bb47eb2e Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 14 Nov 2014 17:12:15 +0100 Subject: [PATCH 1242/2207] More compact code --- src/map/handler/Map.Keyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 251150b1cd2..789a50fb58e 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -141,7 +141,7 @@ L.Map.Keyboard = L.Handler.extend({ } } else if (key in this._zoomKeys) { - map.setZoom(map.getZoom() + (e.shiftKey ? this._zoomKeys[key] * 3 : this._zoomKeys[key])); + map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]); } else if (key === 27) { map.closePopup(); From 8f5fe4defc038ede98ab3bb6f79d69bb0bf1ad14 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 15 Nov 2014 14:43:57 +0000 Subject: [PATCH 1243/2207] Don't require jshint as it is not used --- build/build.js | 1 - 1 file changed, 1 deletion(-) diff --git a/build/build.js b/build/build.js index cbb714dea8f..12bac0fb9c2 100644 --- a/build/build.js +++ b/build/build.js @@ -1,5 +1,4 @@ var fs = require('fs'), - jshint = require('jshint'), UglifyJS = require('uglify-js'), deps = require('./deps.js').deps; From 8c606358cc83d0b05c4d98d4c2b3bacce9075ae3 Mon Sep 17 00:00:00 2001 From: flemenach Date: Tue, 18 Nov 2014 09:32:46 +0100 Subject: [PATCH 1244/2207] Fix inertia animation with worldCopyJump enabled --- src/map/handler/Map.Drag.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 4302a1143e5..1df7d87287a 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -67,7 +67,7 @@ L.Map.Drag = L.Handler.extend({ _onDrag: function () { if (this._map.options.inertia) { var time = this._lastTime = +new Date(), - pos = this._lastPos = this._draggable._newPos; + pos = this._lastPos = this._draggable._absPos || this._draggable._newPos; this._positions.push(pos); this._times.push(time); @@ -101,6 +101,7 @@ L.Map.Drag = L.Handler.extend({ newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; + this._draggable._absPos = this._draggable._newPos.clone(); this._draggable._newPos.x = newX; }, From 958c02c8cb788829d92e20cc71480b3ef2bf215d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 14:39:47 +0200 Subject: [PATCH 1245/2207] Layer add/removeInteractiveTarget methods registers DOM elements for event delegation --- src/layer/Layer.js | 10 ++++++++++ src/map/Map.js | 8 ++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 32b2c44b58f..579d30b5c28 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -25,6 +25,16 @@ L.Layer = L.Evented.extend({ return this._map.getPane(name ? (this.options[name] || name) : this.options.pane); }, + addInteractiveTarget: function (targetEl) { + this._map._targets[L.stamp(targetEl)] = this; + return this; + }, + + removeInteractiveTarget: function (targetEl) { + delete this._map._targets[L.stamp(targetEl)]; + return this; + }, + _layerAdd: function (e) { var map = e.target; diff --git a/src/map/Map.js b/src/map/Map.js index 9871eb985ed..1ebbdd3d1af 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -555,6 +555,8 @@ L.Map = L.Evented.extend({ 'click dblclick mousedown mouseup mouseenter mouseleave mousemove contextmenu', this._handleMouseEvent, this); + this._targets = {}; + if (this.options.trackResize) { L.DomEvent[onOff](window, 'resize', this._onResize, this); } @@ -569,9 +571,11 @@ L.Map = L.Evented.extend({ _handleMouseEvent: function (e) { if (!this._loaded) { return; } - this._fireMouseEvent(this, e, + var target = this._targets[L.stamp(e.target || e.srcElement)]; + + this._fireMouseEvent(target || this, e, e.type === 'mouseenter' ? 'mouseover' : - e.type === 'mouseleave' ? 'mouseout' : e.type); + e.type === 'mouseleave' ? 'mouseout' : e.type, true); }, _fireMouseEvent: function (obj, e, type, propagate, latlng) { From 79ad1aa547eb9a1caf0aeb003f800afffb317eb3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 14:40:20 +0200 Subject: [PATCH 1246/2207] switch SVG paths to new delegation API --- src/layer/vector/Path.js | 4 ---- src/layer/vector/SVG.js | 26 ++++---------------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 6247c997175..c305e51684b 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -74,10 +74,6 @@ L.Path = L.Layer.extend({ return this; }, - _fireMouseEvent: function (e, type) { - this._map._fireMouseEvent(this, e, type, true); - }, - _clickTolerance: function () { // used when doing hit detection for Canvas layers return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0); diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index cb538b35283..8c62fbce919 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -7,9 +7,6 @@ L.SVG = L.Renderer.extend({ _initContainer: function () { this._container = L.SVG.create('svg'); - this._paths = {}; - this._initEvents(); - // makes it possible to click through svg root; we'll reset it back in individual paths this._container.setAttribute('pointer-events', 'none'); }, @@ -54,15 +51,13 @@ L.SVG = L.Renderer.extend({ }, _addPath: function (layer) { - var path = layer._path; - this._container.appendChild(path); - this._paths[L.stamp(path)] = layer; + this._container.appendChild(layer._path); + layer.addInteractiveTarget(layer._path); }, _removePath: function (layer) { - var path = layer._path; - L.DomUtil.remove(path); - delete this._paths[L.stamp(path)]; + L.DomUtil.remove(layer._path); + layer.removeInteractiveTarget(layer._path); }, _updatePath: function (layer) { @@ -139,19 +134,6 @@ L.SVG = L.Renderer.extend({ _bringToBack: function (layer) { L.DomUtil.toBack(layer._path); - }, - - // TODO remove duplication with L.Map - _initEvents: function () { - L.DomEvent.on(this._container, 'click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu', - this._fireMouseEvent, this); - }, - - _fireMouseEvent: function (e) { - var path = this._paths[L.stamp(e.target || e.srcElement)]; - if (path) { - path._fireMouseEvent(e); - } } }); From 631cbed07391fbb8658cd752514d57cdd6b2fde5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 15:06:48 +0200 Subject: [PATCH 1247/2207] use new event delegation API in ImageOverlay --- src/layer/ImageOverlay.js | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 5862e96524d..fdd80496a11 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -26,13 +26,20 @@ L.ImageOverlay = L.Layer.extend({ } } + if (this.options.interactive) { + L.DomUtil.addClass(this._image, 'leaflet-interactive'); + this.addInteractiveTarget(this._image); + } + this.getPane().appendChild(this._image); - this._initInteraction(); this._reset(); }, onRemove: function () { L.DomUtil.remove(this._image); + if (this.options.interactive) { + this.removeInteractiveTarget(this._image); + } }, setOpacity: function (opacity) { @@ -65,19 +72,6 @@ L.ImageOverlay = L.Layer.extend({ return this; }, - _initInteraction: function () { - if (!this.options.interactive) { return; } - L.DomUtil.addClass(this._image, 'leaflet-interactive'); - L.DomEvent.on(this._image, 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu', - this._fireMouseEvent, this); - }, - - _fireMouseEvent: function (e, type) { - if (this._map) { - this._map._fireMouseEvent(this, e, type, true); - } - }, - setUrl: function (url) { this._url = url; From 204ce8b86227b92259fdb80b666c600fe5c7f4b2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 18:35:31 +0200 Subject: [PATCH 1248/2207] switch markers to event delegation API --- src/layer/marker/Marker.js | 34 ++++++++-------------------------- src/map/Map.js | 34 ++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index d8b001da107..e5209724bc8 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -123,11 +123,11 @@ L.Marker = L.Layer.extend({ this._icon = icon; this._initInteraction(); - if (L.DomEvent && options.riseOnHover) { - L.DomEvent.on(icon, { + if (options.riseOnHover) { + this.on({ mouseover: this._bringToFront, mouseout: this._resetZIndex - }, this); + }); } var newShadow = options.icon.createShadow(this._shadow), @@ -158,14 +158,15 @@ L.Marker = L.Layer.extend({ }, _removeIcon: function () { - if (L.DomEvent && this.options.riseOnHover) { - L.DomEvent.off(this._icon, { + if (this.options.riseOnHover) { + this.off({ mouseover: this._bringToFront, mouseout: this._resetZIndex - }, this); + }); } L.DomUtil.remove(this._icon); + this.removeInteractiveTarget(this._icon); this._icon = null; }, @@ -205,11 +206,7 @@ L.Marker = L.Layer.extend({ L.DomUtil.addClass(this._icon, 'leaflet-interactive'); - if (L.DomEvent) { - L.DomEvent.on(this._icon, - 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu keypress', - this._fireMouseEvent, this); - } + this.addInteractiveTarget(this._icon); if (L.Handler.MarkerDrag) { var draggable = this.options.draggable; @@ -226,21 +223,6 @@ L.Marker = L.Layer.extend({ } }, - _fireMouseEvent: function (e, type) { - // to prevent outline when clicking on keyboard-focusable marker - if (e.type === 'mousedown') { - L.DomEvent.preventDefault(e); - } - - if (e.type === 'keypress' && e.keyCode === 13) { - type = 'click'; - } - - if (this._map) { - this._map._fireMouseEvent(this, e, type, true, this._latlng); - } - }, - setOpacity: function (opacity) { this.options.opacity = opacity; if (this._map) { diff --git a/src/map/Map.js b/src/map/Map.js index 1ebbdd3d1af..057c9b24e82 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -552,7 +552,7 @@ L.Map = L.Evented.extend({ onOff = onOff || 'on'; L.DomEvent[onOff](this._container, - 'click dblclick mousedown mouseup mouseenter mouseleave mousemove contextmenu', + 'click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress', this._handleMouseEvent, this); this._targets = {}; @@ -573,9 +573,24 @@ L.Map = L.Evented.extend({ var target = this._targets[L.stamp(e.target || e.srcElement)]; - this._fireMouseEvent(target || this, e, - e.type === 'mouseenter' ? 'mouseover' : - e.type === 'mouseleave' ? 'mouseout' : e.type, true); + var type = + e.type === 'mouseenter' ? 'mouseover' : + e.type === 'mouseleave' ? 'mouseout' : e.type; + + if (e.type === 'keypress' && e.keyCode === 13) { + type = 'click'; + } + + // to prevent outline when clicking on keyboard-focusable element + if (type === 'mousedown') { + L.DomEvent.preventDefault(e); + } + + // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave + if (!target && (e.type === 'mouseover' || e.type === 'mouseout') && + !L.DomEvent._checkMouse(this._container, e)) { return; } + + this._fireMouseEvent(target || this, e, type, true); }, _fireMouseEvent: function (obj, e, type, propagate, latlng) { @@ -602,12 +617,15 @@ L.Map = L.Evented.extend({ } var data = { - originalEvent: e, - containerPoint: this.mouseEventToContainerPoint(e) + originalEvent: e }; - data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); - data.latlng = latlng || this.layerPointToLatLng(data.layerPoint); + if (e.type !== 'keypress') { + // TODO latlng isn't used, wrong latlng for markers + data.containerPoint = this.mouseEventToContainerPoint(e); + data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); + data.latlng = latlng || this.layerPointToLatLng(data.layerPoint); + } obj.fire(type, data, propagate); }, From 85c2a481925abcf971b533d01e5e1b5785397e3a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 20:16:33 +0200 Subject: [PATCH 1249/2207] cleaner DOM event handling in Map --- src/map/Map.js | 73 +++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 43 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 057c9b24e82..461e11ea533 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -219,7 +219,7 @@ L.Map = L.Evented.extend({ remove: function () { - this._initEvents('off'); + this._initEvents(true); try { // throws error in IE6-8 @@ -544,18 +544,17 @@ L.Map = L.Evented.extend({ } }, - // map events + // DOM event handling - _initEvents: function (onOff) { + _initEvents: function (remove) { if (!L.DomEvent) { return; } - onOff = onOff || 'on'; + this._targets = {}; - L.DomEvent[onOff](this._container, - 'click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress', - this._handleMouseEvent, this); + var onOff = remove ? 'off' : 'on'; - this._targets = {}; + L.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' + + 'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this); if (this.options.trackResize) { L.DomEvent[onOff](window, 'resize', this._onResize, this); @@ -568,46 +567,25 @@ L.Map = L.Evented.extend({ function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); }, - _handleMouseEvent: function (e) { - if (!this._loaded) { return; } - - var target = this._targets[L.stamp(e.target || e.srcElement)]; + _handleDOMEvent: function (e) { + if (!this._loaded || L.DomEvent._skipped(e)) { return; } - var type = - e.type === 'mouseenter' ? 'mouseover' : - e.type === 'mouseleave' ? 'mouseout' : e.type; + // find the layer the event is propagating from + var target = this._targets[L.stamp(e.target || e.srcElement)], + type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; - if (e.type === 'keypress' && e.keyCode === 13) { - type = 'click'; - } + // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave + if (!target && (type === 'mouseover' || type === 'mouseout') && + !L.DomEvent._checkMouse(this._container, e)) { return; } - // to prevent outline when clicking on keyboard-focusable element + // prevents outline when clicking on keyboard-focusable element if (type === 'mousedown') { L.DomEvent.preventDefault(e); } - // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave - if (!target && (e.type === 'mouseover' || e.type === 'mouseout') && - !L.DomEvent._checkMouse(this._container, e)) { return; } - - this._fireMouseEvent(target || this, e, type, true); - }, - - _fireMouseEvent: function (obj, e, type, propagate, latlng) { - type = type || e.type; - - if (L.DomEvent._skipped(e)) { return; } - if (type === 'click') { - var draggableObj = obj.options.draggable === true ? obj : this; - if (!e._simulated && ((draggableObj.dragging && draggableObj.dragging.moved()) || - (this.boxZoom && this.boxZoom.moved()))) { - L.DomEvent.stopPropagation(e); - return; - } - obj.fire('preclick'); - } + target = target || this; - if (!obj.listens(type, propagate)) { return; } + if (!target.listens(type, true) && (type !== 'click' || !target.listens('preclick', true))) { return; } if (type === 'contextmenu') { L.DomEvent.preventDefault(e); @@ -616,18 +594,27 @@ L.Map = L.Evented.extend({ L.DomEvent.stopPropagation(e); } + // prevents firing click after you just dragged an object + if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } + var data = { originalEvent: e }; - if (e.type !== 'keypress') { // TODO latlng isn't used, wrong latlng for markers data.containerPoint = this.mouseEventToContainerPoint(e); data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); - data.latlng = latlng || this.layerPointToLatLng(data.layerPoint); + data.latlng = this.layerPointToLatLng(data.layerPoint); } + if (type === 'click') { + target.fire('preclick', data, true); + } + target.fire(type, data, true); + }, - obj.fire(type, data, propagate); + _draggableMoved: function (obj) { + obj = obj.options.draggable ? obj : this; + return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); }, _clearHandlers: function () { From 92133cada04b67ced78a1038cb49973288020430 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 20:27:38 +0200 Subject: [PATCH 1250/2207] no need to stop propagation when delegating events --- src/map/Map.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 461e11ea533..51da83c2187 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -590,9 +590,6 @@ L.Map = L.Evented.extend({ if (type === 'contextmenu') { L.DomEvent.preventDefault(e); } - if (type === 'click' || type === 'dblclick' || type === 'contextmenu') { - L.DomEvent.stopPropagation(e); - } // prevents firing click after you just dragged an object if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } From faefbd1260d9084e4f31afdbb70fb6fe9505b0cc Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 20:27:52 +0200 Subject: [PATCH 1251/2207] prevent focus outline when dragging objects --- src/dom/Draggable.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index c743c11cb98..a303b086cfb 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -48,6 +48,7 @@ L.Draggable = L.Evented.extend({ if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } L.DomEvent.stopPropagation(e); + L.DomEvent.preventDefault(e); if (L.Draggable._disabled) { return; } From f9baef2d7b8105078603584aa31e9172b8df96ff Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 21:01:32 +0200 Subject: [PATCH 1252/2207] fix Canvas vector events --- src/layer/vector/Canvas.js | 13 +++++++++---- src/map/Map.js | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 3de15af9e8e..0eacebd07f8 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -190,7 +190,8 @@ L.Canvas = L.Renderer.extend({ for (var id in this._layers) { if (this._layers[id]._containsPoint(point)) { - this._layers[id]._fireMouseEvent(e); + L.DomEvent._fakeStop(e); + this._fireEvent(this._layers[id], e); } } }, @@ -213,20 +214,24 @@ L.Canvas = L.Renderer.extend({ // if we just got inside the layer, fire mouseover if (!layer._mouseInside) { L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor - layer._fireMouseEvent(e, 'mouseover'); + this._fireEvent(layer, e, 'mouseover'); layer._mouseInside = true; } // fire mousemove - layer._fireMouseEvent(e); + this._fireEvent(layer, e); } else if (layer._mouseInside) { // if we're leaving the layer, fire mouseout L.DomUtil.removeClass(this._container, 'leaflet-interactive'); - layer._fireMouseEvent(e, 'mouseout'); + this._fireEvent(layer, e, 'mouseout'); layer._mouseInside = false; } }, + _fireEvent: function (layer, e, type) { + this._map._fireDOMEvent(layer, e, type || e.type); + }, + // TODO _bringToFront & _bringToBack, pretty tricky _bringToFront: L.Util.falseFn, diff --git a/src/map/Map.js b/src/map/Map.js index 51da83c2187..b6a8f234b28 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -583,8 +583,10 @@ L.Map = L.Evented.extend({ L.DomEvent.preventDefault(e); } - target = target || this; + this._fireDOMEvent(target || this, e, type); + }, + _fireDOMEvent: function (target, e, type) { if (!target.listens(type, true) && (type !== 'click' || !target.listens('preclick', true))) { return; } if (type === 'contextmenu') { From 758f3f168464182cea8cc5063bbf142aba321490 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 21:42:01 +0200 Subject: [PATCH 1253/2207] better marker outline prevention --- src/dom/Draggable.js | 8 ++++++-- src/layer/marker/Marker.Drag.js | 2 +- src/map/Map.js | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index a303b086cfb..81108d4bccd 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -20,9 +20,10 @@ L.Draggable = L.Evented.extend({ } }, - initialize: function (element, dragStartTarget) { + initialize: function (element, dragStartTarget, preventOutline) { this._element = element; this._dragStartTarget = dragStartTarget || element; + this._preventOutline = preventOutline; }, enable: function () { @@ -48,7 +49,10 @@ L.Draggable = L.Evented.extend({ if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } L.DomEvent.stopPropagation(e); - L.DomEvent.preventDefault(e); + + if (this._preventOutline) { + L.DomEvent.preventDefault(e); + } if (L.Draggable._disabled) { return; } diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js index 911fa852d39..df67d6320e1 100644 --- a/src/layer/marker/Marker.Drag.js +++ b/src/layer/marker/Marker.Drag.js @@ -11,7 +11,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ var icon = this._marker._icon; if (!this._draggable) { - this._draggable = new L.Draggable(icon, icon); + this._draggable = new L.Draggable(icon, icon, true); } this._draggable.on({ diff --git a/src/map/Map.js b/src/map/Map.js index b6a8f234b28..05caa021460 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -579,7 +579,7 @@ L.Map = L.Evented.extend({ !L.DomEvent._checkMouse(this._container, e)) { return; } // prevents outline when clicking on keyboard-focusable element - if (type === 'mousedown') { + if (target && type === 'mousedown') { L.DomEvent.preventDefault(e); } From 756888cee7f2377b02e229de667d2a8cf5b71ab3 Mon Sep 17 00:00:00 2001 From: kerryarts Date: Thu, 20 Nov 2014 17:11:02 +1300 Subject: [PATCH 1254/2207] default zIndex to be a valid value to fix exception in ie8 --- src/layer/tile/GridLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 9d102efaae1..041b6ab15a7 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -15,7 +15,7 @@ L.GridLayer = L.Layer.extend({ updateInterval: 200, attribution: null, - zIndex: null, + zIndex: 'auto', bounds: null, minZoom: 0 From a8cfe6ec3f4894864b4bf0090e42e49d8bae93cd Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 18 Nov 2014 14:21:28 -0800 Subject: [PATCH 1255/2207] CSS-based outline prevention --- src/dom/DomUtil.js | 15 +++++++++++++++ src/dom/Draggable.js | 2 +- src/map/Map.js | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index c13c41e7314..c7d7a01f114 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -216,4 +216,19 @@ L.DomUtil = { L.DomUtil.enableImageDrag = function () { L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); }; + + L.DomUtil.preventOutline = function (element) { + L.DomUtil.restoreOutline(); + this._outlineElement = element; + this._outlineStyle = element.style.outline; + element.style.outline = 'none'; + L.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this); + }; + L.DomUtil.restoreOutline = function () { + if (!this._outlineElement) { return; } + this._outlineElement.style.outline = this._outlineStyle; + delete this._outlineElement; + delete this._outlineStyle; + L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this); + }; })(); diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 81108d4bccd..8283ac592e2 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -51,7 +51,7 @@ L.Draggable = L.Evented.extend({ L.DomEvent.stopPropagation(e); if (this._preventOutline) { - L.DomEvent.preventDefault(e); + L.DomUtil.preventOutline(this._element); } if (L.Draggable._disabled) { return; } diff --git a/src/map/Map.js b/src/map/Map.js index 05caa021460..0275ecc4871 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -579,8 +579,8 @@ L.Map = L.Evented.extend({ !L.DomEvent._checkMouse(this._container, e)) { return; } // prevents outline when clicking on keyboard-focusable element - if (target && type === 'mousedown') { - L.DomEvent.preventDefault(e); + if (type === 'mousedown') { + L.DomUtil.preventOutline(e.target || e.srcElement); } this._fireDOMEvent(target || this, e, type); From 0daf28fb4f3d1ebf23b0fa3090eff4f057a59ffb Mon Sep 17 00:00:00 2001 From: kerryarts Date: Fri, 21 Nov 2014 09:41:02 +1300 Subject: [PATCH 1256/2207] Fix _bringToFront/Back implementation for VML renderer --- src/layer/vector/SVG.VML.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/layer/vector/SVG.VML.js b/src/layer/vector/SVG.VML.js index 95b3735beaf..fbd5c899c72 100644 --- a/src/layer/vector/SVG.VML.js +++ b/src/layer/vector/SVG.VML.js @@ -116,6 +116,14 @@ L.SVG.include(!L.Browser.vml ? {} : { _setPath: function (layer, path) { layer._path.v = path; + }, + + _bringToFront: function (layer) { + L.DomUtil.toFront(layer._container); + }, + + _bringToBack: function (layer) { + L.DomUtil.toBack(layer._container); } }); From dc7e55863447f40253393e1251a54f1def074b32 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 20 Nov 2014 13:47:26 -0800 Subject: [PATCH 1257/2207] Use capturing event to suppress click This is the technique that d3 uses for click suppression after drag. Should be more reliable. Fixes #3026. --- src/dom/DomEvent.js | 26 +++++++++++++------------- src/dom/DomUtil.js | 12 ++++++++++++ src/dom/Draggable.js | 2 ++ src/map/Map.js | 8 -------- src/map/handler/Map.BoxZoom.js | 2 ++ 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 9a59441ed74..ee809988bf0 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -7,7 +7,7 @@ var eventsKey = '_leaflet_events'; L.DomEvent = { - on: function (obj, types, fn, context) { + on: function (obj, types, fn, context, capture) { if (typeof types === 'object') { for (var type in types) { @@ -17,14 +17,14 @@ L.DomEvent = { types = L.Util.splitWords(types); for (var i = 0, len = types.length; i < len; i++) { - this._on(obj, types[i], fn, context); + this._on(obj, types[i], fn, context, capture); } } return this; }, - off: function (obj, types, fn, context) { + off: function (obj, types, fn, context, capture) { if (typeof types === 'object') { for (var type in types) { @@ -34,14 +34,14 @@ L.DomEvent = { types = L.Util.splitWords(types); for (var i = 0, len = types.length; i < len; i++) { - this._off(obj, types[i], fn, context); + this._off(obj, types[i], fn, context, capture); } } return this; }, - _on: function (obj, type, fn, context) { + _on: function (obj, type, fn, context, capture) { var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''); if (obj[eventsKey] && obj[eventsKey][id]) { return this; } @@ -61,8 +61,8 @@ L.DomEvent = { } else if ('addEventListener' in obj) { if (type === 'mousewheel') { - obj.addEventListener('DOMMouseScroll', handler, false); - obj.addEventListener(type, handler, false); + obj.addEventListener('DOMMouseScroll', handler, capture); + obj.addEventListener(type, handler, capture); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { handler = function (e) { @@ -70,7 +70,7 @@ L.DomEvent = { if (!L.DomEvent._checkMouse(obj, e)) { return; } return originalHandler(e); }; - obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); + obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, capture); } else { if (type === 'click' && L.Browser.android) { @@ -78,7 +78,7 @@ L.DomEvent = { return L.DomEvent._filterClick(e, originalHandler); }; } - obj.addEventListener(type, handler, false); + obj.addEventListener(type, handler, capture); } } else if ('attachEvent' in obj) { @@ -91,7 +91,7 @@ L.DomEvent = { return this; }, - _off: function (obj, type, fn, context) { + _off: function (obj, type, fn, context, capture) { var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''), handler = obj[eventsKey] && obj[eventsKey][id]; @@ -107,13 +107,13 @@ L.DomEvent = { } else if ('removeEventListener' in obj) { if (type === 'mousewheel') { - obj.removeEventListener('DOMMouseScroll', handler, false); - obj.removeEventListener(type, handler, false); + obj.removeEventListener('DOMMouseScroll', handler, capture); + obj.removeEventListener(type, handler, capture); } else { obj.removeEventListener( type === 'mouseenter' ? 'mouseover' : - type === 'mouseleave' ? 'mouseout' : type, handler, false); + type === 'mouseleave' ? 'mouseout' : type, handler, capture); } } else if ('detachEvent' in obj) { diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index c7d7a01f114..97628cd478d 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -231,4 +231,16 @@ L.DomUtil = { delete this._outlineStyle; L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this); }; + + // Suppress the next click, but only if it's immediate. + function suppressClick (e) { + L.DomEvent.stop(e); + L.DomEvent.off(window, 'click', suppressClick, null, true); + } + L.DomUtil.suppressClick = function () { + L.DomEvent.on(window, 'click', suppressClick, null, true); + setTimeout(function() { + L.DomEvent.off(window, 'click', suppressClick, null, true); + }, 0); + }; })(); diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 8283ac592e2..0435c8e8413 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -137,6 +137,8 @@ L.Draggable = L.Evented.extend({ this.fire('dragend', { distance: this._newPos.distanceTo(this._startPos) }); + + L.DomUtil.suppressClick(); } this._moving = false; diff --git a/src/map/Map.js b/src/map/Map.js index 0275ecc4871..7df81547c1f 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -593,9 +593,6 @@ L.Map = L.Evented.extend({ L.DomEvent.preventDefault(e); } - // prevents firing click after you just dragged an object - if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } - var data = { originalEvent: e }; @@ -611,11 +608,6 @@ L.Map = L.Evented.extend({ target.fire(type, data, true); }, - _draggableMoved: function (obj) { - obj = obj.options.draggable ? obj : this; - return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); - }, - _clearHandlers: function () { for (var i = 0, len = this._handlers.length; i < len; i++) { this._handlers[i].disable(); diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js index fcca466c091..78b1f939e17 100644 --- a/src/map/handler/Map.BoxZoom.js +++ b/src/map/handler/Map.BoxZoom.js @@ -96,6 +96,8 @@ L.Map.BoxZoom = L.Handler.extend({ this._map .fitBounds(bounds) .fire('boxzoomend', {boxZoomBounds: bounds}); + + L.DomUtil.suppressClick(); }, _onKeyDown: function (e) { From ff10d0029766e8b5f9a8b7b911a29c637c9c41b8 Mon Sep 17 00:00:00 2001 From: kerryarts Date: Fri, 21 Nov 2014 17:11:10 +1300 Subject: [PATCH 1258/2207] Check for null before setting the zindex, and instead keep it null initially. This way calls to setZIndex() wont fail if passed null. --- src/layer/tile/GridLayer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 041b6ab15a7..6203929efd3 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -15,7 +15,7 @@ L.GridLayer = L.Layer.extend({ updateInterval: 200, attribution: null, - zIndex: 'auto', + zIndex: null, bounds: null, minZoom: 0 @@ -124,7 +124,7 @@ L.GridLayer = L.Layer.extend({ }, _updateZIndex: function () { - if (this._container && this.options.zIndex !== undefined) { + if (this._container && this.options.zIndex !== undefined && this.options.zIndex !== null) { this._container.style.zIndex = this.options.zIndex; } }, From 703f9a47d95e7144a0e8de42e18e56e8c4d7fde7 Mon Sep 17 00:00:00 2001 From: CloudNiner Date: Fri, 21 Nov 2014 13:49:10 -0500 Subject: [PATCH 1259/2207] Closes #2318: getMaxZoom returns prev layer on baselayerchange Remove all old layers before adding new ones to avoid the old properties being returned in the baselayerchange handler. --- src/control/Control.Layers.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index f5234a007cc..cafe7146236 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -202,6 +202,8 @@ L.Control.Layers = L.Control.extend({ _onInputClick: function () { var inputs = this._form.getElementsByTagName('input'), input, layer, hasLayer; + var addedLayers = [], + removedLayers = []; this._handlingClick = true; @@ -211,13 +213,21 @@ L.Control.Layers = L.Control.extend({ hasLayer = this._map.hasLayer(layer); if (input.checked && !hasLayer) { - this._map.addLayer(layer); + addedLayers.push(layer); } else if (!input.checked && hasLayer) { - this._map.removeLayer(layer); + removedLayers.push(layer); } } + // Bugfix issue 2318: Should remove all old layers before readding new ones + for (i = 0; i < removedLayers.length; i++) { + this._map.removeLayer(removedLayers[i]); + } + for (i = 0; i < addedLayers.length; i++) { + this._map.addLayer(addedLayers[i]); + } + this._handlingClick = false; this._refocusOnMap(); From c97c48325afee8973311f9a7d54f4392da43d922 Mon Sep 17 00:00:00 2001 From: kdeloach Date: Fri, 21 Nov 2014 14:36:17 -0500 Subject: [PATCH 1260/2207] Remove global variable that disables dragging for all maps during zoom Starting a zoom animation will disable dragging for all maps on the page. Only the map that is being zoomed should have dragging disabled. This fix removes a global static variable which is redundant since the map pane already has a css class assigned to it for the duration of the zoom animation. Fixes #2539 --- src/dom/Draggable.js | 2 +- src/map/anim/Map.ZoomAnimation.js | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index c743c11cb98..2a6e9ff7388 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -49,7 +49,7 @@ L.Draggable = L.Evented.extend({ L.DomEvent.stopPropagation(e); - if (L.Draggable._disabled) { return; } + if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } L.DomUtil.disableImageDrag(); L.DomUtil.disableTextSelection(); diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index eeaeeaad001..085b26632c5 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -89,11 +89,6 @@ L.Map.include(!zoomAnimated ? {} : { this._animateToCenter = center; this._animateToZoom = zoom; - // disable any dragging during animation - if (L.Draggable) { - L.Draggable._disabled = true; - } - L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); } @@ -113,9 +108,5 @@ L.Map.include(!zoomAnimated ? {} : { L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); this._resetView(this._animateToCenter, this._animateToZoom, true, true); - - if (L.Draggable) { - L.Draggable._disabled = false; - } } }); From eecbe1da479ce815331f5f11da832613c17f5736 Mon Sep 17 00:00:00 2001 From: kdeloach Date: Fri, 21 Nov 2014 16:22:40 -0500 Subject: [PATCH 1261/2207] Change anchor hrefs from #map to #map-class This corrects out of date link references to the Map section. --- reference.html | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/reference.html b/reference.html index ecb64af2e5d..15620fc4be4 100644 --- a/reference.html +++ b/reference.html @@ -1476,7 +1476,7 @@

      Methods

      addTo( -
      <Map> map ) + <Map> map ) this @@ -1731,7 +1731,7 @@

      Methods

      addTo( - <Map> map ) + <Map> map ) this @@ -1739,7 +1739,7 @@

      Methods

      openOn( - <Map> map ) + <Map> map ) this @@ -1992,7 +1992,7 @@

      Methods

      addTo( - <Map> map ) + <Map> map ) this @@ -2278,7 +2278,7 @@

      Methods

      addTo( - <Map> map ) + <Map> map ) this @@ -2475,7 +2475,7 @@

      Methods

      addTo( - <Map> map ) + <Map> map ) this @@ -3082,7 +3082,7 @@

      Methods

      addTo( - <Map> map ) + <Map> map ) this @@ -4209,7 +4209,7 @@

      Methods

      addTo( - <Map> map ) + <Map> map ) this @@ -4217,7 +4217,7 @@

      Methods

      removeFrom( - <Map> map ) + <Map> map ) this @@ -4507,7 +4507,7 @@

      Layer Config

      Events

      -

      You can subscribe to the following events on the Map object using these methods.

      +

      You can subscribe to the following events on the Map object using these methods.

      @@ -6009,7 +6009,7 @@

      Methods

      @@ -6017,7 +6017,7 @@

      Methods

      @@ -6090,7 +6090,7 @@

      Methods

      @@ -6098,7 +6098,7 @@

      Methods

      From 86a3e0cc8c9e8c29826d4291f041f91977370366 Mon Sep 17 00:00:00 2001 From: Kenny Shepard Date: Fri, 21 Nov 2014 17:54:46 -0500 Subject: [PATCH 1262/2207] Initialize _sizeChanged to prevent async issues When asynchronously initializing a map, the series of events can create a scenario where _size is incorrectly initialized, and therefore calls to getSize will not cause a new value to be generated. This fix sets _sizeChanged to true upon map initialization, which allows the following first call to getSize to work properly. Closes #3031 --- src/map/Map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/map/Map.js b/src/map/Map.js index 9871eb985ed..2165c39af12 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -44,6 +44,7 @@ L.Map = L.Evented.extend({ this._handlers = []; this._layers = {}; this._zoomBoundLayers = {}; + this._sizeChanged = true; this.callInitHooks(); From 08d828f519648789b77da77105186ae87fb27ffb Mon Sep 17 00:00:00 2001 From: Rick Mohr Date: Tue, 25 Nov 2014 15:32:53 -0500 Subject: [PATCH 1263/2207] Improve inertial scrolling [This post](http://stackoverflow.com/a/3628949/362702) claims that in Apple's kinetic scrolling, "The velocity of the touch is measured at the exact moment that the finger is lifted." I tried both this "final velocity" approach and the "max velocity" approach proposed in #2987. Both allow a stronger "fling" than the current "average velocity" approach, but "max velocity" can feel wrong if you slow down at the end of your swipe. But because the "final velocity" approach uses just one data point it can be unstable, occasionally giving a too-large velocity from a small time delta. Best is to stabilize that by averaging a few data points, so we're back to "average velocity" but using a shorter time period. Averaging over 50 ms instead of 100 ms gives good results, usually 4 data points on both my iPhone 4s and Chrome on my Windows laptop. Another reason the current code has a weak fling is that the velocity was being calculated incorrectly. Because `delay` was added to the time delta, time was computed from n+1 points but distance from n points. I also changed the default value of `inertiaThreshold` (intended to prevent unwanted additional movement if you stop dragging and then lift your finger) to `Infinity`, for two reasons: 1) A fling gesture often failed on my iPhone because the measured `delay` was higher than `inertiaThreshold` (current default 32), sometimes by hundreds of ms. 2) With the updated velocity code I don't see unwanted additional movement when I stop dragging and then lift my finger. There is a remaining issue (with both the original and updated code). If you fling the map and try to fling it again before it stops moving, no drag events are generated for the second fling so it has no effect. I don't see this problem with e.g. Google or Apple maps. Entered as #3062. Fixes #2987 --- src/map/handler/Map.Drag.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 1df7d87287a..1262bfec443 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -8,7 +8,7 @@ L.Map.mergeOptions({ inertia: !L.Browser.android23, inertiaDeceleration: 3400, // px/s^2 inertiaMaxSpeed: Infinity, // px/s - inertiaThreshold: L.Browser.touch ? 32 : 18, // ms + inertiaThreshold: Infinity, easeLinearity: 0.2, // TODO refactor, move to CRS @@ -72,7 +72,7 @@ L.Map.Drag = L.Handler.extend({ this._positions.push(pos); this._times.push(time); - if (time - this._times[0] > 100) { + if (time - this._times[0] > 50) { this._positions.shift(); this._times.shift(); } @@ -110,7 +110,7 @@ L.Map.Drag = L.Handler.extend({ options = map.options, delay = +new Date() - this._lastTime, - noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; + noInertia = !options.inertia || delay > options.inertiaThreshold || this._times.length < 2; map.fire('dragend', e); @@ -120,7 +120,7 @@ L.Map.Drag = L.Handler.extend({ } else { var direction = this._lastPos.subtract(this._positions[0]), - duration = (this._lastTime + delay - this._times[0]) / 1000, + duration = (this._lastTime - this._times[0]) / 1000, ease = options.easeLinearity, speedVector = direction.multiplyBy(ease / duration), From c5ebd534b22e991183ca565585851193a685bd2a Mon Sep 17 00:00:00 2001 From: Sergey Kruk Date: Mon, 1 Dec 2014 16:02:43 +0300 Subject: [PATCH 1264/2207] Factory L.latLng to accept altitude as third parameter or an object's 'alt' property --- spec/suites/geo/LatLngSpec.js | 9 +++++++++ src/geo/LatLng.js | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js index 1c050df0208..bca6c31c706 100644 --- a/spec/suites/geo/LatLngSpec.js +++ b/spec/suites/geo/LatLngSpec.js @@ -103,6 +103,15 @@ describe('LatLng', function () { it('returns null if lng not specified', function () { expect(L.latLng(50)).to.be(null); }); + + it('accepts altitude as third parameter', function () { + expect(L.latLng(50, 30, 100)).to.eql(new L.LatLng(50, 30, 100)); + }); + + it('accepts an object with alt', function () { + expect(L.latLng({lat: 50, lng: 30, alt:100})).to.eql(new L.LatLng(50, 30, 100)); + expect(L.latLng({lat: 50, lon: 30, alt:100})).to.eql(new L.LatLng(50, 30, 100)); + }); }); }); diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index f56de66801f..0e4515978d2 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -56,7 +56,7 @@ L.LatLng.prototype = { // constructs LatLng with different signatures // (LatLng) or ([Number, Number]) or (Number, Number) or (Object) -L.latLng = function (a, b) { +L.latLng = function (a, b, c) { if (a instanceof L.LatLng) { return a; } @@ -70,11 +70,11 @@ L.latLng = function (a, b) { return a; } if (typeof a === 'object' && 'lat' in a) { - return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); + return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt); } if (b === undefined) { return null; } - return new L.LatLng(a, b); + return new L.LatLng(a, b, c); }; From c8e5d7c61bfd03fa79620f205d37d1200e4a2108 Mon Sep 17 00:00:00 2001 From: Sergey Kruk Date: Fri, 5 Dec 2014 20:25:02 +0300 Subject: [PATCH 1265/2207] L.latLng factory not to throw error on empty array parameter --- spec/suites/geo/LatLngSpec.js | 3 +++ src/geo/LatLng.js | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js index bca6c31c706..9da63f8eaf7 100644 --- a/spec/suites/geo/LatLngSpec.js +++ b/spec/suites/geo/LatLngSpec.js @@ -80,7 +80,10 @@ describe('LatLng', function () { }); it('accepts an array of coordinates', function () { + expect(L.latLng([])).to.eql(null); + expect(L.latLng([50])).to.eql(null); expect(L.latLng([50, 30])).to.eql(new L.LatLng(50, 30)); + expect(L.latLng([50, 30, 100])).to.eql(new L.LatLng(50, 30, 100)); }); it('passes null or undefined as is', function () { diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index 0e4515978d2..80af58e5177 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -61,10 +61,10 @@ L.latLng = function (a, b, c) { return a; } if (L.Util.isArray(a) && typeof a[0] !== 'object') { - if (a.length === 3) { + if (a.length >= 2) { return new L.LatLng(a[0], a[1], a[2]); } - return new L.LatLng(a[0], a[1]); + return null; } if (a === undefined || a === null) { return a; From 65cc3c813b5d78e6c996ef8b28585f8334e3099b Mon Sep 17 00:00:00 2001 From: Sergey Kruk Date: Sat, 6 Dec 2014 15:32:22 +0300 Subject: [PATCH 1266/2207] Refactoring: L.latLng factory to call constructor with explicit arguments number --- src/geo/LatLng.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index 80af58e5177..27ec3195295 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -61,9 +61,12 @@ L.latLng = function (a, b, c) { return a; } if (L.Util.isArray(a) && typeof a[0] !== 'object') { - if (a.length >= 2) { + if (a.length === 3) { return new L.LatLng(a[0], a[1], a[2]); } + if (a.length === 2) { + return new L.LatLng(a[0], a[1]); + } return null; } if (a === undefined || a === null) { From ccc2826961982898b6ac49e15044d656e9b30d13 Mon Sep 17 00:00:00 2001 From: Jonathan Skeate Date: Mon, 8 Dec 2014 14:02:54 -0500 Subject: [PATCH 1267/2207] Update plugins.md - Add Leaflet.timeline --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 6fe3940a482..b9e91767a17 100644 --- a/plugins.md +++ b/plugins.md @@ -1383,6 +1383,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mor Yariv + + +
      onAdd( - <Map> map ) + <Map> map ) -
      onRemove( - <Map> map ) + <Map> map ) -
      onAdd( - <Map> map ) + <Map> map ) HTMLElement
      onRemove( - <Map> map ) + <Map> map ) -
      + Leaflet.timeline + + Display arbitrary GeoJSON on a map with a timeline slider and play button. + + Jonathan Skeate +
      From 44a56b3a79a99bcfcb6cbb920260d414b94a435c Mon Sep 17 00:00:00 2001 From: Miroslav Raska Date: Mon, 8 Dec 2014 21:30:44 +0100 Subject: [PATCH 1268/2207] Properly unsubscribe Layer events I've just bumped into this while browsing the source code. It's not tested in any way and I didn't look for similar issues in other files neither. But I hope it helps anyway. --- src/layer/Layer.Popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 2933a759adc..5b27677234f 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -30,7 +30,7 @@ L.Layer.include({ unbindPopup: function () { if (this._popup) { - this.on({ + this.off({ click: this._openPopup, remove: this.closePopup, move: this._movePopup From cf94c20815302191c5c4d44ba5fff8f50d8da42e Mon Sep 17 00:00:00 2001 From: James Seppi Date: Mon, 8 Dec 2014 14:39:04 -0600 Subject: [PATCH 1269/2207] minor typo fix --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 15620fc4be4..79556ccbf8e 100644 --- a/reference.html +++ b/reference.html @@ -2588,7 +2588,7 @@

      Polyline

      A class for drawing polyline overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      Usage example

      -
      // create a red polyline from an arrays of LatLng points
      +
      // create a red polyline from an array of LatLng points
       var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
       
       // zoom the map to the polyline
      
      From 79962a73ee89e87c81e664385a5da4bcc3302bc0 Mon Sep 17 00:00:00 2001
      From: Jack Reed 
      Date: Mon, 8 Dec 2014 14:32:03 -0800
      Subject: [PATCH 1270/2207] adds Leaflet-IIIF plugin to plugin page
      
      ---
       plugins.md | 9 +++++++++
       1 file changed, 9 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index b9e91767a17..6a3b305b34b 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -460,6 +460,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
       			Per Liedman
       		
       	
      +	
      +		
      +			Leaflet-IIIF
      +		
      +			A IIIF (International Image Interoperability Framework) viewer for Leaflet. See the demo.
      +		
      +			Jack Reed
      +		
      +	
       
       
       
      
      From 2e04b302d0aa53984a7876fd22aaf45ec07c23dc Mon Sep 17 00:00:00 2001
      From: Vladimir Agafonkin 
      Date: Wed, 17 Dec 2014 21:09:10 +0200
      Subject: [PATCH 1271/2207] try out the new fast Travis build thingy
      
      ---
       .travis.yml | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/.travis.yml b/.travis.yml
      index 4760422860c..dbbdb7ace69 100644
      --- a/.travis.yml
      +++ b/.travis.yml
      @@ -1,4 +1,5 @@
       ---
      +sudo: false
       language: node_js
       node_js:
       - "0.10"
      
      From 1b8f4aa88d40ca4877380230cab7abdf86e56d61 Mon Sep 17 00:00:00 2001
      From: Mark Szymanski 
      Date: Wed, 17 Dec 2014 20:03:58 -0600
      Subject: [PATCH 1272/2207] Revisions to CONTRIBUTING.md
      
      ---
       CONTRIBUTING.md | 24 ++++++++++++------------
       1 file changed, 12 insertions(+), 12 deletions(-)
      
      diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
      index 1e4ec7f69ca..424f9f2e47b 100644
      --- a/CONTRIBUTING.md
      +++ b/CONTRIBUTING.md
      @@ -9,13 +9,13 @@ Contributing to Leaflet
       ## Getting Involved
       
       Third-party patches are absolutely essential on our quest to create the best mapping library that will ever exist.
      -However, they're not the only way to get involved with the development of Leaflet.
      -You can help the project tremendously by discovering and [reporting bugs](#reporting-bugs),
      -[improving documentation](#improving-documentation),
      +However, they're not the only way to get involved with Leaflet development.
      +You can help the project tremendously by discovering and [reporting bugs](#reporting-bugs);
      +[improving documentation](#improving-documentation);
       helping others on the [Leaflet forum](https://groups.google.com/forum/#!forum/leaflet-js)
      -and [GitHub issues](https://github.com/Leaflet/Leaflet/issues),
      -showing your support for your favorite feature suggestions on [Leaflet UserVoice page](http://leaflet.uservoice.com),
      -tweeting to [@LeafletJS](http://twitter.com/LeafletJS)
      +and [GitHub issues](https://github.com/Leaflet/Leaflet/issues);
      +showing your support for your favorite feature suggestions on [Leaflet UserVoice page](http://leaflet.uservoice.com);
      +tweeting to [@LeafletJS](http://twitter.com/LeafletJS);
       and spreading the word about Leaflet among your colleagues and friends.
       
       ## Reporting Bugs
      @@ -26,7 +26,7 @@ first make sure that your issue is caused by Leaflet, not your application code
       Second, search the already reported issues for similar cases,
       and if it's already reported, just add any additional details in the comments.
       
      -After you made sure that you've found a new Leaflet bug,
      +After you've made sure that you've found a new Leaflet bug,
       here are some tips for creating a helpful report that will make fixing it much easier and quicker:
       
        * Write a **descriptive, specific title**. Bad: *Problem with polylines*. Good: *Doing X in IE9 causes Z*.
      @@ -48,10 +48,10 @@ While we happily accept patches, we're also committed to keeping Leaflet simple,
       So bugfixes, performance optimizations and small improvements that don't add a lot of code
       are much more likely to get accepted quickly.
       
      -Before sending a pull request with a new feature, first check if it's been discussed before already
      +Before sending a pull request with a new feature, check if it's been discussed before already
       (either on [GitHub issues](https://github.com/Leaflet/Leaflet/issues)
       or [Leaflet UserVoice](http://leaflet.uservoice.com/)),
      -and then ask yourself two questions:
      +and ask yourself two questions:
       
        1. Are you sure that this new feature is important enough to justify its presence in the Leaflet core?
           Or will it look better as a plugin in a separate repository?
      @@ -144,12 +144,12 @@ If you need to make edits in a local repository to see how it looks in the proce
       Now any file changes will be updated when you reload pages automatically.
       After committing the changes, just send a pull request.
       
      -If you need to update documentation according to a new feature that only appeared in the master version (not stable one),
      -you need to make changes to `gh-pages-master` branch instead of `gh-pages`.
      +If you need to update documentation according to a new feature that only appeared in the master version (not the stable one),
      +you need to make changes to the `gh-pages-master` branch instead of `gh-pages`.
       It will get merged into the latter when released as stable.
       
       ## Thank You
       
      -Not only are we grateful for any contributions, — helping Leaflet and its community actually makes you AWESOME.
      +Not only does your contribution to Leaflet and its community earn our gratitude, but it also makes you AWESOME.
       Join [this approved list of awesome people](https://github.com/Leaflet/Leaflet/graphs/contributors)
       and help us push the limits of what's possible with online maps!
      
      From 5066ecf043888beb0bfdb04e56b8ef6d32b254cb Mon Sep 17 00:00:00 2001
      From: cebence 
      Date: Thu, 18 Dec 2014 13:20:09 +0100
      Subject: [PATCH 1273/2207] Hide single base layers in the Layers control.
      
      ---
       src/control/Control.Layers.js | 12 ++++++++++--
       1 file changed, 10 insertions(+), 2 deletions(-)
      
      diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js
      index cafe7146236..0e1f58997ba 100644
      --- a/src/control/Control.Layers.js
      +++ b/src/control/Control.Layers.js
      @@ -6,7 +6,8 @@ L.Control.Layers = L.Control.extend({
       	options: {
       		collapsed: true,
       		position: 'topright',
      -		autoZIndex: true
      +		autoZIndex: true,
      +		hideSingleBase: true
       	},
       
       	initialize: function (baseLayers, overlays, options) {
      @@ -127,13 +128,20 @@ L.Control.Layers = L.Control.extend({
       		L.DomUtil.empty(this._baseLayersList);
       		L.DomUtil.empty(this._overlaysList);
       
      -		var baseLayersPresent, overlaysPresent, i, obj;
      +		var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0;
       
       		for (i in this._layers) {
       			obj = this._layers[i];
       			this._addItem(obj);
       			overlaysPresent = overlaysPresent || obj.overlay;
       			baseLayersPresent = baseLayersPresent || !obj.overlay;
      +			baseLayersCount += !obj.overlay ? 1 : 0;
      +		}
      +
      +		// Hide base layers section if there's only one layer.
      +		if (this.options.hideSingleBase) {
      +			baseLayersPresent = baseLayersPresent && baseLayersCount > 1;
      +			this._baseLayersList.style.display = baseLayersPresent ? '' : 'none';
       		}
       
       		this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
      
      From bea51fdf4f4a4e6bda73a73aefe4d64f2853172a Mon Sep 17 00:00:00 2001
      From: cebence 
      Date: Thu, 18 Dec 2014 14:28:51 +0100
      Subject: [PATCH 1274/2207] Disabled by default so it doesn't break existing
       apps.
      
      ---
       src/control/Control.Layers.js | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js
      index 0e1f58997ba..5366dc875b3 100644
      --- a/src/control/Control.Layers.js
      +++ b/src/control/Control.Layers.js
      @@ -7,7 +7,7 @@ L.Control.Layers = L.Control.extend({
       		collapsed: true,
       		position: 'topright',
       		autoZIndex: true,
      -		hideSingleBase: true
      +		hideSingleBase: false
       	},
       
       	initialize: function (baseLayers, overlays, options) {
      
      From 881478382461a2b78e144ca1e0839987dc0b32a4 Mon Sep 17 00:00:00 2001
      From: Kirill Zhuravlev 
      Date: Fri, 19 Dec 2014 15:36:34 +0100
      Subject: [PATCH 1275/2207] Added Leaflet.D3SvgOverlay plugin to the list
      
      ---
       plugins.md | 9 +++++++++
       1 file changed, 9 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index 6a3b305b34b..e30d96184df 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -469,6 +469,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
       			Jack Reed
       		
       	
      +	
      +		
      +			Leaflet.D3SvgOverlay
      +		
      +			SVG overlay class for using with D3 library. Supports zoom animation and scaling without need to redraw the layer.
      +		
      +			Kirill Zhuravlev
      +		
      +	
       
       
       
      
      From c6c30e9e919942781cf9ffad70f7848d298046d5 Mon Sep 17 00:00:00 2001
      From: Brendan Ward 
      Date: Wed, 24 Dec 2014 15:02:22 -0800
      Subject: [PATCH 1276/2207] Added Leaflet.ZoomBox and Leaflet.Geonames
      
      ---
       plugins.md | 22 ++++++++++++++++++++++
       1 file changed, 22 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index e30d96184df..1c95fc0ead9 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -737,6 +737,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
       			The OpenCage team
       		
       	
      +	
      +		
      +			Leaflet.Geonames
      +		
      +		
      +			A lightweight geocoding control powered by GeoNames.  Demo
      +		
      +		
      +			Brendan Ward
      +		
      +	
       
       
       
      @@ -1410,6 +1421,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
       			Jonathan Skeate
       		
       	
      +	
      +		
      +			Leaflet.ZoomBox
      +		
      +		
      +			A lightweight zoom box control: draw a box around the area you want to zoom to. Demo
      +		
      +		
      +			Brendan Ward
      +		
      +	
       
       
       
      
      From 5dc36142f7db48808588579685b5a7cabca1e977 Mon Sep 17 00:00:00 2001
      From: sam-at-github 
      Date: Sun, 28 Dec 2014 12:39:18 +1100
      Subject: [PATCH 1277/2207] Update CONTRIBUTING.md
      
      Add link to Jakejs.com and slightly more verbose description of build set up. Useful to Node newbs like myself.
      ---
       CONTRIBUTING.md | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
      index 424f9f2e47b..49c80cf6df6 100644
      --- a/CONTRIBUTING.md
      +++ b/CONTRIBUTING.md
      @@ -62,8 +62,8 @@ please consider submitting another pull request with the corresponding [document
       
       ### Setting up the Build System
       
      -To set up the Leaflet build system, install [Node](http://nodejs.org/),
      -then run the following commands in the project root:
      +The Leaflet build system uses [Node](http://nodejs.org/), and the [Jake](http://jakejs.com/) Javascript build tool.
      +To set up the Leaflet build system, install Node then run the following commands in the project root to install Jake:
       
       ```
       npm install -g jake
      
      From ff470d586150fbc6e51e1b99662d80e6864985f0 Mon Sep 17 00:00:00 2001
      From: Patrick Arlt 
      Date: Mon, 29 Dec 2014 12:14:33 -0800
      Subject: [PATCH 1278/2207] popup improvements for FeatureGroup
      
      ---
       debug/map/popup.html             | 101 +++++++++++++++++++++++++++++++
       src/layer/FeatureGroup.js        |  43 +++++++------
       src/layer/Layer.Popup.js         |  15 ++++-
       src/layer/Popup.js               |   7 ++-
       src/layer/marker/Marker.Popup.js |  13 +---
       5 files changed, 147 insertions(+), 32 deletions(-)
       create mode 100644 debug/map/popup.html
      
      diff --git a/debug/map/popup.html b/debug/map/popup.html
      new file mode 100644
      index 00000000000..38511c2f6f0
      --- /dev/null
      +++ b/debug/map/popup.html
      @@ -0,0 +1,101 @@
      +
      +
      +
      +  Leaflet debug page
      +
      +  
      +
      +  
      +
      +  
      +
      +  
      +  
      +
      +
      +
      +  
      + + + + + + + + + + + + diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index 2fe9e2c934e..fcc0d2d2cb3 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -14,10 +14,6 @@ L.FeatureGroup = L.LayerGroup.extend({ L.LayerGroup.prototype.addLayer.call(this, layer); - if (this._popupContent && layer.bindPopup) { - layer.bindPopup(this._popupContent, this._popupOptions); - } - return this.fire('layeradd', {layer: layer}); }, @@ -33,24 +29,37 @@ L.FeatureGroup = L.LayerGroup.extend({ L.LayerGroup.prototype.removeLayer.call(this, layer); - if (this._popupContent) { - this.invoke('unbindPopup'); - } - return this.fire('layerremove', {layer: layer}); }, - bindPopup: function (content, options) { - this._popupContent = content; - this._popupOptions = options; - return this.invoke('bindPopup', content, options); + openPopup: function (layerid) { + if(layerid){ + layer = this.getLayer(layerid); + } else { + // open popup on the first layer + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + } + + if (this._popup && this._map) { + this._popup.options.offset = this._popupAnchor(layer); + this._popup._source = layer; + this._popup.update(); + this._map.openPopup(this._popup, layer._latlng || layer.getCenter()); + } + + return this; }, - openPopup: function (latlng) { - // open popup on the first layer - for (var id in this._layers) { - this._layers[id].openPopup(latlng); - break; + togglePopup: function(layerid){ + if (this._popup) { + if (this._popup._map) { + this.closePopup(); + } else { + this.openPopup(layerid); + } } return this; }, diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 5b27677234f..2f663e43bf2 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -43,7 +43,8 @@ L.Layer.include({ openPopup: function (latlng) { if (this._popup && this._map) { - this._map.openPopup(this._popup, latlng || this._latlng || this.getCenter()); + this._popup.options.offset = this._popupAnchor(this); + this._map.openPopup(this._popup, latlng || this._latlng || this.getCenter()); } return this; }, @@ -78,10 +79,20 @@ L.Layer.include({ }, _openPopup: function (e) { + this._popup.options.offset = this._popupAnchor(e.layer); + if(typeof this._popup._content === 'function') { + this._popup._source = e.layer; + this._popup.update(); + } this._map.openPopup(this._popup, e.latlng); }, + _popupAnchor: function(layer){ + var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0,0]; + return L.point(anchor).add(L.Popup.prototype.options.offset); + }, + _movePopup: function (e) { this._popup.setLatLng(e.latlng); } -}); +}); \ No newline at end of file diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 3a702971f24..19d18cd1fc0 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -132,7 +132,7 @@ L.Popup = L.Layer.extend({ } return events; }, - + isOpen: function () { return !!this._map && this._map.hasLayer(this); }, @@ -173,8 +173,9 @@ L.Popup = L.Layer.extend({ if (!this._content) { return; } var node = this._contentNode; - - if (typeof this._content === 'string') { + if (typeof this._content === 'function') { + node.innerHTML = this._content(this._source || this); + } else if (typeof this._content === 'string') { node.innerHTML = this._content; } else { while (node.hasChildNodes()) { diff --git a/src/layer/marker/Marker.Popup.js b/src/layer/marker/Marker.Popup.js index f19fb5f4b60..fcd52516a39 100644 --- a/src/layer/marker/Marker.Popup.js +++ b/src/layer/marker/Marker.Popup.js @@ -3,14 +3,7 @@ */ L.Marker.include({ - bindPopup: function (content, options) { - var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]) - .add(L.Popup.prototype.options.offset); - - options = L.extend({offset: anchor}, options); - - return L.Layer.prototype.bindPopup.call(this, content, options); - }, - - _openPopup: L.Layer.prototype.togglePopup + _getPopupAnchor: function(){ + return this.options.icon.options.popupAnchor || [0, 0]; + } }); From 1c3b1889ec92f38177c5a1339e5b9f0cf935bb87 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 29 Dec 2014 12:58:23 -0800 Subject: [PATCH 1279/2207] debug for regular layers --- debug/map/popup.html | 24 +++++------------------- debug/vector/rectangle.html | 2 ++ src/layer/Layer.Popup.js | 4 ++-- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index 38511c2f6f0..5a46b8a5461 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -21,7 +21,7 @@ - + diff --git a/debug/vector/rectangle.html b/debug/vector/rectangle.html index d1874a1302a..d5f7019b871 100644 --- a/debug/vector/rectangle.html +++ b/debug/vector/rectangle.html @@ -36,6 +36,8 @@ alert("you clicked a rectangle.") }); + rectangle.bindPopup('I\'m a rectangle!'); + var map = new L.Map('map', { center: bounds.getCenter(), zoom: 7, diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 2f663e43bf2..db7a0de5141 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -79,7 +79,7 @@ L.Layer.include({ }, _openPopup: function (e) { - this._popup.options.offset = this._popupAnchor(e.layer); + this._popup.options.offset = this._popupAnchor(e.layer || e.target); if(typeof this._popup._content === 'function') { this._popup._source = e.layer; this._popup.update(); @@ -88,7 +88,7 @@ L.Layer.include({ }, _popupAnchor: function(layer){ - var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0,0]; + var anchor = (layer._getPopupAnchor) ? layer._getPopupAnchor() : [0,0]; return L.point(anchor).add(L.Popup.prototype.options.offset); }, From 940452ace06ff60193daf0a1c6e831c0c84025b5 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 29 Dec 2014 13:22:58 -0800 Subject: [PATCH 1280/2207] fix lint --- debug/map/popup.html | 32 +++++++++++++++++--------------- src/layer/FeatureGroup.js | 2 ++ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index 5a46b8a5461..a177fefaa83 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -36,23 +36,25 @@ var features = new L.FeatureGroup(); - var marker = L.marker(getRandomLatLng(map)).addTo(features); - - var line = L.polyline([ - getRandomLatLng(map), - getRandomLatLng(map), - getRandomLatLng(map) - ]).addTo(features); - - var poly = L.polygon([ - getRandomLatLng(map), - getRandomLatLng(map), - getRandomLatLng(map), - getRandomLatLng(map) - ]).addTo(features); + for (var i = 0; i < 10000; i++) { + var marker = L.marker(getRandomLatLng(map)).addTo(features); + } + + // var line = L.polyline([ + // getRandomLatLng(map), + // getRandomLatLng(map), + // getRandomLatLng(map) + // ]).addTo(features); + + // var poly = L.polygon([ + // getRandomLatLng(map), + // getRandomLatLng(map), + // getRandomLatLng(map), + // getRandomLatLng(map) + // ]).addTo(features); features.bindPopup(function(layer){ - return "Layer ID is " + L.stamp(layer); + return layer._leaflet_id + 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec odio. Quisque volutpat mattis eros. Nullam malesuada erat ut turpis. Suspendisse urna nibh, viverra non, semper suscipit, posuere a, pede.

      Donec nec justo eget felis facilisis fermentum. Aliquam porttitor mauris sit amet orci. Aenean dignissim pellentesque.'; }).addTo(map); L.DomUtil.get('change').onclick = function(){ diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index fcc0d2d2cb3..cd3f7cfaa75 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -33,6 +33,8 @@ L.FeatureGroup = L.LayerGroup.extend({ }, openPopup: function (layerid) { + var layer; + if(layerid){ layer = this.getLayer(layerid); } else { From 2d709141a8779f249eb98e6e10c2e8ad56f63762 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 29 Dec 2014 13:50:23 -0800 Subject: [PATCH 1281/2207] fix tests, misc cleanup --- debug/map/popup.html | 32 +++++++++++++++----------------- spec/suites/layer/PopupSpec.js | 4 ++-- src/layer/Layer.Popup.js | 12 ++++++++---- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index a177fefaa83..25cd792f224 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -36,25 +36,23 @@ var features = new L.FeatureGroup(); - for (var i = 0; i < 10000; i++) { - var marker = L.marker(getRandomLatLng(map)).addTo(features); - } - - // var line = L.polyline([ - // getRandomLatLng(map), - // getRandomLatLng(map), - // getRandomLatLng(map) - // ]).addTo(features); - - // var poly = L.polygon([ - // getRandomLatLng(map), - // getRandomLatLng(map), - // getRandomLatLng(map), - // getRandomLatLng(map) - // ]).addTo(features); + var marker = L.marker(getRandomLatLng(map)).addTo(features); + + var line = L.polyline([ + getRandomLatLng(map), + getRandomLatLng(map), + getRandomLatLng(map) + ]).addTo(features); + + var poly = L.polygon([ + getRandomLatLng(map), + getRandomLatLng(map), + getRandomLatLng(map), + getRandomLatLng(map) + ]).addTo(features); features.bindPopup(function(layer){ - return layer._leaflet_id + 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec odio. Quisque volutpat mattis eros. Nullam malesuada erat ut turpis. Suspendisse urna nibh, viverra non, semper suscipit, posuere a, pede.

      Donec nec justo eget felis facilisis fermentum. Aliquam porttitor mauris sit amet orci. Aenean dignissim pellentesque.'; + return 'Leaflet ID is ' + layer._leaflet_id; }).addTo(map); L.DomUtil.get('change').onclick = function(){ diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 09e8b725a80..362447549c0 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -56,9 +56,9 @@ describe('Popup', function () { happen.click(c); // toggle open popup - sinon.spy(marker, "openPopup"); + sinon.spy(marker, "_openPopup"); marker.fire('click'); - expect(marker.openPopup.calledOnce).to.be(true); + expect(marker._openPopup.calledOnce).to.be(true); expect(map.hasLayer(marker._popup)).to.be(true); marker.openPopup.restore(); diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index db7a0de5141..52e0d435ddf 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -79,12 +79,16 @@ L.Layer.include({ }, _openPopup: function (e) { - this._popup.options.offset = this._popupAnchor(e.layer || e.target); - if(typeof this._popup._content === 'function') { + if(this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === e.layer){ + this.closePopup(); + } else { + this._popup.options.offset = this._popupAnchor(e.layer || e.target); this._popup._source = e.layer; - this._popup.update(); + if(typeof this._popup._content === 'function') { + this._popup.update(); + } + this._map.openPopup(this._popup, e.latlng); } - this._map.openPopup(this._popup, e.latlng); }, _popupAnchor: function(layer){ From b7dbdade9e1ee46d42193b5da18d4c03bbc9e339 Mon Sep 17 00:00:00 2001 From: batphil Date: Fri, 2 Jan 2015 01:23:44 +0100 Subject: [PATCH 1282/2207] Happy new year :o) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index d6258ad48f4..13f6bcf2540 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2014, Vladimir Agafonkin +Copyright (c) 2010-2015, Vladimir Agafonkin Copyright (c) 2010-2011, CloudMade All rights reserved. From 95596c78a0dd6e517435e59e02b1e2abaf97e25f Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 2 Jan 2015 06:47:07 -0800 Subject: [PATCH 1283/2207] fix whitespace --- src/layer/FeatureGroup.js | 2 +- src/layer/Layer.Popup.js | 6 +++--- src/layer/marker/Marker.Popup.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index cd3f7cfaa75..38e71a7d030 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -35,7 +35,7 @@ L.FeatureGroup = L.LayerGroup.extend({ openPopup: function (layerid) { var layer; - if(layerid){ + if(layerid) { layer = this.getLayer(layerid); } else { // open popup on the first layer diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 52e0d435ddf..c5ffc86795c 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -31,9 +31,9 @@ L.Layer.include({ unbindPopup: function () { if (this._popup) { this.off({ - click: this._openPopup, - remove: this.closePopup, - move: this._movePopup + click: this._openPopup, + remove: this.closePopup, + move: this._movePopup }); this._popupHandlersAdded = false; this._popup = null; diff --git a/src/layer/marker/Marker.Popup.js b/src/layer/marker/Marker.Popup.js index fcd52516a39..89dd1fc0969 100644 --- a/src/layer/marker/Marker.Popup.js +++ b/src/layer/marker/Marker.Popup.js @@ -3,7 +3,7 @@ */ L.Marker.include({ - _getPopupAnchor: function(){ - return this.options.icon.options.popupAnchor || [0, 0]; - } + _getPopupAnchor: function(){ + return this.options.icon.options.popupAnchor || [0, 0]; + } }); From 775a8e0c3aebb692074f53f27f02399b117e1946 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 2 Jan 2015 07:34:16 -0800 Subject: [PATCH 1284/2207] refactor everything to Layer.Popup --- debug/map/popup.html | 29 +++++++++++++++++++---- src/layer/FeatureGroup.js | 34 --------------------------- src/layer/Layer.Popup.js | 49 +++++++++++++++++++++++++++++++-------- 3 files changed, 64 insertions(+), 48 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index 25cd792f224..43b14dab654 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -55,6 +55,27 @@ return 'Leaflet ID is ' + layer._leaflet_id; }).addTo(map); + var polygon = L.polygon([ + getRandomLatLng(map), + getRandomLatLng(map), + getRandomLatLng(map), + getRandomLatLng(map) + ], { + color: 'red' + }).bindPopup('I\'m a red polygon').addTo(map); + + var polyline = L.polyline([ + getRandomLatLng(map), + getRandomLatLng(map), + getRandomLatLng(map), + ], { + color: 'red' + }).bindPopup('I\'m a red polyline').addTo(map); + + var marker = L.circleMarker(getRandomLatLng(map), { + color: 'red' + }).bindPopup('I\'m a red circle').addTo(map); + L.DomUtil.get('change').onclick = function(){ features.setPopupContent('Foo'); }; @@ -64,15 +85,15 @@ }; L.DomUtil.get('openMarker').onclick = function(){ - features.openPopup(features.getLayerId(marker)); + features.openPopup(marker); }; L.DomUtil.get('openLine').onclick = function(){ - features.openPopup(features.getLayerId(line)); + features.openPopup(line); }; L.DomUtil.get('openPoly').onclick = function(){ - features.openPopup(features.getLayerId(poly)); + features.openPopup(poly); }; L.DomUtil.get('close').onclick = function(){ @@ -80,7 +101,7 @@ }; L.DomUtil.get('toggle').onclick = function(){ - features.togglePopup(features.getLayerId(marker)); + features.togglePopup(marker); }; diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index 38e71a7d030..1e10b07e64b 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -32,40 +32,6 @@ L.FeatureGroup = L.LayerGroup.extend({ return this.fire('layerremove', {layer: layer}); }, - openPopup: function (layerid) { - var layer; - - if(layerid) { - layer = this.getLayer(layerid); - } else { - // open popup on the first layer - for (var id in this._layers) { - layer = this._layers[id]; - break; - } - } - - if (this._popup && this._map) { - this._popup.options.offset = this._popupAnchor(layer); - this._popup._source = layer; - this._popup.update(); - this._map.openPopup(this._popup, layer._latlng || layer.getCenter()); - } - - return this; - }, - - togglePopup: function(layerid){ - if (this._popup) { - if (this._popup._map) { - this.closePopup(); - } else { - this.openPopup(layerid); - } - } - return this; - }, - setStyle: function (style) { return this.invoke('setStyle', style); }, diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index c5ffc86795c..777c97fb939 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -18,7 +18,7 @@ L.Layer.include({ if (!this._popupHandlersAdded) { this.on({ - click: this._openPopup, + click: this._togglePopup, remove: this.closePopup, move: this._movePopup }); @@ -31,7 +31,7 @@ L.Layer.include({ unbindPopup: function () { if (this._popup) { this.off({ - click: this._openPopup, + click: this._togglePopup, remove: this.closePopup, move: this._movePopup }); @@ -41,11 +41,39 @@ L.Layer.include({ return this; }, - openPopup: function (latlng) { + openPopup: function (target) { + var layer; + var latlng; + + // handles figuring out `layer` and `latlng` from `target` + // assumes target will be one of + // * undefined + // * Layer + // * [lat,lng] + // * LatLng + + if(!target) { + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + layer = layer || this; + latlng = layer._latlng || layer.getCenter(); + } else if(target instanceof L.Layer) { + layer = target; + latlng = layer._latlng || layer.getCenter(); + } else { + layer = this; + latlng = target + } + if (this._popup && this._map) { - this._popup.options.offset = this._popupAnchor(this); - this._map.openPopup(this._popup, latlng || this._latlng || this.getCenter()); + this._popup.options.offset = this._popupAnchor(layer); // update the popup offset based on our layer + this._popup._source = layer; // update popup source + this._popup.update(); // update the popup (will update content if popup uses a function) + this._map.openPopup(this._popup, latlng); } + return this; }, @@ -56,12 +84,12 @@ L.Layer.include({ return this; }, - togglePopup: function () { + togglePopup: function (target) { if (this._popup) { if (this._popup._map) { this.closePopup(); } else { - this.openPopup(); + this.openPopup(target); } } return this; @@ -78,12 +106,13 @@ L.Layer.include({ return this._popup; }, - _openPopup: function (e) { + _togglePopup: function (e) { if(this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === e.layer){ this.closePopup(); } else { - this._popup.options.offset = this._popupAnchor(e.layer || e.target); - this._popup._source = e.layer; + var popupTarget = e.layer || e.target; + this._popup.options.offset = this._popupAnchor(popupTarget); + this._popup._source = popupTarget; if(typeof this._popup._content === 'function') { this._popup.update(); } From 8285e9dfb528f916b469bb873b46ec9cd3ee6e6a Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 2 Jan 2015 07:35:58 -0800 Subject: [PATCH 1285/2207] whitespace --- src/layer/Layer.Popup.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 777c97fb939..62e2869dbfd 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -52,14 +52,14 @@ L.Layer.include({ // * [lat,lng] // * LatLng - if(!target) { + if (!target) { for (var id in this._layers) { layer = this._layers[id]; break; } layer = layer || this; latlng = layer._latlng || layer.getCenter(); - } else if(target instanceof L.Layer) { + } else if (target instanceof L.Layer) { layer = target; latlng = layer._latlng || layer.getCenter(); } else { @@ -107,13 +107,13 @@ L.Layer.include({ }, _togglePopup: function (e) { - if(this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === e.layer){ + if (this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === e.layer) { this.closePopup(); } else { var popupTarget = e.layer || e.target; this._popup.options.offset = this._popupAnchor(popupTarget); this._popup._source = popupTarget; - if(typeof this._popup._content === 'function') { + if (typeof this._popup._content === 'function') { this._popup.update(); } this._map.openPopup(this._popup, e.latlng); From ef0ee1483dd5e8a1d30b4027b424e86093eb74af Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 2 Jan 2015 07:39:00 -0800 Subject: [PATCH 1286/2207] consistant failing test --- spec/suites/layer/PopupSpec.js | 6 +++--- src/layer/Layer.Popup.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 362447549c0..07eb86ca1da 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -56,11 +56,11 @@ describe('Popup', function () { happen.click(c); // toggle open popup - sinon.spy(marker, "_openPopup"); + sinon.spy(marker, "_togglePopup"); marker.fire('click'); - expect(marker._openPopup.calledOnce).to.be(true); + expect(marker._togglePopup.calledOnce).to.be(true); expect(map.hasLayer(marker._popup)).to.be(true); - marker.openPopup.restore(); + marker._togglePopup.restore(); // toggle close popup sinon.spy(marker, "closePopup"); diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 62e2869dbfd..f464e8ad036 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -64,7 +64,7 @@ L.Layer.include({ latlng = layer._latlng || layer.getCenter(); } else { layer = this; - latlng = target + latlng = target; } if (this._popup && this._map) { From 7347390868902941123b2fa1284ce7e3756afc41 Mon Sep 17 00:00:00 2001 From: w8r Date: Mon, 5 Jan 2015 16:10:37 +0100 Subject: [PATCH 1287/2207] added L.Control.LineStringSelect plugin --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 1c95fc0ead9..c253e8a419c 100644 --- a/plugins.md +++ b/plugins.md @@ -1432,6 +1432,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Brendan Ward + + + L.Control.LineStringSelect + + + Fast LineString(polyline) partial selection tool: select a stretch between two points in a complex path. Demo + + + Alexander Milevski + + From ed4b4e70c031683f3669870e7777e76f7623408d Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Tue, 6 Jan 2015 10:34:19 -0800 Subject: [PATCH 1288/2207] cleanup logic --- debug/map/popup.html | 65 ++++++++++------------------------------ src/layer/Layer.Popup.js | 41 +++++++++++-------------- 2 files changed, 32 insertions(+), 74 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index 43b14dab654..47d0fc1566d 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -16,14 +16,6 @@

      - - - - - - - - diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index f464e8ad036..0ce5ceaceb9 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -42,35 +42,24 @@ L.Layer.include({ }, openPopup: function (target) { - var layer; + var layer = this; var latlng; - // handles figuring out `layer` and `latlng` from `target` - // assumes target will be one of - // * undefined - // * Layer - // * [lat,lng] - // * LatLng - if (!target) { for (var id in this._layers) { layer = this._layers[id]; break; } - layer = layer || this; - latlng = layer._latlng || layer.getCenter(); - } else if (target instanceof L.Layer) { + } + + if (target instanceof L.Layer) { layer = target; - latlng = layer._latlng || layer.getCenter(); - } else { - layer = this; - latlng = target; } + latlng = layer._latlng || layer.getCenter(); + if (this._popup && this._map) { - this._popup.options.offset = this._popupAnchor(layer); // update the popup offset based on our layer - this._popup._source = layer; // update popup source - this._popup.update(); // update the popup (will update content if popup uses a function) + this._setupPopup(layer); this._map.openPopup(this._popup, latlng); } @@ -110,16 +99,20 @@ L.Layer.include({ if (this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === e.layer) { this.closePopup(); } else { - var popupTarget = e.layer || e.target; - this._popup.options.offset = this._popupAnchor(popupTarget); - this._popup._source = popupTarget; - if (typeof this._popup._content === 'function') { - this._popup.update(); - } + var layer = e.layer || e.target; + this._setupPopup(layer); this._map.openPopup(this._popup, e.latlng); } }, + _setupPopup: function (layer) { + this._popup.options.offset = this._popupAnchor(layer); + if (typeof this._popup._content === 'function') { + this._popup._source = layer; + this._popup.update(); + } + }, + _popupAnchor: function(layer){ var anchor = (layer._getPopupAnchor) ? layer._getPopupAnchor() : [0,0]; return L.point(anchor).add(L.Popup.prototype.options.offset); From 428095cf5138af01bba04bb0e443058ca7100cf2 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Tue, 6 Jan 2015 10:49:26 -0800 Subject: [PATCH 1289/2207] allow popups with functions to return strings or dom nodes --- src/layer/Popup.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 19d18cd1fc0..4bc5fb07d36 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -173,15 +173,15 @@ L.Popup = L.Layer.extend({ if (!this._content) { return; } var node = this._contentNode; - if (typeof this._content === 'function') { - node.innerHTML = this._content(this._source || this); - } else if (typeof this._content === 'string') { - node.innerHTML = this._content; + var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content; + + if (typeof content === 'string') { + node.innerHTML = content; } else { while (node.hasChildNodes()) { node.removeChild(node.firstChild); } - node.appendChild(this._content); + node.appendChild(content); } this.fire('contentupdate'); }, From 1d174cd5028043c5cff9a8d06d7c38d0481b9ca1 Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Tue, 6 Jan 2015 16:34:35 -0600 Subject: [PATCH 1290/2207] provide a default popup text color of #333 --- dist/leaflet.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 5f3d8abcfaa..0d6f2dff177 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -440,7 +440,7 @@ .leaflet-popup-content-wrapper, .leaflet-popup-tip { background: white; - + color: #333; box-shadow: 0 3px 14px rgba(0,0,0,0.4); } .leaflet-container a.leaflet-popup-close-button { From ff8023a460d9b0526ce531074517a7f6aec6e07d Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Wed, 7 Jan 2015 09:50:01 -0800 Subject: [PATCH 1291/2207] fix passing latlng to openPopup, fix build --- spec/suites/layer/PopupSpec.js | 3 +-- src/layer/Layer.Popup.js | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 07eb86ca1da..d112cd50dfe 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -51,14 +51,13 @@ describe('Popup', function () { map.addLayer(marker); marker.bindPopup('Popup1').openPopup(); - map.options.closePopupOnClick = true; happen.click(c); // toggle open popup sinon.spy(marker, "_togglePopup"); marker.fire('click'); - expect(marker._togglePopup.calledOnce).to.be(true); + // expect(marker._togglePopup.calledOnce).to.be(true); expect(map.hasLayer(marker._popup)).to.be(true); marker._togglePopup.restore(); diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 0ce5ceaceb9..5b9a2956b8d 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -42,7 +42,7 @@ L.Layer.include({ }, openPopup: function (target) { - var layer = this; + var layer; var latlng; if (!target) { @@ -50,16 +50,17 @@ L.Layer.include({ layer = this._layers[id]; break; } + layer = layer || this; } if (target instanceof L.Layer) { layer = target; } - latlng = layer._latlng || layer.getCenter(); + latlng = (layer) ? layer._popupLatLng() : target; if (this._popup && this._map) { - this._setupPopup(layer); + this._setupPopup(layer || this); this._map.openPopup(this._popup, latlng); } @@ -96,10 +97,10 @@ L.Layer.include({ }, _togglePopup: function (e) { - if (this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === e.layer) { + var layer = e.layer || e.target; + if (this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === layer) { this.closePopup(); } else { - var layer = e.layer || e.target; this._setupPopup(layer); this._map.openPopup(this._popup, e.latlng); } @@ -107,10 +108,8 @@ L.Layer.include({ _setupPopup: function (layer) { this._popup.options.offset = this._popupAnchor(layer); - if (typeof this._popup._content === 'function') { - this._popup._source = layer; - this._popup.update(); - } + this._popup._source = layer; + this._popup.update(); }, _popupAnchor: function(layer){ @@ -120,5 +119,9 @@ L.Layer.include({ _movePopup: function (e) { this._popup.setLatLng(e.latlng); + }, + + _popupLatLng: function(){ + return this._latlng || this.getCenter(); } }); \ No newline at end of file From dacf32d3a6ae7c51cc0975e65687c1f4131e33e9 Mon Sep 17 00:00:00 2001 From: Brian Reavis Date: Wed, 7 Jan 2015 17:33:10 -0700 Subject: [PATCH 1292/2207] Added Leaflet.TransitionedIcon plugin to list. --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index c253e8a419c..d0d64f75e20 100644 --- a/plugins.md +++ b/plugins.md @@ -478,6 +478,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Kirill Zhuravlev + + + Leaflet.TransitionedIcon + + Transition in/out markers with CSS3 transitions. It supports jitter + for staggering markers into view to prevent visual overload. See the demo. + + Brian Reavis + + From 7a3bf472075e9421871920b6695f2fd8168a1cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20H=C3=BChne?= Date: Wed, 7 Jan 2015 21:59:25 +0100 Subject: [PATCH 1293/2207] Add leaflet-layer-overpass to plugins --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index d0d64f75e20..28254733496 100644 --- a/plugins.md +++ b/plugins.md @@ -488,6 +488,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Brian Reavis + + + Leaflet Layer Overpass + + Easily include data from the overpass api. + + kartenkarsten + + From 9186eade96c865dcfe116743d51328e90a4c809d Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 11 Jan 2015 08:31:41 -0800 Subject: [PATCH 1294/2207] remove method checks from test --- spec/suites/layer/PopupSpec.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index d112cd50dfe..a5bf3a27ad7 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -50,23 +50,20 @@ describe('Popup', function () { var marker = new L.Marker(new L.LatLng(55.8, 37.6)); map.addLayer(marker); - marker.bindPopup('Popup1').openPopup(); + marker.bindPopup('Popup1'); map.options.closePopupOnClick = true; - happen.click(c); // toggle open popup - sinon.spy(marker, "_togglePopup"); - marker.fire('click'); - // expect(marker._togglePopup.calledOnce).to.be(true); + marker.fire('click', { + latlng: new L.LatLng(55.8, 37.6) + }); expect(map.hasLayer(marker._popup)).to.be(true); - marker._togglePopup.restore(); // toggle close popup - sinon.spy(marker, "closePopup"); - marker.fire('click'); - expect(marker.closePopup.calledOnce).to.be(true); + marker.fire('click', { + latlng: new L.LatLng(55.8, 37.6) + }); expect(map.hasLayer(marker._popup)).to.be(false); - marker.closePopup.restore(); }); it("triggers popupopen on marker when popup opens", function () { From 7650eaef520c8ed57e79830253e2182c504a5c16 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 12 Jan 2015 18:56:17 +0200 Subject: [PATCH 1295/2207] simplify group popup changes, cleanup --- src/layer/FeatureGroup.js | 6 ++--- src/layer/Layer.Popup.js | 50 +++++++++++++-------------------------- src/layer/Popup.js | 4 +--- 3 files changed, 20 insertions(+), 40 deletions(-) diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js index 1e10b07e64b..8d27824cba0 100644 --- a/src/layer/FeatureGroup.js +++ b/src/layer/FeatureGroup.js @@ -47,10 +47,10 @@ L.FeatureGroup = L.LayerGroup.extend({ getBounds: function () { var bounds = new L.LatLngBounds(); - this.eachLayer(function (layer) { + for (var id in this._layers) { + var layer = this._layers[id]; bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng()); - }); - + } return bounds; } }); diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 5b9a2956b8d..6d3d259ab35 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -18,7 +18,7 @@ L.Layer.include({ if (!this._popupHandlersAdded) { this.on({ - click: this._togglePopup, + click: this._openPopup, remove: this.closePopup, move: this._movePopup }); @@ -31,7 +31,7 @@ L.Layer.include({ unbindPopup: function () { if (this._popup) { this.off({ - click: this._togglePopup, + click: this._openPopup, remove: this.closePopup, move: this._movePopup }); @@ -41,26 +41,24 @@ L.Layer.include({ return this; }, - openPopup: function (target) { - var layer; - var latlng; + openPopup: function (layer, latlng) { - if (!target) { + if (!(layer instanceof L.Layer)) { + latlng = layer; + layer = this; + } + if (layer instanceof L.FeatureGroup) { for (var id in this._layers) { layer = this._layers[id]; break; } - layer = layer || this; - } - - if (target instanceof L.Layer) { - layer = target; } - - latlng = (layer) ? layer._popupLatLng() : target; + if (!latlng) latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); if (this._popup && this._map) { - this._setupPopup(layer || this); + this._popup.options.offset = this._popupAnchor(layer); + this._popup._source = layer; + this._popup.update(); this._map.openPopup(this._popup, latlng); } @@ -96,32 +94,16 @@ L.Layer.include({ return this._popup; }, - _togglePopup: function (e) { - var layer = e.layer || e.target; - if (this._popup && this._map && this._map.hasLayer(this._popup) && this._popup._source === layer) { - this.closePopup(); - } else { - this._setupPopup(layer); - this._map.openPopup(this._popup, e.latlng); - } - }, - - _setupPopup: function (layer) { - this._popup.options.offset = this._popupAnchor(layer); - this._popup._source = layer; - this._popup.update(); + _openPopup: function (e) { + this.openPopup(e.layer || e.target, e.latlng); }, _popupAnchor: function(layer){ - var anchor = (layer._getPopupAnchor) ? layer._getPopupAnchor() : [0,0]; + var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0,0]; return L.point(anchor).add(L.Popup.prototype.options.offset); }, _movePopup: function (e) { this._popup.setLatLng(e.latlng); - }, - - _popupLatLng: function(){ - return this._latlng || this.getCenter(); } -}); \ No newline at end of file +}); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 4bc5fb07d36..583996a4bdd 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -295,9 +295,7 @@ L.popup = function (options, source) { L.Map.include({ openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object]) if (!(popup instanceof L.Popup)) { - var content = popup; - - popup = new L.Popup(options).setContent(content); + popup = new L.Popup(options).setContent(popup); } if (latlng) { From 2ee1aa2c2365e0cf4404817b4d268d5ed788a653 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 12 Jan 2015 11:03:42 -0800 Subject: [PATCH 1296/2207] jshint --- spec/suites/geo/LatLngSpec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js index 9da63f8eaf7..c7de51db0b1 100644 --- a/spec/suites/geo/LatLngSpec.js +++ b/spec/suites/geo/LatLngSpec.js @@ -112,8 +112,8 @@ describe('LatLng', function () { }); it('accepts an object with alt', function () { - expect(L.latLng({lat: 50, lng: 30, alt:100})).to.eql(new L.LatLng(50, 30, 100)); - expect(L.latLng({lat: 50, lon: 30, alt:100})).to.eql(new L.LatLng(50, 30, 100)); + expect(L.latLng({lat: 50, lng: 30, alt: 100})).to.eql(new L.LatLng(50, 30, 100)); + expect(L.latLng({lat: 50, lon: 30, alt: 100})).to.eql(new L.LatLng(50, 30, 100)); }); }); }); From c8fca59b51086fcaa024baddb49529426d8efeb9 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 12 Jan 2015 13:03:51 -0800 Subject: [PATCH 1297/2207] Move _pruneTiles up to _update _update is the only place _addTiles is called from, makes more sense to call _add then _prune than for _add to call _prune itself. --- src/layer/tile/GridLayer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 6203929efd3..a0ac8ca77e8 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -360,6 +360,7 @@ L.GridLayer = L.Layer.extend({ } this._addTiles(bounds); + this._pruneTiles(); }, // tile coordinates range for particular geo bounds and zoom @@ -415,8 +416,6 @@ L.GridLayer = L.Layer.extend({ this._level.el.appendChild(fragment); } - - this._pruneTiles(); }, _isValidTile: function (coords) { From 99a21117a08380d6c11ef1ee1e27a3799e942c95 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 12 Jan 2015 14:40:05 -0800 Subject: [PATCH 1298/2207] Merge _tiles, _loaded, and _retain into a single map --- src/layer/tile/GridLayer.js | 58 +++++++++++++++++++++---------------- src/layer/tile/TileLayer.js | 2 +- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index a0ac8ca77e8..5d4569d6ab4 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -34,8 +34,6 @@ L.GridLayer = L.Layer.extend({ this._levels = {}; this._tiles = {}; - this._loaded = {}; - this._retain = {}; this._tilesToLoad = 0; this._reset(); @@ -156,7 +154,7 @@ L.GridLayer = L.Layer.extend({ if (L.Browser.ielt9) { // IE doesn't inherit filter opacity properly, so we're forced to set it on tiles for (var i in this._tiles) { - L.DomUtil.setOpacity(this._tiles[i], opacity); + L.DomUtil.setOpacity(this._tiles[i].el, opacity); } } else { L.DomUtil.setOpacity(this._container, opacity); @@ -205,29 +203,34 @@ L.GridLayer = L.Layer.extend({ if (!this._map) { return; } - this._retain = {}; - var bounds = this._map.getBounds(), z = this._tileZoom, range = this._getTileRange(bounds, z), - i, j, key, found; + i, j, key, tile, found; + + for (key in this._tiles) { + this._tiles[key].retain = false; + } for (i = range.min.x; i <= range.max.x; i++) { for (j = range.min.y; j <= range.max.y; j++) { key = i + ':' + j + ':' + z; + tile = this._tiles[key]; - this._retain[key] = true; + if (!tile) { continue; } + tile.retain = true; - if (!this._loaded[key]) { + if (!tile.loaded) { found = this._retainParent(i, j, z, z - 5) || this._retainChildren(i, j, z, z + 2); } } } for (key in this._tiles) { - if (!this._retain[key]) { - if (!this._loaded[key]) { + tile = this._tiles[key]; + if (!tile.retain) { + if (!tile.loaded) { this._removeTile(key); this._tilesToLoad--; } else if (this._map._fadeAnimated) { @@ -247,7 +250,8 @@ L.GridLayer = L.Layer.extend({ }, _deferRemove: function (key) { - if (!this._retain[key]) { + var tile = this._tiles[key]; + if (tile && !tile.retain) { this._removeTile(key); } }, @@ -257,10 +261,11 @@ L.GridLayer = L.Layer.extend({ y2 = Math.floor(y / 2), z2 = z - 1; - var key = x2 + ':' + y2 + ':' + z2; + var key = x2 + ':' + y2 + ':' + z2, + tile = this._tiles[key]; - if (this._loaded[key]) { - this._retain[key] = true; + if (tile && tile.loaded) { + tile.retain = true; return true; } else if (z2 > minZoom) { @@ -275,10 +280,11 @@ L.GridLayer = L.Layer.extend({ for (var i = 2 * x; i < 2 * x + 2; i++) { for (var j = 2 * y; j < 2 * y + 2; j++) { - var key = i + ':' + j + ':' + (z + 1); + var key = i + ':' + j + ':' + (z + 1), + tile = this._tiles[key]; - if (this._loaded[key]) { - this._retain[key] = true; + if (tile && tile.loaded) { + tile.retain = true; } else if (z + 1 < maxZoom) { this._retainChildren(i, j, z + 1, maxZoom); @@ -481,13 +487,12 @@ L.GridLayer = L.Layer.extend({ var tile = this._tiles[key]; if (!tile) { return; } - L.DomUtil.remove(tile); + L.DomUtil.remove(tile.el); delete this._tiles[key]; - delete this._loaded[key]; this.fire('tileunload', { - tile: tile, + tile: tile.el, coords: this._keyToTileCoords(key) }); }, @@ -533,7 +538,9 @@ L.GridLayer = L.Layer.extend({ L.DomUtil.setPosition(tile, tilePos, true); // save tile in cache - this._tiles[key] = tile; + this._tiles[key] = { + el: tile + }; container.appendChild(tile); this.fire('tileloadstart', { @@ -553,15 +560,16 @@ L.GridLayer = L.Layer.extend({ var key = this._tileCoordsToKey(coords); - if (!this._tiles[key]) { return; } + tile = this._tiles[key]; + if (!tile) { return; } - this._loaded[key] = true; + tile.loaded = true; this._pruneTiles(); - L.DomUtil.addClass(tile, 'leaflet-tile-loaded'); + L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); this.fire('tileload', { - tile: tile, + tile: tile.el, coords: coords }); diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 94f1f21ac33..9b0d9032921 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -136,7 +136,7 @@ L.TileLayer = L.GridLayer.extend({ _abortLoading: function () { var i, tile; for (i in this._tiles) { - tile = this._tiles[i]; + tile = this._tiles[i].el; tile.onload = L.Util.falseFn; tile.onerror = L.Util.falseFn; From d08bdc8e78c1420910d834dc7735de0aa1d5463d Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 12 Jan 2015 14:49:18 -0800 Subject: [PATCH 1299/2207] Calculate _tilesToLoad Avoids cached _tilesToLoad value getting out of sync with actual loading tiles, e.g. if _removeOtherTiles or _abortLoading removes tiles that are loading. --- src/layer/tile/GridLayer.js | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 5d4569d6ab4..dde3563bc4a 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -32,9 +32,7 @@ L.GridLayer = L.Layer.extend({ this._pruneTiles = L.Util.throttle(this._pruneTiles, 200, this); this._levels = {}; - this._tiles = {}; - this._tilesToLoad = 0; this._reset(); this._update(); @@ -232,7 +230,6 @@ L.GridLayer = L.Layer.extend({ if (!tile.retain) { if (!tile.loaded) { this._removeTile(key); - this._tilesToLoad--; } else if (this._map._fadeAnimated) { setTimeout(L.bind(this._deferRemove, this, key), 250); } else { @@ -246,7 +243,6 @@ L.GridLayer = L.Layer.extend({ for (var key in this._tiles) { this._removeTile(key); } - this._tilesToLoad = 0; }, _deferRemove: function (key) { @@ -402,21 +398,16 @@ L.GridLayer = L.Layer.extend({ return a.distanceTo(center) - b.distanceTo(center); }); - var tilesToLoad = queue.length; - - - if (tilesToLoad !== 0) { + if (queue.length !== 0) { // if its the first batch of tiles to load - if (!this._tilesToLoad) { + if (this._tilesToLoad() === 0) { this.fire('loading'); } - this._tilesToLoad += tilesToLoad; - // create DOM fragment to append tiles in one batch var fragment = document.createDocumentFragment(); - for (i = 0; i < tilesToLoad; i++) { + for (i = 0; i < queue.length; i++) { this._addTile(queue[i], fragment); } @@ -573,9 +564,7 @@ L.GridLayer = L.Layer.extend({ coords: coords }); - this._tilesToLoad--; - - if (this._tilesToLoad === 0) { + if (this._tilesToLoad() === 0) { this.fire('load'); } }, @@ -600,6 +589,14 @@ L.GridLayer = L.Layer.extend({ _animateZoom: function (e) { this._setZoomTransforms(e.center, e.zoom); + }, + + _tilesToLoad: function () { + var result = 0; + for (var key in this._tiles) { + if (this._tiles[key].loading) { result++; } + } + return result; } }); From b76caf0f3c358b601f19837b15b307baf0a09b49 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 13 Jan 2015 13:22:19 +0200 Subject: [PATCH 1300/2207] don't count how many tiles to load, ref #3129 --- src/layer/tile/GridLayer.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index dde3563bc4a..52294704f21 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -400,7 +400,7 @@ L.GridLayer = L.Layer.extend({ if (queue.length !== 0) { // if its the first batch of tiles to load - if (this._tilesToLoad() === 0) { + if (this._noTilesToLoad()) { this.fire('loading'); } @@ -564,7 +564,7 @@ L.GridLayer = L.Layer.extend({ coords: coords }); - if (this._tilesToLoad() === 0) { + if (this._noTilesToLoad()) { this.fire('load'); } }, @@ -591,12 +591,11 @@ L.GridLayer = L.Layer.extend({ this._setZoomTransforms(e.center, e.zoom); }, - _tilesToLoad: function () { - var result = 0; + _noTilesToLoad: function () { for (var key in this._tiles) { - if (this._tiles[key].loading) { result++; } + if (!this._tiles[key].loaded) { return false; } } - return result; + return true; } }); From 4dfbcc46ddd4fe6d67b61e5f90bbc62da8d2f219 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 13 Jan 2015 13:31:11 +0200 Subject: [PATCH 1301/2207] remove inertiaThreshold option, ref #3063 --- src/map/handler/Map.Drag.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 1262bfec443..92476de0371 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -8,7 +8,6 @@ L.Map.mergeOptions({ inertia: !L.Browser.android23, inertiaDeceleration: 3400, // px/s^2 inertiaMaxSpeed: Infinity, // px/s - inertiaThreshold: Infinity, easeLinearity: 0.2, // TODO refactor, move to CRS @@ -110,7 +109,7 @@ L.Map.Drag = L.Handler.extend({ options = map.options, delay = +new Date() - this._lastTime, - noInertia = !options.inertia || delay > options.inertiaThreshold || this._times.length < 2; + noInertia = !options.inertia || this._times.length < 2; map.fire('dragend', e); From c3a39f50cf7e36278749deebbd6855e5d83b4f98 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 13 Jan 2015 13:31:46 +0200 Subject: [PATCH 1302/2207] fix accidentally broken build --- src/map/handler/Map.Drag.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 92476de0371..9980d4d3aea 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -107,7 +107,6 @@ L.Map.Drag = L.Handler.extend({ _onDragEnd: function (e) { var map = this._map, options = map.options, - delay = +new Date() - this._lastTime, noInertia = !options.inertia || this._times.length < 2; From 6c5dd2a8280690dbfce576387c6e0b13a39366dc Mon Sep 17 00:00:00 2001 From: Biel Frontera Date: Wed, 14 Jan 2015 15:31:42 +0100 Subject: [PATCH 1303/2207] Add Leaflet.TimeDimension plugin to list This plugin adds time dimension capabilities on a Leaflet map. A TimeDimension object can manage the time component of one or several layers, and can be used to animate layers, go back or forward in time. It works with different types of layers (WMS, GeoJSON). --- plugins.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugins.md b/plugins.md index 28254733496..4cbc3aee2ab 100644 --- a/plugins.md +++ b/plugins.md @@ -1462,6 +1462,18 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Alexander Milevski + + + Leaflet.TimeDimension + + + Add time dimension capabilities on a Leaflet map. Demos + + + ICTS SOCIB + + + From e6ad9e352b3c2ed8ca121921ead94944f598f2a8 Mon Sep 17 00:00:00 2001 From: Kyle Tolle Date: Wed, 14 Jan 2015 12:25:21 -0700 Subject: [PATCH 1304/2207] Update mouseup event description It was the same as mousedown before. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 79556ccbf8e..2369b2b8454 100644 --- a/reference.html +++ b/reference.html @@ -442,7 +442,7 @@

      Events

      mouseup MouseEvent - Fired when the user pushes the mouse button on the map. + Fired when the user releases the mouse button on the map. mouseover From 153b11447cc0a24ff41601dadacc4d59dc5b6f05 Mon Sep 17 00:00:00 2001 From: Kyle Tolle Date: Wed, 14 Jan 2015 12:43:41 -0700 Subject: [PATCH 1305/2207] Use appropriate loses instead of looses --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 2369b2b8454..ca03f5ec2e5 100644 --- a/reference.html +++ b/reference.html @@ -472,7 +472,7 @@

      Events

      blur Event - Fired when the map looses focus. + Fired when the map loses focus. preclick From c656e3f993be1f26c3e9064b8da2faa07c4176bd Mon Sep 17 00:00:00 2001 From: Brett Camper Date: Wed, 14 Jan 2015 19:47:46 -0500 Subject: [PATCH 1306/2207] flyTo: convert targetCenter to latLng see #3139 --- src/map/anim/Map.FlyTo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index d9af494ecc4..81128f1a275 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -9,6 +9,7 @@ L.Map.include({ size = this.getSize(), startZoom = this._zoom; + targetCenter = L.latLng(targetCenter); targetZoom = targetZoom === undefined ? startZoom : targetZoom; var w0 = Math.max(size.x, size.y), From 48a374db059febbb9a1a510cc4fc8bed837f442c Mon Sep 17 00:00:00 2001 From: Chris Laidlaw Date: Thu, 15 Jan 2015 15:42:54 -0800 Subject: [PATCH 1307/2207] BUG: _tryAnimatedPan lies to setView about whether or not an animation was initiated. --- src/map/anim/Map.PanAnimation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 9b20aef6d67..370054aa32b 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -96,6 +96,6 @@ L.Map.include({ this.panBy(offset, options); - return true; + return options.animate !== false; } }); From cc750d43ae5a79bd4c1f5cc4cba98d992a67713c Mon Sep 17 00:00:00 2001 From: Bernhard Eder Date: Sun, 18 Jan 2015 23:45:38 +0100 Subject: [PATCH 1308/2207] fixed error in _tryAnimatedPan when options is undefined --- src/map/anim/Map.PanAnimation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 370054aa32b..9dddff5fac1 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -96,6 +96,6 @@ L.Map.include({ this.panBy(offset, options); - return options.animate !== false; + return (options && options.animate) !== false; } }); From 4c46abe7810272704cc1a7ce0ccfb84c45456791 Mon Sep 17 00:00:00 2001 From: Stefan Sydow Date: Mon, 19 Jan 2015 19:07:04 +0100 Subject: [PATCH 1309/2207] preserve dragable state on layer deactivation --- spec/suites/layer/marker/MarkerSpec.js | 5 +++++ src/layer/marker/Marker.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index fc42585073e..a67e3343019 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -40,6 +40,11 @@ describe("Marker", function () { marker.setIcon(icon1); expect(marker.dragging.enabled()).to.be(true); + + map.removeLayer(marker); + map.addLayer(marker); + + expect(marker.dragging.enabled()).to.be(true); }); it("changes the icon to another DivIcon", function () { diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index d8b001da107..6d40888a7a2 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -32,8 +32,8 @@ L.Marker = L.Layer.extend({ }, onRemove: function () { - if (this.dragging) { - this.dragging.disable(); + if (this.dragging && this.dragging.enabled()) { + this.dragging.removeHooks(); } this._removeIcon(); From 73147bc9e691f200d5728a39d93931192f168e62 Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Sat, 24 Jan 2015 11:20:01 +0100 Subject: [PATCH 1310/2207] Update year in copyright.js --- src/copyright.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/copyright.js b/src/copyright.js index cc6889d2a85..6339722394b 100644 --- a/src/copyright.js +++ b/src/copyright.js @@ -1,4 +1,4 @@ /* Leaflet {VERSION}, a JS library for interactive maps. http://leafletjs.com - (c) 2010-2014 Vladimir Agafonkin, (c) 2010-2011 CloudMade + (c) 2010-2015 Vladimir Agafonkin, (c) 2010-2011 CloudMade */ From 46d5992279f1e7cc1fb32e695adcf4bd4874d2a1 Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Sat, 24 Jan 2015 11:23:23 +0100 Subject: [PATCH 1311/2207] Use SVG version of Travis build status badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 220b74ecc15..15e55b74bc6 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you want to **get involved** with Leaflet development, check out the [contrib Let's make the best mapping library that will ever exist, and push the limits of what's possible with online maps! -[![Build Status](https://travis-ci.org/Leaflet/Leaflet.png?branch=master)](https://travis-ci.org/Leaflet/Leaflet) +[![Build Status](https://travis-ci.org/Leaflet/Leaflet.svg?branch=master)](https://travis-ci.org/Leaflet/Leaflet) [Vladimir Agafonkin]: http://agafonkin.com/en [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors From 5004da2a9e5986711c422051a217ed568169d5de Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Sat, 24 Jan 2015 18:43:57 +0100 Subject: [PATCH 1312/2207] Remove insertAtTheBottom option from addLayer() --- reference.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reference.html b/reference.html index ca03f5ec2e5..7e4111a2651 100644 --- a/reference.html +++ b/reference.html @@ -798,11 +798,10 @@

      Methods for Layers and Controls

      addLayer( <ILayer> layer, - <Boolean> insertAtTheBottom? ) this - Adds the given layer to the map. If optional insertAtTheBottom is set to true, the layer is inserted under all others (useful when switching base tile layers). + Adds the given layer to the map. removeLayer( From a28c9508be931820e4c22253dea552d89cefa74b Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Sun, 25 Jan 2015 19:27:24 -0500 Subject: [PATCH 1313/2207] Don't mutate this._defaultLocateOptions. --- src/map/ext/Map.Geolocation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index 38235516b53..05fe552ab90 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -14,7 +14,7 @@ L.Map.include({ locate: function (/*Object*/ options) { - options = this._locateOptions = L.extend(this._defaultLocateOptions, options); + options = this._locateOptions = L.extend({}, this._defaultLocateOptions, options); if (!navigator.geolocation) { this._handleGeolocationError({ From aace5b278e3584da2c2aa477964d7740c7870e4f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 27 Jan 2015 19:09:49 +0200 Subject: [PATCH 1314/2207] add Control.Zoom disable/enable methods, close #3172 --- src/control/Control.Zoom.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 980cf49bbf9..08c6505beb0 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -31,12 +31,28 @@ L.Control.Zoom = L.Control.extend({ map.off('zoomend zoomlevelschange', this._updateDisabled, this); }, + disable: function () { + this._enabled = false; + this._updateDisabled(); + return this; + }, + + enable: function () { + this._enabled = true; + this._updateDisabled(); + return this; + }, + _zoomIn: function (e) { - this._map.zoomIn(e.shiftKey ? 3 : 1); + if (this._enabled) { + this._map.zoomIn(e.shiftKey ? 3 : 1); + } }, _zoomOut: function (e) { - this._map.zoomOut(e.shiftKey ? 3 : 1); + if (this._enabled) { + this._map.zoomOut(e.shiftKey ? 3 : 1); + } }, _createButton: function (html, title, className, container, fn) { @@ -61,10 +77,10 @@ L.Control.Zoom = L.Control.extend({ L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); - if (map._zoom === map.getMinZoom()) { + if (!this._enabled || map._zoom === map.getMinZoom()) { L.DomUtil.addClass(this._zoomOutButton, className); } - if (map._zoom === map.getMaxZoom()) { + if (!this._enabled || map._zoom === map.getMaxZoom()) { L.DomUtil.addClass(this._zoomInButton, className); } } From 93f3304f22ee99beaa5adc5ae8bb16fa1739ce18 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 27 Jan 2015 23:15:07 +0200 Subject: [PATCH 1315/2207] fix zoom control regression --- src/control/Control.Zoom.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 08c6505beb0..86a82b02800 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -32,25 +32,25 @@ L.Control.Zoom = L.Control.extend({ }, disable: function () { - this._enabled = false; + this._disabled = true; this._updateDisabled(); return this; }, enable: function () { - this._enabled = true; + this._disabled = false; this._updateDisabled(); return this; }, _zoomIn: function (e) { - if (this._enabled) { + if (!this._disabled) { this._map.zoomIn(e.shiftKey ? 3 : 1); } }, _zoomOut: function (e) { - if (this._enabled) { + if (!this._disabled) { this._map.zoomOut(e.shiftKey ? 3 : 1); } }, @@ -77,10 +77,10 @@ L.Control.Zoom = L.Control.extend({ L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); - if (!this._enabled || map._zoom === map.getMinZoom()) { + if (this._disabled || map._zoom === map.getMinZoom()) { L.DomUtil.addClass(this._zoomOutButton, className); } - if (!this._enabled || map._zoom === map.getMaxZoom()) { + if (this._disabled || map._zoom === map.getMaxZoom()) { L.DomUtil.addClass(this._zoomInButton, className); } } From 65efd30567683a61326e665813eacf3ebd2a0087 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 28 Jan 2015 17:17:26 +0200 Subject: [PATCH 1316/2207] minor chaining fixes --- src/control/Control.Attribution.js | 4 ++-- src/control/Control.Layers.js | 2 +- src/layer/GeoJSON.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/control/Control.Attribution.js b/src/control/Control.Attribution.js index 4803e04afcd..dea9fec000e 100644 --- a/src/control/Control.Attribution.js +++ b/src/control/Control.Attribution.js @@ -39,7 +39,7 @@ L.Control.Attribution = L.Control.extend({ }, addAttribution: function (text) { - if (!text) { return; } + if (!text) { return this; } if (!this._attributions[text]) { this._attributions[text] = 0; @@ -52,7 +52,7 @@ L.Control.Attribution = L.Control.extend({ }, removeAttribution: function (text) { - if (!text) { return; } + if (!text) { return this; } if (this._attributions[text]) { this._attributions[text]--; diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 5366dc875b3..2ed054b1ec8 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -123,7 +123,7 @@ L.Control.Layers = L.Control.extend({ }, _update: function () { - if (!this._container) { return; } + if (!this._container) { return this; } L.DomUtil.empty(this._baseLayersList); L.DomUtil.empty(this._overlaysList); diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index d8700a8a108..cb29d8dedc0 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -31,7 +31,7 @@ L.GeoJSON = L.FeatureGroup.extend({ var options = this.options; - if (options.filter && !options.filter(geojson)) { return; } + if (options.filter && !options.filter(geojson)) { return this; } var layer = L.GeoJSON.geometryToLayer(geojson, options); layer.feature = L.GeoJSON.asFeature(geojson); @@ -146,7 +146,7 @@ L.extend(L.GeoJSON, { for (var i = 0, len = latlngs.length; i < len; i++) { coords.push(levelsDeep ? - L.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed): + L.GeoJSON.latLngsToCoords(latlngs[i], levelsDeep - 1, closed) : L.GeoJSON.latLngToCoords(latlngs[i])); } From e749d1915b5ecc179222359e687b0dd10d73fcc5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 28 Jan 2015 17:27:31 +0200 Subject: [PATCH 1317/2207] add ESLint rules; various code style fixes --- package.json | 51 ++++++++++++++++++++++++++-------- src/control/Control.Zoom.js | 1 - src/core/Util.js | 3 +- src/dom/DomEvent.js | 9 +++--- src/dom/DomUtil.js | 3 +- src/geo/LatLng.js | 1 - src/geometry/LineUtil.js | 6 ++-- src/geometry/Point.js | 2 +- src/layer/Popup.js | 2 +- src/layer/marker/Marker.js | 2 +- src/layer/tile/GridLayer.js | 3 +- src/layer/vector/SVG.js | 2 +- src/map/handler/Map.BoxZoom.js | 2 +- src/map/handler/Map.Tap.js | 4 +-- 14 files changed, 61 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index c4ac13cfffa..7fd0e73d2a7 100644 --- a/package.json +++ b/package.json @@ -3,20 +3,21 @@ "version": "0.8.0-dev", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { - "jake": "~8.0.10", - "jshint": "~2.5.7", - "uglify-js": "~2.4.15", - "mocha": "~2.0.1", + "copyfiles": "0.1.0", + "eslint": "^0.13.0", "happen": "~0.1.3", - "karma": "~0.12.24", - "karma-mocha": "~0.1.9", - "karma-coverage": "~0.2.6", + "jake": "~8.0.10", + "jshint": "~2.6.0", + "karma": "~0.12.31", + "karma-chrome-launcher": "^0.1.7", + "karma-coverage": "~0.2.7", + "karma-firefox-launcher": "~0.1.4", + "karma-mocha": "~0.1.10", "karma-phantomjs-launcher": "^0.1.4", - "karma-chrome-launcher": "^0.1.5", - "karma-firefox-launcher": "~0.1.3", "karma-safari-launcher": "~0.1.1", + "mocha": "~2.1.0", "tin": "^0.5.0", - "copyfiles": "0.1.0" + "uglify-js": "~2.4.16" }, "main": "dist/leaflet-src.js", "style": "dist/leaflet.css", @@ -38,5 +39,33 @@ "type": "BSD-2-Clause", "url": "https://github.com/Leaflet/Leaflet/blob/master/LICENSE" } - ] + ], + "eslintConfig": { + "rules": { + "camelcase": 2, + "quotes": [2, "single"], + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "space-after-function-name": 2, + "space-in-parens": 2, + "space-in-brackets": 2, + "space-before-blocks": 2, + "space-after-keywords": 2, + "no-lonely-if": 2, + "comma-style": 2, + "no-underscore-dangle": 0, + "no-constant-condition": 0, + "no-multi-spaces": 0, + "strict": 0, + "key-spacing": 0, + "no-shadow": 0 + }, + "globals": { + "L": true, + "module": false, + "define": false + }, + "env": { + "browser": true + } + } } diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 86a82b02800..978d25790b1 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -100,4 +100,3 @@ L.Map.addInitHook(function () { L.control.zoom = function (options) { return new L.Control.Zoom(options); }; - diff --git a/src/core/Util.js b/src/core/Util.js index fc66a76e62c..f052bd9a8bf 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -42,9 +42,10 @@ L.Util = { // return unique ID of an object stamp: function (obj) { - // jshint camelcase: false + /*eslint-disable */ obj._leaflet_id = obj._leaflet_id || ++L.Util.lastId; return obj._leaflet_id; + /*eslint-enable */ }, lastId: 0, diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 9a59441ed74..9d67761ff4e 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -54,7 +54,7 @@ L.DomEvent = { if (L.Browser.pointer && type.indexOf('touch') === 0) { this.addPointerListener(obj, type, handler, id); - + } else if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { this.addDoubleTapListener(obj, handler, id); @@ -67,8 +67,9 @@ L.DomEvent = { } else if ((type === 'mouseenter') || (type === 'mouseleave')) { handler = function (e) { e = e || window.event; - if (!L.DomEvent._checkMouse(obj, e)) { return; } - return originalHandler(e); + if (L.DomEvent._checkMouse(obj, e)) { + originalHandler(e); + } }; obj.addEventListener(type === 'mouseenter' ? 'mouseover' : 'mouseout', handler, false); @@ -240,7 +241,7 @@ L.DomEvent = { } L.DomEvent._lastClick = timeStamp; - return handler(e); + handler(e); } }; diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index c13c41e7314..af0600fdc83 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -145,8 +145,9 @@ L.DomUtil = { setPosition: function (el, point, no3d) { // (HTMLElement, Point[, Boolean]) - // jshint camelcase: false + /*eslint-disable */ el._leaflet_pos = point; + /*eslint-enable */ if (L.Browser.any3d && !no3d) { L.DomUtil.setTransform(el, point); diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index 27ec3195295..f040cb623f0 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -80,4 +80,3 @@ L.latLng = function (a, b, c) { } return new L.LatLng(a, b, c); }; - diff --git a/src/geometry/LineUtil.js b/src/geometry/LineUtil.js index ab6a7b6cd02..6268f3fbf42 100644 --- a/src/geometry/LineUtil.js +++ b/src/geometry/LineUtil.js @@ -10,7 +10,7 @@ L.LineUtil = { // Simplify polyline with vertex reduction and Douglas-Peucker simplification. // Improves rendering performance dramatically by lessening the number of points to draw. - simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { + simplify: function (points, tolerance) { if (!tolerance || !points.length) { return points.slice(); } @@ -27,11 +27,11 @@ L.LineUtil = { }, // distance from a point to a segment between two points - pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { + pointToSegmentDistance: function (p, p1, p2) { return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); }, - closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { + closestPointOnSegment: function (p, p1, p2) { return this._sqClosestPointOnSegment(p, p1, p2); }, diff --git a/src/geometry/Point.js b/src/geometry/Point.js index 20c5aa5977c..be4437c895a 100644 --- a/src/geometry/Point.js +++ b/src/geometry/Point.js @@ -2,7 +2,7 @@ * L.Point represents a point with x and y coordinates. */ -L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { +L.Point = function (x, y, round) { this.x = (round ? Math.round(x) : x); this.y = (round ? Math.round(y) : y); }; diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 3a702971f24..0391f8456cd 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -132,7 +132,7 @@ L.Popup = L.Layer.extend({ } return events; }, - + isOpen: function () { return !!this._map && this._map.hasLayer(this); }, diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 6d40888a7a2..309c89aab4d 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -58,7 +58,7 @@ L.Marker = L.Layer.extend({ var oldLatLng = this._latlng; this._latlng = L.latLng(latlng); this.update(); - return this.fire('move', { oldLatLng: oldLatLng, latlng: this._latlng }); + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); }, setZIndexOffset: function (offset) { diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 52294704f21..052c95b658c 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -220,7 +220,8 @@ L.GridLayer = L.Layer.extend({ tile.retain = true; if (!tile.loaded) { - found = this._retainParent(i, j, z, z - 5) || this._retainChildren(i, j, z, z + 2); + found = this._retainParent(i, j, z, z - 5); + if (!found) { this._retainChildren(i, j, z, z + 2); } } } } diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index cb538b35283..d230d697e33 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -122,7 +122,7 @@ L.SVG = L.Renderer.extend({ // drawing a circle with two half-arcs var d = layer._empty() ? 'M0 0' : 'M' + (p.x - r) + ',' + p.y + - arc + (r * 2) + ',0 ' + + arc + (r * 2) + ',0 ' + arc + (-r * 2) + ',0 '; this._setPath(layer, d); diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js index fcca466c091..dff5069066b 100644 --- a/src/map/handler/Map.BoxZoom.js +++ b/src/map/handler/Map.BoxZoom.js @@ -83,7 +83,7 @@ L.Map.BoxZoom = L.Handler.extend({ }, _onMouseUp: function (e) { - if ((e.which !== 1) && (e.button !== 1)) { return false; } + if ((e.which !== 1) && (e.button !== 1)) { return; } this._finish(); diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js index 214696a302b..bc0b27e6e06 100644 --- a/src/map/handler/Map.Tap.js +++ b/src/map/handler/Map.Tap.js @@ -48,7 +48,7 @@ L.Map.Tap = L.Handler.extend({ this._simulateEvent('contextmenu', first); } }, this), 1000); - + this._simulateEvent('mousedown', first); L.DomEvent.on(document, { @@ -73,7 +73,7 @@ L.Map.Tap = L.Handler.extend({ if (el && el.tagName && el.tagName.toLowerCase() === 'a') { L.DomUtil.removeClass(el, 'leaflet-active'); } - + this._simulateEvent('mouseup', first); // simulate click if the touch didn't move too much From d145b1fdba3de29200b1e8e0215eff71545c91eb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 28 Jan 2015 19:32:27 +0200 Subject: [PATCH 1318/2207] fix a bunch of eslint warnings in the spec suite --- spec/suites/SpecHelper.js | 2 +- spec/suites/core/EventsSpec.js | 6 +++--- spec/suites/core/UtilSpec.js | 5 +++-- spec/suites/geo/LatLngSpec.js | 1 - spec/suites/layer/LayerGroupSpec.js | 2 +- spec/suites/layer/marker/MarkerSpec.js | 14 +++++++------- spec/suites/layer/tile/GridLayerSpec.js | 11 ++++++----- spec/suites/layer/vector/CircleMarkerSpec.js | 14 +++++++------- 8 files changed, 28 insertions(+), 27 deletions(-) diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index cabff4b2d31..1e5256b02a8 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -1,4 +1,5 @@ if (!Array.prototype.map) { + /*eslint no-extend-native:0*/ Array.prototype.map = function (fun /*, thisp */) { "use strict"; @@ -7,7 +8,6 @@ if (!Array.prototype.map) { } var t = Object(this); - // jshint bitwise: false var len = t.length >>> 0; if (typeof fun !== "function") { throw new TypeError(); diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js index 8af595a1cd3..72df55cccf9 100644 --- a/spec/suites/core/EventsSpec.js +++ b/spec/suites/core/EventsSpec.js @@ -14,7 +14,7 @@ describe('Events', function () { obj.addEventListener('test', spy1); obj.addEventListener('test', spy2); obj.addEventListener('other', spy3); - obj.addEventListener({ test: spy4, other: spy5 }); + obj.addEventListener({test: spy4, other: spy5}); // obj.addEventListener({'test other': spy6 }); expect(spy1.called).to.be(false); @@ -72,8 +72,8 @@ describe('Events', function () { obj.addEventListener('test', listener1); obj2.addEventListener('test', listener2, foo); - obj3.addEventListener({ test: listener3 }); - obj4.addEventListener({ test: listener4 }, foo); + obj3.addEventListener({test: listener3}); + obj4.addEventListener({test: listener4}, foo); obj.fireEvent('test', {baz: 1}); obj2.fireEvent('test', {baz: 2}); diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index a8e0199158b..ddd2e82df4d 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -40,9 +40,9 @@ describe('Util', function () { return this; }; - var fn2 = L.Util.bind(fn, { foo: 'bar' }); + var fn2 = L.Util.bind(fn, {foo: 'bar'}); - expect(fn2()).to.eql({ foo: 'bar' }); + expect(fn2()).to.eql({foo: 'bar'}); }); it('passes additional arguments to the bound function', function () { @@ -230,6 +230,7 @@ describe('Util', function () { describe('#isArray', function () { expect(L.Util.isArray([1, 2, 3])).to.be(true); + /*eslint no-array-constructor:0*/ expect(L.Util.isArray(new Array(1, 2, 3))).to.be(true); expect(L.Util.isArray('blabla')).to.be(false); expect(L.Util.isArray({0: 1, 1: 2})).to.be(false); diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js index c7de51db0b1..3b8bce0e403 100644 --- a/spec/suites/geo/LatLngSpec.js +++ b/spec/suites/geo/LatLngSpec.js @@ -117,4 +117,3 @@ describe('LatLng', function () { }); }); }); - diff --git a/spec/suites/layer/LayerGroupSpec.js b/spec/suites/layer/LayerGroupSpec.js index 21220f8e198..d157fafc9d8 100644 --- a/spec/suites/layer/LayerGroupSpec.js +++ b/spec/suites/layer/LayerGroupSpec.js @@ -58,7 +58,7 @@ it('iterates over all layers', function () { var lg = L.layerGroup(), marker = L.marker([0, 0]), - ctx = { foo: 'bar' }; + ctx = {foo: 'bar'}; lg.addLayer(marker); diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index a67e3343019..e709c6fc48f 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -48,11 +48,11 @@ describe("Marker", function () { }); it("changes the icon to another DivIcon", function () { - var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); + var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text'})}); map.addLayer(marker); var beforeIcon = marker._icon; - marker.setIcon(new L.DivIcon({html: 'Inner2Text' })); + marker.setIcon(new L.DivIcon({html: 'Inner2Text'})); var afterIcon = marker._icon; expect(beforeIcon).to.be(afterIcon); @@ -60,7 +60,7 @@ describe("Marker", function () { }); it("removes text when changing to a blank DivIcon", function () { - var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); + var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text'})}); map.addLayer(marker); marker.setIcon(new L.DivIcon()); @@ -70,7 +70,7 @@ describe("Marker", function () { }); it("changes a DivIcon to an image", function () { - var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); + var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text'})}); map.addLayer(marker); var oldIcon = marker._icon; @@ -92,7 +92,7 @@ describe("Marker", function () { map.addLayer(marker); var oldIcon = marker._icon; - marker.setIcon(new L.DivIcon({html: 'Inner1Text' })); + marker.setIcon(new L.DivIcon({html: 'Inner1Text'})); expect(oldIcon).to.not.be(marker._icon); expect(oldIcon.parentNode).to.be(null); @@ -102,7 +102,7 @@ describe("Marker", function () { }); it("reuses the icon/shadow when changing icon", function () { - var marker = new L.Marker([0, 0], { icon: icon1}); + var marker = new L.Marker([0, 0], {icon: icon1}); map.addLayer(marker); var oldIcon = marker._icon; var oldShadow = marker._shadow; @@ -120,7 +120,7 @@ describe("Marker", function () { describe("#setLatLng", function () { it("fires a move event", function () { - var marker = new L.Marker([0, 0], { icon: icon1 }); + var marker = new L.Marker([0, 0], {icon: icon1}); map.addLayer(marker); var beforeLatLng = marker._latlng; diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index d5cfdfe844c..06c5f0668b4 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -202,11 +202,12 @@ describe('GridLayer', function () { }); describe("when a tilelayer is removed from a map", function () { it("has its zoomlevels updated to only fit the layers it currently has", function () { - var tiles = [ L.gridLayer({minZoom: 10, maxZoom: 15}).addTo(map), - L.gridLayer({minZoom: 5, maxZoom: 10}).addTo(map), - L.gridLayer({minZoom: 10, maxZoom: 20}).addTo(map), - L.gridLayer({minZoom: 0, maxZoom: 25}).addTo(map) - ]; + var tiles = [ + L.gridLayer({minZoom: 10, maxZoom: 15}).addTo(map), + L.gridLayer({minZoom: 5, maxZoom: 10}).addTo(map), + L.gridLayer({minZoom: 10, maxZoom: 20}).addTo(map), + L.gridLayer({minZoom: 0, maxZoom: 25}).addTo(map) + ]; map.whenReady(function () { expect(map.getMinZoom()).to.be(0); expect(map.getMaxZoom()).to.be(25); diff --git a/spec/suites/layer/vector/CircleMarkerSpec.js b/spec/suites/layer/vector/CircleMarkerSpec.js index 81a712eda87..11094392da1 100644 --- a/spec/suites/layer/vector/CircleMarkerSpec.js +++ b/spec/suites/layer/vector/CircleMarkerSpec.js @@ -8,7 +8,7 @@ describe("when a CircleMarker is added to the map ", function () { describe("with a radius set as an option", function () { it("takes that radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }).addTo(map); + var marker = L.circleMarker([0, 0], {radius: 20}).addTo(map); expect(marker._radius).to.be(20); }); @@ -16,7 +16,7 @@ describe("and radius is set before adding it", function () { it("takes that radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); + var marker = L.circleMarker([0, 0], {radius: 20}); marker.setRadius(15); marker.addTo(map); expect(marker._radius).to.be(15); @@ -25,7 +25,7 @@ describe("and radius is set after adding it", function () { it("takes that radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); + var marker = L.circleMarker([0, 0], {radius: 20}); marker.addTo(map); marker.setRadius(15); expect(marker._radius).to.be(15); @@ -34,16 +34,16 @@ describe("and setStyle is used to change the radius after adding", function () { it("takes the given radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); + var marker = L.circleMarker([0, 0], {radius: 20}); marker.addTo(map); - marker.setStyle({ radius: 15 }); + marker.setStyle({radius: 15}); expect(marker._radius).to.be(15); }); }); describe("and setStyle is used to change the radius before adding", function () { it("takes the given radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); - marker.setStyle({ radius: 15 }); + var marker = L.circleMarker([0, 0], {radius: 20}); + marker.setStyle({radius: 15}); marker.addTo(map); expect(marker._radius).to.be(15); }); From aeb508317065578eef21fb4a4ef43be3c63994c0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 28 Jan 2015 19:33:45 +0200 Subject: [PATCH 1319/2207] complete the switch to ESLint --- Jakefile.js | 12 ++++++------ build/eslintrc.json | 28 ++++++++++++++++++++++++++++ build/hintrc.js | 40 ---------------------------------------- package.json | 31 +------------------------------ spec/eslintrc.json | 37 +++++++++++++++++++++++++++++++++++++ src/core/Class.js | 1 - src/dom/DomUtil.js | 1 - src/geometry/LineUtil.js | 2 -- src/geometry/PolyUtil.js | 2 -- 9 files changed, 72 insertions(+), 82 deletions(-) create mode 100644 build/eslintrc.json delete mode 100644 build/hintrc.js create mode 100644 spec/eslintrc.json diff --git a/Jakefile.js b/Jakefile.js index 1e3599c9152..dcb73dfc48c 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -15,10 +15,10 @@ For a custom build, open build/build.html in the browser and follow the instruct var build = require('./build/build.js'), version = require('./src/Leaflet.js').version; -function hint(msg, paths) { +function hint(msg, args) { return function () { console.log(msg); - jake.exec('node node_modules/jshint/bin/jshint -c ' + paths, + jake.exec('node node_modules/eslint/bin/eslint.js ' + args, {printStdout: true}, function () { console.log('\tCheck passed.\n'); complete(); @@ -26,11 +26,11 @@ function hint(msg, paths) { }; } -desc('Check Leaflet source for errors with JSHint'); -task('lint', {async: true}, hint('Checking for JS errors...', 'build/hintrc.js src')); +desc('Check Leaflet source for errors with ESLint'); +task('lint', {async: true}, hint('Checking for JS errors...', 'src --config build/eslintrc.json')); -desc('Check Leaflet specs source for errors with JSHint'); -task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/spec.hintrc.js spec/suites')); +desc('Check Leaflet specs source for errors with ESLint'); +task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/suites --config spec/eslintrc.json')); desc('Combine and compress Leaflet source files'); task('build', {async: true}, function (compsBase32, buildName) { diff --git a/build/eslintrc.json b/build/eslintrc.json new file mode 100644 index 00000000000..19e75a8f7bc --- /dev/null +++ b/build/eslintrc.json @@ -0,0 +1,28 @@ +{ + "rules": { + "camelcase": 2, + "quotes": [2, "single"], + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "space-after-function-name": 2, + "space-in-parens": 2, + "space-in-brackets": 2, + "space-before-blocks": 2, + "space-after-keywords": 2, + "no-lonely-if": 2, + "comma-style": 2, + "no-underscore-dangle": 0, + "no-constant-condition": 0, + "no-multi-spaces": 0, + "strict": 0, + "key-spacing": 0, + "no-shadow": 0 + }, + "globals": { + "L": true, + "module": false, + "define": false + }, + "env": { + "browser": true + } +} diff --git a/build/hintrc.js b/build/hintrc.js deleted file mode 100644 index 596aeafe6ee..00000000000 --- a/build/hintrc.js +++ /dev/null @@ -1,40 +0,0 @@ -{ - // environment - "browser": true, - "node": true, - "globals": { - "L": true, - "define": true - }, - "strict": false, - "es3": true, - - // code style - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "forin": false, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "undef": true, - "unused": true, - "quotmark": "single", - - // whitespace - "indent": 4, - "trailing": true, - "white": true, - "smarttabs": true, - "maxlen": 120 - - // code simplicity - not enforced but nice to check from time to time - // "maxstatements": 20, - // "maxcomplexity": 5 - // "maxparams": 4, - // "maxdepth": 4 -} diff --git a/package.json b/package.json index 7fd0e73d2a7..af41f9d81b2 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,6 @@ "eslint": "^0.13.0", "happen": "~0.1.3", "jake": "~8.0.10", - "jshint": "~2.6.0", "karma": "~0.12.31", "karma-chrome-launcher": "^0.1.7", "karma-coverage": "~0.2.7", @@ -39,33 +38,5 @@ "type": "BSD-2-Clause", "url": "https://github.com/Leaflet/Leaflet/blob/master/LICENSE" } - ], - "eslintConfig": { - "rules": { - "camelcase": 2, - "quotes": [2, "single"], - "no-mixed-spaces-and-tabs": [2, "smart-tabs"], - "space-after-function-name": 2, - "space-in-parens": 2, - "space-in-brackets": 2, - "space-before-blocks": 2, - "space-after-keywords": 2, - "no-lonely-if": 2, - "comma-style": 2, - "no-underscore-dangle": 0, - "no-constant-condition": 0, - "no-multi-spaces": 0, - "strict": 0, - "key-spacing": 0, - "no-shadow": 0 - }, - "globals": { - "L": true, - "module": false, - "define": false - }, - "env": { - "browser": true - } - } + ] } diff --git a/spec/eslintrc.json b/spec/eslintrc.json new file mode 100644 index 00000000000..32b81cc5080 --- /dev/null +++ b/spec/eslintrc.json @@ -0,0 +1,37 @@ +{ + "rules": { + "camelcase": 2, + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "space-after-function-name": 2, + "space-in-parens": 2, + "space-in-brackets": 2, + "space-before-blocks": 2, + "space-after-keywords": 2, + "no-lonely-if": 2, + "comma-style": 2, + "no-unused-vars": 0, + "quotes": 0, + "no-underscore-dangle": 0, + "no-constant-condition": 0, + "no-multi-spaces": 0, + "strict": 0, + "key-spacing": 0, + "no-shadow": 0, + "no-irregular-whitespace": 0 + }, + "globals": { + "L": true, + "module": false, + "define": false, + "expect": false, + "it": false, + "describe": false, + "sinon": false, + "happen": false, + "beforeEach": false, + "afterEach": false + }, + "env": { + "browser": true + } +} diff --git a/src/core/Class.js b/src/core/Class.js index c2d74cb2be8..c7a18ab4a67 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -19,7 +19,6 @@ L.Class.extend = function (props) { this.callInitHooks(); }; - // jshint camelcase: false var parentProto = NewClass.__super__ = this.prototype; var proto = L.Util.create(parentProto); diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index af0600fdc83..a9c1ea14fcf 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -161,7 +161,6 @@ L.DomUtil = { // this method is only used for elements previously positioned using setPosition, // so it's safe to cache the position for performance - // jshint camelcase: false return el._leaflet_pos; } }; diff --git a/src/geometry/LineUtil.js b/src/geometry/LineUtil.js index 6268f3fbf42..8948c471b32 100644 --- a/src/geometry/LineUtil.js +++ b/src/geometry/LineUtil.js @@ -3,8 +3,6 @@ * and polylines (clipping, simplification, distances, etc.) */ -/*jshint bitwise:false */ // allow bitwise operations for this file - L.LineUtil = { // Simplify polyline with vertex reduction and Douglas-Peucker simplification. diff --git a/src/geometry/PolyUtil.js b/src/geometry/PolyUtil.js index 68aa36d8102..37316e4a6de 100644 --- a/src/geometry/PolyUtil.js +++ b/src/geometry/PolyUtil.js @@ -2,8 +2,6 @@ * L.PolyUtil contains utility functions for polygons (clipping, etc.). */ -/*jshint bitwise:false */ // allow bitwise operations here - L.PolyUtil = {}; /* From 22cfd12956f6dcf4e3f5d3e2ee34b8046bdf1fe4 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 12 Jan 2015 17:42:29 -0800 Subject: [PATCH 1320/2207] Fade tiles with requestAnimationFrame rather than CSS --- dist/leaflet.css | 2 - src/layer/tile/GridLayer.js | 81 ++++++++++++++++++++++++------------- 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 0d6f2dff177..05e2bb2e5d7 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -139,7 +139,6 @@ /* zoom and fade animations */ -.leaflet-fade-anim .leaflet-tile, .leaflet-fade-anim .leaflet-popup { opacity: 0; -webkit-transition: opacity 0.2s linear; @@ -147,7 +146,6 @@ -o-transition: opacity 0.2s linear; transition: opacity 0.2s linear; } -.leaflet-fade-anim .leaflet-tile-loaded, .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { opacity: 1; } diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 052c95b658c..578e41ded69 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -149,13 +149,32 @@ L.GridLayer = L.Layer.extend({ _updateOpacity: function () { var opacity = this.options.opacity; - if (L.Browser.ielt9) { - // IE doesn't inherit filter opacity properly, so we're forced to set it on tiles - for (var i in this._tiles) { - L.DomUtil.setOpacity(this._tiles[i].el, opacity); - } - } else { + // IE doesn't inherit filter opacity properly, so we're forced to set it on tiles + if (!L.Browser.ielt9 && !this._map._fadeAnimated) { L.DomUtil.setOpacity(this._container, opacity); + return; + } + + var now = +new Date(), + nextFrame = false; + + for (var key in this._tiles) { + var tile = this._tiles[key]; + if (!tile.loaded || tile.active) { continue; } + + var fade = Math.min(1, (now - tile.loaded) / 200); + if (fade < 1) { + L.DomUtil.setOpacity(tile.el, opacity * fade); + nextFrame = true; + } else { + L.DomUtil.setOpacity(tile.el, opacity); + tile.active = true; + this._pruneTiles(); + } + } + + if (nextFrame) { + L.Util.requestAnimFrame(this._updateOpacity, this); } }, @@ -194,6 +213,18 @@ L.GridLayer = L.Layer.extend({ this._level = level; + if (this._map._fadeAnimated) { + var now = +new Date(); + for (var key in this._tiles) { + var tile = this._tiles[key]; + if (tile.loaded && this._keyToTileCoords(key).z === zoom) { + tile.active = false; + tile.loaded = now; + } + } + this._updateOpacity(); + } + return level; }, @@ -204,7 +235,7 @@ L.GridLayer = L.Layer.extend({ var bounds = this._map.getBounds(), z = this._tileZoom, range = this._getTileRange(bounds, z), - i, j, key, tile, found; + i, j, key, tile; for (key in this._tiles) { this._tiles[key].retain = false; @@ -216,26 +247,19 @@ L.GridLayer = L.Layer.extend({ key = i + ':' + j + ':' + z; tile = this._tiles[key]; - if (!tile) { continue; } - tile.retain = true; + if ((!tile || !tile.active) && !this._retainParent(i, j, z, z - 5)) { + this._retainChildren(i, j, z, z + 2); + } - if (!tile.loaded) { - found = this._retainParent(i, j, z, z - 5); - if (!found) { this._retainChildren(i, j, z, z + 2); } + if (tile) { + tile.retain = true; } } } for (key in this._tiles) { - tile = this._tiles[key]; - if (!tile.retain) { - if (!tile.loaded) { - this._removeTile(key); - } else if (this._map._fadeAnimated) { - setTimeout(L.bind(this._deferRemove, this, key), 250); - } else { - this._removeTile(key); - } + if (!this._tiles[key].retain) { + this._removeTile(key); } } }, @@ -246,13 +270,6 @@ L.GridLayer = L.Layer.extend({ } }, - _deferRemove: function (key) { - var tile = this._tiles[key]; - if (tile && !tile.retain) { - this._removeTile(key); - } - }, - _retainParent: function (x, y, z, minZoom) { var x2 = Math.floor(x / 2), y2 = Math.floor(y / 2), @@ -555,7 +572,13 @@ L.GridLayer = L.Layer.extend({ tile = this._tiles[key]; if (!tile) { return; } - tile.loaded = true; + tile.loaded = +new Date(); + if (this._map._fadeAnimated) { + L.Util.requestAnimFrame(this._updateOpacity, this); + } else { + tile.active = true; + } + this._pruneTiles(); L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); From bbf32ebfcdb0d24d187dbb54eecbea367fd7b72d Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 14 Jan 2015 15:17:55 -0800 Subject: [PATCH 1321/2207] Begin tile loading and fading during zoom animation --- src/layer/tile/GridLayer.js | 59 +++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 578e41ded69..328ecc3c0f8 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -34,7 +34,7 @@ L.GridLayer = L.Layer.extend({ this._levels = {}; this._tiles = {}; - this._reset(); + this._viewReset(); this._update(); }, @@ -99,13 +99,13 @@ L.GridLayer = L.Layer.extend({ getEvents: function () { var events = { - viewreset: this._reset, - moveend: this._update + viewreset: this._viewReset, + moveend: this._move }; if (!this.options.updateWhenIdle) { // update tiles on move, but not more often than once per given interval - events.move = L.Util.throttle(this._update, this.options.updateInterval, this); + events.move = L.Util.throttle(this._move, this.options.updateInterval, this); } if (this._zoomAnimated) { @@ -192,7 +192,8 @@ L.GridLayer = L.Layer.extend({ }, _updateLevels: function () { - var zoom = this._tileZoom; + var zoom = this._tileZoom, + offset; for (var z in this._levels) { this._levels[z].el.style.zIndex = -Math.abs(zoom - z); @@ -209,6 +210,9 @@ L.GridLayer = L.Layer.extend({ level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); level.zoom = zoom; + + this._setZoomTransform(level, map.getCenter(), map.getZoom()); + offset = level.el.offsetWidth; // Force recalculation to trigger transitions. } this._level = level; @@ -307,22 +311,30 @@ L.GridLayer = L.Layer.extend({ } }, - _reset: function (e) { - var map = this._map, - zoom = map.getZoom(), - tileZoom = Math.round(zoom), - tileZoomChanged = this._tileZoom !== tileZoom; + _viewReset: function (e) { + var map = this._map; + this._reset(map.getCenter(), map.getZoom(), e && e.hard); + }, + + _animateZoom: function (e) { + this._reset(e.center, e.zoom); + }, - if (tileZoomChanged || (e && e.hard)) { + _reset: function (center, zoom, hard) { + var tileZoom = Math.round(zoom), + tileZoomChanged = this._tileZoom !== tileZoom; + + if (tileZoomChanged || hard) { if (this._abortLoading) { this._abortLoading(); } this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); + this._update(center, zoom); } - this._setZoomTransforms(map.getCenter(), zoom); + this._setZoomTransforms(center, zoom); }, _setZoomTransforms: function (center, zoom) { @@ -364,8 +376,14 @@ L.GridLayer = L.Layer.extend({ return this.options.tileSize; }, - _update: function () { - if (!this._map) { return; } + _move: function () { + this._update(); + }, + + _update: function (center, zoom) { + + var map = this._map; + if (!map) { return; } // TODO move to reset // var zoom = this._map.getZoom(); @@ -373,7 +391,14 @@ L.GridLayer = L.Layer.extend({ // if (zoom > this.options.maxZoom || // zoom < this.options.minZoom) { return; } - var bounds = this._map.getBounds(); + if (center === undefined) { center = map.getCenter(); } + if (zoom === undefined) { zoom = map.getZoom(); } + + var topLeftPoint = map._getNewPixelOrigin(center, zoom).subtract(map._getMapPanePos()), + pixelBounds = new L.Bounds(topLeftPoint, topLeftPoint.add(map.getSize())), + sw = map.unproject(pixelBounds.getBottomLeft(), zoom), + ne = map.unproject(pixelBounds.getTopRight(), zoom), + bounds = new L.LatLngBounds(sw, ne); if (this.options.unloadInvisibleTiles) { this._removeOtherTiles(bounds); @@ -611,10 +636,6 @@ L.GridLayer = L.Layer.extend({ bounds.max.divideBy(this._tileSize).ceil().subtract([1, 1])); }, - _animateZoom: function (e) { - this._setZoomTransforms(e.center, e.zoom); - }, - _noTilesToLoad: function () { for (var key in this._tiles) { if (!this._tiles[key].loaded) { return false; } From e7a7bfc9eabf612934aa2a78b29f6a2928ca7000 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 28 Jan 2015 19:45:56 +0200 Subject: [PATCH 1322/2207] fix build --- src/layer/tile/GridLayer.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 328ecc3c0f8..db92892fc73 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -192,8 +192,7 @@ L.GridLayer = L.Layer.extend({ }, _updateLevels: function () { - var zoom = this._tileZoom, - offset; + var zoom = this._tileZoom; for (var z in this._levels) { this._levels[z].el.style.zIndex = -Math.abs(zoom - z); @@ -212,7 +211,7 @@ L.GridLayer = L.Layer.extend({ level.zoom = zoom; this._setZoomTransform(level, map.getCenter(), map.getZoom()); - offset = level.el.offsetWidth; // Force recalculation to trigger transitions. + L.Util.falseFn(level.el.offsetWidth); // Force recalculation to trigger transitions. } this._level = level; From a2d0dfcf892035e1f7dce0f8a2cbc44002cecb82 Mon Sep 17 00:00:00 2001 From: Martijn Grendelman Date: Thu, 29 Jan 2015 00:06:03 +0100 Subject: [PATCH 1323/2207] Add Leaflet.Liveupdate and Leaflet.Messagebox to the plugins list --- plugins.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins.md b/plugins.md index 4cbc3aee2ab..fe530427822 100644 --- a/plugins.md +++ b/plugins.md @@ -1473,6 +1473,28 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s ICTS SOCIB + + + Leaflet.Liveupdate + + + Periodically ('live') update something on a map (Demo) + + + Martijn Grendelman + + + + + Leaflet.Messagebox + + + Display a temporary text message on a map (Demo) + + + Martijn Grendelman + + From adc5db9032c905ffea739cc195e1c8b954996138 Mon Sep 17 00:00:00 2001 From: Alexander Milevski Date: Thu, 29 Jan 2015 11:30:44 +0100 Subject: [PATCH 1324/2207] Update plugins.md --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index fe530427822..951ee70c45f 100644 --- a/plugins.md +++ b/plugins.md @@ -1495,6 +1495,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Martijn Grendelman + + + Leaflet.Path.Drag + + + Drag handler and interaction for polygons and polylines (Demo) + + + Alexander Milevski + + From bb19fc1bf8a66740ccfb721396d9cf97c19196dc Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 29 Jan 2015 11:21:22 -0800 Subject: [PATCH 1325/2207] Deterministic tile pruning Do not throttle _pruneTiles. Instead, when adding new tiles, prune tiles that are no longer needed immediately, and when a new tile finishes its fade animation, immediately prune just its parents/children. --- src/layer/tile/GridLayer.js | 138 +++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 65 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index db92892fc73..bf4304a4725 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -29,8 +29,6 @@ L.GridLayer = L.Layer.extend({ onAdd: function () { this._initContainer(); - this._pruneTiles = L.Util.throttle(this._pruneTiles, 200, this); - this._levels = {}; this._tiles = {}; @@ -169,7 +167,7 @@ L.GridLayer = L.Layer.extend({ } else { L.DomUtil.setOpacity(tile.el, opacity); tile.active = true; - this._pruneTiles(); + this._pruneTiles(this._keyToTileCoords(key)); } } @@ -231,39 +229,10 @@ L.GridLayer = L.Layer.extend({ return level; }, - _pruneTiles: function () { - - if (!this._map) { return; } - - var bounds = this._map.getBounds(), - z = this._tileZoom, - range = this._getTileRange(bounds, z), - i, j, key, tile; - - for (key in this._tiles) { - this._tiles[key].retain = false; - } - - for (i = range.min.x; i <= range.max.x; i++) { - for (j = range.min.y; j <= range.max.y; j++) { - - key = i + ':' + j + ':' + z; - tile = this._tiles[key]; - - if ((!tile || !tile.active) && !this._retainParent(i, j, z, z - 5)) { - this._retainChildren(i, j, z, z + 2); - } - - if (tile) { - tile.retain = true; - } - } - } - - for (key in this._tiles) { - if (!this._tiles[key].retain) { - this._removeTile(key); - } + _pruneTiles: function (coords) { + if (coords.z !== this._tileZoom) { return; } + if (!this._pruneParent(coords.x, coords.y, coords.z, coords.z - 5)) { + this._pruneChildren(coords.x, coords.y, coords.z, coords.z + 2); } }, @@ -292,6 +261,25 @@ L.GridLayer = L.Layer.extend({ return false; }, + _pruneParent: function (x, y, z, minZoom) { + var x2 = Math.floor(x / 2), + y2 = Math.floor(y / 2), + z2 = z - 1; + + var key = x2 + ':' + y2 + ':' + z2, + tile = this._tiles[key]; + + if (tile && tile.loaded) { + this._removeTile(key); + return true; + + } else if (z2 > minZoom) { + return this._pruneParent(x2, y2, z2, minZoom); + } + + return false; + }, + _retainChildren: function (x, y, z, maxZoom) { for (var i = 2 * x; i < 2 * x + 2; i++) { @@ -310,9 +298,30 @@ L.GridLayer = L.Layer.extend({ } }, + _pruneChildren: function (x, y, z, maxZoom) { + + for (var i = 2 * x; i < 2 * x + 2; i++) { + for (var j = 2 * y; j < 2 * y + 2; j++) { + + var key = i + ':' + j + ':' + (z + 1), + tile = this._tiles[key]; + + if (tile && tile.loaded) { + this._removeTile(key); + + } else if (z + 1 < maxZoom) { + this._pruneChildren(i, j, z + 1, maxZoom); + } + } + } + }, + _viewReset: function (e) { var map = this._map; this._reset(map.getCenter(), map.getZoom(), e && e.hard); + if (this.options.unloadInvisibleTiles) { + this._removeOtherTiles(map.getBounds()); + } }, _animateZoom: function (e) { @@ -395,32 +404,16 @@ L.GridLayer = L.Layer.extend({ var topLeftPoint = map._getNewPixelOrigin(center, zoom).subtract(map._getMapPanePos()), pixelBounds = new L.Bounds(topLeftPoint, topLeftPoint.add(map.getSize())), - sw = map.unproject(pixelBounds.getBottomLeft(), zoom), - ne = map.unproject(pixelBounds.getTopRight(), zoom), - bounds = new L.LatLngBounds(sw, ne); + queue = [], + key, + tileRange = this._pxBoundsToTileRange(pixelBounds), + tileCenter = tileRange.getCenter(), + j, i, coords; - if (this.options.unloadInvisibleTiles) { - this._removeOtherTiles(bounds); + for (key in this._tiles) { + this._tiles[key].retain = false; } - this._addTiles(bounds); - this._pruneTiles(); - }, - - // tile coordinates range for particular geo bounds and zoom - _getTileRange: function (bounds, zoom) { - var pxBounds = new L.Bounds( - this._map.project(bounds.getNorthWest(), zoom), - this._map.project(bounds.getSouthEast(), zoom)); - return this._pxBoundsToTileRange(pxBounds); - }, - - _addTiles: function (bounds) { - var queue = [], - tileRange = this._getTileRange(bounds, this._tileZoom), - center = tileRange.getCenter(), - j, i, coords; - // create a queue of coordinates to load tiles from for (j = tileRange.min.y; j <= tileRange.max.y; j++) { for (i = tileRange.min.x; i <= tileRange.max.x; i++) { @@ -428,16 +421,25 @@ L.GridLayer = L.Layer.extend({ coords = new L.Point(i, j); coords.z = this._tileZoom; - // add tile to queue if it's not in cache or out of bounds - if (!(this._tileCoordsToKey(coords) in this._tiles) && this._isValidTile(coords)) { + if (!this._isValidTile(coords)) { continue; } + + var tile = this._tiles[this._tileCoordsToKey(coords)]; + + if (tile) { + tile.retain = true; + } else { queue.push(coords); } + + if ((!tile || !tile.active) && !this._retainParent(i, j, coords.z, coords.z - 5)) { + this._retainChildren(i, j, coords.z, coords.z + 2); + } } } // sort tile queue to load tiles in order of their distance to center queue.sort(function (a, b) { - return a.distanceTo(center) - b.distanceTo(center); + return a.distanceTo(tileCenter) - b.distanceTo(tileCenter); }); if (queue.length !== 0) { @@ -455,6 +457,12 @@ L.GridLayer = L.Layer.extend({ this._level.el.appendChild(fragment); } + + for (key in this._tiles) { + if (!this._tiles[key].retain) { + this._removeTile(key); + } + } }, _isValidTile: function (coords) { @@ -572,7 +580,8 @@ L.GridLayer = L.Layer.extend({ // save tile in cache this._tiles[key] = { - el: tile + el: tile, + retain: true }; container.appendChild(tile); @@ -601,10 +610,9 @@ L.GridLayer = L.Layer.extend({ L.Util.requestAnimFrame(this._updateOpacity, this); } else { tile.active = true; + this._pruneTiles(coords); } - this._pruneTiles(); - L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); this.fire('tileload', { From 111d9a171de0fff102ff0962c0a2af377c77066f Mon Sep 17 00:00:00 2001 From: teastman Date: Sat, 31 Jan 2015 16:48:30 -0800 Subject: [PATCH 1326/2207] Added Leaflet.pattern to plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 4cbc3aee2ab..45229e12a30 100644 --- a/plugins.md +++ b/plugins.md @@ -497,6 +497,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s kartenkarsten + + + Leaflet.pattern + + Add support for pattern fills on Paths. + + Tyler Eastman + + From 7d90dc152e84f8d617ad348cad0c42e1d8f98e0c Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 29 Jan 2015 16:20:02 -0800 Subject: [PATCH 1327/2207] Clean up pixel bounds calculations --- src/layer/tile/GridLayer.js | 8 +++----- src/map/Map.js | 11 +++++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index bf4304a4725..67b427618fb 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -402,13 +402,11 @@ L.GridLayer = L.Layer.extend({ if (center === undefined) { center = map.getCenter(); } if (zoom === undefined) { zoom = map.getZoom(); } - var topLeftPoint = map._getNewPixelOrigin(center, zoom).subtract(map._getMapPanePos()), - pixelBounds = new L.Bounds(topLeftPoint, topLeftPoint.add(map.getSize())), - queue = [], - key, + var pixelBounds = map.getPixelBounds(center, zoom), tileRange = this._pxBoundsToTileRange(pixelBounds), tileCenter = tileRange.getCenter(), - j, i, coords; + queue = [], + key, j, i, coords; for (key in this._tiles) { this._tiles[key].retain = false; diff --git a/src/map/Map.js b/src/map/Map.js index 2165c39af12..0d5166f2e61 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -328,8 +328,8 @@ L.Map = L.Evented.extend({ return this._size.clone(); }, - getPixelBounds: function () { - var topLeftPoint = this._getTopLeftPoint(); + getPixelBounds: function (center, zoom) { + var topLeftPoint = this._getTopLeftPoint(center, zoom); return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); }, @@ -636,8 +636,11 @@ L.Map = L.Evented.extend({ return pos && !pos.equals([0, 0]); }, - _getTopLeftPoint: function () { - return this.getPixelOrigin().subtract(this._getMapPanePos()); + _getTopLeftPoint: function (center, zoom) { + var pixelOrigin = center && zoom !== undefined ? + this._getNewPixelOrigin(center, zoom) : + this.getPixelOrigin(); + return pixelOrigin.subtract(this._getMapPanePos()); }, _getNewPixelOrigin: function (center, zoom) { From 465cfbad293ee7067f9f39ec3eb50639ebe693be Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 30 Jan 2015 10:44:48 -0800 Subject: [PATCH 1328/2207] Remove opacity resetting on zoom of pre-existing tiles Now that we are fading during the zoom animation, this is no longer necessary. The zoom animation itself provides enough of a transition, and resetting the opacity can lead to more flickering than it solves. --- src/layer/tile/GridLayer.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 67b427618fb..057de55086d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -214,18 +214,6 @@ L.GridLayer = L.Layer.extend({ this._level = level; - if (this._map._fadeAnimated) { - var now = +new Date(); - for (var key in this._tiles) { - var tile = this._tiles[key]; - if (tile.loaded && this._keyToTileCoords(key).z === zoom) { - tile.active = false; - tile.loaded = now; - } - } - this._updateOpacity(); - } - return level; }, From fb6eda1fbe9b47bea0693c71ef13c69847da2e29 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Sat, 31 Jan 2015 10:10:38 +0200 Subject: [PATCH 1329/2207] don't request redundant fade in frames --- src/layer/tile/GridLayer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 057de55086d..6f4ec711d2a 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -172,7 +172,8 @@ L.GridLayer = L.Layer.extend({ } if (nextFrame) { - L.Util.requestAnimFrame(this._updateOpacity, this); + L.Util.cancelAnimFrame(this._fadeFrame); + this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); } }, From cbfbc883700f15e61dd41885c73b494cba32ade4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Sat, 31 Jan 2015 10:13:04 +0200 Subject: [PATCH 1330/2207] optimize DomUtil.setOpacity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V8 can’t optimize functions with try/catch inside --- src/dom/DomUtil.js | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index a9c1ea14fcf..489e9bee1be 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -100,27 +100,30 @@ L.DomUtil = { el.style.opacity = value; } else if ('filter' in el.style) { + L.DomUtil._setOpacityIE(el, value); + } + }, - var filter = false, - filterName = 'DXImageTransform.Microsoft.Alpha'; + _setOpacityIE: function (el, value) { + var filter = false, + filterName = 'DXImageTransform.Microsoft.Alpha'; - // filters collection throws an error if we try to retrieve a filter that doesn't exist - try { - filter = el.filters.item(filterName); - } catch (e) { - // don't set opacity to 1 if we haven't already set an opacity, - // it isn't needed and breaks transparent pngs. - if (value === 1) { return; } - } + // filters collection throws an error if we try to retrieve a filter that doesn't exist + try { + filter = el.filters.item(filterName); + } catch (e) { + // don't set opacity to 1 if we haven't already set an opacity, + // it isn't needed and breaks transparent pngs. + if (value === 1) { return; } + } - value = Math.round(value * 100); + value = Math.round(value * 100); - if (filter) { - filter.Enabled = (value !== 100); - filter.Opacity = value; - } else { - el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; - } + if (filter) { + filter.Enabled = (value !== 100); + filter.Opacity = value; + } else { + el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; } }, From 16b1b26116fe6735ecb4902491299c07ac5ebb48 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 2 Feb 2015 12:15:10 -0800 Subject: [PATCH 1331/2207] Adjust retention logic Continue to retain loaded-but-still-fading-in tiles, but also continue to look for loaded-and-active tiles. This reduces flicker on multiple rapid zoom actions. --- src/layer/tile/GridLayer.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 6f4ec711d2a..dd203bce90c 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -239,11 +239,15 @@ L.GridLayer = L.Layer.extend({ var key = x2 + ':' + y2 + ':' + z2, tile = this._tiles[key]; - if (tile && tile.loaded) { + if (tile && tile.active) { tile.retain = true; return true; - } else if (z2 > minZoom) { + } else if (tile && tile.loaded) { + tile.retain = true; + } + + if (z2 > minZoom) { return this._retainParent(x2, y2, z2, minZoom); } @@ -258,7 +262,7 @@ L.GridLayer = L.Layer.extend({ var key = x2 + ':' + y2 + ':' + z2, tile = this._tiles[key]; - if (tile && tile.loaded) { + if (tile && tile.active) { this._removeTile(key); return true; @@ -277,10 +281,15 @@ L.GridLayer = L.Layer.extend({ var key = i + ':' + j + ':' + (z + 1), tile = this._tiles[key]; - if (tile && tile.loaded) { + if (tile && tile.active) { tile.retain = true; + continue; - } else if (z + 1 < maxZoom) { + } else if (tile && tile.loaded) { + tile.retain = true; + } + + if (z + 1 < maxZoom) { this._retainChildren(i, j, z + 1, maxZoom); } } @@ -295,7 +304,7 @@ L.GridLayer = L.Layer.extend({ var key = i + ':' + j + ':' + (z + 1), tile = this._tiles[key]; - if (tile && tile.loaded) { + if (tile && tile.active) { this._removeTile(key); } else if (z + 1 < maxZoom) { From 4d119c9cdbb286733837c1d1b8efc0f1da5ca9fa Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 2 Feb 2015 12:31:46 -0800 Subject: [PATCH 1332/2207] Don't prune tiles during animated zoom Tiles around the border will not be necessary when the zoom completes, but need to be retained during the zoom. --- src/layer/tile/GridLayer.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index dd203bce90c..a021915ae26 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -323,10 +323,10 @@ L.GridLayer = L.Layer.extend({ }, _animateZoom: function (e) { - this._reset(e.center, e.zoom); + this._reset(e.center, e.zoom, false, true); }, - _reset: function (center, zoom, hard) { + _reset: function (center, zoom, hard, noPrune) { var tileZoom = Math.round(zoom), tileZoomChanged = this._tileZoom !== tileZoom; @@ -337,7 +337,7 @@ L.GridLayer = L.Layer.extend({ this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); - this._update(center, zoom); + this._update(center, zoom, noPrune); } this._setZoomTransforms(center, zoom); @@ -386,8 +386,7 @@ L.GridLayer = L.Layer.extend({ this._update(); }, - _update: function (center, zoom) { - + _update: function (center, zoom, noPrune) { var map = this._map; if (!map) { return; } @@ -454,6 +453,8 @@ L.GridLayer = L.Layer.extend({ this._level.el.appendChild(fragment); } + if (noPrune) { return; } + for (key in this._tiles) { if (!this._tiles[key].retain) { this._removeTile(key); From 602648111fbcc939dbba81faa6e0c25c6775c260 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 2 Feb 2015 13:46:15 -0800 Subject: [PATCH 1333/2207] Use rounded zoom level when calculating tile bounds --- src/layer/tile/GridLayer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index a021915ae26..6e24c77c0b0 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -337,7 +337,7 @@ L.GridLayer = L.Layer.extend({ this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); - this._update(center, zoom, noPrune); + this._update(center, tileZoom, noPrune); } this._setZoomTransforms(center, zoom); @@ -397,7 +397,7 @@ L.GridLayer = L.Layer.extend({ // zoom < this.options.minZoom) { return; } if (center === undefined) { center = map.getCenter(); } - if (zoom === undefined) { zoom = map.getZoom(); } + if (zoom === undefined) { zoom = Math.round(map.getZoom()); } var pixelBounds = map.getPixelBounds(center, zoom), tileRange = this._pxBoundsToTileRange(pixelBounds), @@ -414,7 +414,7 @@ L.GridLayer = L.Layer.extend({ for (i = tileRange.min.x; i <= tileRange.max.x; i++) { coords = new L.Point(i, j); - coords.z = this._tileZoom; + coords.z = zoom; if (!this._isValidTile(coords)) { continue; } From ddcfa5265a13311e40286d9ff1f0f283c22c2fe4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Feb 2015 15:25:22 +0200 Subject: [PATCH 1334/2207] less redundant opacity-changing frames --- src/layer/tile/GridLayer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 6e24c77c0b0..1f6482ac159 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -604,7 +604,8 @@ L.GridLayer = L.Layer.extend({ tile.loaded = +new Date(); if (this._map._fadeAnimated) { - L.Util.requestAnimFrame(this._updateOpacity, this); + L.Util.cancelAnimFrame(this._fadeFrame); + this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); } else { tile.active = true; this._pruneTiles(coords); From fc70a21884961a3cc2d9b498638abe4862a86b28 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 3 Feb 2015 14:05:03 -0800 Subject: [PATCH 1335/2207] Go back to non-incremental tile pruning algorithm --- src/layer/tile/GridLayer.js | 107 +++++++++++++----------------------- 1 file changed, 39 insertions(+), 68 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 1f6482ac159..c092c8b10f6 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -167,7 +167,7 @@ L.GridLayer = L.Layer.extend({ } else { L.DomUtil.setOpacity(tile.el, opacity); tile.active = true; - this._pruneTiles(this._keyToTileCoords(key)); + this._pruneTiles(); } } @@ -218,10 +218,28 @@ L.GridLayer = L.Layer.extend({ return level; }, - _pruneTiles: function (coords) { - if (coords.z !== this._tileZoom) { return; } - if (!this._pruneParent(coords.x, coords.y, coords.z, coords.z - 5)) { - this._pruneChildren(coords.x, coords.y, coords.z, coords.z + 2); + _pruneTiles: function () { + var key, tile; + + for (key in this._tiles) { + tile = this._tiles[key]; + tile.retain = tile.current; + } + + for (key in this._tiles) { + tile = this._tiles[key]; + if (tile.current && !tile.active) { + var coords = tile.coords; + if (!this._retainParent(coords.x, coords.y, coords.z, coords.z - 5)) { + this._retainChildren(coords.x, coords.y, coords.z, coords.z + 2); + } + } + } + + for (key in this._tiles) { + if (!this._tiles[key].retain) { + this._removeTile(key); + } } }, @@ -254,25 +272,6 @@ L.GridLayer = L.Layer.extend({ return false; }, - _pruneParent: function (x, y, z, minZoom) { - var x2 = Math.floor(x / 2), - y2 = Math.floor(y / 2), - z2 = z - 1; - - var key = x2 + ':' + y2 + ':' + z2, - tile = this._tiles[key]; - - if (tile && tile.active) { - this._removeTile(key); - return true; - - } else if (z2 > minZoom) { - return this._pruneParent(x2, y2, z2, minZoom); - } - - return false; - }, - _retainChildren: function (x, y, z, maxZoom) { for (var i = 2 * x; i < 2 * x + 2; i++) { @@ -296,24 +295,6 @@ L.GridLayer = L.Layer.extend({ } }, - _pruneChildren: function (x, y, z, maxZoom) { - - for (var i = 2 * x; i < 2 * x + 2; i++) { - for (var j = 2 * y; j < 2 * y + 2; j++) { - - var key = i + ':' + j + ':' + (z + 1), - tile = this._tiles[key]; - - if (tile && tile.active) { - this._removeTile(key); - - } else if (z + 1 < maxZoom) { - this._pruneChildren(i, j, z + 1, maxZoom); - } - } - } - }, - _viewReset: function (e) { var map = this._map; this._reset(map.getCenter(), map.getZoom(), e && e.hard); @@ -337,7 +318,10 @@ L.GridLayer = L.Layer.extend({ this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); - this._update(center, tileZoom, noPrune); + this._update(center, tileZoom); + if (!noPrune) { + this._pruneTiles(); + } } this._setZoomTransforms(center, zoom); @@ -384,9 +368,10 @@ L.GridLayer = L.Layer.extend({ _move: function () { this._update(); + this._pruneTiles(); }, - _update: function (center, zoom, noPrune) { + _update: function (center, zoom) { var map = this._map; if (!map) { return; } @@ -402,33 +387,26 @@ L.GridLayer = L.Layer.extend({ var pixelBounds = map.getPixelBounds(center, zoom), tileRange = this._pxBoundsToTileRange(pixelBounds), tileCenter = tileRange.getCenter(), - queue = [], - key, j, i, coords; + queue = []; - for (key in this._tiles) { - this._tiles[key].retain = false; + for (var key in this._tiles) { + this._tiles[key].current = false; } // create a queue of coordinates to load tiles from - for (j = tileRange.min.y; j <= tileRange.max.y; j++) { - for (i = tileRange.min.x; i <= tileRange.max.x; i++) { - - coords = new L.Point(i, j); + for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { + for (var i = tileRange.min.x; i <= tileRange.max.x; i++) { + var coords = new L.Point(i, j); coords.z = zoom; if (!this._isValidTile(coords)) { continue; } var tile = this._tiles[this._tileCoordsToKey(coords)]; - if (tile) { - tile.retain = true; + tile.current = true; } else { queue.push(coords); } - - if ((!tile || !tile.active) && !this._retainParent(i, j, coords.z, coords.z - 5)) { - this._retainChildren(i, j, coords.z, coords.z + 2); - } } } @@ -452,14 +430,6 @@ L.GridLayer = L.Layer.extend({ this._level.el.appendChild(fragment); } - - if (noPrune) { return; } - - for (key in this._tiles) { - if (!this._tiles[key].retain) { - this._removeTile(key); - } - } }, _isValidTile: function (coords) { @@ -578,7 +548,8 @@ L.GridLayer = L.Layer.extend({ // save tile in cache this._tiles[key] = { el: tile, - retain: true + coords: coords, + current: true }; container.appendChild(tile); @@ -608,7 +579,7 @@ L.GridLayer = L.Layer.extend({ this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); } else { tile.active = true; - this._pruneTiles(coords); + this._pruneTiles(); } L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); From ff679aa7dc7a6363fab5f867962d5e167f380b5f Mon Sep 17 00:00:00 2001 From: Jared Date: Fri, 6 Feb 2015 11:41:40 +1300 Subject: [PATCH 1336/2207] Do not render the stroke if the weight is explicitly set to 0 When rendering to SVG, if the weight is 0 the outline is not displayed. However, when rendering to canvas it will still display the outline. This change makes the behaviour consistent when rendering to either. --- src/layer/vector/Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 3de15af9e8e..ace5e00e12b 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -169,7 +169,7 @@ L.Canvas = L.Renderer.extend({ ctx.fill(options.fillRule || 'evenodd'); } - if (options.stroke) { + if (options.stroke && options.weight !== 0) { ctx.globalAlpha = clear ? 1 : options.opacity; // if clearing shape, do it with the previously drawn line width From a0ebbef0074001b8e8913bfa919a10788038ad53 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 5 Feb 2015 10:12:07 -0800 Subject: [PATCH 1337/2207] Don't adjust opacity for non-current tiles --- src/layer/tile/GridLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index c092c8b10f6..86b15ac5063 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -158,7 +158,7 @@ L.GridLayer = L.Layer.extend({ for (var key in this._tiles) { var tile = this._tiles[key]; - if (!tile.loaded || tile.active) { continue; } + if (!tile.current || !tile.loaded || tile.active) { continue; } var fade = Math.min(1, (now - tile.loaded) / 200); if (fade < 1) { From 8d9650552708cdd44b841c3b3beb0d84b9b830a1 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 5 Feb 2015 10:13:23 -0800 Subject: [PATCH 1338/2207] Remove src reset on removed tiles This is a performance hit on Chrome; no evidence it ever solved a real issue. (Ref #107) --- src/layer/tile/TileLayer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 9b0d9032921..c4a2f2b933a 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -110,7 +110,6 @@ L.TileLayer = L.GridLayer.extend({ _onTileRemove: function (e) { e.tile.onload = null; - e.tile.src = L.Util.emptyImageUrl; }, _getZoomForUrl: function () { From 6b67df023234186e70647334c381fd66e4838721 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Feb 2015 03:12:36 +0200 Subject: [PATCH 1339/2207] make animations significantly smoother with will-change --- dist/leaflet.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 05e2bb2e5d7..3c6cb616efb 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -139,6 +139,9 @@ /* zoom and fade animations */ +.leaflet-tile { + will-change: opacity; + } .leaflet-fade-anim .leaflet-popup { opacity: 0; -webkit-transition: opacity 0.2s linear; @@ -149,7 +152,9 @@ .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { opacity: 1; } - +.leaflet-zoom-animated { + will-change: transform; + } .leaflet-zoom-anim .leaflet-zoom-animated { -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); From 1d7c492bdd220c405ebfcf68daf639090b8b1e2d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Feb 2015 12:17:26 +0200 Subject: [PATCH 1340/2207] discard unneeded tile buffers --- src/layer/tile/GridLayer.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 86b15ac5063..f12336f95d0 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -191,10 +191,16 @@ L.GridLayer = L.Layer.extend({ }, _updateLevels: function () { - var zoom = this._tileZoom; + var zoom = this._tileZoom, + maxZoom = this.options.maxZoom; for (var z in this._levels) { - this._levels[z].el.style.zIndex = -Math.abs(zoom - z); + if (this._levels[z].el.children.length || z === zoom) { + this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); + } else { + L.DomUtil.remove(this._levels[z].el); + delete this._levels[z]; + } } var level = this._levels[zoom], @@ -204,7 +210,7 @@ L.GridLayer = L.Layer.extend({ level = this._levels[zoom] = {}; level.el = L.DomUtil.create('div', 'leaflet-tile-container leaflet-zoom-animated', this._container); - level.el.style.zIndex = 0; + level.el.style.zIndex = maxZoom; level.origin = map.project(map.unproject(map.getPixelOrigin()), zoom).round(); level.zoom = zoom; From e47c568a0d49b4e9644ed9294350e6d92cf63d8f Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 6 Feb 2015 15:50:24 -0800 Subject: [PATCH 1341/2207] Stricter selectors for will-change properties --- dist/leaflet.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 3c6cb616efb..e50e886c475 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -139,7 +139,7 @@ /* zoom and fade animations */ -.leaflet-tile { +.leaflet-fade-anim .leaflet-tile { will-change: opacity; } .leaflet-fade-anim .leaflet-popup { @@ -152,7 +152,7 @@ .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { opacity: 1; } -.leaflet-zoom-animated { +.leaflet-zoom-anim .leaflet-zoom-animated { will-change: transform; } .leaflet-zoom-anim .leaflet-zoom-animated { From 875ec02e5f511406dec8a51bc01034416f76d691 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 6 Feb 2015 15:51:20 -0800 Subject: [PATCH 1342/2207] Remove obsolete unloadInvisibleTiles option --- src/layer/tile/GridLayer.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index f12336f95d0..c2341a4a4a1 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -10,7 +10,6 @@ L.GridLayer = L.Layer.extend({ tileSize: 256, opacity: 1, - unloadInvisibleTiles: L.Browser.mobile, updateWhenIdle: L.Browser.mobile, updateInterval: 200, @@ -304,9 +303,6 @@ L.GridLayer = L.Layer.extend({ _viewReset: function (e) { var map = this._map; this._reset(map.getCenter(), map.getZoom(), e && e.hard); - if (this.options.unloadInvisibleTiles) { - this._removeOtherTiles(map.getBounds()); - } }, _animateZoom: function (e) { @@ -487,16 +483,6 @@ L.GridLayer = L.Layer.extend({ return coords; }, - // remove any present tiles that are off the specified bounds - _removeOtherTiles: function (bounds) { - for (var key in this._tiles) { - var tileBounds = this._keyToBounds(key); - if (!bounds.intersects(tileBounds)) { - this._removeTile(key); - } - } - }, - _removeTile: function (key) { var tile = this._tiles[key]; if (!tile) { return; } From 71c11987b59d996f9e28485a0629da27955402e3 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 6 Feb 2015 15:54:13 -0800 Subject: [PATCH 1343/2207] Ensure tiles have 0 opacity when first painted Fixes #3206 --- src/layer/tile/GridLayer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index c2341a4a4a1..7fa06dcb701 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -567,6 +567,7 @@ L.GridLayer = L.Layer.extend({ tile.loaded = +new Date(); if (this._map._fadeAnimated) { + L.DomUtil.setOpacity(tile.el, 0); L.Util.cancelAnimFrame(this._fadeFrame); this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); } else { From e52c5516522b33a424e9c6e75f2c01c637f4fe6b Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 6 Feb 2015 16:36:27 -0800 Subject: [PATCH 1344/2207] Remove trailing whitespace --- spec/suites/geometry/LineUtilSpec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/suites/geometry/LineUtilSpec.js b/spec/suites/geometry/LineUtilSpec.js index c8873e6a76b..c09ac761797 100644 --- a/spec/suites/geometry/LineUtilSpec.js +++ b/spec/suites/geometry/LineUtilSpec.js @@ -33,18 +33,18 @@ describe('LineUtil', function () { expect(segment).to.be(false); }); - + it('can round numbers in clipped bounds', function () { var a = new L.Point(4, 5); var b = new L.Point(8, 6); - + var segment1 = L.LineUtil.clipSegment(a, b, bounds); - + expect(segment1[0]).to.eql(new L.Point(5, 5.25)); expect(segment1[1]).to.eql(b); - + var segment2 = L.LineUtil.clipSegment(a, b, bounds, false, true); - + expect(segment2[0]).to.eql(new L.Point(5, 5)); expect(segment2[1]).to.eql(b); }); From 21701a6faef880403b7ecd80d3fa35ca814b3123 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 6 Feb 2015 16:36:43 -0800 Subject: [PATCH 1345/2207] Remove test specific to old zoom code --- spec/suites/layer/tile/GridLayerSpec.js | 26 ------------------------- 1 file changed, 26 deletions(-) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index 06c5f0668b4..1ca422796d6 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -104,32 +104,6 @@ describe('GridLayer', function () { map.setZoom(0, {animate: false}); clock.tick(250); }); - - it('prunes and retains the correct tiles for back-to-back zooms', function () { - map.setView([0, 0], 1); - - var grid = L.gridLayer(); - var tiles = {}; - - grid.createTile = function (coords) { - tiles[grid._tileCoordsToKey(coords)] = true; - return document.createElement('div'); - }; - - map.addLayer(grid); - clock.tick(500); - - map.setZoom(0, {animate: false}); - clock.tick(250); - - map.setZoom(1, {animate: false}); - clock.tick(500); - - var tileContainers = div.querySelectorAll('.leaflet-tile-container'); - expect(tileContainers.length).to.eql(2); - expect(tileContainers[0].childNodes.length).to.equal(8); - expect(tileContainers[1].childNodes.length).to.equal(0); - }); }); describe("#onAdd", function () { From a7fc9c9a5f40472ebc3da9364f7ef78b3f02c69f Mon Sep 17 00:00:00 2001 From: Asko Kauppi Date: Sun, 8 Feb 2015 17:06:16 +0200 Subject: [PATCH 1346/2207] two small typos I spotted during code read-through --- src/core/Util.js | 2 +- src/geo/crs/CRS.Earth.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Util.js b/src/core/Util.js index f052bd9a8bf..5927ef0177e 100644 --- a/src/core/Util.js +++ b/src/core/Util.js @@ -117,7 +117,7 @@ L.Util = { return obj.options; }, - // make an URL with GET parameters out of a set of properties/values + // make a URL with GET parameters out of a set of properties/values getParamString: function (obj, existingUrl, uppercase) { var params = []; for (var i in obj) { diff --git a/src/geo/crs/CRS.Earth.js b/src/geo/crs/CRS.Earth.js index b1fb4458a47..d6947501f9b 100644 --- a/src/geo/crs/CRS.Earth.js +++ b/src/geo/crs/CRS.Earth.js @@ -7,7 +7,7 @@ L.CRS.Earth = L.extend({}, L.CRS, { R: 6378137, - // distane between two geographical points using spherical law of cosines approximation + // distance between two geographical points using spherical law of cosines approximation distance: function (latlng1, latlng2) { var rad = Math.PI / 180, lat1 = latlng1.lat * rad, From 909205856f2dcff20314d9f89e7e95e1a29eb902 Mon Sep 17 00:00:00 2001 From: Mahmood Dehghan Date: Thu, 12 Feb 2015 21:11:21 +0330 Subject: [PATCH 1347/2207] Added Leaflet.NACCoordinates to plugins.md --- plugins.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 956b295a8ab..f4844f56ce7 100644 --- a/plugins.md +++ b/plugins.md @@ -1515,7 +1515,18 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Alexander Milevski - + + + Leaflet.NACCoordinates + + + Displays NAC coordinate of the mouse pointer on mouse move (Demo) + + + Mahmood Dehghan + + + From 5b3ba078bfeac93fc1a2ed8e3ec5d590baba5f6d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 13 Feb 2015 17:53:23 +0100 Subject: [PATCH 1348/2207] Do not try to remove drag class if marker as no icon Since 4c46abe7810272704cc1a7ce0ccfb84c45456791 it's possible to have a marker off the map with dragging still enabled. We want to be able to disable it in this situation too. --- spec/suites/layer/marker/MarkerSpec.js | 8 +++++++- src/layer/marker/Marker.Drag.js | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index e709c6fc48f..ec4e98e590e 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -41,10 +41,16 @@ describe("Marker", function () { expect(marker.dragging.enabled()).to.be(true); - map.removeLayer(marker); + map.removeLayer(marker); map.addLayer(marker); expect(marker.dragging.enabled()).to.be(true); + + map.removeLayer(marker); + // Dragging is still enabled, we should be able to disable it, + // even if marker is off the map. + marker.dragging.disable(); + map.addLayer(marker); }); it("changes the icon to another DivIcon", function () { diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js index 911fa852d39..c0d6629b7f6 100644 --- a/src/layer/marker/Marker.Drag.js +++ b/src/layer/marker/Marker.Drag.js @@ -30,7 +30,9 @@ L.Handler.MarkerDrag = L.Handler.extend({ dragend: this._onDragEnd }, this).disable(); - L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); + if (this._marker._icon) { + L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); + } }, moved: function () { From c5de3fcbb8e817721a68bda315eaeaa997e78c8a Mon Sep 17 00:00:00 2001 From: vsn4ik Date: Sat, 14 Feb 2015 15:12:44 +0300 Subject: [PATCH 1349/2207] Changed deprecated gem options on travis.yml and updated links on CONTRIBUTING.md --- .travis.yml | 4 ++-- CONTRIBUTING.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index dbbdb7ace69..a8a9d28f24b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ before_script: > test ${TRAVIS_BRANCH} = master || test ${TRAVIS_BRANCH} = stable && test ${TRAVIS_PULL_REQUEST} = false && - gem install --no-rdoc --no-ri --version 0.8.9 faraday && - gem install --no-rdoc --no-ri travis-artifacts || true + gem install --no-document --version 0.8.9 faraday && + gem install --no-document travis-artifacts || true after_success: > test ${TRAVIS_BRANCH} = master || test ${TRAVIS_BRANCH} = stable && diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 49c80cf6df6..b17605e663c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,7 @@ here are some tips for creating a helpful report that will make fixing it much e * Write a **descriptive, specific title**. Bad: *Problem with polylines*. Good: *Doing X in IE9 causes Z*. * Include **browser, OS and Leaflet version** info in the description. - * Create a **simple test case** that demonstrates the bug (e.g. using [JSFiddle](http://jsfiddle.net/)). + * Create a **simple test case** that demonstrates the bug (e.g. using [JSFiddle](http://jsfiddle.net/) or [JS Bin](http://jsbin.com/)). * Check whether the bug can be reproduced in **other browsers**. * Check if the bug occurs in the stable version, master, or both. * *Bonus tip:* if the bug only appears in the master version but the stable version is fine, @@ -125,7 +125,7 @@ From there you can click through folders/files to get details on their individua ## Improving Documentation The code of the live Leaflet website that contains all documentation and examples is located in the `gh-pages` branch -and is automatically generated from a set of HTML and Markdown files by [Jekyll](https://github.com/mojombo/jekyll). +and is automatically generated from a set of HTML and Markdown files by [Jekyll](http://jekyllrb.com/). The easiest way to make little improvements such as fixing typos without even leaving the browser is by editing one of the files with the online GitHub editor: From 03fb73ed22b94fd7669a383c4043dc5d832ea5b3 Mon Sep 17 00:00:00 2001 From: Julien SORET Date: Sun, 15 Feb 2015 21:18:44 +0100 Subject: [PATCH 1350/2207] Fix cursor when dragging is set to false. --- dist/leaflet.css | 6 +++--- src/map/handler/Map.Drag.js | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index e50e886c475..e1a19282a35 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -179,7 +179,7 @@ .leaflet-interactive { cursor: pointer; } -.leaflet-container { +.leaflet-grab { cursor: -webkit-grab; cursor: -moz-grab; } @@ -191,8 +191,8 @@ .leaflet-control { cursor: auto; } -.leaflet-dragging .leaflet-container, -.leaflet-dragging .leaflet-interactive { +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive { cursor: move; cursor: -webkit-grabbing; cursor: -moz-grabbing; diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 9980d4d3aea..e14b2e69057 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -35,10 +35,12 @@ L.Map.Drag = L.Handler.extend({ map.whenReady(this._onViewReset, this); } } + L.DomUtil.addClass(this._map._container, 'leaflet-grab'); this._draggable.enable(); }, removeHooks: function () { + L.DomUtil.removeClass(this._map._container, 'leaflet-grab'); this._draggable.disable(); }, From 3665045fc74aff0f4fa2cf11461aeff6994785ec Mon Sep 17 00:00:00 2001 From: paulovieira Date: Mon, 16 Feb 2015 11:30:16 +0000 Subject: [PATCH 1351/2207] update the url of the leaflet-tilejson plugin --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index f4844f56ce7..36aaef58ff7 100644 --- a/plugins.md +++ b/plugins.md @@ -555,7 +555,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - leaflet-tilejson + leaflet-tilejson Adds support for the TileJSON specification to Leaflet. From c8c436e42c7b644256750570f83f929fd6a9e28d Mon Sep 17 00:00:00 2001 From: Julien SORET Date: Tue, 17 Feb 2015 22:39:19 +0100 Subject: [PATCH 1352/2207] Add grabbing cursor to marker when dragged --- dist/leaflet.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index e1a19282a35..9e2d6d0dd23 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -192,7 +192,8 @@ cursor: auto; } .leaflet-dragging .leaflet-grab, -.leaflet-dragging .leaflet-grab .leaflet-interactive { +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { cursor: move; cursor: -webkit-grabbing; cursor: -moz-grabbing; From e39184bad25cb1bdadf14c7782e4b6c77bedd6ef Mon Sep 17 00:00:00 2001 From: Maxym Malynowsky Date: Fri, 20 Feb 2015 14:32:26 -0800 Subject: [PATCH 1353/2207] add Maptiks to list of plugins --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 36aaef58ff7..16666cf7851 100644 --- a/plugins.md +++ b/plugins.md @@ -1720,6 +1720,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Alexander Milevski + + + Maptiks + + + Analytics platform for web maps. Track map activities, layer load times, marker clicks, and more! + + + Sparkgeo + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From f02ccaa346085372ae165ae127e8a1b12bdbe4c9 Mon Sep 17 00:00:00 2001 From: Asko Kauppi Date: Sat, 21 Feb 2015 22:59:37 +0200 Subject: [PATCH 1354/2207] ;; --- debug/map/image-overlay.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debug/map/image-overlay.html b/debug/map/image-overlay.html index f1068092631..cb1360157ae 100644 --- a/debug/map/image-overlay.html +++ b/debug/map/image-overlay.html @@ -40,8 +40,8 @@ map.addLayer(overlay); overlay.on('dblclick',function (e) { - console.log('Double click on image.') - }) + console.log('Double click on image.'); + }); From b995cf902342ae39a47c9c4e4fcf1071aa22ca04 Mon Sep 17 00:00:00 2001 From: Asko Kauppi Date: Sat, 21 Feb 2015 23:01:58 +0200 Subject: [PATCH 1355/2207] to --- PLUGIN-GUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index dfd0ceded96..f7c35116c75 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -113,7 +113,7 @@ Function, method and property names should be in `camelCase`.
      Class names should be in `CapitalizedCamelCase`. If you have a lot of arguments in your function, consider accepting an options object instead -(putting default values where possible so that users don't need specify all of them): +(putting default values where possible so that users don't need to specify all of them): ```js // bad From 9ca67887351ea0af692b25fbc67b3b153697658e Mon Sep 17 00:00:00 2001 From: Alexei KLENIN Date: Sun, 22 Feb 2015 13:24:13 +0100 Subject: [PATCH 1356/2207] Add Leaflet.SmoothMarkerBouncing plugin on the list of available Leaflet plugins. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 16666cf7851..3abd331bfda 100644 --- a/plugins.md +++ b/plugins.md @@ -211,6 +211,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Maxime Hadjinlian + + + Leaflet.SmoothMarkerBouncing + + Smooth animation of marker bouncing for Leaflet. + + Alexei KLENIN + + Leaflet.TextPath From a9658d71785e71b59ef717baa995ba9a375423fe Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 26 Feb 2015 11:29:42 +0100 Subject: [PATCH 1357/2207] Use standard .eslintrc naming --- build/eslintrc.json => .eslintrc | 0 Jakefile.js | 4 ++-- spec/{eslintrc.json => .eslintrc} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename build/eslintrc.json => .eslintrc (100%) rename spec/{eslintrc.json => .eslintrc} (100%) diff --git a/build/eslintrc.json b/.eslintrc similarity index 100% rename from build/eslintrc.json rename to .eslintrc diff --git a/Jakefile.js b/Jakefile.js index dcb73dfc48c..62e9ed2dcac 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -27,10 +27,10 @@ function hint(msg, args) { } desc('Check Leaflet source for errors with ESLint'); -task('lint', {async: true}, hint('Checking for JS errors...', 'src --config build/eslintrc.json')); +task('lint', {async: true}, hint('Checking for JS errors...', 'src --config .eslintrc')); desc('Check Leaflet specs source for errors with ESLint'); -task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/suites --config spec/eslintrc.json')); +task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/suites --config spec/.eslintrc')); desc('Combine and compress Leaflet source files'); task('build', {async: true}, function (compsBase32, buildName) { diff --git a/spec/eslintrc.json b/spec/.eslintrc similarity index 100% rename from spec/eslintrc.json rename to spec/.eslintrc From cc260e3d1640030c264eefd478656a6fc32ed80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 26 Feb 2015 13:13:53 +0100 Subject: [PATCH 1358/2207] Add plugin Leaflet.TileLayer.PouchDBCached --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 3abd331bfda..4ab3fb7f21a 100644 --- a/plugins.md +++ b/plugins.md @@ -284,6 +284,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Indokreatif Teknologi + + + TileLayer.PouchDBCached + + A TileLayer which caches into PouchDB for transparent offline use. + + Iván Sánchez Ortega, + MazeMap + + Leaflet.Graticule From 4e21a3b54b72894d409891b622c9d495d79f0ec2 Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Thu, 26 Feb 2015 15:58:22 +0100 Subject: [PATCH 1359/2207] Update PLUGIN-GUIDE.md whitespace in plugin example --- PLUGIN-GUIDE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index f7c35116c75..742583d0063 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -168,12 +168,11 @@ You can add support for AMD/CommonJS loaders to your Leaflet plugin by following // define a Common JS module that relies on 'leaflet' } else if (typeof exports === 'object') { module.exports = factory(require('leaflet')); - } // attach your plugin to the global 'L' variable - if(typeof window !== 'undefined' && window.L){ - window.L.YourPlugin = factory(L); + if (typeof window !== 'undefined' && window.L) { + window.L.YourPlugin = factory(L); } }(function (L) { var MyLeafletPlugin = {}; From f1a14a5f4baeb1455f974f12a2a573b8e9d45b48 Mon Sep 17 00:00:00 2001 From: Sergey Voyteshonok Date: Thu, 26 Feb 2015 19:30:08 +0300 Subject: [PATCH 1360/2207] Added Spectrum4Leaflet plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 4ab3fb7f21a..c0e665f8f6b 100644 --- a/plugins.md +++ b/plugins.md @@ -536,6 +536,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Description Maintainer + + + Spectrum4Leaflet + + Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. + + SVoyt, ESTI MAP + + Proj4Leaflet From a7d7bedda77992b28f04a44ddc6e644711029fce Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Fri, 27 Feb 2015 15:15:16 +0100 Subject: [PATCH 1361/2207] Add a space to make comments look consistant And now back to real work. --- src/core/Class.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Class.js b/src/core/Class.js index c7a18ab4a67..e21a2420fbf 100644 --- a/src/core/Class.js +++ b/src/core/Class.js @@ -26,7 +26,7 @@ L.Class.extend = function (props) { NewClass.prototype = proto; - //inherit parent's statics + // inherit parent's statics for (var i in this) { if (this.hasOwnProperty(i) && i !== 'prototype') { NewClass[i] = this[i]; From 66654b94ebe0c235309dd6960e0e738ccfebe4c3 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 27 Feb 2015 17:23:30 +0100 Subject: [PATCH 1362/2207] Forward original event on drag --- src/dom/Draggable.js | 11 +++++++---- src/layer/marker/Marker.Drag.js | 7 ++++--- src/map/handler/Map.Drag.js | 6 +++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 2a6e9ff7388..2068667360c 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -99,13 +99,16 @@ L.Draggable = L.Evented.extend({ this._moving = true; L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); + var animationCallback = function () { + this._updatePosition(e); + }; + this._animRequest = L.Util.requestAnimFrame(animationCallback, this, true, this._dragStartTarget); }, - _updatePosition: function () { - this.fire('predrag'); + _updatePosition: function (e) { + this.fire('predrag', e); L.DomUtil.setPosition(this._element, this._newPos); - this.fire('drag'); + this.fire('drag', e); }, _onUp: function () { diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js index c0d6629b7f6..a28c99ef686 100644 --- a/src/layer/marker/Marker.Drag.js +++ b/src/layer/marker/Marker.Drag.js @@ -46,7 +46,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ .fire('dragstart'); }, - _onDrag: function () { + _onDrag: function (e) { var marker = this._marker, shadow = marker._shadow, iconPos = L.DomUtil.getPosition(marker._icon), @@ -58,10 +58,11 @@ L.Handler.MarkerDrag = L.Handler.extend({ } marker._latlng = latlng; + e.latlng = latlng; marker - .fire('move', {latlng: latlng}) - .fire('drag'); + .fire('move', e) + .fire('drag', e); }, _onDragEnd: function (e) { diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 9980d4d3aea..62ec3323c58 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -63,7 +63,7 @@ L.Map.Drag = L.Handler.extend({ } }, - _onDrag: function () { + _onDrag: function (e) { if (this._map.options.inertia) { var time = this._lastTime = +new Date(), pos = this._lastPos = this._draggable._absPos || this._draggable._newPos; @@ -78,8 +78,8 @@ L.Map.Drag = L.Handler.extend({ } this._map - .fire('move') - .fire('drag'); + .fire('move', e) + .fire('drag', e); }, _onViewReset: function () { From 1e4b82b990b38d8b14b1cac5d820ba96b9a27c7d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 27 Feb 2015 17:57:46 +0100 Subject: [PATCH 1363/2207] Cleaner syntax for event forwarding --- src/dom/Draggable.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 2068667360c..87c66280677 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -99,13 +99,12 @@ L.Draggable = L.Evented.extend({ this._moving = true; L.Util.cancelAnimFrame(this._animRequest); - var animationCallback = function () { - this._updatePosition(e); - }; - this._animRequest = L.Util.requestAnimFrame(animationCallback, this, true, this._dragStartTarget); + this._lastEvent = e; + this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); }, - _updatePosition: function (e) { + _updatePosition: function () { + var e = {originalEvent: this._lastEvent}; this.fire('predrag', e); L.DomUtil.setPosition(this._element, this._newPos); this.fire('drag', e); From 721cf6a6894d909739651665a5bd7227cce79691 Mon Sep 17 00:00:00 2001 From: Jake Wilson Date: Sat, 28 Feb 2015 20:48:14 -0700 Subject: [PATCH 1364/2207] Added ability to specify pane for vector layer creation, which will automatically create a renderer for that pane if one does not already exists. --- src/layer/vector/Renderer.js | 15 +++++++++++++-- src/map/Map.js | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index c45e885f011..5f11e93f3a4 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -64,7 +64,7 @@ L.Renderer = L.Layer.extend({ L.Map.include({ // used by each vector layer to decide which renderer to use getRenderer: function (layer) { - var renderer = layer.options.renderer || this.options.renderer || this._renderer; + var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer; if (!renderer) { renderer = this._renderer = (L.SVG && L.svg()) || (L.Canvas && L.canvas()); @@ -74,5 +74,16 @@ L.Map.include({ this.addLayer(renderer); } return renderer; - } + }, + + _getPaneRenderer: function (name) { + if (name == 'overlayPane' || typeof name === 'undefined') return false; + + var renderer = this._paneRenderers[name]; + if (typeof renderer === 'undefined') { + renderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name})); + this._paneRenderers[name] = renderer; + } + return renderer; + }, }); diff --git a/src/map/Map.js b/src/map/Map.js index 0d5166f2e61..7dc39816e1b 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -470,6 +470,7 @@ L.Map = L.Evented.extend({ _initPanes: function () { var panes = this._panes = {}; + this._paneRenderers = {}; this._mapPane = this.createPane('mapPane', this._container); From 8c30707e56ddbe501cedee6f195a047e44ee501a Mon Sep 17 00:00:00 2001 From: Jake Wilson Date: Sat, 28 Feb 2015 21:21:45 -0700 Subject: [PATCH 1365/2207] Fixed some code style issues. --- src/layer/vector/Renderer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 5f11e93f3a4..af0958a5a50 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -77,7 +77,9 @@ L.Map.include({ }, _getPaneRenderer: function (name) { - if (name == 'overlayPane' || typeof name === 'undefined') return false; + if (name == 'overlayPane' || typeof name == 'undefined') { + return false; + } var renderer = this._paneRenderers[name]; if (typeof renderer === 'undefined') { @@ -85,5 +87,5 @@ L.Map.include({ this._paneRenderers[name] = renderer; } return renderer; - }, + } }); From d0b5aada79ad5184cee8d200ed74db1621732643 Mon Sep 17 00:00:00 2001 From: Jake Wilson Date: Sat, 28 Feb 2015 21:26:20 -0700 Subject: [PATCH 1366/2207] Code consistency changes --- src/layer/vector/Renderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index af0958a5a50..a9183f11e43 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -77,12 +77,12 @@ L.Map.include({ }, _getPaneRenderer: function (name) { - if (name == 'overlayPane' || typeof name == 'undefined') { + if (name === 'overlayPane' || name === undefined) { return false; } var renderer = this._paneRenderers[name]; - if (typeof renderer === 'undefined') { + if (renderer === undefined) { renderer = (L.SVG && L.svg({pane: name})) || (L.Canvas && L.canvas({pane: name})); this._paneRenderers[name] = renderer; } From 954ef1cc10a80008b04241258f3be237f0197113 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Sun, 1 Mar 2015 12:01:28 +0200 Subject: [PATCH 1367/2207] add indent eslint rule and fix some whitespace --- .eslintrc | 1 + package.json | 2 +- src/core/Events.js | 4 ++-- src/layer/vector/Canvas.js | 2 +- src/map/handler/Map.Keyboard.js | 16 ++++++++-------- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.eslintrc b/.eslintrc index 19e75a8f7bc..c6678be8b01 100644 --- a/.eslintrc +++ b/.eslintrc @@ -10,6 +10,7 @@ "space-after-keywords": 2, "no-lonely-if": 2, "comma-style": 2, + "indent": [2, "tab"], "no-underscore-dangle": 0, "no-constant-condition": 0, "no-multi-spaces": 0, diff --git a/package.json b/package.json index af41f9d81b2..b6e4b128a69 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.1.0", - "eslint": "^0.13.0", + "eslint": "^0.15.1", "happen": "~0.1.3", "jake": "~8.0.10", "karma": "~0.12.31", diff --git a/src/core/Events.js b/src/core/Events.js index b01254887e2..6702d2ae43e 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -134,8 +134,8 @@ L.Evented = L.Class.extend({ events = this._events; if (events) { - var typeIndex = events[type + '_idx'], - i, len, listeners, id; + var typeIndex = events[type + '_idx'], + i, len, listeners, id; if (events[type]) { // make sure adding/removing listeners inside other listeners won't cause infinite loop diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index ace5e00e12b..6cf2f3568d8 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -114,7 +114,7 @@ L.Canvas = L.Renderer.extend({ len = parts.length, ctx = this._ctx; - if (!len) { return; } + if (!len) { return; } ctx.beginPath(); diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 789a50fb58e..51fbfdbc748 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -35,14 +35,14 @@ L.Map.Keyboard = L.Handler.extend({ } L.DomEvent.on(container, { - focus: this._onFocus, - blur: this._onBlur, - mousedown: this._onMouseDown + focus: this._onFocus, + blur: this._onBlur, + mousedown: this._onMouseDown }, this); this._map.on({ focus: this._addHooks, - blur: this._removeHooks + blur: this._removeHooks }, this); }, @@ -50,14 +50,14 @@ L.Map.Keyboard = L.Handler.extend({ this._removeHooks(); L.DomEvent.off(this._map._container, { - focus: this._onFocus, - blur: this._onBlur, - mousedown: this._onMouseDown + focus: this._onFocus, + blur: this._onBlur, + mousedown: this._onMouseDown }, this); this._map.off({ focus: this._addHooks, - blur: this._removeHooks + blur: this._removeHooks }, this); }, From f61a681c5607c9a7745877606e6560c135000cbd Mon Sep 17 00:00:00 2001 From: Asko Kauppi Date: Sun, 1 Mar 2015 22:51:04 +0200 Subject: [PATCH 1368/2207] fix 'jake' --- spec/suites/core/EventsSpec.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js index 72df55cccf9..2860ae534a3 100644 --- a/spec/suites/core/EventsSpec.js +++ b/spec/suites/core/EventsSpec.js @@ -358,15 +358,15 @@ describe('Events', function () { }); it("doesn't call listeners to events that have been removed", function () { - var obj = new L.Evented(), - spy = sinon.spy(); + var obj = new L.Evented(), + spy = sinon.spy(); - obj.once('test', spy, obj); - obj.off('test', spy, obj); + obj.once('test', spy, obj); + obj.off('test', spy, obj); - obj.fire('test'); + obj.fire('test'); - expect(spy.called).to.be(false); + expect(spy.called).to.be(false); }); it('works if called from a context that doesnt implement #Events', function () { From bb230d0ac266293ec3d87ab7e818ca9e33e9723e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Mar 2015 13:35:02 +0200 Subject: [PATCH 1369/2207] fix race condition in tests --- src/layer/tile/GridLayer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7fa06dcb701..d98994f3b90 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -552,6 +552,8 @@ L.GridLayer = L.Layer.extend({ }, _tileReady: function (coords, err, tile) { + if (!this._map) { return; } + if (err) { this.fire('tileerror', { error: err, From 4c8ffadf30067c619212ba7f10ac3e8699d041e4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Mar 2015 14:48:09 +0200 Subject: [PATCH 1370/2207] don't animate negligible touch movements, close #2519 --- src/map/handler/Map.TouchZoom.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 49120ddce8a..bb4ae01c155 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -80,9 +80,12 @@ L.Map.TouchZoom = L.Handler.extend({ } else { this._center = map.layerPointToLatLng(this._getTargetCenter()); } + this._zoom = map.getScaleZoom(this._scale); - map._animateZoom(this._center, this._zoom); + if (this._scale !== 1 || this._delta.x !== 0 || this._delta.y !== 0) { + map._animateZoom(this._center, this._zoom); + } }, _onTouchEnd: function () { From bbc3f2fab1297a2dd1487343528e7f5960c97bef Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Mar 2015 15:26:05 +0200 Subject: [PATCH 1371/2207] fix zoom anim freeze race condition, close #2693, close #2478 --- src/map/anim/Map.ZoomAnimation.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 085b26632c5..bd881c55fab 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -34,7 +34,15 @@ L.Map.include(!zoomAnimated ? {} : { this._panes.mapPane.appendChild(proxy); this.on('zoomanim', function (e) { + var prop = L.DomUtil.TRANSFORM, + transform = proxy.style[prop]; + L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); + + // workaround for case when transform is the same and so transitionend event is not fired + if (transform === proxy.style[prop] & this._animatingZoom) { + this._onZoomTransitionEnd(); + } }, this); this.on('load moveend', function () { From b149f2d7548d0daaeb01ed5a3f1ad04cb53c38e9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 14:39:47 +0200 Subject: [PATCH 1372/2207] Layer add/removeInteractiveTarget methods registers DOM elements for event delegation --- src/layer/Layer.js | 10 ++++++++++ src/map/Map.js | 8 ++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 32b2c44b58f..579d30b5c28 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -25,6 +25,16 @@ L.Layer = L.Evented.extend({ return this._map.getPane(name ? (this.options[name] || name) : this.options.pane); }, + addInteractiveTarget: function (targetEl) { + this._map._targets[L.stamp(targetEl)] = this; + return this; + }, + + removeInteractiveTarget: function (targetEl) { + delete this._map._targets[L.stamp(targetEl)]; + return this; + }, + _layerAdd: function (e) { var map = e.target; diff --git a/src/map/Map.js b/src/map/Map.js index 7dc39816e1b..1c111bf7549 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -557,6 +557,8 @@ L.Map = L.Evented.extend({ 'click dblclick mousedown mouseup mouseenter mouseleave mousemove contextmenu', this._handleMouseEvent, this); + this._targets = {}; + if (this.options.trackResize) { L.DomEvent[onOff](window, 'resize', this._onResize, this); } @@ -571,9 +573,11 @@ L.Map = L.Evented.extend({ _handleMouseEvent: function (e) { if (!this._loaded) { return; } - this._fireMouseEvent(this, e, + var target = this._targets[L.stamp(e.target || e.srcElement)]; + + this._fireMouseEvent(target || this, e, e.type === 'mouseenter' ? 'mouseover' : - e.type === 'mouseleave' ? 'mouseout' : e.type); + e.type === 'mouseleave' ? 'mouseout' : e.type, true); }, _fireMouseEvent: function (obj, e, type, propagate, latlng) { From 8e7bbff6d8552b2cffc3f3f1b4047b2e96a612a8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 14:40:20 +0200 Subject: [PATCH 1373/2207] switch SVG paths to new delegation API --- src/layer/vector/Path.js | 4 ---- src/layer/vector/SVG.js | 26 ++++---------------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 6247c997175..c305e51684b 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -74,10 +74,6 @@ L.Path = L.Layer.extend({ return this; }, - _fireMouseEvent: function (e, type) { - this._map._fireMouseEvent(this, e, type, true); - }, - _clickTolerance: function () { // used when doing hit detection for Canvas layers return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0); diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index d230d697e33..04599781f19 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -7,9 +7,6 @@ L.SVG = L.Renderer.extend({ _initContainer: function () { this._container = L.SVG.create('svg'); - this._paths = {}; - this._initEvents(); - // makes it possible to click through svg root; we'll reset it back in individual paths this._container.setAttribute('pointer-events', 'none'); }, @@ -54,15 +51,13 @@ L.SVG = L.Renderer.extend({ }, _addPath: function (layer) { - var path = layer._path; - this._container.appendChild(path); - this._paths[L.stamp(path)] = layer; + this._container.appendChild(layer._path); + layer.addInteractiveTarget(layer._path); }, _removePath: function (layer) { - var path = layer._path; - L.DomUtil.remove(path); - delete this._paths[L.stamp(path)]; + L.DomUtil.remove(layer._path); + layer.removeInteractiveTarget(layer._path); }, _updatePath: function (layer) { @@ -139,19 +134,6 @@ L.SVG = L.Renderer.extend({ _bringToBack: function (layer) { L.DomUtil.toBack(layer._path); - }, - - // TODO remove duplication with L.Map - _initEvents: function () { - L.DomEvent.on(this._container, 'click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu', - this._fireMouseEvent, this); - }, - - _fireMouseEvent: function (e) { - var path = this._paths[L.stamp(e.target || e.srcElement)]; - if (path) { - path._fireMouseEvent(e); - } } }); From 22c97d1b3356a34cd9df1381ca778388de46f2e7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 15:06:48 +0200 Subject: [PATCH 1374/2207] use new event delegation API in ImageOverlay --- src/layer/ImageOverlay.js | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 5862e96524d..fdd80496a11 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -26,13 +26,20 @@ L.ImageOverlay = L.Layer.extend({ } } + if (this.options.interactive) { + L.DomUtil.addClass(this._image, 'leaflet-interactive'); + this.addInteractiveTarget(this._image); + } + this.getPane().appendChild(this._image); - this._initInteraction(); this._reset(); }, onRemove: function () { L.DomUtil.remove(this._image); + if (this.options.interactive) { + this.removeInteractiveTarget(this._image); + } }, setOpacity: function (opacity) { @@ -65,19 +72,6 @@ L.ImageOverlay = L.Layer.extend({ return this; }, - _initInteraction: function () { - if (!this.options.interactive) { return; } - L.DomUtil.addClass(this._image, 'leaflet-interactive'); - L.DomEvent.on(this._image, 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu', - this._fireMouseEvent, this); - }, - - _fireMouseEvent: function (e, type) { - if (this._map) { - this._map._fireMouseEvent(this, e, type, true); - } - }, - setUrl: function (url) { this._url = url; From 34bc7fa4eaacdce5410eb9b17ec7e74706fe89fe Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 17 Nov 2014 18:35:31 +0200 Subject: [PATCH 1375/2207] switch markers to event delegation API --- src/layer/marker/Marker.js | 34 ++++++++-------------------------- src/map/Map.js | 34 ++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 309c89aab4d..575a318cd3c 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -123,11 +123,11 @@ L.Marker = L.Layer.extend({ this._icon = icon; this._initInteraction(); - if (L.DomEvent && options.riseOnHover) { - L.DomEvent.on(icon, { + if (options.riseOnHover) { + this.on({ mouseover: this._bringToFront, mouseout: this._resetZIndex - }, this); + }); } var newShadow = options.icon.createShadow(this._shadow), @@ -158,14 +158,15 @@ L.Marker = L.Layer.extend({ }, _removeIcon: function () { - if (L.DomEvent && this.options.riseOnHover) { - L.DomEvent.off(this._icon, { + if (this.options.riseOnHover) { + this.off({ mouseover: this._bringToFront, mouseout: this._resetZIndex - }, this); + }); } L.DomUtil.remove(this._icon); + this.removeInteractiveTarget(this._icon); this._icon = null; }, @@ -205,11 +206,7 @@ L.Marker = L.Layer.extend({ L.DomUtil.addClass(this._icon, 'leaflet-interactive'); - if (L.DomEvent) { - L.DomEvent.on(this._icon, - 'click dblclick mousedown mouseup mouseover mousemove mouseout contextmenu keypress', - this._fireMouseEvent, this); - } + this.addInteractiveTarget(this._icon); if (L.Handler.MarkerDrag) { var draggable = this.options.draggable; @@ -226,21 +223,6 @@ L.Marker = L.Layer.extend({ } }, - _fireMouseEvent: function (e, type) { - // to prevent outline when clicking on keyboard-focusable marker - if (e.type === 'mousedown') { - L.DomEvent.preventDefault(e); - } - - if (e.type === 'keypress' && e.keyCode === 13) { - type = 'click'; - } - - if (this._map) { - this._map._fireMouseEvent(this, e, type, true, this._latlng); - } - }, - setOpacity: function (opacity) { this.options.opacity = opacity; if (this._map) { diff --git a/src/map/Map.js b/src/map/Map.js index 1c111bf7549..27ce7531634 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -554,7 +554,7 @@ L.Map = L.Evented.extend({ onOff = onOff || 'on'; L.DomEvent[onOff](this._container, - 'click dblclick mousedown mouseup mouseenter mouseleave mousemove contextmenu', + 'click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress', this._handleMouseEvent, this); this._targets = {}; @@ -575,9 +575,24 @@ L.Map = L.Evented.extend({ var target = this._targets[L.stamp(e.target || e.srcElement)]; - this._fireMouseEvent(target || this, e, - e.type === 'mouseenter' ? 'mouseover' : - e.type === 'mouseleave' ? 'mouseout' : e.type, true); + var type = + e.type === 'mouseenter' ? 'mouseover' : + e.type === 'mouseleave' ? 'mouseout' : e.type; + + if (e.type === 'keypress' && e.keyCode === 13) { + type = 'click'; + } + + // to prevent outline when clicking on keyboard-focusable element + if (type === 'mousedown') { + L.DomEvent.preventDefault(e); + } + + // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave + if (!target && (e.type === 'mouseover' || e.type === 'mouseout') && + !L.DomEvent._checkMouse(this._container, e)) { return; } + + this._fireMouseEvent(target || this, e, type, true); }, _fireMouseEvent: function (obj, e, type, propagate, latlng) { @@ -604,12 +619,15 @@ L.Map = L.Evented.extend({ } var data = { - originalEvent: e, - containerPoint: this.mouseEventToContainerPoint(e) + originalEvent: e }; - data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); - data.latlng = latlng || this.layerPointToLatLng(data.layerPoint); + if (e.type !== 'keypress') { + // TODO latlng isn't used, wrong latlng for markers + data.containerPoint = this.mouseEventToContainerPoint(e); + data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); + data.latlng = latlng || this.layerPointToLatLng(data.layerPoint); + } obj.fire(type, data, propagate); }, From 43c3f01a1a1f875d60d3b10776d9b6bc2c6faafb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 20:16:33 +0200 Subject: [PATCH 1376/2207] cleaner DOM event handling in Map --- src/map/Map.js | 76 ++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 46 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 27ce7531634..d0914503d3e 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -220,7 +220,7 @@ L.Map = L.Evented.extend({ remove: function () { - this._initEvents('off'); + this._initEvents(true); try { // throws error in IE6-8 @@ -546,18 +546,17 @@ L.Map = L.Evented.extend({ } }, - // map events + // DOM event handling - _initEvents: function (onOff) { + _initEvents: function (remove) { if (!L.DomEvent) { return; } - onOff = onOff || 'on'; + this._targets = {}; - L.DomEvent[onOff](this._container, - 'click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress', - this._handleMouseEvent, this); + var onOff = remove ? 'off' : 'on'; - this._targets = {}; + L.DomEvent[onOff](this._container, 'click dblclick mousedown mouseup ' + + 'mouseover mouseout mousemove contextmenu keypress', this._handleDOMEvent, this); if (this.options.trackResize) { L.DomEvent[onOff](window, 'resize', this._onResize, this); @@ -570,66 +569,51 @@ L.Map = L.Evented.extend({ function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); }, - _handleMouseEvent: function (e) { - if (!this._loaded) { return; } - - var target = this._targets[L.stamp(e.target || e.srcElement)]; + _handleDOMEvent: function (e) { + if (!this._loaded || L.DomEvent._skipped(e)) { return; } - var type = - e.type === 'mouseenter' ? 'mouseover' : - e.type === 'mouseleave' ? 'mouseout' : e.type; + // find the layer the event is propagating from + var target = this._targets[L.stamp(e.target || e.srcElement)], + type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; - if (e.type === 'keypress' && e.keyCode === 13) { - type = 'click'; - } + // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave + if (!target && (type === 'mouseover' || type === 'mouseout') && + !L.DomEvent._checkMouse(this._container, e)) { return; } - // to prevent outline when clicking on keyboard-focusable element + // prevents outline when clicking on keyboard-focusable element if (type === 'mousedown') { L.DomEvent.preventDefault(e); } - // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave - if (!target && (e.type === 'mouseover' || e.type === 'mouseout') && - !L.DomEvent._checkMouse(this._container, e)) { return; } + target = target || this; - this._fireMouseEvent(target || this, e, type, true); - }, - - _fireMouseEvent: function (obj, e, type, propagate, latlng) { - type = type || e.type; - - if (L.DomEvent._skipped(e)) { return; } - if (type === 'click') { - var draggableObj = obj.options.draggable === true ? obj : this; - if (!e._simulated && ((draggableObj.dragging && draggableObj.dragging.moved()) || - (this.boxZoom && this.boxZoom.moved()))) { - L.DomEvent.stopPropagation(e); - return; - } - obj.fire('preclick'); - } - - if (!obj.listens(type, propagate)) { return; } + if (!target.listens(type, true) && (type !== 'click' || !target.listens('preclick', true))) { return; } if (type === 'contextmenu') { L.DomEvent.preventDefault(e); } - if (type === 'click' || type === 'dblclick' || type === 'contextmenu') { - L.DomEvent.stopPropagation(e); - } + + // prevents firing click after you just dragged an object + if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } var data = { originalEvent: e }; - if (e.type !== 'keypress') { // TODO latlng isn't used, wrong latlng for markers data.containerPoint = this.mouseEventToContainerPoint(e); data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); - data.latlng = latlng || this.layerPointToLatLng(data.layerPoint); + data.latlng = this.layerPointToLatLng(data.layerPoint); } + if (type === 'click') { + target.fire('preclick', data, true); + } + target.fire(type, data, true); + }, - obj.fire(type, data, propagate); + _draggableMoved: function (obj) { + obj = obj.options.draggable ? obj : this; + return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); }, _clearHandlers: function () { From 0a68b25ce560fa701e206da8e8dcb0c80cb325ca Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 21:01:32 +0200 Subject: [PATCH 1377/2207] fix Canvas vector events --- src/layer/vector/Canvas.js | 13 +++++++++---- src/map/Map.js | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 6cf2f3568d8..9445ff6a185 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -190,7 +190,8 @@ L.Canvas = L.Renderer.extend({ for (var id in this._layers) { if (this._layers[id]._containsPoint(point)) { - this._layers[id]._fireMouseEvent(e); + L.DomEvent._fakeStop(e); + this._fireEvent(this._layers[id], e); } } }, @@ -213,20 +214,24 @@ L.Canvas = L.Renderer.extend({ // if we just got inside the layer, fire mouseover if (!layer._mouseInside) { L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor - layer._fireMouseEvent(e, 'mouseover'); + this._fireEvent(layer, e, 'mouseover'); layer._mouseInside = true; } // fire mousemove - layer._fireMouseEvent(e); + this._fireEvent(layer, e); } else if (layer._mouseInside) { // if we're leaving the layer, fire mouseout L.DomUtil.removeClass(this._container, 'leaflet-interactive'); - layer._fireMouseEvent(e, 'mouseout'); + this._fireEvent(layer, e, 'mouseout'); layer._mouseInside = false; } }, + _fireEvent: function (layer, e, type) { + this._map._fireDOMEvent(layer, e, type || e.type); + }, + // TODO _bringToFront & _bringToBack, pretty tricky _bringToFront: L.Util.falseFn, diff --git a/src/map/Map.js b/src/map/Map.js index d0914503d3e..141525bfc51 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -585,8 +585,10 @@ L.Map = L.Evented.extend({ L.DomEvent.preventDefault(e); } - target = target || this; + this._fireDOMEvent(target || this, e, type); + }, + _fireDOMEvent: function (target, e, type) { if (!target.listens(type, true) && (type !== 'click' || !target.listens('preclick', true))) { return; } if (type === 'contextmenu') { From 63753d8564819d45be709299e542fa4860bc0f05 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 18 Nov 2014 20:27:52 +0200 Subject: [PATCH 1378/2207] prevent focus outline when dragging objects --- src/dom/Draggable.js | 7 ++++++- src/layer/marker/Marker.Drag.js | 2 +- src/map/Map.js | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 2a6e9ff7388..7e6748f0190 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -20,9 +20,10 @@ L.Draggable = L.Evented.extend({ } }, - initialize: function (element, dragStartTarget) { + initialize: function (element, dragStartTarget, preventOutline) { this._element = element; this._dragStartTarget = dragStartTarget || element; + this._preventOutline = preventOutline; }, enable: function () { @@ -49,6 +50,10 @@ L.Draggable = L.Evented.extend({ L.DomEvent.stopPropagation(e); + if (this._preventOutline) { + L.DomEvent.preventDefault(e); + } + if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } L.DomUtil.disableImageDrag(); diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js index c0d6629b7f6..f1d5779ba7a 100644 --- a/src/layer/marker/Marker.Drag.js +++ b/src/layer/marker/Marker.Drag.js @@ -11,7 +11,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ var icon = this._marker._icon; if (!this._draggable) { - this._draggable = new L.Draggable(icon, icon); + this._draggable = new L.Draggable(icon, icon, true); } this._draggable.on({ diff --git a/src/map/Map.js b/src/map/Map.js index 141525bfc51..c78d71a25b5 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -581,7 +581,7 @@ L.Map = L.Evented.extend({ !L.DomEvent._checkMouse(this._container, e)) { return; } // prevents outline when clicking on keyboard-focusable element - if (type === 'mousedown') { + if (target && type === 'mousedown') { L.DomEvent.preventDefault(e); } From a865d2b64972699a7c87d83ec6da89fa6868d3cb Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 18 Nov 2014 14:21:28 -0800 Subject: [PATCH 1379/2207] CSS-based outline prevention --- src/dom/DomUtil.js | 15 +++++++++++++++ src/dom/Draggable.js | 2 +- src/map/Map.js | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index 489e9bee1be..67de1558d93 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -219,4 +219,19 @@ L.DomUtil = { L.DomUtil.enableImageDrag = function () { L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); }; + + L.DomUtil.preventOutline = function (element) { + L.DomUtil.restoreOutline(); + this._outlineElement = element; + this._outlineStyle = element.style.outline; + element.style.outline = 'none'; + L.DomEvent.on(window, 'keydown', L.DomUtil.restoreOutline, this); + }; + L.DomUtil.restoreOutline = function () { + if (!this._outlineElement) { return; } + this._outlineElement.style.outline = this._outlineStyle; + delete this._outlineElement; + delete this._outlineStyle; + L.DomEvent.off(window, 'keydown', L.DomUtil.restoreOutline, this); + }; })(); diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 7e6748f0190..428a2b58d55 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -51,7 +51,7 @@ L.Draggable = L.Evented.extend({ L.DomEvent.stopPropagation(e); if (this._preventOutline) { - L.DomEvent.preventDefault(e); + L.DomUtil.preventOutline(this._element); } if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } diff --git a/src/map/Map.js b/src/map/Map.js index c78d71a25b5..b07b50c13ca 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -581,8 +581,8 @@ L.Map = L.Evented.extend({ !L.DomEvent._checkMouse(this._container, e)) { return; } // prevents outline when clicking on keyboard-focusable element - if (target && type === 'mousedown') { - L.DomEvent.preventDefault(e); + if (type === 'mousedown') { + L.DomUtil.preventOutline(e.target || e.srcElement); } this._fireDOMEvent(target || this, e, type); From 35860a0213e77362ece46f43d30a9d7aa6989734 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Mar 2015 19:15:52 +0200 Subject: [PATCH 1380/2207] fix marker event data --- src/map/Map.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index b07b50c13ca..74f44822a5f 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -602,8 +602,8 @@ L.Map = L.Evented.extend({ originalEvent: e }; if (e.type !== 'keypress') { - // TODO latlng isn't used, wrong latlng for markers - data.containerPoint = this.mouseEventToContainerPoint(e); + data.containerPoint = target instanceof L.Marker ? + this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); data.latlng = this.layerPointToLatLng(data.layerPoint); } From 4e44e12ecff37c8694ca801cc8cb96c01224804c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 2 Mar 2015 19:33:39 +0200 Subject: [PATCH 1381/2207] add basic marker click test --- spec/suites/layer/marker/MarkerSpec.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index ec4e98e590e..2d28fac3be8 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -1,11 +1,16 @@ describe("Marker", function () { var map, spy, + div, icon1, icon2; beforeEach(function () { - map = L.map(document.createElement('div')).setView([0, 0], 0); + div = document.createElement('div'); + div.style.height = '100px'; + document.body.appendChild(div); + + map = L.map(div).setView([0, 0], 0); icon1 = new L.Icon.Default(); icon2 = new L.Icon.Default({ iconUrl: icon1._getIconUrl('icon') + '?2', @@ -13,6 +18,10 @@ describe("Marker", function () { }); }); + afterEach(function () { + document.body.removeChild(div); + }); + describe("#setIcon", function () { it("changes the icon to another image", function () { var marker = new L.Marker([0, 0], {icon: icon1}); @@ -145,4 +154,17 @@ describe("Marker", function () { expect(marker.getLatLng()).to.be(afterLatLng); }); }); + + describe('events', function () { + it('fires click event when clicked', function () { + var spy = sinon.spy(); + + var marker = L.marker([0, 0]).addTo(map); + + marker.on('click', spy); + happen.click(marker._icon); + + expect(spy.called).to.be.ok(); + }); + }); }); From 142e0661b190581c6e45c74c3419e46fdf98a5c5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 3 Mar 2015 12:28:55 +0200 Subject: [PATCH 1382/2207] fix touch zoom regression --- src/layer/tile/GridLayer.js | 21 ++++++++++++++------- src/map/anim/Map.ZoomAnimation.js | 5 +++-- src/map/handler/Map.TouchZoom.js | 4 ++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index d98994f3b90..7b4a04b79a9 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -215,7 +215,9 @@ L.GridLayer = L.Layer.extend({ level.zoom = zoom; this._setZoomTransform(level, map.getCenter(), map.getZoom()); - L.Util.falseFn(level.el.offsetWidth); // Force recalculation to trigger transitions. + + // force the browser to consider the newly added element for transition + L.Util.falseFn(level.el.offsetWidth); } this._level = level; @@ -301,26 +303,31 @@ L.GridLayer = L.Layer.extend({ }, _viewReset: function (e) { - var map = this._map; - this._reset(map.getCenter(), map.getZoom(), e && e.hard); + this._reset(this._map.getCenter(), this._map.getZoom(), e && e.hard); }, _animateZoom: function (e) { - this._reset(e.center, e.zoom, false, true); + this._reset(e.center, e.zoom, false, true, e.noUpdate); }, - _reset: function (center, zoom, hard, noPrune) { + _reset: function (center, zoom, hard, noPrune, noUpdate) { var tileZoom = Math.round(zoom), tileZoomChanged = this._tileZoom !== tileZoom; - if (tileZoomChanged || hard) { + if (!noUpdate && (hard || tileZoomChanged)) { + if (this._abortLoading) { this._abortLoading(); } + this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); - this._update(center, tileZoom); + + if (!L.Browser.mobileWebkit) { + this._update(center, tileZoom); + } + if (!noPrune) { this._pruneTiles(); } diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 085b26632c5..501b94d9941 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -81,7 +81,7 @@ L.Map.include(!zoomAnimated ? {} : { return true; }, - _animateZoom: function (center, zoom, startAnim) { + _animateZoom: function (center, zoom, startAnim, noUpdate) { if (startAnim) { this._animatingZoom = true; @@ -97,7 +97,8 @@ L.Map.include(!zoomAnimated ? {} : { zoom: zoom, scale: this.getZoomScale(zoom), origin: this.latLngToLayerPoint(center), - offset: this._getCenterOffset(center).multiplyBy(-1) + offset: this._getCenterOffset(center).multiplyBy(-1), + noUpdate: noUpdate }); }, diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index bb4ae01c155..e8b3754c3cc 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -84,7 +84,7 @@ L.Map.TouchZoom = L.Handler.extend({ this._zoom = map.getScaleZoom(this._scale); if (this._scale !== 1 || this._delta.x !== 0 || this._delta.y !== 0) { - map._animateZoom(this._center, this._zoom); + map._animateZoom(this._center, this._zoom, false, true); } }, @@ -106,7 +106,7 @@ L.Map.TouchZoom = L.Handler.extend({ zoomDelta = this._zoom - oldZoom, finalZoom = map._limitZoom(zoomDelta > 0 ? Math.ceil(this._zoom) : Math.floor(this._zoom)); - map._animateZoom(this._center, finalZoom, true); + map._animateZoom(this._center, finalZoom, true, true); }, _getTargetCenter: function () { From 063df462cbd630dde55b8293bee2a6b0a9c0fc09 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Feb 2015 12:25:22 +0200 Subject: [PATCH 1383/2207] zoom linearly, no mousewheel debounce --- dist/leaflet.css | 8 +++---- src/map/handler/Map.ScrollWheelZoom.js | 29 +++++++------------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index e50e886c475..2e58a2ca31b 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -156,10 +156,10 @@ will-change: transform; } .leaflet-zoom-anim .leaflet-zoom-animated { - -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); - -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); - -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); - transition: transform 0.25s cubic-bezier(0,0,0.25,1); + -webkit-transition: -webkit-transform 0.2s linear; + -moz-transition: -moz-transform 0.2s linear; + -o-transition: -o-transform 0.2s linear; + transition: transform 0.2s linear; } .leaflet-zoom-anim .leaflet-tile, .leaflet-pan-anim .leaflet-tile { diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index 18edef60a1e..972d225c472 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -3,8 +3,7 @@ */ L.Map.mergeOptions({ - scrollWheelZoom: true, - wheelDebounceTime: 40 + scrollWheelZoom: true }); L.Map.ScrollWheelZoom = L.Handler.extend({ @@ -13,8 +12,6 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ mousewheel: this._onWheelScroll, MozMousePixelScroll: L.DomEvent.preventDefault }, this); - - this._delta = 0; }, removeHooks: function () { @@ -25,27 +22,18 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ }, _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e); - var debounce = this._map.options.wheelDebounceTime; - - this._delta += delta; - this._lastMousePos = this._map.mouseEventToContainerPoint(e); + var delta = L.DomEvent.getWheelDelta(e), + mousePos = this._map.mouseEventToContainerPoint(e); - if (!this._startTime) { - this._startTime = +new Date(); + if (!map._animatingZoom) { + this._performZoom(delta, mousePos); } - var left = Math.max(debounce - (+new Date() - this._startTime), 0); - - clearTimeout(this._timer); - this._timer = setTimeout(L.bind(this._performZoom, this), left); - L.DomEvent.stop(e); }, - _performZoom: function () { + _performZoom: function (delta, mousePos) { var map = this._map, - delta = this._delta, zoom = map.getZoom(); map.stop(); // stop panning and fly animations if any @@ -54,15 +42,12 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ delta = Math.max(Math.min(delta, 4), -4); delta = map._limitZoom(zoom + delta) - zoom; - this._delta = 0; - this._startTime = null; - if (!delta) { return; } if (map.options.scrollWheelZoom === 'center') { map.setZoom(zoom + delta); } else { - map.setZoomAround(this._lastMousePos, zoom + delta); + map.setZoomAround(mousePos, zoom + delta); } } }); From 95b5964f627e1481f1c6d6aed3bc73301b2b9b09 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Feb 2015 12:35:47 +0200 Subject: [PATCH 1384/2207] zoom evenly while scroll events happen, no jumps --- src/map/handler/Map.ScrollWheelZoom.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index 972d225c472..d2f6be14ebc 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -23,10 +23,13 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ _onWheelScroll: function (e) { var delta = L.DomEvent.getWheelDelta(e), - mousePos = this._map.mouseEventToContainerPoint(e); + map = this._map, + mousePos = map.mouseEventToContainerPoint(e); if (!map._animatingZoom) { this._performZoom(delta, mousePos); + } else { + map.once('moveend', L.bind(this._performZoom, this, delta, mousePos)); } L.DomEvent.stop(e); @@ -38,8 +41,7 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ map.stop(); // stop panning and fly animations if any - delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); - delta = Math.max(Math.min(delta, 4), -4); + delta = delta > 0 ? 1 : -1; delta = map._limitZoom(zoom + delta) - zoom; if (!delta) { return; } From c901474866a1d26fc0ae7d1be3159fea0e1d82c8 Mon Sep 17 00:00:00 2001 From: Dan Sherman Date: Tue, 3 Mar 2015 21:03:42 -0800 Subject: [PATCH 1385/2207] Add TileLayer.Gigapan --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index c0e665f8f6b..f037c5360a0 100644 --- a/plugins.md +++ b/plugins.md @@ -284,6 +284,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Indokreatif Teknologi + + + TileLayer.Gigapan + + A TileLayer for Gigapan images. + + Dan Sherman + + TileLayer.PouchDBCached From 8842385c376a6ba14573f85b38e7b6fe8e05e7ba Mon Sep 17 00:00:00 2001 From: Jake Wilson Date: Tue, 3 Mar 2015 22:17:24 -0700 Subject: [PATCH 1386/2207] Prevent map refocus if control click event is from the keyboard, which is determined/assumed by the click X,Y being at 0,0. --- src/control/Control.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/control/Control.js b/src/control/Control.js index 786ba5599c4..abcd5bff065 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -71,8 +71,9 @@ L.Control = L.Class.extend({ return this; }, - _refocusOnMap: function () { - if (this._map) { + _refocusOnMap: function (e) { + // if map exists and event is keyboard event + if (this._map && (e.x > 0 && e.y > 0 && e.screenX > 0 && e.screenY > 0)) { this._map.getContainer().focus(); } } From 030495b7634596a111660187253d82131b205300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 4 Mar 2015 10:03:34 +0100 Subject: [PATCH 1387/2207] Changing PouchDBCached plugin description, because https://github.com/MazeMap/Leaflet.TileLayer.PouchDBCached/issues/2 --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 4ab3fb7f21a..d076c43f5cf 100644 --- a/plugins.md +++ b/plugins.md @@ -288,7 +288,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s TileLayer.PouchDBCached - A TileLayer which caches into PouchDB for transparent offline use. + Allows all Leaflet TileLayers to cache into PouchDB for offline use. Iván Sánchez Ortega, MazeMap From 455fbb087b39f6d0a3b5c9aa755b728c5db6289e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Mar 2015 11:46:03 +0200 Subject: [PATCH 1388/2207] fix maxNativeZoom regression, close #3096 --- src/layer/tile/TileLayer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index c4a2f2b933a..c23e8688284 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -99,12 +99,12 @@ L.TileLayer = L.GridLayer.extend({ _getTileSize: function () { var map = this._map, options = this.options, - zoom = map.getZoom() + options.zoomOffset, + zoom = this._tileZoom + options.zoomOffset, zoomN = options.maxNativeZoom; // increase tile size when overscaling return zoomN !== null && zoom > zoomN ? - Math.round(map.getZoomScale(zoomN, zoom) * options.tileSize) : + Math.round(options.tileSize / map.getZoomScale(zoomN, zoom)) : options.tileSize; }, From 602cff077f9d8eb778c26aaeb53c5fc37b3185da Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 4 Mar 2015 18:14:51 +0100 Subject: [PATCH 1389/2207] Ensure polygons latlngs are never flat (cf #2648) --- spec/suites/layer/vector/PolygonSpec.js | 211 ++++++++++++++++++++++- spec/suites/layer/vector/PolylineSpec.js | 83 ++++++++- src/layer/vector/Polygon.js | 11 ++ src/layer/vector/Polyline.js | 22 ++- 4 files changed, 317 insertions(+), 10 deletions(-) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index 07c0170f4f9..ceb7ce3f368 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -7,6 +7,14 @@ describe('Polygon', function () { map.setView(new L.LatLng(55.8, 37.6), 6); describe("#initialize", function () { + it("should never be flat", function () { + var latLngs = [[1, 2], [3, 4]]; + + var polygon = new L.Polygon(latLngs); + + expect(polygon._flat(polygon._latlngs)).to.be(false); + }); + it("doesn't overwrite the given latlng array", function () { var originalLatLngs = [ [1, 2], @@ -22,7 +30,7 @@ describe('Polygon', function () { it("can be called with an empty array", function () { var polygon = new L.Polygon([]); - expect(polygon.getLatLngs()).to.eql([]); + expect(polygon.getLatLngs()).to.eql([[]]); }); it("can be initialized with holes", function () { @@ -42,6 +50,20 @@ describe('Polygon', function () { [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])] ]); }); + + it("can be initialized with multi including hole", function () { + var latLngs = [ + [[[10, 20], [30, 40], [50, 60]]], + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] + ]; + + var polygon = new L.Polygon(latLngs); + + expect(polygon.getLatLngs()).to.eql([ + [[L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]], + [[L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]] + ]); + }); }); describe("#setLatLngs", function () { @@ -79,6 +101,7 @@ describe('Polygon', function () { }); describe("#spliceLatLngs", function () { + it("splices the internal latLngs", function () { var latLngs = [ [1, 2], @@ -88,9 +111,191 @@ describe('Polygon', function () { var polygon = new L.Polygon(latLngs); - polygon.spliceLatLngs(1, 1, [7, 8]); + var removed = polygon.spliceLatLngs(1, 1, [7, 8]); + + expect(polygon._latlngs).to.eql([[L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]]); + expect(removed).to.eql([L.latLng([3, 4])]); + }); + + it("splices on the first shape by default on a polygon with hole", function () { + var latLngs = [ + [ //external rink + [0, 10], [10, 10], [10, 0] + ], [ //hole + [2, 3], [2, 4], [3, 4] + ] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.spliceLatLngs(1, 1, [11, 11]); + + expect(polygon._latlngs[0]).to.eql([L.latLng([0, 10]), L.latLng([11, 11]), L.latLng([10, 0])]); + expect(polygon._latlngs[1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]); + }); + + it("splices on the hole by reference", function () { + var latLngs = [ + [ //external rink + [0, 10], [10, 10], [10, 0] + ], [ //hole + [2, 3], [2, 4], [3, 4] + ] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.spliceLatLngs(1, 1, [3, 3], polygon._latlngs[1]); + + expect(polygon._latlngs[0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); + expect(polygon._latlngs[1]).to.eql([L.latLng([2, 3]), L.latLng([3, 3]), L.latLng([3, 4])]); + }); + + it("splices on the first shape by default on a multipolygon", function () { + var latLngs = [ + [[[11, 12], [13, 14], [15, 16]]], + [[[1, 2], [3, 4], [5, 6]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.spliceLatLngs(1, 1, [11, 11]); + + expect(polygon._latlngs[0][0]).to.eql([L.latLng([11, 12]), L.latLng([11, 11]), L.latLng([15, 16])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + }); + + it("splices by reference on a multipolygon", function () { + var latLngs = [ + [[[11, 12], [13, 14], [15, 16]]], + [[[1, 2], [3, 4], [5, 6]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.spliceLatLngs(1, 1, [7, 8], polygon._latlngs[1][0]); - expect(polygon._latlngs).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); + expect(polygon._latlngs[0][0]).to.eql([L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); }); + + it("splices hole by reference on a multipolygon with hole", function () { + var latLngs = [ + [[[10, 20], [30, 40], [50, 60]]], + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.spliceLatLngs(1, 1, [3, 3], polygon._latlngs[1][1]); + + expect(polygon._latlngs[0][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); + expect(polygon._latlngs[1][1]).to.eql([L.latLng([2, 3]), L.latLng([3, 3]), L.latLng([3, 4])]); + }); + }); + + describe("#addLatLng", function () { + it("should add latlng to latlngs", function () { + var latLngs = [ + [1, 2], + [3, 4] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([5, 6]); + + expect(polygon._latlngs).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); + }); + + it("should add latlng to first latlngs on a polygon with hole", function () { + var latLngs = [ + [[0, 12], [13, 14], [15, 16]], + [[1, 2], [3, 4], [5, 6]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([17, 0]); + + expect(polygon._latlngs[0]).to.eql([L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16]), L.latLng([17, 0])]); + expect(polygon._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + }); + + it("should add latlng by reference on a polygon with hole", function () { + var latLngs = [ + [[0, 12], [13, 14], [15, 16]], + [[1, 2], [3, 4], [5, 6]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([7, 8], polygon._latlngs[1]); + + expect(polygon._latlngs[0]).to.eql([L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); + expect(polygon._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6]), L.latLng([7, 8])]); + }); + + it("should add latlng to first latlngs on a multi", function () { + var latLngs = [ + [[[1, 2], [3, 4]]], + [[[11, 12], [13, 14], [15, 16]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([5, 6]); + + expect(polygon._latlngs[0]).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); + expect(polygon._latlngs[1]).to.eql([[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]]); + }); + + it("should add latlng to latlngs by reference on a multi", function () { + var latLngs = [ + [[[11, 12], [13, 14], [15, 16]]], + [[[1, 2], [3, 4]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([5, 6], polygon._latlngs[1][0]); + + expect(polygon._latlngs[1]).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); + expect(polygon._latlngs[0]).to.eql([[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]]); + }); + + it("should add latlng on first latlngs by default on a multipolygon with hole", function () { + var latLngs = [ + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]], + [[[10, 20], [30, 40], [50, 60]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([-10, -10]); + + expect(polygon._latlngs[0][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0]), L.latLng([-10, -10])]); + expect(polygon._latlngs[0][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); + }); + + it("should add latlng by reference on a multipolygon with hole", function () { + var latLngs = [ + [[[10, 20], [30, 40], [50, 60]]], + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([2, 2], polygon._latlngs[1][1]); + + expect(polygon._latlngs[0][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); + expect(polygon._latlngs[1][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4]), L.latLng([2, 2])]); + }); + + }); + }); diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index 176543e6828..ab2abb152d8 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -47,9 +47,90 @@ describe('Polyline', function () { var polyline = new L.Polyline(latLngs); - polyline.spliceLatLngs(1, 1, [7, 8]); + var removed = polyline.spliceLatLngs(1, 1, [7, 8]); expect(polyline._latlngs).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); + expect(removed).to.eql([L.latLng([3, 4])]); + }); + + it("splices first latLngs of a multi by default", function () { + var latLngs = [ + [[1, 2], [3, 4], [5, 6]], + [[11, 12], [13, 14], [15, 16]] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.spliceLatLngs(1, 1, [7, 8]); + + expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); + expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); + }); + + it("splices latLngs of a multi by reference", function () { + var latLngs = [ + [[11, 12], [13, 14], [15, 16]], + [[1, 2], [3, 4], [5, 6]] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.spliceLatLngs(1, 1, [7, 8], polyline._latlngs[1]); + + expect(polyline._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); }); + + }); + + describe("#addLatLng", function () { + it("should add latlng to latlngs", function () { + var latLngs = [ + [1, 2], + [3, 4] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.addLatLng([5, 6]); + + expect(polyline._latlngs).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + }); + + it("should add latlng to first latlngs on a multi", function () { + var latLngs = [ + [[1, 2], [3, 4]], + [[11, 12], [13, 14]] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.addLatLng([5, 6]); + + expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14])]); + }); + + it("should add latlng to latlngs by reference", function () { + var latLngs = [ + [[11, 12], [13, 14]], + [[1, 2], [3, 4]] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.addLatLng([5, 6], polyline._latlngs[1]); + + expect(polyline._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + expect(polyline._latlngs[0]).to.eql([L.latLng([11, 12]), L.latLng([13, 14])]); + }); + + it("should add latlng on empty polyline", function () { + var polyline = new L.Polyline([]); + + polyline.addLatLng([1, 2]); + + expect(polyline._latlngs).to.eql([L.latLng([1, 2])]); + }); + }); }); diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index f35bc6dfb1f..780f4029760 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -40,6 +40,17 @@ L.Polygon = L.Polyline.extend({ return result; }, + _setLatLngs: function (latlngs) { + L.Polyline.prototype._setLatLngs.call(this, latlngs); + if (this._flat(this._latlngs)) { + this._latlngs = [this._latlngs]; + } + }, + + _defaultShape: function () { + return this._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; + }, + _clipPoints: function () { if (this.options.noClip) { this._parts = this._rings; diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 9f2209fcad2..1406b2e88b9 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -17,7 +17,6 @@ L.Polyline = L.Path.extend({ }, getLatLngs: function () { - // TODO rings return this._latlngs; }, @@ -26,22 +25,33 @@ L.Polyline = L.Path.extend({ return this.redraw(); }, - addLatLng: function (latlng) { - // TODO rings + addLatLng: function (latlng, latlngs) { + latlngs = latlngs || this._defaultShape(); latlng = L.latLng(latlng); - this._latlngs.push(latlng); + latlngs.push(latlng); this._bounds.extend(latlng); return this.redraw(); }, spliceLatLngs: function () { - // TODO rings - var removed = [].splice.apply(this._latlngs, arguments); + var last = arguments[arguments.length - 1], + latlngs = this._defaultShape(), + args = arguments; + if (L.Util.isArray(last) && (L.Util.isArray(last[0]) || last[0] instanceof L.LatLng)) { + latlngs = last; + args = Array.prototype.slice.call(arguments); + args.pop(); + } + var removed = [].splice.apply(latlngs, args); this._setLatLngs(this._latlngs); this.redraw(); return removed; }, + _defaultShape: function () { + return this._flat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + closestLayerPoint: function (p) { var minDistance = Infinity, minPoint = null, From 39425924ac3cd21b9cf329c13c26cd30a0c52a82 Mon Sep 17 00:00:00 2001 From: Jake Wilson Date: Wed, 4 Mar 2015 18:58:51 -0700 Subject: [PATCH 1390/2207] Added truthy check to the event. --- src/control/Control.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Control.js b/src/control/Control.js index abcd5bff065..34301c093ce 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -73,7 +73,7 @@ L.Control = L.Class.extend({ _refocusOnMap: function (e) { // if map exists and event is keyboard event - if (this._map && (e.x > 0 && e.y > 0 && e.screenX > 0 && e.screenY > 0)) { + if (this._map && e && e.screenX > 0 && e.screenY > 0) { this._map.getContainer().focus(); } } From aae1df5d49402aec0427313b9644a8287be21c44 Mon Sep 17 00:00:00 2001 From: Jake Wilson Date: Wed, 4 Mar 2015 19:00:52 -0700 Subject: [PATCH 1391/2207] Fixed typo in comment --- src/control/Control.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Control.js b/src/control/Control.js index 34301c093ce..a21b102381f 100644 --- a/src/control/Control.js +++ b/src/control/Control.js @@ -72,7 +72,7 @@ L.Control = L.Class.extend({ }, _refocusOnMap: function (e) { - // if map exists and event is keyboard event + // if map exists and event is not a keyboard event if (this._map && e && e.screenX > 0 && e.screenY > 0) { this._map.getContainer().focus(); } From c7f53a25903f0463200ed068b7ca542c9ec4dd37 Mon Sep 17 00:00:00 2001 From: Torf Date: Thu, 5 Mar 2015 14:57:55 +0100 Subject: [PATCH 1392/2207] Added Leaflet.zoomhome to plugins.md. --- plugins.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index ebc5e37e83e..d7abd8c4b98 100644 --- a/plugins.md +++ b/plugins.md @@ -1563,7 +1563,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Mahmood Dehghan - + + + Leaflet.zoomhome + + + Zoom control with a home button for resetting the view (Demo) + + + Florian Brucker + + From 0d0269ac15461361bb9d04ae85917c3e02462c90 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 6 Mar 2015 09:05:50 +0100 Subject: [PATCH 1393/2207] Remove Polyline.addLatLng and Polyline.spliceLatLngs Those method are not consistent (or too complexe) among the supported Polygon/Polyline (cf #3279) --- spec/suites/layer/vector/PolygonSpec.js | 198 ----------------------- spec/suites/layer/vector/PolylineSpec.js | 96 ----------- src/layer/vector/Polygon.js | 4 - src/layer/vector/Polyline.js | 27 ---- 4 files changed, 325 deletions(-) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index ceb7ce3f368..28ab4b3dce7 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -100,202 +100,4 @@ describe('Polygon', function () { }); }); - describe("#spliceLatLngs", function () { - - it("splices the internal latLngs", function () { - var latLngs = [ - [1, 2], - [3, 4], - [5, 6] - ]; - - var polygon = new L.Polygon(latLngs); - - var removed = polygon.spliceLatLngs(1, 1, [7, 8]); - - expect(polygon._latlngs).to.eql([[L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]]); - expect(removed).to.eql([L.latLng([3, 4])]); - }); - - it("splices on the first shape by default on a polygon with hole", function () { - var latLngs = [ - [ //external rink - [0, 10], [10, 10], [10, 0] - ], [ //hole - [2, 3], [2, 4], [3, 4] - ] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.spliceLatLngs(1, 1, [11, 11]); - - expect(polygon._latlngs[0]).to.eql([L.latLng([0, 10]), L.latLng([11, 11]), L.latLng([10, 0])]); - expect(polygon._latlngs[1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]); - }); - - it("splices on the hole by reference", function () { - var latLngs = [ - [ //external rink - [0, 10], [10, 10], [10, 0] - ], [ //hole - [2, 3], [2, 4], [3, 4] - ] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.spliceLatLngs(1, 1, [3, 3], polygon._latlngs[1]); - - expect(polygon._latlngs[0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); - expect(polygon._latlngs[1]).to.eql([L.latLng([2, 3]), L.latLng([3, 3]), L.latLng([3, 4])]); - }); - - it("splices on the first shape by default on a multipolygon", function () { - var latLngs = [ - [[[11, 12], [13, 14], [15, 16]]], - [[[1, 2], [3, 4], [5, 6]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.spliceLatLngs(1, 1, [11, 11]); - - expect(polygon._latlngs[0][0]).to.eql([L.latLng([11, 12]), L.latLng([11, 11]), L.latLng([15, 16])]); - expect(polygon._latlngs[1][0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); - }); - - it("splices by reference on a multipolygon", function () { - var latLngs = [ - [[[11, 12], [13, 14], [15, 16]]], - [[[1, 2], [3, 4], [5, 6]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.spliceLatLngs(1, 1, [7, 8], polygon._latlngs[1][0]); - - expect(polygon._latlngs[0][0]).to.eql([L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); - expect(polygon._latlngs[1][0]).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); - }); - - it("splices hole by reference on a multipolygon with hole", function () { - var latLngs = [ - [[[10, 20], [30, 40], [50, 60]]], - [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.spliceLatLngs(1, 1, [3, 3], polygon._latlngs[1][1]); - - expect(polygon._latlngs[0][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); - expect(polygon._latlngs[1][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); - expect(polygon._latlngs[1][1]).to.eql([L.latLng([2, 3]), L.latLng([3, 3]), L.latLng([3, 4])]); - }); - - }); - - describe("#addLatLng", function () { - it("should add latlng to latlngs", function () { - var latLngs = [ - [1, 2], - [3, 4] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([5, 6]); - - expect(polygon._latlngs).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); - }); - - it("should add latlng to first latlngs on a polygon with hole", function () { - var latLngs = [ - [[0, 12], [13, 14], [15, 16]], - [[1, 2], [3, 4], [5, 6]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([17, 0]); - - expect(polygon._latlngs[0]).to.eql([L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16]), L.latLng([17, 0])]); - expect(polygon._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); - }); - - it("should add latlng by reference on a polygon with hole", function () { - var latLngs = [ - [[0, 12], [13, 14], [15, 16]], - [[1, 2], [3, 4], [5, 6]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([7, 8], polygon._latlngs[1]); - - expect(polygon._latlngs[0]).to.eql([L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); - expect(polygon._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6]), L.latLng([7, 8])]); - }); - - it("should add latlng to first latlngs on a multi", function () { - var latLngs = [ - [[[1, 2], [3, 4]]], - [[[11, 12], [13, 14], [15, 16]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([5, 6]); - - expect(polygon._latlngs[0]).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); - expect(polygon._latlngs[1]).to.eql([[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]]); - }); - - it("should add latlng to latlngs by reference on a multi", function () { - var latLngs = [ - [[[11, 12], [13, 14], [15, 16]]], - [[[1, 2], [3, 4]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([5, 6], polygon._latlngs[1][0]); - - expect(polygon._latlngs[1]).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); - expect(polygon._latlngs[0]).to.eql([[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]]); - }); - - it("should add latlng on first latlngs by default on a multipolygon with hole", function () { - var latLngs = [ - [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]], - [[[10, 20], [30, 40], [50, 60]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([-10, -10]); - - expect(polygon._latlngs[0][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0]), L.latLng([-10, -10])]); - expect(polygon._latlngs[0][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]); - expect(polygon._latlngs[1][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); - }); - - it("should add latlng by reference on a multipolygon with hole", function () { - var latLngs = [ - [[[10, 20], [30, 40], [50, 60]]], - [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.addLatLng([2, 2], polygon._latlngs[1][1]); - - expect(polygon._latlngs[0][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); - expect(polygon._latlngs[1][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); - expect(polygon._latlngs[1][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4]), L.latLng([2, 2])]); - }); - - }); - }); diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index ab2abb152d8..ed50a4db433 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -37,100 +37,4 @@ describe('Polyline', function () { }); }); - describe("#spliceLatLngs", function () { - it("splices the internal latLngs", function () { - var latLngs = [ - [1, 2], - [3, 4], - [5, 6] - ]; - - var polyline = new L.Polyline(latLngs); - - var removed = polyline.spliceLatLngs(1, 1, [7, 8]); - - expect(polyline._latlngs).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); - expect(removed).to.eql([L.latLng([3, 4])]); - }); - - it("splices first latLngs of a multi by default", function () { - var latLngs = [ - [[1, 2], [3, 4], [5, 6]], - [[11, 12], [13, 14], [15, 16]] - ]; - - var polyline = new L.Polyline(latLngs); - - polyline.spliceLatLngs(1, 1, [7, 8]); - - expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); - expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); - }); - - it("splices latLngs of a multi by reference", function () { - var latLngs = [ - [[11, 12], [13, 14], [15, 16]], - [[1, 2], [3, 4], [5, 6]] - ]; - - var polyline = new L.Polyline(latLngs); - - polyline.spliceLatLngs(1, 1, [7, 8], polyline._latlngs[1]); - - expect(polyline._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); - }); - - }); - - describe("#addLatLng", function () { - it("should add latlng to latlngs", function () { - var latLngs = [ - [1, 2], - [3, 4] - ]; - - var polyline = new L.Polyline(latLngs); - - polyline.addLatLng([5, 6]); - - expect(polyline._latlngs).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); - }); - - it("should add latlng to first latlngs on a multi", function () { - var latLngs = [ - [[1, 2], [3, 4]], - [[11, 12], [13, 14]] - ]; - - var polyline = new L.Polyline(latLngs); - - polyline.addLatLng([5, 6]); - - expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); - expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14])]); - }); - - it("should add latlng to latlngs by reference", function () { - var latLngs = [ - [[11, 12], [13, 14]], - [[1, 2], [3, 4]] - ]; - - var polyline = new L.Polyline(latLngs); - - polyline.addLatLng([5, 6], polyline._latlngs[1]); - - expect(polyline._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); - expect(polyline._latlngs[0]).to.eql([L.latLng([11, 12]), L.latLng([13, 14])]); - }); - - it("should add latlng on empty polyline", function () { - var polyline = new L.Polyline([]); - - polyline.addLatLng([1, 2]); - - expect(polyline._latlngs).to.eql([L.latLng([1, 2])]); - }); - - }); }); diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index 780f4029760..85eb1176656 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -47,10 +47,6 @@ L.Polygon = L.Polyline.extend({ } }, - _defaultShape: function () { - return this._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; - }, - _clipPoints: function () { if (this.options.noClip) { this._parts = this._rings; diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 1406b2e88b9..77dd587b501 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -25,33 +25,6 @@ L.Polyline = L.Path.extend({ return this.redraw(); }, - addLatLng: function (latlng, latlngs) { - latlngs = latlngs || this._defaultShape(); - latlng = L.latLng(latlng); - latlngs.push(latlng); - this._bounds.extend(latlng); - return this.redraw(); - }, - - spliceLatLngs: function () { - var last = arguments[arguments.length - 1], - latlngs = this._defaultShape(), - args = arguments; - if (L.Util.isArray(last) && (L.Util.isArray(last[0]) || last[0] instanceof L.LatLng)) { - latlngs = last; - args = Array.prototype.slice.call(arguments); - args.pop(); - } - var removed = [].splice.apply(latlngs, args); - this._setLatLngs(this._latlngs); - this.redraw(); - return removed; - }, - - _defaultShape: function () { - return this._flat(this._latlngs) ? this._latlngs : this._latlngs[0]; - }, - closestLayerPoint: function (p) { var minDistance = Infinity, minPoint = null, From 19033957d7c96513f522a3d56e04247d6101c296 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 6 Mar 2015 09:14:00 +0100 Subject: [PATCH 1394/2207] A few more tests on Polyline and Polygon (cf #3279) --- spec/suites/layer/vector/PolygonSpec.js | 31 ++++++++++++++++---- spec/suites/layer/vector/PolylineSpec.js | 37 +++++++++++++++++++++++- 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index 28ab4b3dce7..6bdfd4f5380 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -13,6 +13,7 @@ describe('Polygon', function () { var polygon = new L.Polygon(latLngs); expect(polygon._flat(polygon._latlngs)).to.be(false); + expect(polygon.getLatLngs()).to.eql(polygon._latlngs); }); it("doesn't overwrite the given latlng array", function () { @@ -30,12 +31,13 @@ describe('Polygon', function () { it("can be called with an empty array", function () { var polygon = new L.Polygon([]); - expect(polygon.getLatLngs()).to.eql([[]]); + expect(polygon._latlngs).to.eql([[]]); + expect(polygon.getLatLngs()).to.eql(polygon._latlngs); }); it("can be initialized with holes", function () { var originalLatLngs = [ - [ //external rink + [ //external ring [0, 10], [10, 10], [10, 0] ], [ //hole [2, 3], [2, 4], [3, 4] @@ -44,11 +46,11 @@ describe('Polygon', function () { var polygon = new L.Polygon(originalLatLngs); - // getLatLngs() returns both rings - expect(polygon.getLatLngs()).to.eql([ + expect(polygon._latlngs).to.eql([ [L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])] ]); + expect(polygon.getLatLngs()).to.eql(polygon._latlngs); }); it("can be initialized with multi including hole", function () { @@ -59,10 +61,11 @@ describe('Polygon', function () { var polygon = new L.Polygon(latLngs); - expect(polygon.getLatLngs()).to.eql([ + expect(polygon._latlngs).to.eql([ [[L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]], [[L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]] ]); + expect(polygon.getLatLngs()).to.eql(polygon._latlngs); }); }); @@ -83,7 +86,7 @@ describe('Polygon', function () { it("can be set external ring and holes", function () { var latLngs = [ - [ //external rink + [ //external ring [0, 10], [10, 10], [10, 0] ], [ //hole [2, 3], [2, 4], [3, 4] @@ -98,6 +101,22 @@ describe('Polygon', function () { [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])] ]); }); + + it("can be set multi including hole", function () { + var latLngs = [ + [[[10, 20], [30, 40], [50, 60]]], + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] + ]; + + var polygon = new L.Polygon([]); + polygon.setLatLngs(latLngs); + + expect(polygon.getLatLngs()).to.eql([ + [[L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]], + [[L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]] + ]); + }); + }); }); diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index ed50a4db433..ace4049b732 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -18,7 +18,30 @@ describe('Polyline', function () { expect(sourceLatLngs).to.eql(originalLatLngs); expect(polyline._latlngs).to.not.eql(sourceLatLngs); + expect(polyline.getLatLngs()).to.eql(polyline._latlngs); }); + + it("should accept a multi", function () { + var latLngs = [ + [[1, 2], [3, 4], [5, 6]], + [[11, 12], [13, 14], [15, 16]] + ]; + + var polyline = new L.Polyline(latLngs); + + expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); + expect(polyline.getLatLngs()).to.eql(polyline._latlngs); + }); + + it("should accept an empty array", function () { + + var polyline = new L.Polyline([]); + + expect(polyline._latlngs).to.eql([]); + expect(polyline.getLatLngs()).to.eql(polyline._latlngs); + }); + }); describe("#setLatLngs", function () { @@ -35,6 +58,18 @@ describe('Polyline', function () { expect(sourceLatLngs).to.eql(originalLatLngs); }); - }); + it("can be set a multi", function () { + var latLngs = [ + [[1, 2], [3, 4], [5, 6]], + [[11, 12], [13, 14], [15, 16]] + ]; + + var polyline = new L.Polyline([]); + polyline.setLatLngs(latLngs); + + expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); + }); + }); }); From 805ac6bd81f028294b1130c0b84f3231a27aca7b Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 2 Jan 2014 16:56:39 -0600 Subject: [PATCH 1395/2207] remove DomUtil.getViewportOffset as changelog indicates it has been removed. --- reference.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/reference.html b/reference.html index 7e4111a2651..b82b768e342 100644 --- a/reference.html +++ b/reference.html @@ -5655,14 +5655,6 @@

      Methods

      String Returns the value for a certain style attribute on an element, including computed values or values set through CSS. - - getViewportOffset( - <HTMLElement> el ) - - - Point - Returns the offset to the viewport for the requested element. - create( <String> tagName, From 9a23bb6f1ff8b110013613b500a38a16eb247dc0 Mon Sep 17 00:00:00 2001 From: danzel Date: Wed, 29 Jan 2014 11:41:08 +1300 Subject: [PATCH 1396/2207] Documentation for oldLatlng in marker move event. refs #2412 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b82b768e342..06962787304 100644 --- a/reference.html +++ b/reference.html @@ -1441,7 +1441,7 @@

      Events

      move Event - Fired when the marker is moved via setLatLng. New coordinate include in event arguments. + Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatlng, latlng. add From 02d36200599dcba55e01369f783a483fc61bce90 Mon Sep 17 00:00:00 2001 From: danzel Date: Wed, 29 Jan 2014 14:52:41 +1300 Subject: [PATCH 1397/2207] oldLatLng --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 06962787304..a84a805b70c 100644 --- a/reference.html +++ b/reference.html @@ -1441,7 +1441,7 @@

      Events

      move Event - Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatlng, latlng. + Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng. add From b0777d08c6f57662d13bf439eca39b32837ee403 Mon Sep 17 00:00:00 2001 From: Andrey Geonya Date: Wed, 5 Feb 2014 19:41:23 +0200 Subject: [PATCH 1398/2207] Update reference.html --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index a84a805b70c..bc98b304b97 100644 --- a/reference.html +++ b/reference.html @@ -5907,7 +5907,7 @@

      Events

      dragend - Event + DragEndEvent Fired when the dragging ends. From fccc98e6dcdae364eef097c29932e7877f86c5c7 Mon Sep 17 00:00:00 2001 From: mtmail Date: Sat, 8 Mar 2014 13:34:06 +0100 Subject: [PATCH 1399/2207] Update reference related to touchZoom:center ( using the correct gh-pages-master branch now) Documenting the accepted pull request https://github.com/Leaflet/Leaflet/pull/2527 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index bc98b304b97..21c417cb88b 100644 --- a/reference.html +++ b/reference.html @@ -233,7 +233,7 @@

      Interaction Options

      touchZoom Boolean true - Whether the map can be zoomed by touch-dragging with two fingers. + Whether the map can be zoomed by touch-dragging with two fingers. If passed 'center', it will zoom to the center of the view regardless of where the touch events (fingers) were. scrollWheelZoom From 443e2328d5684e73a809ed2b0d8a5c78578a71a4 Mon Sep 17 00:00:00 2001 From: bennlich Date: Tue, 22 Apr 2014 22:59:33 -0700 Subject: [PATCH 1400/2207] Updated reference for crossOrigin option --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index 21c417cb88b..d9cad4a52c6 100644 --- a/reference.html +++ b/reference.html @@ -1941,6 +1941,12 @@

      Options

      LatLngBounds null When this option is set, the TileLayer only loads tiles that are in the given geographical bounds. + + + crossOrigin + Boolean + false + If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data. From 83c815f413371b93830f3bbfcf363363033efd55 Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 17:08:51 +0300 Subject: [PATCH 1401/2207] #2501, wheelDebounceTime option documented --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index d9cad4a52c6..01ad5887526 100644 --- a/reference.html +++ b/reference.html @@ -241,6 +241,12 @@

      Interaction Options

      true Whether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was. + + wheelDebounceTime + Number + 40 + Limits the rate at which a wheel can fire (in milliseconds). By default user can't zoom via wheel more often than once per 40 ms. + doubleClickZoom Boolean From 0f988154e47e1b3feb02975198cd984d8299939b Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 18:16:11 +0300 Subject: [PATCH 1402/2207] this commit fixes #2499 documentation --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 01ad5887526..d7e22301e2a 100644 --- a/reference.html +++ b/reference.html @@ -1334,7 +1334,7 @@

      Options

      Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default. - clickable + interactive Boolean true If false, the marker will not emit mouse events and will act as a part of the underlying map. @@ -2396,7 +2396,7 @@

      Options

      A string that defines shape to be used at the corners of the stroke. - clickable + interactive Boolean true If false, the vector will not emit mouse events and will act as a part of the underlying map. From 58ff298c88a6d1e15762b9d806b9910651ad9421 Mon Sep 17 00:00:00 2001 From: Kevin DeLoach Date: Tue, 5 Aug 2014 14:01:23 -0400 Subject: [PATCH 1403/2207] Add documentation for WMS TileLayer uppercase option. --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index d7e22301e2a..866f604c731 100644 --- a/reference.html +++ b/reference.html @@ -2135,6 +2135,12 @@

      Options

      null Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means. + + uppercase + Boolean + false + If true, WMS request parameter keys will be uppercase. +

      Methods

      From 0bdd1d6045daeb3ea78ea52f7400ee72ce6fa34d Mon Sep 17 00:00:00 2001 From: bennlich Date: Mon, 29 Sep 2014 12:29:51 -0700 Subject: [PATCH 1404/2207] Removed documented url property of TileEvent --- reference.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reference.html b/reference.html index 866f604c731..191544b5996 100644 --- a/reference.html +++ b/reference.html @@ -4919,11 +4919,6 @@

      TileEvent

      HTMLElement The tile element (image). - - url - String - The source URL of the tile. -

      ResizeEvent

      From c7c33c1a2d19f8ad37539db1d9f1e5c50110e7e2 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 21 Dec 2014 07:52:37 -0800 Subject: [PATCH 1405/2207] add nav links and headers --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index 191544b5996..05a0350fff4 100644 --- a/reference.html +++ b/reference.html @@ -86,6 +86,8 @@

      Events

      Utility

      • Class
      • +
      • Evented
      • +
      • Layer
      • Browser
      • Util
      • Transformation
      • @@ -5163,6 +5165,9 @@

        Constructor Hooks

        MyClass.addInitHook('methodName', arg1, arg2, …);
        +

        + +

        Browser

        From 64e967f967aea5592ece884aa490e8a34fd3a24c Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 21 Dec 2014 08:44:24 -0800 Subject: [PATCH 1406/2207] L.Evented docs --- reference.html | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 05a0350fff4..23ea42e7611 100644 --- a/reference.html +++ b/reference.html @@ -5120,7 +5120,7 @@

        Options

        Includes

        -

        includes is a special class property that merges all specified objects into the class (such objects are called mixins). A good example of this is L.Mixin.Events that event-related methods like on, off and fire to the class.

        +

        includes is a special class property that merges all specified objects into the class (such objects are called mixins).

         var MyMixin = {
         	foo: function () { ... },
        @@ -5165,9 +5165,35 @@ 

        Constructor Hooks

        MyClass.addInitHook('methodName', arg1, arg2, …);
        -

        +

        Evented

        -

        +

        When creating a plguin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-releated methods like on, off and fire

        + +
        MyEventedClass = L.Evented.extend({
        +	fire: function(){
        +		this.fire('custom', {
        +			// you can attach optional data to an event as an object
        +		});
        +	}
        +});
        +
        +var myEvents = new MyEventedClass();
        +
        +myEvents.on('custom', function(e){
        +	// e.type will  be 'custom'
        +	// anything else you passed in the
        +});
        +
        +myEvents.fire();
        + +You can still use the old-style `L.Mixin.Events` for backward compatibility. + +
        // this class will include all event methods
        +MyEventedClass = L.Class.extend({
        +	includes: L.Mixin.Evvents
        +});
        + +

        Layer

        Browser

        From 8ffb9ecfa66be0aa03a10820de5269e396fda99b Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 21 Dec 2014 13:16:19 -0800 Subject: [PATCH 1407/2207] layer and evented docs --- reference-tpl.html | 17 ++++++++ reference.html | 100 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 103 insertions(+), 14 deletions(-) diff --git a/reference-tpl.html b/reference-tpl.html index 2e3cee70374..82033923ba1 100644 --- a/reference-tpl.html +++ b/reference-tpl.html @@ -70,3 +70,20 @@

        Options

        [description] + + + +

        Events

        + + + + + + + + + + + + +
        EventDataDescription
        [name][type][description]
        diff --git a/reference.html b/reference.html index 23ea42e7611..8a709dee736 100644 --- a/reference.html +++ b/reference.html @@ -5167,7 +5167,7 @@

        Constructor Hooks

        Evented

        -

        When creating a plguin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-releated methods like on, off and fire

        +

        When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

        MyEventedClass = L.Evented.extend({
         	fire: function(){
        @@ -5190,11 +5190,80 @@ 

        Evented

        // this class will include all event methods
         MyEventedClass = L.Class.extend({
        -	includes: L.Mixin.Evvents
        +	includes: L.Mixin.Events
         });

        Layer

        +

        When implementing a custom layer the L.Layer class can be extended to implementing basic functionality that all layers need to share, these methods can be used when extending L.Layer when implementing custom layers.

        + +

        Options

        + + + + + + + + + + + + + + +
        OptionTypeDefault valueDescription
        paneString'overlayPane'By default the layer will be added to the maps overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
        + +

        Events

        + + + + + + + + + + + + + + + + + +
        EventDataDescription
        addEventFired after the layer is added to a map.
        removeEventFired after the layer is removed from a map.
        + +

        Methods

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        MethodReturnsDescription
        addTo(<Map> map)thisAdds the layer to the given map.
        removeFrom(<Map> map)thisRemoves the layer to the given map.
        remove()thisRemoves the layer from the map it is currently active on.
        getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
        +

        Browser

        A namespace with properties for browser/feature detection used by Leaflet internally.

        @@ -6032,7 +6101,7 @@

        IHandler

        ILayer

        -

        Represents an object attached to a particular location (or a set of locations) on a map. Implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

        +

        Represents an object attached to a particular location (or a set of locations) on a map. Extends the L.Layer base class and is implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

        Methods

        @@ -6062,6 +6131,8 @@

        Methods

        Implementing Custom Layers

        +

        Custom layers should extend the L.Layer base class. L.Layer provides convenience methods for your layer like addTo(map), removeFrom(map) and getPane().

        +

        The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

        Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

        @@ -6072,29 +6143,32 @@

        Custom Layer Example

        Here's how a custom layer implementation usually looks:

        -
        var MyCustomLayer = L.Class.extend({
        +
        var MyCustomLayer = L.Layer.extend({
         
         	initialize: function (latlng) {
         		// save position of the layer or any options from the constructor
         		this._latlng = latlng;
         	},
         
        -	onAdd: function (map) {
        -		this._map = map;
        +	// these events will be added and removed from the map with the layer
        +	getEvents: function(){
        +		return {
        +			viewreset: this._reset
        +		}
        +	},
         
        -		// create a DOM element and put it into one of the map panes
        +	onAdd: function (map) {
        +		// create a DOM element and put it into one of the map panes, by default the overlayPane
         		this._el = L.DomUtil.create('div', 'my-custom-layer leaflet-zoom-hide');
        -		map.getPanes().overlayPane.appendChild(this._el);
        +		this.getPane().appendChild(this._el);
         
         		// add a viewreset event listener for updating layer's position, do the latter
        -		map.on('viewreset', this._reset, this);
         		this._reset();
         	},
         
         	onRemove: function (map) {
         		// remove layer's DOM elements and listeners
        -		map.getPanes().overlayPane.removeChild(this._el);
        -		map.off('viewreset', this._reset, this);
        +		this.getPane().overlayPane.removeChild(this._el);
         	},
         
         	_reset: function () {
        @@ -6104,11 +6178,9 @@ 

        Custom Layer Example

        } }); -map.addLayer(new MyCustomLayer(latlng)); +var myLayer = new MyCustomLayer(latlng).addTo(map);
        - -

        IControl

        Represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls.

        From 35adcdb87c3efa39468bffdcb6117a0deb7d0f10 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 26 Dec 2014 15:19:27 -0800 Subject: [PATCH 1408/2207] refactory into utilities and base classes --- reference.html | 821 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 591 insertions(+), 230 deletions(-) diff --git a/reference.html b/reference.html index 8a709dee736..fbfefd76f56 100644 --- a/reference.html +++ b/reference.html @@ -70,7 +70,6 @@

        Basic Types

      Controls

      Utility

      -

      Interfaces

      +

      Base Classes

      Misc

      @@ -186,7 +184,7 @@

      Map State Options

      layers - ILayer[] + ILayer[] null Layers that will be added to the map initially. @@ -210,7 +208,7 @@

      Map State Options

      crs - CRS + CRS L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means. @@ -805,7 +803,12 @@

      Methods for Layers and Controls

      addLayer( +<<<<<<< HEAD <ILayer> layer, +======= + <ILayer> layer, + <Boolean> insertAtTheBottom? ) +>>>>>>> refactory into utilities and base classes this @@ -813,7 +816,7 @@

      Methods for Layers and Controls

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -821,7 +824,7 @@

      Methods for Layers and Controls

      hasLayer( - <ILayer> layer ) + <ILayer> layer ) Boolean @@ -867,7 +870,7 @@

      Methods for Layers and Controls

      addControl( - <IControl> control ) + <IControl> control ) this @@ -875,7 +878,7 @@

      Methods for Layers and Controls

      removeControl( - <IControl> control ) + <IControl> control ) this @@ -1186,7 +1189,7 @@

      fitBounds options

      Properties

      -

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      +

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      map.doubleClickZoom.disable();
      @@ -1202,37 +1205,37 @@

      Properties

      dragging - IHandler + IHandler Map dragging handler (by both mouse and touch). touchZoom - IHandler + IHandler Touch zoom handler. doubleClickZoom - IHandler + IHandler Double click zoom handler. scrollWheelZoom - IHandler + IHandler Scroll wheel zoom handler. boxZoom - IHandler + IHandler Box (shift-drag with mouse) zoom handler. keyboard - IHandler + IHandler Keyboard navigation handler. tap - IHandler + IHandler Mobile touch hacks (quick tap and touch hold) handler. @@ -1583,7 +1586,7 @@

      Methods

      Interaction handlers

      -

      Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

      +

      Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

      marker.dragging.disable();
      @@ -1595,7 +1598,7 @@

      Interaction handlers

      dragging - IHandler + IHandler Marker dragging handler (by both mouse and touch). @@ -1627,7 +1630,7 @@

      Creation

      L.popup( <Popup options> options?, - <ILayer> source? ) + <ILayer> source? ) @@ -1790,7 +1793,7 @@

      Methods

      TileLayer

      -

      Used to load and display tile layers on the map, implements ILayer interface.

      +

      Used to load and display tile layers on the map, implements ILayer interface.

      Usage example

      @@ -2133,7 +2136,7 @@

      Options

      crs - CRS + CRS null Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means. @@ -2237,7 +2240,7 @@

      Methods

      ImageOverlay

      -

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      +

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      Usage example

      @@ -3068,7 +3071,7 @@

      Methods

      LayerGroup

      -

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      +

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      L.layerGroup([marker1, marker2])
       	.addLayer(polyline)
      @@ -3082,8 +3085,8 @@ 

      Creation

      Description - L.layerGroup( - <ILayer[]> layers? ) + L.LayerGroup( + <ILayer[]> layers? ) @@ -3109,7 +3112,7 @@

      Methods

      addLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -3117,7 +3120,7 @@

      Methods

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -3133,7 +3136,7 @@

      Methods

      hasLayer( - <ILayer> layer ) + <ILayer> layer ) Boolean @@ -3144,7 +3147,7 @@

      Methods

      <String> id )
      - ILayer + ILayer Returns the layer with the given id. @@ -3180,7 +3183,7 @@

      Methods

      FeatureGroup

      -

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      +

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
      @@ -3197,7 +3200,7 @@ 

      Creation

      L.featureGroup( - <ILayer[]> layers? ) + <ILayer[]> layers? ) @@ -3359,7 +3362,7 @@

      Options

      onEachFeature( <GeoJSON> featureData, - <ILayer> layer ) + <ILayer> layer ) Function that will be called on each created feature layer. Useful for attaching events and popups to features. @@ -3367,7 +3370,7 @@

      Options

      filter( <GeoJSON> featureData, - <ILayer> layer ) + <ILayer> layer ) Function that will be used to decide whether to show a feature or not. @@ -3431,7 +3434,7 @@

      Static methods

      <Function> pointToLayer? )
      - ILayer + ILayer Creates a layer from a given GeoJSON feature. @@ -4161,122 +4164,6 @@

      Options

      - - - -

      Control

      - -

      The base class for all Leaflet controls. Implements IControl interface. You can add controls to the map like this:

      - -
      control.addTo(map);
      -// the same as
      -map.addControl(control);
      - -

      Creation

      - - - - - - - - - - - - - -
      FactoryDescription
      L.control( - <Control options> options? ) - Creates a control with the given options.
      - -

      Options

      - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      positionString'topright'The initial position of the control (one of the map corners). See control positions.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setPosition( - <String> position ) - thisSets the position of the control. See control positions.
      getPosition()StringReturns the current position of the control.
      addTo( - <Map> map ) - thisAdds the control to the map.
      removeFrom( - <Map> map ) - thisRemoves the control from the map.
      getContainer()HTMLElementReturns the HTML container of the control.
      - -

      Control Positions

      - -

      Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.

      - - - - - - - - - - - - - - - - - - - - - - -
      PositionDescription
      'topleft'Top left of the map.
      'topright'Top right of the map.
      'bottomleft'Bottom left of the map.
      'bottomright'Bottom right of the map.
      - -

      Control.zoom

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      @@ -4457,7 +4344,7 @@

      Methods

      addBaseLayer( - <ILayer> layer, + <ILayer> layer, <String> name ) this @@ -4465,7 +4352,7 @@

      Methods

      addOverlay( - <ILayer> layer, + <ILayer> layer, <String> name ) this @@ -4473,7 +4360,7 @@

      Methods

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this Remove the given layer from the control. @@ -4883,7 +4770,7 @@

      LayerEvent

      layer - ILayer + ILayer The layer that was added or removed. @@ -4898,7 +4785,7 @@

      LayersControlEvent

      layer - ILayer + ILayer The layer that was added or removed. @@ -4953,7 +4840,7 @@

      GeoJSON event

      layer - ILayer + ILayer The layer for the GeoJSON feature that is being added to the map. @@ -5006,38 +4893,131 @@

      DragEndEvent

      +

      Browser

      +

      A namespace with properties for browser/feature detection used by Leaflet internally.

      -

      Class

      - -

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      -

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      +
      if (L.Browser.ie6) {
      +	alert('Upgrade your browser, dude!');
      +}
      -
      var MyClass = L.Class.extend({
      -	initialize: function (greeter) {
      -		this.greeter = greeter;
      -		// class constructor
      -	},
      +
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +	
      +		
      +		
      +		
      +	
      +
      propertytypedescription
      ieBooleantrue for all Internet Explorer versions.
      ie6Booleantrue for Internet Explorer 6.
      ie7Booleantrue for Internet Explorer 7.
      webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
      webkit3dBooleantrue for webkit-based browsers that support CSS 3D transformations.
      androidBooleantrue for Android mobile browser.
      android23Booleantrue for old Android stock browsers (2 and 3).
      mobileBooleantrue for modern mobile browsers (including iOS Safari and different Android browsers).
      mobileWebkitBooleantrue for mobile webkit-based browsers.
      mobileOperaBooleantrue for mobile Opera.
      touchBooleantrue for all browsers on touch devices.
      msTouchBooleantrue for browsers with Microsoft touch model (e.g. IE10).
      retinaBooleantrue for devices with Retina screens.
      - greet: function (name) { - alert(this.greeter + ', ' + name) - } -}); -// create instance of MyClass, passing "Hello" to the constructor -var a = new MyClass("Hello"); +

      Util

      -// call greet method, alerting "Hello, World" -a.greet("World"); -
      +

      Various utility functions, used by Leaflet internally.

      +<<<<<<< HEAD

      The initialize method is your class's constructor function, meaning that it gets called when you do new MyClass(...).

      +======= +

      Methods

      +>>>>>>> refactory into utilities and base classes -

      Class Factories

      + + + + + + + + -

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      + + + + + +<<<<<<< HEAD
      new L.Map('map'); // becomes:
       L.map('map');
      @@ -5385,12 +5365,17 @@

      Methods

      +======= + + +>>>>>>> refactory into utilities and base classes +<<<<<<< HEAD +======= + +>>>>>>> refactory into utilities and base classes
      MethodReturnsDescription
      extend( + <Object> dest, + <Object> src?.. ) + ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
      bind( + <Function> fn, + <Object> obj ) + Function Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind).FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut.
      stamp( <Object> obj ) String Applies a unique key to the object and returns that key. Has an L.stamp shortcut.
      requestAnimFrame( <Function> fn, @@ -5408,6 +5393,21 @@

      Methods

      - Cancels a previous request to requestAnimFrame.
      limitExecByInterval( <Function> fn, @@ -6070,48 +6070,215 @@

      Methods

      --> +

      Class

      +

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      +

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      -

      IHandler

      -

      An interface implemented by interaction handlers.

      +
      var MyClass = L.Class.extend({
      +	initialize: function (greeter) {
      +		this.greeter = greeter;
      +		// class constructor
      +	},
       
      -
      -	
      -		
      -		
      -		
      -	
      -	
      -		
      -		
      -		
      -	
      -	
      -		
      -		
      -		
      -	
      -	
      -		
      -		
      -		
      -	
      -
      MethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      + greet: function (name) { + alert(this.greeter + ', ' + name) + } +}); + +// create instance of MyClass, passing "Hello" to the constructor +var a = new MyClass("Hello"); + +// call greet method, alerting "Hello, World" +a.greet("World"); +
      + + +

      Class Factories

      + +

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      + +
      new L.Map('map'); // becomes:
      +L.map('map');
      + +

      The factories are implemented very easily, and you can do this for your own classes:

      + +
      L.map = function (id, options) {
      +	return new L.Map(id, options);
      +};
      + + +

      Inheritance

      + +

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      + +
      var MyChildClass = MyClass.extend({
      +	// ... new properties and methods
      +});
      + +

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      + +
      var a = new MyChildClass();
      +a instanceof MyChildClass; // true
      +a instanceof MyClass; // true
      +
      + +

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      + +
      var MyChildClass = MyClass.extend({
      +	initialize: function () {
      +		MyClass.prototype.initialize.call("Yo");
      +	},
      +
      +	greet: function (name) {
      +		MyClass.prototype.greet.call(this, 'bro ' + name + '!');
      +	}
      +});
      +
      +var a = new MyChildClass();
      +a.greet('Jason'); // alerts "Yo, bro Jason!"
      + +

      Options

      + +

      options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

      + +
      var MyClass = L.Class.extend({
      +	options: {
      +		myOption1: 'foo',
      +		myOption2: 'bar'
      +	}
      +});
      +
      +var MyChildClass = L.Class.extend({
      +	options: {
      +		myOption1: 'baz',
      +		myOption3: 5
      +	}
      +});
      +
      +var a = new MyChildClass();
      +a.options.myOption1; // 'baz'
      +a.options.myOption2; // 'bar'
      +a.options.myOption3; // 5
      + +

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defauls defines in the class:

      + +
      var MyClass = L.Class.extend({
      +	options: {
      +		foo: 'bar',
      +		bla: 5
      +	},
      +
      +	initialize: function (options) {
      +		L.Util.setOptions(this, options);
      +		...
      +	}
      +});
      +
      +var a = new MyClass({bla: 10});
      +a.options; // {foo: 'bar', bla: 10}
      + +

      Includes

      + +

      includes is a special class property that merges all specified objects into the class (such objects are called mixins). + +

       var MyMixin = {
      +	foo: function () { ... },
      +	bar: 5
      +};
      +
      +var MyClass = L.Class.extend({
      +	includes: MyMixin
      +});
      +
      +var a = new MyClass();
      +a.foo();
      + +

      You can also do such includes in runtime with the include method:

      + +
      MyClass.include(MyMixin);
      + +

      Statics

      + +

      statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

      + +
      var MyClass = L.Class.extend({
      +	statics: {
      +		FOO: 'bar',
      +		BLA: 5
      +	}
      +});
      +
      +MyClass.FOO; // 'bar'
      + + +

      Constructor Hooks

      + +

      If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

      + +
      MyClass.addInitHook(function () {
      +	// ... do something in constructor additionally
      +	// e.g. add event listeners, set custom properties etc.
      +});
      + +

      You can also use the following shortcut when you just need to make one additional method call:

      + +
      MyClass.addInitHook('methodName', arg1, arg2, …);
      + +

      Evented

      + +

      When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

      + +
      MyEventedClass = L.Evented.extend({
      +	fire: function(){
      +		this.fire('custom', {
      +			// you can attach optional data to an event as an object
      +		});
      +	}
      +});
      +
      +var myEvents = new MyEventedClass();
      +
      +myEvents.on('custom', function(e){
      +	// e.type will  be 'custom'
      +	// anything else you passed in the
      +});
       
      +myEvents.fire();
      + +You can still use the old-style `L.Mixin.Events` for backward compatibility. -

      ILayer

      +
      // this class will include all event methods
      +MyEventedClass = L.Class.extend({
      +	includes: L.Mixin.Events
      +});
      -

      Represents an object attached to a particular location (or a set of locations) on a map. Extends the L.Layer base class and is implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

      +

      Layer

      + +

      The base class for all Leaflet layers that impliments basic shared methods and functionality. Can be extended to create custom layers by extending L.Layer and implimenting the onAdd and onRemove methods.

      + +

      Implementing Custom Layers

      + +

      Custom layers should extend the L.Layer base class. L.Layer provides convenience methods for your layer like addTo(map), removeFrom(map) and getPane().

      + +

      The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

      + +

      Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

      + +

      Another thing to note is that you'll usually need to add leaflet-zoom-hide class to the DOM elements you create for the layer so that it hides during zoom animation. Implementing zoom animation for custom layers is a complex topic and will be documented separately in future, but meanwhile you can take a look at how it's done for Leaflet layers (e.g. ImageOverlay) in the source.

      Methods

      - +

      Every layer should extend from L.Layer and impliment the following methods:

      + +
      +<<<<<<< HEAD @@ -6126,19 +6293,24 @@

      Methods

      +======= + + + + + + + + + + + + + +>>>>>>> refactory into utilities and base classes
      Method Returns Description
      onAdd( <Map> map ) - Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).onAdd(<Map> map)thisShould contain code that creates DOM elements for the overlay, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).
      onRemove(<Map> map)thisShould contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).
      getEvents()ObjectThis optional method should return an object like { viewreset: this._reset }for addEventListener. These events will be automatically added and removed from the map with your layer.
      -

      Implementing Custom Layers

      - -

      Custom layers should extend the L.Layer base class. L.Layer provides convenience methods for your layer like addTo(map), removeFrom(map) and getPane().

      - -

      The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

      - -

      Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

      - -

      Another thing to note is that you'll usually need to add leaflet-zoom-hide class to the DOM elements you create for the layer so that it hides during zoom animation. Implementing zoom animation for custom layers is a complex topic and will be documented separately in future, but meanwhile you can take a look at how it's done for Leaflet layers (e.g. ImageOverlay) in the source.

      -

      Custom Layer Example

      Here's how a custom layer implementation usually looks:

      @@ -6168,7 +6340,7 @@

      Custom Layer Example

      onRemove: function (map) { // remove layer's DOM elements and listeners - this.getPane().overlayPane.removeChild(this._el); + this.getPane().removeChild(this._el); }, _reset: function () { @@ -6181,9 +6353,82 @@

      Custom Layer Example

      var myLayer = new MyCustomLayer(latlng).addTo(map);
      -

      IControl

      +

      Inherited Options

      -

      Represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls.

      +

      Classes extending from L.Layer will also inherit the following options:

      + + + + + + + + + + + + + + +
      OptionTypeDefault valueDescription
      paneString'overlayPane'By default the layer will be added to the maps overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
      + +

      Inherited Events

      + +

      Classes extending from L.Layer will also fire the following events:

      + + + + + + + + + + + + + + + + + +
      EventDataDescription
      addEventFired after the layer is added to a map.
      removeEventFired after the layer is removed from a map.
      + +

      Inherited Methods

      + +

      Classes extending from L.Layer will also inherit the following methods:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addTo(<Map> map)thisAdds the layer to the given map.
      removeFrom(<Map> map)thisRemoves the layer to the given map.
      remove()thisRemoves the layer from the map it is currently active on.
      getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
      + +

      Control

      + +

      Controls represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls. Can be used to create custom controls by extending L.Control and implimenting the onAdd and onRemove methods.

      Methods

      @@ -6247,16 +6492,132 @@

      Custom Control Example

      map.addControl(new MyControl('bar', {position: 'bottomleft'}));
      +

      Options

      + +

      Classes extending from L.Control will also inherit the following options:

      + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      positionString'topright'The initial position of the control (one of the map corners). See control positions.
      + +

      Inherited Methods

      + +

      Classes extending from L.Control will also inherit the following methods:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setPosition( + <String> position ) + thisSets the position of the control. See control positions.
      getPosition()StringReturns the current position of the control.
      addTo( + <Map> map ) + thisAdds the control to the map.
      removeFrom( + <Map> map ) + thisRemoves the control from the map.
      getContainer()HTMLElementReturns the HTML container of the control.
      +

      Control Positions

      + +

      Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.

      + + + + + + + + + + + + + + + + + + + + + + +
      PositionDescription
      'topleft'Top left of the map.
      'topright'Top right of the map.
      'bottomleft'Bottom left of the map.
      'bottomright'Bottom right of the map.
      + + +

      Handler

      +

      An interface implemented by interaction handlers.

      + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      -

      IProjection

      +

      Projection

      An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See Map projection.

      Methods

      - +
      @@ -6309,13 +6670,13 @@

      Defined Projections

      -

      ICRS

      +

      CRS

      Defines coordinate reference systems for projecting geographical points into pixel (screen) coordinates and back (and to coordinates in other units for WMS services). See Spatial reference system.

      Methods

      -
      Method Returns
      +
      @@ -6367,7 +6728,7 @@

      Methods

      Properties

      -
      Method Returns
      +
      @@ -6376,7 +6737,7 @@

      Properties

      - + From b1559f09249f2d145931508cb2d00d945199b051 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 26 Dec 2014 15:25:11 -0800 Subject: [PATCH 1409/2207] remove interface references --- reference.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reference.html b/reference.html index fbfefd76f56..3f0579155ad 100644 --- a/reference.html +++ b/reference.html @@ -1793,7 +1793,7 @@

      Methods

      TileLayer

      -

      Used to load and display tile layers on the map, implements ILayer interface.

      +

      Used to load and display tile layers on the map. Extends Layer.

      Usage example

      @@ -2240,7 +2240,7 @@

      Methods

      ImageOverlay

      -

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      +

      Used to load and display a single image over specific bounds of the map. Extends Layer.

      Usage example

      @@ -3071,7 +3071,7 @@

      Methods

      LayerGroup

      -

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      +

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Extends Layer.

      L.layerGroup([marker1, marker2])
       	.addLayer(polyline)
      @@ -3183,7 +3183,7 @@ 

      Methods

      FeatureGroup

      -

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      +

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Extends Layer.

      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
      @@ -6586,7 +6586,7 @@ 

      Control Positions

      Handler

      -

      An interface implemented by interaction handlers.

      +

      Implemented by map interaction handlers.

      Property Type
      projectionIProjectionIProjection Projection that this CRS uses.
      From 9d2b04675d8dd583549223bda84efe4df73930ef Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 12:48:46 +0200 Subject: [PATCH 1410/2207] impliment -> implement typo fixes --- reference.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 3f0579155ad..9f6abeb566e 100644 --- a/reference.html +++ b/reference.html @@ -6255,7 +6255,7 @@

      Evented

      Layer

      -

      The base class for all Leaflet layers that impliments basic shared methods and functionality. Can be extended to create custom layers by extending L.Layer and implimenting the onAdd and onRemove methods.

      +

      The base class for all Leaflet layers that implements basic shared methods and functionality. Can be extended to create custom layers by extending L.Layer and implementing the onAdd and onRemove methods.

      Implementing Custom Layers

      @@ -6269,7 +6269,7 @@

      Implementing Custom Layers

      Methods

      -

      Every layer should extend from L.Layer and impliment the following methods:

      +

      Every layer should extend from L.Layer and implement the following methods:

      @@ -6428,7 +6428,7 @@

      Inherited Methods

      Control

      -

      Controls represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls. Can be used to create custom controls by extending L.Control and implimenting the onAdd and onRemove methods.

      +

      Controls represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls. Can be used to create custom controls by extending L.Control and implementing the onAdd and onRemove methods.

      Methods

      From d9bf46a25487fd92641ce5c76eee19ad538e25e8 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:18:59 -0800 Subject: [PATCH 1411/2207] remove multi shapes from ref, examples for polygon+polyline --- reference.html | 195 ++++++++++++++++--------------------------------- 1 file changed, 63 insertions(+), 132 deletions(-) diff --git a/reference.html b/reference.html index 9f6abeb566e..a7561ffcb9c 100644 --- a/reference.html +++ b/reference.html @@ -44,9 +44,7 @@

      Vector Layers

      @@ -2611,6 +2604,33 @@

      Polyline

      Usage example

      // create a red polyline from an array of LatLng points
      +var latlngs = [
      +  [-122.68, 45.51],
      +  [-122.43, 37.77],
      +  [-118.2, 34.04]
      +];
      +
      +var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
      +
      +// zoom the map to the polyline
      +map.fitBounds(polyline.getBounds());
      + +

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      + +
      // create a red polyline from an arrays  of arrays of LatLng points
      +var latlngs = [
      +	[
      +	  [-122.68, 45.51],
      +	  [-122.43, 37.77],
      +	  [-118.2, 34.04]
      +	],
      +	[
      +	  [-73.91, 40.78],
      +	  [-87.62, 41.83],
      +	  [-96.72, 32.76]
      +	]
      +]
      +
       var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
       
       // zoom the map to the polyline
      @@ -2631,7 +2651,7 @@ 

      Creation

      -
      +
      addLayer( -<<<<<<< HEAD - <ILayer> layer, -======= <ILayer> layer, - <Boolean> insertAtTheBottom? ) ->>>>>>> refactory into utilities and base classes thisInstantiates a polyline object given an array of geographical points and optionally an options object.Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a a Polyline with multiple separate lines (MultiPolyline) by passing an array that contains arrays of geographic points.
      @@ -2714,81 +2734,55 @@

      Methods

      +

      Polygon

      -

      MultiPolyline

      +

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      -

      Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

      +

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      -

      Creation

      +

      Usage example

      +
      // create a red polygon from an arrays of LatLng points
      +var latlngs = [
      +  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      +];
       
      -
      -	
      -		
      +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
       
      -		
      -	
      -	
      -		
      +// zoom the map to the polygon
      +map.fitBounds(polygon.getBounds());
       
      +

      You can also pass a array of arrays of latlngs, the first array represents the outer shape and the other arrays represent holes in the outer shape.

      +
      // create a red polygon from an arrays of LatLng points
      +var latlngs = [
      +  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      +  [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      +];
       
      -		
      - -
      FactoryDescription
      L.multiPolyline( - <LatLng[][]> latlngs, - <Polyline options> options? ) - Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); +// zoom the map to the polygon +map.fitBounds(polygon.getBounds());
      -

      Methods

      +

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      -

      MultiPolylines accept all Polyline methods but -have different behavior around their coordinate contents since they can contain -multiple line features:

      +
      // create a red polygon from an arrays of arrays of LatLng points
      +var latlngs = [
      +  [
      +    [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ],
      +    [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      +  ],
      +  [
      +    [ [-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38] ]
      +  ]
      +]
       
      -
      -	
      -		
      -		
      -		
      -	
      -	
      -		
      -
      -		
      -		
      -    
      -	
      -		
      -
      -		
      -		
      -    
      -	
      -		
      -
      -		
      -		
      -    
      -	
      -		
      -		
      -		
      -	
      -
      MethodReturnsDescription
      setLatLngs( - <LatLng[][]> latlngs ) - thisReplace all lines and their paths with the given array of arrays of - geographical points.
      getLatLngs()<LatLng[][]> latlngs - Returns an array of arrays of geographical points in each line.
      openPopup()thisOpens the popup previously bound by bindPopup.
      toGeoJSON()ObjectReturns a GeoJSON representation of the multipolyline (GeoJSON MultiLineString Feature).
      +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); +// zoom the map to the polygon +map.fitBounds(polygon.getBounds());
      -

      Polygon

      - -

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      - -

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      -

      Creation

      @@ -2804,7 +2798,7 @@

      Creation

      - +
      Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside.Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a Polygon with multiple separate lines (MultiPolygon) by passing an array of Polygon coordinates.
      @@ -2826,69 +2820,6 @@

      Methods

      -

      MultiPolygon

      - -

      Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

      - -

      Creation

      - - - - - - - - - - - - - -
      FactoryDescription
      L.multiPolygon( - <LatLng[][]> latlngs, - <Polyline options> options? ) - Instantiates a multi-polygon object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
      - -

      Methods

      - -

      MultiPolygons accept all Polyline methods but -have different behavior around their coordinate contents since they can contain -multiple polygon features:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setLatLngs( - <LatLng[][]> latlngs ) - thisReplace all polygons and their paths with the given array of arrays of - geographical points.
      getLatLngs()<LatLng[][]> latlngs - Returns an array of arrays of geographical points in each polygon.
      openPopup()thisOpens the popup previously bound by bindPopup.
      toGeoJSON()ObjectReturns a GeoJSON representation of the multipolygon (GeoJSON MultiPolygon Feature).

      Rectangle

      From 2823162b5551f29975d95b70cfb781e4fc747998 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:23:26 -0800 Subject: [PATCH 1412/2207] update default path options --- reference.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reference.html b/reference.html index a7561ffcb9c..e8a0c9eec0e 100644 --- a/reference.html +++ b/reference.html @@ -2348,19 +2348,19 @@

      Options

      color String - '#03f' + '#3388ff' Stroke color. weight Number - 5 + 3 Stroke width in pixels. opacity Number - 0.5 + 1 Stroke opacity. @@ -2390,13 +2390,13 @@

      Options

      lineCap String - null + 'round' A string that defines shape to be used at the end of the stroke. lineJoin String - null + 'round' A string that defines shape to be used at the corners of the stroke. @@ -2409,7 +2409,7 @@

      Options

      pointerEvents String null - Sets the pointer-events attribute on the path if SVG backend is used. + Sets the pointer-events attribute on the path if SVG renderer is used. className From 3c47983a3bcd62455ca259e59c5a9cffd5ce72d3 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:26:20 -0800 Subject: [PATCH 1413/2207] getCenter() docs --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index e8a0c9eec0e..e0fa39f2e44 100644 --- a/reference.html +++ b/reference.html @@ -2726,6 +2726,11 @@

      Methods

      LatLngBounds Returns the LatLngBounds of the polyline. + + getCenter() + LatLng + Returns the center (centroid) of the polyline. + toGeoJSON() Object From f1bdb23f8f1aa6674fc76bae95c64bc60dfdb4ba Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:28:45 -0800 Subject: [PATCH 1414/2207] flip Circle/CircleMarker inheritance --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index e0fa39f2e44..53eaeb3b3fe 100644 --- a/reference.html +++ b/reference.html @@ -2882,7 +2882,7 @@

      Methods

      Circle

      -

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      +

      A class for drawing circle overlays on a map. Extends CircleMarker. Use Map#addLayer to add it to the map.

      L.circle([50.5, 30.5], 200).addTo(map);
      @@ -2951,7 +2951,7 @@

      Methods

      CircleMarker

      -

      A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

      +

      A circle of a fixed size with radius specified in pixels. Extends Path. Use Map#addLayer to add it to the map.

      Creation

      From 0e65dfedb596e8fdb1eab4736c6f9389f0f0548a Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:50:35 -0800 Subject: [PATCH 1415/2207] renderer docs and methods --- reference.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/reference.html b/reference.html index 53eaeb3b3fe..ec4ac87b2db 100644 --- a/reference.html +++ b/reference.html @@ -210,6 +210,12 @@

      Map State Options

      L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means. + + renderer + Renderer + depends + The default method for drawing vector layers on the map. L.SVG or L.Canvas by default depending on browser support. +

      Interaction Options

      @@ -877,6 +883,13 @@

      Methods for Layers and Controls

      this Removes the given control from the map. + getRenderer( + <ILayer> layer) + + + Renderer + Returns the renderer for the given layer. + @@ -2405,6 +2418,12 @@

      Options

      true If false, the vector will not emit mouse events and will act as a part of the underlying map. + + renderer + Renderer + depends + L.SVG or L.Canvas by default depending on browser support. + pointerEvents String From c9877de5930bd15a8b21b704004afb54f0bd3386 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 13:05:28 +0200 Subject: [PATCH 1416/2207] polygon/polyline docs fixes and cleanup --- reference.html | 73 ++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/reference.html b/reference.html index ec4ac87b2db..32254c58c76 100644 --- a/reference.html +++ b/reference.html @@ -2634,26 +2634,17 @@

      Usage example

      // zoom the map to the polyline map.fitBounds(polyline.getBounds());
      -

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      +

      You can also pass a multi-dimensional array to represent a MultiPolyline shape:

      -
      // create a red polyline from an arrays  of arrays of LatLng points
      +
      // create a red polyline from an array of arrays of LatLng points
       var latlngs = [
      -	[
      -	  [-122.68, 45.51],
      -	  [-122.43, 37.77],
      -	  [-118.2, 34.04]
      -	],
      -	[
      -	  [-73.91, 40.78],
      -	  [-87.62, 41.83],
      -	  [-96.72, 32.76]
      -	]
      -]
      -
      -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
      -
      -// zoom the map to the polyline
      -map.fitBounds(polyline.getBounds());
      + [[-122.68, 45.51], + [-122.43, 37.77], + [-118.2, 34.04]], + [[-73.91, 40.78], + [-87.62, 41.83], + [-96.72, 32.76]] +];

      Creation

      @@ -2670,7 +2661,7 @@

      Creation

      - Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a a Polyline with multiple separate lines (MultiPolyline) by passing an array that contains arrays of geographic points. + Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a Polyline object with multiple separate lines (MultiPolyline) by passing an array of arrays of geographic points. @@ -2765,46 +2756,34 @@

      Polygon

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      Usage example

      -
      // create a red polygon from an arrays of LatLng points
      -var latlngs = [
      -  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      -];
      +
      // create a red polygon from an array of LatLng points
      +var latlngs = [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]];
       
       var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
       
       // zoom the map to the polygon
       map.fitBounds(polygon.getBounds());
      -

      You can also pass a array of arrays of latlngs, the first array represents the outer shape and the other arrays represent holes in the outer shape.

      +

      You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

      -
      // create a red polygon from an arrays of LatLng points
      +
      
       var latlngs = [
      -  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      -  [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      -];
      -
      -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
      +  [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring
      +  [[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole
      +];
      -// zoom the map to the polygon -map.fitBounds(polygon.getBounds());
      +

      Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

      -

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      - -
      // create a red polygon from an arrays of arrays of LatLng points
      +
      
       var latlngs = [
      -  [
      -    [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ],
      -    [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      +  [ // first polygon
      +    [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring
      +    [[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole
         ],
      -  [
      -    [ [-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38] ]
      +  [ // second polygon
      +    [[-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38]]
         ]
      -]
      -
      -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
      -
      -// zoom the map to the polygon
      -map.fitBounds(polygon.getBounds());
      +];

      Creation

      @@ -2822,7 +2801,7 @@

      Creation

      - Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a Polygon with multiple separate lines (MultiPolygon) by passing an array of Polygon coordinates. + Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a Polygon with multiple separate shapes (MultiPolygon) by passing an array of Polygon coordinates. From 4b7e669be99ffb6107510d6fffa251e567b46b49 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 29 Dec 2014 09:49:56 -0800 Subject: [PATCH 1417/2207] more layer docs --- reference-tpl.html | 2 +- reference.html | 2744 +++++++++++++++++++++----------------------- 2 files changed, 1327 insertions(+), 1419 deletions(-) diff --git a/reference-tpl.html b/reference-tpl.html index 82033923ba1..8c789bf7015 100644 --- a/reference-tpl.html +++ b/reference-tpl.html @@ -45,7 +45,7 @@

      Methods

      Description - [method]( argument, argument ) + [method](<type> argument, <type> argument) [return-type] [description] diff --git a/reference.html b/reference.html index 32254c58c76..658d79d852f 100644 --- a/reference.html +++ b/reference.html @@ -37,7 +37,6 @@

      Raster Layers

      Vector Layers

      @@ -56,6 +55,7 @@

      Other Layers

    71. LayerGroup
    72. FeatureGroup
    73. GeoJSON
    74. +
    75. GridLayer
    76. Basic Types

        @@ -75,10 +75,11 @@

        Controls

      -

      Events

      +

      Shared Methods

      Utility

        @@ -111,6 +112,7 @@

        Base Classes

        Misc

          +
        • Event objects
        • global switches
        • noConflict
        • version
        • @@ -1006,6 +1008,20 @@

          Other Methods

          HTMLElement Returns the container element of the map. + + createPane( + <String> name, <HTMLElement> contianer? + ) + MapPane + Creates a pane with the given name. Created panes will be given a generated class based on the name like .leaflet-pane-name" + + + getPane( + <String> name + ) + MapPane + Returns the HTML element representing the named map pane. + getPanes() MapPanes @@ -1259,47 +1275,51 @@

          Properties

          Map Panes

          -

          An object literal (returned by map.getPanes) that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

          +

          Panes are DOM elements used to control the ordering of layers on the map. You can access panes with map.getPane or map.getPanesmethods. New panes can be created with the map.createPane method.

          + +

          Every map has the following panes that differ only in zIndex.

          - + + + + - + - + + + - - - - - + +
          PropertyPane TypeZ Index Description
          mapPane HTMLElement'auto' Pane that contains all other map panes.
          tilePane HTMLElement2 Pane for tile layers.
          objectsPaneoverlayPane HTMLElementPane that contains all the panes except tile pane.4Pane for overlays like polylines and polygons.
          shadowPane HTMLElement5 Pane for overlay shadows (e.g. marker shadows).
          overlayPaneHTMLElementPane for overlays like polylines and polygons.
          markerPane HTMLElement6 Pane for marker icons.
          popupPane HTMLElement7 Pane for popups.
          @@ -1307,7 +1327,7 @@

          Map Panes

          Marker

          -

          Used to put markers on the map.

          +

          Used to put markers on the map. Extends Layer.

          L.marker([50.5, 30.5]).addTo(map);
          @@ -1398,6 +1418,18 @@

          Options

          250 The z-index offset used for the riseOnHover feature. + + pane + String + 'markerPane' + Map pane where the markers icon will be added. + + + shadowPane + String + 'shadowPane' + Map pane where the markers shadow will be added. +

          Events

          @@ -1484,20 +1516,14 @@

          Events

          Methods

          +

          In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          + - - - - - - @@ -1737,21 +1763,35 @@
          Method Returns Description
          addTo( - <Map> map ) - thisAdds the marker to the map.
          getLatLng() LatLng
          -

          Methods

          +

          Events

          - - + + - + + + + + + + + + +
          MethodReturnsEventData Description
          addTo( - <Map> map ) - addedPopupEventFired when the popup is added to the map.
          removedPopupEventFired when the popup is removed from the map.
          - this - Adds the popup to the map. +

          Methods

          + +

          In addition to shared layer methods like addTo() and remove() you can also use the following methods:

          + + + + + + + + + + + + @@ -2002,6 +2048,11 @@

          Events

          + + + + +
          MethodReturnsDescription
          openOn( @@ -1828,9 +1868,9 @@

          URL template

          A string of the following form:

          -
          'http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png'
          +
          'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
          -

          {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

          +

          {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add @2x to the URL to load retina tiles.

          You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

          @@ -1929,6 +1969,12 @@

          Options

          null The explicit zIndex of the tile layer. Not set by default.
          updateIntervalNumber200Tiles will not update more then once every updateInterval.
          unloadInvisibleTiles Boolean TileEvent Fired when a tile is removed (e.g. when you have unloadInvisibleTiles on).
          tileerrorTileEventFired when there is an error loading a tile.

          Methods

          @@ -2173,77 +2224,6 @@

          Methods

          -

          TileLayer.Canvas

          - -

          Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer.

          - -

          Usage example

          - -
          var canvasTiles = L.tileLayer.canvas();
          -
          -canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
          -	var ctx = canvas.getContext('2d');
          -	// draw something on the tile canvas
          -}
          - -

          Creation

          - - - - - - - - - - - - -
          FactoryDescription
          L.tileLayer.canvas( - <TileLayer options> options? ) - Instantiates a Canvas tile layer object given an options object (optionally).
          - -

          Options

          - - - - - - - - - - - - - -
          OptionTypeDefaultDescription
          asyncBooleanfalseIndicates that tiles will be drawn asynchronously. tileDrawn method should be called for each tile after drawing completion.
          - -

          Methods

          - - - - - - - - - - - - - - - - - -
          MethodReturnsDescription
          drawTile( - <HTMLCanvasElement> canvas, - <Point> tilePoint, - <Number> zoom ) - thisYou need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom.
          tileDrawn( <HTMLCanvasElement> canvas )-If async option is defined, this function should be called for each tile after drawing completion. canvas is the same canvas element, that was passed to drawTile.
          - -

          ImageOverlay

          Used to load and display a single image over specific bounds of the map. Extends Layer.

          @@ -2342,7 +2322,7 @@

          Methods

          Path

          -

          An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. +

          An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

          Options

          @@ -2501,12 +2481,16 @@

          Events

          Methods

          + +

          In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          + +<<<<<<< HEAD
          Method Returns Description
          addTo( <Map> map ) @@ -2692,7 +2676,7 @@

          Options

          Methods

          -

          You can use Path methods and additionally the following methods:

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          @@ -2807,7 +2791,7 @@

          Creation

          Methods

          -

          Polygon has the same options and methods as Polyline, with the following differences:

          +

          In addition to Path methods like redraw() and bringToFront(), Polyline mehtods like setLatLngs() and getLatLngs(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          @@ -2859,7 +2843,7 @@

          Creation

          Methods

          -

          You can use Path methods and additionally the following methods:

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          @@ -2906,6 +2890,8 @@

          Creation

          Methods

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          +
          @@ -2972,6 +2958,8 @@

          Creation

          Methods

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          +
          Method
          @@ -3145,8 +3133,6 @@

          Creation

          Methods

          -

          Has all layerGroup methods and additionally:

          -
          Method
          @@ -3392,113 +3378,321 @@

          Static methods

          Method
          +

          GridLayer

          +

          Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas.

          +

          GridLayer can be extended to create a tiled grid of HTML Elements like <canvas>, <img> or <div>.GridLayer will handle creating and animating these DOM elements for you.

          -

          LatLng

          +

          Synchronous usage example

          -

          Represents a geographical point with a certain latitude and longitude.

          -
          var latlng = L.latLng(50.5, 30.5);
          +

          To create a custom layer, extend GridLayer and impliment the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

          -

          All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

          +
          var CanvasLayer = L.GridLayer.extend({
          +	createTile: function(coords){
          +		// create a <canvas> element for drawing
          +		var tile = L.DomUtil.create('canvas', 'leaflet-tile');
           
          -
          map.panTo([50, 30]);
          -map.panTo({lon: 30, lat: 50});
          -map.panTo({lat: 50, lng: 30});
          -map.panTo(L.latLng(50, 30));
          + // setup tile width and height according to the options + tile.width = tile.height = this.options.tileSize; -

          Creation

          + // get a canvas context and draw something on it using coords.x, coords.y and coords.z + var ctx = canvas.getContext('2d'); - - - + // return the tile so it can be rendered on screen + return tile; + } +}); + +

          Asyncronous usage example

          + +

          Tile creation can also be asyncronous, this is useful when using a third-party drawing library. Once the tile is finsihed drawing it can be passed to the done() callback.

          + +
          var CanvasLayer = L.GridLayer.extend({
          +	createTile: function(coords, done){
          +		var error;
          +
          +		// create a <canvas> element for drawing
          +		var tile = L.DomUtil.create('canvas', 'leaflet-tile');
          +
          +		// setup tile width and height according to the options
          +		tile.width = tile.height = this.options.tileSize;
          +
          +		// draw something and pass the tile to the done() callback
          +		done(error, tile);
          +	}
          +});
          +

          Constructor

          + +
          Factory
          + + - - - - + +
          Factory Description
          L.latLng( - <Number> latitude, - <Number> longitude, - <Number> altitude? ) - Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
          -

          Properties

          +

          Options

          - +
          - - + + + - + - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          PropertyTypeOptionTypeDefault value Description
          latmaxZoom NumberLatitude in degrees.'tilePane'The map pane the layer will be added to.
          lngtileSize NumberLongitude in degrees.256Width and height of tiles in the grid. Can be used in the createTile() function.
          opacityNumber1Opacity of the tiles. Can be used in the createTile() function.
          unloadInvisibleTilesBooleandependsIf true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false.
          updateWhenIdleBooleandependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false.
          updateIntervalNumber200Tiles will not update more then once every updateInterval.
          zIndexNumbernullThe explicit zIndex of the tile layer. Not set by default.
          boundsLatLngBoundsnullIf set tiles will only be loaded inside inside the set LatLngBounds.
          boundsLatLngBoundsnullIf set tiles will only be loaded inside inside the set LatLngBounds.
          minZoomNumber0The minimum zoom level that tiles will be loaded at. By default the entire map.

          Methods

          - +
          - - - + + + - + + + + + - - + + - - - + + - - - + + + - - - - + +
          MethodReturnsDescriptionbringToFront()thisBrings the tile layer to the top of all tile layers.
          distanceTo( - <LatLng> otherLatlng ) + bringToBack()thisBrings the tile layer to the bottom of all tile layers.
          setOpacity( + <Number> opacity ) NumberReturns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipediathisChanges the opacity of the tile layer.
          equals( - <LatLng> otherLatlng ) + setZIndex( + <Number> zIndex ) BooleanReturns true if the given LatLng point is at the same position (within a small margin of error).thisSets the zIndex of the tile layer.
          toString()StringReturns a string representation of the point (for debugging purposes).redraw()thisCauses the layer to clear all the tiles and request them again.
          wrap( - <Number> left, - <Number> right ) + getContainer() LatLngReturns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default).HTMLElementReturns the HTML element that contains the tiles for this layer.
          -

          Constants

          +

          Events

          - +
          - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          ConstantTypeValueEventData Description
          DEG_TO_RADNumberloadingEventFired when the tile layer starts loading tiles.
          loadEventFired when the tile layer loaded all visible tiles.
          tileloadstartTileEventFired when a tile is requested and starts loading.
          tileloadTileEventFired when a tile loads.
          tileunloadTileEventFired when a tile is removed (e.g. when you have unloadInvisibleTiles on).
          tileerrorTileEventFired when there is an error loading a tile.
          + +

          LatLng

          + +

          Represents a geographical point with a certain latitude and longitude.

          +
          var latlng = L.latLng(50.5, 30.5);
          + +

          All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

          + +
          map.panTo([50, 30]);
          +map.panTo({lon: 30, lat: 50});
          +map.panTo({lat: 50, lng: 30});
          +map.panTo(L.latLng(50, 30));
          + +

          Creation

          + + + + + + + + + + + + + +
          FactoryDescription
          L.latLng( + <Number> latitude, + <Number> longitude, + <Number> altitude? ) + Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
          + +

          Properties

          + + + + + + + + + + + + + + + + + +
          PropertyTypeDescription
          latNumberLatitude in degrees.
          lngNumberLongitude in degrees.
          + +

          Methods

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          MethodReturnsDescription
          distanceTo( + <LatLng> otherLatlng ) + NumberReturns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia
          equals( + <LatLng> otherLatlng ) + BooleanReturns true if the given LatLng point is at the same position (within a small margin of error).
          toString()StringReturns a string representation of the point (for debugging purposes).
          wrap( + <Number> left, + <Number> right ) + LatLngReturns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default).
          + +

          Constants

          + + + + + + + + + + + @@ -4439,10 +4633,9 @@

          Options

          ConstantTypeValueDescription
          DEG_TO_RADNumber Math.PI / 180 A multiplier for converting degrees into radians.
          -

          Events methods

          -

          A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

          +

          A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

          Example

          @@ -4564,287 +4757,117 @@

          Methods

          -

          Event objects

          - -

          Event object is an object that you receive as an argument in a listener function when some event is fired, containing useful information about that event. For example:

          - -
          map.on('click', function(e) {
          -	alert(e.latlng); // e is an event object (MouseEvent in this case)
          -});
          - -

          Event

          +

          Layer methods

          -

          The base event object. All other event objects contain these properties too.

          +A set of methods inherited from the Layer base class that all Leaflet layers use. - - - - - - - - - - - - - - - - -
          propertytypedescription
          typeStringThe event type (e.g. 'click').
          targetObjectThe object that fired the event.
          +
          var layer = L.Marker(latlng).addTo(map);
          +layer.addTo(map);
          +layer.remove();
          -

          MouseEvent

          +

          Methods

          - +
          - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
          propertytypedescriptionMethodReturnsDescription
          latlngLatLngThe geographical point where the mouse event occured.addTo(<Map> map)thisAdds the layer to the given map.
          layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.removeFrom(<Map> map)thisRemoves the layer to the given map.
          containerPointPointPixel coordinates of the point where the mouse event occured relative to the map сontainer.remove()thisRemoves the layer from the map it is currently active on.
          originalEventDOMMouseEventThe original DOM mouse event fired by the browser.getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
          -

          LocationEvent

          +

          Popup methods

          - - - - - - +A set of methods inherited from the Layer base class that all Leaflet layers use. These methods provide convieniant ways of binding popups to any layer. + +
          var layer = L.Polgon(latlngs).bindPopup('Hi There!').addTo(map);
          +layer.openPopup();
          +layer.closePopup();
          +
          + +Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened. + +

          Methods

          +
          propertytypedescription
          - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
          latlngLatLngDetected geographical location of the user.MethodReturnsDescription
          boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).bindPopup(<String|HTMLElement|Popup> content, <PopupOptions> options?)thisBinds the passed content to the layer and sets up the neccessary event listeners.
          accuracyNumberAccuracy of location in meters.unbindPopup()thisRemoves the popup previously bound with bindPopup.
          altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.openPopup(LatLng latlng?)thisOpens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.
          altitudeAccuracyNumberAccuracy of altitude in meters.closePopup()thisCloses the popup if it is open.
          headingNumberThe direction of travel in degrees counting clockwise from true North.togglePopup()thisOpens or closes the popup depending on its current state.
          speedNumberCurrent velocity in meters per second.setPopupContent(<String|HTMLElement|Popup> content, <PopupOptions> options?)thisSets the content of the popup.
          timestampNumberThe time when the position was acquired.getPopup()PopupReturns the popup bound to this layer.
          -

          ErrorEvent

          +

          Browser

          - +

          A namespace with properties for browser/feature detection used by Leaflet internally.

          + +
          if (L.Browser.ie6) {
          +	alert('Upgrade your browser, dude!');
          +}
          + +
          - - - - - - - - - -
          property type description
          messageStringError message.
          codeNumberError code (if applicable).
          - -

          LayerEvent

          - - - - - - - - - - - - -
          propertytypedescription
          layerILayerThe layer that was added or removed.
          - -

          LayersControlEvent

          - - - - - - - - - - - - - - - - - -
          propertytypedescription
          layerILayerThe layer that was added or removed.
          nameStringThe name of the layer that was added or removed.
          - -

          TileEvent

          - - - - - - - - - - - - -
          propertytypedescription
          tileHTMLElementThe tile element (image).
          - -

          ResizeEvent

          - - - - - - - - - - - - - - - - - -
          propertytypedescription
          oldSizePointThe old size before resize event.
          newSizePointThe new size after the resize event.
          - -

          GeoJSON event

          - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          propertytypedescription
          layerILayerThe layer for the GeoJSON feature that is being added to the map.
          propertiesObjectGeoJSON properties of the feature.
          geometryTypeStringGeoJSON geometry type of the feature.
          idStringGeoJSON ID of the feature (if present).
          - - - - - - - - - - - - - - -
          propertytypedescription
          popupPopupThe popup that was opened or closed.
          - -

          DragEndEvent

          - - - - - - - - - - - - -
          propertytypedescription
          distanceNumberThe distance in pixels the draggable element was moved by.
          - - - - -

          Browser

          - -

          A namespace with properties for browser/feature detection used by Leaflet internally.

          - -
          if (L.Browser.ie6) {
          -	alert('Upgrade your browser, dude!');
          -}
          - - - - - - - - - - - + + + @@ -4923,12 +4946,7 @@

          Util

          Various utility functions, used by Leaflet internally.

          -<<<<<<< HEAD -

          The initialize method is your class's constructor function, meaning that it gets called when you do new MyClass(...).

          - -=======

          Methods

          ->>>>>>> refactory into utilities and base classes
          propertytypedescription
          ieBooleantrue for all Internet Explorer versions.ieBooleantrue for all Internet Explorer versions.
          ie6
          @@ -4950,1129 +4968,762 @@

          Methods

          <Function> fn, <Object> obj ) + + + + + + + + + + + + + + + + + + + + -<<<<<<< HEAD -
          new L.Map('map'); // becomes:
          -L.map('map');
          - -

          The factories are implemented very easily, and you can do this for your own classes:

          + + + -
          L.map = function (id, options) {
          -	return new L.Map(id, options);
          -};
          + + + + + + + + + + + + -

          Inheritance

          + + + + + -

          You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

          + + + + + -
          var MyChildClass = MyClass.extend({
          -	// ... new properties and methods
          -});
          + + + + + -

          This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

          + + + + + -
          var a = new MyChildClass();
          -a instanceof MyChildClass; // true
          -a instanceof MyClass; // true
          -
          - -

          You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

          - -
          var MyChildClass = MyClass.extend({
          -	initialize: function () {
          -		MyClass.prototype.initialize.call(this, "Yo");
          -	},
          -
          -	greet: function (name) {
          -		MyClass.prototype.greet.call(this, 'bro ' + name + '!');
          -	}
          -});
          -
          -var a = new MyChildClass();
          -a.greet('Jason'); // alerts "Yo, bro Jason!"
          - -

          Options

          - -

          options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

          + + + + + -
          var MyClass = L.Class.extend({
          -	options: {
          -		myOption1: 'foo',
          -		myOption2: 'bar'
          -	}
          -});
          +		
          + + +
          FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut.
          stamp( <Object> obj )StringApplies a unique key to the object and returns that key. Has an L.stamp shortcut.
          requestAnimFrame( + <Function> fn, + <Object> context?, + <Boolean> immediate?, + <HTMLElement> element? ) + NumberSchedules fn to be executed when the browser repaints. When immediate is set, fn is called immediately if the browser doesn't have native support for requestAnimationFrame, otherwise it's delayed. Returns an id that can be used to cancel the request
          cancelAnimFrame( + <Number> id ) + -Cancels a previous request to requestAnimFrame.
          limitExecByInterval( + <Function> fn, + <Number> time, + <Object> context? ) + FunctionReturns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called.
          falseFn()FunctionReturns a function which always returns false.
          formatNum( + <Number> num, + <Number> digits ) + NumberReturns the number num rounded to digits decimals.
          splitWords( + <String> str ) + String[]Trims and splits the string on whitespace and returns the array of parts.
          setOptions( + <Object> obj, + <Object> options ) + ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.
          getParamString( + <Object> obj ) + StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'.
          template( + <String> str, <Object> data ) + StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' and a data object like {a: 'foo', b: 'bar'}, returns evaluated string ('Hello foo, bar'). You can also specify functions instead of strings for data values — they will be evaluated passing data as an argument.
          isArray( + <Object> obj ) + BooleanReturns true if the given object is an array.
          trim( + <String> str ) + StringTrims the whitespace from both ends of the string and returns the result.
          -var MyChildClass = MyClass.extend({ - options: { - myOption1: 'baz', - myOption3: 5 - } -}); +

          Properties

          -var a = new MyChildClass(); -a.options.myOption1; // 'baz' -a.options.myOption2; // 'bar' -a.options.myOption3; // 5
      + + + + + + + + + + + +
      PropertyTypeDescription
      emptyImageUrlStringData URI string containing a base64-encoded empty GIF image. Used as a hack to free memory from unused images on WebKit-powered mobile devices (by setting image src to this string).
      -

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defauls defines in the class:

      -
      var MyClass = L.Class.extend({
      -	options: {
      -		foo: 'bar',
      -		bla: 5
      -	},
       
      -	initialize: function (options) {
      -		L.Util.setOptions(this, options);
      -		...
      -	}
      -});
      +

      Transformation

      -var a = new MyClass({bla: 10}); -a.options; // {foo: 'bar', bla: 10}
      +

      Represents an affine transformation: a set of coefficients a, b, c, d for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing the reverse. Used by Leaflet in its projections code.

      -

      Includes

      +
      var transformation = new L.Transformation(2, 5, -1, 10),
      +	p = L.point(1, 2),
      +	p2 = transformation.transform(p), //  L.point(7, 8)
      +	p3 = transformation.untransform(p2); //  L.point(1, 2)
      +
      -

      includes is a special class property that merges all specified objects into the class (such objects are called mixins). +

      Creation

      -
       var MyMixin = {
      -	foo: function () { ... },
      -	bar: 5
      -};
      +
      +	
      +		
      +		
      +	
      +	
      +		
       
      -var MyClass = L.Class.extend({
      -	includes: MyMixin
      -});
      +		
      +	
      +
      CreationDescription
      new L.Transformation( + <Number> a, + <Number> b, + <Number> c, + <Number> d ) + Creates a transformation object with the given coefficients.
      -var a = new MyClass(); -a.foo();
      +

      Methods

      -

      You can also do such includes in runtime with the include method:

      + + + + + + + + -
      MyClass.include(MyMixin);
      + + + + + -

      Statics

      + + + +
      MethodReturnsDescription
      transform( + <Point> point, + <Number> scale? ) + PointReturns a transformed point, optionally multiplied by the given scale. Only accepts real L.Point instances, not arrays.
      untransform( + <Point> point, + <Number> scale? ) + PointReturns the reverse transformation of the given point, optionally divided by the given scale. Only accepts real L.Point instances, not arrays.
      -

      statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

      -
      var MyClass = L.Class.extend({
      -	statics: {
      -		FOO: 'bar',
      -		BLA: 5
      -	}
      -});
       
      -MyClass.FOO; // 'bar'
      +

      LineUtil

      -

      Constructor Hooks

      +

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      -

      If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

      +

      Methods

      -
      MyClass.addInitHook(function () {
      -	// ... do something in constructor additionally
      -	// e.g. add event listeners, set custom properties etc.
      -});
      + + + + + + + + -

      You can also use the following shortcut when you just need to make one additional method call:

      + -
      MyClass.addInitHook('methodName', arg1, arg2, …);
      + + + + -

      Evented

      + -

      When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

      + + + + -
      MyEventedClass = L.Evented.extend({
      -	fire: function(){
      -		this.fire('custom', {
      -			// you can attach optional data to an event as an object
      -		});
      -	}
      -});
      +		
      -var myEvents = new MyEventedClass(); + + + + -myEvents.on('custom', function(e){ - // e.type will be 'custom' - // anything else you passed in the -}); + -myEvents.fire(); + + +
      MethodReturnsDescription
      simplify( + <Point[]> points, + <Number> tolerance ) + Point[]Dramatically reduces the number of points in a polyline while retaining its shape and returns a new array of simplified points. Used for a huge performance boost when processing/displaying Leaflet polylines for each zoom level and also reducing visual noise. tolerance affects the amount of simplification (lesser value means higher quality but slower and with more points). Also released as a separated micro-library Simplify.js.
      pointToSegmentDistance( + <Point> p, + <Point> p1, + <Point> p2 ) + NumberReturns the distance between point p and segment p1 to p2.
      closestPointOnSegment( + <Point> p, + <Point> p1, + <Point> p2 ) + PointReturns the closest point from a point p on a segment p1 to p2.
      clipSegment( + <Point> a, + <Point> b, + <Bounds> bounds ) + -Clips the segment a to b by rectangular bounds (modifying the segment points directly!). Used by Leaflet to only show polyline points that are on the screen or near, increasing performance.
      -You can still use the old-style `L.Mixin.Events` for backward compatibility. -
      // this class will include all event methods
      -MyEventedClass = L.Class.extend({
      -	includes: L.Mixin.Events
      -});
      -

      Layer

      +

      PolyUtil

      -

      When implementing a custom layer the L.Layer class can be extended to implementing basic functionality that all layers need to share, these methods can be used when extending L.Layer when implementing custom layers.

      +

      Various utility functions for polygon geometries.

      -

      Options

      +

      Methods

      - +
      - - - + + - - - - + + + + +
      OptionTypeDefault valueMethodReturns Description
      paneString'overlayPane'By default the layer will be added to the maps overlay pane. Overriding this option will cause the layer to be placed on another pane by default.clipPolygon( + <Point[]> points, + <Bounds> bounds ) + Point[]Clips the polygon geometry defined by the given points by rectangular bounds. Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping than polyline, so there's a seperate method for it.
      -

      Events

      - + + +

      DomEvent

      + +

      Utility functions to work with the DOM events, used by Leaflet internally.

      + +

      Methods

      + +
      - - + + - - - - - - - - - -
      EventDataMethodReturns Description
      addEventFired after the layer is added to a map.
      removeEventFired after the layer is removed from a map.
      - -

      Methods

      + addListener( +
      <HTMLElement> el, + <String> type, + <Function> fn, + <Object> context? ) + - - - - - - - - - - - - - - - - - - - - + + - - - - -
      MethodReturnsDescription
      addTo(<Map> map)thisAdds the layer to the given map.
      removeFrom(<Map> map)thisRemoves the layer to the given map.
      remove()thisRemoves the layer from the map it is currently active on.thisAdds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified.
      getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
      - -

      Browser

      - -

      A namespace with properties for browser/feature detection used by Leaflet internally.

      - -
      if (L.Browser.ie6) {
      -	alert('Upgrade your browser, dude!');
      -}
      + removeListener( + <HTMLElement> el, + <String> type, + <Function> fn ) + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + - - - + + + + - - - + + + + - - - + + + + - - - + + + + - - - + + + +
      propertytypedescription
      ieBooleantrue for all Internet Explorer versions.
      ie6Booleantrue for Internet Explorer 6.
      ie7Booleantrue for Internet Explorer 7.
      webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
      webkit3dBooleantrue for webkit-based browsers that support CSS 3D transformations.
      androidBooleantrue for Android mobile browser.
      android23Booleantrue for old Android stock browsers (2 and 3).thisRemoves an event listener from the element.
      mobileBooleantrue for modern mobile browsers (including iOS Safari and different Android browsers).stopPropagation( + <DOMEvent> e ) + thisStop the given event from propagation to parent elements. Used inside the listener functions: +
      L.DomEvent.addListener(div, 'click', function (e) {
      +	L.DomEvent.stopPropagation(e);
      +});
      +
      mobileWebkitBooleantrue for mobile webkit-based browsers.preventDefault( + <DOMEvent> e ) + thisPrevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions. +
      mobileOperaBooleantrue for mobile Opera.stop( + <DOMEvent> e ) + thisDoes stopPropagation and preventDefault at the same time.
      touchBooleantrue for all browsers on touch devices.disableClickPropagation( + <HTMLElement> el ) + thisAdds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events.
      msTouchBooleantrue for browsers with Microsoft touch model (e.g. IE10).getMousePosition( + <DOMEvent> e, + <HTMLElement> container? ) + PointGets normalized mouse position from a DOM event relative to the container or to the whole page if not specified.
      retinaBooleantrue for devices with Retina screens.getWheelDelta( + <DOMEvent> e ) + NumberGets normalized wheel delta from a mousewheel DOM event.
      -

      Util

      -

      Various utility functions, used by Leaflet internally.

      + +

      DomUtil

      + +

      Utility functions to work with the DOM tree, used by Leaflet internally.

      Methods

      - +
      - - - + + - - - -======= - - ->>>>>>> refactory into utilities and base classes - - - - + -<<<<<<< HEAD - - - + + + + - + - - -======= - ->>>>>>> refactory into utilities and base classes - - - - + - - - - + - - - + + + - - - + + + - - - + + - + + + + + + - + - - + - + - - - + + - - - + +
      Method Returns Description
      extend( - <Object> dest, - <Object> src?.. ) + get( + <String or HTMLElement> id ) ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.HTMLElementReturns an element with the given id if a string was passed, or just returns the element if it was passed directly.
      bind( - <Function> fn, - <Object> obj ) + getStyle( + <HTMLElement> el, + <String> style ) FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind).FunctionReturns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut.
      stamp( <Object> obj ) StringApplies a unique key to the object and returns that key. Has an L.stamp shortcut.Returns the value for a certain style attribute on an element, including computed values or values set through CSS.
      requestAnimFrame( - <Function> fn, - <Object> context?, - <Boolean> immediate?, - <HTMLElement> element? ) + create( + <String> tagName, + <String> className, + <HTMLElement> container? ) NumberSchedules fn to be executed when the browser repaints. When immediate is set, fn is called immediately if the browser doesn't have native support for requestAnimationFrame, otherwise it's delayed. Returns an id that can be used to cancel the requestHTMLElementCreates an element with tagName, sets the className, and optionally appends it to container element.
      cancelAnimFrame( - <Number> id ) - disableTextSelection() -Cancels a previous request to requestAnimFrame.
      limitExecByInterval( - <Function> fn, - <Number> time, - <Object> context? ) + hasClass( + <HTMLElement> el, + <String> name ) FunctionReturns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called.
      Boolean
      falseFn()FunctionReturns a function which always returns false.Returns true if the element class attribute contains name.
      formatNum( - <Number> num, - <Number> digits ) + addClass( + <HTMLElement> el, + <String> name ) NumberReturns the number num rounded to digits decimals.-Adds name to the element's class attribute.
      splitWords( - <String> str ) + removeClass( + <HTMLElement> el, + <String> name ) String[]Trims and splits the string on whitespace and returns the array of parts.-Removes name from the element's class attribute.
      setOptions( - <Object> obj, - <Object> options ) + setOpacity( + <HTMLElement> el, + <Number> value ) ObjectMerges the given properties to the options of the obj object, returning the resulting options. See Class options. Has an L.setOptions shortcut.-Set the opacity of an element (including old IE support). Value must be from 0 to 1.
      getParamString( - <Object> obj ) + testProp( + <String[]> props ) + String or falseGoes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform.
      getTranslateString( + <Point> point ) StringConverts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'.Returns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers.
      template( - <String> str, <Object> data ) +
      getScaleString( + <Number> scale, + <Point> origin ) StringSimple templating facility, accepts a template string of the form 'Hello {a}, {b}' and a data object like {a: 'foo', b: 'bar'}, returns evaluated string ('Hello foo, bar'). You can also specify functions instead of strings for data values — they will be evaluated passing data as an argument.Returns a CSS transform string to scale an element (with the given scale origin).
      isArray( - <Object> obj ) + setPosition( + <HTMLElement> el, + <Point> point, + <Boolean> disable3D? ) BooleanReturns true if the given object is an array.-Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true.
      trim( - <String> str ) + getPosition( + <HTMLElement> el ) StringTrims the whitespace from both ends of the string and returns the result.PointReturns the coordinates of an element previously positioned with setPosition.

      Properties

      - +
      - + - + + + + + +
      Property Type Description
      emptyImageUrlTRANSITION + StringData URI string containing a base64-encoded empty GIF image. Used as a hack to free memory from unused images on WebKit-powered mobile devices (by setting image src to this string).Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit).
      TRANSFORM + StringVendor-prefixed transform style name.
      -

      Transformation

      +

      PosAnimation

      -

      Represents an affine transformation: a set of coefficients a, b, c, d for transforming a point of a form (x, y) into (a*x + b, c*y + d) and doing the reverse. Used by Leaflet in its projections code.

      +

      Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

      -
      var transformation = new L.Transformation(2, 5, -1, 10),
      -	p = L.point(1, 2),
      -	p2 = transformation.transform(p), //  L.point(7, 8)
      -	p3 = transformation.untransform(p2); //  L.point(1, 2)
      -
      +
      var fx = new L.PosAnimation();
      +fx.run(el, [300, 500], 0.5);

      Creation

      - +
      - + - + - +
      CreationCreation Description
      new L.Transformation( - <Number> a, - <Number> b, - <Number> c, - <Number> d ) - new L.PosAnimation()Creates a transformation object with the given coefficients.Creates a PosAnimation object.

      Methods

      - +
      - - - - - - - - - + +
      Method Returns Description
      transform( - <Point> point, - <Number> scale? ) - PointReturns a transformed point, optionally multiplied by the given scale. Only accepts real L.Point instances, not arrays.
      untransform( - <Point> point, - <Number> scale? ) + run( + <HTMLElement> element, + <Point> newPos, + <Number> duration?, + <Number> easeLinearity? ) PointReturns the reverse transformation of the given point, optionally divided by the given scale. Only accepts real L.Point instances, not arrays.thisRun an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default)
      +

      Events

      +

      You can subscribe to the following events using these methods.

      - -

      LineUtil

      - -

      Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

      - -

      Methods

      - - +
      - - + + - - - - - - - - - - - - + + + - - - - - + + + - - - - - + + +
      MethodReturnsEventData Description
      simplify( - <Point[]> points, - <Number> tolerance ) - Point[]Dramatically reduces the number of points in a polyline while retaining its shape and returns a new array of simplified points. Used for a huge performance boost when processing/displaying Leaflet polylines for each zoom level and also reducing visual noise. tolerance affects the amount of simplification (lesser value means higher quality but slower and with more points). Also released as a separated micro-library Simplify.js.
      pointToSegmentDistance( - <Point> p, - <Point> p1, - <Point> p2 ) - NumberReturns the distance between point p and segment p1 to p2.startEventFired when the animation starts.
      closestPointOnSegment( - <Point> p, - <Point> p1, - <Point> p2 ) - PointReturns the closest point from a point p on a segment p1 to p2.stepEventFired continuously during the animation.
      clipSegment( - <Point> a, - <Point> b, - <Bounds> bounds ) - -Clips the segment a to b by rectangular bounds (modifying the segment points directly!). Used by Leaflet to only show polyline points that are on the screen or near, increasing performance.endEventFired when the animation ends.
      -

      PolyUtil

      +

      Draggable

      -

      Various utility functions for polygon geometries.

      +

      A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging. Only works for elements that were positioned with DomUtil#setPosition

      -

      Methods

      +
      var draggable = new L.Draggable(elementToDrag);
      +draggable.enable();
      +
      - +

      Creation

      + +
      - - + - - - - +
      MethodReturnsCreation Description
      clipPolygon( - <Point[]> points, - <Bounds> bounds ) + new L.Draggable( + <HTMLElement> element, + <HTMLElement> dragHandle? ) Point[]Clips the polygon geometry defined by the given points by rectangular bounds. Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping than polyline, so there's a seperate method for it.Creates a Draggable object for moving the given element when you start dragging the dragHandle element (equals the element itself by default).
      +

      Events

      +

      You can subscribe to the following events using these methods.

      - -

      DomEvent

      - -

      Utility functions to work with the DOM events, used by Leaflet internally.

      - -

      Methods

      - - +
      - - + + - - - - + + + - - - - + + + - - - - + + + - - - - + + + - - +
      MethodReturnsEventData Description
      addListener( - <HTMLElement> el, - <String> type, - <Function> fn, - <Object> context? ) - thisAdds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified.dragstartEventFired when the dragging starts.
      removeListener( - <HTMLElement> el, - <String> type, - <Function> fn ) - thisRemoves an event listener from the element.predragEventFired continuously during dragging before each corresponding update of the element position.
      stopPropagation( - <DOMEvent> e ) - thisStop the given event from propagation to parent elements. Used inside the listener functions: -
      L.DomEvent.addListener(div, 'click', function (e) {
      -	L.DomEvent.stopPropagation(e);
      -});
      -
      dragEventFired continuously during dragging.
      preventDefault( - <DOMEvent> e ) - thisPrevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions. - dragendDragEndEventFired when the dragging ends.
      stop( - <DOMEvent> e ) -
      - this - Does stopPropagation and preventDefault at the same time. - - - disableClickPropagation( - <HTMLElement> el ) - +

      Methods

      - this - Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events. + + + + + - - - - + + + - - - - + + +
      MethodReturnsDescription
      getMousePosition( - <DOMEvent> e, - <HTMLElement> container? ) - PointGets normalized mouse position from a DOM event relative to the container or to the whole page if not specified.enable()-Enables the dragging ability.
      getWheelDelta( - <DOMEvent> e ) - NumberGets normalized wheel delta from a mousewheel DOM event.disable()-Disables the dragging ability.
      + - Boolean +

      Class

      - Returns true if the element class attribute contains name. - - - addClass( - <HTMLElement> el, - <String> name ) - +

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      +

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      - - +
      var MyClass = L.Class.extend({
      +	initialize: function (greeter) {
      +		this.greeter = greeter;
      +		// class constructor
      +	},
       
      -		Adds name to the element's class attribute.
      -	
      -	
      -		removeClass(
      -			<HTMLElement> el,
      -			<String> name )
      -		
      +	greet: function (name) {
      +		alert(this.greeter + ', ' + name)
      +	}
      +});
       
      -		-
      +// create instance of MyClass, passing "Hello" to the constructor
      +var a = new MyClass("Hello");
       
      -		Removes name from the element's class attribute.
      -	
      -	
      -		setOpacity(
      -			<HTMLElement> el,
      -			<Number> value )
      -		
      +// call greet method, alerting "Hello, World"
      +a.greet("World");
      +
      - - - Set the opacity of an element (including old IE support). Value must be from 0 to 1. - - - testProp( - <String[]> props ) - - String or false - Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. - - - getTranslateString( - <Point> point ) - +

      Class Factories

      - String - Returns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers. - - - getScaleString( - <Number> scale, - <Point> origin ) - +

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      - String - Returns a CSS transform string to scale an element (with the given scale origin). - - - setPosition( - <HTMLElement> el, - <Point> point, - <Boolean> disable3D? ) - +
      new L.Map('map'); // becomes:
      +L.map('map');
      - - - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. - - - getPosition( - <HTMLElement> el ) - +

      The factories are implemented very easily, and you can do this for your own classes:

      - Point - Returns the coordinates of an element previously positioned with setPosition. - - +
      L.map = function (id, options) {
      +	return new L.Map(id, options);
      +};
      -

      Properties

      - - - - - - - - - - - - - - - - -
      PropertyTypeDescription
      TRANSITION - StringVendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit).
      TRANSFORM - StringVendor-prefixed transform style name.
      +

      Inheritance

      +

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      +
      var MyChildClass = MyClass.extend({
      +	// ... new properties and methods
      +});
      -

      PosAnimation

      +

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      -

      Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9.

      +
      var a = new MyChildClass();
      +a instanceof MyChildClass; // true
      +a instanceof MyClass; // true
      +
      -
      var fx = new L.PosAnimation();
      -fx.run(el, [300, 500], 0.5);
      +

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      -

      Creation

      +
      var MyChildClass = MyClass.extend({
      +	initialize: function () {
      +		MyClass.prototype.initialize.call("Yo");
      +	},
       
      -
      -	
      -		
      -		
      -	
      -	
      -		
      +	greet: function (name) {
      +		MyClass.prototype.greet.call(this, 'bro ' + name + '!');
      +	}
      +});
       
      -		
      -	
      -
      CreationDescription
      new L.PosAnimation()Creates a PosAnimation object.
      +var a = new MyChildClass(); +a.greet('Jason'); // alerts "Yo, bro Jason!"
      -

      Methods

      - - - - - - - - - - - - - -
      MethodReturnsDescription
      run( - <HTMLElement> element, - <Point> newPos, - <Number> duration?, - <Number> easeLinearity? ) - thisRun an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default)
      - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      startEventFired when the animation starts.
      stepEventFired continuously during the animation.
      endEventFired when the animation ends.
      - - - -

      Draggable

      - -

      A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging. Only works for elements that were positioned with DomUtil#setPosition

      - -
      var draggable = new L.Draggable(elementToDrag);
      -draggable.enable();
      -
      - -

      Creation

      - - - - - - - - - - - -
      CreationDescription
      new L.Draggable( - <HTMLElement> element, - <HTMLElement> dragHandle? ) - Creates a Draggable object for moving the given element when you start dragging the dragHandle element (equals the element itself by default).
      - -

      Events

      - -

      You can subscribe to the following events using these methods.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      dragstartEventFired when the dragging starts.
      predragEventFired continuously during dragging before each corresponding update of the element position.
      dragEventFired continuously during dragging.
      dragendDragEndEventFired when the dragging ends.
      - -

      Methods

      - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      enable()-Enables the dragging ability.
      disable()-Disables the dragging ability.
      - - - -

      Class

      - -

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      -

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      - -
      var MyClass = L.Class.extend({
      -	initialize: function (greeter) {
      -		this.greeter = greeter;
      -		// class constructor
      -	},
      -
      -	greet: function (name) {
      -		alert(this.greeter + ', ' + name)
      -	}
      -});
      -
      -// create instance of MyClass, passing "Hello" to the constructor
      -var a = new MyClass("Hello");
      -
      -// call greet method, alerting "Hello, World"
      -a.greet("World");
      -
      - - -

      Class Factories

      - -

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      - -
      new L.Map('map'); // becomes:
      -L.map('map');
      - -

      The factories are implemented very easily, and you can do this for your own classes:

      - -
      L.map = function (id, options) {
      -	return new L.Map(id, options);
      -};
      - - -

      Inheritance

      - -

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      - -
      var MyChildClass = MyClass.extend({
      -	// ... new properties and methods
      -});
      - -

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      - -
      var a = new MyChildClass();
      -a instanceof MyChildClass; // true
      -a instanceof MyClass; // true
      -
      - -

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      - -
      var MyChildClass = MyClass.extend({
      -	initialize: function () {
      -		MyClass.prototype.initialize.call("Yo");
      -	},
      -
      -	greet: function (name) {
      -		MyClass.prototype.greet.call(this, 'bro ' + name + '!');
      -	}
      -});
      -
      -var a = new MyChildClass();
      -a.greet('Jason'); // alerts "Yo, bro Jason!"
      - -

      Options

      +

      Options

      options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

      @@ -6212,22 +5863,6 @@

      Methods

      Description -<<<<<<< HEAD - onAdd( - <Map> map ) - - - - - Should contain code that creates DOM elements for the overlay, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer). - - - onRemove( - <Map> map ) - - - - - Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer). -======= onAdd(<Map> map) this Should contain code that creates DOM elements for the overlay, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer). @@ -6241,7 +5876,6 @@

      Methods

      getEvents() Object This optional method should return an object like { viewreset: this._reset }for addEventListener. These events will be automatically added and removed from the map with your layer. ->>>>>>> refactory into utilities and base classes @@ -6524,205 +6158,479 @@

      Handler

      - - - + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescriptionMethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      + +

      Projection

      + +

      An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See Map projection.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      project( + <LatLng> latlng ) + PointProjects geographical coordinates into a 2D point.
      unproject( + <Point> point ) + LatLngThe inverse of project. Projects a 2D point into geographical location.
      + +

      Defined Projections

      + +

      Leaflet comes with a set of already defined projections out of the box:

      + + + + + + + + + + + + + + + + + + + + + +
      ProjectionDescription
      L.Projection.SphericalMercatorSpherical Mercator projection — the most common projection for online maps, used by almost all free and commercial tile providers. Assumes that Earth is a sphere. Used by the EPSG:3857 CRS.
      L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.
      L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, mostly used by GIS enthusiasts. Directly maps x as longitude, and y as latitude. Also suitable for flat worlds, e.g. game maps. Used by the EPSG:3395 and Simple CRS.
      + + + + +

      CRS

      + +

      Defines coordinate reference systems for projecting geographical points into pixel (screen) coordinates and back (and to coordinates in other units for WMS services). See Spatial reference system.

      + +

      Methods

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      latLngToPoint( + <LatLng> latlng, + <Number> zoom ) + PointProjects geographical coordinates on a given zoom into pixel coordinates.
      pointToLatLng( + <Point> point, + <Number> zoom ) + LatLngThe inverse of latLngToPoint. Projects pixel coordinates on a given zoom into geographical coordinates.
      project( + <LatLng> latlng ) + PointProjects geographical coordinates into coordinates in units accepted for this CRS (e.g. meters for EPSG:3857, for passing it to WMS services).
      scale( + <Number> zoom ) + NumberReturns the scale used when transforming projected coordinates into pixel coordinates for a particular zoom. For example, it returns 256 * 2^zoom for Mercator-based CRS.
      getSize( + <Number> zoom ) + PointReturns the size of the world in pixels for a particular zoom.
      + +

      Properties

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PropertyTypeDescription
      projectionIProjectionProjection that this CRS uses.
      transformationTransformationTransformation that this CRS uses to turn projected coordinates into screen coordinates for a particular tile service.
      codeStringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857').
      + +

      Defined CRS

      + +

      Leaflet comes with a set of already defined CRS to use out of the box:

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ProjectionDescription
      L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial tile providers. Uses Spherical Mercator projection. Set in by default in Map's crs option.
      L.CRS.EPSG4326A common CRS among GIS enthusiasts. Uses simple Equirectangular projection.
      L.CRS.EPSG3395Rarely used by some commercial tile providers. Uses Elliptical Mercator projection.
      L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps). Note that the y axis should still be inverted (going from bottom to top).
      + +

      If you want to use some obscure CRS not listed here, take a look at the Proj4Leaflet plugin.

      + +

      Event objects

      + +

      Event object is an object that you recieve as an argument in a listener function when some event is fired, containing useful information about that event. For example:

      + +
      map.on('click', function(e) {
      +	alert(e.latlng); // e is an event object (MouseEvent in this case)
      +});
      + +

      Event

      + +

      The base event object. All other event objects contain these properties too.

      + + + + + + + + + + + + + + + + + +
      propertytypedescription
      typeStringThe event type (e.g. 'click').
      targetObjectThe object that fired the event.
      + +

      MouseEvent

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      propertytypedescription
      latlngLatLngThe geographical point where the mouse event occured.
      layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.
      containerPointPointPixel coordinates of the point where the mouse event occured relative to the map сontainer.
      originalEventDOMMouseEventThe original DOM mouse event fired by the browser.
      + +

      LocationEvent

      + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + +
      propertytypedescription
      latlngLatLngDetected geographical location of the user.
      boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
      enable()-Enables the handler.accuracyNumberAccuracy of location in meters.
      disable()-Disables the handler.altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
      enabled()BooleanReturns true if the handler is enabled.altitudeAccuracyNumberAccuracy of altitude in meters.
      headingNumberThe direction of travel in degrees counting clockwise from true North.
      speedNumberCurrent velocity in meters per second.
      timestampNumberThe time when the position was acquired.
      -

      Projection

      - -

      An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See Map projection.

      - -

      Methods

      +

      ErrorEvent

      - +
      - - - + + + - - - - + + + - - - - + + +
      MethodReturnsDescriptionpropertytypedescription
      project( - <LatLng> latlng ) - PointProjects geographical coordinates into a 2D point.messageStringError message.
      unproject( - <Point> point ) - LatLngThe inverse of project. Projects a 2D point into geographical location.codeNumberError code (if applicable).
      -

      Defined Projections

      - -

      Leaflet comes with a set of already defined projections out of the box:

      +

      LayerEvent

      - +
      - - + + + - + + + + +
      ProjectionDescriptionpropertytypedescription
      L.Projection.SphericalMercatorlayerILayerThe layer that was added or removed.
      - Spherical Mercator projection — the most common projection for online maps, used by almost all free and commercial tile providers. Assumes that Earth is a sphere. Used by the EPSG:3857 CRS. +

      LayersControlEvent

      + + + + + + - - - + + + - - - + + +
      propertytypedescription
      L.Projection.MercatorElliptical Mercator projection — more complex than Spherical Mercator. Takes into account that Earth is a geoid, not a perfect sphere. Used by the EPSG:3395 CRS.layerILayerThe layer that was added or removed.
      L.Projection.LonLatEquirectangular, or Plate Carree projection — the most simple projection, mostly used by GIS enthusiasts. Directly maps x as longitude, and y as latitude. Also suitable for flat worlds, e.g. game maps. Used by the EPSG:3395 and Simple CRS.nameStringThe name of the layer that was added or removed.
      +

      TileEvent

      - - -

      CRS

      - -

      Defines coordinate reference systems for projecting geographical points into pixel (screen) coordinates and back (and to coordinates in other units for WMS services). See Spatial reference system.

      - -

      Methods

      - - +
      - - - + + + - - - - + + + - - +
      MethodReturnsDescriptionpropertytypedescription
      latLngToPoint( - <LatLng> latlng, - <Number> zoom ) - PointProjects geographical coordinates on a given zoom into pixel coordinates.tileHTMLElementThe tile element (image).
      pointToLatLng( - <Point> point, - <Number> zoom ) -
      - LatLng - The inverse of latLngToPoint. Projects pixel coordinates on a given zoom into geographical coordinates. +

      TileErrorEvent

      + + + + + + - + + + + +
      propertytypedescription
      project( - <LatLng> latlng ) - tileHTMLElementThe tile element (image).
      - Point - Projects geographical coordinates into coordinates in units accepted for this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). +

      ResizeEvent

      + + + + + + - - - - + + + - - + - +
      propertytypedescription
      scale( - <Number> zoom ) - NumberReturns the scale used when transforming projected coordinates into pixel coordinates for a particular zoom. For example, it returns 256 * 2^zoom for Mercator-based CRS.oldSizePointThe old size before resize event.
      getSize( - <Number> zoom ) - newSize PointReturns the size of the world in pixels for a particular zoom.The new size after the resize event.
      -

      Properties

      +

      GeoJSON event

      - +
      - - - + + + - - - - + + + - - - - + + + - - - + - + + + + + +
      PropertyTypeDescriptionpropertytypedescription
      projectionIProjectionProjection that this CRS uses.layerILayerThe layer for the GeoJSON feature that is being added to the map.
      transformationTransformationTransformation that this CRS uses to turn projected coordinates into screen coordinates for a particular tile service.propertiesObjectGeoJSON properties of the feature.
      codegeometryType StringStandard code name of the CRS passed into WMS services (e.g. 'EPSG:3857').GeoJSON geometry type of the feature.
      idStringGeoJSON ID of the feature (if present).
      -

      Defined CRS

      - -

      Leaflet comes with a set of already defined CRS to use out of the box:

      + - +
      - - + + + - - - + + + - - +
      ProjectionDescriptionpropertytypedescription
      L.CRS.EPSG3857The most common CRS for online maps, used by almost all free and commercial tile providers. Uses Spherical Mercator projection. Set in by default in Map's crs option.popupPopupThe popup that was opened or closed.
      L.CRS.EPSG4326
      - A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. - - - L.CRS.EPSG3395 +

      DragEndEvent

      - Rarely used by some commercial tile providers. Uses Elliptical Mercator projection. + + + + + - - - + + +
      propertytypedescription
      L.CRS.SimpleA simple CRS that maps longitude and latitude into x and y directly. May be used for maps of flat surfaces (e.g. game maps). Note that the y axis should still be inverted (going from bottom to top).distanceNumberThe distance in pixels the draggable element was moved by.
      -

      If you want to use some obscure CRS not listed here, take a look at the Proj4Leaflet plugin.

      - -

      Global Switches

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      From 6dde7d4edff2cbeb8cd2e66a951e16b7bc94f08c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 13:25:19 +0200 Subject: [PATCH 1418/2207] remove layout: nil in atom.xml --- atom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/atom.xml b/atom.xml index 71d3f59bc93..773e1b69732 100644 --- a/atom.xml +++ b/atom.xml @@ -1,5 +1,4 @@ --- -layout: nil title: Leaflet Developer Blog Atom Feed --- From 86c80ad12856a32fb4e9756da30f35e264e44ab2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 13:42:58 +0200 Subject: [PATCH 1419/2207] clean up docs merges --- reference.html | 48 +----------------------------------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/reference.html b/reference.html index 658d79d852f..427b2182507 100644 --- a/reference.html +++ b/reference.html @@ -2490,52 +2490,6 @@

      Methods

      Returns Description -<<<<<<< HEAD - - addTo( - <Map> map ) - - - this - Adds the layer to the map. - - - bindPopup( - <String> html | <HTMLElement> el | <Popup> popup, - <Popup options> options? ) - - - this - Binds a popup with a particular HTML content to a click on this path. - - - bindPopup( - <Popup> popup, - <Popup options> options? ) - - - this - Binds a given popup object to the path. - - - unbindPopup() - this - Unbinds the popup previously bound to the path with bindPopup. - - - openPopup( - <LatLng> latlng? ) - - - this - Opens the popup previously bound by the bindPopup method in the given point, or in one of the path's points if not specified. - - - closePopup() - - this - Closes the path's bound popup if it is opened. - setStyle( <Path options> object ) @@ -5812,7 +5766,7 @@

      Constructor Hooks

      Evented

      -

      When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

      +

      When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

      MyEventedClass = L.Evented.extend({
       	fire: function(){
      
      From 8548b4c3b5da2c4787de56f92b6547b6e1468aab Mon Sep 17 00:00:00 2001
      From: Vladimir Agafonkin 
      Date: Fri, 6 Mar 2015 14:38:42 +0200
      Subject: [PATCH 1420/2207] move all docs to docs subfolder
      
      ---
       _config.yml                                     |   2 +-
       {_layouts => docs/_layouts}/default.html        |  16 ++++++++--------
       {_layouts => docs/_layouts}/post.html           |   0
       {_layouts => docs/_layouts}/tutorial.html       |   0
       .../_posts}/2012-07-30-leaflet-0-4-released.md  |   0
       ...12-08-07-leaflet-0-4-3-and-a-new-tutorial.md |   0
       ...0-guest-post-markerclusterer-0-1-released.md |   0
       ...et-0-4-5-bugfix-release-and-plans-for-0.5.md |   0
       .../_posts}/2013-01-17-leaflet-0-5-released.md  |   0
       .../_posts}/2013-02-20-guest-post-draw.md       |   0
       ...eaflet-0-6-released-dc-code-sprint-mapbox.md |   0
       ...2013-06-28-leaflet-plugin-authoring-guide.md |   0
       ...-18-leaflet-0-7-released-plans-for-future.md |   0
       atom.xml => docs/atom.xml                       |   0
       blog.md => docs/blog.md                         |   0
       download.md => docs/download.md                 |   0
       examples.md => docs/examples.md                 |  12 ++++++------
       {examples => docs/examples}/baseball-marker.png | Bin
       .../examples}/choropleth-example.html           |   0
       {examples => docs/examples}/choropleth.md       |   0
       .../examples}/custom-icons-example.html         |   0
       {examples => docs/examples}/custom-icons.md     |   0
       .../examples}/geojson-example.html              |   0
       {examples => docs/examples}/geojson.html        |   0
       .../examples}/layers-control-example.html       |   0
       {examples => docs/examples}/layers-control.md   |   0
       {examples => docs/examples}/mobile-example.html |   0
       {examples => docs/examples}/mobile.md           |   0
       .../examples}/quick-start-example.html          |   0
       {examples => docs/examples}/quick-start.md      |   0
       {examples => docs/examples}/sample-geojson.js   |   0
       {examples => docs/examples}/us-states.js        |   0
       features.html => docs/features.html             |   0
       index.md => docs/index.md                       |   0
       plugins.md => docs/plugins.md                   |   0
       reference-tpl.html => docs/reference-tpl.html   |   0
       reference.html => docs/reference.html           |   0
       37 files changed, 15 insertions(+), 15 deletions(-)
       rename {_layouts => docs/_layouts}/default.html (91%)
       rename {_layouts => docs/_layouts}/post.html (100%)
       rename {_layouts => docs/_layouts}/tutorial.html (100%)
       rename {_posts => docs/_posts}/2012-07-30-leaflet-0-4-released.md (100%)
       rename {_posts => docs/_posts}/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md (100%)
       rename {_posts => docs/_posts}/2012-08-20-guest-post-markerclusterer-0-1-released.md (100%)
       rename {_posts => docs/_posts}/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md (100%)
       rename {_posts => docs/_posts}/2013-01-17-leaflet-0-5-released.md (100%)
       rename {_posts => docs/_posts}/2013-02-20-guest-post-draw.md (100%)
       rename {_posts => docs/_posts}/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md (100%)
       rename {_posts => docs/_posts}/2013-06-28-leaflet-plugin-authoring-guide.md (100%)
       rename {_posts => docs/_posts}/2013-11-18-leaflet-0-7-released-plans-for-future.md (100%)
       rename atom.xml => docs/atom.xml (100%)
       rename blog.md => docs/blog.md (100%)
       rename download.md => docs/download.md (100%)
       rename examples.md => docs/examples.md (81%)
       rename {examples => docs/examples}/baseball-marker.png (100%)
       rename {examples => docs/examples}/choropleth-example.html (100%)
       rename {examples => docs/examples}/choropleth.md (100%)
       rename {examples => docs/examples}/custom-icons-example.html (100%)
       rename {examples => docs/examples}/custom-icons.md (100%)
       rename {examples => docs/examples}/geojson-example.html (100%)
       rename {examples => docs/examples}/geojson.html (100%)
       rename {examples => docs/examples}/layers-control-example.html (100%)
       rename {examples => docs/examples}/layers-control.md (100%)
       rename {examples => docs/examples}/mobile-example.html (100%)
       rename {examples => docs/examples}/mobile.md (100%)
       rename {examples => docs/examples}/quick-start-example.html (100%)
       rename {examples => docs/examples}/quick-start.md (100%)
       rename {examples => docs/examples}/sample-geojson.js (100%)
       rename {examples => docs/examples}/us-states.js (100%)
       rename features.html => docs/features.html (100%)
       rename index.md => docs/index.md (100%)
       rename plugins.md => docs/plugins.md (100%)
       rename reference-tpl.html => docs/reference-tpl.html (100%)
       rename reference.html => docs/reference.html (100%)
      
      diff --git a/_config.yml b/_config.yml
      index dbbd68f211a..1d6eae1fedb 100644
      --- a/_config.yml
      +++ b/_config.yml
      @@ -1,4 +1,4 @@
      -exclude: [build, debug, node_modules, spec, src, CNAME, Jakefile.js, reference-tpl.html, CHANGELOG.md, README.md, LICENSE, DOCS-TODO.md]
      +source: docs
       
       markdown: kramdown
       
      diff --git a/_layouts/default.html b/docs/_layouts/default.html
      similarity index 91%
      rename from _layouts/default.html
      rename to docs/_layouts/default.html
      index dd1a6fa02fb..f0dd55c8c54 100644
      --- a/_layouts/default.html
      +++ b/docs/_layouts/default.html
      @@ -10,29 +10,29 @@
       	{% if title == '' %}
       	
       	
      -	
      +	
       
       	
       	
      -	
      +	
       	{% endif %}
       
       	
       
       	{% capture root %}{% if page.root %}{{ page.root }}{% else %}{{ post.root }}{% endif %}{% endcapture %}
       
      -	
      +	
       
       	
       
       	
      -	
      -	
      +	
      +	
       
      -	
      +	
       
      -	
      -	
      +	
      +	
       
       	
       	
      diff --git a/_layouts/post.html b/docs/_layouts/post.html
      similarity index 100%
      rename from _layouts/post.html
      rename to docs/_layouts/post.html
      diff --git a/_layouts/tutorial.html b/docs/_layouts/tutorial.html
      similarity index 100%
      rename from _layouts/tutorial.html
      rename to docs/_layouts/tutorial.html
      diff --git a/_posts/2012-07-30-leaflet-0-4-released.md b/docs/_posts/2012-07-30-leaflet-0-4-released.md
      similarity index 100%
      rename from _posts/2012-07-30-leaflet-0-4-released.md
      rename to docs/_posts/2012-07-30-leaflet-0-4-released.md
      diff --git a/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md b/docs/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md
      similarity index 100%
      rename from _posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md
      rename to docs/_posts/2012-08-07-leaflet-0-4-3-and-a-new-tutorial.md
      diff --git a/_posts/2012-08-20-guest-post-markerclusterer-0-1-released.md b/docs/_posts/2012-08-20-guest-post-markerclusterer-0-1-released.md
      similarity index 100%
      rename from _posts/2012-08-20-guest-post-markerclusterer-0-1-released.md
      rename to docs/_posts/2012-08-20-guest-post-markerclusterer-0-1-released.md
      diff --git a/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md b/docs/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md
      similarity index 100%
      rename from _posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md
      rename to docs/_posts/2012-10-25-leaflet-0-4-5-bugfix-release-and-plans-for-0.5.md
      diff --git a/_posts/2013-01-17-leaflet-0-5-released.md b/docs/_posts/2013-01-17-leaflet-0-5-released.md
      similarity index 100%
      rename from _posts/2013-01-17-leaflet-0-5-released.md
      rename to docs/_posts/2013-01-17-leaflet-0-5-released.md
      diff --git a/_posts/2013-02-20-guest-post-draw.md b/docs/_posts/2013-02-20-guest-post-draw.md
      similarity index 100%
      rename from _posts/2013-02-20-guest-post-draw.md
      rename to docs/_posts/2013-02-20-guest-post-draw.md
      diff --git a/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md b/docs/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md
      similarity index 100%
      rename from _posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md
      rename to docs/_posts/2013-06-26-leaflet-0-6-released-dc-code-sprint-mapbox.md
      diff --git a/_posts/2013-06-28-leaflet-plugin-authoring-guide.md b/docs/_posts/2013-06-28-leaflet-plugin-authoring-guide.md
      similarity index 100%
      rename from _posts/2013-06-28-leaflet-plugin-authoring-guide.md
      rename to docs/_posts/2013-06-28-leaflet-plugin-authoring-guide.md
      diff --git a/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md b/docs/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md
      similarity index 100%
      rename from _posts/2013-11-18-leaflet-0-7-released-plans-for-future.md
      rename to docs/_posts/2013-11-18-leaflet-0-7-released-plans-for-future.md
      diff --git a/atom.xml b/docs/atom.xml
      similarity index 100%
      rename from atom.xml
      rename to docs/atom.xml
      diff --git a/blog.md b/docs/blog.md
      similarity index 100%
      rename from blog.md
      rename to docs/blog.md
      diff --git a/download.md b/docs/download.md
      similarity index 100%
      rename from download.md
      rename to docs/download.md
      diff --git a/examples.md b/docs/examples.md
      similarity index 81%
      rename from examples.md
      rename to docs/examples.md
      index 3740f1cb41a..20d230d07e7 100644
      --- a/examples.md
      +++ b/docs/examples.md
      @@ -8,42 +8,42 @@ title: Tutorials
       Every tutorial here comes with step-by-step code explanation and is easy enough even for beginner JavaScript developers.
       
       ***
      -[][1]
      +[][1]
       
       ### [Leaflet Quick Start Guide][1]
       
       A simple step-by-step guide that will quickly get you started with Leaflet basics, including setting up a Leaflet map (with Mapbox tiles) on your page, working with markers, polylines and popups, and dealing with events.
       
       ***
      -[][2]
      +[][2]
       
       ### [Leaflet on Mobile][2]
       
       In this tutorial, you'll learn how to create a fullscreen map tuned for mobile devices like iPhone, iPad or Android phones, and how to easily detect and use the current user location.
       
       ***
      -[][3]
      +[][3]
       
       ### [Markers with Custom Icons][3]
       
       In this pretty tutorial, you'll learn how to easily define your own icons for use by the markers you put on the map.
       
       ***
      -[][4]
      +[][4]
       
       ### [Using GeoJSON with Leaflet][4]
       
       In this tutorial, you'll learn how to create and interact with map vectors created from [GeoJSON][5] objects.
       
       ***
      -[][7]
      +[][7]
       
       ### [Interactive Choropleth Map][7]
       
       A case study of creating a colorful interactive [choropleth map](http://en.wikipedia.org/wiki/Choropleth_map) of US States Population Density with GeoJSON and some custom controls. News websites will love this.
       
       ***
      -[][6]
      +[][6]
       
       ### [Layer Groups and Layers Control][6]
       
      diff --git a/examples/baseball-marker.png b/docs/examples/baseball-marker.png
      similarity index 100%
      rename from examples/baseball-marker.png
      rename to docs/examples/baseball-marker.png
      diff --git a/examples/choropleth-example.html b/docs/examples/choropleth-example.html
      similarity index 100%
      rename from examples/choropleth-example.html
      rename to docs/examples/choropleth-example.html
      diff --git a/examples/choropleth.md b/docs/examples/choropleth.md
      similarity index 100%
      rename from examples/choropleth.md
      rename to docs/examples/choropleth.md
      diff --git a/examples/custom-icons-example.html b/docs/examples/custom-icons-example.html
      similarity index 100%
      rename from examples/custom-icons-example.html
      rename to docs/examples/custom-icons-example.html
      diff --git a/examples/custom-icons.md b/docs/examples/custom-icons.md
      similarity index 100%
      rename from examples/custom-icons.md
      rename to docs/examples/custom-icons.md
      diff --git a/examples/geojson-example.html b/docs/examples/geojson-example.html
      similarity index 100%
      rename from examples/geojson-example.html
      rename to docs/examples/geojson-example.html
      diff --git a/examples/geojson.html b/docs/examples/geojson.html
      similarity index 100%
      rename from examples/geojson.html
      rename to docs/examples/geojson.html
      diff --git a/examples/layers-control-example.html b/docs/examples/layers-control-example.html
      similarity index 100%
      rename from examples/layers-control-example.html
      rename to docs/examples/layers-control-example.html
      diff --git a/examples/layers-control.md b/docs/examples/layers-control.md
      similarity index 100%
      rename from examples/layers-control.md
      rename to docs/examples/layers-control.md
      diff --git a/examples/mobile-example.html b/docs/examples/mobile-example.html
      similarity index 100%
      rename from examples/mobile-example.html
      rename to docs/examples/mobile-example.html
      diff --git a/examples/mobile.md b/docs/examples/mobile.md
      similarity index 100%
      rename from examples/mobile.md
      rename to docs/examples/mobile.md
      diff --git a/examples/quick-start-example.html b/docs/examples/quick-start-example.html
      similarity index 100%
      rename from examples/quick-start-example.html
      rename to docs/examples/quick-start-example.html
      diff --git a/examples/quick-start.md b/docs/examples/quick-start.md
      similarity index 100%
      rename from examples/quick-start.md
      rename to docs/examples/quick-start.md
      diff --git a/examples/sample-geojson.js b/docs/examples/sample-geojson.js
      similarity index 100%
      rename from examples/sample-geojson.js
      rename to docs/examples/sample-geojson.js
      diff --git a/examples/us-states.js b/docs/examples/us-states.js
      similarity index 100%
      rename from examples/us-states.js
      rename to docs/examples/us-states.js
      diff --git a/features.html b/docs/features.html
      similarity index 100%
      rename from features.html
      rename to docs/features.html
      diff --git a/index.md b/docs/index.md
      similarity index 100%
      rename from index.md
      rename to docs/index.md
      diff --git a/plugins.md b/docs/plugins.md
      similarity index 100%
      rename from plugins.md
      rename to docs/plugins.md
      diff --git a/reference-tpl.html b/docs/reference-tpl.html
      similarity index 100%
      rename from reference-tpl.html
      rename to docs/reference-tpl.html
      diff --git a/reference.html b/docs/reference.html
      similarity index 100%
      rename from reference.html
      rename to docs/reference.html
      
      From 7e0eae568b5e24891474e427404cc84c3a289bb1 Mon Sep 17 00:00:00 2001
      From: Lamdabc0re 
      Date: Fri, 6 Mar 2015 14:36:34 +0100
      Subject: [PATCH 1421/2207] Update reference.html
      
      L.Util.falseFn() does NOT return a function!
      ---
       reference.html | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/reference.html b/reference.html
      index 7e4111a2651..080ecc6a415 100644
      --- a/reference.html
      +++ b/reference.html
      @@ -5309,7 +5309,7 @@ 

      Methods

      falseFn() Function - Returns a function which always returns false. + Always returns false. formatNum( From 0d1716d7964491ae894b58ef006cda9dd07d078f Mon Sep 17 00:00:00 2001 From: Szunti Date: Fri, 6 Mar 2015 20:25:04 +0100 Subject: [PATCH 1422/2207] e.button === 0 is the left mouse button. --- src/dom/Draggable.js | 2 +- src/map/handler/Map.BoxZoom.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 670c8a543a9..412004ab2de 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -46,7 +46,7 @@ L.Draggable = L.Evented.extend({ _onDown: function (e) { this._moved = false; - if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + if (e.shiftKey || ((e.which !== 1) && (e.button !== 0) && !e.touches)) { return; } L.DomEvent.stopPropagation(e); diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js index dff5069066b..d94478b5132 100644 --- a/src/map/handler/Map.BoxZoom.js +++ b/src/map/handler/Map.BoxZoom.js @@ -27,7 +27,7 @@ L.Map.BoxZoom = L.Handler.extend({ }, _onMouseDown: function (e) { - if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 0))) { return false; } this._moved = false; @@ -83,7 +83,7 @@ L.Map.BoxZoom = L.Handler.extend({ }, _onMouseUp: function (e) { - if ((e.which !== 1) && (e.button !== 1)) { return; } + if ((e.which !== 1) && (e.button !== 0)) { return; } this._finish(); From 196040b7950a5502bbc480f3dd1fa1ca0e96a956 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 7 Mar 2015 12:45:41 +0100 Subject: [PATCH 1423/2207] Attempt to fix random PhantomJS DISCONNECTED errors on Travis --- spec/karma.conf.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spec/karma.conf.js b/spec/karma.conf.js index d287ddacfb3..af4023a749c 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -63,6 +63,11 @@ module.exports = function (config) { // If browser does not capture in given timeout [ms], kill it captureTimeout: 5000, + // Workaround for PhantomJS random DISCONNECTED error + browserDisconnectTimeout: 10000, // default 2000 + browserDisconnectTolerance: 1, // default 0 + browserNoActivityTimeout: 60000, //default 10000 + // Continuous Integration mode // if true, it capture browsers, run tests and exit singleRun: true From d53a0a9779e768d41278f85c44e73290d42f3c96 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 7 Mar 2015 12:48:46 +0100 Subject: [PATCH 1424/2207] Allow to use console in tests This prevents us from adding /* eslint no-console: 0 */ each time we need to use console.log/trace for debugging. This also means that we will not be blocked if we forget a console in the tests before commiting, but this should also happen while using the inline "no-console" config, and given that this only affects tests files, I think the confort of being able to use console easily worths the risk of pushing a console in the tests files. --- spec/.eslintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/.eslintrc b/spec/.eslintrc index 32b81cc5080..e3a29ac7dfd 100644 --- a/spec/.eslintrc +++ b/spec/.eslintrc @@ -17,7 +17,8 @@ "strict": 0, "key-spacing": 0, "no-shadow": 0, - "no-irregular-whitespace": 0 + "no-irregular-whitespace": 0, + "no-console": 0 }, "globals": { "L": true, From 250f03339bbd00597a1f7801e6cc9e91d819c75d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 7 Mar 2015 19:00:27 +0100 Subject: [PATCH 1425/2207] Fix popupAnchor not taken into account when passing L.Popup to bindPopup --- spec/suites/layer/PopupSpec.js | 35 ++++++++++++++++++++++++++++++++++ src/layer/Layer.Popup.js | 1 + 2 files changed, 36 insertions(+) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 09e8b725a80..941e2bc90a3 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -116,6 +116,41 @@ describe('Popup', function () { marker1.closePopup(); expect(spy.callCount).to.be(2); }); + + it("should take into account icon popupAnchor option", function () { + var autoPanBefore = L.Popup.prototype.options.autoPan; + L.Popup.prototype.options.autoPan = false; + var popupAnchorBefore = L.Icon.Default.prototype.options.popupAnchor; + L.Icon.Default.prototype.options.popupAnchor = [0, 0]; + + var latlng = new L.LatLng(55.8, 37.6), + offset = new L.Point(20, 30), + icon = new L.DivIcon({popupAnchor: offset}), + marker1 = new L.Marker(latlng), + marker2 = new L.Marker(latlng, {icon: icon}); + marker1.bindPopup('Popup').addTo(map); + marker1.openPopup(); + var defaultLeft = parseInt(marker1._popup._container.style.left, 10); + var defaultBottom = parseInt(marker1._popup._container.style.bottom, 10); + marker2.bindPopup('Popup').addTo(map); + marker2.openPopup(); + var offsetLeft = parseInt(marker2._popup._container.style.left, 10); + var offsetBottom = parseInt(marker2._popup._container.style.bottom, 10); + expect(offsetLeft - offset.x).to.eql(defaultLeft); + expect(offsetBottom + offset.y).to.eql(defaultBottom); + + // Now retry passing a popup instance to bindPopup + marker2.bindPopup(new L.Popup()); + marker2.openPopup(); + offsetLeft = parseInt(marker2._popup._container.style.left, 10); + offsetBottom = parseInt(marker2._popup._container.style.bottom, 10); + expect(offsetLeft - offset.x).to.eql(defaultLeft); + expect(offsetBottom + offset.y).to.eql(defaultBottom); + + L.Popup.prototype.options.autoPan = autoPanBefore; + L.Icon.Default.prototype.options.popupAnchor = popupAnchorBefore; + }); + }); describe("L.Map#openPopup", function () { diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 5b27677234f..5561f97c7d6 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -7,6 +7,7 @@ L.Layer.include({ bindPopup: function (content, options) { if (content instanceof L.Popup) { + L.setOptions(content, options); this._popup = content; content._source = this; } else { From 00b97f3b010bd2d2cd9612428aa0c640a2d1d3de Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 7 Mar 2015 23:12:15 +0100 Subject: [PATCH 1426/2207] Remove browserNoActivityTimeout from karma config --- spec/karma.conf.js | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/karma.conf.js b/spec/karma.conf.js index af4023a749c..b48792e40d3 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -66,7 +66,6 @@ module.exports = function (config) { // Workaround for PhantomJS random DISCONNECTED error browserDisconnectTimeout: 10000, // default 2000 browserDisconnectTolerance: 1, // default 0 - browserNoActivityTimeout: 60000, //default 10000 // Continuous Integration mode // if true, it capture browsers, run tests and exit From 60df92045202ea8517b110b7852707ab18c313fe Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 8 Mar 2015 12:21:43 +0100 Subject: [PATCH 1427/2207] Add optional callback to map.flyTo --- spec/suites/map/MapSpec.js | 20 ++++++++++++++++++++ src/map/anim/Map.FlyTo.js | 5 ++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index e7261ce00ca..b4f4c8deac7 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -570,4 +570,24 @@ describe("Map", function () { expect(spy.called).to.be.ok(); }); }); + + describe('#flyTo', function () { + + it('move to requested center and zoom, and call callback once', function (done) { + var spy = sinon.spy(), + newCenter = new L.LatLng(10, 11), + newZoom = 12, + callback = function () { + expect(map.getCenter()).to.eql(newCenter); + expect(map.getZoom()).to.eql(newZoom); + spy(); + expect(spy.calledOnce).to.be.ok(); + done(); + }; + map.setView([0, 0], 0); + map.flyTo(newCenter, newZoom, callback); + }); + + }); + }); diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index 81128f1a275..44e12b255a5 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -1,6 +1,6 @@ L.Map.include({ - flyTo: function (targetCenter, targetZoom) { + flyTo: function (targetCenter, targetZoom, callback) { this.stop(); @@ -51,6 +51,9 @@ L.Map.include({ } else { this._resetView(targetCenter, targetZoom, true, true); + if (callback) { + callback(); + } } } From c10f81f95d8658189f7d39f19029fd352181f239 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 9 Mar 2015 10:11:20 +0100 Subject: [PATCH 1428/2207] Remove flyTo callback (but keep test refactored) --- spec/suites/map/MapSpec.js | 2 +- src/map/anim/Map.FlyTo.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index b4f4c8deac7..6306f7b6008 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -585,7 +585,7 @@ describe("Map", function () { done(); }; map.setView([0, 0], 0); - map.flyTo(newCenter, newZoom, callback); + map.once('zoomend', callback).flyTo(newCenter, newZoom); }); }); diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index 44e12b255a5..81128f1a275 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -1,6 +1,6 @@ L.Map.include({ - flyTo: function (targetCenter, targetZoom, callback) { + flyTo: function (targetCenter, targetZoom) { this.stop(); @@ -51,9 +51,6 @@ L.Map.include({ } else { this._resetView(targetCenter, targetZoom, true, true); - if (callback) { - callback(); - } } } From 4e2505670305f69d8ccacd7afd50e8ca0d06dabb Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 9 Mar 2015 10:13:42 +0100 Subject: [PATCH 1429/2207] Typo in test description --- spec/suites/map/MapSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 6306f7b6008..f466f701a54 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -573,7 +573,7 @@ describe("Map", function () { describe('#flyTo', function () { - it('move to requested center and zoom, and call callback once', function (done) { + it('move to requested center and zoom, and call zoomend once', function (done) { var spy = sinon.spy(), newCenter = new L.LatLng(10, 11), newZoom = 12, From 7db3473727795225545e4d241127ee6f9255f7bd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Sun, 8 Mar 2015 20:34:35 -0700 Subject: [PATCH 1430/2207] fix typo, thanks @uniphil --- src/map/anim/Map.ZoomAnimation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 4d79fc5b2ca..27e14a26704 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -40,7 +40,7 @@ L.Map.include(!zoomAnimated ? {} : { L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); // workaround for case when transform is the same and so transitionend event is not fired - if (transform === proxy.style[prop] & this._animatingZoom) { + if (transform === proxy.style[prop] && this._animatingZoom) { this._onZoomTransitionEnd(); } }, this); From 6ee71b1d8f7f704083e44d3b2d8e8e7aa0d3fe8c Mon Sep 17 00:00:00 2001 From: Brandon Copeland Date: Wed, 11 Mar 2015 08:56:28 -0500 Subject: [PATCH 1431/2207] adds leaflet-measure I've added a control we recently developed, `leaflet-measure`. It provides tools to create coordinate, linear, and area measurements. Thanks. --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index d7abd8c4b98..7c49aa8a080 100644 --- a/plugins.md +++ b/plugins.md @@ -1574,6 +1574,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Florian Brucker + + + leaflet-measure + + + Coordinate, linear, and area measure control for Leaflet maps + + + LJA GIS + + From b93d42880e48fbee60a0e65e6cbfdc2650e59a5c Mon Sep 17 00:00:00 2001 From: Mstislav Zhivodkov Date: Thu, 12 Mar 2015 12:10:53 +0600 Subject: [PATCH 1432/2207] map panBy always return map --- src/map/anim/Map.PanAnimation.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 9dddff5fac1..007ead8872d 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -47,7 +47,8 @@ L.Map.include({ //If we pan too far then chrome gets issues with tiles // and makes them disappear or appear in the wrong place (slightly offset) #2602 if (options.animate !== true && !this.getSize().contains(offset)) { - return this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); + this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); + return this; } if (!this._panAnim) { From 6917733750d49445e8d170e489590f9f0ea9103f Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sat, 14 Mar 2015 12:13:44 -0700 Subject: [PATCH 1433/2207] restore toggling marker popups, pass ESLint --- debug/map/popup.html | 3 ++- src/layer/Layer.Popup.js | 36 +++++++++++++++++++++++++++----- src/layer/marker/Marker.Popup.js | 2 +- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index 47d0fc1566d..36b5882ef0d 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -66,7 +66,8 @@ }).bindPopup('I\'m a red polyline').addTo(map); var marker = L.circleMarker(getRandomLatLng(map), { - color: 'red' + color: 'red', + radius: 25 }).bindPopup('I\'m a red circle').addTo(map); diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 0ede04ed872..7854d60579a 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -43,18 +43,21 @@ L.Layer.include({ }, openPopup: function (layer, latlng) { - if (!(layer instanceof L.Layer)) { latlng = layer; layer = this; } + if (layer instanceof L.FeatureGroup) { for (var id in this._layers) { layer = this._layers[id]; break; } } - if (!latlng) latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + + if (!latlng) { + latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + } if (this._popup && this._map) { this._popup.options.offset = this._popupAnchor(layer); @@ -96,11 +99,34 @@ L.Layer.include({ }, _openPopup: function (e) { - this.openPopup(e.layer || e.target, e.latlng); + var layer = e.layer || e.target; + + if (!this._popup) { + return; + } + + if (!this._map) { + return; + } + + // if this inherits from Path its a vector and we can just + // open the popup at the new location + if (layer instanceof L.Path) { + this.openPopup(e.layer || e.target, e.latlng); + return; + } + + // otherwise treat it like a marker and figure out + // if we should toggle it open/closed + if (this._map.hasLayer(this._popup) && this._popup._source === layer) { + this.closePopup(); + } else { + this.openPopup(layer, e.latlng); + } }, - _popupAnchor: function(layer){ - var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0,0]; + _popupAnchor: function (layer) { + var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0, 0]; return L.point(anchor).add(L.Popup.prototype.options.offset); }, diff --git a/src/layer/marker/Marker.Popup.js b/src/layer/marker/Marker.Popup.js index 89dd1fc0969..9802516ae3a 100644 --- a/src/layer/marker/Marker.Popup.js +++ b/src/layer/marker/Marker.Popup.js @@ -3,7 +3,7 @@ */ L.Marker.include({ - _getPopupAnchor: function(){ + _getPopupAnchor: function() { return this.options.icon.options.popupAnchor || [0, 0]; } }); From 01ce114d330b526814bc6bc1000273dc1942d243 Mon Sep 17 00:00:00 2001 From: Andrzej Zaborowski Date: Sun, 15 Mar 2015 16:56:52 +0100 Subject: [PATCH 1434/2207] Add Leaflet.bpg to plugin list. (BPG tile format) --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 7c49aa8a080..1e2f93de37f 100644 --- a/plugins.md +++ b/plugins.md @@ -725,6 +725,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s S. Andrew Sheppard
      (HEI Geo) + + + Leaflet.bpg + + TileLayer with .bpg image format decoding. + + Andrzej Zaborowski + + From 21a748123f7411ed8a0be5824e2366b71c7b6b8b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 18 Mar 2015 13:09:04 +0200 Subject: [PATCH 1435/2207] Revert "e.button === 0 is the left mouse button." This reverts commit 0d1716d7964491ae894b58ef006cda9dd07d078f. --- src/dom/Draggable.js | 2 +- src/map/handler/Map.BoxZoom.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 412004ab2de..670c8a543a9 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -46,7 +46,7 @@ L.Draggable = L.Evented.extend({ _onDown: function (e) { this._moved = false; - if (e.shiftKey || ((e.which !== 1) && (e.button !== 0) && !e.touches)) { return; } + if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } L.DomEvent.stopPropagation(e); diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js index d94478b5132..dff5069066b 100644 --- a/src/map/handler/Map.BoxZoom.js +++ b/src/map/handler/Map.BoxZoom.js @@ -27,7 +27,7 @@ L.Map.BoxZoom = L.Handler.extend({ }, _onMouseDown: function (e) { - if (!e.shiftKey || ((e.which !== 1) && (e.button !== 0))) { return false; } + if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } this._moved = false; @@ -83,7 +83,7 @@ L.Map.BoxZoom = L.Handler.extend({ }, _onMouseUp: function (e) { - if ((e.which !== 1) && (e.button !== 0)) { return; } + if ((e.which !== 1) && (e.button !== 1)) { return; } this._finish(); From 915f6799d87768e1e36bc31323647c424ffa2cd9 Mon Sep 17 00:00:00 2001 From: Chris Scott Date: Sat, 21 Mar 2015 01:05:02 -0400 Subject: [PATCH 1436/2207] added Leaflet-History to plugins list. --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 1e2f93de37f..c43e3708058 100644 --- a/plugins.md +++ b/plugins.md @@ -1594,6 +1594,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s LJA GIS + + + Leaflet-History + + + Track history of map movements and zoom locations similar to a browser. + + + Chris Scott + + From dd900a70a62455f205e3e5bbba44d539210322d4 Mon Sep 17 00:00:00 2001 From: Greg Allensworth Date: Sat, 21 Mar 2015 13:01:14 -0700 Subject: [PATCH 1437/2207] Added L.TileLayer.Cordova --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index c43e3708058..a5aa179db3a 100644 --- a/plugins.md +++ b/plugins.md @@ -293,6 +293,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Dan Sherman + + + TileLayer.Cordova + + For use with Cordova/Phonegap, adds tile caching onto local device storage, switching between offline and online mode. + + Greg Allensworth + + TileLayer.PouchDBCached From 0f55e41a13fd20904d14a3b990768ea4bb59bcd4 Mon Sep 17 00:00:00 2001 From: Stefano Cudini Date: Wed, 25 Mar 2015 14:13:53 +0100 Subject: [PATCH 1438/2207] added new plugin geojson list --- plugins.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index a5aa179db3a..32e81f145fd 100644 --- a/plugins.md +++ b/plugins.md @@ -2,7 +2,7 @@ layout: default title: Plugins --- - +con ## Notable Leaflet Plugins While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. @@ -1614,6 +1614,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Chris Scott + + + Leaflet GeoJSON List + + + Leaflet Control for listing GeoJSON properties in a interactive menu(Demo). + + + Stefano Cudini + + From 7ce3f881c9638257c3e99ade2171edcf5a40ec09 Mon Sep 17 00:00:00 2001 From: Stefano Cudini Date: Wed, 25 Mar 2015 14:30:40 +0100 Subject: [PATCH 1439/2207] Update plugins.md --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 32e81f145fd..5c426230a0c 100644 --- a/plugins.md +++ b/plugins.md @@ -2,7 +2,7 @@ layout: default title: Plugins --- -con + ## Notable Leaflet Plugins While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. From e387451fc5ecfc2e13fcecd1924b57da7fff8e04 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 26 Mar 2015 09:29:34 -0700 Subject: [PATCH 1440/2207] add L.Sleep plugin Sate Leaflet's hunger for scroll events when they're not necessary. --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 5c426230a0c..a571645ba4d 100644 --- a/plugins.md +++ b/plugins.md @@ -899,6 +899,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Jacob Toye + + + L.Sleep + + Avoid unwanted scroll capturing. + Demo + + atstp + + Leaflet.utfgrid From 727c7534943964dfe44dc82fe2c450d5b0be1d4a Mon Sep 17 00:00:00 2001 From: Greg Allensworth Date: Sat, 28 Mar 2015 09:33:12 -0700 Subject: [PATCH 1441/2207] Added L.BoxZoom control --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index c43e3708058..182fd0b1a19 100644 --- a/plugins.md +++ b/plugins.md @@ -937,6 +937,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Kartena + + + Leaflet.BoxZoom + + A visible, clickable control to perform a box zoom. + + Greg Allensworth + + Leaflet.zoomslider From f3c802c97cf7c0ea3e89e7bb9d8886d267f3b1fc Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sat, 28 Mar 2015 19:20:56 -0700 Subject: [PATCH 1442/2207] add test for new popup functionality --- spec/suites/layer/PopupSpec.js | 80 ++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 9c9709391d1..9dfc72f5fa9 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -66,6 +66,86 @@ describe('Popup', function () { expect(map.hasLayer(marker._popup)).to.be(false); }); + it("it should use a popup with a fuction as content with a FeatureGroup", function () { + var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); + var marker2 = new L.Marker(new L.LatLng(54.6, 38.2)); + var group = new L.FeatureGroup([marker1, marker2]).addTo(map); + + marker1.description = "I'm marker 1."; + marker2.description = "I'm marker 2."; + group.bindPopup(function(layer) { + return layer.description; + }); + + map.options.closePopupOnClick = true; + + // toggle popup on marker1 + group.fire('click', { + latlng: new L.LatLng(55.8, 37.6), + layer: marker1 + }); + expect(map.hasLayer(group._popup)).to.be(true); + expect(group._popup._contentNode.innerHTML).to.be("I'm marker 1."); + + // toggle popup on marker2 + group.fire('click', { + latlng: new L.LatLng(54.6, 38.2), + layer: marker2 + }); + expect(map.hasLayer(group._popup)).to.be(true); + expect(group._popup._contentNode.innerHTML).to.be("I'm marker 2."); + }); + + it("it should function for popup content after bindPopup is called", function () { + var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); + var marker2 = new L.Marker(new L.LatLng(54.6, 38.2)); + var group = new L.FeatureGroup([marker1]).addTo(map); + + marker1.description = "I'm marker 1."; + marker2.description = "I'm marker 2."; + group.bindPopup(function(layer) { + return layer.description; + }); + + group.addLayer(marker2); + + map.options.closePopupOnClick = true; + + // toggle popup on marker1 + group.fire('click', { + latlng: new L.LatLng(55.8, 37.6), + layer: marker1 + }); + expect(map.hasLayer(group._popup)).to.be(true); + expect(group._popup._contentNode.innerHTML).to.be("I'm marker 1."); + + // toggle popup on marker2 + group.fire('click', { + latlng: new L.LatLng(54.6, 38.2), + layer: marker2 + }); + expect(map.hasLayer(group._popup)).to.be(true); + expect(group._popup._contentNode.innerHTML).to.be("I'm marker 2."); + }); + + it("should use a function for popup content when a source is passed to Popup", function() { + var marker = new L.Marker(new L.LatLng(55.8, 37.6)).addTo(map); + var popup = L.popup({}, marker); + + marker.description = "I am a marker."; + + marker.bindPopup(function(layer) { + return layer.description; + }); + + marker.fire('click', { + latlng: new L.LatLng(55.8, 37.6) + }); + + expect(map.hasLayer(marker._popup)).to.be(true); + expect(marker._popup._contentNode.innerHTML).to.be("I am a marker."); + }); + it("triggers popupopen on marker when popup opens", function () { var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); From 558f8c3a065e8fafa2d8912fd9c88625a8c3de97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 30 Mar 2015 14:34:39 +0200 Subject: [PATCH 1443/2207] Fix #3333 by catching the onScroll event on the map container --- src/map/Map.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/map/Map.js b/src/map/Map.js index 74f44822a5f..74e735d436b 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -440,6 +440,7 @@ L.Map = L.Evented.extend({ throw new Error('Map container is already initialized.'); } + L.DomEvent.addListener(container, 'scroll', this._onScroll, this); container._leaflet = true; }, @@ -569,6 +570,11 @@ L.Map = L.Evented.extend({ function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); }, + _onScroll: function () { + this._container.scrollTop = 0; + this._container.scrollLeft = 0; + }, + _handleDOMEvent: function (e) { if (!this._loaded || L.DomEvent._skipped(e)) { return; } From 41ee7272d9a764e012a914ad6882bfbd9d6de83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Br=C3=BCggemann?= Date: Mon, 30 Mar 2015 21:14:25 +0200 Subject: [PATCH 1444/2207] Added Leaflet.BoatMarker https://github.com/tomaszbrue/leaflet.boatmarker --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index f7d47f1c20b..7d631c3d449 100644 --- a/plugins.md +++ b/plugins.md @@ -543,6 +543,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Tyler Eastman + + + Leaflet.BoatMarker + + A leaflet boat/yacht marker using HTML Canvas. Demo. + + Thomas Brüggemann + + From 7b0fac890a25ebe2717c4783983b9a0aebe7aec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Br=C3=BCggemann?= Date: Mon, 30 Mar 2015 21:15:54 +0200 Subject: [PATCH 1445/2207] Updated BoatMarker description text --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 7d631c3d449..70760d63a33 100644 --- a/plugins.md +++ b/plugins.md @@ -547,7 +547,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Leaflet.BoatMarker - A leaflet boat/yacht marker using HTML Canvas. Demo. + A boat marker using HTML Canvas for displaying yachts and sailboats with heading and wind information. Demo. Thomas Brüggemann From 8527211550f017e88e836ac3f3466ef323fc653b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 31 Mar 2015 16:32:33 +0200 Subject: [PATCH 1446/2207] Add plugin Leaflet.LayerGroup.Collision --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 70760d63a33..40d49b3efa2 100644 --- a/plugins.md +++ b/plugins.md @@ -54,6 +54,16 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Dave Leaver + + + Leaflet.LayerGroup.Collision + + Provides collision detection for groups of markers. Unlike clustering, this takes into account the shape & size of the markers. + + Iván Sánchez Ortega, + MazeMap + + Leaflet.label From 56733af48856656ad60ad5f1aa90ea8d5f433dd4 Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Wed, 1 Apr 2015 16:42:46 +0600 Subject: [PATCH 1447/2207] fix tile freeze in ie8 --- src/layer/tile/TileLayer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index c23e8688284..1a1801c6980 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -85,7 +85,12 @@ L.TileLayer = L.GridLayer.extend({ }, _tileOnLoad: function (done, tile) { - done(null, tile); + // For https://github.com/Leaflet/Leaflet/issues/3332 + if (L.Browser.ielt9) { + setTimeout(L.bind(done, this, null, tile), 0); + } else { + done(null, tile); + } }, _tileOnError: function (done, tile, e) { From 88517afea95b457745b2624e0f3856f873266895 Mon Sep 17 00:00:00 2001 From: Lambdac0re Date: Wed, 1 Apr 2015 14:42:38 +0200 Subject: [PATCH 1448/2207] Update reference.html --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 080ecc6a415..d3d0d8b33fe 100644 --- a/reference.html +++ b/reference.html @@ -6362,7 +6362,7 @@

      version

      A constant that represents the Leaflet version in use.

      -

      L.version // returns "0.5" (or whatever version is currently in use)
      +
      L.version // contains "0.5" (or whatever version is currently in use)
      diff --git a/src/map/Map.js b/src/map/Map.js index 9d2cb3769a2..87df569b611 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -138,12 +138,14 @@ L.Map = L.Evented.extend({ setMaxBounds: function (bounds) { bounds = L.latLngBounds(bounds); - this.options.maxBounds = bounds; - if (!bounds) { return this.off('moveend', this._panInsideMaxBounds); + } else if (this.options.maxBounds) { + this.off('moveend', this._panInsideMaxBounds); } + this.options.maxBounds = bounds; + if (this._loaded) { this._panInsideMaxBounds(); } From 5ab01c36e40b1b02d00bd3f2e88eaa2276ef26d0 Mon Sep 17 00:00:00 2001 From: Guillaume Lathoud Date: Thu, 30 Apr 2015 11:59:13 +0200 Subject: [PATCH 1473/2207] Added singleclick plugin --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 83a6cd4b0e1..fcaf1290be3 100644 --- a/plugins.md +++ b/plugins.md @@ -1729,6 +1729,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Justin Manley + + + + singleclick + + + Extend Map to fire a singleclick event (example). + + + Guillaume Lathoud + From ea680ce21af1e36b136c6108c0d51962e220b9a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 30 Apr 2015 12:58:46 +0200 Subject: [PATCH 1474/2207] Detect Firefox for Android as L.Browser.mobile --- src/core/Browser.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 8fe06ac55c4..599ff325817 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -13,8 +13,9 @@ phantomjs = ua.indexOf('phantom') !== -1, android23 = ua.search('android [23]') !== -1, chrome = ua.indexOf('chrome') !== -1, + gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie, - mobile = typeof orientation !== 'undefined', + mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1, msPointer = navigator.msPointerEnabled && navigator.msMaxTouchPoints && !window.PointerEvent, pointer = (window.PointerEvent && navigator.pointerEnabled && navigator.maxTouchPoints) || msPointer, @@ -30,7 +31,7 @@ ie: ie, ielt9: ie && !document.addEventListener, webkit: webkit, - gecko: (ua.indexOf('gecko') !== -1) && !webkit && !window.opera && !ie, + gecko: gecko, android: ua.indexOf('android') !== -1, android23: android23, chrome: chrome, @@ -46,6 +47,7 @@ mobileWebkit: mobile && webkit, mobileWebkit3d: mobile && webkit3d, mobileOpera: mobile && window.opera, + mobileGecko: mobile && gecko, touch: !!touch, msPointer: !!msPointer, From 3a02c452c0387709fe60ff2e44da955786d68d1d Mon Sep 17 00:00:00 2001 From: Guillaume Lathoud Date: Thu, 30 Apr 2015 14:33:01 +0200 Subject: [PATCH 1475/2207] fixed singleclick repo url, now in its own repo https://github.com/Alpstein/leaflet-singleclick_0.7 --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index fcaf1290be3..26514bf17c2 100644 --- a/plugins.md +++ b/plugins.md @@ -1732,7 +1732,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - singleclick + singleclick Extend Map to fire a singleclick event (example). From 8b6d5f2fbc46c6ae5ddf30ce014db5300783c3a8 Mon Sep 17 00:00:00 2001 From: Guillaume Lathoud Date: Thu, 30 Apr 2015 14:39:05 +0200 Subject: [PATCH 1476/2207] fixed singleclick live example URL --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 26514bf17c2..d541f82493b 100644 --- a/plugins.md +++ b/plugins.md @@ -1735,7 +1735,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s singleclick - Extend Map to fire a singleclick event (example). + Extend Map to fire a singleclick event (example). Guillaume Lathoud From 8f3a353d84909f7b6cf27d6a37b162af01cc2dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 30 Apr 2015 16:38:48 +0200 Subject: [PATCH 1477/2207] LatLng.wrap shall not drop altitude, closes #3420 --- spec/suites/geo/CRSSpec.js | 8 ++++++++ src/geo/crs/CRS.js | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js index d252b6bce59..a75efb92c40 100644 --- a/spec/suites/geo/CRSSpec.js +++ b/spec/suites/geo/CRSSpec.js @@ -63,6 +63,14 @@ describe("CRS.EPSG3857", function () { expect(crs.wrapLatLng(new L.LatLng(0, 180)).lng).to.eql(180); }); + it("does not drop altitude", function () { + expect(crs.wrapLatLng(new L.LatLng(0, 190, 1234)).lng).to.eql(-170); + expect(crs.wrapLatLng(new L.LatLng(0, 190, 1234)).alt).to.eql(1234); + + expect(crs.wrapLatLng(new L.LatLng(0, 380, 1234)).lng).to.eql(20); + expect(crs.wrapLatLng(new L.LatLng(0, 380, 1234)).alt).to.eql(1234); + }); + }); }); diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js index 74efb7c309a..e7288df41ae 100644 --- a/src/geo/crs/CRS.js +++ b/src/geo/crs/CRS.js @@ -56,8 +56,9 @@ L.CRS = { // wraps geo coords in certain ranges if applicable wrapLatLng: function (latlng) { var lng = this.wrapLng ? L.Util.wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng, - lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat; + lat = this.wrapLat ? L.Util.wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat, + alt = latlng.alt; - return L.latLng(lat, lng); + return L.latLng(lat, lng, alt); } }; From dd72c3645a4646eafd0b5916bdabb4142249cfb1 Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 30 Apr 2015 10:34:59 -0500 Subject: [PATCH 1478/2207] Fix typo in Layer Controls example. --- examples/layers-control.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/layers-control.md b/examples/layers-control.md index a231f9c2877..333d149be4f 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -53,7 +53,7 @@ var overlayMaps = { "Cities": cities };
      -Now, all that's left to do is to create a [Layers Control](../reference.html#control-layers) and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional --- for example, you can pass just a base layers object by ommiting the second argument, or just an overlays objects by passing `null` as the first argument. +Now, all that's left to do is to create a [Layers Control](../reference.html#control-layers) and add it to the map. The first argument passed when creating the layers control is the base layers object. The second argument is the overlays object. Both arguments are optional --- for example, you can pass just a base layers object by omitting the second argument, or just an overlays objects by passing `null` as the first argument.
      L.control.layers(baseMaps, overlayMaps).addTo(map);
      From 476d24a636de5bf1d3ac29b2ad586e25c1a10efe Mon Sep 17 00:00:00 2001 From: paulovieira Date: Thu, 7 May 2015 14:29:43 +0100 Subject: [PATCH 1479/2207] add react-leaflet --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index d541f82493b..238b47c2129 100644 --- a/plugins.md +++ b/plugins.md @@ -1956,6 +1956,17 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Sparkgeo + + + react-leaflet + + + React components for Leaflet maps. + + + Paul Le Cam + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). From e6a0b10bfd1596d9062655dcced35e5c36ee4786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 7 May 2015 17:28:13 +0200 Subject: [PATCH 1480/2207] Reorganized plugin categories (should fix Leaflet/Leaflet#3414) --- plugins.md | 1959 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 1167 insertions(+), 792 deletions(-) diff --git a/plugins.md b/plugins.md index 238b47c2129..f7fe26d0294 100644 --- a/plugins.md +++ b/plugins.md @@ -5,552 +5,682 @@ title: Plugins ## Notable Leaflet Plugins -While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are lots of nice plugins to choose from. +While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are literally hundreds of nice plugins to choose from. --- -### Layers and Overlays +## Index - - - - - - + +* [Basemaps](#basemap) + * [Basemap providers](#basemap-providers) + * [Basemap formats](#basemap-formats) + * [Non-map base layers](#basemap-nonmap) +* [Tile/image display](#tiledisplay) +* [Tile load](#tileload) +* [Vector Data](#vectordata) + * [Vector formats](#vectordata-formats) + * [Dynamic vector loading](#vectordata-dynamic) + * [Synthetic vectors](#vectordata-synthetic) + * [Vector providers](#vectordata-providers) +* [Vector Display](#vectordisplay) + * [Vector symbolizers](#vectordisplay-symbolizers) + * [Marker animations](#vectordisplay-animations) + * [Clustering/decluttering](#vectordisplay-cluster) + * [Heatmaps](#vectordisplay-heatmap) + * [DataViz & miscellaneous](#vectordisplay-misc) +* [Geoprocessing](#geoprocessing) +* [Routing](#routing) +* [Interaction with geometries](#geometryinteraction) + * [Edit geometries](#geometryinteraction-edit) + * [Geometries with time or elevation](#geometryinteraction-time) + * [Feature search/properties/popups](#geometryinteraction-search) + * [Area/feature selection](#geometryinteraction-selection) +* [Map interaction](#mapcontrols) + * [Layer switching controls](#mapcontrols-layerswitchers) + * [Interactive pan/zoom](#mapcontrols-panzoom-interactive) + * [Bookmarked pan/zoom](#mapcontrols-panzoom-bookmarked) + * [Fullscreen](#mapcontrols-fullscreen) + * [Minimaps & synced maps](#mapcontrols-minimaps) + * [Measurement](#mapcontrols-measure) + * [Mouse coordinates](#mapcontrols-mousecoords) + * [Events](#mapcontrols-events) + * [User interface](#mapcontrols-userinterface) + * [Print/export](#mapcontrols-print) + * [Geolocation](#mapcontrols-geolocation) +* [Geocoding](#geocoding) +* [Integration](#integration) + * [Frameworks & build systems](#integration-frameworks) + * [3rd party](#integration-3rdparty) +* [Plugin collections](#collections) + + +## Basemaps + +The following plugins provide new tiled basemaps, or a way to display commonly used basemap formats. They behave as subclasses of `L.TileLayer`. + + +* [Basemap providers](#basemap-providers) +* [Basemap formats](#basemap-formats) +* [Non-map base layers](#basemap-nonmap) + + +### Basemap providers + +Ready-to-go basemaps, with little or no configuration at all. + +
      PluginDescriptionMaintainer
      +
      PluginDescriptionMaintainer
      - Leaflet.FreeDraw + leaflet-providers - Zoopla inspired freehand polygon creation using Leaflet.js and D3. + Contains configurations for various free tile providers — OSM, OpenCycleMap, MapQuest, Stamen, Esri, etc. - Wildhoney + leaflet-extras members
      - Leaflet.Pather + Leaflet.KoreanTmsProviders - L.Pather is a freehand polyline creator that simplifies the polyline for mutability. Requires D3 support. + Contains configurations for various (South) Korean tile providers — Daum, Naver, VWorld, etc. - Wildhoney + Seong Choi
      - Leaflet.ellipse + Leaflet.ChineseTmsProviders - Leaflet.ellipse place ellipses on map by specifying center point, semi-major axis, - semi-minor axis, and tilt degrees from west. + Contains configurations for various Chinese tile providers — TianDiTu, MapABC, GaoDe, etc. - JD Fergason + Tao Huang
      - Leaflet.plotter + Esri Leaflet - leaflet-plotter allows you to create routes using a leaflet powered map. You can click on the mid-points to create a new, draggable point. + A set of tools for using ArcGIS services with Leaflet. Support for map services, feature layers, ArcGIS Online tiles and more. - Nathan Mahdavi + Patrick Arlt
      - Leaflet.markercluster + Leaflet.GIBS - Beautiful, sophisticated, high performance marker clustering solution with smooth animations and lots of great features. Recommended! + NASA EOSDIS GIBS imagery integration. The plugin provides 96 daily updated layers with satellite imagery and science parameters. Demo. - Dave Leaver + Alexander Parshin
      + + + +### Basemap formats + +Plugins for loading basemaps or GIS layers in common (albeit non-default) formats. + + - + +
      PluginDescriptionMaintainer
      - Leaflet.LayerGroup.Collision - - Provides collision detection for groups of markers. Unlike clustering, this takes into account the shape & size of the markers. + leaflet.TileLayer.WMTS + Add WMTS (IGN) layering for leaflet. - Iván Sánchez Ortega, - MazeMap + Alexandre Melard
      - Leaflet.label + azgs-leaflet - Adds text labels to map markers and vector layers. + A set of small plugins for Leaflet, including WFS-GeoJSON layer with filtering, a hover control for GeoJSON, and an Esri tile layer. - Jacob Toye + AZGS
      - RaphaelLayer + leaflet.wms - Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. + Enhanced WMS support for Leaflet, including single-tile/untiled layers, shared WMS sources, and layer identify via GetFeatureInfo. - Dynamic Methods + S. Andrew Sheppard
      (HEI Geo)
      - Overlapping Marker Spiderfier + Leaflet.bpg - Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. + TileLayer with .bpg image format decoding. - George MacKerron + Andrzej Zaborowski
      - TileLayer.BoundaryCanvas + TileLayer.GeoJSON - Allows you to draw tile layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. + A TileLayer for GeoJSON tiles. - Alexander Parshin + Glen Robertson
      - MaskCanvas + leaflet-tilejson - Canvas layer that can be used to visualize coverage. + Adds support for the TileJSON specification to Leaflet. - Dominik Moritz + Per Liedman, Kartena
      - HeatCanvas + cartodb-leaflet - Simple heatmap api based on HTML5 canvas. + Official CartoDB plugin for Leaflet. - Sun Ning + Vizzuality
      - heatmap.js + Leaflet-2gis - JavaScript Library for HTML5 canvas based heatmaps. - - Its Leaflet layer implementation supports large datasets because it is tile based and uses a quadtree index to store the data. + Adds support for 2GIS tile layer - Patrick Wied + Eugene Mikhalev
      + + +### Non-map base tilelayers + +Sometimes you don't want to load a map, just big custom images. **Really** big ones. + + +
      PluginDescriptionMaintainer
      - Leaflet divHeatmap + TileLayer.Zoomify - Lightweight and versatile heatmap layer based on CSS3 and divIcons - + A TileLayer for Zoomify images. - Daniele Piccone + Bjørn Sandvik
      - WebGL Heatmap + TileLayer.DeepZoom - High performance Javascript heatmap plugin using WebGL. - + A TileLayer for DeepZoom images. - Benjamin J DeLong + Al Farisi, + Indokreatif Teknologi
      - Leaflet.MultiTileLayer + TileLayer.Gigapan - Allows to compose a TileLayer from several tile sources. Each source is active only on a defined set of zoomlevels. + A TileLayer for Gigapan images. - Mattias Bengtsson + Dan Sherman
      - Leaflet.AnimatedMarker - - Animate a marker along a polyline. + Leaflet.TileLayer.IIP + Add support for IIPImage layers in Leaflet. - Aaron Ogle + Emmanuel Bertin
      - Leaflet-semicircle + Leaflet-IIIF - Adds functionality to L.Circle to draw semicircles. + A IIIF (International Image Interoperability Framework) viewer for Leaflet. See the demo. - Jieter + Jack Reed
      + + + +## Tile/image display + +The following plugins change the way that tile or image layers are displayed in the map. + + +
      PluginDescriptionMaintainer
      - Leaflet.FunctionalTileLayer + TileLayer.BoundaryCanvas - Allows you to define tile layer URLs using a function, with support for jQuery deferreds. + Allows you to draw tile layers with arbitrary polygonal boundary. HTML5 Canvas is used for rendering. - Ishmael Smyrnow + Alexander Parshin
      - Leaflet.geoCSV + TileLayer.Grayscale - Leaflet plugin for loading a CSV file as geoJSON layer. + A regular TileLayer with grayscale makeover. - Iván Eixarch + Ilya Zverev
      - Leaflet.PolylineDecorator - - Allows you to draw patterns (like dashes, arrows or evenly spaced Markers) along Polylines or coordinate paths. + Leaflet.ImageTransform + Add support of image overlays with arbitrary perspective transformation. - Benjamin Becquet + Alexander Parshin, + Sergey Alekseev
      - Leaflet.Sprite + Leaflet.OpacityControls - Use sprite based icons in your markers. + Simple Leaflet controls to adjust the opacity of a map layer. - Calvin Metcalf + Jared Dominguez
      - Leaflet.BounceMarker + Leaflet.DistortableImage - Make a marker bounce when you add it to a map. + Enable users to scale, rotate, and distort images on Leaflet maps. - Maxime Hadjinlian + Public Lab
      + + + +## Tile Load + +The following plugins change the way that tile layers are loaded in the map. + + - +
      PluginDescriptionMaintainer
      - Leaflet.SmoothMarkerBouncing + Leaflet.MultiTileLayer - Smooth animation of marker bouncing for Leaflet. + Allows to compose a TileLayer from several tile sources. Each source is active only on a defined set of zoomlevels. - Alexei KLENIN + Mattias Bengtsson
      - Leaflet.TextPath + Leaflet.FunctionalTileLayer - Allows you to draw text along Polylines. + Allows you to define tile layer URLs using a function, with support for jQuery deferreds. - Mathieu Leplatre + Ishmael Smyrnow
      - Leaflet.Awesome-Markers + TileLayer.Cordova - Colorful, iconic & retina-proof markers based on the Font Awesome icons/Twitter Bootstrap icons + For use with Cordova/Phonegap, adds tile caching onto local device storage, switching between offline and online mode. - Lennard Voogdt + Greg Allensworth
      - Leaflet Data Visualization Framework + TileLayer.PouchDBCached - New markers, layers, and utility classes for easy thematic mapping and data visualization. + Allows all Leaflet TileLayers to cache into PouchDB for offline use. - Scott Fairgrieve + Iván Sánchez Ortega, + MazeMap
      - TileLayer.Grayscale + Leaflet.loading - A regular TileLayer with grayscale makeover. + A simple control that adds a loading indicator as tiles and other data are loaded. - Ilya Zverev + Eric Brelsford
      + + +## Vector data + +The following plugins provide new ways of loading vector data. + +* [Vector formats](#vectordata-formats) +* [Dynamic vector loading](#vectordata-dynamic) +* [Synthetic vectors](#vectordata-synthetic) +* [Vector providers](#vectordata-providers) + +### Vector formats + +Load your own data from various GIS formats. + + + +
      PluginDescriptionMaintainer
      - TileLayer.GeoJSON + leaflet-omnivore - A TileLayer for GeoJSON tiles. + Loads & converts CSV, KML, GPX, TopoJSON, WKT formats for Leaflet. - Glen Robertson + Mapbox
      - TileLayer.Zoomify + Leaflet.FileLayer - A TileLayer for Zoomify images. + Loads files (GeoJSON, GPX, KML) into the map using the HTML5 FileReader API (i.e. locally without server). - Bjørn Sandvik + Mathieu Leplatre
      - TileLayer.DeepZoom + Leaflet.geoCSV - A TileLayer for DeepZoom images. + Leaflet plugin for loading a CSV file as geoJSON layer. - Al Farisi, - Indokreatif Teknologi + Iván Eixarch
      - TileLayer.Gigapan + Leaflet.Shapefile - A TileLayer for Gigapan images. + Put a shapefile onto your map as a layer. - Dan Sherman + Calvin Metcalf
      - TileLayer.Cordova + Leaflet.FileGDB - For use with Cordova/Phonegap, adds tile caching onto local device storage, switching between offline and online mode. + Put an ESRI File GeoDatabase onto your map as a layer. - Greg Allensworth + Calvin Metcalf
      - TileLayer.PouchDBCached + Leaflet.encoded - Allows all Leaflet TileLayers to cache into PouchDB for offline use. + Use encoded polylines in Leaflet. - Iván Sánchez Ortega, - MazeMap + Jieter
      - Leaflet.Graticule + Leaflet GPX - Draws a grid of latitude and longitude lines. + GPX layer, targeted at sporting activities by providing access to information such as distance, moving time, pace, elevation, heart rate, etc. - Bjørn Sandvik + Maxime Petazzoni
      - Leaflet.SimpleGraticule + Wicket - Draws a grid lines for L.CRS.Simple coordinate system. + A modest library for translating between Well-Known Text (WKT) and Leaflet geometry objects (e.g. between L.marker() instances and "POINT()" strings). - Andrew Blakey + K. Arthur Endsley
      + + + +### Dynamic/custom vector loading + +Load dynamic data which is updated in the map, or load vector data in non-standard ways. + + + + + + + +
      PluginDescriptionMaintainer
      - leaflet-usermarker + Leaflet Realtime - Plugin for plotting a marker representing a user - or multiple users - on a map, - with support for drawing an accuraccy circle. Can be seen in action on - Longitude.me. + Put realtime data on a Leaflet map: live tracking GPS units, sensor data or just about anything. - Jonatan Heyman + Per Liedman
      - Leaflet.EdgeMarker + Leaflet Ajax - Plugin to indicate the existence of Features outside of the current view. + Add GeoJSON data via ajax or jsonp. - Gerald Pape + Calvin Metcalf
      - Leaflet.Shapefile + Leaflet.Liveupdate + + Periodically ('live') update something on a map (Demo) + + Martijn Grendelman +
      + Leaflet.Pouch - Put a shapefile onto your map as a layer. + Use PouchDB to sync CouchDB data to local storage (indexedDB), to just add couchDB data or as just a less confusing implementation of indexedDB. - Calvin Metcalf + Calvin Metcalf
      - Leaflet.FileGDB + Leaflet.Indoor - Put an ESRI File GeoDatabase onto your map as a layer. + Create indoor maps. - Calvin Metcalf + Christopher Baines
      + + + +### Synthetic vectors + +These plugins create useful vector data from scratch, without loading it from anywhere.. + + +
      PluginDescriptionMaintainer
      - Leaflet.Terminator - Overlay day and night regions on a map. + Leaflet.Graticule - Jörg Dietrich + Draws a grid of latitude and longitude lines. + + Bjørn Sandvik
      - Leaflet.FeatureSelect - Use a configurable centerpoint marker to select any geometry type from a GeoJSON layer. + Leaflet.SimpleGraticule - Aaron Ogle + Draws a grid lines for L.CRS.Simple coordinate system. + + Andrew Blakey
      - Leaflet.MakiMarkers - Create markers using Maki Icons from MapBox. + Leaflet.Terminator + Overlay day and night regions on a map. - James Seppi + Jörg Dietrich
      + + + +### Vector providers + +Load data from third-party-services. + + - + +
      PluginDescriptionMaintainer
      - Leaflet.Editable.Polyline - Editable polylines: move existing points, add new points and split polylines. + Leaflet Vector Layers - Tomo Krajina + Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. + + Jason Sanford
      - leaflet.TileLayer.WMTS - Add WMTS (IGN) layering for leaflet. + Leaflet Layer Overpass - Alexandre Melard + Easily include data from the overpass api. + + kartenkarsten
      - leaflet-omnivore + Leaflet.dbpediaLayer - Loads & converts CSV, KML, GPX, TopoJSON, WKT formats for Leaflet. + A layer with Points of interest from Wikipedia - loaded via ajax from DBpedia's SPARQL endpoint. - Mapbox + Kr1
      + + + +## Vector display + +The following plugins provide new ways of displaying vector information: + +* [Vector symbolizers](#vectordisplay-symbolizers) +* [Marker animations](#vectordisplay-animations) +* [Clustering/decluttering](#vectordisplay-cluster) +* [Heatmaps](#vectordisplay-heatmap) +* [DataViz & miscellaneous](#vectordisplay-misc) + + +### Vector symbolizers + +A symbolizer renders a geometry in a different way. + + - - - - - - - - - + + + - - - @@ -570,342 +700,338 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s + + +
      PluginDescriptionMaintainer
      - Leaflet.TileLayer.IIP - Add support for IIPImage layers in Leaflet. + Leaflet.ellipse - Emmanuel Bertin + Leaflet.ellipse place ellipses on map by specifying center point, semi-major axis, + semi-minor axis, and tilt degrees from west. + + JD Fergason
      - Leaflet.ImageTransform - Add support of image overlays with arbitrary perspective transformation. + Leaflet.label - Alexander Parshin, - Sergey Alekseev + Adds text labels to map markers and vector layers. + + Jacob Toye
      - PruneCluster + Leaflet-semicircle - Fast and realtime marker clustering library. + Adds functionality to L.Circle to draw semicircles. - Antoine Pultier + Jieter
      - Leaflet.Indoor + Leaflet.PolylineDecorator - Create indoor maps. + Allows you to draw patterns (like dashes, arrows or evenly spaced Markers) along Polylines or coordinate paths. - Christopher Baines + Benjamin Becquet
      - Leaflet.Geodesic + Leaflet.Sprite - Draw geodesic (poly)lines. A geodesic line is the shortest path between two given positions on the earth surface. and You can also calculate the exact distance between two given points on the map. + Use sprite based icons in your markers. - Henry Thasler + Calvin Metcalf
      - Leaflet.LineExtremities - - Show symbols at the extremities of polylines, using SVG markers. - - Frédéric Bonifas -
      - Leaflet.VectorMarkers - - Vector SVG markers for Leaflet, with an option for Font Awesome/Twitter Bootstrap icons. - - Mathias Schneider -
      - Leaflet.MovingMarker - - Allow to move markers along a polyline with custom durations. - - Ewoken -
      - Leaflet Realtime + Leaflet.TextPath - Put realtime data on a Leaflet map: live tracking GPS units, sensor data or just about anything. + Allows you to draw text along Polylines. - Per Liedman + Mathieu Leplatre
      - Leaflet-IIIF + Leaflet.Awesome-Markers - A IIIF (International Image Interoperability Framework) viewer for Leaflet. See the demo. + Colorful, iconic & retina-proof markers based on the Font Awesome icons/Twitter Bootstrap icons - Jack Reed + Lennard Voogdt
      - Leaflet.D3SvgOverlay + Leaflet.MakiMarkers + Create markers using Maki Icons from MapBox. - SVG overlay class for using with D3 library. Supports zoom animation and scaling without need to redraw the layer. + James Seppi +
      + Leaflet.LineExtremities - Kirill Zhuravlev + Show symbols at the extremities of polylines, using SVG markers. + + Frédéric Bonifas
      - Leaflet.TransitionedIcon - - Transition in/out markers with CSS3 transitions. It supports jitter - for staggering markers into view to prevent visual overload. See the demo. - - Brian Reavis -
      - Leaflet Layer Overpass + Leaflet.VectorMarkers - Easily include data from the overpass api. + Vector SVG markers for Leaflet, with an option for Font Awesome/Twitter Bootstrap icons. - kartenkarsten + Mathias Schneider
      Thomas Brüggemann
      + leaflet-usermarker + + Plugin for plotting a marker representing a user - or multiple users - on a map, + with support for drawing an accuraccy circle. Can be seen in action on + Longitude.me. + + Jonatan Heyman +
      - Leaflet.DistortableImage + Leaflet.geojsonCSS - Enable users to scale, rotate, and distort images on Leaflet maps. + Geojson CSS implementation for Leaflet. - Public Lab + Alexander Burtsev
      - Leaflet.Illustrate + OSM Buildings - Extension for Leaflet.draw enabling users to type annotations directly on maps. + Amazing JS library for visualizing 3D OSM building geometry on top of Leaflet. - Justin Manley + Jan Marsch
      - Leaflet.Deflate + Leaflet.EdgeMarker - Deflates lines and polygons to a marker when their screen size becomes too small in lower zoom levels. + Plugin to indicate the existence of Features outside of the current view. - Oliver Roick + Gerald Pape
      -### Services, Providers and Formats - - - - - - +### Vector animation + +These plugins animate markers or some geometries. See also [geometries with time or elevation](#geometryinteraction-time) + +
      PluginDescriptionMaintainer
      +
      PluginDescriptionMaintainer
      - Spectrum4Leaflet + Leaflet.AnimatedMarker - Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. + Animate a marker along a polyline. - SVoyt, ESTI MAP + Aaron Ogle
      - Proj4Leaflet + Leaflet.BounceMarker - Proj4js integration plugin, allowing you to use all kinds of weird projections in Leaflet. + Make a marker bounce when you add it to a map. - Kartena + Maxime Hadjinlian
      - Plugins by Pavel Shramov + Leaflet.SmoothMarkerBouncing - A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), permalink and distance measurement controls. + Smooth animation of marker bouncing for Leaflet. - Pavel Shramov, Bruno B + Alexei KLENIN
      - cartodb-leaflet + Leaflet.MovingMarker - Official CartoDB plugin for Leaflet. + Allow to move markers along a polyline with custom durations. - Vizzuality + Ewoken
      - Leaflet Vector Layers + Leaflet.TransitionedIcon - Allows to easily create vector layers from a number of geo web services, such as ArcGIS Server, Arc2Earth, GeoIQ, CartoDB and GIS Cloud. + Transition in/out markers with CSS3 transitions. It supports jitter + for staggering markers into view to prevent visual overload. See the demo. - Jason Sanford + Brian Reavis
      + + + +### Clustering/Decluttering + +When you are displaying a lot of data, these plugins will make your map look cleaner. + + +
      PluginDescriptionMaintainer
      - leaflet-tilejson + Leaflet.markercluster - Adds support for the TileJSON specification to Leaflet. + Beautiful, sophisticated, high performance marker clustering solution with smooth animations and lots of great features. Recommended! - Per Liedman, Kartena + Dave Leaver
      - leaflet-providers + Leaflet.LayerGroup.Collision - Contains configurations for various free tile providers — OSM, OpenCycleMap, MapQuest, Stamen, Esri, etc. + Provides collision detection for groups of markers. Unlike clustering, this takes into account the shape & size of the markers. - leaflet-extras members + Iván Sánchez Ortega, + MazeMap
      - azgs-leaflet + Overlapping Marker Spiderfier - A set of small plugins for Leaflet, including WFS-GeoJSON layer with filtering, a hover control for GeoJSON, and an Esri tile layer. + Deals with overlapping markers in a Google Earth-inspired way by gracefully springing them apart on click. - AZGS + George MacKerron
      - Leaflet.encoded + PruneCluster - Use encoded polylines in Leaflet. + Fast and realtime marker clustering library. - Jieter + Antoine Pultier
      - Leaflet.Pouch + Leaflet.Deflate - Use PouchDB to sync CouchDB data to local storage (indexedDB), to just add couchDB data or as just a less confusing implementation of indexedDB. + Deflates lines and polygons to a marker when their screen size becomes too small in lower zoom levels. - Calvin Metcalf + Oliver Roick
      + +### Heatmaps + +These plugins create heatmaps and heatmap-like visualizations from vector data. + + +
      PluginDescriptionMaintainer
      - Leaflet Ajax + MaskCanvas - Add GeoJSON data via ajax or jsonp. + Canvas layer that can be used to visualize coverage. - Calvin Metcalf + Dominik Moritz
      - Leaflet GPX + HeatCanvas - GPX layer, targeted at sporting activities by providing access to information such as distance, moving time, pace, elevation, heart rate, etc. + Simple heatmap api based on HTML5 canvas. - Maxime Petazzoni + Sun Ning
      - Wicket + heatmap.js - A modest library for translating between Well-Known Text (WKT) and Leaflet geometry objects (e.g. between L.marker() instances and "POINT()" strings). + JavaScript Library for HTML5 canvas based heatmaps. + + Its Leaflet layer implementation supports large datasets because it is tile based and uses a quadtree index to store the data. - K. Arthur Endsley + Patrick Wied
      - Leaflet.dbpediaLayer + Leaflet divHeatmap - A layer with Points of interest from Wikipedia - loaded via ajax from DBpedia's SPARQL endpoint. + Lightweight and versatile heatmap layer based on CSS3 and divIcons + - Kr1 + Daniele Piccone
      - Leaflet-2gis + WebGL Heatmap - Adds support for 2GIS tile layer + High performance Javascript heatmap plugin using WebGL. + - Eugene Mikhalev + Benjamin J DeLong
      + + +### DataViz / miscellaneous + +Powerful multi-purpose libraries for data visualization. + + +
      PluginDescriptionMaintainer
      - Leaflet.KoreanTmsProviders + RaphaelLayer - Contains configurations for various (South) Korean tile providers — Daum, Naver, VWorld, etc. + Allows you to use Raphael as a layer on a Leaflet map for advanced animations and visualizations. - Seong Choi + Dynamic Methods
      - Leaflet.ChineseTmsProviders + Leaflet Data Visualization Framework - Contains configurations for various Chinese tile providers — TianDiTu, MapABC, GaoDe, etc. + New markers, layers, and utility classes for easy thematic mapping and data visualization. - Tao Huang + Scott Fairgrieve
      - Esri Leaflet + Leaflet.D3SvgOverlay - A set of tools for using ArcGIS services with Leaflet. Support for map services, feature layers, ArcGIS Online tiles and more. + SVG overlay class for using with D3 library. Supports zoom animation and scaling without need to redraw the layer. - Patrick Arlt + Kirill Zhuravlev
      + + + + +## Geoprocessing + +The following plugins perform several sorts of geoprocessing. + + -
      PluginDescriptionMaintainer
      - Leaflet.geojsonCSS + Proj4Leaflet - Geojson CSS implementation for Leaflet. + Proj4js integration plugin, allowing you to use all kinds of weird projections in Leaflet. - Alexander Burtsev + Kartena
      - leaflet.wms + arc.js - Enhanced WMS support for Leaflet, including single-tile/untiled layers, shared WMS sources, and layer identify via GetFeatureInfo. + A JS library for drawing great circle routes that can be used with Leaflet. - S. Andrew Sheppard
      (HEI Geo) + Dane Springmeyer
      - Leaflet.bpg + Leaflet-pip - TileLayer with .bpg image format decoding. + Simple point in polygon calculation using point-in-polygon. - Andrzej Zaborowski + Tom MacWright
      - Leaflet.GIBS + Leaflet.GeometryUtil - NASA EOSDIS GIBS imagery integration. The plugin provides 96 daily updated layers with satellite imagery and science parameters. Demo. + A collection of utilities for Leaflet geometries (linear referencing, etc.) - Alexander Parshin + Benjamin Becquet, Mathieu Leplatre
      - - -### Geocoding (Address Lookup) - - - - - - - - - - - - - - - + - - - - - - -
      PluginDescriptionMaintainer
      - Leaflet GeoSearch - - Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      - Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Easily extensible. -
      - Stephan Meijer + Greiner-Hormann
      - Leaflet Control OSM Geocoder - - A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. - - Karsten Hinz + Greiner-Hormann algorithm for polygon clipping and binary operations, adapted for use with Leaflet.
      - Leaflet Control Bing Geocoder - - A simple geocoder control that uses Bing to locate places. - - Samuel Piquet + Alexander Milevski
      - Leaflet Control Geocoder - - A clean and extensible control that uses Nominatim (OSM) or Bing to locate places. Easy to adapt for other providers. - - Per Liedman -
      - Leaflet GeoIP Locator + Leaflet.Geodesic - A simple plugin that allows finding the approximate location of IP addresses and map centering on said location. + Draw geodesic (poly)lines. A geodesic line is the shortest path between two given positions on the earth surface. and You can also calculate the exact distance between two given points on the map. - Jakub Dostal + Henry Thasler
      - Esri Leaflet Geocoder + Leaflet.buffer - A geocoding control with suggestions powered by the ArcGIS Online geocoder. + Enables buffering of shapes drawn with Leaflet.draw. - Patrick Arlt -
      - Leaflet.OpenCage.Search - - A search plugin plugin that uses OpenCage Data's geocoding API. - - The OpenCage team + Jonathan Skeate
      - Leaflet.Geonames - - A lightweight geocoding control powered by GeoNames. Demo - - Brendan Ward + Leaflet.LayerIndex + + An efficient spatial index for features and layers, using RTree.js. + + Mathieu Leplatre
      -### Routing and route search - - - - - - +## Routing and route search + + +
      PluginDescriptionMaintainer
      PluginDescriptionMaintainer
      Leaflet Routing Machine @@ -937,59 +1063,55 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      -### Controls and Interaction - - - - - - - - - + +## Interaction with geometries/features + +The following plugins enable users to interact with geometries: edit geometries, select areas or features, interact with the time dimension, search features. + +* [Edit geometries](#geometryinteraction-edit) +* [Geometries with time or elevation](#geometryinteraction-time) +* [Feature search/properties/popups](#geometryinteraction-search) +* [Area/feature selection](#geometryinteraction-selection) + +### Edit geometries + +
      PluginDescriptionMaintainer
      - Leaflet.AreaSelect - - A fixed positioned, resizable rectangle for selecting an area on the map. - - Jonatan Heyman -
      + + @@ -1001,178 +1123,201 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Kartena - + + + + +
      PluginDescriptionMaintainer
      - Leaflet.draw + Leaflet.FreeDraw - Enables drawing features like polylines, polygons, rectangles, circles and markers through a very nice user-friendly interface with icons and hints. Recommended! + Zoopla inspired freehand polygon creation using Leaflet.js and D3. - Jacob Toye + Wildhoney
      - L.Sleep + Leaflet.plotter - Avoid unwanted scroll capturing. - Demo + leaflet-plotter allows you to create routes using a leaflet powered map. You can click on the mid-points to create a new, draggable point. - atstp + Nathan Mahdavi
      - Leaflet.utfgrid - - Provides a utfgrid interaction handler for leaflet a very small footprint. + Leaflet.Editable.Polyline + Editable polylines: move existing points, add new points and split polylines. - Dave Leaver + Tomo Krajina
      - L.EasyButton + Leaflet.draw - In one line, add a Font Awesome control button with attached click events. - Demo + Enables drawing features like polylines, polygons, rectangles, circles and markers through a very nice user-friendly interface with icons and hints. Recommended! - atstp + Jacob Toye
      - L.LocationShare + Leaflet.StyleEditor - Allow users to send and receive a marker with a message. - Demo + Enables editing the styles of features (lines, polygons, etc) and markers with a GUI. - atstp + Dennis Wilhelm
      - Leaflet.Pancontrol + Leaflet.SimpleMarkers - A simple panning control. + A light-weight Leaflet plugin for adding and deleting markers. - Kartena + Jared Dominguez
      - Leaflet.BoxZoom + Leaflet.Editable - A visible, clickable control to perform a box zoom. + Lightweight fully customisable and controlable drawing/editing plugin. - Greg Allensworth + Yohan Boniface
      - Leaflet.zoomslider - - A zoom slider control. - - Kartena + Leaflet.Path.Drag + + Drag handler and interaction for polygons and polylines (Demo) + + Alexander Milevski
      - Leaflet.Locate + Leaflet.Snap - A customizable locate control. + Enables snapping of draggable markers to polylines and other layers. - Dominik Moritz + Mathieu Leplatre
      - Leaflet.fullscreen - - A fullscreen button control by mapbox + Leaflet.MapPaint + + Bitmap painting plugin designed for touch devices. - mapbox + Antoine Pultier
      - leaflet.zoomfs + Leaflet.Storage - A fullscreen button control. + Create/update/delete Map, Marker, Polygon, Polyline... and expose them for backend storage with an API. - Eli Dupuis + Yohan Boniface
      - leaflet.fullscreen + Leaflet.Pather - Another fullscreen button control but for modern browsers, using HTML5 Fullscreen API. + L.Pather is a freehand polyline creator that simplifies the polyline for mutability. Requires D3 support. - Bruno B + Wildhoney
      - leaflet-search + Leaflet.Illustrate - A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service + Extension for Leaflet.draw enabling users to type annotations directly on maps. - Stefano Cudini + Justin Manley
      + + +### Geometries with time or elevation + +View/manipulate geometries with elevation or time dimensions. + + + + - +
      PluginDescriptionMaintainer
      - leaflet-fusesearch - - A control that provides a panel to search features in a GeoJSON layer using the lightweight fuzzy search Fuse.js - - Antoine Riche + Leaflet.TimeDimension + + Add time dimension capabilities on a Leaflet map. Demos + + ICTS SOCIB
      - leaflet-locationfilter + Leaflet Time-Slider - A draggable/resizable rectangle for selecting an area on the map. + The Leaflet Time-Slider enables you to dynamically add and remove Markers on a map by using a JQuery UI slider - Robert Kajic + Dennis Wilhelm
      - Leaflet.MiniMap + LeafletPlayback - A small minimap showing the map at a different scale to aid navigation. + Play back time-stamped GPS Tracks synchronized to a clock. - Robert Nordan + Nicholas Hallahan
      - Leaflet.Rrose + + Leaflet.timeline - A Leaflet Plugin for Edge Cases. For use when you want popups on mouseover, not click, and - you need popup tips to reorient as you get close to the edges of your map. + Display arbitrary GeoJSON on a map with a timeline slider and play button. - Eric Theise + Jonathan Skeate
      - Leaflet.EditInOSM + Leaflet.Elevation - Add a control with links to open the current map view on main OSM editors. + A Leaflet plugin to view interactive height profiles of GeoJSON lines using d3. - Yohan Boniface + Felix Bache
      + + + + +### Feature search/properties/popups + +Plugins that search for features and enhance how to display information about them. + + + + @@ -1184,58 +1329,89 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Yohan Boniface +
      PluginDescriptionMaintainer
      - Leaflet.Spin + leaflet-fusesearch - Shows a nice spinner on the map using Spin.js, - for asynchronous data load, like with Leaflet Ajax. + A control that provides a panel to search features in a GeoJSON layer using the lightweight fuzzy search Fuse.js - Mathieu Leplatre + Antoine Riche
      - Leaflet.RestoreView + leaflet-search - Stores and restores map view using localStorage. + A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service - Mathieu Leplatre + Stefano Cudini
      - Leaflet.FileLayer - - Loads files (GeoJSON, GPX, KML) into the map using the HTML5 FileReader API (i.e. locally without server). - - Mathieu Leplatre + Leaflet GeoJSON List + + Leaflet Control for listing GeoJSON properties in a interactive menu(Demo). + + Stefano Cudini
      - Leaflet.Snap + Leaflet.Rrose - Enables snapping of draggable markers to polylines and other layers. + A Leaflet Plugin for Edge Cases. For use when you want popups on mouseover, not click, and + you need popup tips to reorient as you get close to the edges of your map. - Mathieu Leplatre + Eric Theise
      - Leaflet Time-Slider + Leaflet.utfgrid - The Leaflet Time-Slider enables you to dynamically add and remove Markers on a map by using a JQuery UI slider + Provides a utfgrid interaction handler for leaflet a very small footprint. - Dennis Wilhelm + Dave Leaver
      + + + +### Area/feature selection + + + + +
      PluginDescriptionMaintainer
      - Leaflet.MousePosition + Leaflet.AreaSelect - A simple MousePosition control that displays geographic coordinates of the mouse pointer, as it is moved about the map + A fixed positioned, resizable rectangle for selecting an area on the map. - Ardhi Lukianto + Jonatan Heyman
      - Leaflet.SelectLayers + leaflet-locationfilter - a Leaflet plugin which adds new control to switch between different layers on the map. New control replaces L.Control.Layers radio button panel with select tag. + A draggable/resizable rectangle for selecting an area on the map. - vogdb + Robert Kajic
      - Leaflet.StyledLayerControl - - A Leaflet plugin that implements the management and control of layers by organization into categories or groups. - - Davi Custodio + L.Control.LineStringSelect + + Fast LineString(polyline) partial selection tool: select a stretch between two points in a complex path. Demo + + Alexander Milevski
      - Leaflet.Coordinates - - A simple Leaflet plugin viewing the mouse LatLng-coordinates. Also views a marker with coordinate popup on userinput. + Leaflet.FeatureSelect + Use a configurable centerpoint marker to select any geometry type from a GeoJSON layer. - Felix Bache + Aaron Ogle
      + + + +## Map interaction + +* [Layer switching controls](#mapcontrols-layerswitchers) +* [Interactive pan/zoom](#mapcontrols-panzoom-interactive) +* [Bookmarked pan/zoom](#mapcontrols-panzoom-bookmarked) +* [Fullscreen](#mapcontrols-fullscreen) +* [Minimaps & synced maps](#mapcontrols-minimaps) +* [Measurement](#mapcontrols-measure) +* [Mouse coordinates](#mapcontrols-mousecoords) +* [Events](#mapcontrols-events) +* [User interface](#mapcontrols-userinterface) +* [Print/export](#mapcontrols-print) +* [Geolocation](#mapcontrols-geolocation) + +### Layer switching controls + +Enhance or extend `L.Control.Layers`. + + @@ -1249,120 +1425,140 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s +
      PluginDescriptionMaintainer
      - Leaflet.Elevation + Leaflet.SelectLayers - A Leaflet plugin to view interactive height profiles of GeoJSON lines using d3. + a Leaflet plugin which adds new control to switch between different layers on the map. New control replaces L.Control.Layers radio button panel with select tag. - Felix Bache + vogdb
      - Leaflet.Sync + Leaflet.StyledLayerControl - Synchronized view of two maps. + A Leaflet plugin that implements the management and control of layers by organization into categories or groups. - Bjørn Sandvik + Davi Custodio
      - Leaflet.BorderPan + Leaflet Control Order Layers - A Leaflet plugin to pan by clicking on map borders. + Adds the ability to change overlay order in the layers control. - Sebastián Lara + Michael Salgado
      - Leaflet.TileLegend + Leaflet Categorized Layers - Create illustrated and interactive legends for your background layers. + Leaflet Control Layers extended for groups of categorized layers - Yohan Boniface + Robbie Trencheny
      - LeafletPlayback + Leaflet Panel Layers - Play back time-stamped GPS Tracks synchronized to a clock. + Leaflet Control Layers extended for group of layers and icons legend - Nicholas Hallahan + Stefano Cudini
      - Leaflet.loading + Leaflet.UniformControl - A simple control that adds a loading indicator as tiles and other data are loaded. + Leaflet layer control with stylable checkboxes and radio buttons. - Eric Brelsford + Chris Calip
      + + +### Interactive pan/zoom + +Change the way the user can interactively move around the map. + + + - + + + +
      PluginDescriptionMaintainer
      - Leaflet.viewcenter + Leaflet.Pancontrol - A simple control that adds a button to change view and zoom to predefinied values in options. + A simple panning control. - Dariusz Pawlak + Kartena
      - Leaflet.contextmenu + Leaflet.BoxZoom - A context menu for Leaflet. + A visible, clickable control to perform a box zoom. - Adam Ratcliffe + Greg Allensworth
      - Leaflet.MeasureControl + Leaflet.zoomslider - A simple tool to measure distances on maps (*relies on Leaflet.Draw*). + A zoom slider control. - Makina Corpus + Kartena
      - Leaflet.OverIntent + Leaflet.BorderPan - Adds a new event ``mouseintent``, that differs from ``mouseover`` since it reflects user - intentions to aim a particular layer. + A Leaflet plugin to pan by clicking on map borders. - Mathieu Leplatre + Sebastián Lara
      - Leaflet.AlmostOver + Leaflet GameController - Trigger mouse events when cursor is "almost" over a layer. + Interaction handler providing support for gamepads. - Mathieu Leplatre + Antoine Pultier
      - Leaflet Control Order Layers + Leaflet.twofingerZoom - Adds the ability to change overlay order in the layers control. + Interaction handler for touch devices enabling zooming out with a two finger tap. - Michael Salgado + Adam Ratcliffe
      - Leaflet.layerscontrol-minimap - - Extends the default Leaflet layers control with synced minimaps. - - Jieter + Leaflet.ZoomBox
      + A lightweight zoom box control: draw a box around the area you want to zoom to. Demo + + Brendan Ward +
      - leaflet-sidebar + Leaflet LimitZoom - A responsive sidebar plugin. + Plugins to limit available zoom levels to a given list, either by + restricting zooming or by interpolating tiles. - Tobias Bieniek + Ilya Zverev
      + + + +### Bookmarked pan/zoom + +Change the way the user is moved around the map, by jumping to predefined/stored places. + + @@ -1376,520 +1572,624 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s - - + - + + + - + + + + +
      PluginDescriptionMaintainer
      - sidebar-v2 + Leaflet.viewcenter - Another responsive sidebar plugin. This time with tabs! + A simple control that adds a button to change view and zoom to predefinied values in options. - Tobias Bieniek + Dariusz Pawlak
      - Leaflet.MagnifyingGlass + Leaflet Navigation Toolbar - Allows you to display a small portion of the map at another zoom level, either at a fixed position or linked to the mouse movement, for a magnifying glass effect. + Leaflet control for simple back, forward and home navigation. - Benjamin Becquet + David C
      - Leaflet.OpacityControls + Leaflet Locationlist - Simple Leaflet controls to adjust the opacity of a map layer. + A control to jump between predefined locations and zooms. - Jared Dominguez + Ivan Ignatyev
      - Leaflet.StyleEditor - - Enables editing the styles of features (lines, polygons, etc) and markers with a GUI. - - Dennis Wilhelm + Leaflet.defaultextent
      - Leaflet.UniformControl - - Leaflet layer control with stylable checkboxes and radio buttons. - - Chris Calip + A control that returns to the original start extent of the map. Similar to the HomeButton widget. + + Alex Nguyen
      - Leaflet.SimpleMarkers - - A light-weight Leaflet plugin for adding and deleting markers. - - Jared Dominguez + Leaflet.Bookmarks + + Control for adding and navigating between user-created bookmarks on the map. + + Alexander Milevski
      - Leaflet Panel Layers + + Leaflet.ShowAll - Leaflet Control Layers extended for group of layers and icons legend + A control that can show a predefined extent while saving the current one so it can be jumped back to. - Stefano Cudini + Mor Yariv
      - Leaflet Categorized Layers - - Leaflet Control Layers extended for groups of categorized layers - - Robbie Trencheny + Leaflet.zoomhome + + Zoom control with a home button for resetting the view (Demo) + + Florian Brucker
      - Leaflet Navigation Toolbar - - Leaflet control for simple back, forward and home navigation. - - David C + Leaflet-History + + Track history of map movements and zoom locations similar to a browser. + + Chris Scott
      - Leaflet LimitZoom + Leaflet.RestoreView - Plugins to limit available zoom levels to a given list, either by - restricting zooming or by interpolating tiles. + Stores and restores map view using localStorage. - Ilya Zverev + Mathieu Leplatre
      - Leaflet Coordinates Control + leaflet-hash - Captures mouseclick and displays its coordinates with easy way to copy them. + Plugin for persisting map state and browsing history through the URL hash. - Michal Zimmermann + Michael Lawrence Evans
      + + + +### Fullscreen controls + +Allows display of the Leaflet map in full-screen mode. + + +
      PluginDescriptionMaintainer
      - Leaflet GameController + Leaflet.fullscreen - Interaction handler providing support for gamepads. + A fullscreen button control by mapbox - Antoine Pultier + mapbox
      - Leaflet.MeasureAreaControl + leaflet.fullscreen - Control for measuring element's area. + Another fullscreen button control but for modern browsers, using HTML5 Fullscreen API. - Ondrej Zvara + Bruno B
      - Leaflet.twofingerZoom + leaflet.zoomfs - Interaction handler for touch devices enabling zooming out with a two finger tap. + A fullscreen button control. - Adam Ratcliffe + Eli Dupuis
      + + + +### Minimaps & synced maps + +Display two maps at once. One of them might be a different size and zoom level, usable as a minimap to aid with navigation. + + - + +
      PluginDescriptionMaintainer
      - Leaflet Control Compass + Leaflet.Sync - A leaflet control plugin to build a simple rotating compass + Synchronized view of two maps. - Stefano Cudini + Bjørn Sandvik
      - Leaflet.Editable + Leaflet.MiniMap - Lightweight fully customisable and controlable drawing/editing plugin. + A small minimap showing the map at a different scale to aid navigation. - Yohan Boniface + Robert Nordan
      - Leaflet.AccuratePosition + Leaflet.MagnifyingGlass - Leaflet.AccuratePosition aims to provide a desired device location accuracy. + Allows you to display a small portion of the map at another zoom level, either at a fixed position or linked to the mouse movement, for a magnifying glass effect. - Michael Schmidt-Voigt + Benjamin Becquet
      - Leaflet Locationlist + Leaflet.layerscontrol-minimap - A control to jump between predefined locations and zooms. + Extends the default Leaflet layers control with synced minimaps. - Ivan Ignatyev + Jieter
      + + + + + + +### Measurement + +Allow the user to measure distances or areas. + + - - +
      PluginDescriptionMaintainer
      - Leaflet.defaultextent - - A control that returns to the original start extent of the map. Similar to the HomeButton widget. - - Alex Nguyen + Leaflet.MeasureControl + + A simple tool to measure distances on maps (*relies on Leaflet.Draw*). + + Makina Corpus
      - Leaflet.buffer + Leaflet.MeasureAreaControl - Enables buffering of shapes drawn with Leaflet.draw. + Control for measuring element's area. - Jonathan Skeate + Ondrej Zvara
      - Leaflet.Bookmarks + leaflet-measure - Control for adding and navigating between user-created bookmarks on the map. + Coordinate, linear, and area measure control for Leaflet maps - Alexander Milevski + LJA GIS
      + + + + + + + + +### Mouse coordinates + +Show the geographical coordinates under the mouse cursor in different ways. + + - - - - - - - +
      PluginDescriptionMaintainer
      - Leaflet.MapPaint - - Bitmap painting plugin designed for touch devices. - - Antoine Pultier -
      - Leaflet.ShowAll + Leaflet.MousePosition - A control that can show a predefined extent while saving the current one so it can be jumped back to. + A simple MousePosition control that displays geographic coordinates of the mouse pointer, as it is moved about the map - Mor Yariv + Ardhi Lukianto
      - Leaflet.timeline + + Leaflet.Coordinates - Display arbitrary GeoJSON on a map with a timeline slider and play button. + A simple Leaflet plugin viewing the mouse LatLng-coordinates. Also views a marker with coordinate popup on userinput. - Jonathan Skeate + Felix Bache
      - Leaflet.ZoomBox - - A lightweight zoom box control: draw a box around the area you want to zoom to. Demo - - Brendan Ward + Leaflet Coordinates Control + + Captures mouseclick and displays its coordinates with easy way to copy them. + + Michal Zimmermann
      - L.Control.LineStringSelect + Leaflet.NACCoordinates - Fast LineString(polyline) partial selection tool: select a stretch between two points in a complex path. Demo + Displays NAC coordinate of the mouse pointer on mouse move (Demo) - Alexander Milevski + Mahmood Dehghan
      + + + + + + + + + +### Events + +Extend Leaflet event handling. + + - - - - - - - - - + +
      PluginDescriptionMaintainer
      - Leaflet.TimeDimension - - Add time dimension capabilities on a Leaflet map. Demos - - ICTS SOCIB + L.Sleep + + Avoid unwanted scroll capturing. + Demo + + atstp
      - Leaflet.Liveupdate - - Periodically ('live') update something on a map (Demo) - - Martijn Grendelman + Leaflet.OverIntent + + Adds a new event ``mouseintent``, that differs from ``mouseover`` since it reflects user + intentions to aim a particular layer. + + Mathieu Leplatre
      - Leaflet.Messagebox - - Display a temporary text message on a map (Demo) - - Martijn Grendelman + Leaflet.AlmostOver + + Trigger mouse events when cursor is "almost" over a layer. + + Mathieu Leplatre
      - Leaflet.Path.Drag - - Drag handler and interaction for polygons and polylines (Demo) - - Alexander Milevski + Leaflet-active-area + + This plugin allows you to use a smaller portion of the map as an active area. + All positionning methods (setView, fitBounds, setZoom) will be applied on this portion instead of the all map. + + Mappy
      - Leaflet.NACCoordinates + singleclick - Displays NAC coordinate of the mouse pointer on mouse move (Demo) + Extend Map to fire a singleclick event (example). - Mahmood Dehghan + Guillaume Lathoud
      + + + + + + + + + + +### User interface + +Generic buttons, sliders, toolbars, sidebars, panels. + + + + + + - - - - - + + + - + +
      PluginDescriptionMaintainer
      - Leaflet.zoomhome + L.EasyButton + + In one line, add a Font Awesome control button with attached click events. + Demo + + atstp
      - Zoom control with a home button for resetting the view (Demo) + Leaflet.contextmenu + + A context menu for Leaflet. + + Adam Ratcliffe
      - Florian Brucker + leaflet-sidebar + + A responsive sidebar plugin. + + Tobias Bieniek
      - leaflet-measure - - Coordinate, linear, and area measure control for Leaflet maps - - LJA GIS + sidebar-v2 + + Another responsive sidebar plugin. This time with tabs! + + Tobias Bieniek
      - Leaflet-History + Leaflet.Messagebox - Track history of map movements and zoom locations similar to a browser. + Display a temporary text message on a map (Demo) - Chris Scott + Martijn Grendelman
      - Leaflet GeoJSON List - - Leaflet Control for listing GeoJSON properties in a interactive menu(Demo). - - Stefano Cudini + Leaflet.TileLegend + + Create illustrated and interactive legends for your background layers. + + Yohan Boniface
      - Leaflet Weather + Leaflet.toolbar - A Leaflet plugin for adding a weather widget to the map using OpenWeatherMap API (Demo). + Flexible, extensible toolbars for Leaflet maps. View an example here. - Osk + Justin Manley
      - Leaflet.toolbar + L.Credits - Flexible, extensible toolbars for Leaflet maps. View an example here. + A simple, attractive, interactive control to put your logo and link in the corner of your map. - Justin Manley + Greg Allensworth
      - singleclick + Leaflet.Spin + + Shows a nice spinner on the map using Spin.js, + for asynchronous data load, like with Leaflet Ajax. + + Mathieu Leplatre
      - Extend Map to fire a singleclick event (example). + Leaflet Weather - Guillaume Lathoud + A Leaflet plugin for adding a weather widget to the map using OpenWeatherMap API (Demo).
      + Osk +
      -### Other Plugins and Libraries - - - - - - +### Print/export + +Print or export your map. + +
      PluginDescriptionMaintainer
      +
      PluginDescriptionMaintainer
      - OSM Buildings + Leaflet.print - Amazing JS library for visualizing 3D OSM building geometry on top of Leaflet. + Implements the Mapfish print protocol allowing a Leaflet map to be printed using either the Mapfish or GeoServer print module. - Jan Marsch + Adam Ratcliffe
      - Maps Marker Pro + Leaflet-easyPrint - A WordPress plugin that enables users to pin, organize and share their favorite places and tracks through their WordPress powered site. + A simple leaflet plugin which adds an icon to print the map. The resulting print page will strip ot the other content on the page and only print the leaflet map div. - Robert Harm + Rowan Winsemius
      + + + + + + + + + +### Geolocation + +Plugins that extend Leaflet's geolocation capabilities. + + +
      PluginDescriptionMaintainer
      - leaflet-hash + L.LocationShare - Plugin for persisting map state and browsing history through the URL hash. + Allow users to send and receive a marker with a message. + Demo - Michael Lawrence Evans + atstp
      - arc.js + Leaflet.Locate - A JS library for drawing great circle routes that can be used with Leaflet. + A customizable locate control. - Dane Springmeyer + Dominik Moritz
      - Leaflet.Storage + Leaflet Control Compass - Create/update/delete Map, Marker, Polygon, Polyline... and expose them for backend storage with an API. + A leaflet control plugin to build a simple rotating compass - Yohan Boniface + Stefano Cudini
      - Leaflet.CSS + Leaflet.AccuratePosition - Add the main Leaflet CSS files (or any css) from within JavaScript, be gone conditional comments. + Leaflet.AccuratePosition aims to provide a desired device location accuracy. - Calvin Metcalf + Michael Schmidt-Voigt
      + + + + +### Geocoding (Address Lookup) + + - + - + - - + + + +
      PluginDescriptionMaintainer
      - Leaflet.LayerIndex + Leaflet GeoSearch - An efficient spatial index for features and layers, using RTree.js. + Small geocoding plugin that brings address searching/lookup (aka geosearching) to Leaflet.
      + Comes with support for Google, OpenStreetMap Nominatim, Bing, Esri and Nokia. Easily extensible.
      - Mathieu Leplatre + Stephan Meijer
      - Leaflet-pip + Leaflet Control OSM Geocoder - Simple point in polygon calculation using point-in-polygon. + A simple geocoder that uses OpenstreetMap Nominatim to locate places by address. - Tom MacWright + Karsten Hinz
      - Leaflet.GeometryUtil + Leaflet Control Bing Geocoder - A collection of utilities for Leaflet geometries (linear referencing, etc.) + A simple geocoder control that uses Bing to locate places. - Benjamin Becquet, Mathieu Leplatre + Samuel Piquet
      - Leaflet.i18n + Leaflet Control Geocoder - Internationalization for Leaflet plugins. + A clean and extensible control that uses Nominatim (OSM) or Bing to locate places. Easy to adapt for other providers. - Yohan Boniface + Per Liedman
      - Leaflet.print + Leaflet GeoIP Locator - Implements the Mapfish print protocol allowing a Leaflet map to be printed using either the Mapfish or GeoServer print module. + A simple plugin that allows finding the approximate location of IP addresses and map centering on said location. - Adam Ratcliffe + Jakub Dostal
      - Leaflet-easyPrint + Esri Leaflet Geocoder - A simple leaflet plugin which adds an icon to print the map. The resulting print page will strip ot the other content on the page and only print the leaflet map div. + A geocoding control with suggestions powered by the ArcGIS Online geocoder. - Rowan Winsemius + Patrick Arlt
      - Leaflet-active-area - - This plugin allows you to use a smaller portion of the map as an active area. - All positionning methods (setView, fitBounds, setZoom) will be applied on this portion instead of the all map. - - Mappy + Leaflet.OpenCage.Search
      - WordPress Leaflet Map - - Interactive and flexible shortcode to create multiple maps in posts and pages, - and to add multiple markers on those maps. - - Benjamin J DeLong + A search plugin plugin that uses OpenCage Data's geocoding API. + + The OpenCage team
      - MapBBCode-related leaflet plugins - - Seven plugins for various features, independent of the MapBBCode library. - From circular and popup icons to buttons, layer switcher, better search and attribution. - - Ilya Zverev + Leaflet.Geonames + + A lightweight geocoding control powered by GeoNames. Demo + + Brendan Ward
      + + + + +## Integration + +## Frameworks & build systems + +Ease your development integrating Leaflet into a development framework or automating some of the javascript/CSS work for complex applications. + + + + + @@ -1923,6 +2232,15 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Alexander Nossum + + + +
      PluginDescriptionMaintainer
      Leaflet Yeoman Generator @@ -1903,13 +2203,22 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
      - L.Credits + react-leaflet - A simple, attractive, interactive control to put your logo and link in the corner of your map. + React components for Leaflet maps. - Greg Allensworth + Paul Le Cam +
      + Leaflet.CSS + + Add the main Leaflet CSS files (or any css) from within JavaScript, be gone conditional comments. + + Calvin Metcalf
      + Leaflet.i18n + + Internationalization for Leaflet plugins. + + Yohan Boniface +
      Leaflet ZoomLevel CSS Class @@ -1934,15 +2252,40 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Dag Jomar Mersland
      + + +### 3rd party integration + +The following plugins integrate Leaflet into third party services or websites. + + + + + + @@ -1950,25 +2293,57 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s Maptiks + +
      PluginDescriptionMaintainer
      - Greiner-Hormann + Leaflet.EditInOSM + + Add a control with links to open the current map view on main OSM editors. + + Yohan Boniface
      - Greiner-Hormann algorithm for polygon clipping and binary operations, adapted for use with Leaflet. + Maps Marker Pro + + A WordPress plugin that enables users to pin, organize and share their favorite places and tracks through their WordPress powered site. + + Robert Harm
      - Alexander Milevski + WordPress Leaflet Map + + Interactive and flexible shortcode to create multiple maps in posts and pages, + and to add multiple markers on those maps. + + Benjamin J DeLong
      - Analytics platform for web maps. Track map activities, layer load times, marker clicks, and more! + Analytics platform for web maps. Track map activities, layer load times, marker clicks, and more! Sparkgeo -
      + + + +## Plugin collections + +Sets of plugins that span several categories. + +Plugin developers: please keep future plugins in individual repositories. + + + + + + + MapBBCode-related leaflet plugins +
      PluginDescriptionMaintainer
      - react-leaflet + Plugins by Pavel Shramov + + A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), permalink and distance measurement controls. + + Pavel Shramov, Bruno B
      - React components for Leaflet maps. + Spectrum4Leaflet + + Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. + + SVoyt, ESTI MAP
      - Paul Le Cam - + Seven plugins for various features, independent of the MapBBCode library. + From circular and popup icons to buttons, layer switcher, better search and attribution. + + Ilya Zverev +
      + + + + To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). + + + + + + + + + + + + + + + +
      PluginDescriptionMaintainer
      @@ -2045,12 +1963,6 @@ Print or export your map. - - - - - - ### Geolocation Plugins that extend Leaflet's geolocation capabilities. @@ -2098,7 +2010,135 @@ Plugins that extend Leaflet's geolocation capabilities. -### Geocoding (Address Lookup) + +## Miscellaneous + + + +### Geoprocessing + +The following plugins perform several sorts of geoprocessing (mathematical and topological operations on points, lines and polygons). + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PluginDescriptionMaintainer
      + Proj4Leaflet + + Proj4js integration plugin, allowing you to use all kinds of weird projections in Leaflet. + + Kartena +
      + arc.js + + A JS library for drawing great circle routes that can be used with Leaflet. + + Dane Springmeyer +
      + Leaflet-pip + + Simple point in polygon calculation using point-in-polygon. + + Tom MacWright +
      + Leaflet.GeometryUtil + + A collection of utilities for Leaflet geometries (linear referencing, etc.) + + Benjamin Becquet, Mathieu Leplatre +
      + Greiner-Hormann + + Greiner-Hormann algorithm for polygon clipping and binary operations, adapted for use with Leaflet. + + Alexander Milevski +
      + Leaflet.Geodesic + + Draw geodesic (poly)lines. A geodesic line is the shortest path between two given positions on the earth surface. and You can also calculate the exact distance between two given points on the map. + + Henry Thasler +
      + Leaflet.buffer + + Enables buffering of shapes drawn with Leaflet.draw. + + Jonathan Skeate +
      + Leaflet.LayerIndex + + An efficient spatial index for features and layers, using RTree.js. + + Mathieu Leplatre +
      + + + +### Routing + +The following plugins use external services to calculate driving or walking routes. + + + + + + + + + + + +
      PluginDescriptionMaintainer
      + Leaflet Routing Machine + + Control for route search between waypoints, displaying itinerary and alternative routes. Currently + uses OSRM to search routes. + + Per Liedman +
      + Leaflet.Routing + + Leaflet controller and interface for routing paths between waypoints using any user provided routing service. + + Norwegian Trekking Association +
      + Route360° + + Route360° visualizes the area which is reachable from a set of starting points in a given time and gives detailed routing information (walk, bike, car and public transportation) to targets. + + Motion Intelligence GmbH +
      + + + + +### Geocoding + +External services that transform an address or the name of a place into latitude and longitude (or vice versa). @@ -2182,10 +2222,48 @@ Plugins that extend Leaflet's geolocation capabilities. +## Plugin collections + +Sets of plugins that span several categories. + +Plugin developers: please keep future plugins in individual repositories. + +
      PluginDescriptionMaintainer
      + + + + + + + + + +
      PluginDescriptionMaintainer
      + Plugins by Pavel Shramov + + A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), permalink and distance measurement controls. + + Pavel Shramov, Bruno B +
      + Spectrum4Leaflet + + Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. + + SVoyt, ESTI MAP +
      + MapBBCode-related leaflet plugins + + Seven plugins for various features, independent of the MapBBCode library. + From circular and popup icons to buttons, layer switcher, better search and attribution. + + Ilya Zverev +
      + + ## Integration -## Frameworks & build systems +### Frameworks & build systems Ease your development integrating Leaflet into a development framework or automating some of the javascript/CSS work for complex applications. @@ -2303,50 +2381,13 @@ The following plugins integrate Leaflet into third party services or websites. -## Plugin collections - -Sets of plugins that span several categories. - -Plugin developers: please keep future plugins in individual repositories. - - - - - - - - - - - -
      PluginDescriptionMaintainer
      - Plugins by Pavel Shramov - - A set of plugins for: GPX, KML layers; Bing tile layer; Google and Yandex layers (implemented with their APIs), permalink and distance measurement controls. - - Pavel Shramov, Bruno B -
      - Spectrum4Leaflet - - Tools for using Spectrum Spatial Server services with leaflet. This plugin supports: map service, tile service, feature service. It has layers, legend and feature controls. - - SVoyt, ESTI MAP -
      - MapBBCode-related leaflet plugins - - Seven plugins for various features, independent of the MapBBCode library. - From circular and popup icons to buttons, layer switcher, better search and attribution. - - Ilya Zverev -
      +## Develop your own +Leaflet keeps it simple. If you can think of a feature that is not required by all of Leaflet users, and you can write the javascript code in a reusable way, you've got yourself a Leaflet plugin already. +There are no hard requirements on how to create your own plugin, but all developers are encouraged to read the recommendations in the [plugin guide](https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md). -To submit your own Leaflet plugin to this list, just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). +Once your plugin is ready, you can submit it to this list: just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). - From dac9d33c1ef674d5d7d39f1628060d2b9086331a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 May 2015 01:03:13 +0200 Subject: [PATCH 1482/2207] Add some framework integration stuff into plugins, just because. --- plugins.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/plugins.md b/plugins.md index 6f6b7842a84..551144d03b8 100644 --- a/plugins.md +++ b/plugins.md @@ -2330,6 +2330,39 @@ Ease your development integrating Leaflet into a development framework or automa Dag Jomar Mersland
      + famous-map + + Integrate Leaflet in applications made with the famo.us web framework. + + Hein Rutjes +
      + Angular Leaflet directive + + Integrate Leaflet in applications made with the AngularJS web framework. + + David Rubert +
      + Leaflet map component + + Integrate Leaflet in applications made with the Polymer web framework. + + Prateek Saxena +
      From 19d6008dfc2d382f70598e6a320140f300b3dc25 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 8 May 2015 11:52:00 +0200 Subject: [PATCH 1483/2207] Make L.Polyline._flat a static method --- spec/suites/layer/vector/PolylineSpec.js | 10 +++++----- src/layer/GeoJSON.js | 6 +++--- src/layer/vector/Polyline.js | 16 ++++++++++------ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index 8ab42b1b99e..177f7370b9b 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -92,23 +92,23 @@ describe('Polyline', function () { var layer = L.polyline([]); it('should return true for an array of LatLngs', function () { - expect(layer._flat([L.latLng([0, 0])])).to.be(true); + expect(L.Polyline._flat([L.latLng([0, 0])])).to.be(true); }); it('should return true for an array of LatLngs arrays', function () { - expect(layer._flat([[0, 0]])).to.be(true); + expect(L.Polyline._flat([[0, 0]])).to.be(true); }); it('should return true for an empty array', function () { - expect(layer._flat([])).to.be(true); + expect(L.Polyline._flat([])).to.be(true); }); it('should return false for a nested array of LatLngs', function () { - expect(layer._flat([[L.latLng([0, 0])]])).to.be(false); + expect(L.Polyline._flat([[L.latLng([0, 0])]])).to.be(false); }); it('should return false for a nested empty array', function () { - expect(layer._flat([[]])).to.be(false); + expect(L.Polyline._flat([[]])).to.be(false); }); }); diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index cb29d8dedc0..871bd1110ab 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -190,7 +190,7 @@ L.Circle.include(PointToGeoJSON); L.CircleMarker.include(PointToGeoJSON); L.Polyline.prototype.toGeoJSON = function () { - var multi = !this._flat(this._latlngs); + var multi = !L.Polyline._flat(this._latlngs); var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 1 : 0); @@ -201,8 +201,8 @@ L.Polyline.prototype.toGeoJSON = function () { }; L.Polygon.prototype.toGeoJSON = function () { - var holes = !this._flat(this._latlngs), - multi = holes && !this._flat(this._latlngs[0]); + var holes = !L.Polyline._flat(this._latlngs), + multi = holes && !L.Polyline._flat(this._latlngs[0]); var coords = L.GeoJSON.latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true); diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index d49ca27e1a1..06171d72d10 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -115,7 +115,7 @@ L.Polyline = L.Path.extend({ // recursively convert latlngs input into actual LatLng instances; calculate bounds along the way _convertLatLngs: function (latlngs) { var result = [], - flat = this._flat(latlngs); + flat = L.Polyline._flat(latlngs); for (var i = 0, len = latlngs.length; i < len; i++) { if (flat) { @@ -129,11 +129,6 @@ L.Polyline = L.Path.extend({ return result; }, - _flat: function (latlngs) { - // true if it's a flat array of latlngs; false if nested - return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); - }, - _project: function () { this._rings = []; this._projectLatlngs(this._latlngs, this._rings); @@ -228,3 +223,12 @@ L.Polyline = L.Path.extend({ L.polyline = function (latlngs, options) { return new L.Polyline(latlngs, options); }; + +L.extend(L.Polyline, { + + _flat: function (latlngs) { + // true if it's a flat array of latlngs; false if nested + return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); + } + +}); From d53d958e815089f7829bef513a4f7b4687ed81f2 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 8 May 2015 12:01:22 +0200 Subject: [PATCH 1484/2207] Simpler approach for static method --- src/layer/vector/Polyline.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 06171d72d10..41c04ee818b 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -224,11 +224,7 @@ L.polyline = function (latlngs, options) { return new L.Polyline(latlngs, options); }; -L.extend(L.Polyline, { - - _flat: function (latlngs) { - // true if it's a flat array of latlngs; false if nested - return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); - } - -}); +L.Polyline._flat = function (latlngs) { + // true if it's a flat array of latlngs; false if nested + return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); +}; From 2408cf2bb6b41c5181b0f33f55e5c200cb3dbc27 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 8 May 2015 13:11:58 +0200 Subject: [PATCH 1485/2207] _flat is now a static method --- spec/suites/layer/vector/PolygonSpec.js | 2 +- src/layer/vector/Polygon.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index e96b8b93579..b11adfd916c 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -12,7 +12,7 @@ describe('Polygon', function () { var polygon = new L.Polygon(latLngs); - expect(polygon._flat(polygon._latlngs)).to.be(false); + expect(L.Polyline._flat(polygon._latlngs)).to.be(false); expect(polygon.getLatLngs()).to.eql(polygon._latlngs); }); diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index 3815d113e1e..640b73166d5 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -51,7 +51,7 @@ L.Polygon = L.Polyline.extend({ _setLatLngs: function (latlngs) { L.Polyline.prototype._setLatLngs.call(this, latlngs); - if (this._flat(this._latlngs)) { + if (L.Polyline._flat(this._latlngs)) { this._latlngs = [this._latlngs]; } }, From 57d7dff81ff8c4d0dba08f86f73d4b384683f585 Mon Sep 17 00:00:00 2001 From: "i.taratuhin" Date: Fri, 8 May 2015 18:01:13 +0600 Subject: [PATCH 1486/2207] fix vector in ie8 --- debug/map/popup.html | 2 +- src/layer/vector/SVG.VML.js | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/debug/map/popup.html b/debug/map/popup.html index 36b5882ef0d..3361708a7fc 100644 --- a/debug/map/popup.html +++ b/debug/map/popup.html @@ -60,7 +60,7 @@ var polyline = L.polyline([ getRandomLatLng(map), getRandomLatLng(map), - getRandomLatLng(map), + getRandomLatLng(map) ], { color: 'red' }).bindPopup('I\'m a red polyline').addTo(map); diff --git a/src/layer/vector/SVG.VML.js b/src/layer/vector/SVG.VML.js index fbd5c899c72..7099e776b26 100644 --- a/src/layer/vector/SVG.VML.js +++ b/src/layer/vector/SVG.VML.js @@ -23,9 +23,6 @@ L.SVG.include(!L.Browser.vml ? {} : { _initContainer: function () { this._container = L.DomUtil.create('div', 'leaflet-vml-container'); - - this._paths = {}; - this._initEvents(); }, _update: function () { @@ -49,13 +46,13 @@ L.SVG.include(!L.Browser.vml ? {} : { _addPath: function (layer) { var container = layer._container; this._container.appendChild(container); - this._paths[L.stamp(container)] = layer; + layer.addInteractiveTarget(container); }, _removePath: function (layer) { var container = layer._container; L.DomUtil.remove(container); - delete this._paths[L.stamp(container)]; + layer.removeInteractiveTarget(container); }, _updateStyle: function (layer) { From 6aca7ef3c20e2bf3bf29699b099d6fc062d1653d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 8 May 2015 14:53:21 +0200 Subject: [PATCH 1487/2207] Add back L.Polyline.addLatLng --- spec/suites/layer/vector/PolygonSpec.js | 153 +++++++++++++++++++++++ spec/suites/layer/vector/PolylineSpec.js | 76 +++++++++++ src/layer/vector/Polygon.js | 4 + src/layer/vector/Polyline.js | 12 ++ 4 files changed, 245 insertions(+) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index b11adfd916c..f55a4aff7c2 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -140,4 +140,157 @@ describe('Polygon', function () { }); + describe("#_defaultShape", function () { + + it("should return latlngs on a simple polygon", function () { + var latlngs = [ + L.latLng([1, 2]), + L.latLng([3, 4]) + ]; + + var polygon = new L.Polygon(latlngs); + + expect(polygon._defaultShape()).to.eql(latlngs); + }); + + it("should return first latlngs on a polygon with hole", function () { + var latlngs = [ + [L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16])], + [L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])] + ]; + + var polygon = new L.Polygon(latlngs); + + expect(polygon._defaultShape()).to.eql(latlngs[0]); + }); + + it("should return first latlngs on a multipolygon", function () { + var latlngs = [ + [[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]], + [[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]] + ]; + + var polygon = new L.Polygon(latlngs); + + expect(polygon._defaultShape()).to.eql(latlngs[0][0]); + }); + + it("should return first latlngs on a multipolygon with hole", function () { + var latlngs = [ + [ + [L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], + [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])] + ], + [[L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]] + ]; + + var polygon = new L.Polygon(latlngs); + + expect(polygon._defaultShape()).to.eql(latlngs[0][0]); + }); + + }); + + describe("#addLatLng", function () { + it("should add latlng to latlngs", function () { + var latLngs = [ + [1, 2], + [3, 4] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([5, 6]); + + expect(polygon._latlngs).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); + }); + + it("should add latlng to first latlngs on a polygon with hole", function () { + var latLngs = [ + [[0, 12], [13, 14], [15, 16]], + [[1, 2], [3, 4], [5, 6]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([17, 0]); + + expect(polygon._latlngs[0]).to.eql([L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16]), L.latLng([17, 0])]); + expect(polygon._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + }); + + it("should add latlng by reference on a polygon with hole", function () { + var latLngs = [ + [[0, 12], [13, 14], [15, 16]], + [[1, 2], [3, 4], [5, 6]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([7, 8], polygon._latlngs[1]); + + expect(polygon._latlngs[0]).to.eql([L.latLng([0, 12]), L.latLng([13, 14]), L.latLng([15, 16])]); + expect(polygon._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6]), L.latLng([7, 8])]); + }); + + it("should add latlng to first latlngs on a multi", function () { + var latLngs = [ + [[[1, 2], [3, 4]]], + [[[11, 12], [13, 14], [15, 16]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([5, 6]); + + expect(polygon._latlngs[0]).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); + expect(polygon._latlngs[1]).to.eql([[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]]); + }); + + it("should add latlng to latlngs by reference on a multi", function () { + var latLngs = [ + [[[11, 12], [13, 14], [15, 16]]], + [[[1, 2], [3, 4]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([5, 6], polygon._latlngs[1][0]); + + expect(polygon._latlngs[1]).to.eql([[L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]]); + expect(polygon._latlngs[0]).to.eql([[L.latLng([11, 12]), L.latLng([13, 14]), L.latLng([15, 16])]]); + }); + + it("should add latlng on first latlngs by default on a multipolygon with hole", function () { + var latLngs = [ + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]], + [[[10, 20], [30, 40], [50, 60]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([-10, -10]); + + expect(polygon._latlngs[0][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0]), L.latLng([-10, -10])]); + expect(polygon._latlngs[0][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); + }); + + it("should add latlng by reference on a multipolygon with hole", function () { + var latLngs = [ + [[[10, 20], [30, 40], [50, 60]]], + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] + ]; + + var polygon = new L.Polygon(latLngs); + + polygon.addLatLng([2, 2], polygon._latlngs[1][1]); + + expect(polygon._latlngs[0][0]).to.eql([L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]); + expect(polygon._latlngs[1][0]).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); + expect(polygon._latlngs[1][1]).to.eql([L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4]), L.latLng([2, 2])]); + }); + + }); + }); diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index 246306429ea..5eebb358fec 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -133,4 +133,80 @@ describe('Polyline', function () { }); + describe("#_defaultShape", function () { + + it("should return latlngs when flat", function () { + var latLngs = [L.latLng([1, 2]), L.latLng([3, 4])]; + + var polyline = new L.Polyline(latLngs); + + expect(polyline._defaultShape()).to.eql(latLngs); + }); + + it("should return first latlngs on a multi", function () { + var latLngs = [ + [L.latLng([1, 2]), L.latLng([3, 4])], + [L.latLng([11, 12]), L.latLng([13, 14])] + ]; + + var polyline = new L.Polyline(latLngs); + + expect(polyline._defaultShape()).to.eql(latLngs[0]); + }); + + }); + + describe("#addLatLng", function () { + + it("should add latlng to latlngs", function () { + var latLngs = [ + [1, 2], + [3, 4] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.addLatLng([5, 6]); + + expect(polyline._latlngs).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + }); + + it("should add latlng to first latlngs on a multi", function () { + var latLngs = [ + [[1, 2], [3, 4]], + [[11, 12], [13, 14]] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.addLatLng([5, 6]); + + expect(polyline._latlngs[0]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + expect(polyline._latlngs[1]).to.eql([L.latLng([11, 12]), L.latLng([13, 14])]); + }); + + it("should add latlng to latlngs by reference", function () { + var latLngs = [ + [[11, 12], [13, 14]], + [[1, 2], [3, 4]] + ]; + + var polyline = new L.Polyline(latLngs); + + polyline.addLatLng([5, 6], polyline._latlngs[1]); + + expect(polyline._latlngs[1]).to.eql([L.latLng([1, 2]), L.latLng([3, 4]), L.latLng([5, 6])]); + expect(polyline._latlngs[0]).to.eql([L.latLng([11, 12]), L.latLng([13, 14])]); + }); + + it("should add latlng on empty polyline", function () { + var polyline = new L.Polyline([]); + + polyline.addLatLng([1, 2]); + + expect(polyline._latlngs).to.eql([L.latLng([1, 2])]); + }); + + }); + }); diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index 640b73166d5..97d685ff963 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -56,6 +56,10 @@ L.Polygon = L.Polyline.extend({ } }, + _defaultShape: function () { + return L.Polyline._flat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; + }, + _clipPoints: function () { if (this.options.noClip) { this._parts = this._rings; diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 58ce970f639..cd0fed8e2cb 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -90,11 +90,23 @@ L.Polyline = L.Path.extend({ return this._bounds; }, + addLatLng: function (latlng, latlngs) { + latlngs = latlngs || this._defaultShape(); + latlng = L.latLng(latlng); + latlngs.push(latlng); + this._bounds.extend(latlng); + return this.redraw(); + }, + _setLatLngs: function (latlngs) { this._bounds = new L.LatLngBounds(); this._latlngs = this._convertLatLngs(latlngs); }, + _defaultShape: function () { + return L.Polyline._flat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + // recursively convert latlngs input into actual LatLng instances; calculate bounds along the way _convertLatLngs: function (latlngs) { var result = [], From b121744e7ed20f4e3ff55e8b7a41954a0e573304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 May 2015 15:53:46 +0200 Subject: [PATCH 1488/2207] Plugins page: turn headers into permalinks --- _layouts/default.html | 12 +++ docs/css/screen.css | 14 ++- plugins.md | 206 +++++++++++++++++++++--------------------- 3 files changed, 127 insertions(+), 105 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index dd1a6fa02fb..4fc83cfebb9 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -172,6 +172,18 @@

      An Open-Source JavaScript Library for Mobile-Friendly Interactiv }; } } + + if (document.body.className === 'plugins-page') { + headers = document.getElementsByTagName('h3'); + for (var i = 0, len = headers.length; i < len; i++) { + if (headers[i].id) { + headers[i].onclick = function() { + window.location.hash = '#' + this.id; + }; + } + } + } + })(); hljs.initHighlighting(); diff --git a/docs/css/screen.css b/docs/css/screen.css index 572c3abe922..1990837d746 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -76,11 +76,13 @@ h2 { text-shadow: 0 -1px 1px rgba(0,0,0,0.35); } -.api-page h2 { +.api-page h2, .plugins-page h2, .plugins-page h3 { cursor: pointer; } .api-page h2[id]:before, +.plugins-page h2[id]:before, +.plugins-page h3[id]:before, .api-page tr[id] td:first-child:before { content: 'Permalink'; display: inline-block; @@ -98,6 +100,10 @@ h2 { position: absolute; } +.plugins-page h3[id]:before { + margin: 0px 5px 0px -23px; + } + .api-page tr[id] td:first-child:before { opacity:0; } @@ -106,7 +112,11 @@ h2 { opacity:1; } -.api-page h2[id]:hover:before { opacity:1; } +.api-page h2[id]:hover:before, +.plugins-page h2[id]:hover:before, +.plugins-page h3[id]:hover:before { + opacity:1; + } .api-page h2 { margin-top: 2.5em; diff --git a/plugins.md b/plugins.md index 6f6b7842a84..20f1c30c3de 100644 --- a/plugins.md +++ b/plugins.md @@ -1,12 +1,12 @@ --- layout: default title: Plugins +bodyclass: plugins-page --- -## Notable Leaflet Plugins - While Leaflet is meant to be as lightweight as possible, and focuses on a core set of features, an easy way to extend its functionality is to use third-party plugins. Thanks to the awesome community behind Leaflet, there are literally hundreds of nice plugins to choose from. +---
      @@ -69,32 +69,32 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
    77. Geoprocessing
    78. Routing
    79. Geocoding
    80. -
    81. Plugin collections
    82. +
    83. Plugin collections
    84. Integration


      - Develop your own + Develop your own
      -## Tile & image layers +## Tile & image layers The following plugins allow loading different maps and provide functionality to tile and image layers. * [Basemap providers](#basemap-providers) * [Basemap formats](#basemap-formats) -* [Non-map base layers](#basemap-nonmap) -* [Tile/image display](#tiledisplay) -* [Tile load](#tileload) +* [Non-map base layers](#non-map-base-layers) +* [Tile/image display](#tileimage-display) +* [Tile load](#tile-load) -### Basemap providers +### Basemap providers Ready-to-go basemaps, with little or no configuration at all. @@ -148,7 +148,7 @@ Ready-to-go basemaps, with little or no configuration at all. -### Basemap formats +### Basemap formats Plugins for loading basemaps or GIS raster layers in common (albeit non-default) formats. @@ -227,7 +227,7 @@ Plugins for loading basemaps or GIS raster layers in common (albeit non-default) -### Non-map base tilelayers +### Non-map base layers Sometimes you don't want to load a map, just big custom images. **Really** big ones. @@ -281,7 +281,7 @@ Sometimes you don't want to load a map, just big custom images. **Really** big o -### Tile/image display +### Tile/image display The following plugins change the way that tile or image layers are displayed in the map. @@ -335,7 +335,7 @@ The following plugins change the way that tile or image layers are displayed in -### Tile Load +### Tile Load The following plugins change the way that tile layers are loaded into the map. @@ -389,16 +389,16 @@ The following plugins change the way that tile layers are loaded into the map. -## Overlay data +## Overlay data The following plugins provide new ways of loading overlay data (GIS vector data): points, lines and polygons. -* [Overlay data formats](#vectordata-formats) -* [Dynamic data loading](#vectordata-dynamic) -* [Synthetic overlays](#vectordata-synthetic) -* [Data providers](#vectordata-providers) +* [Overlay data formats](#overlay-data-formats) +* [Dynamic data loading](#dynamiccustom-data-loading) +* [Synthetic overlays](#synthetic-overlays) +* [Data providers](#data-providers) -### Overlay data formats +### Overlay data formats Load your own data from various GIS formats. @@ -479,7 +479,7 @@ Load your own data from various GIS formats. -### Dynamic/custom data loading +### Dynamic/custom data loading Load dynamic data which is updated in the map, or load GIS vector data in non-standard ways. @@ -535,7 +535,7 @@ Load dynamic data which is updated in the map, or load GIS vector data in non-st -### Synthetic overlays +### Synthetic overlays These plugins create useful overlays from scratch, no loading required. @@ -570,7 +570,7 @@ These plugins create useful overlays from scratch, no loading required. -### Data providers +### Data providers Load overlay data from third-party-services. See also [basemap providers](#basemap-providers) and [plugin collections](#collections). @@ -606,18 +606,18 @@ Load overlay data from third-party-services. See also [basemap providers](#basem -## Overlay display +## Overlay display The following plugins provide new ways of displaying overlay data information. -* [Markers & renderers](#vectordisplay-symbolizers) -* [Marker animations](#vectordisplay-animations) -* [Clustering/decluttering](#vectordisplay-cluster) -* [Heatmaps](#vectordisplay-heatmap) -* [DataViz](#vectordisplay-dataviz) +* [Markers & renderers](#markers--renderers) +* [Overlay animations](#overlay-animations) +* [Clustering/decluttering](#clusteringdecluttering) +* [Heatmaps](#heatmaps) +* [DataViz](#dataviz) -### Markers & renderers +### Markers & renderers These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also known these as symbolizers. @@ -772,7 +772,7 @@ These plugins provide new markers or news ways of converting abstract data into -### Overlay animations +### Overlay animations These plugins animate markers or some geometries. See also [geometries with time or elevation](#geometryinteraction-time). @@ -827,7 +827,7 @@ These plugins animate markers or some geometries. See also [geometries with time -### Clustering/Decluttering +### Clustering/Decluttering When you are displaying a lot of data, these plugins will make your map look cleaner. @@ -880,7 +880,7 @@ When you are displaying a lot of data, these plugins will make your map look cle -### Heatmaps +### Heatmaps These plugins create heatmaps and heatmap-like visualizations from vector data. @@ -937,7 +937,7 @@ These plugins create heatmaps and heatmap-like visualizations from vector data. -### DataViz +### DataViz Powerful multi-purpose libraries for data visualization. @@ -973,16 +973,16 @@ Powerful multi-purpose libraries for data visualization. -## Interaction with geometries/features +## Interaction with geometries/features The following plugins enable users to interact with overlay data: edit geometries, select areas or features, interact with the time dimension, search features and display information about them. -* [Edit geometries](#geometryinteraction-edit) -* [Time & elevation](#geometryinteraction-time) -* [Search & popups](#geometryinteraction-search) -* [Area/overlay selection](#geometryinteraction-selection) +* [Edit geometries](#edit-geometries) +* [Time & elevation](#time--elevation) +* [Search & popups](#ge#search--popups) +* [Area/overlay selection](#areaoverlay-selection) -### Edit geometries +### Edit geometries Allows users to create, draw, edit and/or delete points, lines and polygons. @@ -1119,7 +1119,7 @@ Allows users to create, draw, edit and/or delete points, lines and polygons. -### Time & elevation +### Time & elevation Most data is two-dimensional (latitude and longitude), but some data has more dimensions (altitude and/or time). The following plugins help users navigate these extra dimensions. @@ -1176,7 +1176,7 @@ Most data is two-dimensional (latitude and longitude), but some data has more di -### Search & popups +### Search & popups Plugins that search for overlays and enhance how to display information about them. @@ -1242,7 +1242,7 @@ Plugins that search for overlays and enhance how to display information about th -### Area/overlay selection +### Area/overlay selection These plugins help users select either overlays or areas in the map. @@ -1288,23 +1288,23 @@ These plugins help users select either overlays or areas in the map. -## Map interaction +## Map interaction New ways to interact with the map itself. -* [Layer switching controls](#mapcontrols-layerswitchers) -* [Interactive pan/zoom](#mapcontrols-panzoom-interactive) -* [Bookmarked pan/zoom](#mapcontrols-panzoom-bookmarked) -* [Fullscreen](#mapcontrols-fullscreen) -* [Minimaps & synced maps](#mapcontrols-minimaps) -* [Measurement](#mapcontrols-measure) -* [Mouse coordinates](#mapcontrols-mousecoords) -* [Events](#mapcontrols-events) -* [User interface](#mapcontrols-userinterface) -* [Print/export](#mapcontrols-print) -* [Geolocation](#mapcontrols-geolocation) +* [Layer switching controls](#layer-switching-controls) +* [Interactive pan/zoom](#interactive-panzoom) +* [Bookmarked pan/zoom](#bookmarked-panzoom) +* [Fullscreen](#fullscreen-controls) +* [Minimaps & synced maps](#minimaps--synced-maps) +* [Measurement](#measurement) +* [Mouse coordinates](#mouse-coordinates) +* [Events](#events) +* [User interface](#user-interface) +* [Print/export](#printexport) +* [Geolocation](#geolocation) -### Layer switching controls +### Layer switching controls The following plugins enhance or extend `L.Control.Layers`. @@ -1375,7 +1375,7 @@ The following plugins enhance or extend `L.Control.Layers`. -### Interactive pan/zoom +### Interactive pan/zoom Change the way the user can interactively move around the map. @@ -1460,7 +1460,7 @@ Change the way the user can interactively move around the map. -### Bookmarked pan/zoom +### Bookmarked pan/zoom Change the way the user is moved around the map, by jumping to predefined/stored places. @@ -1576,7 +1576,7 @@ Change the way the user is moved around the map, by jumping to predefined/stored -### Fullscreen controls +### Fullscreen controls Allows display of the map in full-screen mode. @@ -1612,7 +1612,7 @@ Allows display of the map in full-screen mode. -### Minimaps & synced maps +### Minimaps & synced maps Display two maps at once. One of them might be a different size and zoom level, usable as a minimap to aid with navigation. @@ -1660,7 +1660,7 @@ Display two maps at once. One of them might be a different size and zoom level, -### Measurement +### Measurement Allow the user to measure distances or areas. @@ -1703,7 +1703,7 @@ Allow the user to measure distances or areas. -### Mouse coordinates +### Mouse coordinates Show the geographical coordinates under the mouse cursor in different ways. @@ -1756,7 +1756,7 @@ Show the geographical coordinates under the mouse cursor in different ways. -### Events +### Events These plugins extend Leaflet event handling. @@ -1822,7 +1822,7 @@ These plugins extend Leaflet event handling. -### User interface +### User interface Buttons, sliders, toolbars, sidebars, and panels. @@ -1931,7 +1931,7 @@ Buttons, sliders, toolbars, sidebars, and panels. -### Print/export +### Print/export Print or export your map. @@ -1963,7 +1963,7 @@ Print or export your map. -### Geolocation +### Geolocation Plugins that extend Leaflet's geolocation capabilities. @@ -2011,11 +2011,11 @@ Plugins that extend Leaflet's geolocation capabilities. -## Miscellaneous +## Miscellaneous -### Geoprocessing +### Geoprocessing The following plugins perform several sorts of geoprocessing (mathematical and topological operations on points, lines and polygons). @@ -2098,7 +2098,7 @@ The following plugins perform several sorts of geoprocessing (mathematical and t -### Routing +### Routing The following plugins use external services to calculate driving or walking routes. @@ -2136,7 +2136,7 @@ The following plugins use external services to calculate driving or walking rout -### Geocoding +### Geocoding External services that transform an address or the name of a place into latitude and longitude (or vice versa). @@ -2222,7 +2222,7 @@ External services that transform an address or the name of a place into latitude -## Plugin collections +### Plugin collections Sets of plugins that span several categories. @@ -2261,9 +2261,9 @@ Plugin developers: please keep future plugins in individual repositories. -## Integration +## Integration -### Frameworks & build systems +### Frameworks & build systems Ease your development integrating Leaflet into a development framework or automating some of the javascript/CSS work for complex applications. @@ -2333,7 +2333,7 @@ Ease your development integrating Leaflet into a development framework or automa -### 3rd party integration +### 3rd party integration The following plugins integrate Leaflet into third party services or websites. @@ -2383,7 +2383,7 @@ The following plugins integrate Leaflet into third party services or websites. -## Develop your own +## Develop your own Leaflet keeps it simple. If you can think of a feature that is not required by all of Leaflet users, and you can write the javascript code in a reusable way, you've got yourself a Leaflet plugin already. From 29e8507851dcc6ba8edb7dab712aa2d159b25036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 May 2015 16:32:57 +0200 Subject: [PATCH 1489/2207] Test webpage for #3233 --- debug/tests/dragging_cursors.html | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 debug/tests/dragging_cursors.html diff --git a/debug/tests/dragging_cursors.html b/debug/tests/dragging_cursors.html new file mode 100644 index 00000000000..e8a728f44c3 --- /dev/null +++ b/debug/tests/dragging_cursors.html @@ -0,0 +1,54 @@ + + + + + Leaflet debug page + + + + + + + + + + + This page tests if the cursors for dragging the map and the markers behave as expected. The left marker is draggable, the right one is not. + +
      + +
      Map dragging enabled:
      +
      + +
      + +
      Map dragging disabled:
      +
      + + + + From 64b9d05e4ceb3df3e60ea26da11f8969bfe8baa9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 8 May 2015 17:54:34 +0300 Subject: [PATCH 1490/2207] update deps --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index b6e4b128a69..a3eabd7c875 100644 --- a/package.json +++ b/package.json @@ -3,20 +3,20 @@ "version": "0.8.0-dev", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { - "copyfiles": "0.1.0", - "eslint": "^0.15.1", + "copyfiles": "0.2.1", + "eslint": "^0.20.0", "happen": "~0.1.3", - "jake": "~8.0.10", + "jake": "~8.0.12", "karma": "~0.12.31", - "karma-chrome-launcher": "^0.1.7", - "karma-coverage": "~0.2.7", + "karma-chrome-launcher": "^0.1.8", + "karma-coverage": "~0.3.1", "karma-firefox-launcher": "~0.1.4", "karma-mocha": "~0.1.10", "karma-phantomjs-launcher": "^0.1.4", "karma-safari-launcher": "~0.1.1", - "mocha": "~2.1.0", + "mocha": "~2.2.4", "tin": "^0.5.0", - "uglify-js": "~2.4.16" + "uglify-js": "~2.4.21" }, "main": "dist/leaflet-src.js", "style": "dist/leaflet.css", From b170695fe5ce68485a11693f1be02e533f38dfd2 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 8 May 2015 17:55:19 +0300 Subject: [PATCH 1491/2207] bump version to clear up confusion --- package.json | 2 +- src/Leaflet.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a3eabd7c875..6e6e79232f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet", - "version": "0.8.0-dev", + "version": "1.0.0-dev", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.2.1", diff --git a/src/Leaflet.js b/src/Leaflet.js index 14604f42621..8732082b41e 100644 --- a/src/Leaflet.js +++ b/src/Leaflet.js @@ -1,6 +1,6 @@ var L = { - version: '0.8-dev' + version: '1.0-dev' }; function expose() { From b3ff3a0e526d9644c0389e06d709075771d67905 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 9 May 2015 08:54:44 +0200 Subject: [PATCH 1492/2207] More targeted max-width: !important in CSS This for example allows to have images in popups not affected by the max-width. --- dist/leaflet.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 55d2fbe2fd5..c55a37283e2 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -43,8 +43,8 @@ } /* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ /* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ -.leaflet-container svg, -.leaflet-container img { +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-tile-pane img { max-width: none !important; } /* stupid Android 2 doesn't understand "max-width: none" properly */ From 426f33187471d34b44f250602ccd052a03b9cba7 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 9 May 2015 22:04:46 +0200 Subject: [PATCH 1493/2207] Fix polygon.addTo(map) failing when latlngs was empty. Since #3279 an empty polygon as a nested array [[]] as latlngs, so _latlngs.length returns true. --- spec/suites/layer/vector/PolygonSpec.js | 6 ++++++ spec/suites/layer/vector/PolylineSpec.js | 5 +++++ src/layer/vector/Polyline.js | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index f55a4aff7c2..a332f078bd7 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -67,6 +67,12 @@ describe('Polygon', function () { ]); expect(polygon.getLatLngs()).to.eql(polygon._latlngs); }); + + it("can be added to the map when empty", function () { + var polygon = new L.Polygon([]).addTo(map); + expect(map.hasLayer(polygon)).to.be(true); + }); + }); describe("#setLatLngs", function () { diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index 5eebb358fec..bc59a439302 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -42,6 +42,11 @@ describe('Polyline', function () { expect(polyline.getLatLngs()).to.eql(polyline._latlngs); }); + it("can be added to the map when empty", function () { + var polyline = new L.Polyline([]).addTo(map); + expect(map.hasLayer(polyline)).to.be(true); + }); + }); describe("#setLatLngs", function () { diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index cd0fed8e2cb..f7c73518d1b 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -132,7 +132,7 @@ L.Polyline = L.Path.extend({ var w = this._clickTolerance(), p = new L.Point(w, -w); - if (this._latlngs.length) { + if (this._bounds.isValid()) { this._pxBounds = new L.Bounds( this._map.latLngToLayerPoint(this._bounds.getSouthWest())._subtract(p), this._map.latLngToLayerPoint(this._bounds.getNorthEast())._add(p)); From 298a27fbe4a274f235b00cdecfb70393427938a3 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 9 May 2015 23:03:22 +0200 Subject: [PATCH 1494/2207] Add Polyline/Polygon.isEmpty method --- spec/suites/layer/vector/PolygonSpec.js | 24 ++++++++++++++++++++++++ spec/suites/layer/vector/PolylineSpec.js | 24 ++++++++++++++++++++++++ src/layer/vector/Polygon.js | 4 ++++ src/layer/vector/Polyline.js | 4 ++++ 4 files changed, 56 insertions(+) diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index a332f078bd7..016d0b16cdf 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -75,6 +75,30 @@ describe('Polygon', function () { }); + describe("#isEmpty", function () { + + it('should return true for a polygon with no latlngs', function () { + var layer = new L.Polygon([]); + expect(layer.isEmpty()).to.be(true); + }); + + it('should return false for simple polygon', function () { + var latLngs = [[1, 2], [3, 4], [5, 6]]; + var layer = new L.Polygon(latLngs); + expect(layer.isEmpty()).to.be(false); + }); + + it('should return false for a multi-polygon', function () { + var latLngs = [ + [[[10, 20], [30, 40], [50, 60]]], + [[[0, 10], [10, 10], [10, 0]], [[2, 3], [2, 4], [3, 4]]] + ]; + var layer = new L.Polygon(latLngs); + expect(layer.isEmpty()).to.be(false); + }); + + }); + describe("#setLatLngs", function () { it("doesn't overwrite the given latlng array", function () { var originalLatLngs = [ diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js index bc59a439302..6b050061faa 100644 --- a/spec/suites/layer/vector/PolylineSpec.js +++ b/spec/suites/layer/vector/PolylineSpec.js @@ -49,6 +49,30 @@ describe('Polyline', function () { }); + describe("#isEmpty", function () { + + it('should return true for a polyline with no latlngs', function () { + var polyline = new L.Polyline([]); + expect(polyline.isEmpty()).to.be(true); + }); + + it('should return false for simple polyline', function () { + var latLngs = [[1, 2], [3, 4]]; + var polyline = new L.Polyline(latLngs); + expect(polyline.isEmpty()).to.be(false); + }); + + it('should return false for multi-polyline', function () { + var latLngs = [ + [[1, 2], [3, 4]], + [[11, 12], [13, 14]] + ]; + var polyline = new L.Polyline(latLngs); + expect(polyline.isEmpty()).to.be(false); + }); + + }); + describe("#setLatLngs", function () { it("doesn't overwrite the given latlng array", function () { var originalLatLngs = [ diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js index 97d685ff963..f0fe5681244 100644 --- a/src/layer/vector/Polygon.js +++ b/src/layer/vector/Polygon.js @@ -8,6 +8,10 @@ L.Polygon = L.Polyline.extend({ fill: true }, + isEmpty: function () { + return !this._latlngs.length || !this._latlngs[0].length; + }, + getCenter: function () { var i, j, p1, p2, f, area, x, y, center, points = this._rings[0], diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index f7c73518d1b..2af132090cf 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -25,6 +25,10 @@ L.Polyline = L.Path.extend({ return this.redraw(); }, + isEmpty: function () { + return !this._latlngs.length; + }, + closestLayerPoint: function (p) { var minDistance = Infinity, minPoint = null, From 00b71b897fe25d5e123479d9458829c1034e467b Mon Sep 17 00:00:00 2001 From: David Albrecht Date: Sun, 10 May 2015 23:16:01 +0200 Subject: [PATCH 1495/2207] Leaflet.ResizableControl plugin --- plugins.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 27b9a942f7c..169164a5940 100644 --- a/plugins.md +++ b/plugins.md @@ -1810,7 +1810,7 @@ These plugins extend Leaflet event handling. Guillaume Lathoud - + @@ -1927,6 +1927,18 @@ Buttons, sliders, toolbars, sidebars, and panels. Osk + + + Leaflet ResizableControl + + + A Leaflet plugin to add a resizable and scrollable control to the map (Demo). + + + David Albrecht + + + @@ -2423,4 +2435,3 @@ Leaflet keeps it simple. If you can think of a feature that is not required by a There are no hard requirements on how to create your own plugin, but all developers are encouraged to read the recommendations in the [plugin guide](https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md). Once your plugin is ready, you can submit it to this list: just send a pull request with the addition to Leaflet repo's [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages) (`plugins.md` file). - From d84d5c788de843f4b90fd842f919e75a12172145 Mon Sep 17 00:00:00 2001 From: Paulo Vieira Date: Sat, 9 May 2015 13:25:35 +0100 Subject: [PATCH 1496/2207] Add QGIS2Leaf plugin to the Overlay data formats section --- plugins.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 27b9a942f7c..b84dcf33d52 100644 --- a/plugins.md +++ b/plugins.md @@ -475,6 +475,15 @@ Load your own data from various GIS formats. K. Arthur Endsley + + + QGIS2Leaf + + QGIS2Leaf exports the vector layers in QGIS as GeoJSON and creates a basic Leaflet webmap from it. Additionally your raster data is added as image overlays with an opacity slider. + + Geolicious + + @@ -2414,8 +2423,6 @@ The following plugins integrate Leaflet into third party services or websites. - - ## Develop your own Leaflet keeps it simple. If you can think of a feature that is not required by all of Leaflet users, and you can write the javascript code in a reusable way, you've got yourself a Leaflet plugin already. From 9274ee2b5f691c6f90a3615901a7fc355c884cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 11 May 2015 16:54:46 +0200 Subject: [PATCH 1497/2207] Graceful degradation of zoom-pan animations, fixes #3272. --- debug/map/zoompan.html | 34 ++++++++++++++++++++++------------ src/layer/tile/GridLayer.js | 6 +++++- src/map/Map.js | 1 + src/map/anim/Map.FlyTo.js | 2 +- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 9c0e0f11a35..75cb03b9071 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -13,6 +13,10 @@ width: 600px; height: 400px; } + button { + min-width: 3em; + text-align: center; + } @@ -22,21 +26,22 @@
      -
      - - - - - +
      +
      +
      +
      (flyTo 20 sec)
      +
      (fract. zoom)
      +
      (setView, fract. zoom)
      +
      +
      + + + + +
      + + + + From 52e669fcddb4532c0f2f580b3aa55281c3a6f653 Mon Sep 17 00:00:00 2001 From: Rowan Winsemius Date: Wed, 13 May 2015 21:38:08 +1000 Subject: [PATCH 1501/2207] Remove old plugin Plugin no longer maintained --- plugins.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/plugins.md b/plugins.md index 77850a53729..d1d37aff1c0 100644 --- a/plugins.md +++ b/plugins.md @@ -1980,15 +1980,6 @@ Print or export your map. Adam Ratcliffe - - - Leaflet-easyPrint - - A simple leaflet plugin which adds an icon to print the map. The resulting print page will strip ot the other content on the page and only print the leaflet map div. - - Rowan Winsemius - - Leaflet-image From ac00f05e0738855577e84c100ad3e418a293fdaf Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 13 May 2015 11:50:56 -0500 Subject: [PATCH 1502/2207] Fix wording in moveend section of API. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index d3d0d8b33fe..f61ba844aee 100644 --- a/reference.html +++ b/reference.html @@ -507,7 +507,7 @@

      Events

      moveend Event - Fired when the view of the map ends changed (e.g. user stopped dragging the map). + Fired when the view of the map stops changing (e.g. user stopped dragging the map). dragstart From 022b836fa9760545f5d37fec77147b8d24b63530 Mon Sep 17 00:00:00 2001 From: Edwin Shin Date: Thu, 14 May 2015 16:17:12 +0800 Subject: [PATCH 1503/2207] Update quick-start.md Updates Mapbox url to use: i) SSL, ii) v4 API, iii) custom keys for id and accessToken Adds documentation link for URL template --- examples/quick-start.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 37c0916cc3a..37c74650d6f 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -49,11 +49,13 @@ By default (as we didn't pass any options when creating the map instance), all m Note that `setView` call also returns the map object --- most Leaflet methods act like this when they don't return an explicit value, which allows convenient jQuery-like method chaining. -Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the URL template for the tile images (get yours at [Mapbox](http://mapbox.com)), the attribution text and the maximum zoom level of the layer: +Next we'll add a tile layer to add to our map, in this case it's a Mapbox Streets tile layer. Creating a tile layer usually involves setting the [URL template](http://leafletjs.com/reference.html#url-template) for the tile images (get yours at [Mapbox](http://mapbox.com)), the attribution text and the maximum zoom level of the layer: -
      L.tileLayer('http://{s}.tiles.mapbox.com/v3/MapID/{z}/{x}/{y}.png', {
      +
      L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
       	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
      -	maxZoom: 18
      +	maxZoom: 18,
      +	id: '[your.mapbox.project.id](https://www.mapbox.com/projects/)',
      +	accessToken: '[your.mapbox.public.access.token](https://www.mapbox.com/account/apps/)'
       }).addTo(map);
      Make sure all the code is called after the `div` and `leaflet.js` inclusion. That's it! You have a working Leaflet map now. From 7d62cfc41fa676abb2ac18c1c01fb3ddd6dec64a Mon Sep 17 00:00:00 2001 From: Edwin Shin Date: Thu, 14 May 2015 16:28:07 +0800 Subject: [PATCH 1504/2207] Update quick-start.md Corrects the links in the code block (was using markdown syntax within the code block) --- examples/quick-start.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 37c74650d6f..145092ac7a1 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -54,8 +54,8 @@ Next we'll add a tile layer to add to our map, in this case it's a Mapbox Street
      L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
       	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
       	maxZoom: 18,
      -	id: '[your.mapbox.project.id](https://www.mapbox.com/projects/)',
      -	accessToken: '[your.mapbox.public.access.token](https://www.mapbox.com/account/apps/)'
      +	id: 'your.mapbox.project.id',
      +	accessToken: 'your.mapbox.public.access.token'
       }).addTo(map);
      Make sure all the code is called after the `div` and `leaflet.js` inclusion. That's it! You have a working Leaflet map now. From 28935717539b1114246b9ce25a6b57f17086fb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 18 May 2015 10:51:15 +0200 Subject: [PATCH 1505/2207] Add plugin Leaflet.ControlledBounds --- plugins.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index d1d37aff1c0..de1fc73a2b5 100644 --- a/plugins.md +++ b/plugins.md @@ -1813,11 +1813,21 @@ These plugins extend Leaflet event handling. Leaflet-active-area This plugin allows you to use a smaller portion of the map as an active area. - All positionning methods (setView, fitBounds, setZoom) will be applied on this portion instead of the all map. + All positioning methods (setView, fitBounds, setZoom) will be applied on this portion instead of the all map. Mappy + + + Leaflet.ControlledBounds + + Inspired by Leaflet-active-area, automatically detects the largest area of the map not covered by any map controls and applies setView, fitBounds, setZoom, getBounds to that area. + + Iván Sánchez Ortega, + MazeMap + + singleclick From 8c59a13428c5768f3a61260f663baffb66c66f27 Mon Sep 17 00:00:00 2001 From: Alexandre David Date: Mon, 18 May 2015 12:56:11 +0200 Subject: [PATCH 1506/2207] Add plugin to manage oriented markers dynamically. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index de1fc73a2b5..0958bfeb4d3 100644 --- a/plugins.md +++ b/plugins.md @@ -777,6 +777,15 @@ These plugins provide new markers or news ways of converting abstract data into Gerald Pape + + + Leaflet.orientedMarker + + Allows to manage orientation of markers dynamically. + + Gismartwaredev + + From 08b08cd8e17ad60856aad371d9c0324de631647b Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 18 May 2015 10:27:58 -0500 Subject: [PATCH 1507/2207] Fix typos in Class options section --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index f61ba844aee..415d65ed1ba 100644 --- a/reference.html +++ b/reference.html @@ -5086,7 +5086,7 @@

      Options

      a.options.myOption2; // 'bar' a.options.myOption3; // 5
      -

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defauls defines in the class:

      +

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defaults defined in the class:

      var MyClass = L.Class.extend({
       	options: {
      
      From d1c3550017c205fe429a7f5599fcd096d3edb760 Mon Sep 17 00:00:00 2001
      From: Vladimir Agafonkin 
      Date: Wed, 20 May 2015 19:45:56 +0300
      Subject: [PATCH 1508/2207] update deps
      
      ---
       package.json | 12 ++++++------
       1 file changed, 6 insertions(+), 6 deletions(-)
      
      diff --git a/package.json b/package.json
      index 6e6e79232f9..8e83be5287d 100644
      --- a/package.json
      +++ b/package.json
      @@ -4,19 +4,19 @@
         "description": "JavaScript library for mobile-friendly interactive maps",
         "devDependencies": {
           "copyfiles": "0.2.1",
      -    "eslint": "^0.20.0",
      +    "eslint": "^0.21.2",
           "happen": "~0.1.3",
           "jake": "~8.0.12",
      -    "karma": "~0.12.31",
      -    "karma-chrome-launcher": "^0.1.8",
      +    "karma": "~0.12.32",
      +    "karma-chrome-launcher": "^0.1.12",
           "karma-coverage": "~0.3.1",
      -    "karma-firefox-launcher": "~0.1.4",
      +    "karma-firefox-launcher": "~0.1.6",
           "karma-mocha": "~0.1.10",
           "karma-phantomjs-launcher": "^0.1.4",
           "karma-safari-launcher": "~0.1.1",
      -    "mocha": "~2.2.4",
      +    "mocha": "~2.2.5",
           "tin": "^0.5.0",
      -    "uglify-js": "~2.4.21"
      +    "uglify-js": "~2.4.23"
         },
         "main": "dist/leaflet-src.js",
         "style": "dist/leaflet.css",
      
      From c4b6e79fa4ab8f7b20e71ed89a4e7f2917f38cca Mon Sep 17 00:00:00 2001
      From: Rik Vanmechelen 
      Date: Tue, 5 May 2015 14:07:23 -0400
      Subject: [PATCH 1509/2207] fix inertia when only moving on one axis, close
       #3432
      
      ---
       src/map/handler/Map.Drag.js | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js
      index 3eee2ea6b24..f61f231d760 100644
      --- a/src/map/handler/Map.Drag.js
      +++ b/src/map/handler/Map.Drag.js
      @@ -132,7 +132,7 @@ L.Map.Drag = L.Handler.extend({
       			    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
       			    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
       
      -			if (!offset.x || !offset.y) {
      +			if (!offset.x && !offset.y) {
       				map.fire('moveend');
       
       			} else {
      
      From 2ea576e86a7508780a217732b0cbf80e458bb769 Mon Sep 17 00:00:00 2001
      From: Atle Frenvik Sveen 
      Date: Thu, 21 May 2015 10:24:52 +0200
      Subject: [PATCH 1510/2207] add L.TileLayer.Kartverket
      
      ---
       plugins.md | 9 +++++++++
       1 file changed, 9 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index 0958bfeb4d3..bc47912098c 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -144,6 +144,15 @@ Ready-to-go basemaps, with little or no configuration at all.
       			Alexander Parshin
       		
       	
      +        
      +		
      +			L.TileLayer.Kartverket
      +		
      +                        Provides easy setup of the tile layers from Kartverket (The Norwegian Mapping Authority)
      +		
      +			Kultur og naturreise / Atle Frenvik Sveen
      +		
      +	
       
       
       
      
      From 8ffbb707c640146e7dfa9f5ce68e31c1dd8005bb Mon Sep 17 00:00:00 2001
      From: Vladimir Agafonkin 
      Date: Thu, 21 May 2015 19:57:12 +0300
      Subject: [PATCH 1511/2207] add layer getElement methods
      
      ---
       src/layer/ImageOverlay.js  | 4 ++++
       src/layer/Popup.js         | 4 ++++
       src/layer/marker/Marker.js | 4 ++++
       src/layer/vector/Path.js   | 4 ++++
       4 files changed, 16 insertions(+)
      
      diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js
      index fdd80496a11..3dfc78e4a1f 100644
      --- a/src/layer/ImageOverlay.js
      +++ b/src/layer/ImageOverlay.js
      @@ -101,6 +101,10 @@ L.ImageOverlay = L.Layer.extend({
       		return this._bounds;
       	},
       
      +	getElement: function () {
      +		return this._image;
      +	},
      +
       	_initImage: function () {
       		var img = this._image = L.DomUtil.create('img',
       				'leaflet-image-layer ' + (this._zoomAnimated ? 'leaflet-zoom-animated' : ''));
      diff --git a/src/layer/Popup.js b/src/layer/Popup.js
      index 583996a4bdd..4854fa90a6a 100644
      --- a/src/layer/Popup.js
      +++ b/src/layer/Popup.js
      @@ -103,6 +103,10 @@ L.Popup = L.Layer.extend({
       		return this;
       	},
       
      +	getElement: function () {
      +		return this._container;
      +	},
      +
       	update: function () {
       		if (!this._map) { return; }
       
      diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js
      index 575a318cd3c..cda4568c6a1 100644
      --- a/src/layer/marker/Marker.js
      +++ b/src/layer/marker/Marker.js
      @@ -82,6 +82,10 @@ L.Marker = L.Layer.extend({
       		return this;
       	},
       
      +	getElement: function () {
      +		return this._icon;
      +	},
      +
       	update: function () {
       
       		if (this._icon) {
      diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js
      index c305e51684b..96d7d69759e 100644
      --- a/src/layer/vector/Path.js
      +++ b/src/layer/vector/Path.js
      @@ -74,6 +74,10 @@ L.Path = L.Layer.extend({
       		return this;
       	},
       
      +	getElement: function () {
      +		return this._path;
      +	},
      +
       	_clickTolerance: function () {
       		// used when doing hit detection for Canvas layers
       		return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0);
      
      From e5a95567a3f05c0a0913ad46a560b60f148073fc Mon Sep 17 00:00:00 2001
      From: Johannes Rudolph 
      Date: Fri, 22 May 2015 09:18:16 +0200
      Subject: [PATCH 1512/2207] Add Leaflet.mouseCoordinates
      
      Add Leaflet.mouseCoordinates Plugin
      ---
       plugins.md | 17 +++++++++++++++++
       1 file changed, 17 insertions(+)
      
      diff --git a/plugins.md b/plugins.md
      index bc47912098c..74f2fa859f8 100644
      --- a/plugins.md
      +++ b/plugins.md
      @@ -1782,6 +1782,23 @@ Show the geographical coordinates under the mouse cursor in different ways.
       			Mahmood Dehghan
       		
       	
      +	
      +		
      +			Leaflet.mouseCoordinates
      +		
      +		
      +			Displays the Mouse Coordinate in a Box.
      +			Multiple Formats Are Possible
      +			
        +
      • GPS
      • +
      • UTM
      • +
      • UTMREF / MGRS
      • +
          + + + Johannes Rudolph + + From db8a790ae3c8b3defaf63ae53cf3e97243fd6a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 22 May 2015 10:19:39 +0200 Subject: [PATCH 1513/2207] Persist marker dragging when removing/readding it. --- src/layer/marker/Marker.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index cda4568c6a1..5b3adfe036f 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -33,6 +33,7 @@ L.Marker = L.Layer.extend({ onRemove: function () { if (this.dragging && this.dragging.enabled()) { + this.options.draggable = true; this.dragging.removeHooks(); } From 61141ee64993cb1d081bb3bc4229713f99a2a50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Sat, 23 May 2015 13:41:48 +0200 Subject: [PATCH 1514/2207] Add Leaflet.MandelbrotGL --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 74f2fa859f8..290d3e33242 100644 --- a/plugins.md +++ b/plugins.md @@ -286,6 +286,15 @@ Sometimes you don't want to load a map, just big custom images. **Really** big o Jack Reed + + + Leaflet.MandelbrotGL + + Renders the Mandelbrot set using WebGL (demo). + + Iván Sánchez + + From 9313733d3ff84766b81504395a5982927dd8bc0a Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Mon, 25 May 2015 17:45:53 +0600 Subject: [PATCH 1515/2207] make panInsideBounds accept array --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index a806612224f..ef93d60830b 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -175,7 +175,7 @@ L.Map = L.Evented.extend({ panInsideBounds: function (bounds, options) { var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, bounds); + newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); if (center.equals(newCenter)) { return this; } From 45034155bdf8d958554b43ed8dbd7020df9ca6ab Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 25 May 2015 19:45:09 +0300 Subject: [PATCH 1516/2207] huge changelog update, #2959 not yet finished, another batch to come --- CHANGELOG.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cd50f422bd..57ad20fa6cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Leaflet Changelog (all changes without author notice are by [@mourner](https://github.com/mourner)) -## 0.8-dev (master) +## 1.0-dev (master) An in-progress version being developed on the `master` branch. Includes `stable` branch fixes. @@ -11,7 +11,7 @@ This version contains a lot of beneficial but potentially breaking changes (espe ### Vectors refactoring -Leaflet vector layers rendering got a major rewrite, making it possible to switch between rendering backends (Canvas, SVG) dynamically (and even use both for different layers at the same time), have more than one physical pane for vector layers, significantly improving Canvas performance and adding retina support, getting rid of ugly hacks and generally making the code much cleaner. PR [#2290](https://github.com/Leaflet/Leaflet/pull/2290). +Leaflet vector layers rendering got a major rewrite, making it possible to switch between rendering backends (Canvas, SVG) dynamically (and even use both for different layers at the same time), have more than one physical pane for vector layers, significantly improving Canvas performance and adding retina support, getting rid of ugly hacks and generally making the code much cleaner. Main PR [#2290](https://github.com/Leaflet/Leaflet/pull/2290). * Added `Renderer` layer (inherited by SVG/Canvas implementations) that handles renderer bounds and zoom animation. * Added `SVG` & `Canvas` classes that now contain all renderer-specific code for vector layers and can be added as layers to the map. @@ -27,10 +27,14 @@ Leaflet vector layers rendering got a major rewrite, making it possible to switc * Changed `Circle` to inherit from `CircleMarker` and not the other way. * Fixed `GeoJSON` `resetStyle` to work properly in case `style` option wasn't set. * Fixed a bug where map fired `moveend` when updating Canvas layers. +* Removed `Polyline` and `Polygon` `spliceLatLngs` method (just use `setLatLngs` instead). +* Changed `Polygon` `getLatLngs` to always return an array of rings (nested array) by [@yohanboniface](https://github.com/yohanboniface)). [#2618](https://github.com/Leaflet/Leaflet/issues/2618) [#3386](https://github.com/Leaflet/Leaflet/pull/3386) [Leaflet/Leaflet#3279](https://github.com/Leaflet/Leaflet/pull/3279) [#2648](https://github.com/Leaflet/Leaflet/issues/2648) +* Added the ability to specify a custom pane for vector layers (making it possible to easily do stacks like vectors-tiles-vectors with proper z-index order) (by [@Jakobud](https://github.com/Jakobud)). [#3266](https://github.com/Leaflet/Leaflet/pull/3266) [#2786](https://github.com/Leaflet/Leaflet/pull/2786) +* Added vector layers `fillRule` option (by [@bullgare](https://github.com/bullgare)). [#2834](https://github.com/Leaflet/Leaflet/pull/2834) ### Layers refactoring -All Leaflet layers (including markers, popups, tile and vector layers) have been refactored to have a common parent, `Layer` class, that shares the basic logic of adding and removing. The leads to the following changes (documented in PR [#2266](https://github.com/Leaflet/Leaflet/pull/2266)): +All Leaflet layers (including markers, popups, tile and vector layers) have been refactored to have a common parent, `Layer` class, that shares the basic logic of adding and removing. The leads to the following changes (main PR [#2266](https://github.com/Leaflet/Leaflet/pull/2266)): * Added `Layer` class which all layers added to a map should inherit from. * Added `add` and `remove` events to all layers. @@ -47,6 +51,10 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Removed `Map` `tilelayersload` event. * Removed `Popup` `open` and `close` events in favor of `add` and `remove` for consistency. * Moved all layer-related logic in `Map.js` to `Layer.js`. +* Improved `FeatureGroup` `bindPopup` to accept a function for generating popup content, significantly improving memory footpring when adding popups to a huge number of layers (by [@patrickarlt](https://github.com/patrickarlt)). [#3109](https://github.com/Leaflet/Leaflet/pull/3109) [#3059](https://github.com/Leaflet/Leaflet/pull/3059) +* Added `ImageOverlay` interactivity (mouse events, etc.) (by [@snkashis](https://github.com/snkashis)). [#3009](https://github.com/Leaflet/Leaflet/pull/3009) [#1727](https://github.com/Leaflet/Leaflet/issues/1727) + +In addition, layer events implementation was rewritten to use **event delegation**, significantly improving add/remove performance and memory footprint. [#3032](https://github.com/Leaflet/Leaflet/pull/3032) [#46](https://github.com/Leaflet/Leaflet/issues/46) ### TileLayer & Projections refactoring @@ -79,6 +87,7 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed `Map` `worldCopyJump` option to work for other projections. * Fixed `Circle` to work with flat projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) [#1465](https://github.com/Leaflet/Leaflet/issues/1465) * Fixed scale control precision in non-EPSG:3857 projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) +* Fixed `ImageOverlay` not working properly in some non-standard projections. [#3011](https://github.com/Leaflet/Leaflet/issues/3011) ### Animations refactoring @@ -96,8 +105,11 @@ These changes were targeted at removing any hardcoded projection-specific logic ### Misc usability improvements +* Improved inertial scrolling to have a nicer, more natural feel (by [@RickMohr](https://github.com/RickMohr)). [Leaflet/Leaflet#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3062](https://github.com/Leaflet/Leaflet/issues/3062) [#2987](https://github.com/Leaflet/Leaflet/issues/2987) * Added popup fade out animation. * Improved keyboard support to ignore keystrokes with modifier keys (Ctrl, Alt, Meta) to not interfere with OS shortcuts. +* Made popup to close when pressing Escape (by [@snkashis](https://github.com/snkashis)). [#951](https://github.com/Leaflet/Leaflet/issues/951) [#3000](https://github.com/Leaflet/Leaflet/pull/3000) +* Improved keyboard zoom to zoom by 3 levels if shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)). [#3024](https://github.com/Leaflet/Leaflet/pull/3024) ### Other breaking API changes @@ -123,6 +135,13 @@ These changes were targeted at removing any hardcoded projection-specific logic * Added `DomUtil` `toFront` and `toBack` methods. * Added `Evented` `listens` as a shortcut to `hasEventListeners`. * Added optional support for center-oriented scroll for `L.map` option `touchZoom` (by [@mtmail](https://github.com/mtmail)). [#2527](https://github.com/Leaflet/Leaflet/pull/2527) +* Added `getElement` method to all layers that returns an associated DOM element. +* Added `LatLng` `clone` method (by [@yohanboniface](https://github.com/yohanboniface)). [#3390](https://github.com/Leaflet/Leaflet/pull/3390) +* Added `Map` `setMinZoom` and `setMaxZoom` methods (by [@nathancahill](https://github.com/nathancahill)). [#3383](https://github.com/Leaflet/Leaflet/pull/3383) [#3380](https://github.com/Leaflet/Leaflet/issues/3380) +* Added `originalEvent` to `Map` and `Marker` `drag` and `move` event data (by [@yohanboniface](https://github.com/yohanboniface)). [#3264](https://github.com/Leaflet/Leaflet/pull/3264) +* Added `Popup` `autoClose` option (by [@jfirebaugh](https://github.com/jfirebaugh)). [#3018](https://github.com/Leaflet/Leaflet/pull/3018) [#2716](https://github.com/Leaflet/Leaflet/issues/2716) [#1853](https://github.com/Leaflet/Leaflet/issues/1853) +* Added `Control.Zoom` `enable` and `disable` methods. [#3172](https://github.com/Leaflet/Leaflet/issues/3172) +* Added an argument to `L.PolyUtil.clipPolygon` that controls rounding (by [@aparshin](https://github.com/aparshin)). [#2926](https://github.com/Leaflet/Leaflet/pull/2926) [#2917](https://github.com/Leaflet/Leaflet/issues/2917) ### Bugfixes @@ -133,6 +152,44 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed `ImageOverlay` mercator distortion on lower zoom levels. * Fixed a bug where layers didn't fire `popupopen` and `popupclose` events when manually creating a popup object and passing it to `bindPopup`. [#2354](https://github.com/Leaflet/Leaflet/issues/2354) * Fixed box-zoom overlay appearing under markers. [#1813](https://github.com/Leaflet/Leaflet/issues/1813) +* Fixed `Map` `panInsideBounds` to accept array-form bounds (by [@RLRR](https://github.com/RLRR)). [#3489](https://github.com/Leaflet/Leaflet/pull/3489) +* Fixed marker draggable state to persist when removing and adding back to the map (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3488](https://github.com/Leaflet/Leaflet/pull/3488) +* Fixed inertia not working when parallel to axis (by [@rikvanmechelen](https://github.com/rikvanmechelen)). [#3432](https://github.com/Leaflet/Leaflet/issues/3432) +* Fixed images and SVG inside popups having max-width property overriden (by [@yohanboniface](https://github.com/yohanboniface)). [#3452](https://github.com/Leaflet/Leaflet/pull/3452) +* Fixed cursors when dragging is disabled (by [@juliensoret](https://github.com/juliensoret)). [#3219](https://github.com/Leaflet/Leaflet/issues/3219) [#3233](https://github.com/Leaflet/Leaflet/pull/3233) +* Fixed `LatLng` `wrap` to not drop altitude (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3420](https://github.com/Leaflet/Leaflet/issues/3420) +* Fixed Firefox for Android not being detected as mobile (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3419](https://github.com/Leaflet/Leaflet/pull/3419) +* Fixed an infinite loop when calling `setMaxBounds` several times in a row (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3410](https://github.com/Leaflet/Leaflet/pull/3410) [#3320](https://github.com/Leaflet/Leaflet/issues/3320) +* Fixed a WTF `Map` `locate` bug that could cause some unexpected effects (by [@sindre](https://github.com/sindre)). [Leaflet/Leaflet#3404](https://github.com/Leaflet/Leaflet/issues/3404) +* Fixed broken zoom in Project Spartan browsers (by [@mitchless](https://github.com/mitchless)). [#3379](https://github.com/Leaflet/Leaflet/pull/3379) +* Fixed broken `Polygon` `getCenter` when all points in the same pixel (by [@yohanboniface](https://github.com/yohanboniface)). [#3372](https://github.com/Leaflet/Leaflet/pull/3372) +* Fixed broken `Polyline` `getCenter` when the line is very small (by [@yohanboniface](https://github.com/yohanboniface)). [#3371](https://github.com/Leaflet/Leaflet/pull/3371) +* Fixed keyboard zoom out not working on `azerty` keyboards. [#3362](https://github.com/Leaflet/Leaflet/issues/3362) +* Fixed a bug where tabbing to an offscreen marker broke control positioning (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3340](https://github.com/Leaflet/Leaflet/pull/3340) [#3333](https://github.com/Leaflet/Leaflet/issues/3333) +* Fixed `Map` `panBy` not always returning `this` (by [@Trufi](https://github.com/Trufi)). [#3303](https://github.com/Leaflet/Leaflet/pull/3303) +* Fixed a bug where pushing a zoom control with a keyboard would switch focus to the map (by [@Jakobud](https://github.com/Jakobud)). [#3275](https://github.com/Leaflet/Leaflet/pull/3275) [#3159](https://github.com/Leaflet/Leaflet/issues/3159) +* Fixed more race conditions leading to map freeze. [#3270](https://github.com/Leaflet/Leaflet/pull/3270) [#3268](https://github.com/Leaflet/Leaflet/issues/3268) [#2693](https://github.com/Leaflet/Leaflet/issues/2693) [#2478](https://github.com/Leaflet/Leaflet/issues/2478) +* Fixed iOS race condition when doing a very small pan. [#2519](https://github.com/Leaflet/Leaflet/issues/2519) +* Fixed `Polygon` `toGeoJSON` exporting a `MultiPolygon` in some cases (by [@yohanboniface](https://github.com/yohanboniface)). [#2977](https://github.com/Leaflet/Leaflet/pull/2977) +* Fixed `TileLayer.WMS` passing all options as WMS params. [#2972](https://github.com/Leaflet/Leaflet/issues/2972) +* Fixed a race condition that made `map.fitBounds(map.getBounds())` zoom out sometimes. [#2957](https://github.com/Leaflet/Leaflet/issues/2957) +* Fixed a bug where a draggable marker stopped being draggable after `setIcon` (by [@jeffsmale90](https://github.com/jeffsmale90)). [#2578](https://github.com/Leaflet/Leaflet/issues/2578) +* Fixed some IE11 touch performance and stability issues (by [@danzel](https://github.com/danzel)). [#3007](https://github.com/Leaflet/Leaflet/pull/3007) [#2820](https://github.com/Leaflet/Leaflet/issues/2820) +* Fixed a race condition with `TileLayer` when `maxNativeZoom = 0`. [#3004](https://github.com/Leaflet/Leaflet/issues/3004) +* Fixed `FeatureGroup` `setStyle` not affecting `ImageOverlay` `opacity` (by [@opie](https://github.com/opie)). [#3008](https://github.com/Leaflet/Leaflet/pull/3008) [#2246](https://github.com/Leaflet/Leaflet/issues/2246) +* Fixed class init hooks not being called for parent classes (by [@jfirebaugh](https://github.com/jfirebaugh)). [#2545](https://github.com/Leaflet/Leaflet/issues/2545) +* Fixed a bug when adding a control that's already added or removing a control that's not present (by [@jfirebaugh](https://github.com/jfirebaugh)). [#3020](https://github.com/Leaflet/Leaflet/issues/3020) [#2877](https://github.com/Leaflet/Leaflet/issues/2877) +* Fixed buggy inertia on low zoom levels when `Map` `worldCopyJump` option is enabled (by [@flemenach](https://github.com/flemenach)). [#3038](https://github.com/Leaflet/Leaflet/pull/3038) [#2624](https://github.com/Leaflet/Leaflet/issues/2624) +* Fixed a bug where `getMaxZoom` sometimes returned wrong result inside a `Control.Layers` `baselayerchange` event (by [@CloudNiner](https://github.com/CloudNiner)). [#3048](https://github.com/Leaflet/Leaflet/pull/3048) [#2318](https://github.com/Leaflet/Leaflet/issues/2318) +* Fixed a bug where during zooming one map, dragging was disabled on all other maps on the page (by [@kdeloach](https://github.com/kdeloach)). [#3050](https://github.com/Leaflet/Leaflet/pull/3050) [#2539](https://github.com/Leaflet/Leaflet/issues/2539) +* Fixed a `Map` `getSize` race condition where it could return a wrong result (by [@kshepard](https://github.com/kshepard)). [#3052](https://github.com/Leaflet/Leaflet/pull/3052) [#3031](https://github.com/Leaflet/Leaflet/issues/3031) +* Fixed `L.latLng` factory to accept `altitude` as a third argument too (by [@lonelyelk](https://github.com/lonelyelk)). [#3070](https://github.com/Leaflet/Leaflet/pull/3070). +* Fixed `L.latLng` factory to not throw error on empty array input (by [@lonelyelk](https://github.com/lonelyelk)). [#3080](https://github.com/Leaflet/Leaflet/pull/3080) [#3079](https://github.com/Leaflet/Leaflet/issues/3079) +* Fixed popups to have a default color (by [@snkashis](https://github.com/snkashis)). [#3115](https://github.com/Leaflet/Leaflet/pull/3115) [#3112](https://github.com/Leaflet/Leaflet/issues/3112) [#333](https://github.com/Leaflet/Leaflet/issues/333) +* Fixed `Map` `locate` not to mutate the given options object (by [@tmcw](https://github.com/tmcw)). [#3173](https://github.com/Leaflet/Leaflet/pull/3173) +* Fixed Canvas polylines not to render if stroke is set to 0 (by [@optical](https://github.com/optical)). [#3203](https://github.com/Leaflet/Leaflet/pull/3203) +* Prevented a Joomla bug that could lead to vector layers disappearing (by [@SniperSister](https://github.com/SniperSister)). [#2886](https://github.com/Leaflet/Leaflet/pull/2886) [#2881](https://github.com/Leaflet/Leaflet/issues/2881) [Leaflet/Leaflet#2881](https://github.com/Leaflet/Leaflet/issues/2881) +* Fixed IE Metro touch events passing through objects on top of a Leaflet map (by [@nikgavalas](https://github.com/nikgavalas)). [#2954](https://github.com/Leaflet/Leaflet/pull/2954) ### Misc improvements @@ -140,7 +197,8 @@ These changes were targeted at removing any hardcoded projection-specific logic * Added version name and commit number to Leaflet builds. [#2276](https://github.com/Leaflet/Leaflet/issues/2276) * Added Leaflet logo in vector format as `src/images/logo.svg`. * Added reference to Leaflet CSS in `package.json` (by [@bclinkinbeard](https://github.com/bclinkinbeard)). [#2432](https://github.com/Leaflet/Leaflet/pull/2432) - +* Switched from JSHint to ESLint for checking code style and made the checks more strict. [#3176](https://github.com/Leaflet/Leaflet/pull/3176) +* Added a plugin guide section on module loaders and publishing plugins (by [@patrickarlt](https://github.com/patrickarlt)). [#2955](https://github.com/Leaflet/Leaflet/pull/2955) [Leaflet/Leaflet#2955](https://github.com/Leaflet/Leaflet/pull/2955) ## 0.7.3 (May 23, 2014) From 37c345601ee5173dfa83a42dbf4526350c946ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 26 May 2015 13:18:27 +0200 Subject: [PATCH 1517/2207] Typo in plugins.md was breaking sections --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 290d3e33242..e0571c7ff37 100644 --- a/plugins.md +++ b/plugins.md @@ -1802,7 +1802,7 @@ Show the geographical coordinates under the mouse cursor in different ways.
        • GPS
        • UTM
        • UTMREF / MGRS
        • -
            +
          Johannes Rudolph From 04685d97054ba1e546bf45db134e41d763b15f1b Mon Sep 17 00:00:00 2001 From: Paulo Vieira Date: Wed, 27 May 2015 00:03:57 +0100 Subject: [PATCH 1518/2207] add 3 plugins related to vector tiles + 1 plugin for visualizing trees --- plugins.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/plugins.md b/plugins.md index e0571c7ff37..734b1335d56 100644 --- a/plugins.md +++ b/plugins.md @@ -18,6 +18,7 @@ While Leaflet is meant to be as lightweight as possible, and focuses on a core s
        • Non-map base layers
        • Tile/image display
        • Tile load
        • +
        • Vector tiles

        Overlay data

        @@ -92,6 +93,7 @@ The following plugins allow loading different maps and provide functionality to * [Non-map base layers](#non-map-base-layers) * [Tile/image display](#tileimage-display) * [Tile load](#tile-load) +* [Vector tiles](#vector-tiles) ### Basemap providers @@ -407,6 +409,42 @@ The following plugins change the way that tile layers are loaded into the map. + +### Vector tiles + +Plugins to display vector tiles. + + + + + + + + + + + +
        PluginDescriptionMaintainer
        + Leaflet.MapboxVectorTile + + A Leaflet Plugin that renders Mapbox Vector Tiles on canvas. See demo + + SpatialDev +
        + Hoverboard + + Render vector tiles on canvas with leaflet (geojson, topojson, and protobuf). See demo. + + Tristan Davies +
        + geojson-vt + + Efficient library for slicing GeoJSON data into vector tiles on the fly. + + Mapbox +
        + + ## Overlay data The following plugins provide new ways of loading overlay data (GIS vector data): points, lines and polygons. @@ -2178,6 +2216,15 @@ The following plugins perform several sorts of geoprocessing (mathematical and t Mathieu Leplatre + + + leaflet-spatial-prefix-tree + + Leaflet plugin for visualizing spatial prefix trees, quadtree and geohash. See demo + + Mapzen + + From cb1bb853eb370a22dd94e872eb82a1d9e1d99629 Mon Sep 17 00:00:00 2001 From: Tyler Garner Date: Tue, 26 May 2015 20:38:06 -0400 Subject: [PATCH 1519/2207] Document L.Path.options.fillRule. Fixes #3478. --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index 415d65ed1ba..db9a670ce21 100644 --- a/reference.html +++ b/reference.html @@ -2365,6 +2365,12 @@

        Options

        0.2 Fill opacity. + + fillRule + String + 'evenodd' + A string that defines how the inside of a shape is determined. + dashArray String From 5e32775d4056282cc0282c535ab489e440276f87 Mon Sep 17 00:00:00 2001 From: andy-kay Date: Wed, 27 May 2015 22:16:42 +0200 Subject: [PATCH 1520/2207] add L.GridCluster --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 734b1335d56..be0dbde22eb 100644 --- a/plugins.md +++ b/plugins.md @@ -952,6 +952,15 @@ When you are displaying a lot of data, these plugins will make your map look cle Oliver Roick + + + Leaflet.GridCluster + + Create grid-based clusters in realtime. + + Andreas Kiefer + + ### Heatmaps From fd1b295b9509a0dd97f5c9a715995e2c63f383c0 Mon Sep 17 00:00:00 2001 From: vingiarrusso Date: Wed, 27 May 2015 16:34:06 -0700 Subject: [PATCH 1521/2207] add isPopupOpen method to layer --- src/layer/Layer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 579d30b5c28..558430632e1 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -35,6 +35,10 @@ L.Layer = L.Evented.extend({ return this; }, + isPopupOpen: function() { + return !!(this._map._popup && this._map._popup.isOpen); + }, + _layerAdd: function (e) { var map = e.target; From 376820ff636604144e6a008e2ff6643be2ad0cda Mon Sep 17 00:00:00 2001 From: vingiarrusso Date: Wed, 27 May 2015 16:59:54 -0700 Subject: [PATCH 1522/2207] use existing method on popup --- src/layer/Layer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 558430632e1..b34dcc9666a 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -36,7 +36,7 @@ L.Layer = L.Evented.extend({ }, isPopupOpen: function() { - return !!(this._map._popup && this._map._popup.isOpen); + return this._popup.isOpen(); }, _layerAdd: function (e) { From 8ef3e6e6c196a2a93d7b1123e58ed24f8a022764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 28 May 2015 11:08:28 +0200 Subject: [PATCH 1523/2207] Emergency switching CDN URLs --- _layouts/default.html | 4 ++-- download.md | 4 ++-- examples/quick-start.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 4fc83cfebb9..42c939bf4d0 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -35,8 +35,8 @@ - - + + {% if page.css %}{% endif %} diff --git a/download.md b/download.md index b974e8474ca..95589dbac0e 100644 --- a/download.md +++ b/download.md @@ -34,8 +34,8 @@ so please read the changelog carefully when upgrading to it. The latest stable Leaflet release is hosted on a CDN — to start using it straight away, place this in the `head` of your HTML code: - - + + ### Leaflet Source Code diff --git a/examples/quick-start.md b/examples/quick-start.md index 145092ac7a1..0bef54de2ee 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,11 +19,11 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS file in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From 9eb5de9bbf6208f2324d6c52aeb85bc6d389e164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 28 May 2015 15:14:31 +0200 Subject: [PATCH 1524/2207] Add leaflet-fractal --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index be0dbde22eb..19564dff0e4 100644 --- a/plugins.md +++ b/plugins.md @@ -297,6 +297,15 @@ Sometimes you don't want to load a map, just big custom images. **Really** big o Iván Sánchez + + + leaflet-fractal + + Renders some fractals (Mandelbrot set, Julia set and some others) using 2D canvas (demo). + + Alexander Parshin + + From 6a6d833a2f407bad37587f5e30bf56fb539e7f8d Mon Sep 17 00:00:00 2001 From: Peter deHaan Date: Thu, 28 May 2015 13:15:31 -0700 Subject: [PATCH 1525/2207] Update license attribute specifying the type and URL is deprecated: https://docs.npmjs.com/files/package.json#license http://npm1k.org/ --- package.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/package.json b/package.json index 8e83be5287d..e0757ef4f87 100644 --- a/package.json +++ b/package.json @@ -33,10 +33,5 @@ "gis", "map" ], - "licenses": [ - { - "type": "BSD-2-Clause", - "url": "https://github.com/Leaflet/Leaflet/blob/master/LICENSE" - } - ] + "license": "BSD-2-Clause" } From a9fddb1f98b837c20dde1508b683ab0fc6f3bd8e Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Thu, 28 May 2015 22:51:14 +0200 Subject: [PATCH 1526/2207] added pointer to the unified web component --- plugins.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 19564dff0e4..a311f24a0d6 100644 --- a/plugins.md +++ b/plugins.md @@ -2501,12 +2501,25 @@ Ease your development integrating Leaflet into a development framework or automa David Rubert + + + <leaflet-map> + + + Integrate Leaflet in applications made with the Polymer >= 1.0 web component framework. + + + Hendrik Brummermann, + Prateek Saxena + + + Leaflet map component - Integrate Leaflet in applications made with the Polymer web framework. + Integrate Leaflet in applications made with the Polymer 0.5<.5<.5<.5<.5 web framework. Prateek Saxena From d5d7fead08791d09fb854736cbd0464ab7cdfbc6 Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Thu, 28 May 2015 22:53:47 +0200 Subject: [PATCH 1527/2207] fixed syntax error --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index a311f24a0d6..bfdfe56a6dd 100644 --- a/plugins.md +++ b/plugins.md @@ -2519,7 +2519,7 @@ Ease your development integrating Leaflet into a development framework or automa Leaflet map component - Integrate Leaflet in applications made with the Polymer 0.5<.5<.5<.5<.5 web framework. + Integrate Leaflet in applications made with the Polymer 0.5 web framework. Prateek Saxena From 68f14f3bb8bdc5fd663a879a43f0a9891a580247 Mon Sep 17 00:00:00 2001 From: Yuzo Matsuzawa Date: Sat, 30 May 2015 18:35:06 +0900 Subject: [PATCH 1528/2207] Update plugins.md Add Leaflet.TileLayer.Mask --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index bfdfe56a6dd..34431685cbe 100644 --- a/plugins.md +++ b/plugins.md @@ -360,6 +360,15 @@ The following plugins change the way that tile or image layers are displayed in Public Lab + + + Leaflet.TileLayer.Mask + + A TileLayer with mask effect (demo) + + Yuzo Matsuzawa + + From 45b1110b712722bb817b8663756ff40c6af96b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 1 Jun 2015 14:44:46 +0200 Subject: [PATCH 1529/2207] Add q-cluster plugin. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 34431685cbe..3c7f94c0c07 100644 --- a/plugins.md +++ b/plugins.md @@ -979,6 +979,15 @@ When you are displaying a lot of data, these plugins will make your map look cle Andreas Kiefer + + + q-cluster + + Quick point clustering library with D3 categorization. + + Nicholas Hallahan + + ### Heatmaps From 4399b8f9355564678d36e7377b9da28a488360b8 Mon Sep 17 00:00:00 2001 From: Taro Matsuzawa Date: Tue, 2 Jun 2015 13:01:50 +0900 Subject: [PATCH 1530/2207] restore minZoom and maxZoom check on _update --- src/layer/tile/GridLayer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index e46839ecbd2..4fc51f33a7e 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -393,12 +393,12 @@ L.GridLayer = L.Layer.extend({ // TODO move to reset // var zoom = this._map.getZoom(); - // if (zoom > this.options.maxZoom || - // zoom < this.options.minZoom) { return; } - if (center === undefined) { center = map.getCenter(); } if (zoom === undefined) { zoom = Math.round(map.getZoom()); } + if (zoom > this.options.maxZoom || + zoom < this.options.minZoom) { return; } + var pixelBounds = map.getPixelBounds(center, zoom), tileRange = this._pxBoundsToTileRange(pixelBounds), tileCenter = tileRange.getCenter(), From c0384bbe21de088e0dd4d9a7312b2eba48a69fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 2 Jun 2015 12:35:31 +0200 Subject: [PATCH 1531/2207] Implement 'overlaps' spatial operator on bounds and use it on gridlayers --- spec/suites/geo/LatLngBoundsSpec.js | 13 +++++++++++++ src/geo/LatLngBounds.js | 16 +++++++++++++++- src/geometry/Bounds.js | 13 +++++++++++++ src/layer/tile/GridLayer.js | 2 +- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/spec/suites/geo/LatLngBoundsSpec.js b/spec/suites/geo/LatLngBoundsSpec.js index ee658f90c05..e3b2e6b9be4 100644 --- a/spec/suites/geo/LatLngBoundsSpec.js +++ b/spec/suites/geo/LatLngBoundsSpec.js @@ -143,6 +143,19 @@ describe('LatLngBounds', function () { expect(a.intersects([[16, 20], [50, 60]])).to.eql(true); expect(a.contains([[40, 50], [50, 60]])).to.eql(false); }); + + it('returns true if just touches the boundary of the given bounds', function () { + expect(a.intersects([[25, 40], [55, 50]])).to.eql(true); + }); + }); + + describe('#overlaps', function () { + it('returns true if overlaps the given bounds', function () { + expect(a.overlaps([[16, 20], [50, 60]])).to.eql(true); + }); + it('returns false if just touches the boundary of the given bounds', function () { + expect(a.overlaps([[25, 40], [55, 50]])).to.eql(false); + }); }); }); diff --git a/src/geo/LatLngBounds.js b/src/geo/LatLngBounds.js index fc3adfc6c5e..af046d01b50 100644 --- a/src/geo/LatLngBounds.js +++ b/src/geo/LatLngBounds.js @@ -119,7 +119,7 @@ L.LatLngBounds.prototype = { (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); }, - intersects: function (bounds) { // (LatLngBounds) + intersects: function (bounds) { // (LatLngBounds) -> Boolean bounds = L.latLngBounds(bounds); var sw = this._southWest, @@ -133,6 +133,20 @@ L.LatLngBounds.prototype = { return latIntersects && lngIntersects; }, + overlaps: function (bounds) { // (LatLngBounds) -> Boolean + bounds = L.latLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat), + lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng); + + return latOverlaps && lngOverlaps; + }, + toBBoxString: function () { return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); }, diff --git a/src/geometry/Bounds.js b/src/geometry/Bounds.js index 78ddc25c0e1..07bc5312bd0 100644 --- a/src/geometry/Bounds.js +++ b/src/geometry/Bounds.js @@ -82,6 +82,19 @@ L.Bounds.prototype = { return xIntersects && yIntersects; }, + overlaps: function (bounds) { // (Bounds) -> Boolean + bounds = L.bounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xOverlaps = (max2.x > min.x) && (min2.x < max.x), + yOverlaps = (max2.y > min.y) && (min2.y < max.y); + + return xOverlaps && yOverlaps; + }, + isValid: function () { return !!(this.min && this.max); } diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 4fc51f33a7e..e82c497e4eb 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -462,7 +462,7 @@ L.GridLayer = L.Layer.extend({ // don't load tile if it doesn't intersect the bounds in options var tileBounds = this._tileCoordsToBounds(coords); - return L.latLngBounds(this.options.bounds).intersects(tileBounds); + return L.latLngBounds(this.options.bounds).overlaps(tileBounds); }, _keyToBounds: function (key) { From 3b183f01bb59d74162ab3f175f27e526c1fc0307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 2 Jun 2015 12:58:38 +0200 Subject: [PATCH 1532/2207] Gridlayer prunes all tiles when zooming out of minzoom/maxzoom. --- src/layer/tile/GridLayer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 4fc51f33a7e..7b3c791176d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -230,6 +230,10 @@ L.GridLayer = L.Layer.extend({ _pruneTiles: function () { var key, tile; + var zoom = map.getZoom(); + if (zoom > this.options.maxZoom || + zoom < this.options.minZoom) { return this._removeAllTiles(); } + for (key in this._tiles) { tile = this._tiles[key]; tile.retain = tile.current; From 8a352fbbbfd625e12f820bbe49ddbb670f08595b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 2 Jun 2015 15:42:50 +0200 Subject: [PATCH 1533/2207] Add an option to make the map's maxBounds non-bouncy. Fixes #1673. --- debug/map/max-bounds-bouncy.html | 52 ++++++++++++++++++++++++++++++++ src/map/Map.js | 3 +- src/map/handler/Map.Drag.js | 36 ++++++++++++++++++++-- 3 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 debug/map/max-bounds-bouncy.html diff --git a/debug/map/max-bounds-bouncy.html b/debug/map/max-bounds-bouncy.html new file mode 100644 index 00000000000..4fbb4bc87a5 --- /dev/null +++ b/debug/map/max-bounds-bouncy.html @@ -0,0 +1,52 @@ + + + + Leaflet debug page + + + + + + + + + + + + +

        Left: Bouncy maxBounds. Right: Not bouncy.

        + +
        +
        + + + + diff --git a/src/map/Map.js b/src/map/Map.js index ef93d60830b..f0c0c1625e7 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -15,7 +15,8 @@ L.Map = L.Evented.extend({ fadeAnimation: true, trackResize: true, - markerZoomAnimation: true + markerZoomAnimation: true, + maxBoundsViscosity: 0.0 }, initialize: function (id, options) { // (HTMLElement or String, Object) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index f61f231d760..1d8251fd2d4 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -28,8 +28,9 @@ L.Map.Drag = L.Handler.extend({ dragend: this._onDragEnd }, this); + this._draggable.on('predrag', this._onPreDragLimit, this); if (map.options.worldCopyJump) { - this._draggable.on('predrag', this._onPreDrag, this); + this._draggable.on('predrag', this._onPreDragWrap, this); map.on('viewreset', this._onViewReset, this); map.whenReady(this._onViewReset, this); @@ -55,6 +56,19 @@ L.Map.Drag = L.Handler.extend({ _onDragStart: function () { var map = this._map; + if (this._map.options.maxBounds && this._map.options.maxBoundsViscosity) { + var bounds = L.latLngBounds(this._map.options.maxBounds); + + this._offsetLimit = L.bounds( + this._map.latLngToContainerPoint(bounds.getNorthWest()).multiplyBy(-1), + this._map.latLngToContainerPoint(bounds.getSouthEast()).multiplyBy(-1) + .add(this._map.getSize())); + + this._viscosity = Math.min(1.0, Math.max(0.0, this._map.options.maxBoundsViscosity)); + } else { + this._offsetLimit = null; + } + map .fire('movestart') .fire('dragstart'); @@ -92,7 +106,25 @@ L.Map.Drag = L.Handler.extend({ this._worldWidth = this._map.getPixelWorldBounds().getSize().x; }, - _onPreDrag: function () { + _viscousLimit: function(value, threshold) { + return value - (value - threshold) * this._viscosity; + }, + + _onPreDragLimit: function () { + if (!this._viscosity || !this._offsetLimit) { return; } + + var offset = this._draggable._newPos.subtract(this._draggable._startPos); + + var limit = this._offsetLimit; + if (offset.x < limit.min.x) { offset.x = this._viscousLimit(offset.x, limit.min.x); } + if (offset.y < limit.min.y) { offset.y = this._viscousLimit(offset.y, limit.min.y); } + if (offset.x > limit.max.x) { offset.x = this._viscousLimit(offset.x, limit.max.x); } + if (offset.y > limit.max.y) { offset.y = this._viscousLimit(offset.y, limit.max.y); } + + this._draggable._newPos = this._draggable._startPos.add(offset); + }, + + _onPreDragWrap: function () { // TODO refactor to be able to adjust map pane position after zoom var worldWidth = this._worldWidth, halfWidth = Math.round(worldWidth / 2), From 3a9da3bd7ca2ac8c0772a2d4328de45d109b9b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 4 Jun 2015 15:02:28 +0200 Subject: [PATCH 1534/2207] Fixes #3431, GridLayer.setOpacity() behaviour on active tiles. --- debug/tests/tile-opacity.html | 44 +++++++++++++++++++++++++++++++++++ src/layer/tile/GridLayer.js | 9 ++++--- 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 debug/tests/tile-opacity.html diff --git a/debug/tests/tile-opacity.html b/debug/tests/tile-opacity.html new file mode 100644 index 00000000000..12c81e3fdb6 --- /dev/null +++ b/debug/tests/tile-opacity.html @@ -0,0 +1,44 @@ + + + + Leaflet debug page + + + + + + + + + + + + + + The opacity of the "toner" layer should pulse nicely, even when dragging/zooming the map around with new tiles. +
        + + + + diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 9b6cfb1606e..730960f1666 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -155,11 +155,12 @@ L.GridLayer = L.Layer.extend({ } var now = +new Date(), - nextFrame = false; + nextFrame = false, + willPrune = false; for (var key in this._tiles) { var tile = this._tiles[key]; - if (!tile.current || !tile.loaded || tile.active) { continue; } + if (!tile.current || !tile.loaded) { continue; } var fade = Math.min(1, (now - tile.loaded) / 200); if (fade < 1) { @@ -167,11 +168,13 @@ L.GridLayer = L.Layer.extend({ nextFrame = true; } else { L.DomUtil.setOpacity(tile.el, opacity); + if (tile.active) { willPrune = true; } tile.active = true; - this._pruneTiles(); } } + if (willPrune) { this._pruneTiles(); } + if (nextFrame) { L.Util.cancelAnimFrame(this._fadeFrame); this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); From 81b038926c89b39b2a3220a639c118987d4eda15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 4 Jun 2015 16:20:13 +0200 Subject: [PATCH 1535/2207] Cleaning up map layers when map.remove() is run --- debug/tests/detached-dom-memory-leak.html | 56 +++++++++++++++++++++++ src/map/Map.js | 4 ++ 2 files changed, 60 insertions(+) create mode 100644 debug/tests/detached-dom-memory-leak.html diff --git a/debug/tests/detached-dom-memory-leak.html b/debug/tests/detached-dom-memory-leak.html new file mode 100644 index 00000000000..220cfe1131d --- /dev/null +++ b/debug/tests/detached-dom-memory-leak.html @@ -0,0 +1,56 @@ + + + + Leaflet debug page + + + + + + + + + +This page will destroy and recreate a map div lots of times. Developer tools shall not display a memory leak. + +
        + + + +
        + + + \ No newline at end of file diff --git a/src/map/Map.js b/src/map/Map.js index f0c0c1625e7..8dca0f26b73 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -272,6 +272,10 @@ L.Map = L.Evented.extend({ this.fire('unload'); } + for (var i in this._layers) { + this._layers[i].remove(); + } + return this; }, From 3ccbe5bca0dcf7d7d01371c327e3e42173e8313a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 4 Jun 2015 19:15:19 +0300 Subject: [PATCH 1536/2207] trigger tile compositing in Safari MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This kind of reverts #2377 that doesn’t make sense after tile animation refactorings, because it makes Safari terribly slow. It reintroduces the tile gaps, but oh well, we choose the lesser evil here. Also, performance in latest iOS is the same with and without the patch so there’s no harm in removing this. --- CHANGELOG.md | 2 -- src/dom/DomUtil.js | 4 ++-- src/layer/tile/GridLayer.js | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57ad20fa6cd..5db3abbf230 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,8 +91,6 @@ These changes were targeted at removing any hardcoded projection-specific logic ### Animations refactoring -* Improved performance in iOS Safari; pinch-zooming should be smoother now. [#2377](https://github.com/Leaflet/Leaflet/pull/2377) -* Fixed gaps between tiles during animations in desktop Safari. [#2377](https://github.com/Leaflet/Leaflet/pull/2377) * Improved panning inertia behavior so that there are no tearing during animation when panning around quickly. [#2360](https://github.com/Leaflet/Leaflet/issues/2360) ## Other performance improvements diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index 67de1558d93..4f8340180aa 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -146,13 +146,13 @@ L.DomUtil = { 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)' + (scale ? ' scale(' + scale + ')' : ''); }, - setPosition: function (el, point, no3d) { // (HTMLElement, Point[, Boolean]) + setPosition: function (el, point) { // (HTMLElement, Point[, Boolean]) /*eslint-disable */ el._leaflet_pos = point; /*eslint-enable */ - if (L.Browser.any3d && !no3d) { + if (L.Browser.any3d) { L.DomUtil.setTransform(el, point); } else { el.style.left = point.x + 'px'; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 730960f1666..5218a6e7666 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -556,7 +556,7 @@ L.GridLayer = L.Layer.extend({ // we prefer top/left over translate3d so that we don't create a HW-accelerated layer from each tile // which is slow, and it also fixes gaps between tiles in Safari - L.DomUtil.setPosition(tile, tilePos, true); + L.DomUtil.setPosition(tile, tilePos); // save tile in cache this._tiles[key] = { From fdd60cc66be57417f4ca2a7b568c14a5edef440c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Mar 2015 12:59:18 +0200 Subject: [PATCH 1537/2207] ditch viewreset event, reliable zoomend removes viewreset use everywhere; also changes event order to have zoomend before move and moveend to make zoomend a reliable viewreset successor --- spec/suites/layer/tile/GridLayerSpec.js | 4 ++-- src/layer/ImageOverlay.js | 2 +- src/layer/Popup.js | 2 +- src/layer/marker/Marker.js | 2 +- src/layer/tile/GridLayer.js | 20 ++++++++++---------- src/layer/vector/Path.js | 2 +- src/map/Map.js | 12 ++++++------ src/map/handler/Map.Drag.js | 6 +++--- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index 1ca422796d6..4d4882ee93c 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -107,7 +107,7 @@ describe('GridLayer', function () { }); describe("#onAdd", function () { - it('is called after viewreset on first map load', function () { + it('is called after zoomend on first map load', function () { var layer = L.gridLayer().addTo(map); var onAdd = layer.onAdd, @@ -118,7 +118,7 @@ describe('GridLayer', function () { }; var onReset = sinon.spy(); - map.on('viewreset', onReset); + map.on('zoomend', onReset); map.setView([0, 0], 0); expect(onReset.calledBefore(onAddSpy)).to.be.ok(); diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 3dfc78e4a1f..133624192f8 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -87,7 +87,7 @@ L.ImageOverlay = L.Layer.extend({ getEvents: function () { var events = { - viewreset: this._reset + zoomend: this._reset }; if (this._zoomAnimated) { diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 4854fa90a6a..269d24d6977 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -122,7 +122,7 @@ L.Popup = L.Layer.extend({ }, getEvents: function () { - var events = {viewreset: this._updatePosition}, + var events = {zoomend: this._updatePosition}, options = this.options; if (this._zoomAnimated) { diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 5b3adfe036f..2562db29e9c 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -42,7 +42,7 @@ L.Marker = L.Layer.extend({ }, getEvents: function () { - var events = {viewreset: this.update}; + var events = {zoomend: this.update}; if (this._zoomAnimated) { events.zoomanim = this._animateZoom; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 5218a6e7666..08f7fb8a1ff 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -31,7 +31,7 @@ L.GridLayer = L.Layer.extend({ this._levels = {}; this._tiles = {}; - this._viewReset(); + this._resetView(); this._update(); }, @@ -97,13 +97,13 @@ L.GridLayer = L.Layer.extend({ getEvents: function () { var events = { - viewreset: this._viewReset, - moveend: this._move + zoomend: this._resetView, + moveend: this._onMoveEnd }; if (!this.options.updateWhenIdle) { // update tiles on move, but not more often than once per given interval - events.move = L.Util.throttle(this._move, this.options.updateInterval, this); + events.move = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this); } if (this._zoomAnimated) { @@ -311,19 +311,19 @@ L.GridLayer = L.Layer.extend({ } }, - _viewReset: function (e) { - this._reset(this._map.getCenter(), this._map.getZoom(), e && e.hard); + _resetView: function () { + this._setView(this._map.getCenter(), this._map.getZoom()); }, _animateZoom: function (e) { - this._reset(e.center, e.zoom, false, true, e.noUpdate); + this._setView(e.center, e.zoom, true, e.noUpdate); }, - _reset: function (center, zoom, hard, noPrune, noUpdate) { + _setView: function (center, zoom, noPrune, noUpdate) { var tileZoom = Math.round(zoom), tileZoomChanged = this._tileZoom !== tileZoom; - if (!noUpdate && (hard || tileZoomChanged)) { + if (!noUpdate && tileZoomChanged) { if (this._abortLoading) { this._abortLoading(); @@ -388,7 +388,7 @@ L.GridLayer = L.Layer.extend({ return this.options.tileSize; }, - _move: function () { + _onMoveEnd: function () { this._update(); this._pruneTiles(); }, diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 96d7d69759e..5188ba173fa 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -40,7 +40,7 @@ L.Path = L.Layer.extend({ getEvents: function () { return { - viewreset: this._project, + zoomend: this._project, moveend: this._update }; }, diff --git a/src/map/Map.js b/src/map/Map.js index f0c0c1625e7..04c14d589c1 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -545,19 +545,19 @@ L.Map = L.Evented.extend({ var loading = !this._loaded; this._loaded = true; + // WARNING: viewreset event deprecated this.fire('viewreset', {hard: !preserveMapOffset}); - if (loading) { - this.fire('load'); + if (zoomChanged || afterZoomAnim) { + this.fire('zoomend'); } this.fire('move'); + this.fire('moveend'); - if (zoomChanged || afterZoomAnim) { - this.fire('zoomend'); + if (loading) { + this.fire('load'); } - - this.fire('moveend', {hard: !preserveMapOffset}); }, _rawPanBy: function (offset) { diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 1d8251fd2d4..f1359e0010c 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -31,9 +31,9 @@ L.Map.Drag = L.Handler.extend({ this._draggable.on('predrag', this._onPreDragLimit, this); if (map.options.worldCopyJump) { this._draggable.on('predrag', this._onPreDragWrap, this); - map.on('viewreset', this._onViewReset, this); + map.on('zoomend', this._onZoomEnd, this); - map.whenReady(this._onViewReset, this); + map.whenReady(this._onZoomEnd, this); } } L.DomUtil.addClass(this._map._container, 'leaflet-grab'); @@ -98,7 +98,7 @@ L.Map.Drag = L.Handler.extend({ .fire('drag', e); }, - _onViewReset: function () { + _onZoomEnd: function () { var pxCenter = this._map.getSize().divideBy(2), pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); From d13aaac837791849f219d8d857124dd767a985e8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Mar 2015 14:07:08 +0200 Subject: [PATCH 1538/2207] refactor _resetView; rely on zoom event in layers --- src/layer/ImageOverlay.js | 2 +- src/layer/Popup.js | 2 +- src/layer/marker/Marker.js | 2 +- src/layer/tile/GridLayer.js | 2 +- src/layer/vector/Path.js | 2 +- src/map/Map.js | 64 ++++++++++++++++++------------- src/map/anim/Map.FlyTo.js | 11 ++++-- src/map/anim/Map.ZoomAnimation.js | 7 ++-- 8 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 133624192f8..549ffa5c230 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -87,7 +87,7 @@ L.ImageOverlay = L.Layer.extend({ getEvents: function () { var events = { - zoomend: this._reset + zoom: this._reset }; if (this._zoomAnimated) { diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 269d24d6977..999ead42495 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -122,7 +122,7 @@ L.Popup = L.Layer.extend({ }, getEvents: function () { - var events = {zoomend: this._updatePosition}, + var events = {zoom: this._updatePosition}, options = this.options; if (this._zoomAnimated) { diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 2562db29e9c..38f584087f9 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -42,7 +42,7 @@ L.Marker = L.Layer.extend({ }, getEvents: function () { - var events = {zoomend: this.update}; + var events = {zoom: this.update}; if (this._zoomAnimated) { events.zoomanim = this._animateZoom; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 08f7fb8a1ff..77a56941770 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -97,7 +97,7 @@ L.GridLayer = L.Layer.extend({ getEvents: function () { var events = { - zoomend: this._resetView, + zoom: this._resetView, moveend: this._onMoveEnd }; diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 5188ba173fa..030a24c65fb 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -40,7 +40,7 @@ L.Path = L.Layer.extend({ getEvents: function () { return { - zoomend: this._project, + zoom: this._project, moveend: this._update }; }, diff --git a/src/map/Map.js b/src/map/Map.js index 04c14d589c1..eab52aee507 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -193,7 +193,7 @@ L.Map = L.Evented.extend({ var oldSize = this.getSize(); this._sizeChanged = true; - this._initialCenter = null; + this._lastCenter = null; var newSize = this.getSize(), oldCenter = oldSize.divideBy(2).round(), @@ -291,8 +291,8 @@ L.Map = L.Evented.extend({ getCenter: function () { // (Boolean) -> LatLng this._checkIfLoaded(); - if (this._initialCenter && !this._moved()) { - return this._initialCenter; + if (this._lastCenter && !this._moved()) { + return this._lastCenter; } return this.layerPointToLatLng(this._getCenterLayerPoint()); }, @@ -505,6 +505,7 @@ L.Map = L.Evented.extend({ this._paneRenderers = {}; this._mapPane = this.createPane('mapPane', this._container); + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); this.createPane('tilePane'); this.createPane('shadowPane'); @@ -521,43 +522,52 @@ L.Map = L.Evented.extend({ // private methods that modify map state - _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { + _resetView: function (center, zoom) { + L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - var zoomChanged = (this._zoom !== zoom); + var loading = !this._loaded; + this._loaded = true; - if (!afterZoomAnim) { - this.fire('movestart'); + var zoomChanged = this._zoom !== zoom; + this + ._moveStart(zoomChanged) + ._move(center, zoom) + ._moveEnd(zoomChanged); - if (zoomChanged) { - this.fire('zoomstart'); - } + if (loading) { + this.fire('load'); } + }, - this._zoom = zoom; - this._initialCenter = center; + _moveStart: function (zoomChanged) { + if (zoomChanged) { + this.fire('zoomstart'); + } + return this.fire('movestart'); + }, - if (!preserveMapOffset) { - L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); + _move: function (center, zoom) { + if (zoom === undefined) { + zoom = this._zoom; } - this._pixelOrigin = this._getNewPixelOrigin(center); + var zoomChanged = this._zoom !== zoom; - var loading = !this._loaded; - this._loaded = true; - - // WARNING: viewreset event deprecated - this.fire('viewreset', {hard: !preserveMapOffset}); + this._zoom = zoom; + this._lastCenter = center; + this._pixelOrigin = this._getNewPixelOrigin(center); - if (zoomChanged || afterZoomAnim) { - this.fire('zoomend'); + if (zoomChanged) { + this.fire('zoom'); } + return this.fire('move'); + }, - this.fire('move'); - this.fire('moveend'); - - if (loading) { - this.fire('load'); + _moveEnd: function (zoomChanged) { + if (zoomChanged) { + this.fire('zoomend'); } + return this.fire('moveend'); }, _rawPanBy: function (offset) { diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index 13943d578f7..5518446eef9 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -50,16 +50,19 @@ L.Map.include({ if (t <= 1) { this._flyToFrame = L.Util.requestAnimFrame(frame, this); - this._resetView( + this._move( this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom), - this.getScaleZoom(w0 / w(s), startZoom), true, true); + this.getScaleZoom(w0 / w(s), startZoom)); } else { - this._resetView(targetCenter, targetZoom, true, true); + this + ._move(targetCenter, targetZoom) + ._moveEnd(true); } } - this.fire('zoomstart'); + this._moveStart(true); + frame.call(this); return this; }, diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 27e14a26704..271c60da585 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -81,8 +81,7 @@ L.Map.include(!zoomAnimated ? {} : { L.Util.requestAnimFrame(function () { this - .fire('movestart') - .fire('zoomstart') + ._moveStart(true) ._animateZoom(center, zoom, true); }, this); @@ -116,6 +115,8 @@ L.Map.include(!zoomAnimated ? {} : { L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - this._resetView(this._animateToCenter, this._animateToZoom, true, true); + this + ._move(this._animateToCenter, this._animateToZoom) + ._moveEnd(true); } }); From 06f90b1a5b9413877f187ac66217a17a0f17db05 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 4 Mar 2015 20:23:59 +0200 Subject: [PATCH 1539/2207] simplify and unify TouchZoom logic --- src/layer/tile/GridLayer.js | 5 ++- src/map/Map.js | 7 ++-- src/map/handler/Map.TouchZoom.js | 72 +++++++++++++------------------- 3 files changed, 35 insertions(+), 49 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 77a56941770..8e4c1d325e3 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -311,8 +311,9 @@ L.GridLayer = L.Layer.extend({ } }, - _resetView: function () { - this._setView(this._map.getCenter(), this._map.getZoom()); + _resetView: function (e) { + var pinch = e && e.pinch; + this._setView(this._map.getCenter(), this._map.getZoom(), pinch, pinch); }, _animateZoom: function (e) { diff --git a/src/map/Map.js b/src/map/Map.js index eab52aee507..f58908126cc 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -546,7 +546,7 @@ L.Map = L.Evented.extend({ return this.fire('movestart'); }, - _move: function (center, zoom) { + _move: function (center, zoom, data) { if (zoom === undefined) { zoom = this._zoom; } @@ -558,9 +558,9 @@ L.Map = L.Evented.extend({ this._pixelOrigin = this._getNewPixelOrigin(center); if (zoomChanged) { - this.fire('zoom'); + this.fire('zoom', data); } - return this.fire('move'); + return this.fire('move', data); }, _moveEnd: function (zoomChanged) { @@ -715,7 +715,6 @@ L.Map = L.Evented.extend({ _getNewPixelOrigin: function (center, zoom) { var viewHalf = this.getSize()._divideBy(2); - // TODO round on display, not calculation to increase precision? return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); }, diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index e8b3754c3cc..543b9b32abc 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -21,18 +21,17 @@ L.Map.TouchZoom = L.Handler.extend({ if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]), - viewCenter = map._getCenterLayerPoint(); + var p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]); - this._startCenter = p1.add(p2)._divideBy(2); + this._pinchStartPoint = p1.add(p2)._divideBy(2); + this._startCenter = map.containerPointToLatLng(map.getSize()._divideBy(2)); this._startDist = p1.distanceTo(p2); + this._startZoom = map.getZoom(); this._moved = false; this._zooming = true; - this._centerOffset = viewCenter.subtract(this._startCenter); - map.stop(); L.DomEvent @@ -46,46 +45,39 @@ L.Map.TouchZoom = L.Handler.extend({ if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } var map = this._map, - p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]); + p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]), + scale = p1.distanceTo(p2) / this._startDist, + delta; + + this._zoom = map.getScaleZoom(scale, this._startZoom); - this._scale = p1.distanceTo(p2) / this._startDist; - this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); + if (map.options.touchZoom === 'center') { + delta = new L.Point(0, 0); + this._center = map.getCenter(); + } else { + delta = p1._add(p2)._divideBy(2)._subtract(this._pinchStartPoint); + this._center = map.containerPointToLatLng(map.latLngToContainerPoint(this._startCenter).subtract(delta)); + } + + if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } if (!map.options.bounceAtZoomLimits) { - var currentZoom = map.getScaleZoom(this._scale); - if ((currentZoom <= map.getMinZoom() && this._scale < 1) || - (currentZoom >= map.getMaxZoom() && this._scale > 1)) { return; } + if ((this._zoom <= map.getMinZoom() && scale < 1) || + (this._zoom >= map.getMaxZoom() && scale > 1)) { return; } } if (!this._moved) { - map - .fire('movestart') - .fire('zoomstart'); - + map._moveStart(true); this._moved = true; } L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame(this._updateOnMove, this, true, this._map._container); - - L.DomEvent.preventDefault(e); - }, - _updateOnMove: function () { - var map = this._map; - - if (map.options.touchZoom === 'center') { - this._center = map.getCenter(); - } else { - this._center = map.layerPointToLatLng(this._getTargetCenter()); - } + var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}); + this._animRequest = L.Util.requestAnimFrame(moveFn, this, true, map._container); - this._zoom = map.getScaleZoom(this._scale); - - if (this._scale !== 1 || this._delta.x !== 0 || this._delta.y !== 0) { - map._animateZoom(this._center, this._zoom, false, true); - } + L.DomEvent.preventDefault(e); }, _onTouchEnd: function () { @@ -101,17 +93,11 @@ L.Map.TouchZoom = L.Handler.extend({ .off(document, 'touchmove', this._onTouchMove) .off(document, 'touchend', this._onTouchEnd); - var map = this._map, - oldZoom = map.getZoom(), - zoomDelta = this._zoom - oldZoom, - finalZoom = map._limitZoom(zoomDelta > 0 ? Math.ceil(this._zoom) : Math.floor(this._zoom)); + var zoom = this._zoom; + zoom = this._map._limitZoom(zoom - this._startZoom > 0 ? Math.ceil(zoom) : Math.floor(zoom)); - map._animateZoom(this._center, finalZoom, true, true); - }, - _getTargetCenter: function () { - var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); - return this._startCenter.add(centerOffset); + this._map._animateZoom(this._center, zoom, true, true); } }); From 7032bbc13d10cd1add8bd8e395c9120c178075d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 12 May 2015 14:19:40 +0200 Subject: [PATCH 1540/2207] Graceful degradations of zoom-pan animations on top of refactored zoom-pan events. --- debug/map/zoompan.html | 52 ++++++++++++++++++++++++------------------ src/map/Map.js | 5 ++-- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 75cb03b9071..91884de0ab1 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -27,13 +27,19 @@
        -
        -
        +
        (flyTo)
        +
        (setView, 5 sec)
        (flyTo 20 sec)
        (fract. zoom)
        (setView, fract. zoom)
        +
        (image overlay)
        -
        + + + + + + diff --git a/src/map/Map.js b/src/map/Map.js index f58908126cc..705f676ba96 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -58,13 +58,13 @@ L.Map = L.Evented.extend({ // replaced by animation-powered implementation in Map.PanAnimation.js setView: function (center, zoom) { zoom = zoom === undefined ? this.getZoom() : zoom; - this._resetView(L.latLng(center), this._limitZoom(zoom)); + this._resetView(L.latLng(center), zoom); return this; }, setZoom: function (zoom, options) { if (!this._loaded) { - this._zoom = this._limitZoom(zoom); + this._zoom = zoom; return this; } return this.setView(this.getCenter(), zoom, {zoom: options}); @@ -527,6 +527,7 @@ L.Map = L.Evented.extend({ var loading = !this._loaded; this._loaded = true; + zoom = this._limitZoom(zoom); var zoomChanged = this._zoom !== zoom; this From d9e20a250dcc5ebd5aee946194c3a3761039bef4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 2 Jun 2015 13:24:34 +0300 Subject: [PATCH 1541/2207] ditch zoomanim event scale/origin/offset props --- src/layer/ImageOverlay.js | 5 +++-- src/layer/vector/Renderer.js | 7 ++++--- src/map/anim/Map.ZoomAnimation.js | 3 --- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 549ffa5c230..450d38f2db5 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -118,13 +118,14 @@ L.ImageOverlay = L.Layer.extend({ }, _animateZoom: function (e) { + var scale = this._map.getZoomScale(e.zoom); var bounds = new L.Bounds( this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center), this._map._latLngToNewLayerPoint(this._bounds.getSouthEast(), e.zoom, e.center)); - var offset = bounds.min.add(bounds.getSize()._multiplyBy((1 - 1 / e.scale) / 2)); + var offset = bounds.min.add(bounds.getSize()._multiplyBy((1 - 1 / scale) / 2)); - L.DomUtil.setTransform(this._image, offset, e.scale); + L.DomUtil.setTransform(this._image, offset, scale); }, _reset: function () { diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index a9183f11e43..5061f6078bb 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -44,10 +44,11 @@ L.Renderer = L.Layer.extend({ }, _animateZoom: function (e) { - var origin = e.origin.subtract(this._map._getCenterLayerPoint()), - offset = this._bounds.min.add(origin.multiplyBy(1 - e.scale)).add(e.offset).round(); + var origin = this._map.latLngToLayerPoint(e.center).subtract(this._map._getCenterLayerPoint()), + scale = this._map.getZoomScale(e.zoom), + offset = this._bounds.min.add(origin.multiplyBy(1 - scale)).subtract(this._map._getCenterOffset(e.center)).round(); - L.DomUtil.setTransform(this._container, offset, e.scale); + L.DomUtil.setTransform(this._container, offset, scale); }, _update: function () { diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 271c60da585..b9285d0d960 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -102,9 +102,6 @@ L.Map.include(!zoomAnimated ? {} : { this.fire('zoomanim', { center: center, zoom: zoom, - scale: this.getZoomScale(zoom), - origin: this.latLngToLayerPoint(center), - offset: this._getCenterOffset(center).multiplyBy(-1), noUpdate: noUpdate }); }, From 2cf8cc008a833350a9a843aa01dc7d9648906293 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 2 Jun 2015 14:21:19 +0300 Subject: [PATCH 1542/2207] simplify renderer animation math --- src/layer/vector/Renderer.js | 6 +++--- src/layer/vector/SVG.js | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 5061f6078bb..1308bf2caff 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -44,9 +44,9 @@ L.Renderer = L.Layer.extend({ }, _animateZoom: function (e) { - var origin = this._map.latLngToLayerPoint(e.center).subtract(this._map._getCenterLayerPoint()), - scale = this._map.getZoomScale(e.zoom), - offset = this._bounds.min.add(origin.multiplyBy(1 - scale)).subtract(this._map._getCenterOffset(e.center)).round(); + var scale = this._map.getZoomScale(e.zoom), + origin = this._map._getCenterOffset(e.center).multiplyBy(scale), + offset = this._bounds.min.subtract(origin).round(); L.DomUtil.setTransform(this._container, offset, scale); }, diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index cc37f52d160..0d69e551f28 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -23,8 +23,6 @@ L.SVG = L.Renderer.extend({ size = b.getSize(), container = this._container; - L.DomUtil.setPosition(container, b.min); - // set size of svg-container if changed if (!this._svgSize || !this._svgSize.equals(size)) { this._svgSize = size; From 1e9c8649b3f7b2a64bb8baef0d936f86d9d380dc Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 4 Jun 2015 21:12:50 +0300 Subject: [PATCH 1543/2207] simplify zoom transform math changes the transform origin for all layers from 50% 50% (implied default) to 0 0, making it MUCH easier to understand zoom transform math. --- dist/leaflet.css | 5 +++++ src/layer/ImageOverlay.js | 10 +++------- src/layer/vector/Renderer.js | 10 ++++++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index c55a37283e2..929345dd01a 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -153,6 +153,11 @@ .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { opacity: 1; } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } .leaflet-zoom-anim .leaflet-zoom-animated { will-change: transform; } diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 450d38f2db5..643301eeb4a 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -118,13 +118,9 @@ L.ImageOverlay = L.Layer.extend({ }, _animateZoom: function (e) { - var scale = this._map.getZoomScale(e.zoom); - var bounds = new L.Bounds( - this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center), - this._map._latLngToNewLayerPoint(this._bounds.getSouthEast(), e.zoom, e.center)); - - var offset = bounds.min.add(bounds.getSize()._multiplyBy((1 - 1 / scale) / 2)); - + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center); + L.DomUtil.setTransform(this._image, offset, scale); }, diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 1308bf2caff..f36e07a7cc6 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -8,7 +8,7 @@ L.Renderer = L.Layer.extend({ options: { // how much to extend the clip area around the map view (relative to its size) // e.g. 0.1 would be 10% of map view in each direction; defaults to clip with the map view - padding: 0 + padding: 0.1 }, initialize: function (options) { @@ -44,9 +44,8 @@ L.Renderer = L.Layer.extend({ }, _animateZoom: function (e) { - var scale = this._map.getZoomScale(e.zoom), - origin = this._map._getCenterOffset(e.center).multiplyBy(scale), - offset = this._bounds.min.subtract(origin).round(); + var scale = this._map.getZoomScale(e.zoom, this._zoom), + offset = this._map._latLngToNewLayerPoint(this._topLeft, e.zoom, e.center); L.DomUtil.setTransform(this._container, offset, scale); }, @@ -58,6 +57,9 @@ L.Renderer = L.Layer.extend({ min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round(); this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round()); + + this._topLeft = this._map.layerPointToLatLng(min); + this._zoom = this._map.getZoom(); } }); From 625161f15d6b61c88bb55ab9891e87ef7eb8393f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 4 Jun 2015 21:32:06 +0300 Subject: [PATCH 1544/2207] make vectors work with flyTo --- src/layer/vector/Renderer.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index f36e07a7cc6..13f218c6ab9 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -35,6 +35,7 @@ L.Renderer = L.Layer.extend({ getEvents: function () { var events = { + zoom: this._updateTransform, moveend: this._update }; if (this._zoomAnimated) { @@ -50,6 +51,15 @@ L.Renderer = L.Layer.extend({ L.DomUtil.setTransform(this._container, offset, scale); }, + _updateTransform: function () { + var zoom = this._map.getZoom(), + center = this._map.getCenter(), + scale = this._map.getZoomScale(zoom, this._zoom), + offset = this._map._latLngToNewLayerPoint(this._topLeft, zoom, center); + + L.DomUtil.setTransform(this._container, offset, scale); + }, + _update: function () { // update pixel bounds of renderer container (for positioning/sizing/clipping later) var p = this.options.padding, From ad08a5c8748cd3ba6f44ff79408ab15512d22671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 5 Jun 2015 11:38:18 +0200 Subject: [PATCH 1545/2207] Unit test for map zoom level limit and zoom-less setView --- spec/suites/map/MapSpec.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 4f52931e33e..eeb033fed58 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -129,6 +129,14 @@ describe("Map", function () { expect(map.getCenter().distanceTo([51.605, -0.11])).to.be.lessThan(5); }); + it("limits initial zoom when no zoom specified", function () { + map.options.maxZoom = 20; + map.setZoom(100); + expect(map.setView([51.605, -0.11])).to.be(map); + expect(map.getZoom()).to.be(20); + expect(map.getCenter().distanceTo([51.605, -0.11])).to.be.lessThan(5); + }); + it("defaults to zoom passed as map option", function () { map = L.map(document.createElement('div'), {zoom: 13}); expect(map.setView([51.605, -0.11])).to.be(map); From fd708bf17386b48942ec11c3ff854f5ee6ac7738 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 5 Jun 2015 12:42:09 +0300 Subject: [PATCH 1546/2207] don't project vectors on every zoom event --- src/layer/vector/Path.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 030a24c65fb..5188ba173fa 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -40,7 +40,7 @@ L.Path = L.Layer.extend({ getEvents: function () { return { - zoom: this._project, + zoomend: this._project, moveend: this._update }; }, From a5bd03d0e4ded72e7e5fadff58c1450d45bf0d93 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 5 Jun 2015 20:15:09 +0300 Subject: [PATCH 1547/2207] add back viewreset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit now it has different semantics though — it’s fired when a view is fully reset, so that all layer DOM elements should be repositioned. --- src/layer/ImageOverlay.js | 3 ++- src/layer/Popup.js | 10 ++++++---- src/layer/marker/Marker.js | 5 ++++- src/layer/tile/GridLayer.js | 17 ++++++++++++++--- src/layer/vector/Path.js | 15 +++++++++------ src/layer/vector/Renderer.js | 6 ++++++ src/map/Map.js | 2 ++ 7 files changed, 43 insertions(+), 15 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 643301eeb4a..94ce4e5df27 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -87,7 +87,8 @@ L.ImageOverlay = L.Layer.extend({ getEvents: function () { var events = { - zoom: this._reset + zoom: this._reset, + viewreset: this._reset }; if (this._zoomAnimated) { diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 999ead42495..f0d0456074f 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -122,16 +122,18 @@ L.Popup = L.Layer.extend({ }, getEvents: function () { - var events = {zoom: this._updatePosition}, - options = this.options; + var events = { + zoom: this._updatePosition, + viewreset: this._updatePosition + }; if (this._zoomAnimated) { events.zoomanim = this._animateZoom; } - if ('closeOnClick' in options ? options.closeOnClick : this._map.options.closePopupOnClick) { + if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { events.preclick = this._close; } - if (options.keepInView) { + if (this.options.keepInView) { events.moveend = this._adjustPan; } return events; diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 38f584087f9..13cfb6186cb 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -42,7 +42,10 @@ L.Marker = L.Layer.extend({ }, getEvents: function () { - var events = {zoom: this.update}; + var events = { + zoom: this.update, + viewreset: this.update + }; if (this._zoomAnimated) { events.zoomanim = this._animateZoom; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 8e4c1d325e3..5e6986474cd 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -97,6 +97,7 @@ L.GridLayer = L.Layer.extend({ getEvents: function () { var events = { + viewreset: this._resetAll, zoom: this._resetView, moveend: this._onMoveEnd }; @@ -195,6 +196,7 @@ L.GridLayer = L.Layer.extend({ }, _updateLevels: function () { + var zoom = this._tileZoom, maxZoom = this.options.maxZoom; @@ -265,6 +267,17 @@ L.GridLayer = L.Layer.extend({ } }, + _resetAll: function () { + for (var z in this._levels) { + L.DomUtil.remove(this._levels[z].el); + delete this._levels[z]; + } + this._removeAllTiles(); + + this._tileZoom = null; + this._resetView(); + }, + _retainParent: function (x, y, z, minZoom) { var x2 = Math.floor(x / 2), y2 = Math.floor(y / 2), @@ -395,12 +408,10 @@ L.GridLayer = L.Layer.extend({ }, _update: function (center, zoom) { + var map = this._map; if (!map) { return; } - // TODO move to reset - // var zoom = this._map.getZoom(); - if (center === undefined) { center = map.getCenter(); } if (zoom === undefined) { zoom = Math.round(map.getZoom()); } diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 5188ba173fa..0ca7656ba6b 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -26,11 +26,7 @@ L.Path = L.Layer.extend({ onAdd: function () { this._renderer = this._map.getRenderer(this); this._renderer._initPath(this); - - // defined in children classes - this._project(); - this._update(); - + this._reset(); this._renderer._addPath(this); }, @@ -41,7 +37,8 @@ L.Path = L.Layer.extend({ getEvents: function () { return { zoomend: this._project, - moveend: this._update + moveend: this._update, + viewreset: this._reset }; }, @@ -78,6 +75,12 @@ L.Path = L.Layer.extend({ return this._path; }, + _reset: function () { + // defined in children classes + this._project(); + this._update(); + }, + _clickTolerance: function () { // used when doing hit detection for Canvas layers return (this.options.stroke ? this.options.weight / 2 : 0) + (L.Browser.touch ? 10 : 0); diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 13f218c6ab9..4826b1cede7 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -35,6 +35,7 @@ L.Renderer = L.Layer.extend({ getEvents: function () { var events = { + viewreset: this._reset, zoom: this._updateTransform, moveend: this._update }; @@ -60,6 +61,11 @@ L.Renderer = L.Layer.extend({ L.DomUtil.setTransform(this._container, offset, scale); }, + _reset: function () { + this._update(); + this._updateTransform(); + }, + _update: function () { // update pixel bounds of renderer container (for positioning/sizing/clipping later) var p = this.options.padding, diff --git a/src/map/Map.js b/src/map/Map.js index 705f676ba96..d4c32a96ea4 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -535,6 +535,8 @@ L.Map = L.Evented.extend({ ._move(center, zoom) ._moveEnd(zoomChanged); + this.fire('viewreset'); + if (loading) { this.fire('load'); } From 30b9b9cfd63d5af10c43deb2cfcd0df05c6e7aa3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 4 Jun 2015 21:29:57 +0300 Subject: [PATCH 1548/2207] fix whitespace --- src/layer/ImageOverlay.js | 2 +- src/layer/vector/Renderer.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 94ce4e5df27..48e23a21b91 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -121,7 +121,7 @@ L.ImageOverlay = L.Layer.extend({ _animateZoom: function (e) { var scale = this._map.getZoomScale(e.zoom), offset = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center); - + L.DomUtil.setTransform(this._image, offset, scale); }, diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 4826b1cede7..19214e1b1b0 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -54,8 +54,8 @@ L.Renderer = L.Layer.extend({ _updateTransform: function () { var zoom = this._map.getZoom(), - center = this._map.getCenter(), - scale = this._map.getZoomScale(zoom, this._zoom), + center = this._map.getCenter(), + scale = this._map.getZoomScale(zoom, this._zoom), offset = this._map._latLngToNewLayerPoint(this._topLeft, zoom, center); L.DomUtil.setTransform(this._container, offset, scale); @@ -73,7 +73,7 @@ L.Renderer = L.Layer.extend({ min = this._map.containerPointToLayerPoint(size.multiplyBy(-p)).round(); this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round()); - + this._topLeft = this._map.layerPointToLatLng(min); this._zoom = this._map.getZoom(); } From 1c4cf44f108d47593b70fb7b21f3c055af01748f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 8 Jun 2015 16:16:09 +0200 Subject: [PATCH 1549/2207] Add leaflet-graphicscale --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 3c7f94c0c07..2dc6bc2c54a 100644 --- a/plugins.md +++ b/plugins.md @@ -1813,6 +1813,17 @@ Allow the user to measure distances or areas. LJA GIS + + + + +
        on movestart
        on zoomstart
        on move
        on moveend
        on zoomend
        + leaflet-graphicscale + + Animated graphic scale control (demo). + + Erik Escoffier +
        From 5245b94aad94a4de81c95e84953d9c90b2318364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 8 Jun 2015 12:34:17 +0200 Subject: [PATCH 1550/2207] Reworked pixelBounds calculation in GridTile to deal with fractional zoom --- debug/tests/tile-bounds.html | 61 ++++++++++++++++++++++++++++++++++++ src/layer/tile/GridLayer.js | 20 +++++++----- 2 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 debug/tests/tile-bounds.html diff --git a/debug/tests/tile-bounds.html b/debug/tests/tile-bounds.html new file mode 100644 index 00000000000..63727c7948e --- /dev/null +++ b/debug/tests/tile-bounds.html @@ -0,0 +1,61 @@ + + + + Leaflet debug page + + + + + + + + + + + + + + The CSS in this page makes the boundaries of the GridLayer tiles visible. Tiles which do not overlap the map bounds shall not be shown, even at fractional zoom levels. + + + + +
        + + + + diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 5e6986474cd..fca852df19c 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -413,15 +413,19 @@ L.GridLayer = L.Layer.extend({ if (!map) { return; } if (center === undefined) { center = map.getCenter(); } - if (zoom === undefined) { zoom = Math.round(map.getZoom()); } + if (zoom === undefined) { zoom = map.getZoom(); } + var tileZoom = Math.round(zoom); - if (zoom > this.options.maxZoom || - zoom < this.options.minZoom) { return; } + if (tileZoom > this.options.maxZoom || + tileZoom < this.options.minZoom) { return; } - var pixelBounds = map.getPixelBounds(center, zoom), - tileRange = this._pxBoundsToTileRange(pixelBounds), - tileCenter = tileRange.getCenter(), - queue = []; + var scale = this._map.getZoomScale(zoom, tileZoom), + pixelCenter = map.project(center, tileZoom).floor(), + halfSize = map.getSize().divideBy(scale * 2), + pixelBounds = new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)), + tileRange = this._pxBoundsToTileRange(pixelBounds), + tileCenter = tileRange.getCenter(), + queue = []; for (var key in this._tiles) { this._tiles[key].current = false; @@ -431,7 +435,7 @@ L.GridLayer = L.Layer.extend({ for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { for (var i = tileRange.min.x; i <= tileRange.max.x; i++) { var coords = new L.Point(i, j); - coords.z = zoom; + coords.z = tileZoom; if (!this._isValidTile(coords)) { continue; } From b31a1e8be6c43b95d4f14006fb5bd636b3520b55 Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Tue, 9 Jun 2015 21:19:32 +0600 Subject: [PATCH 1551/2207] fix GridLayer move event handler, fixes #3522 --- src/layer/tile/GridLayer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index fca852df19c..99f13ad7221 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -104,7 +104,11 @@ L.GridLayer = L.Layer.extend({ if (!this.options.updateWhenIdle) { // update tiles on move, but not more often than once per given interval - events.move = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this); + if (!this._onMove) { + this._onMove = L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this); + } + + events.move = this._onMove; } if (this._zoomAnimated) { From 644bb7157a5d3e2774829deb0c2c4b7c9de90aca Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Wed, 10 Jun 2015 11:48:16 +0600 Subject: [PATCH 1552/2207] add map presence check to onMoveEnd handler, fixes #3522 --- src/layer/tile/GridLayer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 99f13ad7221..4ae8162a111 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -407,6 +407,8 @@ L.GridLayer = L.Layer.extend({ }, _onMoveEnd: function () { + if (!this._map) { return; } + this._update(); this._pruneTiles(); }, From 7cd7f4b78b48632f4047ce6020ad4cbcaccf6a09 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 10 Jun 2015 10:35:25 +0200 Subject: [PATCH 1553/2207] Add L.DomEvent.once --- spec/suites/dom/DomEventSpec.js | 42 +++++++++++++++++++++++++++++++++ src/dom/DomEvent.js | 21 +++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/spec/suites/dom/DomEventSpec.js b/spec/suites/dom/DomEventSpec.js index 97d586fe861..478a2c1b085 100644 --- a/spec/suites/dom/DomEventSpec.js +++ b/spec/suites/dom/DomEventSpec.js @@ -99,4 +99,46 @@ describe('DomEvent', function () { expect(simulateClick(el)).to.be(false); }); }); + + describe('#once', function () { + + it('adds a listener and calls it once', function () { + var listener = sinon.spy(); + + L.DomEvent.once(el, 'click', listener); + + simulateClick(el); + + expect(listener.callCount).to.eql(1); + + simulateClick(el); + + expect(listener.callCount).to.eql(1); + }); + + it('binds "this" to the given context', function () { + var obj = {foo: 'bar'}, + result; + + L.DomEvent.once(el, 'click', function () { + result = this; + }, obj); + + simulateClick(el); + + expect(result).to.eql(obj); + }); + + it('passes an event object to the listener', function () { + var type; + + L.DomEvent.once(el, 'click', function (e) { + type = e && e.type; + }); + simulateClick(el); + + expect(type).to.eql('click'); + }); + }); + }); diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 9d67761ff4e..3835b1a136a 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -41,6 +41,27 @@ L.DomEvent = { return this; }, + once: function (el, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + L.DomEvent.once(el, type, types[type], fn); + } + return L.DomEvent; + } + + var handler = L.bind(function () { + L.DomEvent + .off(el, types, fn, context) + .off(el, types, handler, context); + }, L.DomEvent); + + // add a listener that's executed once and removed after that + return L.DomEvent + .on(el, types, fn, context) + .on(el, types, handler, context); + }, + _on: function (obj, type, fn, context) { var id = type + L.stamp(fn) + (context ? '_' + L.stamp(context) : ''); From c34eb4e4e22eac25268e6ed85c25b63772843d66 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 10 Jun 2015 13:00:13 -0400 Subject: [PATCH 1554/2207] remove travis config --- .travis.yml | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index db828c83553..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -language: node_js -node_js: -- "0.10" -env: - global: - - "ARTIFACTS_S3_BUCKET=leaflet-cdn" - - secure: |- - LnvY/vWpmAIObabLrpu1mWYw1udllVpZJrrhzsn3traL+qU6yaGniQOn6u+l - iWSCuu7kXX3xv1GD7Fc6lTfQCg9F9dukWv9zlc4gFciyRpiUBuluuqtdV51A - 5yqpLkMpX2PMG7vwrOYttVW0uDlUcwGjyHxWZvnBOXCnnHSpnbI= - - secure: |- - EQ4c2c8VklzFZRxKnizI0/VK0anHhlyc1Rv0vqkMj/YPKxmbWNfOlsOCN2gM - p+q8QzCG1Np9D1Kq9K0miYqHgZxgu4D/4Mwy04bh1UfyoUcDfB1tJmEtsKY/ - 8Bl46ZfhxbTG39b6Y315GuU+49QdFMEXhSqx/G7on1xC4aYLXLc= -before_script: > - test ${TRAVIS_BRANCH} = master || - test ${TRAVIS_BRANCH} = stable && - test ${TRAVIS_PULL_REQUEST} = false && - gem install travis-artifacts || true -after_success: > - test ${TRAVIS_BRANCH} = master || - test ${TRAVIS_BRANCH} = stable && - test ${TRAVIS_PULL_REQUEST} = false && - travis-artifacts upload --path dist --target-path build/${TRAVIS_BRANCH} && - cd dist && zip -x .DS_Store -r leaflet-${TRAVIS_BRANCH}.zip . && - travis-artifacts upload --path leaflet-${TRAVIS_BRANCH}.zip --target-path build From c3288ab7650c932c6089bba9ab68fe07ca9675bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 11 Jun 2015 11:35:09 +0200 Subject: [PATCH 1555/2207] Synthetic doubletap events respect stopPropagation, fixes #3532 --- src/dom/DomEvent.DoubleTap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index e7d916725b6..dcc6696923b 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -33,7 +33,7 @@ L.extend(L.DomEvent, { } function onTouchEnd() { - if (doubleTap) { + if (doubleTap && !touch.cancelBubble) { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events var newTouch = {}, From b0b2070b3943abed46748b423c5ccbbf9ab7b1c0 Mon Sep 17 00:00:00 2001 From: "Dominik J. Otto" Date: Sat, 13 Jun 2015 17:59:14 +0200 Subject: [PATCH 1556/2207] No Border on a.leaflet-popup-close-button Removes any borders on the close button of popups if they where set for links in another css-stylesheet of the page. --- dist/leaflet.css | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/leaflet.css b/dist/leaflet.css index 929345dd01a..544d02bfaa4 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -458,6 +458,7 @@ top: 0; right: 0; padding: 4px 4px 0 0; + border: none; text-align: center; width: 18px; height: 14px; From 91682ab9d933a8c7754e35ab01b589fc10990386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 15 Jun 2015 11:49:50 +0200 Subject: [PATCH 1557/2207] Add Leaflet.Spain.WMS --- plugins.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 2dc6bc2c54a..e2b894528fa 100644 --- a/plugins.md +++ b/plugins.md @@ -150,11 +150,21 @@ Ready-to-go basemaps, with little or no configuration at all. L.TileLayer.Kartverket - Provides easy setup of the tile layers from Kartverket (The Norwegian Mapping Authority) + Provides easy setup of the tile layers from Kartverket (The Norwegian Mapping Authority) Kultur og naturreise / Atle Frenvik Sveen + + + Leaflet.Spain.WMS + + Provides easy setup for several Web Map Services (WMS) layers for Spain (PNOA, IGN base, Catastro, etc), from Spanish mapping agencies. + + Patricio Soriano + + + From 205959e9d33cbbc2cfb8494e985b6319e2e32473 Mon Sep 17 00:00:00 2001 From: kuzkok Date: Mon, 15 Jun 2015 17:29:39 +0500 Subject: [PATCH 1558/2207] Add WFST to plugins page --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index e2b894528fa..81bf59eec67 100644 --- a/plugins.md +++ b/plugins.md @@ -695,6 +695,15 @@ Load overlay data from third-party-services. See also [basemap providers](#basem Kr1 + + + Leaflet-WFST + + WFS client layer with transaction support + + Flexberry + + From bb2ec818d0014a4c77b307739891a1ca1d6b6593 Mon Sep 17 00:00:00 2001 From: kuzkok Date: Mon, 15 Jun 2015 17:52:43 +0500 Subject: [PATCH 1559/2207] Move Leaflet-WFST to overlay data formats section --- plugins.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins.md b/plugins.md index 81bf59eec67..506040fcd97 100644 --- a/plugins.md +++ b/plugins.md @@ -568,6 +568,15 @@ Load your own data from various GIS formats. Geolicious + + + Leaflet-WFST + + WFS client layer with transaction support + + Flexberry + + @@ -695,15 +704,6 @@ Load overlay data from third-party-services. See also [basemap providers](#basem Kr1 - - - Leaflet-WFST - - WFS client layer with transaction support - - Flexberry - - From 842f71730a9f6f2c3d1ff95914b81490f40d5493 Mon Sep 17 00:00:00 2001 From: zverev Date: Tue, 16 Jun 2015 09:49:53 +0300 Subject: [PATCH 1560/2207] add Leaflet-IconLayers --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index e2b894528fa..13f2f41e48e 100644 --- a/plugins.md +++ b/plugins.md @@ -1501,6 +1501,15 @@ The following plugins enhance or extend `L.Control.Layers`. Chris Calip + + + Leaflet-IconLayers + + Leaflet control that displays base layers as small icons (demo). + + Alexander Zverev + + From 6c96fef0d02c56c7d1344b6bd08ebd4659b5053a Mon Sep 17 00:00:00 2001 From: Tim Blakely Date: Thu, 18 Jun 2015 14:57:22 -0700 Subject: [PATCH 1561/2207] Fix up some missing dependencies --- build/deps.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/deps.js b/build/deps.js index 87d5934fe9e..b493e7dd8f1 100644 --- a/build/deps.js +++ b/build/deps.js @@ -144,7 +144,7 @@ var deps = { Canvas: { src: ['layer/vector/Canvas.js'], - deps: ['Path'], + deps: ['CircleMarker', 'Path', 'Polygon', 'Polyline'], desc: 'Canvas backend for vector layers.' }, @@ -185,6 +185,7 @@ var deps = { BoxZoom: { src: ['map/handler/Map.BoxZoom.js'], + deps: ['MouseZoom'], desc: 'Enables zooming to bounding box by shift-dragging the map.' }, From 93f4ba7f8e53debacd8f72c02256e225546d4b47 Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Fri, 19 Jun 2015 12:32:17 +0600 Subject: [PATCH 1562/2207] fix non-interactive vml layers --- src/layer/vector/SVG.VML.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/layer/vector/SVG.VML.js b/src/layer/vector/SVG.VML.js index 7099e776b26..e67ba579300 100644 --- a/src/layer/vector/SVG.VML.js +++ b/src/layer/vector/SVG.VML.js @@ -46,7 +46,10 @@ L.SVG.include(!L.Browser.vml ? {} : { _addPath: function (layer) { var container = layer._container; this._container.appendChild(container); - layer.addInteractiveTarget(container); + + if (layer.options.interactive) { + layer.addInteractiveTarget(container); + } }, _removePath: function (layer) { From 1f8d2a80723f9e0303bc9621dab69df03d65cc64 Mon Sep 17 00:00:00 2001 From: tolon Date: Sat, 20 Jun 2015 10:54:50 +0100 Subject: [PATCH 1563/2207] New GridLayer._getTilePixelBounds function to contain the logic that used to be in _update --- src/layer/tile/GridLayer.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 4ae8162a111..49c62ed2f70 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -413,6 +413,16 @@ L.GridLayer = L.Layer.extend({ this._pruneTiles(); }, + _getTiledPixelBounds: function (center, zoom, tileZoom) { + var map = this._map; + + var scale = map.getZoomScale(zoom, tileZoom), + pixelCenter = map.project(center, tileZoom).floor(), + halfSize = map.getSize().divideBy(scale * 2); + + return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); + }, + _update: function (center, zoom) { var map = this._map; @@ -425,13 +435,11 @@ L.GridLayer = L.Layer.extend({ if (tileZoom > this.options.maxZoom || tileZoom < this.options.minZoom) { return; } - var scale = this._map.getZoomScale(zoom, tileZoom), - pixelCenter = map.project(center, tileZoom).floor(), - halfSize = map.getSize().divideBy(scale * 2), - pixelBounds = new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)), - tileRange = this._pxBoundsToTileRange(pixelBounds), - tileCenter = tileRange.getCenter(), - queue = []; + var pixelBounds = this._getTiledPixelBounds(center, zoom, tileZoom); + + var tileRange = this._pxBoundsToTileRange(pixelBounds), + tileCenter = tileRange.getCenter(), + queue = []; for (var key in this._tiles) { this._tiles[key].current = false; From 310e893486891b603c5abad59b59af3400b13c31 Mon Sep 17 00:00:00 2001 From: Jonas Coch Date: Thu, 25 Jun 2015 22:35:49 +0200 Subject: [PATCH 1564/2207] Adds Leaflet.hotline plugin --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 773eff79185..f1369a88e6e 100644 --- a/plugins.md +++ b/plugins.md @@ -1309,6 +1309,15 @@ Most data is two-dimensional (latitude and longitude), but some data has more di Felix Bache + + + Leaflet.hotline + + A Leaflet plugin for drawing gradients along polylines. + + iosphere + + From 3d7d62d7b7c387d8ff03d79a44e13a77dc3561ee Mon Sep 17 00:00:00 2001 From: Rowan Winsemius Date: Sat, 27 Jun 2015 16:30:33 +1000 Subject: [PATCH 1565/2207] Fix for this issue https://github.com/Leaflet/Leaflet/issues/2771 --- src/control/Control.Layers.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 2ed054b1ec8..5e6f7b7330d 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -198,8 +198,13 @@ L.Control.Layers = L.Control.extend({ var name = document.createElement('span'); name.innerHTML = ' ' + obj.name; - label.appendChild(input); - label.appendChild(name); + // Helps from preventing layer control flicker when checkboxes are disabled + // https://github.com/Leaflet/Leaflet/issues/2771 + var holder = document.createElement('div'); + + label.appendChild(holder); + holder.appendChild(input); + holder.appendChild(name); var container = obj.overlay ? this._overlaysList : this._baseLayersList; container.appendChild(label); From 43da2c32a376a287e19b663691a4a010b3924a16 Mon Sep 17 00:00:00 2001 From: Rowan Winsemius Date: Mon, 29 Jun 2015 20:21:03 +1000 Subject: [PATCH 1566/2207] Add scroll handling for when the legend extends past the map height --- src/control/Control.Layers.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 5e6f7b7330d..430441d0ee5 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -248,6 +248,16 @@ L.Control.Layers = L.Control.extend({ _expand: function () { L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); + var getLegendDiv = document.getElementsByClassName('leaflet-control-layers-list')[0]; + var legendHeight = getLegendDiv.clientHeight; + var getMap = document.getElementById('map'); + var controlHeight = getMap.clientHeight - 40; + if (controlHeight < legendHeight) + { + getLegendDiv.style.height = controlHeight + 'px'; + getLegendDiv.style.overflowY = 'scroll'; + getLegendDiv.style.paddingRight = '10px'; + } }, _collapse: function () { From 60e56f7a5625ac5813ae39246d8f82ecc1bb8d53 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 22 Apr 2014 13:56:20 +0300 Subject: [PATCH 1567/2207] start alternative design --- _layouts/v2.html | 173 +++++++++++++++++ docs/css/main.css | 0 docs/css/normalize.css | 425 +++++++++++++++++++++++++++++++++++++++++ index-v2.md | 82 ++++++++ 4 files changed, 680 insertions(+) create mode 100644 _layouts/v2.html create mode 100644 docs/css/main.css create mode 100644 docs/css/normalize.css create mode 100644 index-v2.md diff --git a/_layouts/v2.html b/_layouts/v2.html new file mode 100644 index 00000000000..c88de23d179 --- /dev/null +++ b/_layouts/v2.html @@ -0,0 +1,173 @@ + + + + {% capture title %}{% if page.title %}{{ page.title }} - {% elsif post.title %}{{ post.title }} - {% endif %}{% endcapture %} + + {{ title }}Leaflet - a JavaScript library for interactive maps + + + + {% if title == '' %} + + + + + + + + {% endif %} + + + + {% capture root %}{% if page.root %}{{ page.root }}{% else %}{{ post.root }}{% endif %}{% endcapture %} + + + + + + + + + + + + + + + + {% if page.css %}{% endif %} + + + + +
        + +

        Leaflet

        +

        An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps

        + + + +{{ content }} + + +
        + + + + + + diff --git a/docs/css/main.css b/docs/css/main.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/css/normalize.css b/docs/css/normalize.css new file mode 100644 index 00000000000..08f895079ef --- /dev/null +++ b/docs/css/normalize.css @@ -0,0 +1,425 @@ +/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/index-v2.md b/index-v2.md new file mode 100644 index 00000000000..af505ef75e7 --- /dev/null +++ b/index-v2.md @@ -0,0 +1,82 @@ +--- +layout: v2 +--- + +

        November 18, 2013 — Leaflet 0.7 Release, MapBox & Plans for Future (Blog Post)

        + +Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. +It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. +Weighing just about 33 KB of JS, +it has all the [features][] most developers ever need for online maps. + +Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. +It works efficiently across all major desktop and mobile platforms out of the box, +taking advantage of HTML5 and CSS3 on modern browsers while still being accessible on older ones. +It can be extended with a huge amount of [plugins][], +has a beautiful, easy to use and [well-documented API][] +and a simple, readable [source code][] that is a joy to [contribute][] to. + +
        + +In this basic example, we create a map with tiles of our choice, add a marker and bind a popup with some text to it: + + // create a map in the "map" div, set the view to a given place and zoom + var map = L.map('map').setView([51.505, -0.09], 13); + + // add OpenStreetMap tile layer + L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(map); + + // add a marker, attach some popup content to it and show it + L.marker([51.5, -0.09]).addTo(map) + .bindPopup('A pretty CSS3 popup.
        Easily customizable.') + .openPopup(); + +Learn more with the [quick start guide](examples/quick-start.html), check out [other tutorials](examples.html), or head straight to the [API documentation](reference.html).
        +If you have any questions, take a look at the [FAQ](https://github.com/Leaflet/Leaflet/blob/master/FAQ.md) first. + + +## Getting Involved + +Third-party patches are absolutely essential on our quest to create the best mapping library that will ever exist. +However, they're not the only way to get involved with the development of Leaflet. +You can help the project tremendously by discovering and [reporting bugs][], [improving documentation][], +helping others on the [Leaflet forum](https://groups.google.com/forum/#!forum/leaflet-js) +and [GitHub issues](https://github.com/Leaflet/Leaflet/issues), +showing your support for your favorite feature suggestions on [Leaflet UserVoice page](http://leaflet.uservoice.com), +tweeting to [@LeafletJS](http://twitter.com/LeafletJS) +and spreading the word about Leaflet among your colleagues and friends. + +Check out the [contribution guide][contribute] for more information on getting involved with Leaflet development. + + [Vladimir Agafonkin]: http://agafonkin.com/en + [CloudMade]: http://cloudmade.com + [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors + [features]: features.html + [plugins]: plugins.html + [well-documented API]: reference.html "Leaflet API reference" + [source code]: https://github.com/Leaflet/Leaflet "Leaflet GitHub repository" + [hosted on GitHub]: http://github.com/Leaflet/Leaflet + [contribute]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md "A guide to contributing to Leaflet" + [reporting bugs]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md#reporting-bugs + [improving documentation]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md#improving-documentation + [@mourner]: http://github.com/mourner + [GitHub issues page]: http://github.com/Leaflet/Leaflet/issues + [Leaflet UserVoice page]: http://leaflet.uservoice.com + [@LeafletJS]: http://twitter.com/LeafletJS + [Leaflet mailing list]: https://groups.google.com/group/leaflet-js + + + From 925d764b4c5eae3b5ee1e1d596bdf2a4045d619c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 22 Apr 2014 15:05:11 +0300 Subject: [PATCH 1568/2207] first design pass --- _layouts/v2.html | 15 +++---- docs/css/main.css | 100 ++++++++++++++++++++++++++++++++++++++++++++ docs/css/screen.css | 12 ------ index-v2.md | 12 +++--- 4 files changed, 111 insertions(+), 28 deletions(-) diff --git a/_layouts/v2.html b/_layouts/v2.html index c88de23d179..77358f08d12 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -28,6 +28,8 @@ + + @@ -52,7 +54,7 @@

        Leaflet

        -

        An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps

        +

        An Open-Source JavaScript Library
        for Mobile-Friendly Interactive Maps

        {{ content }} diff --git a/docs/css/main.css b/docs/css/main.css index e69de29bb2d..978fbc4ed06 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -0,0 +1,100 @@ + +body { + font: 16px/1.5 'Helvetica Neue', Arial, Helvetica, sans-serif; + color: #333; + } + +.container { + width: 960px; + margin: 0 auto; +} + + +.container code, .container pre code { + font-family: "Consolas", "Menlo", "Lucida Console", "Courier New", monospace; + } +.container pre code { + padding: 10px 15px; + background: white; + color: #444; + } +.container pre { + box-shadow: 0 0 15px rgba(0,0,0,0.1); + border-radius: 5px; + border: 1px solid #ccc; + } + +h1 { + margin-top: 50px; + } +h1 a { + display: block; + height: 0; + padding-top: 73px; + width: 220px; + overflow: hidden; + background: url(../images/logo.png) 0 0 no-repeat; + margin: 0 auto; + margin-bottom: 8px; + text-decoration: none; + -webkit-transition: 0.8s all; + } +h1 a:hover, h1 a:focus { + -webkit-filter: hue-rotate(-70deg) saturate(1.5); + } +h3.tagline { + font-weight: 300; + font-size: 30px; + margin-top: -15px; + color: #777; + text-align: center; + margin-bottom: 40px; + } + +h2 { + margin-top: 40px; +} + + +.container .map { + border: 1px solid #ccc; +} +.container .map:focus { + border-color: #999; +} + + +h2, h3, .nav { + font-family: 'Open Sans', sans-serif; +} + + +.nav { + overflow: hidden; + list-style: none; + padding: 0; + text-align: center; + font-size: 22px; + margin-bottom: 50px; + } +.nav li { + display: inline; + padding: 10px; + font-weight: 300; + color: #999; + } +.nav li a { + font-weight: 400; + text-decoration: none; + color: #0b6; + } + +a { + color: #0b6; +} + + +.footer { + margin-top: 50px; + color: #777; +} diff --git a/docs/css/screen.css b/docs/css/screen.css index 1990837d746..7696a49c0a8 100644 --- a/docs/css/screen.css +++ b/docs/css/screen.css @@ -28,21 +28,9 @@ h1 a { margin-left: -10px; margin-bottom: 8px; text-decoration: none; - -webkit-transition: 0.8s all; - - /*-webkit-animation-duration: 2s; - -webkit-animation-delay: 15s; - -webkit-animation-name: autumn; - -webkit-animation-iteration-count: 2; - -webkit-animation-direction: alternate;*/ } -@-webkit-keyframes autumn { - from { -webkit-filter: none; } - to { -webkit-filter: hue-rotate(-70deg) saturate(1.5); } -} - h1 a:hover, h1 a:focus { -webkit-filter: hue-rotate(-70deg) saturate(1.5); } diff --git a/index-v2.md b/index-v2.md index af505ef75e7..1a97b7804e4 100644 --- a/index-v2.md +++ b/index-v2.md @@ -2,20 +2,19 @@ layout: v2 --- -

        November 18, 2013 — Leaflet 0.7 Release, MapBox & Plans for Future (Blog Post)

        - -Leaflet is a modern open-source JavaScript library for mobile-friendly interactive maps. +Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps. It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. Weighing just about 33 KB of JS, it has all the [features][] most developers ever need for online maps. Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. -It works efficiently across all major desktop and mobile platforms out of the box, -taking advantage of HTML5 and CSS3 on modern browsers while still being accessible on older ones. -It can be extended with a huge amount of [plugins][], +It works efficiently across all major desktop and mobile platforms, +can be extended with lots of [plugins][], has a beautiful, easy to use and [well-documented API][] and a simple, readable [source code][] that is a joy to [contribute][] to. +## Basic Example +
        In this basic example, we create a map with tiles of our choice, add a marker and bind a popup with some text to it: @@ -51,7 +50,6 @@ and spreading the word about Leaflet among your colleagues and friends. Check out the [contribution guide][contribute] for more information on getting involved with Leaflet development. [Vladimir Agafonkin]: http://agafonkin.com/en - [CloudMade]: http://cloudmade.com [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors [features]: features.html [plugins]: plugins.html From d7e0cb151a3468261c5e29cdda8e378022d3f913 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 22 Apr 2014 15:27:03 +0300 Subject: [PATCH 1569/2207] pass two --- docs/css/main.css | 7 +++++++ index-v2.md | 29 +++++++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 978fbc4ed06..2648d14ffa4 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -9,6 +9,9 @@ body { margin: 0 auto; } +p { + margin: 1.4em 0; + } .container code, .container pre code { font-family: "Consolas", "Menlo", "Lucida Console", "Courier New", monospace; @@ -56,6 +59,10 @@ h2 { } +.p-example { + margin-top: 40px; +} + .container .map { border: 1px solid #ccc; } diff --git a/index-v2.md b/index-v2.md index 1a97b7804e4..9a7c034ce91 100644 --- a/index-v2.md +++ b/index-v2.md @@ -2,8 +2,7 @@ layout: v2 --- -Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps. -It is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. +Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps, used by the world's biggest websites. Weighing just about 33 KB of JS, it has all the [features][] most developers ever need for online maps. @@ -15,22 +14,22 @@ and a simple, readable [source code][] that is a joy to [contribute][] to. ## Basic Example -
        +Let's create a map with tiles of our choice and add a marker with some text in a popup: -In this basic example, we create a map with tiles of our choice, add a marker and bind a popup with some text to it: +
        - // create a map in the "map" div, set the view to a given place and zoom - var map = L.map('map').setView([51.505, -0.09], 13); +
        + Learn more with the [quick start guide](examples/quick-start.html), check out [other tutorials](examples.html), or head straight to the [API documentation](reference.html).
        If you have any questions, take a look at the [FAQ](https://github.com/Leaflet/Leaflet/blob/master/FAQ.md) first. @@ -49,6 +48,8 @@ and spreading the word about Leaflet among your colleagues and friends. Check out the [contribution guide][contribute] for more information on getting involved with Leaflet development. +Leaflet is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. + [Vladimir Agafonkin]: http://agafonkin.com/en [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors [features]: features.html From 75466f41fb8a1813a25b2ed1c8c8b27c832e639c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 22 Apr 2014 16:51:21 +0300 Subject: [PATCH 1570/2207] pass three --- _layouts/v2.html | 10 +++-- docs/css/main.css | 32 ++++++++-------- docs/images/logo-800.png | Bin 0 -> 25298 bytes index-v2.html | 60 +++++++++++++++++++++++++++++ index-v2.md | 81 --------------------------------------- 5 files changed, 84 insertions(+), 99 deletions(-) create mode 100644 docs/images/logo-800.png create mode 100644 index-v2.html delete mode 100644 index-v2.md diff --git a/_layouts/v2.html b/_layouts/v2.html index 77358f08d12..5e38cf7de2d 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -51,13 +51,14 @@ +{% if page.title != nil %}
        +{% endif %} -

        Leaflet

        -

        An Open-Source JavaScript Library
        for Mobile-Friendly Interactive Maps

        +

        Leaflet

        +

        an open-source JavaScript library
        for mobile-friendly interactive maps

        +{% endif %} diff --git a/index-v2.md b/index-v2.md deleted file mode 100644 index 9a7c034ce91..00000000000 --- a/index-v2.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -layout: v2 ---- - -Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps, used by the world's biggest websites. -Weighing just about 33 KB of JS, -it has all the [features][] most developers ever need for online maps. - -Leaflet is designed with _simplicity_, _performance_ and _usability_ in mind. -It works efficiently across all major desktop and mobile platforms, -can be extended with lots of [plugins][], -has a beautiful, easy to use and [well-documented API][] -and a simple, readable [source code][] that is a joy to [contribute][] to. - -## Basic Example - -Let's create a map with tiles of our choice and add a marker with some text in a popup: - -
        - -
        - - -Learn more with the [quick start guide](examples/quick-start.html), check out [other tutorials](examples.html), or head straight to the [API documentation](reference.html).
        -If you have any questions, take a look at the [FAQ](https://github.com/Leaflet/Leaflet/blob/master/FAQ.md) first. - - -## Getting Involved - -Third-party patches are absolutely essential on our quest to create the best mapping library that will ever exist. -However, they're not the only way to get involved with the development of Leaflet. -You can help the project tremendously by discovering and [reporting bugs][], [improving documentation][], -helping others on the [Leaflet forum](https://groups.google.com/forum/#!forum/leaflet-js) -and [GitHub issues](https://github.com/Leaflet/Leaflet/issues), -showing your support for your favorite feature suggestions on [Leaflet UserVoice page](http://leaflet.uservoice.com), -tweeting to [@LeafletJS](http://twitter.com/LeafletJS) -and spreading the word about Leaflet among your colleagues and friends. - -Check out the [contribution guide][contribute] for more information on getting involved with Leaflet development. - -Leaflet is developed by [Vladimir Agafonkin][] with a team of dedicated [contributors][]. - - [Vladimir Agafonkin]: http://agafonkin.com/en - [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors - [features]: features.html - [plugins]: plugins.html - [well-documented API]: reference.html "Leaflet API reference" - [source code]: https://github.com/Leaflet/Leaflet "Leaflet GitHub repository" - [hosted on GitHub]: http://github.com/Leaflet/Leaflet - [contribute]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md "A guide to contributing to Leaflet" - [reporting bugs]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md#reporting-bugs - [improving documentation]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md#improving-documentation - [@mourner]: http://github.com/mourner - [GitHub issues page]: http://github.com/Leaflet/Leaflet/issues - [Leaflet UserVoice page]: http://leaflet.uservoice.com - [@LeafletJS]: http://twitter.com/LeafletJS - [Leaflet mailing list]: https://groups.google.com/group/leaflet-js - - - From d2d74d8d0422d063ae469890e9923d21233fda7b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 22 Apr 2014 17:29:42 +0300 Subject: [PATCH 1571/2207] add some logos --- docs/css/main.css | 29 +++++++++++++++++++++++++++-- index-v2.html | 15 +++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 3ee17806368..d0dc2f10f37 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -103,7 +103,32 @@ a { .usedby { - background: #eee; - height: 80px; + background: #f7f7f7; margin: 50px 0; + text-align: center; + padding: 5px 10px 10px; +} + +.logo { + opacity: 0.3; + padding-top: 55px; + overflow: hidden; + height: 0; + margin-right: 20px; + display: inline-block; + background: url(https://www.mapbox.com/home/home.png); +} +.logo:hover { + opacity: 1; } + +.logo-github { background-position: 50% -660px; width: 110px; } +.logo-wpost { background-position: 50% -720px; width: 170px; } +.logo-pinterest { background-position: 50% -1260px; width: 115px; } +.logo-foursquare { background-position: 50% -360px; width: 135px; } +.logo-500px { background-position: 50% -1200px; width: 65px; } +.logo-usatoday { background-position: 50% -420px; width: 100px; } +.logo-npr { background-position: 50% -600px; width: 120px; } +.logo-ftimes { background-position: 50% -780px; width: 145px; } +.logo-hipmunk { background-position: 50% -540px; width: 125px; } +.logo-nps { background-position: 50% -960px; width: 45px; padding-top: 60px;} diff --git a/index-v2.html b/index-v2.html index 5d7123e3953..c2edf46bd35 100644 --- a/index-v2.html +++ b/index-v2.html @@ -15,13 +15,24 @@ contribute to.

        -
        +
        -

        For this basic example, let's create a map with tiles of our choice and add a marker with some text in a popup:

        +

        A basic example: let's create a map with tiles of our choice and add a marker with some text in a popup:

        // create a map in the "map" div, set the view to some place and zoom
         var map = L.map('map').setView([51.505, -0.09], 13);
        
        From d482b24746b8c54ad79d802c086cc29827d8b970 Mon Sep 17 00:00:00 2001
        From: Vladimir Agafonkin 
        Date: Tue, 22 Apr 2014 23:54:27 +0300
        Subject: [PATCH 1572/2207] pass five, add features
        
        ---
         _layouts/v2.html  |   2 +-
         docs/css/main.css |  56 ++++++++++++++----
         index-v2.html     | 146 +++++++++++++++++++++++++++++++++++++++++++++-
         3 files changed, 189 insertions(+), 15 deletions(-)
        
        diff --git a/_layouts/v2.html b/_layouts/v2.html
        index 5e38cf7de2d..005938ba797 100644
        --- a/_layouts/v2.html
        +++ b/_layouts/v2.html
        @@ -75,7 +75,7 @@ 

        an open-source JavaScript library
        for mobile-friendly in
      • {% if page.title == 'Documentation' %} - API + Docs {% else %} Docs {% endif %} diff --git a/docs/css/main.css b/docs/css/main.css index d0dc2f10f37..1940daf6b91 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -6,7 +6,7 @@ body { .container { max-width: 920px; - padding: 0 20px; + padding: 0 30px; margin: 0 auto; } @@ -26,6 +26,7 @@ p { /*box-shadow: 0 0 15px rgba(0,0,0,0.1); border-radius: 5px;*/ border: 1px dotted #aaa; + box-shadow: 0 0 15px rgba(0,0,0,0.05); } h1 { @@ -49,13 +50,11 @@ h3.tagline { h2 { margin-top: 40px; + font-weight: 400; + font-size: 28px; } -.p-example { - margin-top: 40px; -} - .container .map { border: 1px solid #ccc; } @@ -72,7 +71,7 @@ h2, h3, .nav { .nav { overflow: hidden; list-style: none; - padding: 0; + padding: 0 30px; text-align: center; font-size: 24px; margin-bottom: 50px; @@ -81,18 +80,19 @@ h2, h3, .nav { display: inline; padding: 10px; font-weight: 300; + color: #999; } .nav li a { font-weight: 400; text-decoration: none; - color: #0b6; + color: #0b3; } .nav li a:hover { - text-decoration: underline; + color: #0d5; } a { - color: #0b6; + color: #0a6; } @@ -104,13 +104,14 @@ a { .usedby { background: #f7f7f7; - margin: 50px 0; + margin: 30px 0 50px; text-align: center; padding: 5px 10px 10px; + box-shadow: inset 0 0 25px rgba(0,0,0,0.05); } .logo { - opacity: 0.3; + opacity: 0.5; padding-top: 55px; overflow: hidden; height: 0; @@ -131,4 +132,35 @@ a { .logo-npr { background-position: 50% -600px; width: 120px; } .logo-ftimes { background-position: 50% -780px; width: 145px; } .logo-hipmunk { background-position: 50% -540px; width: 125px; } -.logo-nps { background-position: 50% -960px; width: 45px; padding-top: 60px;} +.logo-nps { background-position: 50% -960px; width: 45px; padding-top: 60px; position: relative; top: 5px;} + + + +.cf:before, +.cf:after { + content: " "; /* 1 */ + display: table; /* 2 */ +} + +.cf:after { + clear: both; +} + + +.features { + -webkit-column-count: 3; +} +.features ul { + padding-left: 1.2em; + margin: 0 0 1em; +} +.features h3 { + margin: 0.5em 0; +} +.features h4 { + margin: 0; +} + +.quiet { + color: #999; +} diff --git a/index-v2.html b/index-v2.html index c2edf46bd35..1d4c70457c1 100644 --- a/index-v2.html +++ b/index-v2.html @@ -47,9 +47,151 @@ .bindPopup('A pretty CSS3 popup. <br> Easily customizable.') .openPopup();
      • -Learn more with the quick start guide, check out other tutorials, +

        Learn more with the quick start guide, check out other tutorials, or head straight to the API documentation. -If you have any questions, take a look at the FAQ first. +If you have any questions, take a look at the FAQ first.

        + + +

        Features

        + +

        Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being easily extended by third-party plugins.

        + +
        +
        + +

        Available Map Layers

        + +
          +
        • Tile layers
        • +
        • Markers
        • +
        • Popups
        • +
        • Vector layers: polylines, polygons, circles, rectangles, circle markers
        • +
        • GeoJSON layers
        • +
        • Image overlays
        • +
        • WMS layers
        • +
        • Layer groups
        • +
        + + +

        Interaction Features

        + +

        General

        + +
          +
        • Drag panning with inertia
        • +
        + +

        On Desktop Browsers

        + +
          +
        • Scroll wheel zoom
        • +
        • Double click zoom
        • +
        • Zoom to area (shift-drag)
        • +
        • Keyboard navigation (with arrows and +/- keys)
        • +
        + + +

        On Mobile Browsers

        + +
          +
        • Multi-touch zoom (iOS, Android 4+, Win8)
        • +
        • Double tap zoom
        • +
        + +

        For Layers

        + +
          +
        • Various events: click (tap), mouseover, contextmenu, etc.
        • +
        • Marker dragging
        • +
        + + +
        + +
        + +

        Visual Features

        + +
          +
        • Zoom animation (for all layers, including tile layers, markers and vector layers)
        • +
        • Panning animation
        • +
        • Smooth continuous zoom on modern mobile devices
        • +
        • Tile and popup fade animation
        • +
        • Very nice default design for markers, popups and other map controls
        • +
        • Retina resolution support for tile layers and markers
        • +
        + + +

        Customization Features

        + +
          +
        • Pure CSS3 popups and controls for easy restyling
        • +
        • Image- and HTML-based markers
        • +
        • A simple interface for implementing custom map layers
        • +
        • The same for custom map controls
        • +
        • Custom map projections (with EPSG:4326, EPSG:3857 and EPSG:3395 out of the box)
        • +
        • Powerful OOP facilities for extending existing classes

          +
        + +

        Performance Features

        + +
          +
        • Hardware acceleration on iOS (and other modern browsers) makes it feel as smooth as native apps
        • +
        • Utilizing CSS3 features like Transitions, Transforms, requestAnimationFrame where possible to make panning and zooming really smooth
        • +
        • Smart polyline/polygon rendering with dynamic clipping and simplification makes it responsive even when displaying objects with thousands of points
        • +
        • Modular design and a build system allow you to reduce the library size by leaving out features you don't need
        • +
        • Tap delay elimination on mobile devices makes controls and layers respond to taps immediately
        • +
        + +
        + +
        + +

        Map Controls

        + +
          +
        • Zoom buttons
        • +
        • Attribution
        • +
        • Layer switcher
        • +
        • Scale
        • +
        + + +

        Browser Support

        + +

        On Desktop

        + +
          +
        • Chrome
        • +
        • Firefox
        • +
        • Safari 5+
        • +
        • Opera 12+
        • +
        • IE 7–11
        • +
        + +

        On Mobile

        + +
          +
        • Safari for iOS 3–7+
        • +
        • Android browser 2.2+, 3.1+, 4+
        • +
        • Chrome for Android 4+ and iOS
        • +
        • Firefox for Android
        • +
        • Other WebKit browsers (webOS, Blackberry 7+, etc.)
        • +
        • IE10/11 for Win8 devices
        • +
        + + +

        Misc

        + +
          +
        • Extremely lightweight — around 34 KB of gzipped JS code
        • +
        • No external dependencies
        • +
        • Keeps your JS environment clean — no global or native prototypes pollution
        • +
        +
        +
        + +

        If you find some feature really missing in Leaflet, please vote for it on the Leaflet UserVoice page.

      -

      On Mobile Browsers

      +

      Mobile Browsers

        -
      • Multi-touch zoom (iOS, Android 4+, Win8)
      • +
      • Pinch-zoom (iOS, Android 4+, Win8)
      • Double tap zoom
      @@ -113,9 +110,8 @@

      For Layers

      Visual Features

        -
      • Zoom animation (for all layers, including tile layers, markers and vector layers)
      • -
      • Panning animation
      • -
      • Smooth continuous zoom on modern mobile devices
      • +
      • Zoom and pan animation (for all layers, including tile layers, markers and vector layers)
      • +
      • Smooth pinch-zoom on modern mobile devices
      • Tile and popup fade animation
      • Very nice default design for markers, popups and other map controls
      • Retina resolution support for tile layers and markers
      • @@ -127,9 +123,8 @@

        Customization Features

        • Pure CSS3 popups and controls for easy restyling
        • Image- and HTML-based markers
        • -
        • A simple interface for implementing custom map layers
        • -
        • The same for custom map controls
        • -
        • Custom map projections (with EPSG:4326, EPSG:3857 and EPSG:3395 out of the box)
        • +
        • A simple interface for implementing custom map layers and controls
        • +
        • Custom map projections (with EPSG:3857/4326/3395 out of the box)
        • Powerful OOP facilities for extending existing classes

        @@ -137,7 +132,7 @@

        Performance Features

        • Hardware acceleration on iOS (and other modern browsers) makes it feel as smooth as native apps
        • -
        • Utilizing CSS3 features like Transitions, Transforms, requestAnimationFrame where possible to make panning and zooming really smooth
        • +
        • Utilizing CSS3 features like Transitions, Transforms, requestAnimationFrame to make panning and zooming really smooth
        • Smart polyline/polygon rendering with dynamic clipping and simplification makes it responsive even when displaying objects with thousands of points
        • Modular design and a build system allow you to reduce the library size by leaving out features you don't need
        • Tap delay elimination on mobile devices makes controls and layers respond to taps immediately
        • @@ -176,7 +171,6 @@

          On Mobile

        • Android browser 2.2+, 3.1+, 4+
        • Chrome for Android 4+ and iOS
        • Firefox for Android
        • -
        • Other WebKit browsers (webOS, Blackberry 7+, etc.)
        • IE10/11 for Win8 devices
        @@ -184,9 +178,8 @@

        On Mobile

        Misc

          -
        • Extremely lightweight — around 34 KB of gzipped JS code
        • +
        • Extremely lightweight — around 34 KB of gzipped JS code
        • No external dependencies
        • -
        • Keeps your JS environment clean — no global or native prototypes pollution
      From 42943745da2cb48ba7fd536d9eb6e0fea38dcd38 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 23 Apr 2014 09:44:26 +0300 Subject: [PATCH 1574/2207] twitter/github buttons --- _layouts/v2.html | 3 +++ docs/css/main.css | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/_layouts/v2.html b/_layouts/v2.html index 005938ba797..6faced6e614 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -118,6 +118,9 @@

      an open-source JavaScript library
      for mobile-friendly in {% endif %} + + + + + + - -View Source on GitHub -Official Leaflet forum + + + diff --git a/docs/css/main.css b/docs/css/main.css index 3f2f2e4c0bc..6851bf2000e 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -356,6 +356,7 @@ table.plugins td:first-child a { float: left; width: 160px; } + .map-col { width: 180px; border-right: 1px solid #ddd; @@ -373,6 +374,243 @@ table.plugins td:first-child a { margin-bottom: 25px; } +#toc .colborder { + padding-right: 14px; +} + +#toc .span-3 { + margin: 0; + padding-right: 3em; + width: 16.825%; + box-sizing: border-box; +} + +#toc .span-3.last { + padding-right: 0; +} + +#toc-copy { + display: none; +} + +#toc-copy div { + border: 0; + margin: 0; + padding: 0; + width: auto; + float: none; +} + +#toc-copy h4 { + margin: 0; + padding-bottom: .333em; +} + +#toc-copy ul { + display: none; + list-style: none; +} + +#toc-copy ul li { + white-space: nowrap; +} + +#toc-copy ul li a { + position: relative; + padding: .25em .5em 0; + z-index: 10; +} + +@media screen and (max-width: 1350px) { + #toc-copy { + display: block; + position: fixed; + top: 0.1em; + left: 0.25em; + width: 32px; + height: 32px; + opacity: 0; + cursor: pointer; + -webkit-transition: opacity .2s ease; + transition: opacity .2s ease; + } + + #toc-copy > div { display: none; } + + .scrolled #toc-copy { + opacity: 1; + background: white; + } + + #toc-copy.active { + background-color: white; + background-color: rgba(255, 255, 255, 0.9); + padding: 2em; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: scroll; + cursor: default; + box-sizing: border-box; + } + + #toc-copy:before, + #toc-copy:after { + content: ''; + position: absolute; + left: 5px; + width: 22px; + height: 14px; + border-top: 2px solid black; + cursor: pointer; + box-sizing: border-box; + -webkit-transition: -webkit-transform .25s ease; + transition: transform .25s ease; + } + + #toc-copy:before { + top: 9px; + border-bottom: 2px solid black; + } + + #toc-copy:after { + top: 15px; + } + + #toc-copy.active:before { + top: 5px; + left: 9px; + border-bottom: 0; + -webkit-transform: rotate(-135deg); + transform: rotate(-135deg); + } + + #toc-copy.active:after { + top: 13px; + left: 9px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + + #toc-copy.active div { display: block; } + + #toc-copy h4.active, #toc-copy h4:hover { + color: black; + cursor: pointer; + } + + #toc-copy h4.active + ul { + display: block; + padding: 0; + margin: 0 0 .5em; + } + + #toc-copy ul li a { padding: .25em 0; } +} + +@media screen and (min-width: 900px) and (max-width: 1350px) { + #toc-copy { + width: 40px; + height: 40px; + } + + #toc-copy.active { + padding: 2.5em; + } + + #toc-copy:before, + #toc-copy:after { + left: 8px; + } + + #toc-copy:before { top: 13px; } + + #toc-copy:after { top: 19px; } + + #toc-copy.active:before { + top: 7px; + left: 10px; + } + + #toc-copy.active:after { + top: 15px; + left: 10px; + } +} + +@media screen and (min-width: 1350px) and (min-height: 600px) { + #toc-copy { + display: block; + position: fixed; + top: 0; + left: 0; + width: auto; + height: auto; + padding: 2em; + opacity: 0; + transition: opacity .25s ease; + -webkit-transition: opacity .25s ease; + } + + #toc-copy:before { + content: 'Table of contents'; + display: block; + margin: -.25em 0 1em; + font-size: 75%; + font-weight: 300; + text-transform: uppercase; + } + + .scrolled #toc-copy { opacity: 1; } + + #toc-copy h4 { padding-right: 5em; } + + #toc-copy ul { + position: absolute; + left: 100%; + margin: -4.9em 0 0 -4.5em; + padding: 3em 6em 3em 0; + } + + #toc-copy h4:hover + ul, + #toc-copy ul:hover { + display: block; + } + + #toc-copy h4:hover + ul:before, + #toc-copy ul:hover:before { + content: ''; + position: absolute; + top: 3.775em; + right: 100%; + margin-right: .25em; + width: 1em; + height: 1em; + border-top: 2px solid #eee; + } + + #toc-copy h4:hover + ul:after, + #toc-copy ul:hover:after { + content: ''; + position: absolute; + z-index: -1; + top: -1000px; + bottom: -1000px; + left: 0; + right: 3em; + background: white; + background: rgba(255,255,255,0.9); + display: block; + } + + #toc-copy h4:hover, #toc-copy h4.hover { + color: black; + cursor: pointer; + } +} + +/* API docs - tables */ + .api-page table td { color: #666; } diff --git a/docs/js/docs.js b/docs/js/docs.js new file mode 100644 index 00000000000..7cfde99a74f --- /dev/null +++ b/docs/js/docs.js @@ -0,0 +1,52 @@ + +var tocCopy = document.createElement('div'); +tocCopy.id = 'toc-copy'; + +var toc = document.querySelector('.api-page #toc'); + +if (toc) { + tocCopy.innerHTML = toc.innerHTML; + document.getElementsByClassName('container')[0].appendChild(tocCopy); + + var menus = document.querySelectorAll('#toc-copy ul'); + + for (var i = 0; i < menus.length; i++) { + menus[i].addEventListener('mouseover', function() { + this.previousElementSibling.classList.add('hover') + }); + + menus[i].addEventListener('mouseout', function() { + this.previousElementSibling.classList.remove('hover') + }); + } + + var labels = document.querySelectorAll('#toc-copy h4'); + + for (var i = 0; i < labels.length; i++) { + labels[i].addEventListener('click', function() { + this.classList.toggle('active') + }); + } + + tocCopy.addEventListener('click', function(e) { + if (e.target.nodeName != 'H4') { + this.classList.toggle('active'); + } + }); + + var scrollPos = function scrollPos () { + var scroll = window.scrollY; + + if (scroll >= (toc.offsetHeight + toc.offsetTop)) { + document.body.classList.add('scrolled'); + } else { + document.body.classList.remove('scrolled'); + } + } + + scrollPos(); + + window.addEventListener('scroll', function(e) { + scrollPos(); + }); +} From 282ff1c41c88b744ce1b6cb194f6571dcb7860c6 Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Tue, 30 Jun 2015 22:41:49 +1000 Subject: [PATCH 1597/2207] Fix table row page anchor links on API docs page. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 4e86aaffbb5..497ad66b5d2 100644 --- a/reference.html +++ b/reference.html @@ -6381,7 +6381,7 @@

      version

      if (tds[j].cellIndex === 0) { tds[j].parentNode.id = id + '-' + (tds[j].textContent || tds[j].innerText).split('(')[0].toLowerCase(); tds[j].parentNode.onclick = function(e) { - if ((window.innerWidth / 2) - e.clientX > 460) window.location.hash = '#' + this.id; + window.location.hash = '#' + this.id; }; } } From 8de3fb569aaf468c0fa8e819f8730da962d11292 Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Tue, 30 Jun 2015 22:55:31 +1000 Subject: [PATCH 1598/2207] Tablet & Mobile responsive design. Responsive docs tables. --- docs/css/main.css | 176 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 172 insertions(+), 4 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 6851bf2000e..c838130baab 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -221,7 +221,7 @@ h3.tagline { } .container pre code { padding: .75em 1em; - background: white; + background: #ddd; color: #444; border-radius: 5px; } @@ -346,7 +346,7 @@ table.plugins td:first-child a { .plugins-page .toc-col { float: left; - width: 230px; + width: 25%; } @@ -674,8 +674,8 @@ tr:target { } .api-page h2[id]:before { - margin-left: -40px; - margin-top: 10px; + margin-left: -32px; + margin-top: 14px; } .api-page tr[id] td:first-child:before { @@ -694,3 +694,171 @@ tr:target { background-image: url(../images/sprite.svg); } } + +@media screen and (max-width: 767px) { + #toc .colborder { + padding: 0; + } + + .colborder { + margin: 0; + border: 0; + } + + #toc .toc-col { + width: 50%; + float: none; + display: inline-block; + margin: 0; + border: 0; + padding-right: .5em; + margin-right: -.25em; + vertical-align: top; + box-sizing: border-box; + } + + .toc-col.last-col { + clear: both; + } + + .container pre code { + word-wrap: break-word; + white-space: pre; + } + + table.plugins tbody tr { + display: block; + padding-bottom: 1em; + } + + table.plugins tbody tr td { + white-space: normal; + display: inline-block; + padding-bottom: 0; + } + + table.plugins tr:first-child { + padding-bottom: 0; + } + + table.plugins tr:first-child th { + display: block; + } + + table.plugins tr:first-child th ~ th { + display: none; + } + + table.plugins td:first-child { + display: block; + white-space: normal; + } + + .api-page table tbody tr { + display: block; + } + + .api-page table tbody tr th, + .api-page table tbody tr td { + display: inline-block; + background-color: transparent; + width: auto; + } + + .api-page table tr:first-child th ~ th { + display: none; + } + + .api-page table tbody tr th:nth-child(2), + .api-page table tbody tr th:nth-child(3) { + display: inline-block; + } + + .api-page table tr th:last-child { + display: none !important; + } + + .api-page table tbody tr td:last-child { + display: block; + border-top: thin dashed #ddd; + padding: 1em; + } + + .api-page table tbody tr td:last-child:before { + content: 'Description'; + display: block; + text-transform: uppercase; + font-size: 90%; + margin-bottom: .75em; + color: #666; + } + + td code { + word-break: break-word; + } +} + +@media screen and (max-width: 56em) { + .container { + padding: 0 2em 1.5em; + } + + .footer, .social-buttons { + text-align: center; + } + + .footer { + margin-top: 2em; + } + + .ext-links { + position: static; + margin: 0 auto 2em; + text-align: center; + clear: both; + } + + .ext-link { + display: inline-block; + vertical-align: middle; + margin: .25em; + } + + .features { -webkit-column-count: 2; } + + .api-page h2[id]:before { + } +} + +@media screen and (max-width: 500px) { + .nav { + font-size: 1.25em; + } + + h3.tagline { + font-size: 1.333em; + margin: 0 2em; + } + + .container { + padding: 0 1.5em 1.5em; + } + + .usedby { + padding-left: 0; + padding-right: 0; + } + + .features { -webkit-column-count: 1; } + + .example-img { + float: none; + display: block; + width: auto; + margin: 0 0 -.25em; + border: 0; + } + + .api-page h2[id] { text-indent: 24px; } + .api-page h2[id]:before { margin-left: -28px; } +} From 14a206631201d3575c452b12dd753d085e77d062 Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Tue, 30 Jun 2015 23:04:01 +1000 Subject: [PATCH 1599/2207] Update tutorial thumbnails and add missing tileLayer/attribution variables for examples. --- _layouts/v2.html | 5 +++++ docs/images/choropleth.png | Bin 7976 -> 186307 bytes docs/images/custom-icons.png | Bin 13104 -> 242204 bytes docs/images/geojson.png | Bin 30839 -> 125343 bytes docs/images/layers-control.png | Bin 6851 -> 147695 bytes docs/images/mobile.png | Bin 5640 -> 398367 bytes docs/images/quick-start.png | Bin 11051 -> 488661 bytes 7 files changed, 5 insertions(+) diff --git a/_layouts/v2.html b/_layouts/v2.html index 415dbad4ca6..a502f4296f7 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -46,6 +46,11 @@ CM_URL = 'http://{s}.tile.cloudmade.com/d4fc77ea4a63471cab2423e66626cbb6/{styleId}/256/{z}/{x}/{y}.png'; + MB_ATTR = 'Map data © OpenStreetMap contributors, ' + + 'CC-BY-SA, ' + + 'Imagery © Mapbox'; + MB_URL = 'http://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png'; + OSM_URL = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; OSM_ATTRIB = '© OpenStreetMap contributors'; diff --git a/docs/images/choropleth.png b/docs/images/choropleth.png index c61deff68a7845d74dfc6ca146a3847aeaafa4f2..89fca74b52f5586305983c1b77c7b5b0c28531bf 100644 GIT binary patch literal 186307 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⪙Hap0b7Hl!Qq)XR}z^1&3NmM$Rj*|)FVrBzyjI$HaOa;PBfX!Ee zhf&O?;iO>O^BAW&8nTj9k#hI}ECE*B@?Afl$-}B(ScYjCfNAjAHkj{WW3U;s%$Qlo z0X9g!cE;DKWiQkf!o{-$Y)+a=1 zoG3MK60sLD&a=-yZZuCd=Pg0*!9!{;)5UWbdQlQ!dX;yb@K1~nF|62j=hDbO4&!}P z$9&~*q;f(xG6IF>QXZnaXIaOk^yjW z3c2(^A1&L;L{&)<#|-s?Dp2OQnIMulo2lC&D-B-9#B4>e84{|ygEyR|MZKPyDM%Nq zWhUu3E(qZh8~6br7$aeuaT|P-!QKq)t!}J_*G|?!o+wT{$77ZWI0o>Iqk5O%D0b3D zD8qS4n1&vr3ti-3W1RMMqt1~Z5H`-}VJLGQcvxKKbN;%Q7?_x*$;h)((_ox^5jp!J z+22FeWtWsZj}$RS0Z z(IR=4czu0idK<|Mif!v<$7Zp2huFPC4)&`RkE?hIBSUP?G4c3m zF%3tf#an8g7sYRgOd6&k^4Wpk{%4|nqrGUk(a=QVDZyLNpa9b6iXwB@<#cp$u;DGL??3z?owgo6(FN#Lq}?EiseCY}S8~<5)2e z1++slmp}kg(Y;89Wh847m_Rm|H|POgiB~0X$@P_#0g}&3!!%9X%njrM*E3AcICFhp z3DS?^Hy(K55-KFaOvDGX7t`spMbF-&v_=kJ_zff2x>nrvZ94B{K64(K)J)^aaD+Cz zN==h3UO^VG;Bft2dt~QMvU{7@zDf4(mDxdpwJ8RSMM==%h@IrIXlceeW|_}lgaiu5 zsILAH%@_upe)grObL(DYb&b@H1C%MMXAg;Y$OE{?!z34U_6P$Ft}g_$&N$atc(T{q zlg$lg@@~NoJS?BWX$E&UW+-V4Mh(hMj@sHL>RZyt!5-4!Efv3+svau^g7lt)cRIgmcuN{ zEQW&`lqsMc>&qPPL6haTj}$|C5=Bz;zMpgbtQQ1Q#0{g$HshvYvXV*|4He)+$fJv3 zG`)A57AvaUL-ORb>^hd^TPzO8U?MBrtj8^C)F@4~@LmtUEPDLApyee( zdV1=R33yU{PGMg*pDwtrAH+-0y?Kf!=TaUQxwOA+HSzM)Fy%ON7fPf9p+-Cvw_+x@ zOzcNe#PiC+uvju~+7u~ z(38(1r=24UIitT@Y~L(4tr1a} z*;N4nlJr`PXw4>63?-hc0yqqDBp}GLb-Wzh=q5Al?Q&J&xn&P2K|sA|PO6iJZ6W8F zVFa#a#r(J+mM75aijcGr%(W}95h^b{=K2Q3>0+5Yrl`umn(O$Cqv(l~rUi&ckRb2D zCxp!y0w5F651JzuQbSA4;z~*JpWz^j$hj}~@{hTdF16JtGD*xLS=6*7hH6mSN;L^K z8L?^`E1xV3VWBPNG%$r11a7zQXGOdrW>#C6Q^Yt`Nt0`$T;@2&WaDnjcfnGhi!3-07#eMil5O7_faUku2A&Yrv;UyIg+BD7fTOMH`N2{K3 zSf(jD6BSl5;U~f$!u6kh*ni=1K6wV6KATKFiB4~0mMtH>hwSa3m;5blo=RG#Gx!0x z17^OrGuXO8Zhc+s+DbBMB77xMr%(c;WW39SWm!BXyb%3b{gTm}l(8qlP!z`kpC(gu z;c3K9%AP%2yeqW z4PR70lh1hzP1J>k`4}z6qe(kaV%P}qwr`SKUPtN_F#p^Hb56a0u6vm^PA;XxEE`}A zZ<$WcdYjA*lAe8H+eW$Z717fv2l|OqKt)V$mequeU!1AvloydrSjd7J0y^WRYMfMX z1;Z-=t*+yLb{SiG2Hx319(A*w0)VjK$%jO5myE?(RWt6%^s6kAirk)YfpPwyW4BkT zDtPi?Lezz8t|OclzTp;B-#+&XGQF#i&HzH?_3^lY%+Vs_$-tz(4cJ056!_*vbn65< za-?gQnW2~<3qlke1Ylr-&|*=V^@FSjD2K!hAJ7lLA5)XlOE>}?QKT$t6Xps57T$ot zMq$x1V^n6JC?#)X3?t%fBebLsqwAbm=`?5v8pCdFxNx|6ywo0SG}^Mx_67r|x8Qbr z01&xiV%9aSQCxu>?{S%ORYxCCZy;bMxI!A7H>IqUW!W0WM&T$%%f_(8*h9+)T;s@M zk#A9Yj*tV#V~QtJfie@`WDc4AQdt*2blqgh?K>F%aP(O@=4ba4W1#y@G*CkKL%MJT zhdt;I%8>z%u}7g?6>+Gsq{E^ZvJ|_}0@-=}0MWWuu&Kn$kCzb~+T4rqMGU)EO%_sg zB1x(HF;q1XGE5|?QVbSy`$;kypIKQANA!-s!)2znh0R#O+uls9WYH-j1HB!PAfrb*!kt~Q&-E9Oeu<&k^YmJM{;Y&v5Wn>LdsQuyx9opSAJI)6Et*2br` zk+a`{g*E$jNx%o2UlZFm5!WTYhvF2*!LE%XPi!Qiu8hKdIyOUf{z4UWV-`t@P+Lu5 zRuTxlWF=p6I#xj{5GE{3R@KnPmSE>r(cfdA{~o^dbeYQrYgdb>e}^1>RdvR+Hl{SN zNj!;kz=nyy*LTCBOc)fmpg0J*VD>;@G|#D-*4khi7}xzpVk6_C8R1!?b3!L#Z$tl*MnN5|iXYVHGh))> z`3MIugpT$>;bHL#vql&~WmAMBX;EHf=sDr}`09hB_=X|n9W_TgYyj4xC~8Ah^y09a zo%drM$tVD8$l1t|ZzvN#F7-eWx!>?cX}@y41+AOPW}V4roJQ;v+0!Bacn8>iGJUpu z?K#oDPO-ZmgQ(1?;HHEmbYZVlSrv{}S8RMyu6tQBQ&wjzogC;zKA2HQe#Cu|2SQye)WFiSStz8)ku|!inl#U# zmaVB!wNV#)c8K16w6EJ}Xd29BVSn7TEQ4m9!p4PX*fST;Ua-VSq-1p+Z=NEmYk~)V zNowkNLlb5*M38HoY@U989FR~xAFNpg7a|LJlF!hdy_k-&?4(FH<=ancSy|Uqhtgdd z@8c6f;|aTaAUyz{wl9=`7nMa@f_1@I7orpa@lS@qbPCj$n1L}Uw+(Kah8qMPikK1u z(*}rlY?JeV_T}BY@5c-yZlE6zj|~k=B2<71i-M>{=`gffY~~u$HFHeOei`ujB)8UvA z&;5L`MD#WK9}o9@&^JBo^V!cr5QM?@F_I`_Ux*lkbL_yEIi73B82E;aCJ{qN1Ow=S zB3i=^Ap@VcF5;(M5oVNBLy*|KHhAqtVse0+l$#SX;U58-vV}4hSNb}FxPxNN^WN*v zG1C%)(Wjp1;j^dt#OiD52nagI-|9s;YANDVEI@ z(qb##!T`T?@8Q*TZ~=MO-CNz*a^YpEs%jKcSh7MEa_~d4gCv`#13fSvRoh>h=XG07 zCMd@G0wq{#ScQy}`v2K`uP(ceD@`!mao43!I0A$rK!QeeBIQU*qDo#W(=C-*)zwc^ z{V?-3Yu1|8FVnxE*P3~mo|)BUTdM9VnJSeeQX(Z$Bt<9DlOPEYAUu#h^SWchOzenr z?magRkRU-Ylgz6Wn0d{)$Ha;K#opikK8>*|UaOr*BJ;*^Jf67%ETQj3+|qxUE+YE~CCiHeA0w(_0BSPlfat(tos*%ow$U(YQV|=zNw) zzq#R4lTz#tU75=g_wXR-GICZ-$Kj%U^AR$62<^Uem9IPZvYLJq-}og|8(V=2Qg!5E zn#D_cto9 z=2f)J_GGP$&Z-@-cx^~jl$JOh*+p;vqaKctvs3(~XJwec#3KcW8m|L9UQ6t{OW7aEam|#Vres8I4^y7Ku5fH3q(E`K2eDrNC6S9r-c?llr20co}e6y+SnDZoN+UQr^}Ul-c+w7+fUt9Dv{|ZW|w6jIyqL<56_} zRUWqK;V-M8fyz2o^QY9&U#ql>NI-Uf%#xz=Iag-r#BX$r=QAhuY6>^DmFp3xJFnjS zgCdh=0q?zQs%^oOb4pQM9`Pj=s~ z%>LwiD>HTcDUE^D>?urqRP0aw+0Kl5<59VI1}jDmJ%9)+g=neHzNFrMQc)kX8lKoc zaN?2{?9chvMAXH%eigfwV$EPSJ9|RDrJ+m*;{acO*T6i&lYD<>PGVX?^|66FrahxK ztIrS7`03`a zua&B4s}}xpz+{>`>|72IVQ7rr^%}r=*#ITd%D@0YqfPCH*GHp<@!RFq6H5f+84v_t7p&Nas8g5N);Mw8bgrQK&l-@ z5$A7DO(z-OJvQb!%zE)rDVqwvdc&O!&%bMOr$d02+Gl}OYhh#8{DtYp_Da3(Gc0%@ zJ<2>vg_Igid4L8WDLy2dN!1Er}$HUBRjKsX~UG4 zk>!43T)wr8F`AL!mU6W!Lcu`mRek%*NtL_PDX}6(*!mB#ZNi3jT%z~dP3g@Fv3zxG zW_OS&LxwksmJLm-U2Jrvr0gSjLya{5l3Y#__v;6C<~OfW%Ya3e+gfN-j}?SWuDMcw`ldgJfq4GoLu_!Iv{#Vtb;+I)je zS^lOHgMg_2?<<~Gf=bB6 z%coDzwAvaT5R?DcAjxwa&$Puhqqvi0`k5QXMz=K@ErW)6=8Z1*1U_ zrFJNg$xd_b)vJ>TwzT-F^1L}83ZeZS#5IT=W)RH(Tqk_v6BR%$NO z=OoU=xmI_&+nuOZGzL1~>NI1$8>Hv?WO}gR&QW=oOYT7tU@$sVI*tu=wbpyDVS!YJIaDdPhVZhbA0gLXOD6( z$68w}^Q_-Bl)+^_c>XX+H$?QIQU+Zu%ZQe?&zv>li@ojX@(rr;P+gl1qgLLrc)hcY zTJ2NIN)f#{O;ImrR6=;AUC~QJy-KW%hAG!xw<>tv$CgvUt0Mcc_d zN&>)RWF+vNl5j_Y)wI?<}UwA;hQDXDnjE5`xPT zg%)v|dRiWzzyLsU{my`~ss>%AS;!Xa`UH%PGU^6;xs@@dKrT`RaL|}0Yw~C+juuk4 z;b9N+1v+cH-5aqwy9?TI^^h|tZmA&oYAnVo9!xSqm;&8a}-y zITAwa`m9oGZ4)nRw_be(M_gHUh44|*sZc#zJ#Tt ze)QLBZc22PWVZ!6D=LQqc#uTAxegGoK(@;%H5P?Xs%B@!nRnQ2cO%CoU;bk>x=sG> zF}XNnBxmrdj2s=bbYM?8N1QV$=yiM9xBe1u-)-MXckTE09VSO#!cLWb>09)+d+qa! zVVH1EE%T$4Y_YSpe)hVtv58u>+375WVaSn&1$pc@aY#pzy%Q5R@7$@kAf$}abg>(f zW~&=_hdf7vhIX1Q#!1EjaL_^WGB(%^opF6Bd-@?zKVr1uxzMwXQN!0r3x#QB z^o{ewCuP2Nk1%0G1>%hB-Qb2tY)C2nNeypEhoih#8IH*2fC*t(Br08qqj~Uiq5;&N zKy9xA#-}P5@4l2*;$?wLpKFEJg&vk=K{i5P*ri4AE^*){SH1;hHpi6AN;<16G%MDb zbHCCY{Z)Chy2351EC1dr-CK3Jwfv>=o{svCi$`uCV|%e5sH}@shFw=}@MOiM&WS|S zW4C-6Z##@yiz@7hsZ)>;r%Zj6{4s#W7%<%JsuOP^4Q2GjtkmddzYYyek9?oM_FH64 zAXojY0QF_IYp=U=54-&nJsbm2W@yC!3p}l+PVecijLXa zhlg(2z1wAMq*gz2_AJl3%O>)XYIWcEgvKaF&5qWBK>utX9eLsGxporntyjl~oJy;G zq18^ZOn{m^A*G^%b$14^pkt^8;Ug4z7)3}e2pKBWfb5E*2vlHXzI0lQRVU@397CxK z_Drw|hteTmKf_Er6$qw*eljqvfiPj54j@j~9EK}_Yq-N2_Sxc+Dy0Nh4O!TfX*8k& zlfo?1-{oLjh}UiCJFVBvgH}7AI%*7W+xwvFx|5^h`%QJJ8HTg%_EH#@!b7Rd>LBD|i zy9{xKE1)8Sneit!t;9fl;i82yYzfpDRoz_b$#jW<@Qf9{la~Kt8jF>t5K;Bw32(uCWrOhO(d!B2g_HuK}^|!ZtfZ;iBCf`kH0349|6wON6_R;N8-3Ee(^*3YQ_~UYAQv<0cJ%jY6)DB>C*}EU*^ncJv%Q)#}W5L&umY7X5*%Wgv=4UH|Gb$Dyn@%jZ0Ng1L~M;~d;MG1OY9Jo4S_ z;yLB`dWXgA6q3It`ZLTCr;epR`$zZAPouHzIH=f-FiMAphUwB$W(YcYgNeaNU;|~1 z6dZyatW0VJB@(3wFG-a^1xi&w&6fyFIrIct&aNpTp)k|Pit7z_jRIbr$(rYQj5r2| zg(;tp^wX;DIjK+!&_%^nZn0xJcgdyd3pUycC1Nh-x{(gV4G(0gOb2&vky<2xHsk;+ z#QWhF(a$0PZHQSHRzD@LiD6knfq#z{q(kjZP$Mp710!Bnq=*wXn z-cl(N5Z^U#lKQeymr!5t3Fa}_g~Fc>Rkp!%LxRG~p4fcP1$Mpq7L?iW*9^uzg}e2Z zuae5Bcf`-q_8cUi{*wIp zKcZqC{87q+7D&bM@WhV%T3A-Ov0s8^gORCF@$lNfrcD2__8PKZh5jdY}>HS|^_lKQpcYE2`r|rYJ9IM?*p~^{_FO|jz=*{%O_owtXHLU0 z7SV-^<bpPo}Ap1%cUHu#k?V+@FNW`qyz!2XbI&%iQz3(Q>0*k-3y zJq>{UwYfCaQ8{r4wPv9O0prbE@KbvFOxtSdA}(nnX{qdya;DKed?#;6F&A_|DHV6Z0& zBOx@{sG_WxJ?rG)e2>t@IGO84LJ9-w zpnsd16qUG4?@UgZ(Qnc*dMQpAB|d|CRs*{ZwZ=!Pl*RerJ8>>MlPGIhVAEg-$1|xu z;qH*jDv&IL!cV3|Dph7KrUyTINXSeo1RYD^>dQTcroE^L0yJ`T$sgrR?TG(uwDErXm*y8!mlN%$X;Ft^$D0t**b|;hlBq{TpYP@0lJ(N zo@y>pN}-G*^_3A(n&f*pwjI}pRXU9sE~ndzE>l(p(Lb_-K7K=GmfcfK>H4sSJFP+dm}dNqC|+rC>`>c8_>K7OUd$;+?egz%Of!{ zgj}VZD)lEl8A={0>gZD@6c!ZHO++Nhw#t(ftFC?((<%jAB8-t&Dnu*^GrZ~4TnVY5 zscZ;4ke+}%zSCedAZ628L&k>D%j#65q&p*2Tjh;Tn*+h*%E-A(g1*X(I$lmtqyNYM z{^wiaY9n5}{tc=xScACRV0sLj>ijDx4Re{9thk?jRO+&RlZF(^*3W-|0@;olrBt}N{ zKlhy!LM?W?&~{X0aSTv^G|zawPBj44Kc|nYne&(oDEKYct+eX78Vn_o9;0mkO<>M| z@o254(M&UntdL#5W3AWBVlk19j5=6&7+hJq0*7X_I5~T@-w#zf7GUDoW0x}Gd^U{r z85pbh`lWW7aj6Q`m_c>SHE+6pFf*P_q~^MHml<~|LuD=Av`$HtjWfj)2fH;!YYug( z%v7?Fqzjo$!8sQhhXxICWunq~E+WpVl=&3!aio&@44zD&;7AM-g=;dzyiph4Rv|2) zm=)YE)psi6?D$CUVEE^!D@YBs!YLJ!s2My;MKA!Dx8NNx+tYyv3b3=wCt zfHJQFltFmYwf=7I3z2s@LSk37r{tNJ(COdd<~g+UV`TRo#0}KUF)X<<3!Ke`WAeR) za#E&dkI9)6q&kXs9wfKkqtT2!d9>$){h=Rky=#XRr~7ZlH-VX`#tQOtj)+WJ5U>i6j4+~}k57XuF`eb^v`2Rji;97@Cy_6R^6g^hx}ospEa04Zt!faDSm z=Z#`WHFZHISQXTd-b(xOI3{0_TLeJBA=IVBfk+Nz6MKNG%EWE7U|bxprOpt@S?Pn( z=hoDzCBia>c5UJjKqM7-Nph(HjsDkIR-x`x6wf7;QAeYeDx>-;Fa@&B0oC}<_;BLF z+G$k{RZ|ep6mLrnV%%W|TrI^$fik5MQc*E1fctE3;u| zRjXu+t=g||O_%a}U_&SyePk{~`8LaqA{Y{h*&ALLKX5_wZZ z{j!FynLsEg^v@lYi+9lNH^FgDUMHAiv;aO5u(>~HVyfPH8STCS-Fz2N)%G7o_%J|` z>2qrOtUC7&YA>Ps@X7hv`Bv8nv5F+X5{3gzeLWI@;G(z-LW6M6aDo+=YXR5{WGmEOXu&5H*H60>Q4M-g;3k z&Ec>Axh;?l*XyIT+Vs+bkg6YM`;F%q7sOH&VB`}VDYU4=sfIGZ(0~J>If%*E{iuh; zjNXh!K@OG@O|>=r=^Yv>Ge`0}s|a0}5Up2IY1Gw>6aAeYC8k`Z&zRKT8aM_BO1aiX zHp&?5vw2LJ$rxi32IV1Eb)2q9mlFLP^s8XAG(4Fd`G=r^!y=3dx3;Y*!2F81NSj0#Vh}! zS5K=o+in&BEpcsvjO@&Z-NG!&Qp7%DvxG6?QnRz_<)_h&x0C&c^-q36&cDO|@&8F@ z&MlrleIaOFTwK5!MMMT)j1nE`8;(C&sWj8%bi2bba;?Q_gpj^#8%9@GnxDQqY2JM; zz=%<-yMB*Xx(d>0@Pgaq^aYisnBnytR9-!DeK~Vh{^S2mAN(VF^Iht# zS4J^$Cw5DOXFKgo19T$>gICYpA><=8Nm0a5S1G_W2n{)?idVH9QAJrz0&%F|1}(3$ zE%SG~bXEg`Tqa~U%~~wgCnpwiDN0;MchxIZmu$wNW*W+E@3o=<_8m_dE)vE=T;#1#V4bQZ*v(IcnnT>i0aX&YMK-)o29Ou;WC;Mu@TaRnLUhh$WVbWks zEuH2s|Fd(?pIUJ_dhh|1wD_BkZWf|!FG%$?(-oJ=QL9XG@NR4SE zYD+Lis+zA6sxOGrzh7+C$;2eKO_)fijan<~nr>RVQImV5(OaL_MY8 z)!iA*a#(MTMFrn<8VrE>{P28JEq;O9`zP1%FrOl?{3{VLl&9(^{>og~jcfo{AVF$cV| z?PGj6dQN))zi9U-2<-%og?v`ME<1;kEfLR^AuqdcX?K zV~S-esYg+v^0N^NOub)JrUxnW8Z|s*M`g?KQRx`)83QQX)_E9FzydVW;pZW{T99ZuXwpnc@Z0rh#bJ4#fk&E*mQQQhP zL<+pY|Mj~f{#!J$Blw^HBOV#EuO~^;>c*hwp+oZs^@qKBz_$5*D&|?ea0#-STs_CKMaO0 zYAukBZAk@?jkt1Ow1OF@|K~QC;wWp1WGQ1l!5d6$P#>nqRJO$ZT0lnf?mYLx386vr zO`s-#c$A%dJbwF0)ol?CWEoXx%Y$j7KIFg))KcJ@GM4j19l#=Q7XPHHr1kI_&cS^yg;8G48Cw>Wj!WnoUsm<_N@bBR`;Axev7YaG7qZS|86tTXvnjh`xy;>kn$7F0=uDBVQIlCQr(a>^l%NfdU~YrmDx z{Su`yf=a|k1vcYBcxP{5WyRiKdrnSnBir{(x7(*KF488tVejPLL%ZyIHSDmz>>M4N zYPB+9*&wCRsv~)f)S^HgiR(<&l*j0vk+JJW$EcC3k(J6=r8?i~MrpcjXlS?s6`$dt z!u4cQsj9gd++HHCqqwkB1IC2~&*ebO<;SqT#9@d3$AbV|M4Etj)3~mP%G%W+Y z@#;Bc+=G$>ve4^Ep{XJPh*oj@Ub$INJyaTL1&um$;kHuK7x=G#LgPhBGZl4lZ3qa! zuE(m5Le$!C=<&1u<)iE;@0MpCOQq4})iyN%k(KI;Ddi1pSbk)M##h z(}W+TiLtv`v8hm@mH_f^4XZlR+pGEBXuXazdGeK$VJDfqer#md==PzZl#5Dn+7*Ze zV|?p9a%c?w^IzkoIiu_%&=rJ|^*xwg>8AYIU$8Wxci-0?-+6jr!FpL=9uqkPu~H+= z+Q>;L)lO4^goAO_aU8>{b_fX87`Bj7S7^v;*hMnt+;~HgfH6fB##{4a5mgGFlj`XV zGeR6JLXmX@$R_$a{K*^`Ds+i%Ce@>G_uhdO&O?>z$1l{=-^$-!cwwr+_>Tvhz*X^n zlX7xEkCE6ZR3ZM#vuJ4=2d4c`@cdq*K4!R_EM)6UT3|YaY1Pn*^sx06^webLMGxeY z;7>zDLVh!Tq^n+0x_Gfdcoi9o&0 zYRo@{ct`5%@9n_2KJY=+2FY-c_N)?TyCL-VJ}4ERMSKao_`FF%MpoG$nJDUEX9sA; zl!lL#izJ;xc7L47d~mUPxn&Vse%96vyFmh;88%1ekshgWCUgtSx7*!6c z454ki@!b!oXC5_oG5$dI3SYgWdpDaZCRUhGnL-m2=>D&wT0>?cYYLhwchV1r3^}^n zMyHSBy*HssO~?M}Rx9J2QEF2sK#x_RD}!Q*BB^IJIYO1IT!QO<;CWtWrgikWW3%Vx z58iXbO*Mab+mKr{E2UA|nr)5l8pV{T;c+!IPBfIU$(SPHb5+!(VNV6equbaQ|1H_R zhj*4P&RhuNh!NWyG`KiLg$xlcA_OJ2cPXzuseZ~}AfsU78PIiOF^7pqX~TClnsM~x zO2OYClX6)?U{!gTK0O$|8D{Q;3oGA4a<*?TTeYDDX0GP_QcA}3%Sog#E7Adky4WFE zmMSjOP(*Wy>?&{AqZJ3Vj&i@sBGqRhrCOF9$}cS#Q~({B0zp}CP;cDv@SyyJlw5MK z7kjf>8U#NDaC^osUJnf)R9CavCmMf(HmV)QcR zZB}1xe;f}HcS|5|!%Zamx;WmZKM*d^_#w9MZtMl>uKUr^SJ3Q*%~C0Qf6`R;v}8ns z5z@~et4uWl&*n~WrzMjF8@Hxb6g9(;60#gjf&4#4qYU{NxyUq$(F&L$g3ljeG)vOv zTq})|@}N5U%u&kN_#QL2K*cI=Y`OZ(RvidEpFa49#%^i8g1Y-O%~72r*mmAQf0#qtAgJoG?QiAyqj1{E07)p^}$?G*W3ZA09FrYqe!LkL9ezLRB5u8`Y@*>gTG?PV1$Qbk83SPktiaMc?qB>F~l!((O zvw!{@JU@-}M)Ye-3+lp2y!|@333#>)#b2H)1A~(W7&!MFi6z8_SNW8RQSvsT4@M<$J_Ee^45NDOwFw+1? z34Ima)iUlrHg8ySfAsBMTP22J?CEi2pI`?xpLm{u)stzlujE^Y|2n3t^OjV>MnI6q{;aVBIlPM6{|ppg0r94BCDI|Wk%hhUl8QIS=>A^WaRMUq-$ zM-Hahsm4QN8el?7%x*-X0SEFA8-?9E5DW_ZD=ajfzDvecDJ8c3yj{GCo8P9VqXB+c~cUM~xeoFUU3C zIq_?}G($f7Cy?k}_G)_p|MmxD*I|6i=U2o{%+9_HG|O;H%gP?95xt73=I^!o4?B6;B~r&xN=1q?AzUd7Pe?xQTtLaY=q!?NC$^N>AZz z30V8?F4%%BXxQNDIfK(PaJ0fftkD~yIrYCpn^RdR+Gq7CN9~iidL6X9mNLjHokeL2 zX;2cMMQmtre$GVql*|&HBEbFG+Bv;`2O0~W^ zqd7I15DO8|7$`x*p6A%)3_>3%ZAVZCHkvV#>jiHRjMU4wMRxLZ>%aXE^~6)oFhQR> zT>2E4SkZb-o<5e&%)0v?AS)8F`1GmtKmTWZV1MO5{%>?-2yt!|!1d;{Q_o|Wp3+U?O9PB!u83r{2>Y##aq85L)&b_3>llG z4}3-Z%ipLpg*v9btj$HFp$s5mwroUQ2Fesh9Ha+lMEEw638+DWsD`oE(}+-J;8U-b zaPk89NmvmclkU@>fC{PJ&G0me&Lc%sG003IFE#tjarP>3Wpd6dwoOAIFx8{~N{%rH z>#X#&;1`N)hqU@qkm7``MWXZCG8kyIB{_AOk~5+?k4foOSnY6YhNhyUC_a%tTg+Pe zgBtUrY)NJ>LaU%0Ku8!1*q`K#;1>rbeSKOC0SJj$bYDZtvCN@je>gCHC{gK@Oy`z$ zAnFs6d)J3YCG3w8xPbkW>ddq{eGG{X##>Nkqrn)0mWzUICIDs@;1buz>Bx2Y{x8lW zW0;IEy7s)R-Zz>IH??R+7XC8eC1h>^kUQ18Z5Qy?wmQ!;2wCb3xFQ;9{{b}}6?xUr zuMhWf<4TOx>w6}~_2OSW^N4)vA+B&-9a5k9()o6$6-7P8H#l{&D7X~2zG1m3pwluI zcy8A2j$Joi9|!s{kCWuFhm&*1`Q&bQ-vRe#qs!L|MZ`8aE46yo<0=dT`SR21;B9#S zVMfUQiHW5y^ir*DF=(DNz)k7pSgfIp)DtaubcKNyCPgjtD^y~<%i6VpXmPlk??oF6N^o!;f9YrssodI=n&h!9oK3&2(a&q zi&M_yKg4Ix^8FQh*Ii)CuCIQY%1$RceLDQruPNsI)Z6p_=|5r54eo!S_RX)u*E6PO zkEN%7i`{C!A4Ol0G}1vI`;IvFOL^)U;7#;kr@k@MF0EEjJexiH_cpnrdN)0faT<|r z*Y_|qIe4o&aI-k_0^k^Zvwz}2^xz+0&xguJ*|ebtWn>Y<<+5Abx{>yn#u7xh72#m` z+Eb)8hKD$B+W|4iTvWjdGAo>iaY*|KKrN`;riA;1R+W3rpa1^Ogm|AjuyimtXlCVx}@EI>Q>h&gcm z2T51V0mKYK0!M+xvc0wN5ggJGz#2sX4I+0tZn(-jC%Y|$5!xiQ-*?Ts+#K? zIq1im(y|=JtW!Z%6SaA!<}SiBk_eESP}cYOYTh6)$xyxC70>*V?%Jp01V{|m>nCSt9kcjeMJrDgBp_nb z$`WN#uk1|7P^f34fLDPa1+b8*P+iUw!7GRb4s$8>80i2MQP8%HO{+I1HhRb-JhDPkqSI2Xc1}sr_mvL`H!*!qC5d*Yc;pJO?ulsY^SBr0i z7&A^Ax8otEhIaAiz9Zx2R*h*RWi~Kq{C8W_t*GuSPP=N8rp@&1z)V*T=W>4f1J5l% z_62zGdOFpiO1c$Lhm%tAC=)_5MyX3}GCWJNG)ncWj_VM|h?o$fR&xnn*F&#yD^>cr zZ;+er(z9mu?71@w^ZUlemM!g7+(id(^B?%ykXNhBFD6-5I+JFp)q=c^j;qKiMPd-4 zVO7u5uf$&Tmo`Sp=1t@!rj$IY<&>dV7Er&DLt)Op20YYx#q73XS# za?0efm+=cv(0e`?XIV3f)~kud%<;-A{zAaaQgu^Nbp&TwuvntX4bmpTw_EXF9;g;UT}TpPoIdNeR|>Oi{MVs zZX?GbhUsO3xdGb7nFL09HH4&wiKQ`85?S8NW}mi6%ok+93E>hM`|6j?l|b$+IUQ*J$#N_}X8HqACF5 zS3)GAUb=ITD8+i+D7wusOVUcC63{?TU`nbi&cZe<{`{)%*L>o!oNT*p8y;28Hz-N> zA0`K&X;ClhxezyP-#%8W6-6d4PaWm2JSR>cb$|cgKJRi9gapT8Xr6Gl|>UJyPdw$l4nVEuaG= zj>kS!OTJ!iDW`BCsV@#?Zs6B@1efHEBYf&Ssd^yQ4KmYZEV6Q;O%R+Sr<77KLaca2 zuN*F%p3Gg*GrB@(ecUv)#zepDB~vCN8d})^mqg-`f08HOFnyF}Xmwio8=WdFy)@)4 zy3iR~fu{+qBzBYPVWR_C5u&T1jFGAag&qAP?Q!A(0JLlu@$x#&D#w7=dS*S_T;o%h zdBeNdy(`)OHMe}}yX(+J#MLUk>ptW_279K}y4YMA zt>;B0`SR29iJ!`a8KI}t!*}A{`z_q*rl|!jc}<)vD5UFUF10jZV_%H1UBkML6F8pU zVJQmP9!kANoumo#J;Qv+1@~CRr_~A(6&m;&(!p%4@KwJM{ks(tmBjq**Sv{c_df7- zzU%t8&Yqoawdl%)6D}3-&O&yCnCPVVy6Se9{32EU8Vxn3j^Sg! z#KQ;Wb5DwwpE8zkJr7CI2h+BWT)f0qBm*RJ#%OS;&=^V}V7MVOISr%k*#jv zt;ZEd{DM(cPK4n;lvDk6$L2C(Rua2adiz(=-g|&tLYz%!Cus?i;>^paGKueffDBIn zzwGY&v!8!o9(@JotPet6#?Dek?gA19SYw)0BvHZ~iYu<+2q?*A+=)S&vmRt=rolnp z!~3qgmZhWzZYBE;Ta0pQZmyH13ujL3c>87AZOPv~rdo@bI@qs}!*|)d{Zbe;Nt~wZVwuQyW7MK?TPk?Oxn3nxg6kdw18t02 z5!Emy%rpj6q`+?_J~-@anDJDIs^>O5U>`Y@RG2ef3EVWzGut251}3|nm4q^%Ik{bS z_o0WnKmHN)FHz@xoX06mj=bJ^=;zgY4y&o(s;G&sR*3-HlqkuT7SzxG3ra@iLWUhj z_0y12WeJQJLKLfM6o<077h0HQ?-rm>N>ZWzArN}8W0Ox2rALdD@mcCNPKO z?6nRxgR9kze*SS;6vWWW?4#$Q(xYUWB0?#HW6bA`1-(RtbJ<28Yf_-<5ZZe$b}OLv zySZ>oPl#2|4&g%j+&|EpzvSNi2k`9nJ?zi^7y0y~;;Em3rmf@PzRKDAd{KINYa>IF zmn|^Pl2ij1*LU5(6B)NuUkz^bGmh^#t^?i6WMJ%FS#nAPrdosC{wbT5pKZ7G7u>RA z=kSY<%V!?}Nf-_391n{OkMCjz?kMxNFiCpD+hk=7&(|}C*u5xh{kkX}tyOKuO(UM= z4?imF6?Ect5w(D>40@!DOrPU_|9_Eflj`L0iih>V=KAj?J)NtF_VF@TQN8D_MU^Jl z^{SqyAwrZS%b`r}Gt+B5G1mx$@)RVZ@Z}fdI5(lpncMahX^iRm=cwB)zEXI5hCwkf#4LqNbk-+sGDx`9ZTroy?Q)gvLgykHb>;F)u zM~aFUl2jtER@bAl`^e8b|NH|(k9W|Z63Aw#4_P>VM)CFuc&=YA$O&L=zANB z5(N!%^A~V^4}Rr&`PNJQ%Lkp6b0)P(uv0#yDUnu|*q9$s?*MkkijNY+b|K%# z;R#q}s7fx3VC1aT7Mi)n0Vf|%o1j6amsznbg3x<{iC!@Sr3>ecai$H$z;Irm7He*i z%UNKM60?0D8~KP;ai`>F%9{-3mn^;^%<5AwPd&#gqwMhg@T%+4&wYdLIlv$OA7bjP zBBYFF-ba*K>akR$4{!w+`iDA{xh&FwE#;WzdURkxNA-MVCNlU-UfD!mU>W2GxB+ck z3FnL5?yb9aHUf=DK9#-mnkux9rNZR;8^|{Bl8m!#zSG7%%RbYUkA*R4@ldX_B6Af* z{T3e-WjqU;*ojxka}VoLFB!3nObwMNWg0=K&YWt^=-(?NHB_{nzkj@?&S zZhP`q`GCcn<~K^{C+hyN@9Be| z?nH6B8|$lYd75T!VHoNIdZ|6#4cl4j5L|I84ppSreVrF#5Z<(l@7~Blz5XvlCeedN zr96D}7i#W=QxDRkZ>l6kIk9P=!R;y>dC8z#;~4MbcQpRuPx1Uw@tTkeXWx4o9ruzc zdiSZqI}XuLehUUgZB(8+VFa#BR+vzA>Mi-gQ{?tfD3R$OXbUKas0_KIn1_081E89X z5r1dC^T{*@R^15JKgb8RuRDpbhmxZMjnG?^XNJ@%tb_(-)UO9#;1Wu~b_1H#w=VxRyj(g|XKnt%KZ&J_?j2vl zf#JIDKTN;yhw6L(pNzX8SbNQiO+Ec7J!X{5;!NuB?>V;H14ml>TuHjBQigOu?!hsU} ztGjw}Nujwk8#tt@mpdMyuq#i!Etw9yR24S2fZ6l}4bUH({DUM$^hyYMjTj#`#WJ=H z8L#g!O*6qSe;z52nGJE`%H#6%zFF3pR`dFp3(UGZJ`ABW$UvE^~=qcOwqK zFJJFiizw4{txq|?J)CoxmCf6HIEfHoT;x_qhw2U9d?N0?`XV>|{cvNxuLlfHTS%W} zwrx9{-fg!~?8;~UPA09Z*XRIXi7>~g@VVHp>M2OI7K^eXQSFZUm%jxysoU?s%vW)q z>@*zk+PyFU^-ns3Lm$INftUC>>kYAS%+C`ZiLC&0?H)v>bF%Xa z#yiBx7iD{96Ew&aam40h(lCj;k>I>%mumU&8sEg-L}+|tM9v^%oN*#R;P$o7Ik{%*=2pi6!Vm=7oT8RjRgAy=(Ac608Ev%s{$<^(E$f5p6ERW=IN>L$BU`(VucmoN;?J%Uw+jFPYGcsCx1pJ{-c zojI3RxAM5wJ%WAL@?(tmoR6X=rtdyV3=C-~u)1XOpr!jL*VD&{QRyt`dvfA zUgQf1OQeEkOJ?NW5Ujvb2M}=@Wm8XMIYq(%`MV)EQ~GvD`|IxmUEVE_acv+tq?dX7 zoH+6*I{yx-_%Mh!_;RCgawo>RHf(m|Zag$OG+sN1c z9BxZQx9ffGoEk;HuV85y2p0TbObID3c;-$N>U`tOlj z-AmW>0g;>pbmV5|)A#W=ekD&mwRxHgtp$V3k}L@`J#v`q^g5Ju_z{^@Trtmaeb=UH z+`#n$PjIdm*%VgTWTO`|`%3bppHJAtz`3_H$Fv$q9WP#gNY1_OTz>~Sd>5*WLgwS& z{!e7zP2#a1$%ScHli~MkM|vkx=p}f@4NL*~Un4eS8kdBE>Jp=AnCb!JSAFKv+%e!? ze=lKbeoDOY0=?@#tmja{#WRn{xhc%dGEt)##wuU>c5v%GtyVi}ca$uV)ku)5-~%_SVT73FY?`3c$B+`(VVAlJSB>m&Mdw{+FFu_PO*E^G*;bpbCzGKM!m~no z>uP>3l3SwcIywfDI1J*D9sm!+l;-Y9PGQELGzrjz_oF5 zICB#e*&Bu@M;c~XamYgo786pYhjd3i`k#a z>YZ%#4rJVmU_EUmdbS?dX7uPg+#R9*Hkf5^yr0h>Q>}{#(+zvy4fG=!jWXyiiL<1e z7z(gH3~HUAK2KmGvObv=LdhvMzmRLQ3YU%g>u%K|36 z5#}(Baf5o`=$$D#Sb!g^pKJt1lU!*)h zDx4SVHm65H`4sgt+%RW?Ntz$joWQ`oEbD&nd*L(B7#Upre$(*#-BZ@)XVAR0N7}vY z*Ow=me4nMzi`raA7)qHQ_Uri?{;8j<=`(r>v7GiMC0fzPYnrj6Q+*RrOT4n{hJ1xd z!S^ygj^ts0GJ2sw+@eOc^|)rCrf{FpfkgjomW7Aus@6fLI#h+FbDTD37WEY6RlM4$ zURyBKn{+TR8?7TC@HZ7AWb?>$YH%NQ<@5ht$quS*+ps9}-6v`E5&2bl?!`rRkX>k(pSR-N>rs@@qCxMj4<2aq8uH}b_@f2@%2onG|+*z zCXeOO)J}fy8UUNJrhMahar9-&(@WPaoh7NSF?-tYTdGWY2jDhJML@jz17vxK;rdYEM6Wn&S-n zoh< zYb;>BP@?0IUP<$eCt-pqt_|0Sc{29^H9gy0q)9i%CXqvoPykYBqqA!D4b2!EohC?ilk>(8wskL;yFS}kuJ#$dUGs6<~ zmD!{qV>{U18|_D?TdfRq{Y$AI+l*Z?lW&hDV`v6aD%Wui@7gu8dl#BJC0~6uFGZFe zN!Q+6{C-X=1?gMqI04zMk3Zmi`A=@rQF3bP#Pqbhg!h9Q?B?etBSlon)?hgb5hnlY z5j-4tBY{6;PzWy&;W7j5azyVn1KSx;j~k^pdTp}SeY;%qS9O?iz6Tp3)lbXvAZQ6dpb zuaNp-jM`vjxz!;1K@a&&5gUoIHO@(SjL~|P43R9&=FZGV&B*mV4PG2rl@a59tnXTx zCTSXHe$96R*XX=&hU3){t~QQ8@fUbxH%j9V6UZMRq3W2-T-Cn7pZzN``&oL+m#|mG zeib!FL0+%9fJAonD{H1Zx$wO=PzFihcUr;mlBzEj78uB@NtRfy3#Z6|!($^w5)K`4!3-PI=sJ#f?vv}i7Ec)nfq4z#WZob<-7q~7e z%of%)R#={LS?d<)707Cyx1&}a@?Fz&w9YT+;~^ubmlt9r%BjH^A^c&9OV*u2rb3T% z&#idX3U!&=?JoZI@z(4GP=BVtBfQqpz+zLzk|S?5|L!~W`}dQjS5?xz;*MH&@u9ZN-Xv}CRgN@}IPk7jll5Wf#=2d-4scFQP z8~ak^(H5$H)v^9UchlYZe{hd6ws3O#@eou{E|KgDE|$6sSPFuIf7D6~E!RjF6lnQ+5|xEvHh>)|B5#ADF9k}1NfhitEJfMumPFnMFz48-Yt+J!LK_#&^rmK`N+~!`qEurN z4Nx?)5kiWTyMc=)7^f9gj5!mZvjHV3JQpGyzV&qw@iF=$U z>*dS{tuR(`^y0?q;N{A^Yk`-%+DvZNKwX7sa% z#nd_ISGwjvt)Kmbnh&Xd`HTL???SEZB5tag6A+u$dB5e7zEpOX__3$yL8=x*@#Mqu z*lQ|@v4aTk`Y9T$X_kBoOv(ATzoI-vpZjJ{SQ7P|u`l-kUNIg01gY*tGB!U8Tj1iF zj`ggi_!4F#sJn>5)+R}$77|)QrePY1$PPHicPhhGN=V#|dBin>0r`1?DJ5Rba|4gL zAY1@AMymG|54RrgW8Oxu;`PKM<M&AJnQumH(qx$@A0gAN{w5um8n)x3bu5f)kGIV^yVH1W9-} zVCXLFCsA;b62p*;$^L)#-m^=R<2)0MHzLxMZSQ*=#?N2|mLNd^pc6nNN~AK?zunVeq5b%@7dkEcUNXbu0*Z`3IrWMfFuYKjwCQM00!fIPy6nwE|WIQ zjfl*uu68p$gTZvQ(1iw2l~t7$nHd@H^Sb9TG{>wFAA?kOQnz?(^+#z*nYC!f5WqBp zCz~!GbO+-xN$Yr$NvAI1q3|X=@BArpWQWz)>%IK4|I&}ywJZ8$sgu@}%RordyUjXyFWOy^CtpWAOs&SUwu2R`fs7f9?trI$ z7j^f*LaBAf^cE+-x?y8|NPyAS<1WG(E_0|lChM~}ZRBrrr`>=VE-=A%#>(h>(vlBB-Gq?C)fn|6-NEOM~owDbW0ZDQ%V^&*V47FZ|sEk1W4KK_0C zW51^f=(~F9Q@=SvDIux%0ELUZKmv zczMQ0ffykv!F~C>GP(=C&!tR=yc>mkM%+L_nLrr%0+SGziwwrH(L1ehOu@EYLYQ`9 zGv)$HH@7gEd#udXH^SPnF~pjTYPyE9zF-o&h3 z`<#z{ESpBN=%}gdd8)dD3f4fVdXF@N-t|ruROjxAzW{LN}kA zm9DFcN*F^eecGGyAp|%se)tn;bdRf!FXZD3)g|znAZ@}c0^1aIP-$UkQB_n{Jz{)p ze!dgS?98})`*j@>-{`>VV*LRNA(OLzlXQ!qZ=KxE}P1J{r+04PAp@EJL zbxEfd7Ou?B&edw_`H~haYG`%%DmotA+}$0HGnmgPG$XexNDHRX1dldWOCPVwLSF~% zr|d8Opz=3BnPG1|LytTuXD^}p=41Q4jhIIg8q}AHY7#Gg z`UPC*#XBB^$*Z~v|4V<0x_c30^1^9;{O6KINiFbZDSTR@;iRBU&j8wWFqzK_p4XE3 zOu3FVGqu9(9R%e;cZG^n$uiYV#Mlpm`ak_Q>)Z+CWS}7}4tM>CTI0FEV-zz~?1YCN zha-s#bpSmVWnk?xTjNk+H}im<$(U z99zWJ7MX4v?fO6e5ATH+YTtR5mrB@iKcKkdEew~(ba2=`dS7~euAh*lD{AdqXK-;z z(VMzEay=>2rk3cdwSN2NN2hBK%+dpmUME;Dlrbz%Qu&$%6H2EE3&{P#H-l}*no{NJFHp}A9ytoxE?J&Hg#PQEj!pSV{ZP=2`Rv5E zsawQDJK>9e1j7y0w*B|Z(9>v!+M6iW28(b_%e27WBe+9T!qmcWrdDgNiH-D&c|riW zAhQV*Tv7y)a=O_R@9696e)Ka~#BA)6l&z`Bjkz&3CqnNq`RJ!%-%;r5ODeT}tz;GH zAfuE7K;f0q?ruMhr!Snzy!T6a|3|gtu)$#p&EPM39jSpix@>EWcMP; z4X@1BW9xCpEaIkbQPND4Hs1SjwCw@pc1SCOK0Fd-&Fe>~tk1GHz7B&2@xWe!8c>E( zeE*~T+}nBq!gy0&+*}9Vb2!P7%~q>^7~&NK`4EHjxU>LKvdqgy%!ISXpjGWj5Yp+yn*=t)N^(OBW%y z*;|_fjtPcxgZR*AAyYt+k3Iy_@k@FN7Bfwj^ykEx7scf_wYcW)NAb{J{h3_{$iDmd z@mE{15os6mfN}~=svm}*|7jcLiRO_-K?qZ}BC`k$C zk>esKgQ^Q?kvi_~9#JEV#JJ>~XU(>l^NR0JmP*&lWd$}YOb!kYHE|4zBjS6?lF6&* zOg+Ac&b>{Z_+owA-qT*Nh+{ye$Ez%^FcmYfgjb#m5p$u=9!^qnCc%Pls6w?^eXO}i zsOzes5t(XiC3O$F_a}-Y!TGY8d3&)LBLgRmxI$BPLaq$_yq}h0wj7t1C= zsHoA0ohv{_ue{3Mm+EzFaLg(h(AF9;NTEtIXOZ@QYGEdsHgVtOqiKRCQvu_3^7(yW+TP9gJ&E}!0zjbUz3vd$LPCgF5mDvSKT`G)}lsZpdZGmQDn3$@4|9dhDp}}6bvCACp?Ss+7`fvPQ@y6Ftd~*S& z)*Hagd=OI?U}pvFoOu05a_Xuymk-u)KN=9&a*y&^8YcJLhKXP_vCSnY)G-FYsyQEeBQ2Q(GN=YC8eD@Pyh$DVt?3y2j79m6z z1ZjiaUo6}+(4X4;YZutJ{#s64)sdveQET*}z>1sc-FNu0dymc|a_ah+j?JXeRG}Sg zg>6ER)JXiv6?p14E&`=t;GexZHa}mYl-RZ=cVJBSi52pN(b1uUpdjdPqdybbGma!gNEKFi|(115;?mqEwm9IEs{oCF+aR5`xEZ zthdPW27ZBeO&q}<>(K*OWRE?t(40j1Ep z8+vxgiIcZR%OcdN#_`2>K+&WlG88@VW z+N%G&DX0g^Yopd$gTc~YrX=jP_r z_dVZdj28<9Em5RvO0=kC5JecUo3S}hehMkrq96#hEVW&IJqkiXu z*<<3=TME!@CU#9DAxR(qLf7{F-8Fx7(^pyKqMMmS3o_B7qJ}7s zNyHMmjyrR(3Or@9xxsAd=zqGV!BqV_4amUb9uo- zg*ljD^Rp#Nt^R&}u;sZ~g@iggi|VCR5J%x1ffp*Zdfh8_6!WgBCTRp!ctFn^ag46wF2bRIE^eQ?Rr-ZwQ6@C zWOW~G%$TpBjG4d|Ci{nnw08F^&*2|Et?6X2rEtvhm8Pk{<<(K8lst89J7v@}jZsM9 zIbUcrleAX4!7X(NB{rz3t-L+cv%(=7W zg>pWdt5&Pm#;$i13kssmm&%e$g+F{hn4FxNn4HXJGWB|Wd}6XtEP@aV3l%~v#`xIv z>roU94GgL0<#L&G=4RZ^C{`D3dS-g;+BM6z6y}+no*5k;9_a6hLiJ8WDP8R>w@eUN z+O18k57rR~5$`LK#!qO@np>;P?2`pKyic+Z^f_#9n4sE^lR`!#h0Cmyx zeK4>OU3l#Vp;p;~MxlQnYBnxSUI(3QT2zu>&mxoFT7*D%e;V+^4nnuf_6u@L1?+B{ zN^JGe{5`0Eshwr7PodiMCSd#h5E*k!<0@3gk+TQY#_ec95`sv(+#@SBO;!aWcNiNR z3JAnJIrSdil`@^vLMKImo}uJbH3(uYb%rRw{-MELeWuj+&;!w1KbPg%8xkV{ViBsOqQZ`{>RO0^ zrJUZDOxmySTmVxyh((bfM!xI1VW=<|=eh_c4g>GZ>C+c4UGC^8f`1 zBaWhSskCGJb~Uu|@d>qEL5RNI-szc{i*&-Lq?FrBYLXNpdkfIG}|dWt7TJ-JlI!uGTo7R38&0A{os^ z%$EwpkURk!L9EkoEe#$d@s32jE-DLc63bLeU3BhTbn1+A-w{MC+_#rsd}BS%9#Dtw zdIZwOrAcw(HBHax+K3j+_bDBxGh+FG|wh3m#Znbi40(AkHtmGSKHLcY*f zspb#}*aSr3X}@eP4;^VwaxL(c;kOrkacJmFnyd;+=qco)PL6qE2>Z405ax_uK8vQu z!FFz+TIK!DTA>vS2Zx(bCX8b>>g_!}JNwd>B{4mr8_h6YmBg>f9H?uAtL3Bu)Uhnv zqH)M|#fpM-mT9exK{h#UlQtq)e8~0H$hT7DB@fN6XL_Y|9~s6oGqcyn#|Qd)_U_%| z*iN-tt<~$k=PPWrecR~1eS3l+x;Az_<2ZZw?C$LBP~V*|mBJvv8FzSSc-yuSwd?-= zJ^);)RMd^!-P5ITOn=`1kNMTBXILB`+JA6pU_kxKbXR9Ac&S`ba{zM^N4j6CSp$wu zk&tf7H?v!Ctu53#ew|UWbUCjsC?c2#JeZ5sJDCC3$`Wqyz2;1A^r%9kfnU@r3eB`d zQGtf4m`%>sU-*%=Z!dN=l@vlZQbkQ~5w1frFnBn*sN%#Ms5F6Wx_+)m+4@ZC4Gs`Fp_t^ltuTu(EjHp(F23d9%RZ&lm)E^p{6{% z5A5GNG_qX^Hdv`BEE5EN#&t)xjrI==Ub=W`etvG>zTG?S(VTvLelTBJs8%YrWepDx z_4f6KVK6YzuYSYRS)%(fZF`<6fA3XuA`i0Ldgy0n5334BRfBW921h6ofhxB0XWrd zSm$9avTqwk16e7j+pWAVm(hWhbwC-duE8T-zd+m}Kn#frY?xcIWkuzdjcf~SX*j@+ zPqUv~W#>yG;?g3-vB_%jjt@PWX;67y_t`&2$nJ#0&Sq#FP=+(#0Uf$+Gv>S&hImyU zL%G&9W41d1S<6|slE_3Mlg+sq~7$TpFfX(?I}4uKK%NN zgAac)xBoyo)bcEU?wev}98r5+yPCMdPahNej!t=jA4Q9*&C&#@_$td3lQI^9VsaZ$ zKVim8pkWfAQU6+&r2tLcug7tqHq<@e^E|3M$rQ?BERH}6NZAUc_(9FK+`#wi^_q~H zYOphb`&6~%vFkUu~zfd#$3KgrNwHTdogFqz1R8+ zi(t#ZIF0Fa0+H!1>!nc{p0X*Xh}X(syFg)8l0Y4P(lbfMEIxBi3f?Ys#zv=wEqL)< z$vOBX;uq1>IX-v!hJh6cgyKvJp!xCFxs%3VkB8VhuuD) z9^%!sU}o#F0W;~YYqxAYRy+uxh@6m_QUGn`~W=n?Gy}C4pY`<$hbA!?uOw zCM09*Q?UzKx~@=*6UDK1!3`_h(j`@*&@@6Iycm^fR8g2dXQaNXOq2GsJGyYOgU?PP zLhkYrrBrX)mb}W}dsCTi8i#aO1IPGv{)2Dui|-}J3u_c|E>?c1QxOKi)Bk;D`+<{3 zpWtqWBE0BmX+=qyW|q?Mis=NGn(bGcdhM0V^(}aiM8%R$t0Zorph>;%#WCw27#JEF zx^j7}TCH~!ir2=j&zI&0`uYf^K@isK^FHNreXXyjcg8$AJ3G|}G{sCL zIFo)gU_9=%7~edTI-VrKF{cURv~PwaVt z%WSY$8Eis*t+O-Z1{%FitSbz6I^n>Tax8K${W`i5w z()fuu{NR~bM=1&ur!G_Z4 zt+;&>rP{62<0z@JuuW8kh3hT*H7yAi!mjZ~J#{;P+)~EAix1Jf+>pr7Zap>@QNBCN zetdVtcS8Me!EMzh$S3o-tpsN>TLmK+-9Z~a%Z70SP*>3!+mkDQh$36va_`=BVC4XXpVf9K8}%50xIe-3KuI+CuQuAcs`T(=WsVwtrlwHlB$ z!L!ZIHMuC6zKS3@q;$^-L#;4%kBxn(m&CGcCqwOwU~%;qzw}>!72EE{Gl{pj(AZW$ z%NCPk@s%sqJ@N^>P=1upEw=9`W~M3txhM^DZ4$+KXZ$TcYc8!2R-pc zb7qqwwe?WsnSW?u56sIDnuaoJue%TOH-4;J zvI*I!OMsfR%W=qm{v3Pxdz!!1a&8S@aAEDgukWjW(U-}co18p1IVF{o#njOni|!De zI$0(W(5%wD-3Mcg+Rnj)2csx(Z5jq%Z%^0558hYxJY~@`ZYG;`6I~~RemG}Qp_n^* z@8L?V$~bo%H5(tnj}MBskICaNq4(J{q|Q&R&R=d%AO<*nhvL8-E4CYoRY# z;(@LfQBbCFzE<1b+pBr<2e#qSd&KFtbwcJY0=m|4%VLwTGLw#rRs;`jJ}Q$Yp}qac zs8jXk^OxvMthPl`)`Sk;7jVk5vsek8@C2G-5qxWbnFhfO(&E~fcNB9{W}+|*gSute zy}ezXydw-F*Kuvzj-$}@n4_3+7RS^=ot=e_j=Ud)wqv`t8&*TV7T^$Z;54V~Y>v9N zKuj>6ajjx8uj^-+zyueH9mS3=^+F9mL5(=}>t0QPzHBCAl0H)ZKokmHZL_2^Tds4C zC7=sq+s-(dTx&rLyK*JEa2}9s3r3mNSRK}tJh-zHnKCjR6p6f5D8Cn%O98#R@ZQH2 ze!yM*?D`owaT$SyZaXfk@S~H(zxHX_JBSEF)IouO_43NJgal0qx@fBe(+8o`jW-(5 zG?~4PWSRo9fxP&xy!xIYEWukKW@GQ{wN8I5l(V{3m!0@;$XcNtsV49B82+h3K9`r< zt+vaQHuMG&2nHj&$nX7Sp=V&n{9O6!HCRdH)wKLcbZ#|;_vC$waV7A*Fvz2uUcAa6{DF#XD=yg^{o(UcYx z$!4|ex_&UJpVfs&LPSB_A|4PaL=y$r>^JahzL#i90;E!wNMQ|yHcZ7Wjzd56YS97@ zXEbne2Q0hGVj>7@o&qikQp8O7VL)xib@QZA{E_C85aM+YW@qhzVcX3lTP$0_ryOGn zRC$84n;u27oF}>#X*a)=G?R6m{33{%oD6>QmgSFlSTbVwHBBrBi-T!x~N>HHuW~fqc1M!Fgl7p`9*MC8C8=A zi$u3hk=LH>zzLcG*_xPzMrFK9`bWyBD};p=Urn z%{h)uX~fu?*Ob5woN;O1uZPjq+1VXkUG7^ii!;YJD!X(?*IX>TDy~(aqni?(wH>b> zo0U{k!0A=hv@$``u!Ho4#u!^h7F)g#BO=q{Vpu{sg9YdoXzgg5{hL%yN^2w2hz^p8 z?ljHgs3xQ7h}Hr1DpN=aB^GsvWpf^TR)_vR9v|AH3q@X+(z4p2_y35+LI{`7?Pk+j0rjhz2 zrLtXbZ^^kdp)UnxQ0(0V__hc#+=&ic)6kzVZED7~WUAddl+k7Uy8gV4x+$Bn6G$Z5 z6F{EGvSUaowbhN3Zox(d)*yXTW-pT71ASZx`q8+)(UY)|;B3)PqD6#r8qE*g3zyzN z^H-V;u3L|Gv3*ikvwd%L?`e6I;C+1lreC?$A>H)z<|`DVOAF$^ zo)CU4DPI0@7tlOMKd!?rTjnropD$j zSLaJI4tC9qTU?m+Xz|o;GT;lTB>=C6YE`7649QRnc>+bsVq-+Gl!=MZLX}CJGH+XX ztxt_j&OzQ%(epBbnPqP^0gX{%#4EpxTFO%tY9S8cMImZ3+tHEB7O|$q!3|J~{qH{K zA3JXS{_k76_r%w(#$#i^w4O7cpAX;ConQ55zs;_VkzxV&_1pIzAw8NzQIsok;tC!Z zbPJs+Eucm#+ORMdg*;T&#myA((w=G^u(*0X{JXD3u50bw$;QUm)P!zbHc=nB{Dy8y zl{Wi>WXlyv$(H4cK+OB6=Z9ry69bBy*&!nz)n`_bB7rp)4|&7z(amRq`Cs56 z69WV4lHMcSn*br`Egz0iNN+2&m;iqrLDXt(#zm6cz!Z(l6HzX6YcW%SO`3Oufp!9! zK1nslaSHjd?&IeM)v>KpTCVsb6Z^o%2g=X*jbyPUrp>u1|^R2(0*4|c{hbl)ZL$~8?`XhW^yI5hio)s z$4MC@L9n74r4c>gLIg33C6G^jnLhY9d-?nF+}je!W>khvDO?pMsaIru0ZaxhYuma? z#z)d2$ZkT91Vf0tV~-TGovx#~SXM(M>p?R&h|@qTC*jf$w`>8^FfK*RF@?@uU4_A} zWxL|z6Y+az`1tkmfBw(l*t}M2!UZEZKo!p5Gc&dCe>eF7Iyme;{4m+JEqLXX`0AC; zfBzroeFMw(Y1vzBJX+OuilhlD1494&1!VmsPmP}cs3VN%W4`{ za)>z`fRHdqkSLm%!rHS;EQ{#Pi?2S z-gEk|=OF|t+UQ6x8LKhn6s)A(NmkgPZJF|@txOOyrGX)1>vB8Rj$oy97*e=S#_8%s zUAv;IiaXvo}Zbn0%AOzb%E5$vO)7vPcVKY;;?|d6sHsTB% zH@YvPGkLQ2qOX%{8;>sJy&EFiAB%S~!cc6+{ z?JDrt%iqI8+hAxE5gTuNl0*Sr&y3aMubk)3c48C6#@jF=pq(bbl8ZQu73h|>MKhKz z;|fBr;uA_Tc^BK-x~O;kiq9gJDY$OV#b!dYn8#iugs>b+ld>!%H@37HR;|=Z%dXP- zxkWIu&X~d-Zns;T-c8M>IzvCW7!T&~y?vN}SfPw5j6k2+Y582fHqM!8YFT}4X)BF~ zMnXtOu)VrATNt~RwR%VZ8vH8i*cfOnXvU`C49Vct+;3AWeAE}ETN3ke#Ow>B1vyx#gsF&-R zqH8-DeTVY)3d(Ff+G-tFu29}ubAC{a>Jd6u;)i?jhgphAIf+FF{lOu7e-Hncv+=Ai zHxDJUfieqosaGAxH(6iRfpMc?VBctI!~oOPYBdPDvRTcQH@XL%KY0r}G;JA}k)@gN zxqq%c!To`w%9bb(84UlKRtzAxFPG`dx)y&;JCM#R7>MAxiM^>~zN@ zX;&dS{*fRyly<$t9gWRM0hUF2btM^eZ6~`wE@sXl9G_&yWbWLL(JAFu970D2*w5zM2{be3=>FN+1kK#CtP3;v@ z^FYml$P2uxZ`s<-@@u~4f8-*p2SGicHg&VEDOlq|q#@%C4F1X`5(SM)LUnJjP$68LfA_%y{@5*T8i)4$KNcXs#)1#lU-cd3>-L4 z?%^knKK7YDkDl|c$Ci!&fIt~a6^`l2xGp7JYgsoaa9cEqHpJO&ToEalS{`WEXP>aM zpN`L;Fa6bjWV5rVp$&AKgHxEpb~JcU%MrESPxEt1fPzgIIbh|1du5MUB-@qKRh=fM zq@4Dk77EVYyz3S+Bw6PX_!Tb>S*DP&TuV0B*gJK?r6k1;$Thmhg;;(3jny)(NY-8S zAu?#}eTM@ZjoubvCw_t6{23YDA$vyF8I_SFzZ2(-I=l!FJJoJFKnYHjxRH`GRY(e; zu!v=gSuNsanw8>+#eSSEWZay~)q`<$)$0qsnj*#C0(C4MzZ1gP!ZtcO5zS-kIyl2J z4p6?&gg}+?cCeGv$ULlR>#pXpW^KFnmvpDHFll56qnbhIUj$xGR0c@0K-gU*%Wl)6%I=`G00 zb;%jd_o6}{P`62vrN>h-PANv&AMCAyPWQ!Unqd-0PytrsuHkyx1n)TXU316%6YX3>#M!ArT>P6j4& z`g;9G&rbZ>m!iRK4y;WHsUheh@DCce6y<6^h< z#BV_F;4UtvXUns3-NN8f+?UM^tV=kgA(U$)A`fUZwt^{iqPuoE4?M`8`#z%d zj_m!;4pq6Mcv#FBExUz2vE{D12kSEARB3 z2e_j{2Q`u#JgA@>io;65NzaJ&=$}C6usm}je&%mwt#SvX7{K(v5X3tM>8HO0y#wnI zE>PE7``Jyq;>h-^(MbB$by+WlMr$651E#Q`y7tD&7d&KAp+emsr>vxv>&RB;YhKK4 z*UEL~6poQPAj1vJ1li(PZ){7pX~d!kGI|bm4#UU(#AtzP+NmT>tMNgit%Y^L@{(Di zfLU!0z5RVWbO3L^ALtSqY#E1g>>YmXI63+oQ0Ucgr)2^vV8Pyf9_&0h_(@Y&-?CdC zi`gse)Q{=@Pe9);XqD1c?L;QCA#mEsCQ>F9tHd4)Mb~KD!yL}!;VY_WplV|K)@NaX_HL)=#{Gw)RIFhc4wk6 z%2L|tI-MEYCcsl(|3(Prj+V&W9xO<%MZ%*eB#&yLmDTkz?!ylSZ@ez5RcHgspLE%g zX{%QpGUatEq@so&dXX|!%2($RQ(l5XFzO%8PqPq^9>ODDnXM|EobN8GH;iM>C2ELq z-=Wh^x_ZEI(ih6RUa{xJq83eQEkXIog+BdyXghTF%1Sw1z2SYVChDl7kc@02pZ^2c zdjxTb*L8EtW*KTCJ0Z~GhW3bCBu#3%6iWY}#X?(U>8Srv-5Tb_BXQF)uB_4Q38Prbu=i!FB-BN6Xf6V&Q>3cwiL7 z{PNm+H6AsX9rxoLMtos8|BV?B9zB3jNrz)rj%WK(+|vbXj0danSgVf*2KM2hZAi>D z$D>XN9=+ds;xFmJr@*r1Vq!VHC5+@QS18Os0RJ8LJSL$TCl) z`Ge&Rvq>|srY(u0%QG`x;Pd0JiL)n?{O4vZmeFWEM%7AkfPEd=;m+J(A=8&}auzYX zT{0=3ZKe19AaG1`|8k9oSo)V}Ct({03%+3bezy-CwD<0llD9*TXmTVdIdupzg<7P{ zc4RHbj{H~;Se#Ki>6^=oPyMKGQsBM=< zT_FXb7h)}JVe49HjHMRi;A#?Bu9Ydc)S?OCrM6muq>jt!#0WQ8C=hLSfSU1-xQ+S? zAuE^V<>wHqYw_96-Ob!uLcyp*N=re2jHG3uN+g;sfbV6k#=P#j83Ak!t) z2b9}UpVj$0yy&i}!>yRwULjT~m)YKdGZt(K7;NH)^6@ZH&W%FGmZs&WQOIw^3Ey0u z<;~sg%k%Smero?uzvGlpG7-5}bTjt0dxf>5vCgOQu#Yg-J3+TZg>sy5(K{!30kuU6@j;x{@SS&ZQ&V_wP``+LlgGfTx+%&c@sJaCr-vap z}?9-n%V3?0JT?guw7gPOQ@ zj9+|3R%alsXx68Hs?KNq<<7Th+kuh1&U40ci^Fg|#;`4ir6cEYQqpL+V0F!b(fL`b zU(_nY$ZitFh18Zxf^k>Rkn`wM@apquei|9Z(M>j0Qu#!I@f z0ev7vzO5-LDdiG3sSzaA>W|Awfl>47Ns_pTM!`TJ<_D-#FK+gsL$te_jgJ|zL)hTk z0um`noN)RnPn%dox#Bu1qd7+y4;i%y(K=_EA6OYOhGJq%w}K1h zb|x47>eZQ(Z(XD7+oNm^B0<~Tcg@V39+<+g3boi7b)5+&L|ypEkJO(sUh3M*r2b58 z3?fZ1kfdpJ!EA3f;NGfP$etk5PSM6&N42S_h$T>XZyhB7b_>!C~A8 zHgF%+>Z^UxOr*GkqS+;1RHxiEs7Or=e{%V-DM>#ZS5UODB!I8Qcxlo~h=SSHdjwMH z3A}7PO%M%DRx3T8r7cy41<^pJ2>c11Ev#PQ)9;X>kD{n5D{s@ipGO^g@#uZz`rGW( z55@E)Jn|s!y=VFPqb|yJl3<<`x{=B6Dhx*sJ%x9DOk8}GUwl>8=M!S+s})%d<+8jw z7pTXD(E<@$T+EA$hg>yYp;=;e-JUL4Z!?xEQ`AvkKv9S?Sxc`Ycsb8VazIIk1_2bP zn+qXFqO5T(gj{u*1jFLLtEY3<$S4{a6@;Q^|IVyDu*s%N^PbFPk>Qb3&LPvW0-n}L zv_OqJi(_Evo?CaF{HT^nkdg_}n#~Ye1WGoEaubCnY=bDETBVN4ZpOvov16iKO1m#N zJQ^cYi9mfsLKnU07>sMFKMiI4n8i$a=2$O!MuA8H9ouqqu31^t=Q(PqYTprVEm-tC zz}~e7&r1%NTCz3;9eec}J9@u0aDbnGRr(8}d=(c4 zG`&^p=;DA^F39UYr1;;Up2O*GGevUvb9nR!d-G{Ib;=X+$^waa+K1abEOk@w=zxx` zLYd~uk#gOx5~A=WIvJo|0!1Uk#M^D~ahxRhi4p%xd``KR!@&fq8doTH^Bp^lIs=q1 zv>8R} z8w4I=fu@v9NCI`&I$g_`ku5PE&E?1)9v9zB?(!nMkSR8mFq63abuoB>Z_% zxh~XXIQSC;9t$56` z;EKF)=%?k*PAiCw0I+gFVVq<#Gz0*dN>-t(ztauIKc!BRc#ULnqM#>XB{ZFt*}=2>wzw%!0Cx$ zp-x0NIR_JrQg*!MQH?v2V3M4XfdM+Gb*5m?$F06yvO1g4#>klq;=(KX((HW<_w7#k z5OvgE0HJbW0{j3~J^bKf`0zu>t0`C`!$2;~$?35a0IAzeG;S!AvJUFfPqifqVQ?q> z#vj1$L&*JRG!}AWGVdZN??bXJz#&!WN_@>8nzXtv@)t z?%53=@b){mH`x-!l*vMwP<*?Vte$6Y|1}ul;obo~S=?zDD3iu(`gQY29#_kUq_ESw8YVzeB}6l@qN;19F<(z45uxEZSg zJ0rk|uEppZ3-F3Zp2*3My26Hy7kD#kFqXbAP9KMSM@_ApEY_4siMZS1^n+#_ld-M5 zg*>idJ7A5~blK0faj^_6MHBiZ=Tey#OF7dN`iHGu4@O;m%E%#dlj4}>_GQ8aH$8OO zX!mVa!zk;f*6m6d&3Qp+>R=-UUt%7c7SvU{q;$0bN~7=KOJ0g`j1C+e*}ZR&82O0o zfqn6dFUT-#ld@majjPLhu^u`}(r3iep7+RQ@S1-u13y4K%$3gsCe+-Qx-`a^&SO3e`yB_<<;2(WS+3mrhu9;G8 zoov4dtPZgIklmq|rRZ`SCSwGWMB#93I+jgIt1z6fB&Axx8mk)Qt}ZdfBq>YNAJgF+ z(bgtG80MIv$3PM^^~)_Axn6@LTf)$U$Y_pT{EnDCLAQSrdUfUqq6$ccG%>>}i>mqx zaa~{>1y|VVYiMjpNAtodPQ|(R{5Xo1EtqN!?JVLRXRCK<$pYvQ-Q*?LFxLq??&TO= zEyGNne7V4JJIK|l6+_vOAATdcbn5a)o~&_z8?#RcQzs=p1ocrohMobs^PsqXSuD)Z z-~2=Szyo&7eZQm@*IPD@T5{az1uWs+Ei2(sfPa#t-e4eHDfd@xNM$(#PUaJMK|5C(pI~8uFx&?O5*5U;^ z;-cMf^)iQ)J4T3|ns3X|RWe#3@dMQxR_B=-$%0j(9<|})f4-*UIdTMz99d<1Hjf|q zls>AFUFgt*%e~Ynl>hLbWn}u24Ih}+}e>o(|TA&c#={dfZ_oGSX zOfcr9IvS$z@yv~q4!0g(c^|hOP|S4o2TP)RDN#lX>0fJ>6GPf)DAo)drt~Mxd6`T+ zv}qDdT9`0fAfNj;_~3(h`Z{~<1?U|zQDY7A1=A&cfLD*lv<73)Vv~_BZHYy*>1hc8 zin>`XtZrJ28hNEe{2<_>9E9UFudE|764HWSun9CTdHQK;R`wX_%B+yfPz!&mcie(| z@8RtOeH|%|85^s7?Q6mDw-BMwHc%!BV(I7$H7es;U`Ep$IXTD9I7R~oo6jKK<6=?u zNg)~%+3O2;-OAk{H9w3(4c*>SDN+l3o^!O+=@p8U${KWaPh`QHW36C9&v$<))&Pkj9u z;nis_8%@uTfBo6*|KU%q-tHjs>AI&gG?peTM0>?BL<5M3B!1ZFwo2QPq~t9NT9S!t z-Po4h*DdE>m$MOQ4h;y}dfYmuSyYX|mcID2MtnoF#Vm?GHb2(NP%E3A5F|}6$kL_G zD8wt4Jhh{h)rsA5S{@rA7t7-0oUrifs#T~_J@dU99wcIqBcnTU0&g#L zoXDFY&f(C5nJ@p@prH*b_)}koTp@801vhvPR_R(=tc+>AAscO(u}%`j3t<$- zT$ckH9Hj3^^P@I}yltyL+mwKyv>rgtdcj1^uZ5A?4>onZkVbF-$rf%beO-jIuqZ@O z7O2jZ^C5CX=Ak&;(Zn&~$&;18{%dyiGO}#Avq_ovfueO90U)-;MxSQ`wH9?A3U7dIjkd{gj(I5VAE)FR-qiLSfD*!`6GKtN5Sqa z@-RZQ2ri9Ip66ju`pN6F&%LZp1GZ=apv$lPiiLsmM_;UU7wD~7hD~9{8uwmn+c8Ka zH?M6Wt%8wT*^Bpyd}Slze2Z>rBVz4j=z#(D>P4t8Z3tHvsT9a#Q+!9Exf*XhbmFBy zkN>y(oR_Y~uZ{CrUr-FIs$^3@(+qv54u3{@QN%i{LrlXzixC%#XE|{=3DNIz&DXp< zoR(AzA}!seznHv>8=e8hi@RMeXli~Du>Ky9q8N$3r{FM?cfxz5rb8Om8X1#X55IvOznm zj58CW6h-AAs)kX(7#FCK8)^w!0hCCTp)_aHylvU0q{U}^!4HEd)+ZigVf<3jWGGBa zg3W~p5UQvz#3%+GoX-Q!kZecB$8q%lSU{)0@`bWrD~ybWZ@gap<~R958Em)R%$$*o zvdkO zMN_klf=}HxM)Mi<^@TT%m45!qgw9y=vtzYqW-g>qFohHfSixAeTal1#gYZMmuMvb; z`I9;prGcI^JTUO(&ywMudT+sM+=c5|&1DnoLVJl8AiON5vb5f=xpA4*S-F!oMrKYD zjDZHb#g>`8)$k155SOo72@NY6iBpS7;GSV;|3LVQ%b~jCTJ4}(kx$L>$42Nt9+=p$ zwQ>EeY48D8y~zfe>2%TW?6)2nrmtORznI{2zR)WhUIop(=ga4ZwteM+L!>mzE}qhE z`hoqZyB|5(2CKD%`U1axMUGv9{$aB19$Dy0^vLuzU=b?KiA!gtUnRQ_Lf^2=Di@a( zVPvtXsg((hB$F-@US9SKDS?a*9@onA?EFbDmqgmJ`mV{RkHxs37-)uVVGMOmA4x=x0u z*&zd_yOz`*Y2#~PR7CW=Acm}+>1dB+2s|XK61XPe;yGmZI{UT_j&yZbr)Q?V{y*oh zkA;JSa$;Pv7;NW`kgwd?Rm;@Ni$&?_2F0RjDd#P-D)|6M4GV$pbb`B4nT~<+`ZNDR z96R&b&xtUKrsoW*K(JD2EosBnNm^!WG+FNf zlm6d&s_%E6(jTc;r^m0;bsx+kHqg}o9Bn^Z3M8Q-w2ji z9nI(yaWUtG7^0-yNFNE?`$rgec$Ve)rsd++>hfp1X^73PK<*@9bg34Uhy?5tm ze?d35_6!Wbz@T^jEWdn7*Lf^ck!!mZN3Q9F0WAN>2Rs%j1o)v0LcI)DYT?w(>K@?@ zoW<3GJo4R;d&EHl80JvkF@Dk|F9InCS*igHuA0q zb(Yl77!rhoqxMJ_y*M3XvLxaY3v^ky&z{>pJ?;MCAFM()eCi8{Q+hmpX&HtBY;w#q*|NA2=-(r(f-aq_!YmW(n1uMX3XJ95GGpl^~Ub zl{(>x;YeBlt}ZWy7_F`80@4t-_U7|B$3afNJn~U=@>l4N^7`M|s2()R;WhK*@D4CB zq|!qD*qawPXKvoIiv3lvNi()!XyGCX zD<2-@*0umgEvp?F^59PQ@+@112Gq5=T;UhW{J}vYWgEq-QF}1UN&{#(Lc6=jm-pF! z^G>u7O1ktkDd;dcGyUxsuKjKt59V^#r#^{Yw~^k{zF~O$xc8GEp==fp4O+YRq}1tV zmDecenQsSgyw17ED~G*UY|-O|_|m1?_r4!jYA`h5KJ-va#UjW!4u0~I_p_hT@d+pv zY5xG&HXi5)N?q3~_T{QPNXgkPgI%z;qdGXiQA%-Z8GWC%?@l!k3zLj(F9z{Y8>g30 z3!I4p@!qf4{s)4N-qWYY>rsTdaFkVehKYIEn^h+WTP=#Sizd*JUnmQbRQOKSycsWu zIk$*zOcJZYxWz89hNJ^X++a&cxe4`6sNdHm)N21BLREm8(NW1#o#T@rJF(2dK%wL4 z=r)I@mM(bXjmp=*#-^sgvbSv5Ek;(EbMT<^U>XbYuTBU*K=^K-MTMv``*w9bmbxO7 zrBcLWDuJ$h@eU>P5u4JT*b;9+nY(x8Amuue*M2M~Uef|2uyyh`1`WuTwOyH^gTq#T z2bnB0+Hyau?OrU8PxC{)THxz0qnRZY2MtvexfH-a3+E2pElavAJR>!`hdj`YKf9AY zb1qikX4#TRF+S&JUMA#oKlu@P<2927XpuqnJpI4QLgjD&2C~_f-ZMZ^B!U2CGU171 z(b>~FkdW3(8oc6py1)=n?dhkz=buN7))-wWtguhLj$9|Ydb#xf{ND;ZVav|{+ds-Y z_G_V(A&sB|8vRO1Qm7H$C#Fy#Zlso0l|V7S!h{&@=^gA$t7YZPRJ+kauZ-$};3$_T zBRfK?c=6oS7%PSK(9T;j1Cj{NrT!BM`Gv$7Ck3jFc#N)yQlKSdTp^fwQyjxMPq<{# zNL5-!vovnl{68#J@l0w36?_S#Zg>j~$+8eS7^7xT22hbIlqt&`*QI2dQEs@mH^niW z*S`P#`qTd`d{5z+C6KAj>=|s(cW;2flb$Ku*PF&K>t6lc(;|$pWwp`^e6W+#6hr|f z-JkxrGpI*W_5Ja3If1rxy)#@B%@IU8^&hK9kXvZxE=}uZB^=F|mJJ2~TN$Q}1vJ_f z7jm@AIy7WYme`7q!I^n+t;+Xx(fBU%{w~QMDQiJUBj7I*0tK@r5lk_g622XISDCw) ziBCK}O0U=W&&Ig5)ICq0|B_mRw*8P-=W+=qgroqF5Y2E|t+qBIX(LHY84I>h7>K}c z{Z(~Rz#?fD#H-3y+iBQQjD|AR>h9HwIz#1e{A2m_dlwEJnlI!?vqD!k@L{72Tt)(_ z5;9m8%)4BoM(1{F*VR2ML@}G)J`E=i!?BIA0F%GAnfKZXZgv zUn|X*>UA{_Fzie?Z}rtc??+b7Wu!P%;lJ|!Mq0}T)gYcJ2MzuQ1O3iqiG zhU4S4^XJhYx|xrDBo2brjlaS_>W*CC+QCccEmrHWR+nR2S64A(DmKD^zx1q}zJ@HP ztydn#@x70d`yW-$t(?=@oAW6TT<#O5Oq*-y^d-VM%XT%}iB27+mAVFYC@7;qT`h`B zLF6%=iY05gVRDhFCp~-8^tY=M>jMPpiAZf)LZ+bRvxAWWjy6KJp3R!H9bhEiwP&E; z*+F$-lS5~J`V#u)Kh7396p&<-liC}{?M#N+&Qn3+Y>p%WMJeN%k`9L5eT4@Ff@3!J z^mBZ4pfEJhmoJC`F*{xLyl}ly8K60!rl%3IYW+dFOnmEcSEi6wVz9xmCCJH zqAeV`p`L5A8)au7-7{dld5M!1A9!b$|Jo?+&%s?Q{%z)suwfl$A!o66W~psaTl46| ze&knuZR{l?o=S z*{3dREskPM*(Mc~sfIc_ndFty{F`V%7Gi!=fX>i`y1o}Rn~T-tlty-jgI2i6AfQ;s zW6TUk7M508pQOG~baQ*U`-i(aljxq~=rOxHcFtKAzj|5AFB972z+K7}we`4Jlujc^ z4!Jz-Np&7b-Zh~bba$dM&=RXt___4Ucj|xl^x=R1r+vku`ilqI*hGom>O427cq_kg z7blZpN=oy2x===L@yfKx9j@+#oQ?0_ZofMga=zr2Rt9gHnX-_YRZmy6yyT zda*+1Mt1{^MkYZpXNn{!Dv%T-voQd<1n(u z_SlkT%2p&>giDG|Xch!6K?z``X z-#O=ZerJE2RK{(7sTJw~Wlvb<13^H~vOLrB!v`%Kk(8UJrkbR-ow?yUtFKpCZ-X8A zQq7aPzV*DzJ8>SUJ=sOrs0;IBj9PPfz#&FiunQvRlvfTHw!bymdRTtoBP^%#> z#^`PLl651=2ORk>Xg`9qKdFnC$a+14guqKQBfc7QFNzC(;Kw}HHLC+%|AEvCi$bq8 z9<#zOYE_Gf^c9p5z=I))+H&&vCHP%jtrBfX;K4N2Cf6dkhzc^&-MwYa8rx_|u$561 z?B63j4;f|>#ao@sm{n~^*GI3^u3c=~$)847{$iDrhALE2+DA^Ziih$bHf*eLw%B}kh*Exolam=cEsTKT+L1TT7abP?&nzFLhLahw&*Qfa{gDhvRD7h1B z=`g`%9LCBh*7aGa+G;{S6tSQtRsX7wG)WV$h9cfc0qr~28Ye60sgp6r3xx{R&+~?{ zj`Qo|ctxgLDzOhW{K7CEpGe;Ca9s)+#fyqYCZR8j$aY#nYJ`}KZ66xSyDpwM#9sO- z?9qm`O3E)U`QjXJ+(B->E4{_o=W(c>llGIOOqWKnqofiL0}WqP3WBL>t>CM{C$z|0 zDyf>1o$CHft&)s^y<1G!FgzUxCP6mFme9E+x~CI8WdUk2aEz0P5NZmTHu5&~^z2x> zc78ai2c-Kp-1Tbp8(){ck0`smQk^q^Ao0Xx?Z;1KKKKFbIJJ|LfFkk5iPjmG5gi{p z_Mbo3bN|lHJ8obK&_JEMy1kFuM9r}-E~3Tt>YwT~^2@Z-6&^=Mz0A~QpXll`S-3!5 zF1u!}d2}jTz~ooJ=3qe{p5r$RFupRSc4YJJFL}h(Vy~t>GgutN)j~yW&DpN3SE#B# zn+mJRi)E-buBp1wHqe8c*jR-hDhQ+1Gebaw9zSnbTjMx0FLb(WFAGAa!)qAh1tlVz z3#tcxeC)W4W6YRqn(C*NGG=hydw~eo&X{KH^oA6$4lix!>0O_A=C8gfdi^;xJtnkc zVl_sIQx2|_jNvPIJ9MOeF%bAXy57QV^BHaIO~A;+W|0 z6RKBT#V9EyBXxicqY&Yuke+}-k2XOrPD^qsd}CptP0`eSlbj`EWgK7}AwsbvYC{r? zL1?Nb;>KvE zb@jw{A2MB@n779Ql&UMrc0&;_(H@wbnvI@>c$RDrl=aZOesyFMZaWX-OQtmk)RX4b zn)m3V=H`v;hMS}DDSev)p;ql{mL?WJVq5E-Vx5VAlGbwGs18~m9Ial=g?CACGdmux zAT{N#s*e)U68v^%Zyg$>Nyg?GWLQUp+znYx(e8nQ{3GiWZ}ntvI`tgfe$ zl#RJ|#CrNrZKB8-ZgI@`v3zNgZ||ihT|vi8Jzpk{wChDL0dW{9_~LfBPTut^y6BCR zTAvIry@0G7B1}j#{Z2xf3Fj860IR=d2%e!d!}-~P7*wyej2GyLC6yqhTqviS9GM8R zBM=3h7>_0=&7mRNG;_9H@H{PJQ(uB57NG#gjE#Zz(F9@=eoS93x1p~u_0T8~Q!b!1 zKC|i~9kO|3M^U`@RkZykl<%s}7KzQZlS(AFMpK7VT1F+}Vy+fWRBOc`R09i2o$K1G zGSv`7sb3~}2C+l|MinW`G5qdO*@1DEBtrdlBn1p4+(;ACy$LEl9CFK4pAYr`y;ptV z@t;14zx?IW%{LjHUDfY@KR$V)<1@ceHvkQzPb)z$a)60q0R-Q=2HL>MIO212H0R<> zwv89IT9Gx6b@sN=2o^$}sP=Nw(b=YN178%2tfx0ARdLqsahGUMMYpF{x5qHV%(Sdl z@p;UNYqUo_R@-%U-fe8VBKB&v!^er~m;*ia`IR0M&6Y#}TEIq64|Q57?IH-{xstj~ zqO7aI&iM-JNnTPE0Suy~t+;VqsKk{DZhDR|mMlw#QRTJ$0z}sp^ftTI^=Z#elHIzn z_x)3%@B$#9zIS3$2Rbs+88nw)E4jvqhGMf6(dGVFRWD^<4CLuGYpwA@8!kL#WtZf( zZY)-i{F|CM0!j@NN}@0d{J_ds3dcawiTY_2SzJw+gxrYE{6aAp&;m0eCdS3&6dD>*Uy^ei)h;3GWf8SH ziVPso0gPn|R1vJd2Wcc^8^#p_1D3A0CugU`lixvJ6&c2=9?+V^gLApcOlkV(M@V`(tDnwgtNY03C9SmpIYqks8%}bv?QD9)SEOt#V%&Srd3<+^_99n1Mis5EaV=b$$ zdP4|hD~9SPid4r$2}d=80G!ZS>$r*Dh{7o5f|L4gOn9VrHS@|V)$enjSM)r~G?UN? zM}kL!f;WyB-3F+vXhj*J0WQUO+u-0(SC=*bL;l0Bh)rYjNZ^4Pgb&>CfyLQomfwOCm z!Kk6y^HTfvbgK4DLK7^;!-ZE1Jg)-cv)Zj~+pcMvz8|QKHB6kOAin)9i@vaa7O6RHdz>FwFHy}zSr3ycmNtbF-j{8wMmJE1X#mNZ@Mw_zx1&F{#LKdROPE*i}&qQ zc+ghuF7KJ?B79<|1`-R+yz&!V}yuw}K` zVq6Qd13gWVGMPN$#p&PhhU;`(bp;k-neY3Gn0SeDgbFVR0r94sOARV`ECgQ-6%8ptvo-lwF9izCG;?K=0rQJ~?Z)`bDNIdJ2Fz5D znk|*WFt99}QKoZV1l82YAb_fauIqxjTRmD7#XJl{)oJQ@We>-36oiqCK&F=8eRuf- zAE+o;R4Fsl%69c&n?<$IE)(Ggo>g-?T-$QOP`wu^keJV8*5z{fY*wB;B)aQ!l3vaG_M?^Wd`A=u2rxmD2QSG9&*xX0vG?i^Ng^*D&J6B6x=so>eF6DqXT}xQm*Hd>>?tO_OAEFu$Q5xX#m3_Cv7* z`#mMZb#a{&17}j8yvS-rk8+CLtdyk5P?d4HBK-iua<)y}OzIzG@P<$wTPgunR^3@P z+lU-#E*2J^2Sq$$VQt>n^?U!8tp}%0JU(9hZ+{jX*x#r#^@dl=`P_VgvLF0V?xP=8 z7q0F-eEiS;4!W1Hd0>%x;iS;YKx(N0DYQmql=l}45$CffXY_&KbV;u@7Q0!lhFRh@>3eyF3Y*yQ%td8NZ zBri=EDHr(vo7eTG#i*Tk1}|8!@oITA^S^9cV-EMQ{bMb)vK6ce1$ucZzIlM=%nM#C zJMqpd?823KZO}N11JAc}Zni6{7Vf0$LlDaI6x>m(B(oS2t7n{}$r>sI3!`1Cfn7p$ zi{-JC8wHe664;5nT1~-}Y&L6|7VMGGH$vf+gq9nGA&!6`W80QiNG1#f-yrG~MxlZ` z5lExNc3g1`J zNBpa0TVven9!Z{Tz-15Izb8?WE015NV4v8htQH`I<4*;90m^3UNYWSiyictSH9}-!nT0*|`}5{uByG z6=Z7;8zmH~PC_|KpU+fV=QCk8Nh#sgf?PPiC^ofwAPV@5*SZoBY7k^<=o40DP;Pw| zM6*L6O-UAK7Ic2v9zc_UEP0KkQHOpZg9$Tj)q16dUovH`6Uy|B#3zqbzx*$`-}nuZ z$*_Te%m+Uh|Mh2Or7F*tx-oA08X?1(LO4E!*+M8YA45o3YNy4{NfMKc;_99QqUIAL zJN^2>xg$s8AcPF1nizYz^1@#|eDyCqNKQ@qC&pVy!HsrNBE4$qnU|O-9#1mC)cDj= zM?U<{oV0Qokq8@n`%;_YK4lb4`RM^5aEpV$qJ~7DKQypgt!$AG6I!7Uv82nPmvg|nK z3i_CgQQ}rARnPO>Oom9|+p2t5BBzYHQ)1t!+Z8bLxbyw*Pl3ks95!eH;&9s z%}!5D^!D^zf8&jCm{+VE+ZUcZ6k^K3Q;>IHGu9Cmq3zt$Kn@@g8^BYJBNX$6&U!{M zGhwd{gET9cQefdUES$FGrWfyN%@JIMeTO%bo9;=@9X&NWc5;^3+O1O7$8~7c@i_7R z!DW+q7$yzCI=qx<-|6gmG%J7>qyEej*{K>V<$SHp_DmsN8BFFKYh7p8x}Khl#x9lP z$I5^6*QIUSGavehv2jGhhzP3DEu|KNb^pw-D+IA62D&a2)so+YTR&ZjJS#P`n~?TK z71lMv78KKH(n>^>EVY7ZxI-GJw5%l19@@S}2aIE*_QG>?-Ej6J9|1|+;Sti&9hXa| zE7X3r(=(}1rcoI%%oxK4TMG2x#baA8fsPoh?m4vY|NPVP(7>@*_NW<4Oe0BHQ!{`6 zBah|Q4P5=6yRG4Y+Wx}}$ifZx)ZF9GFoc^+xLn%v&@`voRUq|3n;!3HxybiO*O=zgtL$d6<8xBoXTOmol#0UZ?h_R^dvOiRP0Yt|uiNwY+rJStv(N|cN2rnlqm zH?$OVh-2~c(|pfMINM>|{UGY?2Vc*LBjVW~$Vy40Bmu4nwH1KgOT1741-4R}GHTUf ziN3PlrSRsfa3`eKs?Ioea6)21J1G5$*+eK)J4>wRzDY^9>kM{w4t8~AnlhGIxr~b?@2RIr z|Dds9ed>6u%NU|X1+M3LNTPNB#EUjm+-@MYJ>WEF$z}M#@S^LBWi9zFgetk{D$O55 z_lnA+k4oEdZ@$U@;g90UNxk;WpLb4^Ts`O6*|hDx4+SZfvV2jdh>jtrVaFR zSZU>7)JoF;>TJ489-4s)HmwIS^`I4??}>Fjtei&&GFgYyj5(d-37Hg#%hiYIR3q2q z=~YAKM5&F`)yc9bhqBMb@da%-tO5cuj~z?a?caI{Am~M*>tj=$AKbu&tD*PQqB~ua z6P{Si+OZH?TPG)<-7wQTG+-Dcz)!EG^BXI$!I)tvkfX4Q0TuFMc)^>Dg<;?ap}|bY zQ9#H5rp5S}n3<)60}9F*5=GT&CX@BUcyem0tE;QKtIsqtw41N#?;cva&Wc0ndpMhC z{X?jKsHHwv6p_*_>ghkjO1gOmz3N7>_Z4*2jijf4;eBn|j(_qkL``zrz3B?Ec?a2c zwVXVK0$;`1DZWhQE#c6QK+b&W#4wD0i zCgwbk^yqqxjy`jiL%qxh$vjpd*vPO>*D6EsF0Mlh%?tApDkI3XRv;?;P>b~UM|s7BVFdAjK92V<`$ z!)VD{I6I;itWo_Ry1)0qw`cFT{@FkK!t}m_n#zWih0wKW{k6aPf$W-Ib>O;R|CqCW z-P}{p2czSdw&0c|*^Qn4x=p_P7Dv}*x6F#WGw@QT#U=D=7)(Utm^h4i2+~_jS!6l| zLV^9jkHC9LF^?eE1{AUCm2H@5n2rG@ghZl!xmpBM>rNwOS>kI)tmlvV)j%$&B_!pA z#|#PWPH-$mLxC#MjF%#<;|1OsE)!6gc)3zV`HS6w6yvFynDPW!M3k|m9N-+E#p0-a z^Af8K(lDs+1!_pSP6pyi7{;5raZF+zUBC_9&v^yVMz}wrb6`RZCT6DN=_v(e6b`)h z`s>yWkL-T!^@)jbH9(0PyavnVG6O?B*(Am0yI;ay1-<`Q)R0|>cc1<~e(|U1-uL6{ z-*&pY2m|@}H{|Rj*?M)G?mBq{?|B&wZ)vVhjE6R;pZRX^J!rk{wCSNRKs*MZW5K7e z(Fuq)$^eo%MrYa1n7mUe3kQ$ORkzh#n3z zH~~+LYakPYN_m>>TIbc)OA)A17XxZS-LBi4buCI9g0uB|ku|^e!t>tue-Itm5AsNi z!C;*&q<1P>ESUxRp?Gy$+~*PV%)6tK3!IB{s4i<#LsWzbG53lIO5m zf|IgXs6Fw7^R9R56f=45ORuJmfnKrE-J$;MyK>XoTd$sceIEsI3uTnmQWbi&N=0Orky<|OOje@~C zbu+9*UZJY?2B*uhnGF?hbm?YG$3$u+^+%YLbe2h6fMOkQ2NAAi$=9zeN=w!h$3zYz z6+dpXa5TySUl@#-SZOIb5sOy5MgcGI&cw}L?3FLGx7cB?dTYu<<*-e+^$L+&J`Ti< zFt|`q#xl)X&G-G9_Q4oj?}8XIw7G!f5S#=p;e8$BOjyBcsM(eohH*743z0D>5n*W0 z&LnI>%d!TC)|{G}nwpv3vSst&z@V}tbGa;I>2eyyQT*~V@!TBhUu!S}iYjtpn1&J5 z(B2nOxr~1FC^>md+HP7#NaF$0M4`Y_r^NnO<7y3k_49P&Hewm`^%Zy|5A2qcqw(Y< zi8*`s2XQ`?mkpkKRuqcB=`k3#TckTgvFQKwr^d!j#*V9WCU8qKaCG1hKXuBw^G>y6 zt?TQ~XYJ9s+2b>Fo)>}ytJ+!e7zs)$h?J1^zsx+&19{ma@xr9X?jS(G0{@eJaX%fo2p_DFEh zhMHxEkvAoy%Brm0a#k}CC;kDh&~&v%l+mkfxQrIcig-{COdBR%Q1KPw$#iAZzuGs0 z)LKu$St?hwJmXnU&h|dDq{7U_u={Yk1MtOo?hES&G`DZ}6n|gw!dt|LuTDr7J{#!nrs zmtsr-7;owtAXG97nG_v=JwE&jPFQ0N0)=S-u{89=t52ib?m-&LL?W)ms0FCo2E&dGnfUa=-R#M632S9*HcKs$Y6IK6Z?)A7-03tM@t_SN*K( z>NzwqIaVw}6cS=|NMsOpsqLAy*&rT`>M?JW5^h|Ix+roa)HR6fuo5pQh@dcuf|zWi zw{vrUU$*WvBI*hU4hMT*4_}T$K--GC78IaSOi$XvL zs$TBzGq1cNK6wnub8}!TphSsv>&;KnJv3xEBU*R$rp=5;?v&er%^T;j_rj^lyg&G90g!BOhv}g(x zUmAYnNXQ_Ti5S~?k2Edct%6VM)VXjkMqoFb^JOKH&DT<6ITGmAN&chbTzzDag$*+h z8i=_iWwg9u-&`0H#tBlZuEQveArA;HXMlGGUJN8raH1+`*|s5sPR6F0jF#u8)OB4g zvIh$;p%j-ZNmucchl9r-$?yGnpW~X-qo@vLM7dc0&Ob-b{WxnGhGpmb`okzxkOID$ zP|LB^egLpQNbocm?iojpmh-bPvf6n!VRyl{-PqSFkA5dSaU5G#;cx!dc=XYR93Oy{ zD2m6&5o5Kzd%{2df2o2#GWD>-r^O;K6x78EpZ%=+;DgTXcVHW?n0K5THjH%4Oz#^# zMI(K`+4#z2(VxrOPRIo>(>u= zXInTi-cNrLjh#YPBq8EC7K&(RzV2JQz@C51A{rnlw3 zJMR3wPeCdo=V}TkZFaYe*y{%=8}4}Dy=>ct3u+@DtD?`n8a%MkxOsr$3zLU-8d*=d1md~SiD0r`j$rSM_|DWj0DgB;0SB7HhP;4t*bVy+;jr{^n0Cj<)u zpOYD0?RcujwA1IGy84_VTQo}OY#CK^3 z9;&_5y#9Lg>K*U|^BwAeHCfd7^7hbxDXFnohZ@GljrL79Mvr_GNs{OX&gXxfspI70 z073Gd8J8IB+;t_A>{Mcz#Dqb`!zl6tl&tK6Tlwtz+pkNAxy=iM)!Q@h;RoGq8?C|q z0Lc?Gvkc_#mKk7@S{I2(M6$@f2Ju(aY`*N6Sveda15hbk`*tYmdGc{RhcDIHt7TQ8 zs-LdgEDYB)Ah`|)wIJDG6kbU_6>%K-Lc{{;yc5GV+z!`tO_)*qlDzj5W%>En!Z0@O z9%lS4GkVqbba0mc{qAVIs-1hX$X%p~R{&}+gX8w{2GoAY$H$NI z(UWY`ru5;e0na&B_)k5gatUPQ-jGkFky=O;h-c?ZRRU%o)wP`BAgoT!CUxW0BsDTl zZfH$1N@;T>i;}K;ZcBgV;^5@uOu5|c7|Vt-MlSV;s@;_3P&jjW%&gqtBzm5!{_om` zrhYDKGnZV9sYO2<r{)EJ(MD0-~ z&Ye~2eQHYwNnR#FevFHOF?1f0*8ntE1fBFltcb9ZPs7An!iiqP- z2uWdPFvBz;B&A*F5K_@RR}G|O^JZ|4&agDGlwcVKe0-Glt@WRMF4%t%yg{itKYoML z6V@3J-vipp{=LxPFmlQ_G;mBbIvPz)(ax@^-LG#hrMro*Sh+;j^Fuh%$WDx?^YlCq0~`4bf!oXZs?d|)RHcG zK0r*WR!pI^_0;!%YHr_r^vM^?rzTT>l0h!f)}-a}I;AJ&M(Wtd@ReFHtTT7M5(PRXHsSe&HAF-A>u8N2&k5riLy8_ch<$X6R*|nQFNou zRgrIKyve%kZ$oym8BZ(*G>hL%fB_&O(=vB#$8JWhSx3f>b00D|geK#=ww-aDWQanH zMKpx?>KahErOx+x%M?>ru}wO-Hr%tP^0$8{{2I26q(I{vRxO$DBFj#9EQ@&0{tT}h zHn(gk|MVxNAOAQmm57^(=jOKFb=SHF?qimv%;HmXa~a#tInHdQ?0c2~JlnQ8CIr%=71!D;$m4_%2QZc&&!HxCS2pi)N&FBC`r>5)^IjvhRv)^}p5 ze<;SZYvZutfKp=2xt3ADm0Hd7gRJX_lu(W*iiIeSY|03c?D8PE6gC9<=9#;7hdYlr zVT77g%TmC|jQyCIpimaZ;IJ`rhUHkzRyNQ$PcQd=v0q%G-W<7M#5y<;M!ZF}w($x$ zirzBeC4%tLqMY<3UH14@PgjALPATt+!dt?~Oz``~AGeqoCSnY~_Y*kRi5~kJ)_^6I zu1(@AiFVLR4o|hj+b$c(*l&BA_p_%#9Pd0X6v@6tshFE9e)cb8wXMZ5rBI;Y^M%q6oP4fx(_ndQ zqHyR~ZcTR*c$)L7LW)D*q}f$~8&s!>WsNs;@7}yP2BTUe4i|)iZftp5SAtru zj^lTP;d-GKLj1-82}{))IxD}(JcBq%2(juFd3x3$%aS!OAubB2hrpYbeT>k2#AI=4 z;`2LbWz6Z?_1RDVdR#2{FFuD2>zoaZ`CsbUNfZA&PvJ%HY7_%!#T)0OH1hcw)^ ztN6$NvGafb_d@F%&R5fc;-Im!Wu)V_>x^7p_0H)XR1DwdRt;gitWWbj(_z z$~hDU0wI|&_6uHE3lpVU!!+D3*HVxUmXF#NfD3t?BNqrbWNWqm%-e}TqJ@07{z11(~l~;ED+ON<3=l`T05Fm8M<^`h{g7~_qflRsF zB%i~k85c?d3K!_{5Jkjw*F5;{{*S!R>`nEGI`6t^{~!Eu?wTt${K0Q7zIo#2PX6sz z20!tEo_F6l-(7^bjnmf;ZTj>lCd-vQ$43=j9X&E_C>+yiNIS{P$G9MPDUK|h?X!D( zZP#K|KVGJ;3`VghBfox^!DURb;#*{0^#4*$U(#~}c5wwYCZwbRe{bqQvg#1pw3@#HZU7STiT*!&rX2ZtJAVPTG{&w)xQvl*C z6;bn0q6!1K_2&6(0nuK8Km5ba|Kkr5M$#&=EYA#lFXpa+XlI^eQXC0IrwxX6E*OM> zY!`KR$J0|X3h`+&$h5AmFKboslN4-kL_lqYc2{e@BE{a?zI)WmJs08h4^}j+K zdkUAtwW%;H2FvuyD1(V>Q#eAwQ4svSOuJgiA;|*(#$i!TzaoQ@PK&<;-AUSHAI$=;&buJ!NZ_e!?pe zVZiboxsN{N-hW?$imbK$;PLT1nsIvHb58@u#6esxd&tDqvC>o#hkhmK9LsgMQ1pna zH6JRfdqHq?x>&F*aeQVilBUfNLuxmu`QhYDv09G&APS5S8_1%N$|@Bq&S)}wP2jS2 zelSi3!RY5H@vJlOv zCG!*^Keo&d*ZhWWCctF1LR2hc5l>FGxMwaefsNjv^n$M%LfCJ6TmCmcgDngAK#X35 z`&{TKl=af3sc|)5Tq3Q4c9DjNx;p39_N%O`uOW_OZrC8X*!9J4?tAoyaV?zObNII3 z{Z}J*-kKci?A&Q?-(LOJqu%2`5;YG88YRSW{!E- zmJqqb1S+CMTrC95B2I=eANi$#tG46}D1uSoxWb{H7bU19fO%&VaX|`*hI7(J~Ee>UgE96HB*miYbWV*&}eyH zM!)e=eRGJimkr}iWj?M-688evs2HD;VT4Tsica%YlZ4jDQN92;5HG!2;N_iozV>D) zB(Zh~>x3yS(Z*JQ_M1960I5Jl3lME?y)#{Bo+oGq6RMTm-~cW-hDxPk1=O_BqVS)L zBV%|&$7gBv5b`cX&{<0a?C`fX!E8uy=yw=ij`fXqai2;YvssT zDm-Ib1`j#*glQ9l;xJI>3L+SaFs|tWxH*i71X!c~?I);WT@9qX>!&t!i|Kb<*A3jI37B{)6JF zAIKokf~Oa~i(@%Eg$IU37>ZKq%`JeNRxiVt7Yhhzr(^}6KTZT^g=pXtl&DBh${>FY zONDi$f-izAd_W-EM*p|+LnP+Jb#ov2P=aH;nYo|*(O;eV`EF_$3TvtUql^W`@(Z7R zxO8It`hWe4c1M~;Z{2Vs?O#*)(?12ic2c|-VV3Wp9UU6Ub8p|#U}6fAlGY7q2u<+F zh7&(O)73_+dn2IhpS^^R#71`i1juwJgm-M)G4U{@y(qD1Mmhvu>sdnT;nIIVJq zA|z`_mISJB#H6$dc&&9c5p_r4A;?qIL*e%-FlJ;Ru#IJ>!j=s5fqii{UYU7g-_Vs$ zO@SnlO)B8?Foia8R9imoO!t<1lon zzNUi1q6r5j*JV-%FVe4V*}zHD*K#!PXwrj_==NwX_(D?}H?>Fb=A~E{v`@Yk>F-?3 zjG$WATY#f$A#PVVi0T}BVl~)KwOPl)Mb)igG++@ER>;XIrqLDvWp*oL>@nY^V!t^upmAg z1$=b0^6;0!J+DJ_;8L0&XXhPhC^E}1lFf_!1-n_9)Kbx65HMD&L9JZlQMzbjM(mvJ zWNiX<8=wu%lRK$FZnNl0|IILT-mF<7fi9ob@8ojc~IEL#^?X zm=`3mkkOBj+q#<6FdtX*R?r-_2S~$Vow~wiaX1YG1Zx0WU9CGLv;M@4v^P)0A-Cj0u4Kgy# zSb%#IVsbZ<5$oQHJ2y28QArW=*?qEb3>z6Xcq6iUTJ9z&iRoSHUy>W5-B&57B)KnU zc1eFWVHuyt025y19b3M7=S3mYy-}yQ_R28qg)Oi}-9jl;fDykHQkbO1>^s-7N`xLg z7>PxUZG5S0y2>i=>PF0<_kUPC@hx#;Kc@7ecP=(eI=DVKHWt15Dhfhm&`ZyCxyxRa;z8@YuHF0cqmPa5|hx{0nqqs7n ziDeqZ#>z&I;@Dtx}y<)EaQ82frzSuX8Y^O@?|=d2rNu0j4TL@aDy z-6mieW>It)o12iacCkwo`RW1ta3XORImfzCuoo);WNm5F2;Y)q65Cf2qi4}09YSOm zk|uVp#$?e=MOjG>OSXa7!)@9FZm}A&ufZ(SragEsB7NA|)@DHZ7ABL@x{{df+T-m) zritCF+jMf6mEmDxY{b^OHtnfl$$aEoi>b5lDOfo=e22FE@_$LgdcOowZyB+iQ^~=RzpAscGGLG&He7bDS!U+(Zu-0 z2Ur*GRX1O8HjCNH>D1#oREQ(4e$Vw}t&A0iacQE&BhEt(P$m}MT$RThL?tLy?=xK` zcZFvf&15nUy`OeMNGS6B-4B1OG&%-2M&iZcd#GDvncn2|^Pm0V{_p-|+k19ydiUMV z{r4rGW;g3%?_dAAwexP;+tZBhDiyylT~&rU;m8mq)1R}lEaO;N$IiQsI^ghZVWLpI zVsK!6Us^;-c;3v{zh3>>vwgqvN!EQ!@@8*GE^<4Mj*k0;2XTxt6uX*3m%})(Q$Rd~ zidy_TtKX+O8l+a%3`RDUp~Sv+g)l5l!p`j3OY1(VZ!9#8DhIi@EV;v(Ymqsy1Sg9k z`?@7}N7jSb9ZQN@+gq{Gr*5KMLsffjBvA>qy(42SrX9F_1}sI+bvT-Z@JieEWN#v{ zW-ZYk)`#&D?aAo&v;~XiTFg4o>Dxn=%v8dLO>-SMKh)+U!l-Q{XAO3`+bjjlBAG1d z7;68$OaU(iQr9%KvlAzB)A)QX3d?=-tiEA&nvn?PVX;Z;T;-;Z6qG4NveSM`fSF_k zjgtuNlBEJK1^?3gOfevnB3vzUGT1V$n{W1?`B^x60!psFIYF{OVVDNW6Nkr&0hzSm zC~zYbKrw6s2p@?+9G6MfT@*%f1a()etQ7}w6vU=$rU^~*0*gmz#xV%#h9QYLt`pK{ z4;(%6lV?@4b&54t!vy06oJ;~~R)nedi^onr_m^MT_njxUyz9=5?|55opbxgqk@X5b z0=^x1dEMM~^vA{G{jI??f8PMAOsN=bxvRwdS{f z%i6RFstr^ikz0LNp%j!NE;ATs7|LU;+CCj4Ut&X{6ADBU)$T4TGa606oskrc7#LHW zl4%Hh%9isi)8eob&k1TEGv9c^$wXRsxJ-&=B&j^I?a-(%4NH6qe02jkJ+d|j6xaEn z50SI4qp(bRuaneV=r)RLV(KNF9YDE_ZG1|l#` zp*{H&TIiLLa%PtyrcvQlX=mjE%okPErzn^fC!fTFw<)BpAEj8l)hs2kumEbDQO{eR zO;8Ch?O8p2$mwDQq>{m%1eg{Na{+Xjw}f9N$>gfVa{pZH^R~?2OCWnmt#ZV5v1vB` zT!pZ@&OgKF_dD^jr`1w(?L0hPozU+;{j{;B*WS5Pl*%%UR-iNIua0z?bS-TacmYr$ z!kEW`Sxmtig=3;1GAu*E7s_Zc_)#Qgs`P*UeeUE5bNlw( z@Idz!8%{j;ifw@Ks7$DbjuIAI@yN+tUwouvcqoA~5Jan1qpyEc za%pZDAw4}tUvCQLE5*U5ew^8|t>@}1+kpPZ9`AkZhjC##c<@1U#}1m!=I*(Ny7NJp zQckI~em1j4gjK z$=Y`nE8L7-)76 zl0R&BNrhXfn0bB46V;-6>X|m5!oy~AZm(7=U!3j)611v4vQ3iHg=r6bY66#K@)b1x z!omYoYYCKKfjl$7Qc(kDV%h?yqA)LMP*{TibEPR@UDa?0&uX*=N|^{n5}6+ptmk zH9j`RM@NJ4@#4{AVs0+GVPo*Z&((@xY~4zlYNV^qnXOcg2E~G3g*2%y44G1@i^>v} zW1#oi1oarmX+jC4wZzF1kdrOvSvIyw%$y}ZJ^LZDgfS~frjHEYi#j$ymd!*a(H&_y z;dF7a)85hP18U?nt!1ZcHeq;W+moJqn$xMh^vzJT=sC`3LQxB|)cTb5^d(u}Y;e1L zc63@AZ>tt*LqiHJM-_B|+GgAFgO{?UmS7XhB^rEIR_QW_x5KnoX3PMFHoc$oO-6U;07G%4*CKt`Y^WYp6oDQzde()jO*M~+&FLZ#Z z<;Dq-u~Z;N?fa$!d|q8p1=(54%Ge_2UfJ`jenO53z0mi3(>Ck3jxVfJM#}o!#)8Lw zx!m)<_jUaKzo%WD-uP5?rVw)(hN1dM!5Z~axWP74DurpVAd0+F&9Y3_wqt;5amU7W zW;Ro|Ok@y-wrNHfd8HyNm!g@e+1; z7kQy021#e=iFkUUqq8c(W?O;Tia{*}I$yhBDx`P}7tllg} z2A(H+3tZm`PS=TSIm3GKm|oH=v+RM=esJq-YSeQz>bqXwL%d2N=?jaiEivdX<$ys$ z5f7uvsH_!`0`i4JNhvW1`5}Co$Gvz(lZ&^~C6>9bhp-j+qd89 z-1lyP7P;Jou8b|4VJyOG=Z=GznlzKOt&D~1+P-S@_X;&N-_*FE&m`rrS3+Sv(PyI~lXsjgb9)gZRSg+eN7E5y)+$42VTD>0zei()78l648gweU#83l{LV)2W)&JKr* z3Xd}nyr=Jh`>l};#7sSxw7-Amf&2F!I$S$)qN}@Wu2>x#EmUHkb`b`-*Af;l4k0MkRqo5dMi5T^rMO)RTMGh}l%KW+slag%!f)-O5OoI0|H4Cx#*uOQS9lBkOLMv&6q=6JR=f`RcQ9SEo&HzK^yp z&x_@#*Ep~*g9PQqQcuf{PDPk>ZNfME$MnOkyl@LOK$q#^^>ne|_48wd? z1$`<7g()3GkPvkyX+fnntC4JkO>irCB5EN62~Dd1(#4p-PmvIm5}^P%fZ%z*xR$5l zkavJnF1bu~I-4Cj&51>Dk;a9k6sKuk>((xtMI`4du_X}}vY1H@|GqTApBsx8e}vm@ zqqrTiYU^;tOX=5Rv@#>ti_zB(gwKuP=^C2#g?b{Y2S~eek{jZ93+LjJ$n_TjTb6a> zjmn}F|MEGp>p6swyy!Je!B-TDv6E!YaCG2cbo|7*rzkJg0toM{4+f=c`M?R)O|XVoQl zTzm7-+L1!3G*?n)7iX$3Jc$A%eJMk|8(2W;#R_6kU7krm1%vu}*UoG{#{kpHf(4wY z>%J+W!m2ktlXW7dgV)o|?}cBFKOUcWOyd=r?4=+Tr8Pzqp>C|%??^51Fk!fqT(;Wz zATFim55#eWMij8{;iODieL-w-t}H0yAZ24cRn5?%$^uhR3s;u{Nu{Lnq*_kuD5v>m z2r*zZrKEQdIR?npBKMpcdC3)YPGbV3xsGj$x=T|oS!F`XW*2C4fsQ05*WrQ{7cZ)( z2xVgFn{ZS!O=><^Q0Nm`OWdGZvMhvdh{B9^$($E0Y5Yb%UDo#t&bs=nYp%t%Eo)V+ zU`a2&z@g5T>w8Q8?az2&7Fp)Gw5es@;baEsnT2uF%u;VMO*2i51e)}(S_~4s zvPAk;2OM?TY*-egTH= zF*TG)blGqmMwsGESH^I_y`f%-DP=ka(TrcU){qMwimY3VlJm-|uXdImQrHACV}yu; zK$@mrVr3jhHQ(1PWNcfO`d>}Ivhd3IUadGi3uS(*wdB5u>$-Q}9agL2=uwIUQ@7vM zY3;nH_vTxyt@Dy^&NWvTKmM@;2M(Z@UmV`J*>$t0jvRaTx#v%wI61t2#L1Y_5;Ycb z7LyvqH6g=f0mnE;rK=OFlY5Bk9ZnkYM0~bxd$yXFMS_;lUb+0bkQS({Q-)<`2-ZqW z6pRo3NX<`bG75eMnA~b!1mKqpl~JPRIoFwfEn>-u)T=tI8iciw85Edtlq8lOglmD? zB@jvlHS49@P5Ri^;-CHSg6oAW=cUYyjxH=bwstMARnJ>B zW}Ljheo%A3uhi5OP7ymLZr(9$Wh5x$gsAx#c)l|D?TiK1gq{F?#pfZn^EPEvKjb$G zufTMd){d)lzx+wFX$RGrm}F(l+XROhYT@c~nZZy}4Oe%Bx;xcBdVxejEs<)Kfpv|j z&S93(@CC0B;-$3s%FCJWey{hVA5k5%?HzC1{jJ9*UOQlCGTIS?nSN>N4q&Vx2!p_n zV_O-TRzACN+el$-a%yI-I8*BA$x+wMJn$Zx@9@9;6>{((pPRF8y*>X+ztns|^<*a} zCgLzK2|je>2+4I0t+D+uRChhRdBeJm8%Ix_n4X#HA6$=dcD7Okc^Y+S5=$}&sN55s z0U_{t>7msEWpJxkFJ1C9Q5;_un_ZDPn+hRFJYSwk3ZfY*aTxmLn%dx|69HUmxTEPQ3PLeoa)Z$`TuBF-*`H{M=>6k!*BPra% z4Tnrp#unZs5D)i5YA_SbFA9zY)dP(*F8zeJhh>#`a^;C#7Gz_)sP(gS>4^ z{`Y^s@F#x~?Ag^wKYU}0aD8m+s1jpp;`n7hs01*xaFPQ6|8o$a86b;3u+~0RD|kH*!y8AKxb=Vr#pd~eU|OMS-;OlE3b z87{O}1{Nk=4^}2?mec_f@Dpk45ByS6`+&Jb7qWIi-DRvp_+sWuUos9JGB=KNy#M{{ zZoX!0_dW$*Or5esHSU7jK>%wk%jC**<8h|H=a%33<@I;mSeTqTIWaj?DKm#=GEid7 zzWw$!*Ij2l`?Hf@{(7`&TRML^uT-jq*}{pV$GC`ldb<5uO|9vcZCbYa*T`hEy#s63 z4Ug=7b+$SfaEzVUsfkCDj<;U|+35uMC#eQ!=bT@M7-J z`PO{8{CXpET0sjnf+;wYlZ2*pcYp~Tr=?;O_6$m6If*lcB+t`!)q(`Hf3?5`ULcud z7OSHHg7G|65YAHYKqN{+T5>?9*Gy7-=jklT>Zn=CP#dM>QIL7aKvn(sLTvLu*E8$BAyVPzP!zZPS9DNJG>kNH|$B^ru7zbsOJ95*;tdYG}mR)VUoF zVHDRQc?s1lmP=#Zwg)ds&{=e(&`{>aINGkp(pv0^~x*z1_y{?&sNIH ztm7!MGtR)k+MJWm(cG2|R}>3VUTx0p=*kaw_|>u>hg6a@-Erxa=F)~T^M%4NlQVlI z|7X1BHtCIn;Oymurj_%HHTlMxts~T|lF*c|l&UO&nn+L$gigp&o0N!w#ln=WmPVI_ zPGUi!9|mQJR6#m`#Vl}26LlgKo7Fr)1vrv7H8Rl9ry6KADj29dfTV!=D3%5r>eA}4 z*o*AGoZI21pK3Itz7xJd*_2_d8W1Vt!KA?4jD%X9v=*aGSbK(LsM)R#R;WlF90ieS znPvv;FonIK@fuNqpl8OSn)=5>4%ZEnBqFI+b1Q2zs8c`^&yCcp+&~B2*vDQx7O?Xj zX==Mi$R%{@M7u>*wo6u0cf&}Vje-%x7HQm3eXv5aK1cLSK_&I-k@BV}ye*2%rB$!q zko7#z5X7y#?u0jr&+7z1a{l{Q(d(RXOv8Tw{1}O9m6~7m)s%5M95pMEOl^QgItg{n3Y!6eir`2X2^?;yL5^IovKPrh*i zW(Hx90|^i$K`;kVlqgc9L{V8*vSnGe^_+J7T(w)Z&u@2MZEe-7{bP4)S5MEfW$D>g zvgEZACE65|ND<5g0V3x-z~q@5&ONES_xrlf4HJ-OfD2idC~$D++;jV!)BW}DOTQm) zX)|r8;#@{Brk$fQsvTb@B-_jSZs(=LzmYS%;;5#jV*G3h1w_`HFwuvDh3%L9$d8z! zriX2w3TgNj?al#E2y0mOAETCXD6~ZxCZNk@$i|{uVs0e{IE;b(QPx$_% z55KZp3!4~%(6p^7iqfiM3gaFI1se+3LSr2?EGi5Fpb915;8#96lz^X1#}YBX77jyA z!bCS+!KW}egyL{9QRX-a5=pUb!5{Z=oF;{f0;C0pA*ZJh)d@eW1h}1Bs2&H49L{Xn zM(dgc2vo=zAG|pOmw0$6X#q1*7hWiZyz}pgv;NvMsXK$T#$qIAPp89!5#=pv&F~1| zs!vbpo zc|0^M<8gC!dE$mi4@5eIUXb3jSeI^|ycfC%69Lr?LxBvoD|ZZd$wa z@W9aNk#XC$0FI1RD@lT#9$_5$GDc16ggKdFA=ANma%QANdBu^Ih|JPxB_@-Zf}87f zLW@^|aU-Nz$2GF~AW3R|Mdk77OuyjQEh^IzqD$z48|kXYh|?kc5sl~DqQdUq&P$|B zAC$+k8Ie)ArdijYdZw)Lj!Khb05gkJDoGT>I;fRuT2@WvoG3s6J8NSA!?PKHl`x5_ zAy%jsVzZ2rm~>rdWS+}Yc0gi*W!1_3??zF+et z7Lm?l&X%@3j!WnvpZTEYt*EDI38_-}0ecv1+ZyfO>)d=JtoaQeefZ2fdnQkuW=cU! z;}}xUk;7v?^z@5kM~-j)-H$E1_clZ`IZsl)ZQlu`xiVwZHtfif@Q^9i4#S2}1uIM= zru@;EV@$f{S>Q?X4hpt70Mke!a61!4n1S7AFi9{_FPhs2ZJ~|1n5A@$Kp9$($iOa> zTLL&HU0U;p;(qg*^~DT6w38TFX1ikO4JNP)sX+}PQ=N1{1(oW*My43{5d;CA;}txH zGWSVkyb5SQQ6A`~PDatK#}XE=n1R2`BjutX6I(rFmzQkf z8$ZAWF3q#w-e7%uSG;drIA=jKiP|LRa3weH02Y5U6<1Ty0-_uKRrXLd*vmARcFAA{ zrcD$^`wzHx--D14_VV*(bDFmLVs^eusZeg@-`N}>B3bWmmbmv2h5OT_iK;ARIO7wp zs_hv;iV|+SmZ3QN5f(=&?EpFP1hPfeDuZt{M9v&ynESQn@_yGYY=>->o@Qqu?hy*t8hFZkz|g_`X})4MJ!@9 z|0y_FfFMH3iA|YjShxmB0Qd%tB2G&{wwN4L#`A(e->(CdnKF@6Gx3{d?5lw(4Ou-C zA9xaA2crRV^E1_Zba}37-jS>ca&YHRnHtR-qw=4|lr=3hy%ciL2sju;LE8N=pH3c9ZP0>vAI1WldRExAY9Do~yEL<9%k?F|RCj8Np zW8j0jdC$q%7It9j-t6f&HBtQy=mjN$aN#UlkD{(_r(FMm85<2M&t= z-g6K9bJc_Q9DVV%(S3&vR268Alchk*v~3adJwN=#u@~Q5diUlH@4a)#vd70N2#&#K zMgnC7YKc3}I#z%`%;&6S%r$zTVhXbnW9LMUmc5$-G&y5_>gD&z8K888hN z{HpE)ruv}(Dpf`+FtNO%r^gSNDJTbN`?o6F(_}HKp$VJ|BclRH7+{CtWnE?(;D*Af zvK{a~CZTX6uZ8d@+mTg)A2a|eqd{6|{nL24)@?~92hD{l$+c*`vEmNC|GBxVPQ7v= z)Yd2hR#*$tUtpi#V1H*pR=45j)A*W2FXMu|d8G^`Cr0_$ zSnXe*iuUXwmMt&O=S>;mbblUFt0f5BZ9^(DOuy_`$E$#2VDe)}Ev#8wq=pVj>cEUv zsXz~eG??*bP-|a!j2<7ZG&+maw#kM^$nrZxVkbjG@IEVbmswmCUT(sNz;qV8v5~R#zlSrCzh{!G9*ht_mfU z(qI!8N@WpF5|(RjM<(B$M@~GR)Fx_;rb((&X;@sL3Xm~KE~V*Ot`d-wq$zu#xWFmq zp*j!@jh`70CVb1WbPj7;V20L7?$dQ_(B#ZJv}e81y$-)~?fqipfE+zRm?`O%Fn{wD zgh$d&N&2($3-_%4=_%*U?K`W!&s=vAp^t{aGQq`sm<(BGI+v1%*f?f8rtYt?GRSLE zKj!iR{z6zw`;E>{+^p|-z~G!r4oTInd~S0ln}D0uyLnR_FGZsTt?}EYT*d{B5Vm>C zHkK?84j!!i{O2+b3GDZm69~~Py=o-`7J+pahcN*q-B0){@CY zHzWh9s7_XSkYEQgY#5^1ciCKAQj!L>u1qsf$XOT0wNlN^O0bn+`+PW0!ZXDzV-$V` zCera7(=^;XR{nw)C_Av4*q`*{AYzt5TZ&qlqOS=3AgqO!Z6WAU5>L9P+GP}Jh~bnW zf-rz4V2CxP9v~$6XHX5Q;}tj(t^)CfiODVO!%~qUC+mO}FOQaZoPoi>mqtMZR|N0t z=5sXn8Jjf8QO`eJF+KzcNmTgB7g%mFb#gSfz*zfUS^7utu-iy-`BGnT!uxtVzVy&1 z9~c-qee9U{<@5cA4s|n{%x{qGF4X zrKiN1Y2q05qB;e*G3VX(Tzfc1zq@|MmniOWHc`je6i zvv-lPXvviAA)7&JnV|L?Q++N&LuB=Z=W0(qm3{aj=QE${T)BMwAV8UVyo*lLUy-Km zI30QY&mfKwr@~*bqzu(fAnGy3G+#US#4x{BP)13j!(Nm&J%YpAGOODN*37r&OB-Q* zg=MIP?a*GqgKZu#0j5YItp2id4(4A>BaRXSDOJ)sLA|@1uBExN&?H1nGQ6l&!f*X}`^E$JD_S9F`_sஅ_yst~VX%F+>j>Q!^q`_MEm-Ner9 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%0A*w~6Il7e>|l(Ajbv|X_Hyo$au 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

      e4G<^d>; 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

      pFOaYLIwlb;D9BRFzDn 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 z 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 gQb@7PEDK1=`W9 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

      |hjR`un7p0B;u zpycH|hc!#1iq!0%<5iaHj09;u#L&kZHRh@iqNqw()DPy*5^C;=GSP{+OZ< zS3VBr*|TTxCnnaJzy-B_ZhT%me>MMo{P;1~BcjkA5I{1cIv<}PE3|Pq+BRIwiy2+s z*c6yyLMvMWfn?^-nJj2_KIzmRa2+|_Ca)AUS#U>Ys^-#u2#k_dc*P?qvT(W;k47hV z9_#%1tOj?-g%Rj*l$yU4O0gHUeM3D^%O~9#k?6d1w#{4^773P{N4_%6R)^7L?%YA= zhp6LVz#$n$|1D=l_{t;iL^fHs7{hXPSB`OxdayY4kO86%JKAGdj9EktufcUX9s!d0 znx^M}i~1}_(+O)09on-ZzF3du<`f-Jk3&kFq23BOEK>W11u05+ZClAA_pGR+7|-fs zI+L{D9K#oE0LE2w(j4M&wvTrtlcP;LmT!swh@V@jDHmrcd0fI6iqKbp^;DFRCA1X7 za8wk_FA*TZRg^+VLt!fLLkE@FZ^F-4JnhZ+(Do}^Fr-6@4!Wg{btLOmIjs#2j^!(O;6xttiT29k9_FfWEvok_lhCHhPOPMf z3HNM|5}(DXtk}FVj~#R@hipQbiA#RgJ5Urcs^Lc!K`Imn=fA}YV z@+UByz>w!n{_B7JuXA@l``OQ4ef3q*+JM=KK{|Oz~ii8M?Q>e}dLP<0)kHJ!}g?RXz z)aKa9N=Rs6PY#Evh~ij4Vjdy_Df$FC?6U&IUW9JwzRb$ZH!r>P5}VWLjZ@5Rf-A@Z zSxnXYh_du#Of)ba%%u6Cx88bdKDy&^hg$lWx}CNz`lfSUGJ<^~l;>rK=V&{tzyL$swLP$0BEPy7rzDn%&vA5bbAr7c=z6Wh)TA~GHYEv$#< zgRE`qr8-%;3(w4AqIlFh!k1`?B6&@p3_Aa6L1pD1&Mr1RVV{Gb2x`1tRB_q!9a*vULm)PML7|6yM6>X%=h0z#a5 za1*Z}Y6o9uA`DQOS?Y;Y=HCfNCdPu}GQXOu0(F?ro%@1qigFtADvE=X(_2$OvuAFN zXbdzFP-k8<_ccqW2x(`rdGOoTYw|{PtBc|>IfG1lLMUuuw+sy150~|`>SS|+28Y+% zoG}jzER#n=#T?uVnP9DbwH$@*%{Hs)atC8xnq&<)Fzu9bN0$-k`gwNO(|h(AxPTgLI9|821g~oszis+pSl;XmbC5KmWQPVk-2xjK%pW<=$74(%oja5mt5nWeTIu z?s7Fae(hA6F9)c~R>5Sy^2#eR1Dbw0Gq%to(a*dOq*Ox<${F*Tm%sc{0(d;rm}3k& zj6x}~_+2#J=f%($EHgQW-HDg&U2Zc%zx+Kx$^nRAO7JV&Npn- zdGo*h+rOQM^^>3cWd3SiJoh!1LBuv+6Y4#B^oY{A=2*q*+Inq5g<=$eW4k{CZFd8ipGoQ9vR~R6^T5dRePj#2|z4W~%h8mWQEc!_m<#! zi8w8eWb1qmI#@iTGuE?>P}=+=b>32u`9Gh3i7{BgwUpRK+$CjrIpT}zwFcsx{c$2v zM<0DOFMIp#w`>!qtGJ&{bXcdofpQyJanuwJ%#N>8(xD_C6MFY6hID1x}mw{h0 z!(o0hKc~O}YyUw-N}d&)U5kdb*v;-(NJ;sYSDUH#nM#gGjpzBx42FVf=k-Uj%YDj>42g~tuuPr zTtMCE3RyaTyBf`_TmDk~v*3+FICZtRB80`)1coerVVtn)q-W=L=_od%aLY{sSNQdv z7wM)ckSlpd#;Ulj-gUuDM$VF5E%q+uJb(uWYl{GP zCCd`9Q_1XVR%V2dpYtbV>YZPG;xR6c@E(_K2Lyo;FNUr1oAdS$zhhX#er{KtXQ83eX6GxQ++WrrtATKD9xQXt3*eYx|XCm5xvWd1uo1|=cHgl0+caB_y`4JQJq z7Rc$!iq~-+W6M6jPCqJ2YP+X^-w5(y% zs(AtHFz-X3_Plbg?dj8}6Qx1#kOUxA%Sd98)t2o2$~dco%+}S?s@0*ZLp4rB!Dmg9 z00MWb6A+I1tOn-}7BInRu^IY?>QLtsA%2onfXz(uz@z+H*o@oQVPq7eH3+~$^R^Ir zI97B0C`HjRAT8SEa-M^wCFOmU4g%^{G|~*A!Oh~bl-RJE608R5ba-2vz)6j0p(tBU zo=Vrm;Gj~!Z9ZzrrhMVDYR+Bfdm74kYwOJ~dpSGlxs{#!LLsdTu(z=}l?+}(+{zF= zu?8a*$&2KNA}I}2E@m*5-Dx?>o@xVs2ieaT8FR-l6>{%Hx=sM@9m>Tq*km`CMt;c~ zw>!UGQEPhVt$rge&>?!cFohoM=d4;5Uq%D6E$5>dg!J#qAW%pLg zWVNIVL0NTBa1Pa0+({S|N+;Myl}Oy3&QFFwI%dL7C2QNtpJQS)CD_E)O4yE8(2H%z z`^GSVAJ8~T*Al@TghVCzZR$bocdo4^f1+MY%$mVg@>c7Pi%n^t4g_RBJM4eVCRg6H5$Naab{`39PKDT*Fadv_Ia=akI_GyQ;w zfvU}1JX>ylOMCD{36L~#Jl5|C+2^l5{`h0th83GX2i>!C=1so$z3-vjGQr0We(;0& z;k?8AcA}HHs(<(I{@sK!fBL6?I(IP_HqY^=KmF+h7R*YV>z`|Q`|Y>wx|;i%Fy)W` z_>ZZQ%v;S&`}xWfH)V442NsrzUH^uXUU$k z?TMQ?2!+y5G5(V=V-iT0**rm;Lg2a){*ub82&|HjlRKBP4wq*`lOc;sq2yBM8QbV& zb7DpMJJGtRSc3_t!Lvl-XGT~2q{Y5+P3(&Ijw~juwn|Z%HECz5&)2h@6Ok}(hG>d$ zm}4)c-IAPq#ODBjTV1r3raalMt6!FJYl#N+%Ntc7e$tO%TjT(D`na=^?~ z!Z-^5R^Y4cJlry%ItvKHRC<9Dx<(s}xmIEyn+r5(vn5Z24wrFDL|P1so`0!EAydl} z#0{Kd4a!HhI%Ch*+#r-mvfJ^>q8Aer5X}ggEO?Tzb^exqV3K<&*bC5BPm_>>LV(MT z&&I`~M(v?ctWS}6>mBoMkrDX%#qE6bnuB z3}OIdWb%sg8V!5FbD|yD+dZtCC;foz{UQkN?O$Qcy^skcYkQM zK<2z`9_Va)9RWLyjXH0|7Mepu0|63$B+S%O=X2r8bSP<6A?3-uUuCdGL(oyyzRnAM;q z+Gawml^5)FMzKMwv+O%sMHr?!W0ySNOKI~3+<_llPX6q3Y6p<5*Q_jQvGQv+j}SsO zM(K5WP9&FkK5tE~UWBAIBYvr(E#+zKlryez=YpJ`eA+sAf4MkD**NksyI>yTF{pPC z=-9NsqVFnrN*PflN$U)#vlvCdAy&|-`p<`g!>gpH&!&n2`+?3oP@nlNlMR5=aYEk6 z+9aJXt&1g2h2>{kCWA2T8w88uH2R0~1U*n|jN;NwcdB{CbE%{IxlG=HjZO!I)8@Er z2+OQCU>iGgLKzIiuYUC_n%c=dBK}+zDccTB0`?#e9G&uzb>=*lTSYR%fI}~ z_uhLCl1p=y*RBGM&PY*{~vR|t_yNX=q zeyjk}#{5um7x8A0SEpxJj|wkHTUMJ=FByRiGDwr=J%MD@jN!avmz;)y^K<4r8+(3> z=pO{5MM<;>pu(yZAI?kXFnDZz5S`_IP65+6_+*vrqi8E1&U{|BvOs>deJ$d!IXfmy z;LRm1GNd^wtMYVkYb0OEKpnHt8HheOKneqz%G+E9tY?eySy$EEt;Q=$C=#VRvdX%- zq5x{cR;u?aI+$8fTWuY9YtMEYF$`%X!0Le4Nc1+}Yxm(sI0Z>4OqrQV6ljb(3HFXy z)0*65gC9<=)sw2GmZ`wcrC7@6P_Rp)3}??KAU3F^B3H~8dy=ctwr0DWB6~|U;gYGo zMADYS?x$F=<1*mwR98 zNia{_66RqeTUfH(pu@M*pal|0whY(^A)ZdsY2_Clu%y^9e#lNF@T_qsvzGigIN;y@86#nnW-TO1*S6p z1&(DiK6vmz*l*?TPdtVW{|Y&LK?gTlUD6@Hta6UA-+ z&)!@%Lw!shOyxJ_syIB90PYWyCt%p3f77lPd*q(&md*s~DU|0XBxGMgCaaB~mF>2- zz(E1Vr|F%bpO_OFZdr;8QLiJb*RKZdnE|!Op|xfvvoLc|Zfz9Y9?SUFOd{G9P-np5 z6@k@=;DnhAThWXQUbmhp<|`mhda7AS&jR42!B2v=Tv-TqP&qF01Kg|L4Xgsinz_&T zVV3*ZDao=@t3%Zd)6bJNJV(?F%U}Qc*KuVCxH)5(8tB!O5zS}E%b649@y8!WJ&!&H z<8VCp+;eZd@rHda=T-%`n!D*qKz-SGQ6GQ&@wiaq%FKNj-tmgaTLJdW_hRnx+hCN_ z%UUYZ{BvBQ`Bd9k7r9v~9gU{uVis-JY6V4VzL#7$aEMinrU`VLx(f>RcYdoWQd%LG zkwzg+**y zyPH6Qo*TRf+jD+*cf0S%CHe3S0*PHCSP5{axOwYhB&RQv=+Wp8%mFO#8JSN7qDt4F(#n1Nr`0h)|2IL$OPly0`9R z^=34?>_8P=jfXf&Sr)_`EElUn+SyUi)irUAqh$69axVF1(O2xF#7yDh_H1eemd6GI ztxBE+JNTQb&RDl;cPEvXV3`n4%nK@lUI2U%)O8}y{K%O)#UW5#rbK2}1E4yk)N_po zJUE9XY^_wHuoKW2`bEW#uT^Q9;51BZnK7$NeF!omty&_KG@3lyZQ?h~DGLaH@7}#R zw4ft!PnN;l3OvJdkELz66fld@;~G+%jr}6hRYHv`#T1Rb8j96a@use141LvyNd$n+ zps!;B}EPv$LNdg&!Nzowg;`RaiOdclAQ$gL_?!H*?Fr7|G|IA2q(ee+Fv8*M_j zd=ZiSG8?)=SZ{`f;snG($iOi5MsZNDKu}igVKpzTNSdLW-7&X}$o3?w$gEBh6YMG2b~$42dPs%fY$0S!b5?wvnWifIdhQ}r zAiGLmz9dSMFJ*yA6%_2{NFxDk-xJx;?9#Fbm1+!!Gt%g_$Nk zBGwHm0MC*AwkYvNdmTwBGM>|7W|m*7zoMRv<)1pgrBp9d`xdytcnj9V1t!*~YSJ7I#6_8I}|2R8eHglC4a( zCzNtZgpo^2Ui{lyQM@8bP`MJ9g`0CWlZr(kiif1SZLXhjBRXmYP=jm*{is?h*Nx;9 zXi%vb%5V$P&kAIPlhSQhBYAS=cUokCAzerz&t_Y78@acwfgYGa&MJh~*IW%}R`qN3 zh0W|3uX-Q~EpT$XFq-NzCaM1Ts!ljr2OXJ}@$`)r6fGdsG|MWCx+qSw3IkVj)^egf zUYQ+BcT4SX6PZc$hT^78{$A$Fs8d92QJ=u3Xu2ahRys<;L136o0M&`{QLMsUje?sQ z5ys@5`4repQv(?5Hfy-nvb-EIGh+Di)k;#92M2{Sk5JV$2RvY>G%X0%wh!f*R>o#ojVdsg?YaYW#?@YSLVz%b;A_#kbJBm=hgiqau#B?yke zx8Nw4?7!KOFIL$`6HTmwzW&b-KbT#rmI!uFA;{&z${Z3fqkrDK@0@(>CF~}NltVp$}B49++Qzx?GdCoZ?%1k7gsIiDI|P!xPR; z#zmOh(lx0)Ts$}xcAKvo2WX~}${n1%`P5TSJ$2{K9d0@)2Z-4vS846~f>EOVoB8dnU zY;~z5Sng4#XQ{7DrFeh|R*y-c1*3V(*X`4!WT@T}vXjg>5d}Dn?ZJ6{7%EFk-35%P zVXP>QLsDpFf$5&F7(Z|R|Gj(nXyHjo_S}a&FRl;YMZnO^HD(jpClZvFyUxY-_ozhg zi6YanMC9H>PA9{#VI>gT|Ftz%RlzVV>v7PII(Fs5vp3u5PN{g3fT&~xJ*1UwuWTKi zz`?YnQb;$fCX>#wV2ROG2?q6nT9Je2UGrF-I*oQy9J(?W)p)N72e;;{v{X|NMs$8P z>+r-KWOOW{EQJl*#o|X)X0c?Jdm&)Zf;aoTFz%S_#qzVmXOq*Kb)H7+Uy%=wUPh#q z<)&|Jz)^8Li$XmN8ku<}$wYCaD%q!>ZV!3^3?O%0fmS5RMK9ZJ%S*d4L`Hu0G?ht0ys!UQscX-S?rPNSTa zf?efu6&JU}os_&?a48!$4_!J!N#!+assq?IfgBBaSBZDKrY3n6GdkgzlGgyW48t~c62{BxD>)gMk5R#+kb-?x&(h#?p|M~LE zFOQ2bb3Kj-sTnitbK5z_s3<`m7buQ59Y^F>zxowq8a6(?Bq{5)cm#eiwf%Tk?2h@L zufP5}BGGiLG*JuxW*+_*zxV}OwBnTWC-4c*LiXu+JaheAJYT^?%*>9bHFusP86ZL5 zm%TF|nLE7r;*0a}o-`1s$9tPUQFboUJip8k{pL5nnTzL{Ipi$*V_=yS)>5lx*wIaG z2-lUWY?`TA0CLcnN5feTJisav!Ju&#dazDdZ!8`lSb`|yU?6Z?*<19-$LTI<8NU!7jVhY#+EfpywuVEL@`HfSn=XV0DGBODf=f^e7Rs!2rGtQDH_ z*3_6RGhA8KuPt<1?YR3=XJX6TtEhJC^<3mj^Sbn2$E4ACW#|{QDVDEF`)(&Gk3{jr zHXS80_8bMqw2;(pv+N6 z`7}ozg$WFfFI6Olnn}J9KcH@Y16JqP5a(h$t>x*v12J|)|D?uQ9yssj0V`3p!aFqy zef^4XlMR_0T2DT+K=BS@Crly$jEXgag0@gl;!H0`hgh$|&aNy=Q$JLiP??2yB{QSO zq6xd=0csFX6V9y7%>jyVaax4Dd`H&myx?oEy@n&jICwF^`nUo!{yZLpUtCyf;Kvsk zZ$KscIjiR4`74c%Ir8U&a}8`n%EbSuQRYUYEDBr)th#tfth@uE6d|FLRsgD_dY}8!XlI+YdqA$oU0_L+8c>rGl`f zD$ifP{`%{A!I?ERnPw%-1^4dVgMx!fB)LuiTCf>eS)Nj8>yaSVn9y0t9M-i)Kc0nH z0Hy=W!|I|walU9~jokF`dSysJ@;jOV+K2RmB7VWopvy(>M&34M{YgXOZ5MA_I z<80%+C8nk2bgWw5Q4Ry97{u<8m86i=qCCH;dTFg5C(H-$uQXg+Z8hn|ObDMWdfn;D z=mtp~F_huEShD6ji{EG_%6GBVvrp1NS^Px5PTa-ZfqWXF8UvlP*+Ofe*kE(iKlZ<#;MA!@O%=~RB7SEhUR#ZGuE>^kBYA`x5$ z3VGH$Km62_mhWsNjb;z^Vu%U?2I%0jqO{9SV)uRnn;N$j^DIWf>Z63O$(&MqPs3Mn z8rO`86$D@yjWY8pTByyjg$vls{rmShCJ7F4>v=G?01h9E2g?9R4-5u!hNe-uZU|5j z30qyfGRV(t;MWmH1u%AU6yp)0nU~Gcuq7<%Gc}T5=tP(octg0x-v()lt zx`pmopDvqKb?*h(0sCBI*J$yPcN- z*B95&Z~?^*_QwIr2InjBwg{>=ae0S=$=uVv7L;AUn<4r{&VNQ@?05@C$mUvnYl|^^ z(^nd#7?r#zADEqmoSmx$qt6aM4?@$Rmcl~4f_wmlxi%F4ei5;Gk+Mp0*C6?>#;%$P z<_kVDrk{2{#JfC(KK)WwU0q0pOHJwOKv1Psl`v9@hBx&#Y$mssoKG%9*S5gr0k|KR z^fp3DdY`O^@tGd{@H2n1Mh{uSrIRFgio;v@#H7PTme>-%IE8?9WhC9BMJeu5PuhW% zPXKNNGfxQ_$T6Q-_wHN(9>aQuGDVLq1PmX0>@oUgknh8uAatwQv7IV( z95}pMu%9GhDBcfgM(>&4YLr>ckNU{gJQKP&q!uf=Sy+=eUJD!0dNbfQ(C%2ti_i^P zqPIma-0x=XtHtaLg4vg4Ri!>@Jr_BMH@9AHN{ibrso&}Xdq6Kf^@1Mtc$KOk{oFzB{W`bMWOp8x8`CIXpzmeg12h-x*+=)O=!BP7-}#c_(|&I;#Dw%pz(n4G@XDwfV!xQ zv!WobiZ+@rT4Vohi``Tn0?KxsxULrG$vfKzNpQ+I&fC-KX@JcZ@`9u(WxcDsIeG0dToQO9#6N19T-+#tl83n;YQd(u((G; z*}jpc+4O-AZ`%Q05Q!Zok%S#?v{-^5v0FxAB!&fLY7wtau1AaSTa|q`ehW{`Df5t! zyQMRBBb55%Xh^?hNXa8J0t{4T$Mkn+9>?>*`KGX+-N%!YBvNaD$Qa=a*{Kv9nViK5 zL-~+;_?9m$fT0$qdWKNld0M(yXsNX7Y<5EkaZSa~s)?ub-J1D6gL?!Jj*m1xv^cSH za~HR;*i5xTnp>&3S8H-BaJ9PfUCY-mSEl<>7q%f23z!F%qPMicbiA}6=JD{8lN zxvFHix}UCESLUwWzuOzUrJ(=rjNKlXo$q!h@93yv=i#mU?8h(mLvXgLL1z?rEw9{q zkisWzBuQM@Or+abhR3o&n&5UKYz()&#WIgvXYD&}?YgzEZlQ`VahU*JyBO9g87%fS zSwI}^jZKZ<+u6Vcs^lO{g2FI5<`U2l4wn;CB<2*SzqWIP5aH_y(y$XM+1xgYszJ;{ z-nw;5Y9ZAVZlwBo?Vx_*pSTD%lbZhnahPV4tb{qJ#uSccAcYez3Qda%_!zVqiV|7c zjj~xtLOtaWG!wGm2?tw!z*x2Jqm9XUL5>_G3de$T7<7|!pLtD`LMq!;oNx7qYx9J& z$C;R=DR8%vRJ+wxQ9gTV*QF?G1Xm@(VyU+e#fr+Dup+M`cwn8&N-oGNLU$OqgAW2L z8g_$N@F`&0>Sd!?17+&F@4lPQ-oAa?hShUtoaWgbGgj1~*+yXY7cT`B#xht9ORJjK zk$l$rF3dpnPI$_)+}N$~cnB%UA(9#sn>X`iDYD1ynXFk)A}x}tLp6?>XgxFGOnYU^ z(J|Sr^1`W~yFeWSzZHipVZfhkGN?W5>aF8Tz)9j5o?HQrrb<;IZ#UoOUQ8Nv;x5+P zo}xHsB{lBLnXXxdK|hL^7eNy3STH~j+STgQxL??CxsVHTIQ8;Z>*m$Vx_sD+Ww&PX zFtvrbiga+NU15Srq$yMCtpI~iZ_^{huEP>a-~{l4&18VVo#b?LfqsFdw`r8 z@b4@mP~yUv`f!HM*govF3lSYQV=1{!q{&5M)FxR-%r))1m0D`Lp=(ZgsPao}C}VpB zMu`okE_Dt*C8913%yh$UFi16f$&}&$@({j_?2x~_WInIMu%pa@Xru$ zw0K@~A-$S`txg?(m0)gZ@p_VaqOuk$w7O~^+SR<(D6ZHuZ1rXBlF_z{Xs_{{c)DfG zU^g@%CcoOkSE&-f17^hd)iAyFrAw7jZ=+|7&YvNZoOgZ1>RdxxHdWCv#GxV6fj6TO zBQI(4g=er=2Gv_Yo8*=BN`Wv*K9Y_>&k$-bMuuHnd5iN5yA~a-NWE?l$-cQKir(5@ z_O-=*mD|znR$g!Q81gJwbs>%LPnW?baHv?%FXF6jo( z<}4698=5Zkw+#nOZg$)hwL6(E?eTe0QS4eR_p(SA+YGEfb+bIOGPor?JFm?_P$Q@J zUw1{yUZjwV9%W5o^LeM2sv1~(KP}a8zOE8~)L)pNGJ|Ujw0b62X-aJm!yRT? z{vZrE`>37H_0qXn4Ir1~QH6XA3YUF1b^!}f_`!V5X(;imEnX-mMzY1j?3Qwy5Tvo8 z)mf~llVm?8>9lwrtHIOU%AVLhd3BJ__E=hWxWiN}QERGy#*@&kiMk|qCfCm*ClW<0 zAIS~1eck7>VTv2K-&?!bgN?C$s;j{>H@z#IMs*%7sHkZ5;pc3)d-pDd<%-Qn5@ci6 zXf~;LbNBcaOR!FGwrD%W!;3|6JyhcA4!3@RLGvWD{PK)y7DK3cmZf0PdID35%Q-kX z=?k{BT%ffT^#$jZ=Oq5;KmSRl4DVziwO(wbH0zDxGMix)+wOVX{l3Je+s9M`CGg(9 zlGG@%O%yUEfF^)(R8`F&oqFrmEmJ>+3ie|{&l83gGYAuWu6**zC+7ucYs?~?Ju=%C zR0dSCO58YPa|bk|Z-8FT391S?1qygbRn%ldQPyO&3I?24n>WP_wl1Uv#xj5HlHuT2 zK3IUkMS_8HBM8-4OyE-CIhPv#ML_hF2WtWEfBpY|)^=XSN`(VfuGy3B--^2b3kTZ# z=PdYGtcjbQfg3J!RHX_??Q$aQAo2agEoM-wCrl()L`bP=wQej3s(Rp0TFDl#)+p4k z(y}bvsL81%H-0vWFlJi395YQO+GSr0*vNM=;p(k$DOm0IEBUwb!DvoaJ+i z-c>$zq4i}_TMr_$gk+6$Iq_xUm>abWg2Uy`A{AH@wc!RC#QBfsB%9PqH z1!uQCewPuqF`=@Pjs{EDw`f<(QVkYbw$wyCRLU?@uM2q?G8e$BRLGO%;Yt7}!8yDc z6?n;mNXcXvIeo`pVL6d~09I7C4zUIT6}oq^ecV zc@yT&wi||~_DJ#|Q+uM?9~N^NX}5r*s)p6Y&_ttdP-?1}pIM8=Be|#sa`xuDxKke9 ziK$^}f7z9&ZGcg?MkZplunD1-;!uzmY_{ei*>5-nr|BEhROMyw>{~YYP~I%w0>93ijF~!nT(LH@F~*dHkf* zV@-KeOHKWB?6DuYtR-B*LuZjpjmFiuoG6=K;SHXAwfeb z2VTxxOg|bZoXRlFGW3FpNq0~(SPb` zCv{z)!>oS`HHrQqsHz@rzFXaD%XF=rQq6(mnFXT*QKD{Z<4<~rCW6aI1WRnPVMys0 z*S1*uAnLMrYA^+)wsBctDZxsC!pZZ%fvt9}*bE)?&^MwblYP(}ZCev#4{_*CQqwtW zb_8Wa_}sc&ux)JQUV7}g>fA(v1jgK}>rnNp083;a^E+c=BAA=AwV6IV34kb;gypF9 zkg)Rt$*!D6<4qdM;%5Zl)>J@nVyOw^D_RW+&=aet&T#Sah}4bDMQibC%6tWt1f{d(rPcwV_r& z=jDyohiz+y#k~;YtpvVn-BDf&)@MDiHLGpLq%C8cS;9wZsYK>h)2L3Sij1RV84+<$ zSr=W+r`XIw+Lwfkymz9>C!ToX_U+q6Vyv?OeYIZQ4OtyY-}hn`b9w!ymM|iGOEssh z*tbHJ2k2hHq^g>wloq8i5|2(OzWf^l9dhJ63^P^Y$f~ze9$s}vZcF_I55WBiwac%P zO0wD()`=0PQNc`wN!3x;%IA@2`p8+LiV}27ik7iQb1|hxJQaQ+KPH|U{~6F* zo2qn^hC7NzXkwsxNjAi9t=h-K05cVnz6LW?o=bVON>kU}u`_tZ=9hEVBj;M8q&mM% zBB)Se&jDjTGuBGjEzxUIssOfFSo!TMo3o(fO8zej^0bDUN(xfJDjTd;k_S(kxnn~u{=~KI zV0%IiON;ZH!MS)Qtrj*X6Hd#64*`lvSq)o8$udD)+KdxL5QD7-7jl^JPGH6`KDg92 zeZ*Tb!#Eq(?N1jl7ddVm72qv&y(r*Txw3k+I0T$EbN|O4d(8XeC*8k)pWGJih(+Ui zPD*p>%yBT=Q;%giA4J&NDr=|AQo$8NuJll+UJO!}WQ)!!6Sul^KTLh~f6SFROJ^2L zB2LqyYZ<LHBYs{g(o2^;R@QOCQw-eq=S5(v@K;>#Noe zsJF;=#X{Xs^?tG0cQK{2RJ%zi%{}9*fvz5_%D-l#+Rxor(@j48-v#J-+&X-UwuxJ| z7c1ble0Xent1TqWC}8EVmq}g;4Y?F{#<9qG2^QH4diEqmF6x31ptG-7cEBeE0}Cx! zwXX2%S)+LN?NUI(quo>48Xs;*T*9o4-5g^ygJ#z!{TS1iixpUk`q>v3vnvHh^*P6| z5+iF(nk|Jh$d%BLc|o!daHUyqoB?L^ef@U*EH%Wlkd!=~{Lo*QKCJVnTg+|IBBQGx zR@?6)_@+>{J@(AFl_^q1lT$RgvT`RtZB&OtZ%f-2ZQ+(-J=%3|HOX2{Hmb0&aAv`Y zRnjN}u_2=XlFI#_?ksZk={1*a$fv*>_!;LY$-en4rP^-8iN@ZGgM^O5mm{_&505anu+ZE&p!vKmX`G`L6nRc}TLn*9pI zqTJvr=o?EfPGQ%1g<+%?6cBBHx|1cjh`Oikz2*mBW51mpvsVKqjpTA=%;r}NumyL* znJwe0*jvRO4d9m;m_Vr?RP(mFmlhbUs^{-FX{G&|;Ag|zC#X@TZP~RBC*k)eNlBhS z1zpc;762=2$D})hXaLHJDT~7DlERp0uI?-hYsFKGl4MRbzhj}Jgx_w?lZgaQ3KYpmAJONC<2r6=Tq>AscIp( zCu?Rpz|>^FrByQ|u;?>P9mHzJMqoFN4%v6G0W>Yt&IY}Jj^Nm0xY-LlWQR*nrH4nE zJY|5oDpB5Ome>3Q7wem!-HIGC3b*jJuh2S1D#zd8nyuRf6|e_Iyi)|HK6e&yLn)TD&~Glrl~Gl^%^k6aR)?$}*PijMN9h&=LsGfG z+2J(#k5QI~|7kvGQ8iYc=oG%!Us*kvJ-JrTLD_Ov1k39Z7a*Tg!3Z;_9FBI*@~kiR zvqs>@B-CP@6lM?^TN=KWkE+DgGt7;Nsv-+?6GaZ3$`y9E z?6&lN_PiYMi~3Q80f^Cc@^0YJ*ez)OIpzlFSZ!Zm4_pM-Vc7{S{aC`#Iu>^PUh)R3 z`^<^WSZAo-F+-Lkb@q8kwZeAQdNiiuO3^a&HR{diuj3oBRmooA8Q3qAEzkufU`8dKs&tA$bOb7A(s{9L zkWc|uvh%Cl4(l8wX^CvDw&cjn`0i4wTgGo=0lOd>`4CyPxg#@siq2V@)ckd^$&&$j zu^zC5hqKS!Pu44)?6(stF3nU(a!H-Frc5`kEVt#P3PibXi$$3}ZY@i>6QYXC`wWwZ@zxLiL+03L+sQ1Ox<%yquKUzcKEg+aW;z>#Ny&=@KaDAgK}*VyU^A zP1xAE$a(o$*tyxc_}H1qIoQ}aS=l&Q**TfnIRx1F1=zW3->D#x=#+n%Sp9afcebQY zVu2zi=i!#&;b7xtqZx842St{C9l^473`=pp!Eb!q0Hkzj3W|Ll0TJ|A~u;M>yt)ZyjI(aBMH zL(h7j+0NhItAo*k>aOe4m6?U_ z@2987+uMu%-OaJ_vAes+mzS5PhnKs%o0^)M+q>J@g~f%r>7~WF$EWA@9_Gh~r-z5T z{{H^Ui>vkZ^|__F!jiJy-rk|UuB)rto9mnL$8i+;K#?uhx>=@ zp&!0}e%BXgn_D}rt*xhL7a$O5eQk4LVd4Dz{O#>ycy#je@^W-y=JoY;sG+g2uyA2v z@!{_NAMN?s`NHDT_}Jv}@i7<--r3oy-1v5Lb8~fdb$54neSLje|3Fz^B)b@ z*H_o~5BGPscQ?0y+uNIe(VM%w`+s(Ib$xexQ&LiLb8~z35B3jqcmMYGy0oioV`F3Ecy(=JVq)%}u=47{;q{{7p`q*5jK03U ze-oZx{IgRdBO^U+Z4W0_@DVtfll%Ss9q?a4S8;#J7U!3C_YO{uPc-jH^C2LZQst$@ zH9S_My#YRJcUjHMy0u~nLCLC_4{64$n%i=LJHH#W+aS%DNbc|rBpn0tUAnhp+p&2N zgu4Z`I8U@=U6S`WQqJ)8zq9rs%?2GMZ4BDxS9hw>cfqw2H%Htz^m}!zb0z^?j}N>a zZKrOZ1&+~VK0P{}j0b8Dnngr6vme3b)y6zXf2J;ryth(LV3Vqrn$F#P`|h`86ML_^ zplV-$eRa#+LT5XXi9^GWzGD&{mtKjC%RQH*p207Nykwr&L!y3#sX(7NGhN;sXA=6Q z(4N&{UgS-)V+3!|X}d_AVgP_k`k{93x#JQ^LN8t=jRH^#kSeM}E@3pJoY8ZO9K6i`<`T zHvfG+`}v-d<5X50lL`aB0-Qh!-C5=451!*9##2nBQl^?*}E=kzMhr73=})k!wQIa~^^!g%Ob8*J08OJmea^ z1Z3PiwewmLEZ{pk+|EFdvdJ!tIPXHY18i3pW$GmOVPZY>n zIS*kD?jg7HqsT1q;5SMrrEERdfvCWR&#Z@ny>^~m3Ll5f0)rc5$D^ACbBs6WSSO5b zZjVh_I*nGY;vsT|uo^A+zFU`_jD@8ib950Q{zd5w3-({`6p5-^Y4YnBpyLr?f2)9J zC!5juh4A$qhyjuHo{?3IT_TU`%MVE&#zuvjZcVJ6Oeix75^3O-a5!2dnI@64ENuQi-e4OFv~X+qlM@cmT?HApDnoe$*mU z#P!{mUpO6y2+!s-Ay=?bt)wz;-|+rq0z!-JOO)ng&~Y)3HGBhr ze~<7kvqjl$8G8a*u+!Rs7vDh|7(TF5<{28odCF2a4;L`lYd<$S5omF#L!T?cBQnAX3gvcg*AubE>?g8)d6V}FUReDBr*>M3__>1L{*P}b2zA$eu9+Dr# zq5$%1JM%7bF`8ZiPoFAPjnkdIM^`vl&NyaPLBgqVj)33VO6HnKJt=D@#j#o0ax>fv zF1|#sp6PWYXvRbmOaAM33q^q_WC0N!@!z5t(f|qY%`de%=zM__+-1UK1R4>75*!N$ zC{q|^2H}X(g2@XE6EhiLE&4KRy!6PIpw%*GeT1rx8x5hg>eu_INC_K_Z=*A92T!re zd_!S(*T}4L&uF_h*0q|Jj6Ko!Fvz(3@id<%IGJp#Rq)(SVEupzwK#F?n zxYb$E9+&TQkN{!@87%HdGGYE~r1H^5t)rXU?P|5%n~XqB@Q~>J2~_ZM3Z6mDI}FHK z^i?I)g57De3cE*w;q-YKy86j2;p1a9hL?8KV3OOmnrDLtOBAA?3!8C1`rWrJk^eW@ zFBVT?v`D;q)Ojy)?gcN>NK(o)fW|Z9Qx#o9 zHzb1q*KEafSeD&blDN>m(|nKHn38!kVX!F%+!(G%U1l8JB!o8QOnc=qmP*2l!+=K} z77h`yfXKApfpY0ueqXk;BF5CgxY_QxHx`p<`|k8~THdt4!t4h`%NEd#VTjcs|)}xd~KZIs5s1!hkI! zJ|M0`*ThT5$rk0A0*vASq<%|Tsv;q&x`}6?5ZoBn9Gep^eP~L9z#-Gbdk1VX$~7AWU&h7hAeVCVg0^^tuQGCv7`XoM~8?iIg?%=VV=~ z0^6FsqzdzlNcz(2y*RpoUs8)LB~Eti6w_(=mrfHvZL9RF1{{1U>rasu zA9F~RzKS}YE2u(71JXQneC$p=mK$;m2_g|o@7c}Gzlk;!VSqPvh?2%02(f)DFqq8z zXxh0a^S71Ey-obHz`$@q=3*bZwgM#DE~;sChP>c$Qw#kd%v3L_rrvn<&yLT{o7zW} zC#0)={5A-jrbq)oyc&?zibYv+5>cwbNC8{+0_@a@a&mNT2T>Ao5QjT-4)A*ilO1{g z%7$Lxi(;_*0{LCwDO#&`ARU$UN=X2XyPrLpqGwPNp683-xc@q=do*cW_9g32Hx553 zqs71qP3p17fD%L7?PT2Q-l#U-;j6WPNC>a{K*dSgz1ktt_WeY~ zix!iiuJ_Zf&Qpo|jI8086k3_Z@!NO+sPtl(NL8f8`=>G zmzx+_R>DuC1i6P(10$aDwTL0n#5CPs{ph4i$al@v0&o)ufceV!t@b<8%p**BzO6}3 zEya~q8sqVT%Z9V7G5OV2?=laLGX{3aiTrCO$5|+W#1?kv^Xe%sha3?^iBQlE9dE@d z>JcU2ik}VQf$H?o#vWMG^?v4>{kjgG6nVY56@@yg<-AlEM9gW~?tr1qZd7mq%^3#a z;2>e~u_WsP{PdBzDo-^Oi~E8`U2tz|FJ-ImH?qRIA^QT=kt@aUlw&EZi6yCyuRFy* z{mxUDIiK$;chDr-FmLU7iz(b`>cd}gfudGBC5Obny$jq{k#rlp~XkY z!Rfb;T8mU%>?+Y@1cDVXf?A4t3+Jd~fk@ar(6mUMHO3-Nu%g-D*tyTqLK#x2a#ENU zvh#CxRLke{o7bJTW+#OaaRR4GtWyAG`x*+BYy&Q`0iMrO`j(S4YqXO;A?kiZ&O{Du zS@1|xtM&P`36*onW{`I<#QuUM9F{~2ND&k6N1l4j?BMef5Y{@hr1K?~`+&0Qr#s^Er5ly)V-{>RhK+N1!oIX&*hWQ zMokWNV(qv&|3@8{ZP4vPJQe9`ktx;idjMs`v@StD87o8jMf2-{HAZEc?l22mW6A}1rbJ(r8$H~2w85OkTZ8ii$WRkk zfM7~yW$TjfmM;`H2e-=gl;z`sb4rLaVU%mfBs#{>WKGC{!OXl*PdY=b(U03aeuTb~ z-Sf%i;h7F3g)|j3p?>wXXl+NkUj6v&8@7fv1btw1c^j)Pz}*R5%+%lm4{J)vtslCG zi*hwbJerDP+7VYkrs}JcX+INEt)4*o+h?!y<=@B6E&9jJ$M;v2Yi)rQkiwLkdqx(K zxdoPi_*B@@v~Ldy8JrZlp--PF!-CxOf~{{ssTaa1*%2DO0=>h}|V^l5e1$D}@wt;ccUt9(h)66csXX2c}3O;daqgjzklQKfDo}r#m%=!u*Xnd2&B)qz6m*)pN!)??mQ$4m7}$65^aYbTEJe_*)woPty1h+g zgAk7fMgRVS((vZYVOUX>Um7sin{i>;um!p_0nN*pZ0c=okHn_fS-pk2j?&YumKl)V zg!nV%@hBVfaH)h@Yeju8gX$;wPoH$;$%V1CZ1>mpur{)sEM5xem)se8LR)KzCTZnx zA>P4&Z5LVDIw^Ia-P$f4^+?3{*^y=5*RXg<;!}x{yG)(OB*AFXc84~f$52iP=)Ae6 z(oVb39VGWEAz1XDyPmA)GYna}W_!A-l|()Q4gEzr8-dtwA5WpxP1Bi>A1_lqwb!Ue zM>-tvncqxFSQQ!TfYi6ciTON?Y2&Cvpr=v53oWdHC<&Q>qdKKg4xz>i_3(Z%3$zgU zjUsRBBY8@xdaK?wDGJV|Io|lN_8?}W>Vc7JqMvr+GpR_cZ(IYNdcT`{{7k;q&QJc(#<-6 z`SIQ>Q;bdGQLDQon9%IS@&xe1Z?CuICGOW7c;;BX%6JWTOszi8EZ|2EIwv_-J-4M! zPKQafNtkyqil+*{FexWk(6sGs`Yqv^4dz=HD5vFa7B_z2JhNV;#W`=i^$-Z~%L1Pp zFmEe7y1UQz$qwP}7${F0_}(vk^&bTg59qZTVB?i97+5BduFJIal2dw9aOl*;IZtT| zIX~QalvV8n{yU+JgRRmRO9~kyTp_0UnFX`v2rV`~E~j9#vLAP{$i;nm-ri^Lsm`5C z6>+D#{fmk0gCR2LEW{q9yz18rtYpf?%j7G}z)?nD>nMm{Uve+*(M73>cO(I<^@p$I zkV3D@sgdI)Kw10uM|ftKRFL~Ie{r;;{bjPdFe(&o^cQ6uds_mV%a;oj?XBfrM;`-W zzSKx){gkn584hTxADE{u$`kU5aP)_s%i_yXuI|;IyKF_AAF|g$6*jzt~0<2NFTuIa%VTuq6&`-Gg~D73rD61dR-bS;_SXU-bBy zTt-r(kTm0P-!uj#?$A>;*(rg9-djFac<+09WpfF(8Q8LQFwkfejSp?B(FtS96P#6p zDm2;lLAD7S0{?LB`!gTYFzDK_t8KsBA`=Q+J{F7mjSH*ZC==T<))WBkqRJ0~ToH$t zo~m_v7LxwXK1RU7rWjFbTAGYckRIa2u7;W0hBJDwase*S8Q3@8461LgKj{o3`|yWo zX@EUaGcH_oJ1)dCyeDmCFiu)gmvTjJg1_^fdOrz`V*Sy5w-CkJwbOncG&j+2$^XSe zO?4PT16s^1Bd;QKnigR zpHT_>Ea_HWhW!L@xEznvIvxM9|8>MFkGyfI&iF+MF>bjwdw^8o47UdcXrZMAOQME@Vao=!C2^CP>BZO|f8e0j=&z2qu zrjmn>7UP*v24^h`pH2eE>!Y?gfwPLv&fHZxmE zhpryBYBqjw8Wj1N!Xr4SN<$X(4&h~JwnZk$=Sjd(oO8#-NC{Z2N5Xb@RTUY+-yfVx_e(3OmFK9ZmVN!6_7 zGQElN34lyp!eX5&-d*d%Uubc-=($?|;`|U=eugr|A|Wn_9h0FOj-UkL!i>gV31$u8 z*~Zve&~16fbctr90!n=4`);b%sekdm^4iC~JDI-c=7{5*a(3ueYL!psBLY})fU;>Y zmWSC8iJs5)&<#iCM9O!ic$~<-7AGI=dwTUJZpNO znOt7)tGkZz1C4Sh)puy%hSChUR*@ABWISOw#vIEbEr4J(k+H=97t(p9GSJSzV2374`uyu9u4>n9hIfR6{Iu3EsBzf!4D#ouJ< zg#@Si^}Otnh^FK8{pGsYrjgpFreCcX_DZzswb0f^;-!2(Mo07_83(q@=f^Aiy8sHO zT690ut3e5BekKIT$}E#!jn6+@?H`#~{vWmuO0Gq8RV}6pOCQ)(} z+TyD%g{`q(xr5xJ{)zn@El6icgcp`X*;WNDYWcb>jT8Mmn&S#n+D$jYpZ7=XuE68x zYUU07F8Ana{3+3ujrV;ZEf0aj6rk#&QlCtiXTSMDY*WOs-}?cnSz;TVi`Vz9x62mL zBeNwYF=tCv@nAaN10T9iXD}8vYe)eg@tm3{Uwvfqrnw9RdL#RVL&Z6 z9X%J4vA{$$b=-C;b}$13ULsSKZGhgGu?Kx#K2i@py>3-KYkf3J{)x^70q#{q?xs~@ zzkp`y{Z1uMmxu+sMejrOS>K*Q$Ugb}1Fp%=x2o{Fa`|ZTnEf8_ZqkVdl1EAQNHT$F z6sXw3Q#5gdp5>cq_}NF6xdGWtBWky3gdOH*_>79ef)^{>LR%;v*1e%5qVTDzTn$D) zSJ>vAZ4s_qWPkFa5@Q*30gAn~r(*BnKi~o2N;2BL-jHhx0DrGo%2N|PM{dj@oZ!PR zR~`_Jjl#ac_q6xM=gmKxwIfJz_1s-#(lm zI!%AYI_|CO;bHj>_%_&;{|g&;?#tNWV60oCc*rgvx=@Tv$CnLi-bC9!;plD-a=hZ; z%zi4#H(TL~fh95zzxOJNJv`xd9%M750I%(4qG0II9wgxnLU~5gUC;L_(DQw&;oUV_ z9MY#rmFn8l&55@@rj4xw4Jx8T!;dkA&PX;e%+pAMam^E#dj ze>&XJiCuV&L;VcABJkI0DT8zmgz~3z>G^HR-NoMbw>H`=&Ptc{`}C`bcy@8c|xE*N9C@6*|RUOHGBf%qX}k zq1R0qhSi7#{2nieBu^&+QilwdvKe5J55#^)bQat8_KN=bAkt`-o2No?|u z6?XIp2UA1>o~I?zNCd<*gF)|59oI40ThBeCT|w)5Y?E7tE=zJtb>r{V9hnN;IUcbn zO_J$Kz&)xwU5107?I#FJuF32=Q&Y4Gu+m9%(oBwkdJ_6{Gu=8{cvCE642k%Nh_phy znWDbS%P_pox(4Ut$50*;L7rr8Bt$zDI{~A3f&^t@;VuXP4XX~TIhvjxNy)d|DZox% z)bB2w!E-X7ox0Bf7m|tS@QJV6R$M@oN%3^06e6+END)?&)-s`%XzGpl^qF}H!<2C; zV$)xMuk!eUAh2At)Z)gne>tZ5iFDmJF*}xV=JQ|dO?8^OGYlyTN7vJS2@E^WpwtxZ zI(%s)Th&4p;rlDIR71CS97WNt%N=)E0y=)#^z^R?)B9Y@@MTyDc@a60x>jrBM%JTl zexV8xh+0SnR$Qn?b55`>cydtMV_z-TYS~)>RRrn>IZ!D-^#AQgAtB!~43q1J^CC4Y z1*^T`bfI^zMX0rfiL7YGl3?L_Kbrgey7USK)jm9 zu>#G44>?loeAQcZG1e*=V$Cx$)xxIByzn#Jw3VZ2>ii+|Mq&>lolrf0Gz`bZCvofn z_9#&TImg1g4+dnJm+U4?Tb1JBh3a69x)UznlD!H~!~|pMy}TTH%W=so)tGBhVdfym zwQ&h-7<{x(39%Z3Zqbei2z50z<(-YCLMSHaap)SF!0J>~*yijmP;^C{{_uK%1FgIX zN)Dy1Vy+ZNc2zA82Y(pLb_9MXmf;-(7>uD{7TFDgnPnC=Vt%EG*$^=yd9tADgeDcF z1_%WStSpXu9_gAC*kqt~W3HEIEwsAGBhM34UDNHJFzDXw2K4za-BL++OD>IfoKu)V zszeY${@$hIzssEg@aVKZ98R#Fpi6a95La~A&A7xSNb>yA<~EE|8sM^84Mwm7*lTZC zBdJ7kp&?D+q|qhrR1CEfeiwFOjF3_$h_T=kW+m}~kaVtagoTq5f@z4=WnJ5cP!Yu` z;W2N;^2nj*vf>%p($hlVrI4JABznbjGbiwr1EOWHG6QdSmW%kR1GPB^cfwLVjjgNf|`Za0zbx3 zqoPeib{&PjRP|dm940kJmeBpE_i`nUG}ENkM#d&E8g|vK)T*$q#GEC>7v-FCs{;!qo+AK=L9kkD2D{AFPrZR z;jXFY96o+$4s#XLhdpRFDAw8fwL1oc{7Lq!g-I}DG&)eAo~=gabQkkzLb4=v&LN<*UE!cH-!pz`nxhy%PO9R%np4BA*0`)m{_6=mf?Y4gpx5i{y-F3M)Z z07Wiyay(k~0}r9X=!yO&l6j~y`)g~I0`KoAl-BZFn}2<^`G!n><}a^a$N%2%cpBlW5(!CL zV2rZ6ptD0NYwB*H`a4>?qH-2hsCKaX+@<@JI9_9a?}xB}A_SyIV9*4wo_h~Rpf#no zNci}4R9K8CaM6BMA2zb4gPHDcTXxg&e#Dfh6Pq^5Ca&a&ItCSm-#%d8-jO(x)HP_< zK*_|IW_*8r)x6T(R7=UknbA|8Rgy+a5aNCB{w=@9F@hc5^`&<@iIap_x*<5|FK>U( z!=bHp2i4?39TOm#?(z?|Cy9Tpl&w*n&lHL`JOo~M%&%}2yKTOARW9|@b6BCj&|)K@ z@Rzwt(y`X>=sSNEUkC^!iY#Ao4I7qgEVX9mOk_{t{oop5+ju#+)2x8AG1p&aobb1~ z*LY40O|CWc^@D&+BhJGazo!OQ;)yd#$fg|q`YpM^V{2ex-4N%*o87h^rzgRjKzsx zCUWVdp!6;>6cgU?xEJq7c6GnhHcdbgo(1ytn_7+6H<=1j(0H(29$_^47mr9`EG(5j zUTl;H#(f7g;=>?oCiR5Cpdd3;96PBd`Dkn6EC0$I+@5(u*FAw7gm){^(vVT)-JRC@ zt_rD}Bhq$ywC_MAj_69N7<;Ab$y!qadfNiMiB7T|7rU0U`wulLeNzi(z?+)dMqPi?JMIM;DO3 zDiPa;8yY6X1k-5dLE%~Qs5l|{ccSi`u_%ou;Sv8aQ2w=ozincvX&Z42B?(6UaMemI zv;LmjhN5N4--79U=})mx?hz#w)TI*6dS;_6g!D5~4r^n~2Cn*V&9YADcVx z!z0^$>CmXef#wgSS)xU{CQ-~!xctl82op$LuV@<%Ikk(pWcmYlug}ngKb2OSZ}Wl5cHL4XSF$aJI zntgQsUtQeo_sZ&D$zsMT+|0-J!mefJo>9nE4(g4By+;#_Hr$ zlu7J6AJTdD%*;y#r=ssHQ;P;@?1jcwQpmIEYLw}VI+&|s0dgt)UJNStinzMH2)UAg z#Bp$hs!O<3bU+={;d>A1k*c8kSwd9NI0XJCO{n+zWZ;- z%j&|PITOP^Wk{e+C186L7Oe)|SRxcA_SuT7le&+*}7fP#1jn@%-V( z=pAn;$FbE{HAaQBN*YdveiGdZeO3=Jp8yF*sx8$mhxHC5p;MRt_9dF6?-yys@Xtha z`1;@jBGP>yu<6QeAX~VVW>F4C%+3CqzCnW|%;$KzSb5ssTrgJ==HrC;JBri}I57r$ zNIoEB1W6q1?ST{V|6+?A3}s@iBGT-43Y;W~%xg3a-)q^XubU3u71jqJ>C|yV zb_^%|k%ORBN#TDflzBVChmti<_o~mNObXb4QMQSWmT=~sHRw95Tr^`=8kLN4YcMas zPV)g8)r;R;2jfoLpr$**#|8QtOw1#G?E=jw6Y}_wdb#x)T#=>ZlP_~+P}}A1Bx-6R zF;+!er1#1NF}e#wBb-m8-hT(sVN+#RsaaP7tJP)}D>qJ;XwBR0J;APOB*Sk<(6q-jhqDMXRK+>tmkXdF$*$hkG+1wQ-~px5 zsz50AnA3P8IILAgIJ#PXfhEl=UqGbs?6n8|tXK&#MbwSFTCaTj<+31VJ)&uXa+M;~ zlGrh21GokfkIk2Y(j9=2pwG6CJXfv&V~sq|scyN0VMBAk>QIUHedq7B5$IP@_mp0+ z{JIz+x+WT&v*U1yQvE#pGE3N?4L0^8apC)EpmF&zTXx+{0jefXw)JWKNA z>syC(2TTXvm_X;&wc;sciZpd7SO2YzQ`T$5ni@(;uH+cT-Z`+j6IJ3#QZYaP4iNBz<0}TLC9+D2sSLj-%OvQmefy9*V zlwV~C=B*|51)yIkbd8i)AWRuedj}HhlHnMNI%_&%uaooWkp_g}3vOYODI69kQqrN^ zt{%t?@?;3VGH$i4pkQ~R83Z5G?4gpRpJFE9$616oSUDDo3#?G_Oi#?=tK2tN5t`V2 zg;YS$fC~n2dpeCMn3Uv&*`TMRJB?0Vm@#=gvy-S z6o(rCleybv1%`Xcmk^lXR_ur5BR*xALZ#g!d>D38u{6!8UxojncAZ)tN0<@}L5a$oFzD#P=1U_s<2 z9GjvG=oII+3L)(8d4&~F`HrK(W-rX@su9WoC3AY|aV=!=DO=>C#dUw1VOckp;5TYf z1XAqe)auO}v_vw3h1C!PEIf^4fYTK2#DuvO0>B>%&SgPxaAlb~kb&G{cDp`+0`Rtj zDLn%KJt^+xjkR=h+MiM;5q3Fa+&ZC@ZEOxRpX)9#o({?bxt~N=LIROt8LsQ1VNo>b zBLdeP(^9i4zEwMJ9r-Nb{v+**l0F*q?$o#q6=UbdKF3%uNYza~YwtY>z6Thqe9F`S z8>$^*eXh(r()+2mC875VSSbPcmf%vwEqm%A=Wj{Q_%Z@z6BqtXCGo8DuTw(6N#*YH zbp%WdYQ!vg%Dj!TVEmefykleiy;@sUAg(NqGHd_bG+bZ#Ysb5#^(YVV(3Q1Q$hz3s zEO%TDs(x;~N~YK-&@O@@lP)+?vXIl5j*q{bdv7-hmRVIglM0Q){qir_ADczablvOE cFKiG#3r#x82f?WS{y{*Z*F*u8vSql0ii#M23NZK?Tc7s=>g(p1{Do>IJ~Qd=a@@Rebp) zaF)_`R<|>Ab~AE>z=)aJ8AE_z8zXaw8pO!d!(jv>2m=F0W2vF-tgWcPZ(?TyGWt^n z&|Fp~h^8DvB3kC3>BF-O$DElot2G?g_VPagO!<`gP)U?pOYQ>SNm*!cMPSXkLv*x8w1N-#Tl*g6}zGut{* z{?~#e#L2|b(%#w9&KCHmMI&Q77iS@g7fJsP!N&f7nzeQMcbZ-%jK$r^o`ns>`e#W0 z6;xFGe;2i}`Jd8G&T5eVBk%vUVJ8g_dkBjf#L3RZ(d1>}%qahKWzR3+2r+WDbJVc2 zv;J=uRV?hB?VK#^?12&z|I8Xt(a6No_RqI}>L@DmgKeFhjciRIU`Zj0msUWQmZtn% zoZ{>plH6Qu+HjVZ=l@!l*1a{Sn+@|Cm&xb$r$do%i(TjA z!#{U`5&o1P0NBCv5~A@^6N;6r;tgKfzH%BOmbKdCRWpVNX&Bh7bLkP1T22H>TD!)U3KO7^iu| z`7y5h^4N+hHC1bV@#0{`y!&h?W7$Kz$=w+SW5Zc?qSa=#=C1m^pgtn-Dp{yGZ{n_*!FvctMpw>B@S)nEv}0?6kQYu+wH*#VUK-AO>+{d#yjvZ5 zpIDc%5`%!>|q}&zR6E$&-K0drLq-kj&;e5{kj0kb7+kKc%d`YB4HK zB~B;96oE7U?Gp+f#L}P2Cfcj)=2w3;7MciNG@NIXdC4_Ozkp7Ei;aOoi0bFgQZM_w zNr!bHAQ%Ig{@_}=SU03<_w4}V@v#lr@8aCt3`4=+a~xs0!uP2>J~ziahTT4^z`ZVr zj?<;QOf1Qb;N*W3@v;2%nGa{CW_(a>jOx2HHl3#y5goDopr4t?Pp1y|t-ls-PaWKz z^;z|0U^$z!@Dc6VbOJ=l)m{l;iID{N60G(wbiAd*4t?|yI<`S@HUe0$LeurKp*c33 zK9f$(@g{*l{uaN}oOMb{uU{SCbG&eBG#Lg=dkdrKBe(PfuYPXt(a?|#ac>)&nwqK% z{?v`6sb?j=r>9hmmpnh$Ng*ObpSKHtf#@#R;B|DErZzNd&P=OH03oL|4~2E|D7PM2b>K zivE7b%f@(!H;7h`v!VgyCzq>95dtgJFO3+D$@E63=K=@w7VDdG<)V=R^bYe*UDnl+ z_B!0Orq@sQ-`ToSslH10ukA4>*sLbaHV_qGOo^iHtH!H^HaNZ6ksH`JK%tp*dHRi= z>-mi+j#!ZOW#u}3-G{iz;mLmtPj8bw&34PubleRT>v0##F8*1*=`ks13-{*MH#MvX zK-cN7=&P&P=^_4Tm-F3Mv?L1WA)VxJuwP%1mae{2HvSdz!S(e4zFRDz+V8RkpWq#& zI-ECm>>4a%^`kb}~syp00Y%Ed8v_K;nC!!C^jV+wt^)J4sd9!0nr;m)FzBO?Te!9-$`D z(a{D5>;@THc~GFVfn=l~Ld3e2qc(ABV()ZLX22oC}y zI!vC$gcYQ~Hq9=nStrvhfS|`f*Vhfr{6RX_&&H47!0y)B{se1(*$*pnfIUF%FV?rU ztqj!INY|%ZGZ%(&%1;A^kBXp7aIxC0)asB)G_GT-({|GHso!&u$XzEo5>jNYZP(K` zQM=QtHDdC?O|!q+2bB{Wc?F#vSpisu$Bi9G#j0Wfu)?G3nFjG*`%2^BLnOBBO6cj6 z@6fM@1j6wHwc{0~XtVp@i8jRTZXTW-kmtZVq;cH-vUr^Rjx!7X#y{#Fyjxv(hhQN{ zy^t2Nsf>kIA_c%9$!O!!I%R3q9xq(91;Iw;_~-qbS95->V~In5y^PO>b(GmKS<2B;OQ5KW|B>3c&*c>D(BV9a5Z zCME@jHh`kNv<7LE<`cV*TO9E65qml)@`N~sC z^CS)rD*HK>%)f}gaFprZP&@b=zE@!wo30%vC1?xVNQyPv=ie6bo7C6sUukBaEyVNINw7}%p(RulsAUUm3qXVz_)QYlMu4fA}5z%)7bDTB8P zn&h${nvfN*+kL3&Vv63HVSx+AmTskRuCQ5RmYFqg1hQ;+8e#?O7}?dbu0&gYFI$A# zgxHn5>yM-8KnrM#hA&ASsc5qbQRVC~DT^Ni(}!Rr&2r2(IE_g520s%1;{w`J>oJ#= zFL?*ku!7Z9oVaz|0*XQ^F;k~KIKp${2T&1S)rCpIe8%1z$~rzhlPAJg61kxI3p!EE|;gq)dw@ zyN_*6SyCOf`C+H(^_>Rq{x>@wp)g8|zLRd3n>kZwwba4J|7n6yla7+F_lS;V zV1KqPEh*;w{c(U>OFJe!G$?#r$_cgC7COwq5;ui`Dg#-Fa4Vz=e@9RmFv*Gud;r&@ z3XD>4Q$4HI-VRs@$5eXt<}3<4O73wZd}PnUB3iX<%U(h=t7&NO#uyK2OY1H6g$)q~ zs;A!pTe_$mAuRIx7hXqehn1jf(hU?i<@0Mp3u4<&)xcWxj_P*5+2CqVYv%~o!Bhyz zQghg)tPe|wpzlTUA@Agfo(r+G_2yV)nd+*$>a3C4}Qh`=N%QY=bU zSPq%AE^T51Moj8qwIsB2DJ)_Q05N~i{%xlYW+Elio3{em5Ah{|pQ2ZV8L0@rjCdW{ zX2zSSo_}UyEHMIP#w3j!WCV0=B^~Ro3M43+zJIs3|EaU)K>CM< z%F}z!fmcrrZtFzHq>|w*KkCmAW&${Zc-dqV)3tG@voK@c?bEW_lveYXY$(G%WqkP6 zLT4j-=H7B|R-sJ75oaAs6(b~m03@D*Ip5feL8+UoszfzvqaZxE=I9UxeKZ8@?dIhS zF6`vsN?8_iR!mTEemF0^@3= zlo=RgKrXI!2(rz$d8T$T5vUVXNI+Q(F(&e+(&NLc<}{VWBrVCvb-OvGAczGyyqyy} zDr}Wpi+^R}sh7-S3bP^scRaTYRztG3>`wTBJb?#E%JAgQOqQb|b^qxg&YDjZSYf%V`pclGjT?h!P%=@2kT+MjqZ}s*UMt?TRg;@S?UoP ze(xo`^)QtufDK=*`enoUF0?EJ4T~Is#|!*R<~W<%>|h|0d}2fnY=uXUfq=S?(j@+k zqo4~#lpFYSUPJTAIt+K84A16I74NOuRg&L!b}xc*vI`B>VqF57&zFp)EKcMz6o zenRhe-uxT8dr|NXBCO1|^Tn(3$E4@O&tj6+`Q;nGh6f&jULND_C}Wys#SUAjXj=pKkrSVlbBiP%gRO@kg^jg z)L1yVWK8bDvvhWPKciOGMwRTD>g)Z~%KNz&HT@gawbUQO=ytw8U&JCyn3C}jV-DyU z#&rcZ(Ue&UD~f}Na|u=*XbX*5ljszNN(Rq+IHNJ(h6{cTwXhOU5_ro~EYefa$oqpk zstS&&#>9aYir0uzw_xhtIqym`M(Lu~|Fk4>Jz)QoOy`DSuAqS z^<%yAA-BNe)LR_yvx!&S$y1eyKb_=|3xLCtTuDUfv(fugdZVHVVfu=GYi50rfA{km zK1cZvAG?m`_6iZ-NUcLImkM2}%daFaEBmsvS0uENXZ6;;{OP;E)o`cjFK?*2d(v{y z(s19Gog#t{9yhv5?>wPPmI^YK3)HDw5iO)7l_MXd7jV_+lJ^H9T(d)CKCwe_xQJ}cVHgoj}gvewg zNiazEX6WRzK$xtW{s^n$*iY{-@^Jkml}<$9Wy=nr5$E zDJMNmS}7N_19=Czxrj2(A4M2}HdMv6<*^hb(?Ko^@7@{agoS%C=zSuu9*%~)n(lW^ zbgVP02~AF_Z=)khMN0MnVTwC0N8j&OY`Wjp^~umt`+vECTdn^({&zoKu_tW>aTHvr z&xdVVp)=qt*+9JN76;YTLT|#Nf~c02ljs$AsK|okNFu26K+q+z8Kke!MCFK;dTVyc zi=_>T292<*3pUkx1byd%q!zJ46q#ZE-YAT;;MM`lxR1;G1)Vqz!WC0t{RV^^C^onR z^lKTIjr2O};8|iYN?9(|RLD=V0k$E?K0cB1DaEoX)GN8>v!H@7)~fv{nQko1PJF!R z5i9Hn#^e<^nBSk2XYj;v+8xXES4F(^XaYc#{e{t-=?R$SzcrU?MeCKSO*4D2Pc+g^?18VDCs*^HRb0nR zO#mWA#!5-O!KVL?w?bM9{?3Kz&A^*PIdRR@ooUv@@OzjBeJK@c|=+HN5&#^ zBiWtV_Fv-5UUJQ)p$h>EhRK!hSdlQvVyodfYIhVl1t`*!fdaE7LeLRh@ffcgb zQn#rqTWB?GZVKv6D=cKrg$w$0+`L8yuTjysGtcEhE%ug>(e__Fv7^KxD>gE)(zgG` z2VLp%0(+XUk1C3J0M(Y*XGTgtc)7rOA~G}x4A=sWHEWwBE`Fjbdi$VeVAnX{vGvnk z~EKU%i4uO*B2X^ z7)V5vk6`gtf-=aNT1elS7qlQVG1U8$%8D$4O;w1J!4F@l;u0s0(;G!l+Fgn z{h|o}uohJ~YVPR_dbfJK717RPh7@f46bptjUf$nKI%dLWYahUl>1Ob<@M0DHwfE2z zRM<#&=ipHT##yE3kcp0yZl%T~FU|bLI7PmD{vp$MdRyyJoU-_zat>Zqn00E@9ap6Yi?0fW}sIC1AGD+JmM!6US#eTIitc)njRc3w_>@xRmWL%}GDvT2_T;1T(`| z2?Y;tnN85sY^Z!PBPo3CpAA|t2qgeLFhk1OmYmS{QS7pdSUAmfv4@qhn9xpiRByhl z=MR?_#HLm9tXcsT_`LkB*#wpUi4rqX5@UhJJI2TfdW3x|G`je-AmYPu%nOP_#c5m- zcc6M^%kpUuS|SbG>FC?wCYdKo`Y1&Z-m;SvX31eIsM8W(|2d@hZK-;>fL%9%XigYG zG~XVrQjUYQ`Iy}sL|$1ZfTe+|VO0IH74kHUZ_vA2(uHo6Cwc=x`q2Pa>lgI*7XU8Q zZ|8kW?K4qYcy>AlOVM`DnK)?TSk05Xes;?o@}>4DgoeDZ9gB0QhDi9a=QI59V`cfn zyV5INvvL#RZGq&`Q+Q^0^xj}9ER*e7WRo`j6?!MkMES7_^NARboc6|MaeWW8_YW?! zuc!HMX1&K_JSGqw@Q-~9*Uc$=Np8bF>=yR4O6wg?Dv-ZGgg+QzlP@XS8LN3Gc*(kG z{w5dIe0KOLmvEWpjZ?38&+M69+l8;@ z?HOJi$m?y zxI(zV3Wn5-mkXiXJhl*3)aEdszUof zpmy1!SfI^&*WX`L4`1s}F$**f&w3Z8M6Abq&rOun#c<`t^XX)#p^~*c>LEO~n32eu zd_;wXR|$tp?7dCL!Gz=bcNZ5kql<1Bxpi!=cH_CJ{kGQ!vQ_F6+1d4L_29kRLduRwCw?SZ&?u2lH^b-ji`#=Z7cx4 z>;P#8jBuU3_gG|{$qj9*QqO2|Pkk-c;$xAgGF($#RbywZ@zEtPVw?YcEL{rJXByPMy+fj za+I3tbQJ`N^SF`c;g6o!uo?8XEgXE00LqL^L*iVh+A}hF)9+(|;#+4$ z&Xqc;a3{5|oB@o-81E6R({cTW- zHI`(kj@c4}cTMwSg#G^W$DAxouD}?t!N0VMd_~KaER8Z2tkmel#PFb{K~qF*3YgMW z;P7X@EiG@mj;q?-WXQWs(*xhtgCmRX{ZP0N?}wkmIlIg;#^vnXZ0DKXm){+W#fR|( zxS68SFB=W3NnYTW4d)}k(8U<9T+BIYJ||oU)r6mt;muUIbAHEVY;)?z1Db_jzIH4> zSq(7-?1o=rLmCETzc5*=snLVIfK6*$U&3F%r7z0@$vOD`y1h>4z?S-97fmr84%jxN z>2r(1zyjC;%wh7>BPxTnIKUmdS_w$9*ZymBIbGzhljW4L-GZq_pH`&(1M3?&ze4TL z2EpM3Tm}`xh6ztPIu5+dW2^+*QBjsyY{v+_k=jdH7Rltjncgn|<-}NDWczr4Urp{D znJ)FQNW?=eRmpyR=u;fk3+CKBMLRAgfNvAhOw`83%xEF_Yra^{VLoJ+zv;L>v#c|s z>;%=oZOS;&7eq7Cq<j>CWEo5?WgQff zu_V!vfuD1C!r8k3tj1PS2B~H}od}LXH(!2k&>_EPlX-i1TU1D^)G2GZgdf6kNZ$Cm zhv#0wO>JH zuXzOft(z+j8p&Fi3syX!uOzu%uR4d{Yr<(g?YEtBoEfSELOI@(na$gPFA~Xq(Do6f8{4v`5;S$ z@dkHGMPE{~Y65o)2f|AJ36*t6qDl1dkVxb{C%5%{s^`63+tatFY3n8*tKI&!-{Sl! zZ8VD#E(G7?LmQE{_;p*x4kTsO6ec5QUUsx__}9%+gNbTgT?;IRl}fFMsW+ z0Sda99^l7!`xIb(40ZGL5xuIb1EY%c5ri)-OW7_1dq>J56sVZ@6>rTo+T3hUIY;=$ zob36~8zjJAFOYF2+Uqvg|Fd|*HC4LpQw|s90f&lH^^)JGoo@m17&3cVX^`}RrWh~+ z#Upz(v-*F#TXVxlAt(MLZJ-+WXZB%X+A(Hr)n}jP`R$+YTIyv?)#e!3P19OU3BORn z@4MHL`s?tE-`oY}9b9CEcVRKGkZnX^g8bl&*SGMJLrNKB>S1VYII{w1cp;L*$fDz zm^-QX6lPG=VOnXN_dD8tTz$F;*M!(petZyae@0taS0Wx1#2Duym>6w?-I@$-FpNk| z3}$Q4vHZtpSjamI*X^h^6v*yWc%O$asl2(eP2{DNN7m#<94$LVo9Xpah(?>`>^0Tl zOnqTgVIkE@kuz-7UM#CiQ(woFVdDv}tk;;aO!!%d`e!%_LK$20^% zq;$ECT9pR7`U_xS-%PhxR?FU+6s$>f(A-p{o7b+39oZhZ%wBaWJ=<~T+y#qd(EhrE zWjN2TeR|zYO6Y?q7vu7}4z%@ClmKv;J`{3o;NDVHP0ZXqbnvnRWH3}E%_NVX?9VBm zmQm_f>b!);o^wxRk<~+oz1F_hTo&^!yW{PP3$hUcy}zyZM_rwiswnfPryueCwVlu6 z-}h==i((5lZE{xdA!NH1TmVE%{;*2UCfv=Ao)ZZ=wcWkWi4%_vcge~|@d!TA)Flv& ze8IG6AUU+RvifitcwMC9=NDG?s$zfG zZ#l@2Cd$Ro#gs-?bX3VjeT6-;{o^ryWB;l~=R`9PcX5D9v2i+48A`NES30YY!b667 zjZrTl%a!7$CEcPF@K+|ui3>R##92Y6RI zS&+IIUu~#Nq8tAtF@0e&4Q2P`J5m^3sjNJAr-Cd zEJXDnY-fixOA3`<8Q*5n>4XsEVD7{{U|*^z8;$+pe*PpK*e!x7w}7uj(DEEGQRB}N zR74BErogm_=(Y?USk8BJhqzqD_g7YO1mhkaH9K1Etji>w0{c$wLov4)*|jlZSVAuS zh{j)s@6}dWze9p`A%0-^S~{J|7_iKyit`1t33th~Hi_01=M=>N(?1@HwCX^kC=_ob z6{;NGh`a2}*4h$cO36OQiAfEHnY6@{Sqz!K?oga-zmKzx^uPk zSYC>uZzVAnkCMLFmDqS3F-gGbv$Y!lEh#^ukM~o<>{ph7Mrjs{Lw}mB?NgkD0s;=2 zpq9od#hVvjxWqR4Ji9gt6x8IilQG;hlNY3FUj-DbN-!Zh%y;>n9up;{K=uudbp4U~ z{)M6g13Uo#cAcAcYytHz_vzJ_nhE0oQ>0!3RkF1ChK?C2L9TlEOFj#XXeqs5Ga^OQ z#AFhdo;~+R@~+D04S}pU|M{ zs?DL-?^`WzmVNw4qYb4|+OWUa zt3%-y^?~8Q-(N^v@n_0kHQUoW4UAfV zXOe6yGNg6L`~q3a6J=9`O(0K(CVc1J9b3hJ1?EO)+`HY8tNGM;j_h+WO8WyO0 zLGi9q9XR=5)kl@>3`?EKpH+kQ84p9ZgQ%6AVXd&eL`Nq!zH*qC4MJeq-Gob!ojJ@F zt6?t2yG~2on;12b$gOhYQSN_ESv?xZ5bLrbzH95{3JLXUdIyQWx^Th^L^Xe>VjllELG>xMOcU^E&>_E^X!Lu=HTDhr6iB|Nn8Jx;Cv`N ziHBJ~y$>2W-28AY2wK3CbW+f4+MYXhH3ysl4TZ^_hpf5aNtT?#5ivB#_3*{?)52&b z`K{5xpG{=oP{b$CjE@pk1>u?-lqw&^YC*k|!42k;#S(64i$9XTXaFxBo<=qmHmg+z z(_%28LX4x6{4JjG1HW$S18fCq(C(f_wQ_$HuWHL6^fJ{`GHDeX!gDbfpI`pt6+Nya zDLMVI^;ZThzPzwSm-`=a8a%Npq>8{xZb1Cc*PZ_z#?T^FJqY<$2KG-jsk4x^%#92nGSA|#^l<~cl} zjv#XmTPUhocsu}tY5qcnPakpRQF%{Jf01R-( zNug^PJwe{!!S@1+RBh#@eR{^XDoI7if;Dhqlk)jCMAO9(nD^3-e0L`2J`Fn1L7MuS|eMpj$pCGb%;)qK6*P1vPN|3i7{ zx`?d%u(4=m3w81q4dm;u*|pWR9sybN(iGf!KG_COO8DFLdM_#NZp>AFbK(zEzD_ODc-Z?wHN^cfeYzZ zJkvfYXD9a>3Vot!eJ1%@W}pi8w*EPTJ#$@fc4n&D)pLN67F7S*nJwa(a)L zm7bNLk$a)nREFsBD#Ww!4&k`0^>kZA7+FavSdtm?QA51xQ~@p@jwi^qxr=2n26@OU z3NR3-F|$RAhY4`B8DkUJ)A1Eu%J^?Rw%pT~0Gq=rT~V&Ti_@(Yv3NzAAz*2nr8>59 z|LPM96Ry7Ky?akn^&9|B2ru$EF)nD@iS-tZ? z6W!L2%-iDjn28Vqopd_Jr_n)5t|er=#hz{vU0FxQh>U^&jJ#Z$gD-J1QgO9WwJoon z()vPp+Tf5S=Cki^Ha3)llcMVD$b&jLA86L;+AC7@4Kc3~3#qe*gH-_HlmGx1@Et)+ z#6^R#j%i2TlDr;%JIplHngJ&kH2y&iTVZ@q{{?2LOft*}VO9wdS9vq*>4pxvLN}Bz z?dl#}>(`)Xa8u(L^$xqqu(`x__u#EY+Z#1KF46HNdY$(PzB-5t=`s55`8Nf7p8<0MI9J}V0aOABz{+Ye&+fG6F7zFtE=%;$>*w; znp(^*h)lBtrh7smY>mK8M(_!1cnq+B$Z6^KF+Y6LJnK&E00kXW8gGw%_g0lY#Bj!1 zl=ghAdNB57JnucYwtC6DTuVR&C`VqvO|#2f;KtP=OV4L(l=$f1Tcyt}DN4S(_71Ea zXHoZm@aicS(sT`{!X4|H-ajlI;oEQqOqe|ISG@PHVU;=`H4IZXmz?U zkAZzv52JWGBZ}ujhp+QcDHti>G8u8tPDhMM`a~nO9DYKTfd*A^60Q5nQ1k4${qu#b z{p^H5_I*I+_F(8S0=?AkQ1paNr`{w^UNzLMe!`7+6;0dbSX;m)!UgJ^IvG-8&SRx<=r&SW#w%!JfLpZz_h0hK5l5+$N+B?GbD?qcXVLjGi>F1 zOLIi|&QxnR%m=HMTT(CWWm^1c++`Klk9wL!{CRhuOeqEBF5PtW4{k+*&$_YD6&V&h zU1UqA4a?lpysJIi4`NwHcM*wX{Knh!Gc6HEgcpRxB_7-RrP=eKVdq)}#m}2$c6a?a zuXiJ=fDy(NVxPXh$BG#*2Un>c^>37cc>7%j2o1DqHai{)wP_=kNK;kuWyO?UK-^>9 zc1Jq3=2%bC7f#I6z$e}9jCIZiIzn4w*$uHQzrACU`EJ>(a?`vVYx8o~WMK=Jj#r*T z?$>sK`(bxhZ%g%TQWS>l{-*obmz~k8-p}qX8_I1K-PmAsFI%mGXGbL=I%?rG)ck|g z2DI3a?T_J%*zeM&g;S%Bu`?2`-%Y*lL#)gF5gv<Pw z2gj_B*QszG&B4o5irekIkUl3L%OP^aZeATj=IB?!FKOL)p!Gepa`m`+>ven`eGI8p z6qhe(yGSZy?$4lwYqN@O<>f~A$4-VIiePkU#$1%a!isQQJOI|P+G(09z8EK?)th?D zuQO(lT9;`2O?AJs?1_m(3*oq9VZxy@m`@ZvFwY5oyQ*EglnIf~XKaC}XKAJq_!^R` zsQtF7FBunD_~{XpvgC)rF&j#7IZsM~Q@w8YXJgcUv7z?slSH#@#J-)OTiwLkv83un zaus08)OP`Brd>Wsp{A05p6tZMZs^sb>TvN|&rBy(e%^2Yc~^hj4MU$Jwz>m7DT(ol z1gMmyb(O5)BT|_OO z{L%Ob!(`hjyr@J1;YX!>#A)amD&BAjA$2uykQGkr53b4hl*eHKob{l}ssXmTI*K6B z0eyR7L3KQN%;Bf?56!1RdQ#GD?$9e*Qy00pobN;kRs$8T1@Y$bG%3>s4zl|${KR4X zO|YlN^x~W$m6vj{+Szl*k{hI&OQGr_tL{w7SruTPnShG6DKf9Y+;?{I>B(vG=Hcv< zT;Fn0Xu6cJ-hR`pP+!k;wa!gQLG0b(-+D&^?gPOan~<4eQk1LWdg>gIRy}%ZxYVzS(Q4ONIu+scsom+<0ZbdJL^ai&-zP?kt{knj}dmrW8>jj0V~S`L89PF}^BB z+_R1dk1m#h9X&`>$o0M}zDXLX4Sh8}DowbGCfvQ=KtM3NbT7{PZ0400=MLN3y!7~y z{TA6!FJU|}+;@t^vteB%4~ECq?oRfzqh>POlNm)*G^5I?Sq6&BymnR8u8xjJ54S>_ zEm!PKk+X@sYcPH{&bXWEx?E*wfu(_$f6Z?b-b+7fw6eHTr~0;5rR`=)t~AebehVYS z@e|-OnXBtdLa1DFY&hz*OJbVVwnY(@amhu@-&+#|7Oc>)HeJP>BwS^cb#bf+*rsPt z)`Zc6bcIRiqL#~~h+dj;|LAT+y|J^w+%BXLiC@JGfBdQr$Db}@kYL@Sys^pkdPR2; zR%}R8m7ujArI}tKGKeZC67PwVxBd0gE2!3?rIdIfXIkM1mE12NeR13t#uj8*FVUC1 zDQ&%feaw*}_G=2juk7h7hxcQ0b!%8>cna{hu$PKhq{NYGs`~3|orO_EKFOrcegWoD zj)DM}Xa+C2%Iwr)c;m4dzn+Qpb4_TaM9~L2g3GB2Nrx1J$5Ijt?cj+P=hI6|1ZXZ` z@VQE0YrtXc)WLOqbVUoI0&Ghtl3^n3Cl;Xn0s%0ns3Xb3aa9ml}IOLIw~ zbcS50bQipal-^hIUOi}5Y`az*CZjFQh*%9!<|d|Wo-5Otz5CqLG<>&9xg6Aqw$<+> zfuSHMZcAaqb9j%C_hkB#f~#(-dMGa0Axudg+zyu zda31G(MKf2S>Hs9!B?nQw~CeH>Z#GS<+V-Za9BK|Q?1JmShGl~YRYoaf|72t)-(oC z<%s*>$`$^^FDv;`rAV-~fxl4!?!;)7!iORRd4jILrlNJX87ft~53z>Cob_+mFs$|` z6PA<(lKK$#j2`Gmx7p(&n5m-TdaH=rC0?emF>J~zRQtU<&ufc%e-fPTa>#c# zhS5cAES#E(fiH&^H-{>5AY8h~u>K1}1a(F&Yq&pYC@O;%9~U+=@!PAe-E?@`7r1Ga zkCY{`FUuU#=DpY%25=$ax@DVrNr}d*eNp_r+C$RXZC!vtoHK_m)p@D;Go^zj&0^RQ zw4*uyp$D0&9o`lHGu5tN7>11)Clnjxx=WMDL${&W?*$CA2bk&Jm!Y+i6TPHJDN@xB zw|)33O2FYFgkai?W*{})0LzM7eN01;fA^ZilmxNrBv)Jo_Zqw4-st&9a#?4dd`VP` zn{M{1&i63E`^Md?8m>5d^{Crcln&T15tIqyo#JLbIFf#ng7Qj`g?YdgE_N=~PB)U- z6Fu~_Xrtk%EoK-7j5ZUzt4|ddffaR=Yj7J4cr>uTpj^m~-MGPQUds0CK{iCeKaIni z7LO;$d4L*q_lwmJJ9Q$UrfCiHryNFrd?H|jSg z5%$P0*H9K#2t~$uj#_Fr60Ng#QzTq7`ArGmtKml$R}Bi`$Hi?k^vT!XDLXzjd}kWm zYv$IItTDN3`2|&~;ClmcOR5ouSyslD0yKY*p7@5_Sb)NFgCg#rF$Cwm9J|W(*(9H* zs+QgEio5-EtmiB5%>2i*;@4{56L7VRRILJAa`0BJ+hZA2P1H0@&{H$cCWVaHm-sjh&5^it2~3|&c-vv0vaIzc*c_BH&^+qq6;r=6)hJ%*RuJ^Q^G8sdJu&Ggi1xT2e*GK1h59PApCV^w3*7IzBDT_Px3~goWV_#G+tp-7DMx-xR33&pjCACY zeMCF3`jU(^38=u^E8mIe6En;CD8ORdDG8E1ohcNj<=}8Wrh$7H%l==E&rKR$_lZZ#46Z6P>9^05*2jmM< zYx+#s0eS%?*MfEI4vo?`v}@mkI0YDgZ~jsiWaj>=`Bw?klyCteWD}1ztg}j4muCS9 z{lP$2X{O1aUCW-vWg)vFVe&UCJ~(3d*Bjd>{L^&IBPG3Pv}hJEol7ZfJ$hTn$j*eW zITpcNZ#wGeGJT0{z0YCQmR6+I`L_Jg#&Bgk*v|FT>s$y%^MnT%e>JQr77+yrl2lcV z(scPN;wyc+wA{3`^Q+)+mrKt1acCHoYFlK(X4&&Pc(&fk2)P7z4i{qhc92l=fQUr1 zfJjiNnNJHlFS~_*ND(pgy%h$MxK^&!+}0>Zhj*5pH6@405lUwtfo3wJsdnB%4Hep> z>2bcr;h?XK=4G;ioR!u}r8a;p7eh^gXy+Qqu8nBEF1o{XEx5=Zvv@yZw8%Eciv4BzeATxK>k zsY!Xf{6XTk6*oR|FF3acQ4d@jVJFARPkt(i^M&AUy;fFJtR*O`p>JCLff=zSnMgu) z-0#C^4)M{Q({l_d4;QHQYM&?AbNNW=%$ERw=QFjVq<8r$QF$3Z|3GSI2=w{HjKYa2 zLO<$|26v!8EX}RCH_GwD%AjwXL`eS}EyCm?1P-Dr!aO!L_<8<-9j%>Oe(JZZy{+2Z zbBX}5`P&{e=!#T>)m+o)_qmdXFQpCriL#nf+b@~-l^ta*GLnqZhzM3M=Uy@Cspk_b zE}A|0NK{b9dJpNnvP>k%-+Nb|-p%f$gVGTBtPP6@AQi%Eg4r??>#ohZ6HTgnohQ}E zk#ZFFtoqW5@VB4}FEz~#Eib|FcBHKq-It4Gh*Mm%gHnyImOe``rs$V#<@mE$e4t3w z{`I}w$kDm$?~)zQ)PPWP_XH!@w5rxaS;6tB>?J3*cZQ_oRf>!OQ{$T7IhMU*rHR7s zRyYcHDG!*M^4>ch>QWd+m2hluMkWZO^`zuo4*iOUlhita$97?7n(1bt?ic@*-xd8pKH+o;bD<8<#*&S z897SW?PH_P<@mL-{(`dn+nprSID+B@??x412}|~UONJ%xF$^jNI+m5_yfnk{H%CFl z5ep=eHMKdKBJ1PqIc=N-pv&F#N`n)1)x9dQ+tQxpNhyw1@TXiVzqR#gi4IM7voa<+ z@UQl}hbbkhAaI#qJ>S!SMHen_rLSk*$L(gTD4>#UcaqE1Y_f4ZSXEunobrMpV$?Dv zAOmOq1yr|lT0QWcrbPXOQFfXL2_9r0IOfP zmxlrd>qcg(T*A{W;#1h00`504z!Nv8=^RLeZE^A(vr~)!LN&iweHR9^J2u2!)++Z0ZbpXbm-r^^-!%^KG?S1huABT zN9)$u71ARn@u_NcXZGVgYF1+XoEiN2lE;#*sihNoFwSr!Fh0h)VQb;9QnK=(+2+@+ z5U`8DSK?ALr$SnLDJvsa>?hze_TB!GD#wHxR3MXP?n=t1@5r(KXXc+QG(nw8bs)ge1Vt^SD_}TU11*&MV zxa(Rog%7e@O&IgXR#b_y{keGiXYvY*0isozDV7<4kMJsX$+G?_Mb1Rv;#wCbhHN}) zJegNRu>>t*Jnl27bfq5p1h?a1$YQ^y`+JRl;WPNH%sbtIqWEOV;HwlCn;GFx86kB$G~s3+C9X^L}gAk?5*3< zdigT3k9b2yNa{!w0rGk)-$Oi|Tm~{vY=uPo><$^X$UY{@|fEMKMpu*}4G_=dP*j;g&(h?dRLsz-GKqi{J;N z)q_?ci`W>iD2&*=z_k$`pvg9!<*OOy8NT5@|L&4HR5I?UK#8qmTy!Ju`U|dAB~q3q zA7_Z8s^p3-sCLzycZ&ERo`}>*2{|7WteXl2YH6+)!p%XFR958jA~z7%PO0jkAC$n1 zT&SiKNO{O9#PxFZp4SPk_rD6*2|?~8>HRF5B6bc~fjGU`n?^Nbj>-^zDxCU!ICmp$ zyVLIK!QLL0?NSqo=vb%?2-kV=(cs)8eC29-Q(TSIF!hmSJ9b(rbx(=)3X0TZI4(;^ zgW{*rlw$GSG_#-O6x>Xr+ByW;OHZw?BH1iq0$@#sCq>!4v~(W6q(lwaI#4DP_oJl8d8w(3 zu;DA14Q02K(b~f@@j>OXY|cV`^C@s#M|ktYCdkvG+(moTZ>NYZ4VSxg!%JP2hv?hv zp93=}*PS0;?SFCc zmYhzJJ0^=$L5+egvX|A3yGb|k9tu~~cvXRK;a`oKirZlmLu>icp5etu(VAke?~Mk2IemRxPtrfi_15Z@n|mp)RRGsX zT!{CourA9)$Q9?Xx`w?hw~J-=lg@jcAq3H+s65Hno`}{D^L75}>n3JoWKiassZ}hl zk0#b+P=ru@bO#@)Zw>7rwzm^>e; z3I}M8Xd?#%u_<0%mjN?-1e<^c;x=CD{wzmL#TM!>WgT=o?v{<;DvnV|)JKxrNt!8q z0l6p|WBi*La2J_a{BQQ&1I&`EIv3rks!mRwd%AnNdwP0ukVYe+078f)Ow=X#VuOv1 zF~0W0IAHr;WBWN>$A>ZYXKcbF*?_^9ATmY*p)8Fwnw&c4c>3gXs%nS3_O6~*Pf}te zgH%hS{!XYuQHDoQVk7{I0_R9}>C>0I&D^FHffR#)5ss4QHC^-lUoqR+{`F}n5ZwV@9* zj){=EI<(M2DD$it%t7z62ir*Wge)H8h5Pv8T0~`>+;hCK1)+0hTpN*DS^tOniC2p9 zKAL-kFQc=ZYRZs~z>B{d-F2Af56hLKq5xp11v_n8t&n@Feq0ov@Ql@!*g-RnMm(gV z+#!>eN0+91(Gf6V;ASKe;F2~|@OhZ1a|F7#k<9Czo&>cahObHYtNz4x72ZDCw{U90a3Q9J%aY0oSM< zMcQ?37RIInuB?1=K?mHEkq}3#{p4&LP3wnPD}j4RUbKCwrbLc7n`q+a?9DCI>C;-R zv?dx$s<9{=qoVv3Z{nCJrY^CF28jGq-q5{bVH-)qc;0U{w-N^_ujF$8L*-CSEVR%< zDD!OQCpt*uv(+evIKNEaSN36SrTT7%madeQSwDz&$Gom&vs`lf;M65NQ0Ks7R064j-QUfG? zNG!vr1X8x5H?z(cM>>^W;gU1F_?gCV3HgT8PZP%Mv9c!RLy+Q!{CrRf15gG6_tgR& zOeSS*PSrhKa1+|IeGg`dUeL@CTPQ`8cf<&hs;9d*h&l#HDo3MA`9)EKp?FaU2E!QO z@9Uf%jEPW!5@*<7lnBj=I?MxCuv`R_HsbtBbn7Wu91`VALbiX7m}rtp)xO6;Q9SFtWe@C~d5qORYs9UM{R=Ns`k zKG&(h#Qg{LM?cs&v72SDwp#YHrp+{suuT;}6fa5GtxnJD?C!GUScW%|92}gmkMd zos`vob%#e~rHME}7J(uB$?EV9d#R5m+o)bc4B!jkv+Xovpp_)Z9#!SC^ut1#|AHG3 zi5?Q~#&H7IMak2$I3a3Jo2`YL25GGX4&y;t$Hd~Ybj|wM`TM((w!bCPm(WX)+{V`D z8Yk{@=N}dMCY^?4H(Bj(b2h;kN)zYzqI=#`d7z5?OD%7~Q0%7hO(bcXEZ~%=P05<` zbPI{JWTp}TxWmyHS_oxAd$MNh_Lkh)_7-%|Uk*rbt4eHVX^a&^lu^5+DvBV^J63hG@cGnr1fB)b0Lk>0C(!_-qS})R9Q( zT{#o7@?>~i9888)S@WkU2|mw7y5&_MnL^gB&c^M`6dfz;n~kaO_%rK^8w6H&$@z!f z!{?(r>#*ydn7V9nMj(fODHutEmeJ6JYBV^TKiN`AP0{F9B-66>+OqTEGU zKj`OS%XdaMbLDTbns(9jgJSto-w1emD@$jI1*4-PydhO8XmtK`+SKbx^poT!D{)4Y zhei20PeL792xUUMEGY*Cp17YTOnVEeNbk5T1glE~;axPVmF_0lA`pgB>i>FE68M-q=|b3L!&y6{E5?*pI-$G~NZB}flR1SPj{Zjbr} z_H^$uWs+@OB-TgcTGkY)qx>RD;I0x|X!=IGRp(O>b`ai#<5ycPMdi=Qy5U$tIck5) zn|hhm3A+-q@j}*dpIEw7n#5OXCreW^&S7kuuE3`sD(qpoUyp5xDeH(>`IGwLd0n>` zOjf$S$3o%23oV2)p`ANx==K&XOR+ALftlizD9*@wn%GL$0!Ic|$};^;M2R!9R5ev2 z;dwjH0Q04=6(m9?MCF)Y_;}+?mO#{-NhzCaLgDlCSaYhDAWZ7Q2ziUM;h@Yv%$EZZ zD4jdG#21yN7?YLVEE`9xl{f|IzS!>m`N%-Tpo%eG{$S(yysAg=MRX#;39)sD0mlrX zKj5DG#9|iPRM*N}oEc9kWm)Xzn_l?tcfRf9$)OXchmM~-Gch?mJUSYSMwJRnJAYJj zF!`E4xmdZ9VHPY{W)G6mZb}s@!&4r$l@DF97&yvwJ^ES zY2RvP0LqMu%CIcM-ziz0SMCA6)W=c)y4$JaX|}zK56&dAw$ilWq*Tkwoluphr@k(A z*^srBC8OAa;HsM>JfsD}g2argWH*g3$oh(D5l>wva>CF;3!%(UyqztS5vJdi9OTP^ z;xt5NSFl_&wuvFvm>2bNUeQn{Y;SpjkxH^>nd=VwD?U;g;>dH?kKlyDT>O1^?j@0K zDg9oS_(<})hyBH)ym(Zs92P4LKtC6lrI~EX20181@S<$&q}kWn-BF|6y&$Sz_NGqC zLK0g~9$Yk#s3<-oYv6dajN-*Et`H)bO!W8lq!PKSuiAI@Ro8&W86Fw>r;mQ>{)ZlB z?DF56btT}yVu(7=n~pj7$zSm%KJShuuoc(W;wfO6ymaBh#f)fxt^r46P*WUfS<@qO zrK|)w7swa}$Vfj)WDJ=0%@T8xCXzIXl(&;*O42VXZx(KOS=p+qsg&-})@!CtMVHH* zKS+Ee`)Fb#N!XY)lmr+wE9*}t=8+~f2)7J=EW0CnXuONWVJ;#_o#sV|4N_+*odChV z$JrJm^rR@kTX*vL;Lb7wK9qtAErc@9V{0bP4Xn**{35R8qaq(Hnz*`CH)BZjjo_lJ zE~17EyDOhsv`w9W)9hTshIQ>v>xb(~{#2w3UXY6KVYz*@31RjFZ~FIZj~K0}^QYzn zv1-y6N@C^hqS@^hoO|@D*l}cX5GscZR!!1@P_}W8aWki&?c6InUKkNcI(jd+7lyD3nhTo0t zJjx3vjN)ls@m3nug)+LSn;qmU_<}17=plhwr|!R_1j#W`{9yIOMi$@8ayzXoz=#$W zYe8~=`TJy(jj=RfNTU3jmhN|S-?Tk?>AXV8oZPK@wN|^+td~i(xL&MnXAhDA2 zgJLp3LhH590L{R3Bs3=^GQpL&nr5!En&Ihgnwezvdn=0#6N3>=OiUM_XPgnCg-|B6 z#{xpQ^G8H^1B&ZHROO%Gy1hl2HtZcVqcAZPd1OSEVd@DPM=qBEMg))YVfW-wnSZg> zzLRF-G#02~o))E`X9`~sy944pEsNLUHZJ|EtfnA*hYK|1FMr7!_mp}jM6E50wYIkQ zbZ_weRq=2@S%sD2iBo4B$GN=U1;3>UM_%jnTuF0f#P9c(KJJ~FmepW=pjw3B55HL;51qee~aQaGll{B{ye zBkRphZ-QDvswL!};)Ua~I4|ljfQ|N9P>PNY`^#%2dzw3drF~N?Mu>gJo2%)%W&~KL zlg3_W^=x8^NBrd@V&#k|D-#VlJJW$nE7u~+0 z-8o1B53+wDGyk*%{YQc7>Za))L4 zYiP@;sC=k# z{2{*VgmG7BA(VOkn2*$`Do?7)QLiAh!ZQovZVTaMp^Vv zR;PPZmQV6xS?VTU8xvtxrYuaXb?e`uUCOA@EDSvI0e|^UZyupzfil!Z7a1%}i;7pI z3vOw(7E-Bic$0UFg=a{Jm=FTMB^CphLmelsDgBfv6pF*6V=IMHG7-P5DH+40Z7F zlR(N8U|lrlS2t>6oj4w-iH*wAyu7%YnAGb^=v~g>jdmMZ9pI`i+z2M^G~UiqTS)p} z>ZeT$Hv~xjNm*P{ZU(Q)+IP~}0MT6taM)Zmj>^@}EcitoG?pX`-eA--+%(Br+zJ|E_vs z88zUO8D%Si=21N_T_33s%{+OF;?*_&$C-t}mz)-*2*#`1VD#n2#GQPe86Lc6V)Diq zd9L@J@BJXZTPwf zA)Z!NMpvU_g~EIwT9A!@teuov8`arGv-_>)YpfQ14zWX#bg;jLB)6c{8?5dn>HS6H z=zabI#n?mgfWLC1(}9%Oz@l6;6_Ft4y1uq1IKy=$Jf*>bQR-F~LYeJn)x@gGJ$(r^ zF=<$*-)#5ZWVZ!!-xRUC+$oqSCRObfR_A7xY9{u3W83Pw<{kd&7KAnWA^=I(Sem!S zbRnQqeqmY!0+}d7tN~((l99yH8<*8dSq)P%p@mT9d5dZE^s`3K-#}Wfc}ms}h`g%= z0G;*iBxe3f!vtr`MmLVVC$=pw8~g39MP7hlZcP*{R@xsn!o;_f0b zh8?Lq@I52E{L#kgGV+~^bzfgDvu%5FYGz?^DVa#5)2R&|?XztUz(3mZb}$^m(=D3BR;Sx3KAx za6ezV!=EFXvoW@pHC@A+ue6%FNJ;};BwG-Mm;|r^d_-$ys2Va2M1w5zPG|Fn-7`w( zV##@Nj)9edJ`=tukt6JF=UFwelJG}W<)X=(ni5yh<~KWiFwI~k0m0nn4u8%YT~du^ z969b6U=A6isVF8oabXepUpJ__S(TRY_$u)g13Am;j2BRdT6wp#xbT;@v;(U zL}^hr;-QRXXd#pd4V~?6fyt`?)87Spyb!?cWND?-1KKvxwgp1mR67d1DBU;MJ#TV)jWDD&!z*8OCje_^3<=OPcnnH0MuiZI z%gb}~3ulH$9NXrcTefw1No91&Cyw`%nADVvcwRQfWhKZ|!T*{vV6}aQKFU|Pk$PTB z=R}b8-|dY%S>|?s7W~|(s2H9=aB=kc)1$kl8dg&Nx4fw@x#Mv5Hq%rk%}t`f>OEI4RF)`obQouy%n zA-Y}5g9Kd&2nIl~QsyDC0mqtGiIQnmxFfPG!quhFLMRj31*aZgm>%dL(Lt6D)~y3q zG36J^$UoJX-ecu7Jt$Hyu$teiw!gpjh`Kb({n=D=NFjWQM1?|4*m04BNq;xZ{$g}s zfF@0IZ1fA>*d6{%g0N@w)WObO-?tcpYY2ZW!y*F+hC&Q{S#gZeZP-*-kJ5;eZdHjP zQPx!##*em;=nk3&h-2Eg_#wWszL^eQj3Ty&rKWRyRID82%g00k{3~pe z)Pg?GmqiBvd4NR%I08Taq+9$%V<<;#vhF@xlJ3XrXMQubBS)+hravFqvW;ZsRUM!} zS^2}F)Ju{8AE#9HHg~dSdY&(|y5v_{*=7`h%Tbd4kSZ-J_d+!>_-qrlZ)WX6<8m@A z3jgU(*ANf3#D*mBpvWKMi+fptBI+l2k(j0M z2qGJ4Jclfkt|KeT8&j1?xVjWt2xUThLaQkOab7cag0L9E-vj>Q#~Y{5$Z`%lgMR8a zpEp({+V6en_lb2!?|Fa3wlP9Ky1y@;OqGP;X_OYmX!La=UXcYdOyIJtVQm z&i3lA6F?B^VSnZ}Z^D1(N!-iTYTw45VyRpzm87QqwJgS-q2C+BY%4_G3ZO5k3U5S| zU|>WM1y8n(r4u9~459vMKJn#RVf_!vJb^6V@k z!G=ZnQC@(%poPW9`QoB-gW9kxvHM9ffgON2Fquq>>Wrva;i7hEA(RR23C&Y_-P-7_ zK={P&_2xe64jmDBz%k3Jal5R-e;-I)FH}P+@4q>{_f!|x`fGHQubCkTxSuyi`r3#C z8^N4(nCI(?PpWF^`Q4VX9_<0JyTNX|CenMe>}*IcVk#cs1fJx@57dvriF&3B0vMzF zuGsUY*S~sxVQF-HVrFJ;esM9sQg|lB3Sc}$G2O(Hrs~2jqso}7+NK7mq2v`-4w;@f zjM)h>U(%&Qs}zFLG}8@`R1=K}4T!<*$%x@t1NUqbyqDy5((DdD^TEc6CDn+Ae(o_e zL%+kPM=GT^TD`liTr+X9Bof6@q$J$AX<{Ml+|`(vk@eJB0_*b(F4+|R8{F80NGFaB zTA3M92^OJr^AybuXbo@}G^8Z_Gg8Y~hJps6g-|B6C$^Yj&(nRtFri5PHE(iQlmN$I zGwH-IIwp$``E&cNW@HL(0LQFp^H!DUCb1h>+iym96p)*tx|>%>cTThyk$+UIe5NtH zwyf}cHj|ywly?Px1^&h~_Op<55A&6OYmC4|pCZrfe9gIt#iB2M;dL*2$xD5&0tjX) zzcMyH`Gqfi4Peb>SH@-tFH856_2FI`A7rV#bf;t${36!=lI)>5w2E=bA(3DI?NXei6jfMep=2Q6iedLXuFL>EFG2*q27qm_&!7HVnCpwm z|A>2fBTfvGRF2rwsKyiq98*O+{tTDMAj4c1iAH*Rx|HJJU7DM7ZEaoM8#)giJ$~%u zsdy}QdB0AXrn&F&=_sdh-)cw>KQrhs@22q`CM!eqGL&~z6zICnbEUDhHDD!8Q7}E} z7akOg^QwNgzW_++3YL3UWU!khz}IG}^LD5IuNz0}N`ww?J)i-2@qkR5K}^_jU>@fs{~x&tA54lyT#t1iS!^w zBe6r?%#w6hkUvP1yJ!YpY@w0=C$fEtA6P*yK8IWwRh19;$$pArdq26R3~%0jXfc9F zD~VQ=zaSeqBOYlz^Rh&glBP_yueVzWFG$i*>dwtCj!#VDXQr$Yn}+HF@|T6yN2IHb z)~Y7Oztm0+&}1J=`ch1AO(?P!)`RQqB+*`yFxAjxOjYZMW3BtGH7W1m3nR7i-^Ta1 z5l1TdBD?cj-t-Uod??d%?(|B6!j!7wx(wf3;89bM^f&}90p-jYQ4X5AlZ5_8Wc&Ya z9G;bRiBuZfw)rdsKX7#b=$IWTz$o*gzFxRA5K-!-$t-qEsuvyd^OsT*#pkvN!1tb# zr7>A~L@WbB^`80avCu*bq0Do^V3OKyWr!)1sY*V~%k12>1{cW=&3yuM4#7&E5v3_v zOK5T}1T)&L_QoWpLW3Lf@!FBw{n=BZm?M#P5_zlLe~aA-bJJFqd3R*XAJz}9EtU(d z6~%6_T6I;8$QLz#zm{TwIk&E~-+~GEIjPHIf>%AK=anv54H!hwGmm4Wl+kE(>)=33 zbBo}s)l0tb&n+xWPR&FvH>1pYucqn#*10jbtOewK*&Bz*J{vT1VV^ukO{)jSAWbDm zL@BQ%8za07{&=nJ4zSS?UigAL_U`BwfZG;f-89B{NUwLvT;O_)_=MX>FujA%zJd4j znw8?4BAquy+E4J}L6QHiH#4eH&T7&H&_<3nBh#)37ifK<3|ymD5_th@&0$L*xgs^s zZ}iF4fnn3buZ$!Dx_~nxw9rB*6WYZsgRLDjLv=&0h!eVq8j((~HD|ce zea-yAZeXoR8bts^kUZ!uezb8Kwn<>iRRX5J4~Y|dXtq^TM2MU0jzM>1Tvh05X{U-J z`bMYs%1Ad7_1`N$IHPnujiU&~B#+#A*{CZ2Im{sPEYHyZWgN%ecf~HITcZU$B?Q;1 z^`YUh#pQe~8htho27Y-Jaqv~svKI8X;l~(dbUD#Bme!kLdWNq|qnZye_w1N7Y_Rq? zuQ<90Lwd5|DhWFYsYfms^jT5f@6{guhxiLxSQ05M+YXmwo87hxXa8sY;gS|^BY$sZb^d(g4gec6)M*0$~T0bT?NNAz`m_nICp-3o= z$D)*mndeIyL|0pBx{Jn{CV0@1(3q&$=jMvxt&Jp+A(qnZHuMl*u`zX#NMh?6t5tg+ zOi%kOpY=x@N(2*DP<~iZ{+GOoUyJRK8k8UllQjxkm@#wM=^-)1D*$VLHM(t4Hm6y-(dq}5M3(M*LR=}h_PS=PgnS~o;m2c3(%s6^FSObawg~b{!UJqwQ{1^2ja%pp zpB~7bmG$4QJ@itmV;^faM0OD*8i&Qof@}l}dGL2e)b}#DNd8{dyqh-N=1(Ydj~A4` zouqGZHXuTcyd`;*=R=qoS_oyHvMIx3@!ntkrHQGTBgc-9O-%VdkHw<46?XKUZ&k$s z%Ea}O2PT-z%bF?fear_yu-lBC1k&X3Qnz$Aj*0>{$?7z+253^Rs$=V53TO2iXe1~=`$a&KpQ+sOEY?btsqM`#8{H;Hc~F&J#{bPvmZ zBz7Hy^@l|M5uP8B<(uq|>+RNSS&M0avZiIBp(NLIe5-o^WW1sq-AM}D0Jwc6Sty43 z)a?{69q^a6um+7^L32A<<_Oo?0zvD$RO;*A~({I}M9UvXRp9v{ROTz@#U2l`Gk1rF1v)YVQe~<;A)ZkNPY9G`Yvhz&0(! z`PImlKd&DtD({@@i&R1SNzAN}1N13cG#Y__@L+gk?9h>8aP>2p^p6k37iQUUD@zk% zbLjI5PvDRpRnI`jH{=7T>Gtqvy%iC$>U6C!L zqSB6|F+y8uLK?jS*m7Fb&+w8>LMRhj2xXpP=;?Xh{ww#`b^>W~ZoGBNrvBdU?b`1-wyscW)O}8nzQfy|a{j}waV$8HW;0oe#%wBD8*rHd>waoVI z-fSMZfMX101z-^h-ez2sCS|puxP5Ny1ruKjbu6T1p9xk|vJz0hDMJ=F$kIqx_=0kQ@qz8lTv(+Qt^{0($ z^D6i4AWi*BY-=};VH!coTNL$W<<5!vNm;zhpFhrv;AmOc5%bid9epETs9iuY`K&wI zL?W+rI^bCwOSaL3P#%Sgr9?n^2Xn|VkzYY>7Dd7{8QOEw=*EG;XXM5+$}(dUQwGPV zYz87cV%ye0|CU`lHXlBEyjU(163%7X>Qe5Z+1EPVQOt;rw6LqhMw(odjWY5J%IhHU zUx*C6+}>arCf2-gKkJX=m1hcT)En&XZr$cU4)f(Z{kfvz>sy}yh~#kOde*kn%7PyP zr}7zh#5K7e_^v*j{OL%ar6CTP;^n_>9J|w>&k(19#FVU_5+(RxnnLi60XE&i=Y(P7 zQYIGP$8zsaTzjk2dz00ANUXr|kgzD?IbsTi+)q2b2@RyJ+ufPJs~`WGH#sVbMcGJV zJB2M6cns6Syzpz)2M&mQT{r8l_INvp?xjtyiS%N^0QYdklO)nilf5i?CC%)!nmb8s zTmj}5;femy4X#iX@$Y#vbFxv8UR`-Yi42Y1<;|3&+eV_M%bI-A8$TgRPPo7nT9}o2 z8dffs|M_E|YRct)_AR%*>Xw_OqC!@#*s~)Zj|m}ISO{zkaKm<%c66N|SrT;sB5B=> z5dWXCU5{`rm;z6)vOA@$W7BW>G55?#Q3}cqlv2GUWtcytE2XO|63%VmRU%#)1nyQ zm70=QXqr(UplV$SI2cdKHBJ#}R<#Ps_mxZ<1>o>1|HPme-Gxj02?X~sp$Uwu;b}RHn{s3A>a4s9_Gt%|6+v;%8g(aMfCmg-J1-dvo4eg zSC>Kyq0H0F`A{mQTwGfE)Mvl2clVCojot7R=DO~#4QEEi!n2Rg@;B^Y8KXz5Mn&b{ z-O=|&ceGil7EE7392de|fETJkAVgN`yZ-bS-BE{7Vra`-NyO5Oz*-EkpT+Zam!1n{ zl=ds>E*v)Q?NtGdqBWqdbo>0~bOuiDAZ#Zd@?C`A9Zl`)btYu+$Wq`n5GMEV`2|^9KiMgrdhyGs0a%M7GNtNGT0&U{d+sK&%`62^mGXx~sj7T- zj(m@T;QI#J_Kw)D4<}yyGS*%@yP5zSm6cyJEa^X@NsZ2w@xGcAH5^ZuD=Xt@jGHog z1#D7QmV_GsQDUlL0961A`HnXoRQEWVVzF&Kos1EuL`V3_GIE=U1J`ImRv+cdpK#Co zQsv%RQ6+|2_8Qi_i6+kDp;2adz{uRkaxK`oiZx$pwBnV{FN!dQ^F)CuiE7wKv>XA} zkKs&C$?8|VNpiVyjO)6&Z1$R~uH3V0dvjA3#zMW`5K@L$A++aUR%X>(3*Ob)kxnJS z+fZgr&&q9jed zi;d_89NR?W0C9-&j`9_Z&!@w3l^P%^!&pORc)h4RjukazeLGpk)@53;Gc->X-=v;_9>ZF#{+d_4?4}o8S1Ofko%V_zeU%Zbm&WM`O`jNWUGI18i1lC0CkGQ8^Vz-0;7Rq}^baNGpM|plq*3!s& zi_`Z~yAxrJUAU6B`?Jf^&FDZ`I>_3>(u_oq^k!wfZaSmRo$ypEv9GdPl;QxhQpgGp zOdqo{db~)lSWWWkqH3&<#Q;)t;#e<9M2IDnn3lC+US8`0jbZjWyJwf(2K)bH?c}%o zsSX?!N~<*IkvA{vrB$Kki>c9FwL|sZ}i8AzlKseI7a_7{eK^A)eC9Lv&PD5=akA7|cxJZW`Z7Gka;%qN*ja z1Cja}SsGI18ChG9jr;w@pN$MCU1H@gNOyftoU7!oMz-E!cXqH0GUcn?EZL3OPL-=k ze?nI7^OwHiPr`mKqaKjd*(X(&zJ&p7S)mhtl9os$2K)QEI@?*##@#!2R;%SorSbp% z#oru0dYpwZYG}_rC?kYyX=>`<*aJhKbKY>>*@cCbLLppR4Gf&Y9+op@xN1qc)t$hY0$ zJNbOfOxApD5dppzFoYqDSx-wJcr|co9W)Lf2d6SF0J78rmlnr#kM4)kYeu7*$>yA> z9UKyb^&KRJbb^E&;>%UUZBv2+U(rM29VDtWw~e^f>Dj_k*IJ!ixeKDP2#!;hKHnG{ zk>!h$3v=CFs`k>%8=RiKEZ1yhkf_1y8{h#Pm~v0iYbSj>wC)09Z4D)~Djo8N5rr74T*A#4L8ffoUY zEFpJR)J}6M%j)me3Z z#QB8u8-Q;<~v?U8t(7a5ifR9zroLOEDx$E7A`#Lz`%FqiLJ+kT)#Kl?$TwE*j72>U-l+q7oeG<@?OV! zelfPWhr}qnD{5M8SSOZzI9kAHJv83KGOw|F{-u8Ev+k(EA)0y0S(&)5ph}uT89Xg& zi?WW+5-J9{H^8GCar`RQ%m@rxu_7BjR+@hnv)9_)?}=?!Fy!=kr_u;B#c3o?V=YK- zrQSZ-Y|=0QovlexwREyjQ8OAilKWXx3S34o6XL&eW$Wh6 z5S^M*NPW62#tt7nJ~loDPeYcC(4K=(2IjTyt_@9187T#0v{J2&j7@|tW(|eF4E|+* z{Cd<1Pal=}vf^p{)L36l^8)(c^+R`i^RIHca>VH+i5BW09I1(NUV0DuOJCsQ6S5lY zS(&-Mk0g3n%xEB>R%#c7XRpId9umzY@&c>H=poPrSvJB2*gzb)i)MA9u|iX#I%P=t z*3voJHxO$RO*9bzJ+dOjF(k`X0-o-s*|$YDJ>V^#5v3*NCa~oYQW4_KPVXL;H7PxM#9tVZ zWdNytH2GSm$8^9+SE`5k?4oQO6NQHIcUifeG`oc+(=3Lh2k?bqIV3BEvsA)*$Vt=Q zuTy;laP!~SPc9&LUg*ZC!&0}`-OM}R;`G7Ag@IwRL1g{-$EJKLgX|47Qj>fOOE-{M zk_~|G!SA~0Pxh4DNz;IU5y3Ut00>nwD^1~Gc)XO15b=2Yx))p(i$($*gE1!5J~cGr z`Cgck3GF!uWnfq*67f>00)M&hQ^xWuh4G20h~tE(-ps-nJjDO+4t?F9Y$Gw4`lC;) z2!JA-!uDagGUe7_*6zoNRuUCh*%<$)H(ODBS-BZ(sk4!53>lJNctyEE8|TkB{eN6P zlq8HH;voq;e3RX~i{&H|1hF6Zb0=jXhIRZ5|E|)EG8|zxE-HEDu21Jc$lgU004ykG zN{KU~2#zN~0tkh2*xp7n6l>mLis%qu`Ap-?_xT(|&uL`CLB28CBa~{Q(O-79{ATSy zT<330Zcm9Gn)rEpAO-MCHel+U@T*_($N#-CW)lh?3mjV;iM-O<@K&cE9yEksQeN2e z{S=`LU|hD(YL39z;8lTS6S03fG6??)qIO(Y-Bx>PqL0KA$chstl%T|U&|h58j7O*) zMcYXPY4%0@6>seG?${xbhmin#zQdolG3g}HpR&9EyVFMuP4F-;RrS(m(87%(m=4gS z(isubLL(_^&5L^EEC>d?`-#TTiga(V+D2uC>+y5evzqcL7`Jb>H}uowtF0~%%LUme z>3ZSP2(RjDGgZ5&{7}tkpGEXENUCOivxY=Eq#=G>vlx5PjW4+N>V3#4y|2A~_~;3} z>KCSDLVHeTWf)_d`ZmVnN$$Iz=Z%g}%*@U)E36B9428fX3)Ai*Ux9GY{t@a`0UylD znpA2GR}zAi6|W(k;{k`hhGWcTy0mjkpg?Je&mqSBDQClBoJSd%3;g7o1H2 z+{(-P30^EJFQ{n%w~?ccfjAg~^@`-{SHxUh^BZlY5#yi8qe4sH1#dN!*v&E!^qc*F zv#EWkdh~9w0I@#2RYcVf){pPAn!0IBAps6`J4=s<3Nz(FbtPVFcin7vAmtIvhI#RG z?&v4nGaG1J(-~_*eZ9?>y>a;ap6Ip;@(=SB2h%V@d`dY&7m4rr)7iSSho*b!syLTY zej2mutoG|{stI2J&KiISZ%liIANun|lR=Xn8qa9r0Kuia+nXPj{f*EGCX#H&Q3$`P(sMKj^VZk=+6ecMcn(~f z;e2`2UtSBW0k3Q&nJ9QAO*Txx+uh0MlSG#xLmUrZstEcIcl>?v-9q_VD?vTh9G=3~ z3#~SX5G`JaEr2Yy^Vtp>3qE@`#icp}$ubfLMLvt|)n!C;jXb1U zar8R7)hr>=aak$q8mY(3RpQ(J)GM70Ok-*f3Z zHnD%eYK|%EB~Ax;6jS)3jN)CwC6HW}-YHRB^9`_vU2Ii45k7b~U!?dP4w$m?4Zoij{wXWDnWj&O5+FR-27>h- zk`#vfby6&U&zt3D73^Y&klia5kH|tChnc^pV>TkKdYuR@%Etc@D6>&oJDj=FWy13_ld=TX-4X0N0G+XJ0qJ1Y1)Wv zs3B3Q>dN%TaD%OR8W;b%b_8%q%8Z}wEVGTK5Aggq-6=q>u>YVE9IqSX?Ktw=(Om#X zf&n$iI|56Fe6g4qVY+Ua_!-60fjw&K4X-To)_Lq+AU4V#)2S6I0g9HE$$B|js} zi_(o?;v*GmcV9g3D`ii2*Gq1^!M1EJgf5XGksscB*OzYlCQR}njtT9#3uO?BM4Y?s zec;#M_lNKQonOyoGwF2leeeArpZd2iKK$t6#iiwVJZ4)~cp08GGleolD{O1I1A4+= zUQmtSsvdZw-Mi0ff;c!u9E6!C>Ml~Bs~`QQH@TqPwPqrn=f|v$WCD>CiBy!oe#S3L zf0xzV3lTgf;7Lx1!n|r^bP%r>zdA@1Jej2zCd4B=e_R&NLmPn_VM#Vpgk^{mLlp3e z(6PAv3bp}bMwKi||J&}&oN8REI6BAy04lQaMU=XOP8n*@QaBhM-{36ilWflO5HB6{ zmjRSC!*#)IR%l{qxO}!QpIXfVo)RUvws4_SguXAf^Dpa1CS`SAHsDlW#d7;-(<|(5 z3rS^w?1(6@70Rq#ni!_v@uz(x-{kaa9%{{BBlp`)+gbXjME76Sjx4D9`t9pVT*q4X z*&Rx^N{K_f@S)m?5mh3lgNY%0u)Z`SYj2Ni;?ljwZrko=9}tUcduSlBO*1_LoFZ@+ zjLAw~HM&r&nM8F(xgoH&!}X?hDVbz4@z%H8x^2r2&Z`jXSQa~d=EMj8@nf}mEfNVe zw?li5LYaWdI+sar-@aw*=1q%B`PP!EM+kmIb@T>e{9Wf;HdXL7qpCEd&T~X5a`3CKbttMR`d!&ZGN-=s!bj6Ey3b z&=FAx7TvHyeKc+gjY(CBQBiq9AhMo-ClGKj&0?w|{XUw22bxmZ=n93k5l_Y}Omf&+ zOP-~Ojn7T~MKQadFWuwKU2nAtBnMdP&!SiUr#}sd2Tt-1n%$yV@1$;?$81v6=49Q| zg)(eySO&ZDko=-I{xxs%2HN_%NYC}G1>T5aa+TfoUM2ptcBqE@U`Y`mX)|_iwA*zx z4^k0KCq!jJRV_pTh!Dfv52Ntw{?s+BWiv|(#b0fA-BX(n>TH5S4IN~^W0Q2F}QhCS6AoA=$I8IW}Y>lgh&UD z_K}3<%|rAEUkNH*AVNJM3PYG2kt-$X!wlZ46_-@x+-7E>WL-zz2;yn3#PxRT`_L}% zSWD6cxAaSif$QxSiipzMOyp6XkDpyZ@RZzPrA-8kqlh#R=O#dZY_uTFo(I?{t`j;E zphn(ERDw@xqp?jiskA5ofq)*|)swF)!kUf7ZzEAaQ7@q#{VY+Gx;ytlf4PnT0YU!0 z_=qeQ3_W0IPbph-(en&r=AY}QwzG7WL;*~;v&7qIe?^G|i2zjL$_s?t;gXK?a!GmX zL1ayFxTeHh?x0ZpVVR$3)MoAa>+BxgI49lf?Y3QR_Cc|*hE|(!WS{Qe_LTuc*Rs~O zSPVcC0Od(lnHIGL)qp{GC!gP9b_Hv*jPCb3OM`%EISm8G`Q?eHSg2QP(m zmo4uGUih>-JS0n(J%?9O+|%HR{bV6&+qUn$|DomOd}n7nz!#Xh@44^6=B8YDQ-twyDrdo|s>veYb z!#uyF8gx}&TaVQVQTg-Qk*ebFh;Eh2hfN5m;ke44Mrddx*SmGX%7?-+DsV4b0t2Lvm&JD|v(q-xlvsqrix-Q;s zB~Gi;JxJ3(Q@InJWkR}Wn)4~a9A!?_>#d#?wI1Y4CwUQIT*T-;{zNQ#*6Q{99(upa1j6KXzt#_~`Ld#ZswvV^3#C z`@+IvSS$0aSx|$y5xfh`%-BBR&6jjT9WXnSScVchay1)3||V4$1-ubk3=51kqgM{GT6~nuv*2?J}e5suE3LJ zH7yMxn3RNPm_K+R2=&B+5UB_vzw8X&U?iWE>2`9Z3qgJ}jW(m`CYF7%-Twai!}s}1 z7cCPGiD{ma>GCElzvPYIfvg0vdT~-O15x{Ke-Q@2UnO1yV`0W$0X%B-M^_hma@hHU z_+9|7e_T0uTo#kqvUMRB0D(vRvAD9t+z12y1AqFT$T@dG}Q zMp^@;oyH@~ZbfoXc~{8XOIb$;G28)47pikjdt>kvk~^#{F%|AiFPN%hy!Z`o3NR4t z{1+pex3C;n?gkqD{pjxBt{ph98xEVyN?nPJK3W=xp~7K5q12_1rM+Q)qz6fN zPE-!^U3NVISIa8OnIRKhWOxs+YgSwjAI0 zYqi=pzjMbIzx*}0(*e6Q<#NShX>oDMwrxto?#E|q8bTN%;3Hxs>Dqlbc_*KL8nnx> zlLgiI)7qf}c2^U2cCbtnakkOaXX>Z=apHQr*(h~mn4sBNuu_GH+)e>fA&3YF(vjLp zGbcnbb+&XDuug{9*PAF=%lj$sI4>})>s=sP-bT}agki5WC5A=$N!Bh%UEs{#9O=Em zZb3#ekRkgXT{2vAmFmT@>+Dv6c!JRX6}{r!;+_?=0?yh8d2m@5Wc`mS_g-tY2r1{JmPfS=QWQ#FZ8amzcF@${C9eJ^pT5(dn-;Z_ z^5Lyk8reoO*;N=JPjKB32Uivb;j(l)al|NZuw#DVKfLiFQR*PE0g~KhWp>ltR+>)H zSb`>uGNoS71i&#Z>wz380Hz%@jf0XgM8EG%f5ICY7u6M|LH2P`_-Nuf!}zDJW-V8; z+$m8C7K4=08)-+epSC+3N=HSxq8V>x5&28Xg;6BX<7syTln2nzUmF%=1q>tax;#!k_folTbwT4T1BJ3=4|`( z#^E3j6nq@u*E^yE5P2WtD-)tBuqHB2VAjwL;Shgg_T;J@;Mc*)N&bW^A6yn&TdV}9 z4g;*&)CmAWS zolH@9NmNgXqPa#IsKS*9r~|B%Q(B9;jn0i3;+rgmGoT{H_17)`9W zv#>!9+W@foXrhNCY>lneBCma@exiUpI0iUc*f{{2PuGWkH@*YjO|$3#NdbylyMXZV zTcbU%xBK)6C(M(z1>r8K#-yko;)Of;96Y|1$hL#&n5g`dd-4X+I!IHUBo-l>feFr7 z4^Fh=$RU+agggSFh4y0tWg?E#x3MRcOmWT`vkJx1%*>o)hk6D7^%n4qo#aJ^$@lMydX419>A2M(#67WE8PVkX&X(?8QtSx<21ImFdYGFRvSX=QtW5VzZ%{0Wp5G! zba?fxPX8h#HB2#D!lWVbb$z*-^v zJ%9SsjiCw>IqblGCS>&kjpNtqJdh2Z61M!SI_CH>{g^bde%9X9q+5d3@09L4CRVyx zyrEwhhPk01{hq*a0!qnJJ@mcHB= zeYMj~sRh?+2g?o6R7LttG=eab(j}Mz0=`==jLAyUG*7`m%2B6=M3WYz6dOpaARCs! zPXV{I(30}*J$&(p{(^UDQ6PEIbK)WS z9e)~7HHUW%zfJE-EvUw*EIXGN-ob&bNEdFm#PbOmhZfp@8I%!1H082=8@rQ< zxX-!g`O~v=GqZEnlh7-`7`v{=7!AAoo>6ly2dgQ}r_MSCJcumeX;FE1_;YKKB~07{ zG}(jWwr;}~dFi&32)y@ZXXAF7%_|pNNIyv?G*K+4#QByx1{3{RGBmuRJb)ctD1osm zD8B_q=T+kgD-wbVj4Q3CKx%ME6u;-s){#h^Jt|u_LwTQfM}H-@6KSeIe;;eUgU<#^ zJ>V((X{w1tg{*@=d#&C53e>D?@M$$MC-r*CN%p z$DR3``mtrz2%XS*LuiCo{)8X;v_JH6)^)Yj+(Y7RG~#G=ZmDq$VMvlMd&6J#CK-Ng zQdpFYQ+}~0l7zPzA`YUyVFX@J03ARNjwE295mAPr2uKJS_3WKAgN$_i5^p@n7oBr2 z3Lt4139eKzqH`u4I9gI(;_P}TK#*NDcgUNYk##s)A4ykf^^7hOi(#^tweF?aKdv7B zwm)@I9g<*qD{1n4HIt5llK}XBoL8r1&Avpf4E%}=c7854Feb{nutrq%5-Mh~ke)cS z&@L~ODHMyAWkn;AYPGg?aG;~34Z?NC)WYKOsZ&G6a(Qia>2a)FF86NisnzSnVu=eu zDGlp_f8w0e`V4tZ@*P&jOt`cr-A^}$yJ+m^m2 z6OE+^4Z2i<#i?C1t62n%c)}G{E>2TQRsjHYu@vAc*lNGk{PBA1v);&s^}=h#!oE^h zvK*2%I4gl7gr_-sLf>}+9as)va@DT)U~K1Qr_ zaf52d(FNJ)r3r#)UNwZSMn5~G5r0GZb^sOtkt;}a6Fn@m$bPxK;Wd$7q1DRpAI0}R zR9vbct}b0eUsGa_mDPzuOzP4*BTHqiwsG<44)(bTCx5}&q{oqJoD!vn_|ilE(jlJD zD=!;rbc7Z{nIGMhQFi~upZl5diOGY9jsg~W%`Go$ZElu=6Kao)P8@jT5Tj50T>xCJ z*}w1B*S>0TY5BydGqZE^g<=UFhr;ncxdvBm2hCsuO~40Csp?l66U)lG(Q1Q;RtrxO zM~V8pa3292;}1=#+FCgBmg1JY3=1erkl@+#u^I_?BYtAGipJmPLm~0c(YXn+tjwO%x0Q^kEAhs zdt}o?Vi6+gAPpc5;r+65nQj$k;Gy9g_W&d^D&pXKipUQc`5wnSB*sK}5?4-$V(kC2 z_a0z!T-TZCO;y#^d3thA$QjH6DT>N8P1%-gNw$K+>a)Fm4sv*JckTV0c5Q1N)@#dJ z*?zX4WlOdqR}v+gB1KUYMKOX%L{1Zd$pNUd_TR=Lr%aFcH00v;0@ z8KaFfvyrvDCx!x9f5e~qQ}1x(KaoXH<{DUUch}GT%zI*vQ!Ex27V~Yb&5q-QoIBJS z9iNz)UvQk4$Qw8puIui({gyYp_VrSF^9zf!a|`2>=l<>=KemuBL`C`UQykNBAp-_X zAf|+-Mnar;Fc{y<7dmllE6bXlDe_2oeo9p5lyAlme$yZqKfo7jQn&_lyxHk`BAkX$ zx1^HS2r%3bajXkuQh21?t;N#-i{PRRAV^%+tJN3}-bGwSY$LJbp~jp;bF>!XY-deU z%g7>z?ax$CKEfwo;EOFJ)*i%u&E2w#H9;I|VTrd`eScbiF|D^Pbdr4+ZT@L@-5FJS zCYU?G^L;GQNfQzYPx>cCsj_SUP-Lst^BVh=aM875FV=E-Wff+Lz3PJ}MCD`t+22dt zELE7J_8%o~{fu|^ge*?T>a_AEMYX}J1)MQ1sv*9>>8>iVg=I7v27IkFLj}Oiawr3C z<{~ZhlGOYd>52L=Q6l&PjfR{3EI0@}s~0CY*0aWtksF4`{98ErX1i+>%h-rCUnJk) zHExX@wzkl$X^@k%${&-JwQ!G-QBY5bxxcF)UQg5ONV<*MHkPJaiVV<1T?seZX^Jd@ zGB2|v2&pf}cR;#@v_eDw>cVqgwh=*aAYs$2> zb`A9P9D4ESXFm7EL?W71_Wfs`61!PbCw7@3%AAqq8KpB|SeHjcX$+T-$U>+f82D+U zdv+O)L59=x#+c@%IZDW>ps3(I9_OzLJOaf~l~*gsY?FHuwB zVOjrc@A#i2ZcXdPD81#;PU2M*n!yNimz4tuwVQVTn6tr?wMkh=n%<$NWc9cx&MVKf z^ITAYi)<~!jT!G3A9MI~K?Q(jie|rQl@gQ^n`yQiC#a^nixIdrOn2TD z>d%YH|4Z)}0HzeS-fa*4WNbKT21vcY7a}MVSp;QX_PT?y8*?7}+LHtQy*svT?(Ocv zB&MWSEm!Kk_v!!hg=e07!M0zT??M?#XHtU$eM0Eo5FsRE!PNBZ$k;fJ=G1^5Xk|Q+C(#rI^7{&XtZ1vWw?tq-S6}O zPOZvXg2pw2So&2ZN>(th{4r5IDT|v}hU;OLGJ%-5sK~e4tpQLb<7!boeQTT+B@YSb ziaaWSL`Dui)_F-CJRw9ToxXd|?QLysA`Ba8Oc;jKGqV%t&PNI~-=_vaq7x^$p>~Ey zjHpWNa!B#g@f@CeN|gUc?eHJDyL)W_A0Zs})mGb`2**vYwJ!sQxR3f10&5vqWj33p zRlNmkx3Lrsq_i$A3PLKpnPdiOLTcsM00K!>h0KVj0qEJKQ+YkT@{Fh)l7;1bVE{TC zX#!I4ofsY?=Vg6S22BQv0b+X~7&{~v*WuJgn%Pcsy)4#1IX1#~*j;zny+{S)qI`%i zJ{Qh^ozKX~MP9Z6^7wo(aX>8U0bYo1wVJv}yq6{%;?zXFr1()$^z}T^3jks_Yi`9c zfCUXLyFFIhr~J_idW;4hxrqL--IK(YnVCutXt77|UYWtxdz|4n*j?ap3BV8vRb)Mh zX__X}6!oZZGt0hOwdM3w5Cv#AFM~xDxND#jT^!QI8*OD3j>@uib#MfH23`VSeKWO% zl8Z7tq6{?TafKBgG~j52nwH+H&{>2kj>D7Sh-!!q4-0g1_1N z%aME`TzneMfxq8p_56?2ElLSbR~VHigBYeZ#(gx|$8z`ELvJrVGNb&pvUXwg`l8P5 ztEkQ3Bw>JDKOc_A5&No`aTJwU&&}>8iBVA<5oIFe+$l35q~jUY^JdttO>A1 zm#GDULsCrVc@5B2sN|}(H*m9d65BvCW|Rj99~;wdc2&2Auf!lt_Rxg(UKE}Xg&9@P z;z+V9vIxptBWsji4CTdL0v{G*FNtFS1H~NsHFw?F+0ntdo>UAgk7XtH?mu|&$T6Yi zRU`X;wa59?H^dAi$`EoYh}++83lAjF3(ET!|LjxY+yGAWu=skCZY8mPnw;R}y>fm^ z`3=@&0|88m`fjGUlIvO19@=^|EC4t#18!7F1^3%MuhC(N!+{U;!lbAPE#Rv|-8PoB zb+HEmOnpk#Dk`*>rOSYp26Rujg_NjDagZ-2E{#BN4v>fgd|7X$;6xy39uM>XR6lJI zt*f??X8Ldyzt?DQLM*dLO6sIh+3asB9%fHTI7l%(35Kw zIi<=znu%-pNXdl{7{SH5m9^N|QhJ`H76?cY{HyWJfDBHG5}=Sb+Fh@*IyBfYaO89T zxS^su)R4g)Y%3Km2=C8p$No*6V`h#w7xHt#cnVtpp8gJqg&|7xxy7N^x!x{t$ zEYj2Dopa~MKl+IW_8&MLk4J>x@9V;h_OU5hYcvhLoUVFexDF>paRiqWk|hu;$xvWO zaNTpVW-Zecfk!?Nj=tXRiW97dyUnRz*O@-5qcyzx2XIE z#tO6&OhZ_YjLYhr@|Np@aHZO5Y>1@e#D=gpDXXKhVy#HKHI`E7X4=@LViU4wWuM-;!&}1%aNnDy5vAo&BRf z`{0X*k6jI4II`~tKf5rB?^?yGs^UcyQY}1>0Z+hJdl^oGhn?i5zxIy5-`z+NNn;9V zW{+%#G`bnv?KGkJntH%8e=?YQUMwv2m;k=nZe_J1AGXela#<_*eKQ(Cs@*|cGi4B7 zmmT4Svf{ZFPzFw;i@KZ4E)_wLbC-Oj2PQOHYLD~6ezf2swp5bQLw{s&i`DWftM#4M zAR{V{Zb7_noLm_{=o+h z;D92lE`!JTu~TqORv$UN_Efqej@cp|}ywZs;jT z7Fh&kE?xAM3PXO^p4)eB+uYE5wQXl~Z2a^8{_t17{#0{QHo8KQt%Ygqi}=G{4JQEv z`L|%gP&Ef*#7Yro2Z@2ZnE{#-)?}j8^L*~l>qqOlr@Aq|M-9;w#0jaha@}tQfNA;2 zCwPfo9B(qUeOT5H@P(E8WlD?uimj|Erd3(_l&Fu1Dja7i-T)N4Y~LZ&RO0l{$2Qz< zwV6@PI`@}Gb*-7kn^9~7%e~(2_`}-4hr{#kYLmKEw8wDO))0(=Zx)mvDETv`Z@kIs z+F>^h(^NZlGuVF28$BZO9|=yk5tkTY81R8Q;_b+l`s&F0?4FPLXTXnaa~=T#-dkW*O?o*tV>eT#gV-h-EvmQhDK@Kk>lhPkbYj zN=0LsB6}GLB@U4Mpm+2+fBwE$cN*K9Sf-8Gj3jEjIxVXY1rtwlJ)yACf27;6rQ89T zH?|29km@3?Y0cB} zj|b%;QA0D%<5gCBMJx9N5&UX@}&)jw3(x1Z-{RK1xvSz^PP{6uUpZglj2F}C@4 zYx{$XY9$=W407J<4lPLUfLNTCUR7z4n}k;LgOIHI*xA)(&+t)%NZx=Wmm37E1?5fi zx@E>4z^B@&Ni%BsV|*n3-aomS<>IEj{yom{5KbSJg;o-Scz(Ymi< zgkvJRR<@{oSe?)D8bkt5i3;KwY{75L6k@dmL0X8jjpnpQFvgH811wlhlmP(IiQP8S zpF$8hC>9NS;BwQuR4lcQq|78s|FqQe3f96CTKt|Qw&*F%Iu{1`^5@kfdKZb%G_l|a zGg@5uL@RaP>I?`a?zCE(h&3zyC9KwgWAAYW;}B+~e0%Yc7-d!yhp!ubhVP2n4kpvDkcDr#AXtegP}vHV4z{|E2*FU2-eq6ca3aoTTInh5OB zxD8f^v%#2|_j;v(svx}aN<_d(qgBP z3M3MHoYpk4|5NRG9#OR-i=fOmPsLbtNg})6F=;J>6!~?fFKuH@8%RdC9U-yA27ut* zjO}$amBp4&vM9nMq7Wx5p^VKaGF@54rVHW*#;|Pg#HYPmDqcOiMkR1gYIS>?JNeUD~IiOIfKVV zp{RvVE|iV{11(CQVC-mi2x-C=AgV_5)bo6v8bG$zrv#yQ56%52cNZs&*WIm~?DiLe@#<=$qZ%So9LZVffjec09nFM~EP^tTMfRPumCe$~Y%VM) z|LJhHgT$L~+(@jhV!})-j1g+6FQOkO06?i%vL6X>Q zH}9ZL8)+s*<0(qIk&v1k0|!xM=}(EeZzg^N9O=OBFi9DHF<=S%&#MQY5;G@72~P6i z@ce&scXiMhguR`tWe;onbTF1Oda?k6UT1Z_$6dFV&psc{ALXUZEZa;WdWALV9}$Jd z6zH`+pFrt8uO5xSP&Y~yWccsFL}M-hg!UFapS-rH0su6LS7=ieytPIdDl}-a@g4!b z{6qcJ-=Y)n36QmS=KvO*}^hp7|I2g?IGB-to;W<4F-;O|7mmd|*^m+GrcZ zoAorciKL(4vq=-EE=x=y@C$`fx*J88TVCJ`i^wm^;013Hf=4TfZKjzWtZ6&TZ6GOZ zraskq5i;GH5yFWfI?PgW>L?l1m3-Jc^NC=j(X>@p{5d}V5&!hBxmz8Ki5b(qM3;f! zbTeyS$6D60<{yutx~MHcpwy9-oD})fq5`NXt@n&DT5XTOMq~@k_()oMGlCxCiw)dU zReU$iy(cydDfm&5|3)x-K;&0tM!%B0VtGBI=_0VWLIpw@H1l9E@eX&RkX{>g{@>J| zXT;od!Tdh4ke5MR!_8HKJ^;`z9Bn7-y@TWs|Dy0vJ{1-WEpNKu#7ez0kz z3X%N({8Kf>6RX__aJJnz-bLdBEVs+*a25TKcPxEPfmdXaMNlTP$i8JG8YSqp_>9o% zXU=LwT8L+7wIEIHHcYV+&BXa%$=e?F&+iwDhhShX+9$lFsj#R>vVazl_ ztBZJOR(kO7v0xgq-X5CRO0&1JmLy^e(kDh<)rRScYh1Z{8{prXT!N;vH))c!kB~TazcjC z@^0}Vk}{ zShF-6H*aObZ*?|Qc;$cAk31AkuF8M`;M=E%f7wXE1(gTFMHgRtSr?2^Npj6K$B1I` zBTnCQV&RM^xhsG;SV09#6Hk@t=QsP6`bTh^ewxr6c^SYTpA+*j9Es3G7D1WFBKw{( zYwaNn@XH)={>D3wB>EAj2V#5*v$w_i-=_K@Pdz4!e^fhkUey}Rk^qUK47e23gpEOx zd`L~Ev4xi@;K8>6l7N9mMEN0q5}9o&zzPx}c;q_WgUu1P4vNJ|QCl7@Dw5x6wLx@o z2`z{qPyzyvskP{VmmdyJd|6Bllhg*1xyx!x=^ZisqHu&aIQ?&M29XNJMCqs~e91p| zfajN@SXJ`7?6xeibO6Kn7%xuAx-x$S+y;;c4laxoGQ2dT_z{j-6%$tw|I7N(dTjk` ztad~ij4NJNn)Bo#xoT$|fQb&|!Y8kkT9m;VRCcbz6pI96Pl%a!sDUO!Z(nC+Ka{xb zPijY=<#Rrq*rj_(OW;Q98X$59YxNL6A&P*uyGR_oD@`l_%~RYv!3$OdWg?59Ok|OL zzgVLm`y;{WI^sX*^fnn*FH(Z3U>K#$upZS=Xockaq^O*hIi0@Ep9{@)-*u(u@{E+Q0y7PKpv)hLGS4pAQ$l zj%HKHdbb?>#rRgGcnyh)44DieV%Zq?(^S9JvL0uDqxM|hI}Bu7hAu}?waNKeSBd=R@Uj>IzU@^FP~pjK^8kvPg7*yb5I7>(;6gvHNov&^lmQmsq=FGqo)mR{DF#YoYctJiGOkkdDj1cO<=Yn6)MhM% zn~>E@5~c%}KI2dQm4AE-$!?^XjWpd)k`}H%#b>5ueQ7Tvh1oWmZL9!9sY7AD(HRb} z-i_T>&E(MiycH$Rh?0z4VQtgwa? z(C<_az*T??eQjH^;i`Qq7;!OspEJw|5lVIv_ieFtZ*%&;?4SQz@8nrgzD(qr>BO07@nASPFTEM* zd3v6<9V2u`)YEzj6K)Vf%?(I5u{6?(*w!JQuj|&?OJ*z#&{Q8uKwR{c924bfRkv1T z9auvXdlSnd8AASiOcbYhZ3I{UJv;}oXOJcbNOD|OmRP8PF1;iH`j{c)svv8}WXVVm z>JZgWlTFw%6lRi_{^(Utd%nRfZW!4Ou!7dETV#m!>0sq;9kJ#^@9yQ7CD{<3=XxGJhkpORPpSHh`2oamzo z@YN<_UG!D-L$Sg8obDr{xQ{RF3m1-yLRE?DH_bb;8`Eh2x((m*a}e1$0`?Xfb zZLFCqbWYWlP)>NUejZt5k-@zHVZMR&=aru@?a<5XHxL8POK&&Lxn^5uE6onl)E?Hl z%WAsaYU?DiH(Ncwcjiz?9+%tTBLHWx|@&S^M zh0{;+*{AvZob;K^j2C;t6h^0c%s#DpVRjar}vDgoR_t=@?;!U`Xl=eRAr3J zIoZx~IhM>xtC=|Cvi_u)X>6cEvN*`xQBj2z&^E#n(MKFvWDT<~_7Gi~1e3@4bgWK) z+1-?-ark)`ZC5gY96fpQR*c}cgQU%>s>epji{!9G@qtm$L#uxhgPKct7@Q5hyvRafB0D8t` zbqme3Vb>+P{^Tn?`>a8+LKpO=^=9j$3IZkDumdQ$YKEaM^+UZJ3$ETkaAL1>ZV{Ql)Bk!`p>cL=Va}KEI!NU_VI-XVn-I)mE#kv*AIlF&x^UY z*#p~Ywuw4@B%Uy%c98Tm--Wne38osi(h^a|jCl%AnI0mE)p9h`f}Kr(QB196R<5q2 zFEq5exJ!lUVVfKS?&!>dR&b(UpUc zlsXC$62+Kr)my+-#y=g7^^?R+toc=}4Za=<7fLG3tmHf0U z&!~EQ#hp&{03CZ6auTJd?d<1T9_A$z56E$6ls7Hwqq4ko@=452^3oBWAE2pr>IPVj z%IaD~8KqRQSV|-lZY(B*2!fDO5@DKe#Z@%rwxEIsgNaZ1qu>=CB$j;HK^k&Y@W2eV zF2fBCDkPwie-6%U^|EiWyG&;|xryeU59co9|0;8OLp0UstH z=HuvW8*$6JhIGL_d?bfR>Sx?_!!(28XfYK?Z&vto${UmA$NiaS`Fw!IxA6u!QYl2= zV-NkX)Avj`_o-lXuTHHai=d40)R>v0)FMawe;f6ZG`1Q-K_wMBYiI;t{lX4T z^$vUBfneOQRaU;7-UE6;%-^j#Y>X+kv5`2s9O)|2rP<;MiYfTjDN!2d)fCkyxkNTt zRK8IY_@+;FlSB#*s8NyP($~XKtxONf?p7_Yx4IAW{6G4qPKwgE@%EC4ZDd)5@f~*e z8CiZhoU^V1uSfREhcc$PO*XMK#*8Xi)Hz>iLHUh4s*ffhi8KOPNJ?*?SZv6EMiyCQ zS7Ul4q*>(QMhlSC(*_U&I3kVOy}B5~BvJ4uOkz^hPl_^L5#+Yhrba7wN%2v6p=f&9 zjciu=bYqw5BrgDXx@?!~Te1*IJ;xhYj>%$x#M*Z~Zf|RS-CcWf%^mPVtyY|vJoosM zPk;Q=pHu4EFBQsYM#Ns}nh{1M`eosmK#4o-mY;XGcuIag9ADD#UH+IjX6Hp+H1w#I zILh-$Y+Z(X0;D>y+e%|dPi7@rb_mOrPQLs{7ZLFJCd@utKf|zU#qql0mLBaM?;-Id zrmwO)JCOTZ-o7zexdQ7&uGohHNCas>p9bp!PUiVw-oAJftp(G4-3%WU2yck0jHVoJ zWEs5}YI2r1YwFC(jQQPRH8Jc+1GY=@d2EJ$=w2t{X0Y8Ax<41&0I`NEf6&RkPp$ue_aaxTXcYne z0Jz^qVjdC@hL{<62`}#&N?9DcNQHBvdR!LK+C5@MH&U!;>2XnAkbZ_(k^apq8Ol&Z zz+*H~MzaQSLHQ%H;+i%GuGCF5XMPWVu?~g#Iub0xF_A@ft*w!p9tanoMsrzwNtaL^ z(reb*r&aH8NoXG1{KcZ_rMEp%O7-A)W0&d-uh46hjAFEAynt5>!f^YRO@vT^v`9Z8 z1i;Nx&+aW2OSz`(wf&SJ(Ylr8{;_@_TSY@gt|N!x7IEZ0d=O`3g`${M0fL54>} zA@))n7i9*46~Hx=Od9|JM_!cv2~ph77k?+d>mIvH$l!LXwZnJERb{zowK5oMJx%YX zS%u+FpcA5UPSs~*otws`O*CVO>=e*{NreEL*23%9DEItf?B+TS$3*4tz0)(Q9y!J< z6UylBI7GIwTvjJ@exUd$_>HVKO5X`Ycd{HZO>}yl6?ulDUCGEIyI!`kSsIyLfKgTX zLNIx^)d36rX<1tJxsctq&{!LF1(Fnr9-6@7x}Pw{*m0cgTQ`Pbpf3If@Xeva$1LmG z*GnMD-bS1BECqymQ3?|Ge+wotHp+yE=16QtLYxjPqZx67uTyX#{>2~tQM(Vo1VwVY z)x4c$M@03gDEf#`iTeFcZw@<2Jpl@^FL{>FD||T;1XR&SVm-PiUk|T1E{fBtp1opU zl{8ocp!Tft(ulQUx1z$l((Vz%6!6XSeC}0Nn`7|EPMSL|i%Ao+8lybgiTieY;3lhi zJwO(%I}j`=Z%kAHhkZ4ihO=GIQkvDS+3|UD#n1+K#4WVB&&nv}car$S{?wGJM^N__ zTa^isJj+Xud*i({4$ym2)k=o+4vXdxOZ8}?jG2fgy(6MXBce=Xk$s0_5<=%??Y~rC za4}s+Q#B-9L{|$TntZb;gB-P_Quo>2p9#iBWf_oAVzn8_*Tev|bhfwd-nm^X*`P28 zLMdgjR6ch6WIXO(huRh1N;AIB&N0EX5zNd0XAVK}-Lc^uv5ttsH-gziA|E1oBl`?T z@{_^HqVnEp5B9KRgDNw~k{!g=mf6K}Lpb?nyK72s0_uw6sH~Xr^3^d}-OCs9((9luAQ&GBd6B?gking-?I&VG zcUm1rz)?>NPZ2AH;{!DN8oT|UytB^*bG;-flmKw{;tF>BrBFtJ1H8&=HK>kF$kH74 zLOtj^lB<3tLYanF9+8Df?`Rg=8O)}X*C@$^O5SZoyizG(-8jk%;Frs{@R!{)7e?aw zMv5k?@kSQewZ5fEiy5{&A*)F923Dau!mW3h=g-Pgj&)(>cT@MDQ+IuhPrn%E;RYWU z)$2i(1t{bD!C(K~N4IU+*wxYA-PN8*q$ehik58UYCKK28wP1zmCh>JNZ5c{zAiaYk z-{?YsubWwVC(A;R-bB;GIQ7Tg;U!Ax4cl>9QQ=4Y(+~J#01;kmbq=s(A4w#Mt(jVi z1MFZpR+Y8A;oJx6hs%hsBo6=%b}?(#z9&5?_wo5F=(vPPSqi_&>Uv*nV+V7U5;qae z1Q*gTOI}vtyz)Ls!JRa*pu7d?1J;fJO=OW>4@`s5 z>YXjRryA4WtsVGHDetseAyBju`yKYcJFEdnOCRzl|HePDG!6S&86l)pE`Q;nhrj;R zvrXAde{WB7u4(+-Bp26ybE_uB?N+*(*k%>Nr$phLY0-i|HDRZhCE|t|3UAg^0^Vt3 zs5m733Bu0HI(!3BIesH0QlidthN4#bPM+I_d#&89U8FN*rd{WJd_oMQwhk@a3Vc(2oKTA$jv@)>r_ zkTOA+wP81SHbogQthX28AP|*46O26-&J5EGcuQUJi0JtWhcZjT5{=!;#?=OweVWf5 zm4!~^4$$;|vA}dPbjjqrY3bc#wQr+M;DvC2q6}w6{Y8;~Je(evRY22GuTx}^eJ2fa z-@o#YPpR4)?XIlmln`BLSE7Z)jE1ke=7kxECbe3j~_d6(skWxwU$YzuK8Po zjB5+anmq+rhpZRP781OjP|1E0>%|ES3yu;~!4ZS*V6srodkjf(OMa-NzrHAO4{5VOjIz`xeE%Yq78u&&||#o?2@ zg*AVLPbUE+toGozVz0A1`dD1!7-W69K7I~W&x`tbQ5$5*-7L3}X1a|}YC0EYFY>$= zq`|tP-+|rRSc|P^mx{db|JFP8sc37+KZ+H5)Sh)sqtcTLAOzu%__c^^EsvSKhOGW8d6bE!1^-M+<*>@yv;c-#^{o29* zSwFIgWp8E8x3kuDG<`;tr)2%w)+As(5JC`Rj(wr)s#2+7LhyB{yIZn`0IzqWu~pzz zg;f)_VCnqT_|`A`Q+HS`3(EU?IP=wTTA+wA99d-7-E2&o&24*v7heeH|2I0(PGULi zT=S(o48wRl?rHN0CAMV&rlIt@?BM7~Nj24@F~74St4C$A0hl0ILKJMqj#3hv9^esK ziJ4t;Shd=5OgG5rI1bO_Ic(oU+wVc0@ZfP#J0uqOiN!-AKO!o=QQk}Fnc=VGsHa!; zi*N8H0i283vtsUR;nb_GHu!OfX8tO5=XqW}A`7Fk^2J~hKJCUM0gi08GAYfZAr&e2 z^ZbY^=ZItSUS*;Nz$q>8Ve4u=0FU5Bkq3Zf_5tt?*3?35&8w048{w=#k}V5l6%}fU zBKVt`)p|xYhLl}GVgNh}uq=Uy&r1}O^)$1dHNPvi5h?M3%7I7u6u*IK;5RyyS)S@G z|52CnSoWu!b$aSA3IYkaPW@kN$0XKMc<;5kcRI}jH1V_X^;`)?TJK?(A-!^K(YHC_ka<1k4juqBWXijRxx`HOQ`5|};Cr)R7FMwZ@0 zGXPUTtiHoE)v5c6nGu*!JCH%p%f=&>7dB(3m0?`gduRGbvw6yfvVwH+?bs& z*i>=;pmylDVmn?N>(dki#M@b{9d%Gm85Um%CmIkz!x3;djV>g>%}H6Y(Kibru(ksn zSx=i@Z*@BQ^OvVZ$&78+uGCK4O*E~v0;Hmd92SM-rE{QkRY{Se3^D{Rg>J)c>@A{8 z2@em2=RAPCB)OSpdPyQiG+|3mBhz&qwJJy0^sJzW2yvr8naj*m0z7h;)ugxKvGY_o z{)u38KVPUJ?i!iV-y=IWvy9LLEOe*S0PZCUnWzA!yA2WV#B!55$1yU+LiYkvL-LQjdxm;LcU zni{0pqoUB@^%*&}SeFJUm?~V6{G=!qRk*aHT|(hrF@I1jI*6EAo2em|eidsOGTRxZ zoUE$^n@M^rYkHSG1k2H+s(vw?cr2W*DGniS4{P<1I3fyxQt=xP&;VknBk|w8gAeiv zK$Ew!7Co<&#LB!pCM%xqd(z8whFHf$;jOq&D4C{KA4zdF!?A4qHLt=HVsEi}@35MU zA|E@-3-DaP5OpPYu~Y|f4NY5}k|ltW335rWfY_0jA;k?iq7H?5Yqci6dFB6ue+ui) z752;S=6A)0-~vy{%2`#eA|6{IVE~V8#*RR0OjHQQO_xejM)nGaGI06ZX>2!bHa@Br zMg3#`S@1vbtrn!&@@HlFv)=e{VjDG39dP;qz6cm)3Cbu#P8=jjIL;gFu6~-F;T}Ny zlcG2yy)&}1sJ!SZMi$xkvT-i9Z5;+QBc&Qh^$hg)3lR(r_B{UN)7apHYYxRu%HoH- zY7=$_Na}62hoF~FwcuU#C>mU-K|zvbzEr+i6x0ERag|YV{6PSfb)b) z2?wkzk;IMoL*OLmrH@zCWR%v1rgyWB|2w(!WVrBXc>a_AXmnrSKu{*sAUZe9vJ!C* z{5v>*Ocpdb3tdppb1->M%*~5>7j?~V6nO1Yc@|v1s=^<(dhfA1UmNQWWX;A7vh*TS zlEI=1PVnMK{8MLT)iooyqstjtWZ!G1l=6Ik$JR}hT0;1K5D8K<{8FW6$Z}JNZP0U42~qU8mQpYTT2r4t4r1NV@;wyf|*(@eCX^<9QCMp#pBCRy+jLP$;cCu9jAaC(`e zV1)%%Ibt_>z9pf@cDT49O|3k|-)Rs1cx+&h=A^9a)dADGFq7fHf;vwN(z->SUu zB%e)_sP8GV$i5d1ZvS1|w+Im$5`x}uf*kw6!NY`HuT^?UGXgEsi~u_!iy!ok<&fP^ z6J^EcrFVs?f$+p6vbM3N#?Z|(qVg=CUqs%ypaMC18e2mo*+-Mps-D+<$j%^1W{4vc zugmHIo{!|t8-*_2_q6glWBgI?Y%{Xopl!DJ;Q3in_6(ul> z7L)HzRR+BB)mAGu3szZ%aE&iRtdRF~kxU)Qn4xza7n*IJA-2*h5gnwdUvxJn^`HF4 zn2dj^9-#y;$Y49kyus;~$WLPWJMmpVRehqOog1%Q(S&j3K+9igK7535Ba7@iZ2f&b z+qZ7!{DKsolB!m%9X@&@?z-QBSHCQ4KO;(`7$28KErfr?#vF!l2X=>OQcJO6GNLL1 zOR8{9Kam%dKO^eTiTRr1aTB`C@Ip$FIvy_0$U4RmMf3`R2N#h4oArHP=d-t4t?k$y zq{$ZQBE^n|GxO5l#4@eK0hIHiC@hU_FRKR5An>)O1mwvt@P#F+6D;)*EM8}I^pm7S zf+%&E=h>C!6=*7_9vuh=#B@@YM<$vv#?Ke(H~ z0rvS*f94$?m(|8zTUByEV3vu3++^%mU$&_#{x+*`3(WwG2ERQd@=vi8R1X`8FbNjQ3f3(?h-n$yrPypKrW6HkRprh zJ7Iceq*P}|$2V_WPpQT(oY%%C&z~I|TN0T0&YjG~_9BQq>WV=HRu2c!VU|u4SE;Zn zwT^!ELMXlPM2Jj*CVUWB$6#gKa3O1_hs5Fyyt#C>rqydO`39doEDM$*eIywm-b!L8 zMY$;b2Q#lnu=pD|vNS%)!gx~F%F;^_njqHgR?7q7DA&!{L|+RfZ(}WQVZDywtxxjG zX<5GVg}@5!HdBxRGmZ0VLHH{l4Cui{bR$bU7|th{7S)Cp(elRumfcFTT3i_Eoi%+v zN=l5g*!j^|-#J;|$LA+Rt&b*MGbU4M+R#fkthk8W%esbG`W_1cB>wg4-UE8F6>5~4 z;5hIVUYbR{FV_{y)Row(m8LKy#8-UIY+Ya0ngnRKlf*R}Txkq*D9pzV#0E6Fg=Smz z!l!-aq$vJ=?a+j*xR|Ak&h(t}KkOafPMdDCTa=P_S?wS8PWVVH!EMdwlHv#K?%S+Z zaMlIshe{n2g*j0_qbeswDZ2KNMfRPsnc3MN|LI@o>TKV!b@Ls!-Mnl2mKTp4t5&Pu zc__2IRD)k?*rA2!W}4Pm43SAuJ|}CQlFO4Zd=b+?RPI3Wbu_8l1!-DBjLF+3LDP{r($Mu!e!?fA~isDzf0VllBYO$U;{$I*WI+`7CU!5 zES{1j_sF zSsL&FNxk3MbWD{dM0HZtW@WvuI6$RO1S7Xu?G2yWKr=7!IonKzf){VavH$39e6!ov zkcAiqP=(Q*vSmRAaN$4ik3Ytz6pE^KkwtdhjZ)g2Yw|q*@h6{t=*wTVEvvn)HJM0! zkDqqDK_FEjtdnD+Qq-fG@T&Ejn0aK3#*_?aMD>Iyl~9<%R--`%Qm@#zvb7x|*^T4x zv^(MZ=fymPM*NCisg}frB|_PYP0sMH4}|%@MJHRxC4!BRuYT4a-^FqXEm25*+8OR9 z@dEO5*twOqWQZfR3M&{nq%jb_0!;PLMUewQW4P_`^$x^^+Y_BJclACpa zFJ8892*C&-ub~9ds_+18l~n*iO;`13nqj9VYAzvfj`ad!K`JQA@J_4skLriYhy&i) zNHYLy=B0m`E?-sht#&r4KM?&c4)Ht$K85vz;LYA|b>CyR*O@HI;3L85hr{zXIF`AN zPzLVa<65>M$SOUaHmmH6X?|PsgNhQbAx!|i;TKeqBRoH^yc~{c>K085(-Z(zGm#bd zutXbm?vQOo6wV6otSpa+$|+G)3XO|$AB#7WSPyZZ*6W`0uof9@T5Fqpg%RBG_0_$EhIDcVs)0N(whcl!N_ok&YI%QrdQ zRT(BU&jwJ;1wmmUgTtE9vL^FdnVzGaR#QXtZc^4}loufBu27V55E&qeF6s(+IpiPa zh0EX$IKXy2j$0?;6-^1PP%}D;A-0iZz$t8S3q&2IZiHEbzzvjy3; z4^i@f$bZB;om?hO39)i3%^2x?JxA<-AYttxwI8s%dstGBn_vkkyfdQG zPvb-@_Tp2bJgEhOze$wgNY<5bFEUFSJ#IVc1)|KTsFYTNs=`pFHnI#RHkILNQJRpo zK%_Lh-jb!%Bs4 z*e;zx%R5xFgYaM1Poyrk;^wfu$;wi54pi~O7k4eqzExanbDLd`q6)`VHJY<s?EzRUCS}!#>>)tVueZCBfMJvXEb|AIy+>5( zBriD_e>t=ch57%Q*iI3S6YIV1@H3UUy51<&?h;4z$L*neo!-6S^w)x!Q?fLGQ+3P% zuvc`E`NC-Us4F3|$X?lIh%%-lNuw@0DGF1n4p|LbQ5tFVTK1B}0Er6|TGp}5R06zSA(H%G-cfGWt1FmJvWc~mHm6t|qTr+`9}^e0-6LBim2#Q84?MaM;Z(+l>T5L zx?z-vx)du^m9_iDltlzVIxchn1y`!~hZB&f4ZwJwQ^Ig%!PpwV2&4G$xB5 z4@Uq7B`&TJ*ue8I2j}1HbSb^DDs$9{NxeM@o(P^jNRzO5c}m4Fi4h#fZU>5QwL2U{ z9t_4e(o8~&Ig$}k-Y*uztKR&MEV9VHUrZVC`+kz_rb#m!4pMea2(?xx%IF7gGK1lW z-Z!HUdy}6DM;;5NA>?GSRYBpK>@KRAzxd5o*F)jNN+upGPn{%jnwKF>f;BUV(SEUT z+ABkVgjLZcG`c9O!p)`LE@_}=qo(ylIP<0893TdJSt$#G#U86I%i>6eJ89Ey*8DDK zNSXQPaG;vv3({XyVa$v{SpGyfU@M8W5*IunR6$Wc{*vx)_)e<;o2NkPJAx|UCl}h^ zn5IurM32j2Nd-v^eh`Om2zZ6`zZOg%;CV*Sqv6y~yX&cb3YrpC*BlCbX%B1F`>?u< zM-K9Qqr&7P*-2s@kif%BVp0|UX<4cwo<=viLhSX0GE%d*@IjgXi~5nb#|Af(w2=ys zRZ$0|a)y_Bh->@?@8^s5#Vt&@`6pym6TGyiFeKG^QHQL( zF1fYZE{_@I;|v3oks;uiy}|qg;n+9A`5vnKvmikJW&PN8mh0C)>OLl_u*8>dQg@U1 zzocF}B`YuRh3EM^d>s>&Nu=kKr?9nhv|(f`Va<{)%}iKsDZ)M*j0Z^E#F|s)S}+v~ z#r2+mLV!8`FmcmizIaR&kI2FqQ6^@1MMIbMX4Xvf0oAB1*RcpqRJs`8R6CAsVi`*( z;9^SD$AzAv11^-(>cA;2I*io8aM8gmP_h%bt$G^)S7i7UpX1sWFa#`H<1oz^&ZDrA zv^QZJ&Os<-YwCsgA;}*qu^}=(jC<-<0uSWPbg!Ey+j(V^3Mhn4+ZBsX?zE5 z+C_8VQlIlD-fH#tyS;Ehiqb#C^GlL5w%(ks&xmR}vE!J&j&*!BoI>alIfv!Am}3or zr4|$d+>`7jNr41bA;8rd5|@q6mPn?FJuRyMY#DZDRb7{7u!*M|vCYr%`I8rigRHcMLS^J+kwy0XR+VY!h&1RC zdc@$I^5tsX(2e@d07*i&Ew!FFeON)j6QM0W^R{26K=| zij+huQNhxT!&P{R@Ns)rH{nn00SS@Lz6?I zbSl1T5YAr3n&64RJ>JdIccXr!{Ntkd3}5`VKRG6<(I>JJSOPrBEF8qB@!he4v7LBWOXHbX+onABugroQZ)d_bt%Gue^_be^L$b3 ztLt$mL@@qa_sAxa?5F80Vw0jOLL}2ntO1tFYN;Q6zRb(|xT@MX0=ugQWpw6FNmwq2 zMQK7+0HQV;lW!aHkDhdge_J@}VJ7NfLvf zh{M8ys6r3=({o{$-=cIIxjtB3M}pjA{z4H2|5t3g&;$eGEo{v}URa*>@sVy~hE-UQ z{#ud*Sf5wErvxln^Wq2@;R8 zl=)l1vze2?D6&g2@cE5#<$Xc^aev`&(cv!Y?4nIK7%kVb=6+oyGU4D#DW7wF3^Wi+ zni$}~b+=PEP|}X+umR7N zBqsQvuX~gK;2zmPQ#Y`dTg*B_9fA@AW4k)C7-x4Q;;BXt|NKHIgg% z1fQ=uEDLYOJz@BYe%xN0bG;E!$w_w$OTW|XeVx(OsP*KfH+F*LH*B9Gx_t_w>pgra z(4q>WkH&jw9AmR8>Vu-RDE&BM-6RHQ3LHROd3od;7&mm9aQJB|-GAfjgWv>`#&90} zt9SgMC~P1}2*Tk`ymN8kL{MhMOenR3W;57QNdAJosf)zF6HFZ9r6h)(pSqf6-(qw( z$P)6(gJ{MkXWR)s!1I4m-~Y?b<~Xc8MBihsg{9_&jlgxJDV%rF<~7v$4|n(*!305# zR&UkA5@9TblbE?ulGA%xTqQP8do7EH#1`~mu(+UHgf&?wtf!Rj?eZsOZA?@QLMfun z#17d4)InZ&k}s?wv6A$|4t5EiYf@DkMOj#UHO1d%bidB%xYJta$+`uo*@WBS@OS_* z$9Um@J%~)`Wt$a2p{6bGmuABiES)xhZTdWa^V2uXKnuztmp{AZy|u`z}7k^ zp$}Tg_w%I-1l(@O*A*kID1vt4ScDX$UsjxIts)X}M!cZmWsNn9()+3y|ExCx{{+CH z@Cj51e?tiUvvMGfb+g3vto5U|{k&KL7?H-t^=4;HxH25Joex;{lGd1X{oYKWVs;}Uv$mjbNMVOg2=>v7E` zEz3wGqm<05LK%e>Z2o#E+}K8AKNs8lb85qJQ9Ke9wz8&vmJ~XUL9XPVb4Mp+)jBJl zFfhG0m}HpzoV6iKEr+nJ)DFjsLK$uNl0JBf4ibX}(clPA5fhwFNERg9u&paQr(YJ( z@g|b&CGkc_@?Nf0-@v&f5eX$WFjWLrUI_&$MBoY#9>uU(lYCfIW?-3O3Qyffw9<;! z@#aPNi3rs(0BQZC4dGOaRCQf)!qk;@p=63!A+bdEwMP5zRi1l<&!tW>Ae~a}RzFOE z((MgRGRf-_B0}AO9Ca2)7TIOY$|wi1ffGC;cwE$$LKcRztwG9b~+1SQpHBQbwnc^b}G5w83(;cjH4U5l+ zI!6+Y(qln!9My8t4N%0I_9BdEbpoRyvb`YPQ|WN{v>>?sc>U1tIXg($f!k*!J6KE~ zSi}~h%5a#HmvT^)AuLZ|qmk9?VsWAPg7A;XqJtULjWY32ZBQ&Je^iwLq?S~$on`bH zjOn(PG>&(RB?D1_ zK^@fYB#xHVP+BU%)whGTvSfl#fa(yg9g(Gm(pWD||FS)hCJZUJF--pNwSxqcCFyM; z>AS2hi9C1*{vfvN1C>XLT15;ua8(R5fI*?$u8yMC(*)cz+;Cm-F;RuZZAR2skwtd- zaE#^=>A?2-hA<>1L!wkUm&71iPNS!V0O>(dT2d}vrZNanqKh~X4jDR2&8K)xw?~{m zh6Z%fiJdm=gmc|=k5~%v%DL|o4&7ffx4y;c6Pi(tY&BZJ?fA-@H*}ff5kC7ZcdCqe zV?;T!7kPM{CU+3W>`VUGoOJIt*8mn-Pm|5z8T12p^g5%}h7&?p54{mtMj=g_Zl7W) zq^H%yA-=Sr+!VH&iPcY1Nn-elkBjPzti$2~FuILpbag_hAz7}Xb5F^g3(x>2ibCAW z0%bxSBYaqt{>D4Bi#Oj)TdrZv&4hB~6_npX;woQ=O)c@m%l4VBOVpuE}Y zy4LJ~Ee{VE=cWBJuMh@&-A!V>VQCytaf5W&)%;YAnKwY(d_G4t^Pjo<8g+M9 ziCb9f`|J$>Wgh1XkNC4YXeJBKs5QxSKUW#95K&`A7TIMq6Om0Uois8?1{F~o7L|&Q zG|qi&#I;^QgFKCeDc;i_SCjlYqqzlJ1mbTAJG!)}yyW?@1w0D`?oDCyDO_o9uz1d@ zR)b3aE~D!$PCp8#Y!GH#_~3AwsJX^StwE{RnqB|J-1N`h(6@q#=)}8pfD5M&#LQD( zjVjcOlP(IHsr_&;_X}#%|KV&z$XHT^Q9Vhdb2*OI7EOoEpJb271MC1-KR{F60Dv$9 z-wtP1QRzmRJ{s@Su`8`e-I7&3|4NJOM+Rlk$z44w>qBDfOK7y6*xN~VBTLST`T;$| ztVU!7e8CI0s$t#F8|0;Kn;n&9z$N*>50q>rdM-eOEl~{+4GZpb-tbQvYrBmYSNvL| z^?$^#`My6hhg>PuPnv75HJZUqK;TrB{60Pf$Rk6nP+}uxV_PbJM3l#bPU@zS0qDDl zmK9+eeOiMkY9jZB*c=^DBn7o|U}?HSWF(kw|B+&Mt!@)dQ?x$W|w8kTg zY*h`1lOx{<#^*}zO-6GH8N;IN>w%PWKne(rx^b)*YaVlg)V?5pM)Jl(Vw)}>=q|pR z6k&VB17P)|3_}< z&`g~^K!?pl3#oKc+gHlbH6V_#@pXUrd%<)f?686Lw?$`(0Wy$%e96@;GO~kcyi5rz z3vWo4=A{cOvO}wQWOTh0Vytkk0btM@SZ6nO!gMt1A@N_eHy@V8NuihKoUGRshXwjs zf8=Jf18c@3wTY&l;R~j2yP;D;t2W7}>Ie7LaY^I6%xR}4) z==d?SCq`oPvQ88hSgjJ8sq6Wy?Awi=aaDa*Co&+S|JP~v&M|l)im2iEQ08ysKVka>FMkE2AX1e z!d&wKu3_;uYTYc`iYS;9b?`4EqI_JG;GRch37~qGSiL0vD4I9Jxu@@m=_A!bFG=*% z#A{jmb|V8oo`zdxJx#4=E$_9ZD{BXM@j1Tmd2dXhXf!*r$X4CpSZbV1@;vgfn*S4% zoh%bN9eP0ID<~k#R0f5TJv6qCCIJcgQiSahwF~4ed@XnEw1$l`7?It<()mUmnI)j6*2B68e74N%>Wn+j{6$e1vP2<~W+98H3{ZXwq>B36L zVsk5C9vy;f<)-tsWJUI}gEE)RU^zS(%pTzRyUgxR?DVr_7m0V1SVekI1i9m){7HXM zPe6t1#zG_{>vW`&Mad6{qNZg;at)3*>qZ$-P{DA>7EqJHR+cp|AQm>kt2yOXRj`e9 zK;%SpMh8#wn#2l1s}>e-L8_nnSIH)TI}6ga5bhu*z!a?6KWp)m878=m30XZRN}uz* zUvqT65$+0NowD?ORZkKvBjR9so!PmCB){TK1c;x3d|3d{FryxReT$Pi=-g18=%Sig6WFpv_9=+im;#t&z+Y( zyq1JkUBHdV;EeQDWRXR-qH#I)mHe&R^Ih)YYgx;2Q6%`ZV;uJ5E~6>jgPOW?SeBRX z$1@s)VIwzTb3I8WF%wA63HOL7S?6h+0I>29pZTEJ5GR&EVyBV)9kkiBK zxD>efFi}m`sW#O)jsc(W4Sm1ZB?g!n9|}D}P?PL#PZv&oLoPj9ZDdytf7r^vy=A zo~J{2k5~eq;v%t*ghgv&lzIKQEWp-cu_No;6_8KuB$Ji+HZ zEDy@UJ}>`yG?KyQ08MRYO#p5NNIIsqOzDg$VMMrY&^e9usEfolvXt(^Q9LKS5w6*R zccUc(5%|?sn$9VYoUS~DLYeq2EdF6@t3}w;!NM23ktOBll@~`WORTcy;DMJ+A`Z~V zB3lJCqZ=k*mwn5hu=RlCX}c_o&1;NiQ!{^R{gY8yaegS{tiU^g6DY_40`XWVG}un< zZW=?nuL2zsdD#BT%NA!GlSLK$Mg8E1oUIvRz@=_6yKXVs9`_gS@h6`bxeDSG;niru z4e9(9JNZf#R)14Je2vkR#nzxKFDWk-&3>QfBWui}4)QXDqjpF){4k$OyXI@H&ZE4P z7rwEgpwss?)4ge$_*IkXVORRg!wvq;Q5QAAK_lHsIv$Am5kOf+IWCQPzPywi?XN^H=ZfU7hu5iu)(=d94e>$)Bp%~boU-HI2 z?GCpQ8<0&y->aL%`*bad=8!w4Dh*o3tt>+|g)|)#m7?@R$)^Bd4Ll5o(%I{1axADi zVS?vm)~7MvslbuV$odcbSrrP z5J$et?rlewN#jWQW$Dk$`u-sQ6+U)EX!aesj9mC7?3=RWw;FBm&5$flg;Fw+s6u3s zo%=*V==0v_r`+KVVz=l@&g!tE4awbr!`f%Dh=@o81N(P)_$9-P?}>2CAwG^;79mC&?|N@s?# zqBEjCD=Hnt0tE9$qvLzQ^m1h{eEI_ASl6@E=|9AwBHgx=T{xQ4`r=4_xl$d}UQdz^ zHe4B`h;aw))GBnaJ*4aEk#&}2seYsBU9#^($w9P z`meis2W7FFuD>R?n9mo=-@NxbU;OGfZTm`=SdXC0nM+EAnC9F5^jE#{wB~)%f|5yW zg5%KH4pBeO_28V&&tUwdSg4~wAq(8lU1s0oJoj~f9QM48Nh4zsP8glQF6Yc)aHRTZ zd_7KDnp;A1T2ITmbrJnv9ul3zY1b3uaL;-Q)R(-f#Qom518x$tovf*qCXn)LN;X4W zC{!nj{X_D`5m|Z{&F{vyP>PnoaeCYlQ`>z|6hGu_F~f9DPbl+JMk~f1OLcRP9Fvt1Zz(~{I1U)m zIqFR`vw5Wl1RsxnezY1ZB>R zX>>|s*)U`g`R^@1ven3JBB^7cylq1QBZZAWs_p%k_^q1OO8LJX+rE(|9t!3loSK%k zvI^RX9mhryK!ZXIld}`Px(mlhr*zSYR)u$54{iDv**&)gC&Gzw=@43z@{8W+_k$UD zUVs!GG}c37ce1Yc+3TlNZ3fkANZ>FW+`*c67;U~%;C;?lAv(JVRabl~O;eqB0pLX8 zK9{7Y!aP+wcK)-u_I9J=m?$0)h3^DYfX1TAQ)H2y&%KzKjEl;_pzzP`@hma7v+T93 z`6kx79ky5)oS4e*Q>33IuA$9E={?LBEKE#9VWZt?bpCFA_aUBd)Uq4&q44#+VEPWD z;|8NyDbbHp;J(0a3CpA==wo*RNm87;7}maL$#iJ@fn?La>xqvR96v%taZ|)f0RuC_IaD$r_`5C~ThOu(3Wtf4bu6hQZ^Kqe z2HA7biF!)FmmQKaFaP-tmeItedR&X_=6M-X__#`T5N8+5rl|!{W*<*Xi0YuI#G@X- z$RfLt=Ow3h-`-&9F@OGV(cv!Y?4nIK87)_{=6;$+#Hrz0UaQDyG!VyZJxzA8#BVv< zzUYoTAr|t|52Fr1Gg{agPA!D71m}ZvW!yMd>~tv>^4Xx{qPSNsy~plrLpDQlUb$oF zyfT?Mlmt&9gAr1e!5R_+OtYlCisA$#OE(%uwnA7_O3uaBfldAEdnqLVYjl!^km=dk zk+Dhm?Ug;v6hWC6VWtj@%(Gq6y}=~K_`g^iGt_bj+oq)@132StP3r)g-LEOpMdLMJ zBu=Njf|ZrQ<_4M!vl|M$&nT+c7Xbo%CHrWik0cmeP-%Vne|C>)TAHvwr{TXWjYZJ^ zTR+%BEWjV(=s~HfNsR&1=qh_gD@>h6wjPACu5UCucd+KC_}m_zFUkNg9KfSC;tbF< z3n$o-;`{g#3yCz87KLy^IxoQd1a53e`Y2*0jx4f^wnkbdj3VSi!R)>MB%qLWG;tkk zaS$DsRa1`(sTihfNdor!cGk2#(RwggxYwV8;G~SWMDi!ibr2M3?qNg@^Fjdy&1hA6 zBOuzp!Dv}eG|PEais5iR%Q;U?ysY>(mf420cbjW0O6Ek}lX65=j`7l%tSl&3M!sT& z%=i7?-ZgK3>zy$t2H)%R1suH*JACwbrCJ3jL$Bx|rU=Shs^PFF?%%w@NBy~XTD|== z)j{lT5{rjI@JPD4Q%2$aJbyM5xt^Ay@sI?9LM*kYTyP5JMPy%nBs;Owrqe*$wLHq_ zz$r9i`|NvzSk2S?p*pc7l(KdEAz%)^o~DzSl@vb(WK=k7eW%g&O^p6fcT*?{K6FObhg8XqQZkW6_L7`QsP3ZO za!z_*^2SiuK8(X|m9h#B@j?$x>avmwHZyQF&b)HFkz-II6^e&_zKha(gwL%WTO9;u zTWH$Sj)T;~&R_prI*6gzq}EvYZ}yHIMvG8B#dH&E27l!#e?e2+mhTT{;0xSKl*GN% zl>>1kA#Z-e?K`(`34)+eT{2B;AvgDfN1qIQ{|fGsiJ;7i8K8t_Y%L-03;t*tn>M1o zH0CJU#p3I5VqVps=S#A#_ks{vW&h?g=I!-ng1I zuc1yeOEjY-3j2jAIZ>qkv^%_4Gxo(Hq zuB012f|hyRN1~ZpYglTHk-E+5{va>^d2Rn*xfFfkmzI*@eLX#QzW%mUGQs(YN&IrT z^tYe*rzf9&4sgsB&y^QJnHAjOnrSAlyHe1IEQ2S?2R>J_mDn69fuwm>>6#%jD>Y?x z1J|sj$+sCjUk*koCV&RcM>!=!n)7~=Ok*aLEXd%9C^|1R2o1M4BkCnRJ`L+y6;#lM z9e`hr&R>A>Sz`VtW8Ef}R!YKc?+J4E`crkJ`GPG)wo$E|CzT|a?d3}}+!+v!bz-Mo z=bsSlm73(o&l93W7FlGM9x}n7&+^56Jim#i*OSC%n%-!n+OXY5opDh)%!|(lxqE^s zg3%e8P%CAPHvf$@#X@f|C2NzSYM;ybfJ*@=Ho($=v@j+IcpgF{El4DT^)z*h(YB5z z;A&meewWqzbZxFlnBaTkttQfHpKG;D>bs^INx%}-c;VRx`` zjORY)9tjm2G#^GciGk}eL$MVu-2uk{u_onJEY(hI2)D|T56SYPaues8xHJ)7 zPm`h6x8zd&@A~m)L=IevCIb`;kMp@V8{KcQx=m!3P*71kf-)~XB@+a9-1gcxzwve8 zy`_|ZW2&{<7ruJWH}3r|WAxR4VLJuA7;yo|^l5Jhz{CfveoClN;wGczX4cB} z3{>#*)yLq^GcmZJ0I0{j)(EtW1ab(q4&;h=yl-89oo&5H6Hyu+@N+gSGPR*ysV zdZ-Hjo8AOOehrE(O$&(8|8kG*pxN~-S(3rD&>G2Ok34xF&>_#a?BX?jo_x$b>RXq!ucE%kw-kNsR3z)99iD|F%~w zawOZZmcXkj{xn~F*q=Yhi$7;?c*viL^0=2`wq+Ia1%z>>QcWaMaNvCYOJ9HJk;m(9 z-EnO7>gcPEpv;fnV4r`*A1f;VZgb6MnnIxz3sbzvtF992EF=V2VJ(d}5i1n3M0@yB z?BaN6;A%b+S_?*ryz~JKjpG^$X?%ah+B`s0QVD|DXT70^_*{%IauSo3mH$nD@&|aX z8QB~QA8UdFu2d(D0lvWyqDc=R&T&!BNiT81B0cAvgcg17kwtbXhQnMhJLw$~_;NUN zOLP8aLYJiS${$r_`&^B2O6!~iIprc^VCfM=e#6@SSMI?Q(iEEDQs8bAlzp2|9jX@= zr0ZPr&8thM&4nuzrEg#o!|avSSAsDja@~XZZcbMq-}?Jv7$IEQ+m3LHh`G*Bmq!EC^0SS$9T!S zIAkD0{4vMt?aWSN)<+T#1T*c#xy@+5+3G}!dq|E3h5zt|f)jJyKeRgHaFdg&+DKn( zo-2%IMg4(bwvJ>UiNk%4tBN?!XeEFy%4nfbXlrW=f4`sW&A?Pk}r6p32c18>c`YXI>(G|HCw@bJ;LX{?2RtI7#X+=L}(dge%RTD zFmr|bQ{^8ly~xW-T{xrbNh(fkrJ-9;m0Th8O7szoy-K@|A}I6nwR0*M#4&qH7b}|vxG1C^|aYD#DI~OT2NPf&zpKUSOD+yqB5(R&p2$^ z<61lS+;bCv8&b*SmdzV|ztTw30GQadV_QdC>*1q=@tCvf@nsO`>BQ-o&6_r~wlt4T zOwG;B>o+qVGfgvEX^};Ch6$vaiG7RFw#&?Hm+5z)HM$v2mU~IO(I_*ns(@@>Fm@ss zf6P7dWq<50qw9@E*G85CkI~CwKWz-G#qkeUpH33v5($4HFbn&2h>~ti1~lX&$1lc- z2_y}~2DI+CrkXn{igU6aULp#3A}ABts##9Ce_cED*XU3$jn@@t7d?0h*l1q53&_>d z99V3j*-fx}ks_Gx4wgPvKT^fPOICV2-=+uPB9+>-p}%)cmpa*m76g25e)jpj2QCAS zky3h||Asqmef@2(g{R-VaXome!Qqj82M#~8d+*TjXq2IeEV8qJ23?t>+gm-b(B+6wfF&H_OdWm5+z*0!U z>!o|d(m7c$B8#9*WGiW~37d%(?%^P0tbP$_Lu*e;h+}-B`(-dzu;KBHsD0HNpH!75 zyegtCuIugCzS%Tw-}f4Y9{AzW<3kI%#cU?M+HaR(8k+|;e)yMuKAB9IMjU`m5Ck{h zc-<|pxwTwb`qkh3$l%b(m90(^S!6HPz&|W0?+5!_&zYIvT#A|zb{W29ZPOtQ(wwrzW3 z+qP}nw(X5=+qP}n$;Nly?>_%v&YaU--CbSvqy9Y3C*Qea@~p|3&BPUsEOdn=#ergk zom6pfFMqa5C=E@Sdm0HF_)H5R#CocuT}UeV3x2M|7+p$e69%M!j18-5Mlk=UVeXng zc0T-#4&e_MdBCL*2Zh{-f?P4y3t)4iw6kcWC_=A{f!S@;=>|b1Q5{1Q0?l4=*`F~P z3wiJAZ7zTG!*|uTm#;r+&s=6Z4KkFOQmD2M7mt^pQ&0oM`%eX#*ZQ56li@-CEAxJF zu8%OSHl|{$Pr_yP55-!T@71bAz|w5X9DaBh=q>|KIxC(M&(MV@@hWcf5L(^aw_w(w zjk1KE_j(D{n&n(C2}Zgls%K(|9P3ShDnVuW8}+3~kT$MqBRoR`bb};Wj4t^wee9y_ zYVHouyXWOPMuCBB{!(UfO1>`^a8gXD7WLilV(CQiC60r7y+t;7)Gu z$+4wRE1!yDjr^{$cXRXft}ZniOFA1nD+e3azJtUJWv!R8Z{b09c6VFbl+*Rva5C}%E#(jZz3;_1zL8zsb14s;eO|<<)BHuW@K|%DK~~9N zSnS^)I3+?lB%eQU@x^(?zI-i@Q8#C{8T8_MA$xsr5}%3hTM90ek3tfnHs z2w)GX`(l_iP*a4io79z8lmg@25S$MFweIH-H|Q#JsB+~yjDgGP zY3=Pul_Jf?&I+8IAQ>$q8%o<+nKfD*{8V!uJ8BdlJEA^&>v3}U^JM4r2z_^EIjmF`IcsQ z)$#LGU4|aBQ+n}hSsf|Qk03ANB8d_~HLkl~@R9l>ypFaINhDn=f~zlv3W=P+UKdN3 z>K-{87aoavG18}&igC;6wHZ#DQZ@O`vlCn^j2>YJNTJT{8JTTTfc-@p9Aj^#9P?`AILkz3^N?=uUwZ#?Ao`~5<`~z z5%=!L@K8G4HLO=e%;t}PCMhQ;-btPM8k?u(FRnlbe!sNb%)pJn^eF-?otYaSmp!Lj zs?1LTthq>xWoF6JV`njwH+IWe?Mv2e6X$ED%#Mh~38ZR@h~(L15-gzdt}?$8UZ#Ai zGztx%Sn8na1|*OJ)?uZ!GAdh&PgkdD)l|d+=?K&puth8+o3)#Qv(Rkq!&P()AVHxG$eC`z!7)jsFaZA2OgQvusVP zSFx_?TyFVuI)jRLD|n28BQip{wG@8apRponHW^rIgrqU9# zQzs6T_5#4vPR8n~gnQWO!^77o{(^j5hGf~U2uPv{@v>dtKyiilHa4~rs{M#tY%Q>m zn?%~00JX0dJ-9W>WY^F&h`g5aT%1ov`p!`}0y}0!r%FOjiSW~(kC|wqM74|f7fU&- zQ?oC~R{MJo*MBa!s9mAWJLXMN(;1{Y#?Cz0G`!?!GvzS^gZnnX`jQf80IRi0fhj;zK8%J%W+;9GnyWS}gbKA3 z34ddgT>__rxL-Z&jCGgQEZ*Ohc}JiFFI}(Q2XR|vq-Epeq-SW4&>Y(>n`baoD(Rg~ zGfqwdV9%AA_5uv%?(fSD%cr8tmU;f;I!H@vle|U%f)romsTK%yHr4RZfU{m53VC#m zaQAN@Vcoasm?i`^xJg0k`W=Ip%%$I-h+-gnBAS?w4L!NVJ2uZP3Q`oj)0cqBUVtqc z+1{_!#bl@qQ*V*)t`@Uab#4kMOl#k5{EwtH)>Z6klyXLZnB%1y0QNm(^?iQ0N{U0TzMjF~CA~*M&b?D+;}xqKAbkHFO3w%GEe)Cz zAQgse9qiqmwch%f8(U{rn+HG=RS-a6MatfFBM3^aukZM7vvwZbrz3P}(!$5ZrBS1z zDU1R1;Y~Poo|Kc~jAh!H8*B|g@W#}bWTsG^tM>Xg>k5_q>lsHX?N~eQ*f!#cg5i%7UH7e@UTKbAdCg&Oxh@zuDWbKJ{9u&E3`=(h#o1Nu!s z!4s-z<<|v};-8jo6MZ2BWkbeNzU|ds-$B?_o#&}XuUL54TAHFe?%M9^X6^DB`XiuG z03wzu*L8Y)#$K%r+Qkax;A&;y;5l5mY_SpBUdkm5D5?V$V8vD2K7OmQc~!>ZPMst4hZ|@#r1>rA^1j z#AaJnM!@C{FL|c5`!wRV?Xz0nzfYd$(W6-1z5k-M^86$(8bt7SDG*;)TG~jkfCnF- zYMf{U-m8M5+i!)x>A(f7w$8emAy(yL>2Fh zfUR#)1gdSyK06(brJ?%ln9>$%(yyW@O_g|>(p%Q0P7whFM;kQV8?{>(OD5BnJi=&C zY@C~BgfU=<-18ojT21oR*?d|_p-=I^4R}d}k11WTti&XOROB6D^sEcaE|jkI04Z!1 z*M6v(4@BJ+`FHM=tH>&JR@9RDwWPrYK}O4AwhkJaR7uL!M_1cT>rGjE#aezz z4{vv4M@O<0$r}AyX@u~Z*p^CHTPqt2OAFhc9vT+Q(oJ*KXaO)6G|U8amAc zcVmFOqyi#KeAABZ+G^%I=eG}_95$(Ls1+o0oQUdP8w*x-=_>P{IHsz62*&yrF4H476V&}s|0 zx+MZ(o47UWLjGrZ=)c1T&e|<`g7>Y6Ia6z_bhwBHWhxn%2dI9Q6%(^L;JSy7)h!r1 zi(ic_C8=$!Su4G4}FlyUXQf@yt^mZAL*AqVyOh)MN!KBpg};9?L#o&btV)Ce@_1Sh&Re)pXl(dK^{Xmr3z6wVU@O3OVU7Wl zFCnlJYVZ_|9!1y@XcYI7RZ0FXt5_qPE2r>9w)%psloLXX$wuovmf;;UGZUUBV~JhQ z-B_sI)Usp9EKaOt+^B)de2pk(mW>R>TEe=J9>dZvQ8H>&jB==;hvwE65QlE1=@nUd1*Fq@I6kY9A+(sVp|&c2)Gc^GD>Wti|V z_|}(Xn_Qpke$p-!1`kqES4CpPIP(?|BxY?E(y0Q`58b|X`xD3Kw<_2D+RFQoU^E)G z7Y1ZYGs$UxHa7dcs^|Bwo?Jp%Gm@r(dZy394M8h+hyY~#}Y~NdntQ z=+^fkd5mY;3D%SkaUg^?6DrP78a`Z5_stPg<(K!aNH#2sg}I>$BW1;%Nr(-LgRmWw zW(XecywmpXeJP;Xe`3rdnvN`q(?|HQ`W&R9GdrMRxog<8EE_sEIXDT!#+TK04L!d3 z!{RH0rS&KIF8EI^J@U`OhzuJV_u=N!{tpCIl>*?Sc)wK4zf`>q2vildbVYIlr69yw53guZ~XF z>ow2AX0_(#W;_mFV=d}D-27y+gZts(;{JTZRaoC!cE93wN~_Hk`p+w`(^IF{?H>Xo z#ItC?A<-ENVi098D(u)g%S*?8H0C{vN*UMz6z)AusiJj&b;XbU2Jz`BeozLzK(Mhj zpw8KJTf*pb`ja%1K7SV$N2G%;7TkfGaMX4c)vQ*svbYl4q+;C=R1D>au99V9rXD*e zWGFX#Xt<@g%hK_l&2HJe4itCPB?(tKV3)!r14)F}Ffw+cN*Fz2cKj)l^t0CKEV|%T z?n*I~g|3*ht)rrx-sC6u@z_$ikld2dsR`U44t>^Zp%n7f&Uo#*YTQSa--r}tmL>u+E&$*+H%yWd~<+*HBgys?0XcJLQwLh3fo@`Lv> zZl_PPa)FOb(qVvr4s496zp`63kn)`9z9^5Y@6o~AFnL1Q7&i8Gu5At(?}A@mzcg)+ zr>Ldg`fP`>FVlcFty&ILZ9GR*HS{`>(=713+4K?)HJOCIKwow#%mhq+%t0ZLcu)-| zw=8Q&tDJ}Uafe3MCK;+-4 za#TIRZ{Ks+iHSqQ9vTnMt1#B5f&5%WvH%gQDbRM2^BheU7gE=SDI3>O2ZgQ4N27v{ zAb>C;&Pzn?=V6yJB=~iK$x|Q%F=E`{s)>6|9W*#T4{uSEX5h?k@a$jimQT21c_M(g zYjFc+0IlSYmS`73IQ{T`Swi4~ zyXAu!-p5Ep2oT$6@l=svu<+fr-|F}a5-2Bq-}mmGK0B>!bt!JhWyMR8Y8jcQ>4b;G zj#+&R7<>)1l>ulE1y2cdU6B&HoK%shs6(=r;lig!lS6HLIyu)VnzR|>@)MH9ikvCg zIeH8QSO9W_PQEF@LR0i(<9-aE=B^iRUdOsM_KOr@)EXqqUnjP3TZ40kb%ED=Z;?(P z?~3a*>SeJ5D~kc)p%lkxwG!j%{!&YVj#M%g3TFnA2|qPHZdxlXbxZ8&o1%4EmPNrs zMx5I@O(!~i%E)y_S|GUoM~flH7h+Gq7aZQ5RpfI{#?r0W+zJjVJrG#~y zzQpAmZo*Lm%wk)se6&tU-0aDRRB{480o8quPKEm^R;M+22i^_i5qtFmCY{kaCZDj*m;UtNI%a18S zB&cA=w(5|$!ZnSH81HhXPK+yK@~{44(v$zLOx6AqsU*iRw1gNoY#F?prwI*L0w|-+ zQa0m~u+=NDxhy;jmNE%XX1O+fcXqgmC%pb0JR07&>ob;i9UpolYV{qn6B;|QH5zPh z7<1DVm#tP36B~sHQZ7)3(=@2*=ofln8rR2slwb5KbP5{($uF24;UPFP7!itOF z7$zFy%XGA6-b~Q5L{e2WY;GKxfyt7jIy`yB#s*&U%h&fLq)WO(z}{{IZ1sFK=)hBg z{)t!r)kBfOFKa|;zH4|tT8vi4AO^2rGTn<;UyM#UCwoFnL)6w0YAO`lf3dBipRA%^ z^2$H;6;@$&UChY4Z?gW{F93YB=`b+*hiFU*Gzn**i`4 z7nT6Wiabmbsp5Bwil`A%q}&I57*k+u4KoR)oCC{Kb&l|Et;2L(q=&ZDVz2Pi+s9I% z<0VwTq-8JyQ3*bYGchBzAJ1pZ*rQ6=X<_-30vQAKX3bWhdVp)3Dg#Gx1?}2R@jY-s zdwrNkd#Es#GUc!IE!pf=b?m+SkD#|aTAoY-(I>Q;cd;U6Zal5k)hyZ4K!0XYGBPvC z;syiZOYVj-BCfC;TD$T?MUAhdjc=~08ahMx2}7L-C2JOcub!j0-fi7U6~GG4PZJxU zD=|~X2@PJ3MFlF5&Puqyn!!tDo!lO2l2Gz00_e|@RraU`b;yHxD(7|L?HB(?8Ray4!Ru4g_qMDiKQs3w1=f4^S0ZG5IR&V zfd!SNM}>Dhv-9v#r%1SvaGPYy-IBwODxsFK>rQvoa5 zE(r*cT_F$X(vv|2#D*vOm?m|pOC8b<;h`RDXt?Ps9F$d_EFh4Nym>p= z8(+n)ZUf_E5xQ@#02j;i>WPyjMT_M0CIH5-BEvO61X#~Gkx(?kOYnZh+fU?Mg_wrh zHZ{Q3i-J|Jn_tiimBczOn(;OAXR3`p!l^%AF1Jk;^NW*m(?eSV%m&KQzeS1zL0o-j zZ>i@cl-$yB&x!;Wt)kiZSpd>!R29e#oYYpRB%>zBzN4Vy34jl%xu~0FMn3*L%?!!ws-jX~sA5S9KXM zH_UBJOIGGiOwxF$wnP|1E%$Im7lk?oFtaA^@p{kbg7mvT_b4sg$o|iSZ7>F04^VNWJrp8Vum!lc z5_LW`O$R#u6t(;SbGl_M?*vx6(5#2#{BemNaM5rJ2Xw5W7MRmaw6QwC)#gos#O(>B zBMzD>`WbJte+XptTV&-@F_2`Tgz+CrHp&1SZ3`?3C1q+6IaBmwEd>wAoM9x41&0l5 z($`?RO}dt1QpBEmvq(w>nhMGkoBWDi!n_Vlvt$WZ zWc7M3Elt2QX`GM@p-u)JmoisT0^6a zBP|Q#K6W0K`QYhaUH0-c?PpWEn12py=M@}`yo-=ThfiZaW;RVOf#0(XKzb>dZwR2B@WcDLHA?7Y7r2BXw@|TjXeX@TO)V?J5)I zTVu|3bK##p+f4~ZPTQ|d4edxIw1^q1*?Wq*mcRc1=H4J=|J$z{Y??sNlW$hg)!3Qy zm33mkO*zI?xfF1S!umb(j|9je!Cde}D~2^I+SJD;I2Xz>?=cMc-~!KGcqOSwC_Ua6 z-Nko%y(6HgGo6)q>%WbbpEkaqV|^I5sR>KI@p!(Ei9OXob}viQ7dzhXUcRr8+AWt+ zfQ65pwVmDcaVpSO(PFu|gctxRP^V<|L!_z1r+u?ju>Sso_67MXiH41b6oZ%9{eq~z zng!P|R$o4~@k%$clQ;9MqAVW6p zZ(HA8EF=a=UaT2DINX{F0%6$pf#C|WVpzBlxvS+5o>k$wrKxs|j6I*a@31u{V+1Di zR^i>ns|arVVUvhX0OhCTFPs;q>}D?qfFyEeR)b^(IG*oQJ$c>?x|I01J2zVO2>@PL zo5(Cy(n-m&oLM$S9%*2J)%7)tHV!X{zc&`JP*tc5(=%KH+Z*e)`vA#5G0?D~S{2Sz zRk6OS5xiFuIw&UtXpd=g6a=}yX(9G1M9y_28)^5L@yEly-dtELr064>;ZUsRjwrqp z)?#1PeL9C1ZV24?QP7H@UoCRjjzT)@yHGdxn*jWrG&-Sh8~{1^TYleZV~Pp(t4={7 zV0cv5d`bLl2qx?6XWa{)L89S8`l%ya+-@SPrsk!`tHa9_BMcWo^fxA`9MXmkp{l7H zUqBPnt;O+fjr)SHpkR1PJTPQ@e6Tv&kUls9Omtpu#!E{_hjd!4WFF?pj@M3m!Zwe} zb%{X*rfJ)cnvzluCg5{mp7ERgn)PeaJK}&T(9-CUC0Rf@0vOqTS4YHHj3lJ}3;y)6 zI>JbHs=tKc&H8JY6i{zBDxq+HSa^dtRcVPq%$aT4Q=cTZrr(U?7|_il z(A~KvJ0~_Xk0eM>6{!G=1$-rFyiWZpW2hZ-L!~X(<*VQhJ!tZ8-alL=mzW1P;SasZ z8|wz*alTrHlLi``Sky;peo-4!gmD#m!R?IjMyMY)WWJtwVIU}V=#S*R#so#J|a z@t-~#mY2!f>Atih)H#?`y7t>g2|e1D;Wi%8AtA$$QCPx$%bahg)yO(iP7q$Izu+M6 z+O$7=hUx+-Mu%()4j<=P2&r!Xe7|c>xL@vzzBi9@0Z#4{vzH@~DjXOouaPs;L{^G4 z^B~|W(?}Ln+7pQ<@f~=lQE_D0|wQXk59!6(BsBE zH+dtf#tbtq2@np+-1dWx_v=JB=A|Ot=!-1*qZZ$J=<6mafx1xgAA-i8!|(RP z4oB5xA9>uV?g}neUSG}S8wXFIBeDe8a^K=JuWl}JSlCizg=f9N2#$q`L}*ypWI`fC z@Y&HN@R`dEzV|{_BIx_y|IoU*?>RW$ZVikAq5St`=fCRpuM*Q_HmN>bcb=1W-r;Vl z4>gRXWR^9T`e~X(m9LHZIgS)LF0@^%pvDNKYz;NYPi!PVx&YElBgvdhh2q!KfOwgz#8c}S=&>1hS&qkxZE~1T|Vac zVL~AHf+W|WWA#p-<-_M@53jYccv^9=%68u%PsycwLk5yI#RF~cZHDpHE{Iti`LkY2EWSeV z)dcD^iwj$nH%;=sT&R>d<-+86Q#%#ui4P z^Pw<)Vj>DMWiC$OmW}MGRZc&jCEj;tW_OizIoN~j{CYnUjVwY=>hWVmd9)c2C6k*! zX;l3~*EUKuFk*Ac9va}=tpQr<@0uNdJP&=08ozc=S_$r2*Lt;Vtt}uXK^~*E@9`{M z%sGhIt>*dm&(s;dk#c}UWshZY2)Pu{s0bR0sG)?7*fl{6v{={7H4#v3&NYkNf^8lu z|MruxMGpo@yoDm@v8O2qD_zQg8tEk}Rc?|_C}v$rRV!-S zk!8qmKc3rnRT0b5-_|YxWsm?e1Sl}%=xxc1EjovH3D|qT`OV|JGEwT7HdZYilXm77 z0TUJq@!hg{g~XBLE7sO*m2C^myZ~oEHG)gy5z#*zyhl&7JMtthh^B-4d@*HMH&4+_ zmML0WLIL*#4!*ptmL-_Div>qcB&22~l%bG9d$@8%403lte*@c06U7PO=!Vnunwd)i znd;%}|2@>0>2#N}S>Ys!iJiS_jY&m~+^IxmYr1I0fqr}bcy{xUrr)Z|t~9!EPV5iX zRmli)lcac7@N_o*Kiau*5#cvx=LV_$=g!ClG;RyR_NhR}YW%3_7zl>`MXww_UEgbJ zM^6qtko$T{?gI$j=PnWdrw!vIr<4ozn{W(QH#gg>VlL1_%5 zj-s!^IpBqlKM1jwP?L?sHq=EjL}oC7F3!5kag`0a7Nr=k-+!@%H05*3&b6Mn>TE#Lz_!#D1jALR7@rJDPlqclA|59rf?76pXX!qch;Fb zASt-JB?c)sEQ!c?sy+`ppo_m$q!fD9DOoR|UOdw;jmd14BHxTU`%j(+c=!MTl4tv9 zERufdVRMnmk02!z+@+>>UpxCOC1nCig&)H9^K(xN$Uv)%D}%Zu@fH5gl{AQVP2S)N91M+8l1aDd>stz(LuA6lZ_zBFNoa=PE`S9{cb=y_?*3b(wj~ z)w;Pf0)Gm>3a5==*5t_8kmj&OZd7D{&fGx*gNfSd z6ybr&Vdw>%Wmk1J?-m9I1`amiVEF#f=LD|w1{YdfxFVg%}ICQud7t9&x(;3B~%IjKs~#RhYUYX!3LG} z*GcLHe=w^~lB)>861H-O%F_Y*G5TJ!GjTl>L!7!~;epy;__pVbQ?i1|eC71H^mqZ! zW*ysP2%fh139iUidPeRD1b)>N281a)+bk8fG!5^%IlD`RmxiNBn)EP!< z&tecu`Tqfgqw#ToasK9&-XYPkI{+tH2IX`SpKw+IGt~@*l9j>I5c^vsNibd(@tsuH zB68GzG3xMDUKmyQ;$cB^rU#Dz#Y!XD8il~123T;5Dn=g)RkFrhzLZgRHh6gJ^LGYsaqiBdM#{mm_} z0jdQV(KU;{gdOqQHo`oWs-R^F( z$IQ1cN-!HGfge&hvzNcs1~dF%W-Hviq)d8bgka@bK^_!a-NK7w`dN-kjo*6g8zhWl zwRs;7xO3O29-`YNv6(r$7EEwS*P%W-U5FaBQ2L*!_nbKSO9Hj2Kz&*_Z5*jk-oh9| z&r#ZCw=fEL%w8vJk!;}#$wRZwFmIkq6(+qfn@BEL%<6)1Z3o3 zxr=OQcEyzLF^pVrb5xoyrJCaP_|krx{+GkhcCD-0CBkX7&Vl4m)D?x)RjY|F0$=tt zvQwN$QnxW1(a9zk%9>oY^>lv39>X!dW&D4?m$A#fp%m z!YGUp@`QYyGUQDx0Xc_jFa^OgkWHd8mR+^PjH^}G)}}&(if*KcY+4b7kg@`xA{yPc zzOwn*#G!vPj}8>ze~*^`43X-iV4s+}MEH-Shanr8nOs`)wWP$k^^q%^NVD5pPE+(F zw2K`1GS)lIp)_Mu!-$so+2rJq$dtRpdIGL6HUee&*R50)Phmw~_=t__Nr{e&Jhn$k zkb4wDQQO*3gWbytx;qlRr3@H+@S+~9nNqZ#OAb7^82B?A6LGS^$me|W;+LVNSh>et zmu+;#yN>MZYljdYO=$SI_n*?Eg+DA>{!bxQhnTjZSg->4$;H1c?bVGP}8Y2b!0$U$}~^1HLZ%M;_XOFby)<<3Wb$1Lt>#X7_5@!AO4a zM>dRB&qZMm)i>gbo0=_*pL#uK3|vYFQI%?0y7crV{+-LG-Giq+CE&5JV}MasLSqLT zIPXFs$}xFVoz zb1gNmW$jq8f18fM5kZYzf|d_ImyfoR&V;v& zmF9T(r9b;Fyeu=;aVlVK`J|4Dr#e;LzD2ydnma7pwDxSR-^on5ds`?{x4$eE7u5pk zEm)VkggW<#6?cHO?N4!2{Or$^Tz9kj8D!wbSo?i_{rE@kLthd&{C0G%80U={S(QxQ ze}HFNIP~6O8$!UqoPyyMyn7$A*F$!dl|M3a@{bHqMI1S}2b9@LHjro@DFnk4&F=5Q zWwHb{plspNgbDwnU_x*#!;G(jB>tk9W1cU^KQ8jLA);>mn<>3=6ANOR#Jx%DQH$q< zxg9djK2%t8RaFA@%BC&{RskG5ECIdHEG8IXY-%Bjui}4RXXnpQSQc03QV&Cf8yZxO z4t&9m+*w}x_ntnO-0UY-Io4T;#-$fThBmN^kY~cakoBTY)TN`5lJQkiI3QL7_LlCO zhY-;=XPe?Gy8Rk?pTo7?#b*x3_zN0~gdBfGRgq~Sw|d$I7$@se*J4PtJB_w@)1ilw zAvYRbp5SV^UG3CAkM4f!t;whx4eUqhRWL5!MMxqWL=FB|fY|=V8Q{g0?ON8F#Z>#N zdkMQk+mV+THR=LJJ}zeB;c*BCV=PKx^p3h`1jBwvJ)sJrSgA8i{`?ulF^ zh4Fo58iLD>pOuOzyZ*{)_3{Vz^dJ)zCa19@r1ndj<$1*XOtuyLaDgr1L;WxElw!v6 z?-*EwxU+}fDU(P6-XP$>iW?ta^YGxrNpnX>nF_eI4vFEk=ukUrgw4+Ubl;9&eOg^E zmmVWDDoo%U($GXlbw5bC-(G&f_0U5ge)NLzplFTRXLPN%gZmopCuI;iCuBI}n#zBl z*_ZQ^M{tL0o@szU1=`G3T}S?qE+|K1S4-cW1(a5#Smwv;4JTO-jr~pN`q>@VDOEN!Dlc!Fyo8PJ z^;QN}YI9ayz2o(hPUT8RUsY59h9Ne}sWOkZE}yE9$5aw`)%$ZFpN(yJE|94U;y1E1 zgxzc%pgY?vj<7MBIHn1>N>AZ53!h2+t6=FR&- zzU7;XO9oyeZtRIy`5>uuTeG9sW@5xBOYarXZoq;s(ogXI7UkD7A3mG8G`JSCfq zk9Tyv7_3yB5aG65F%kt{7KXnjNdQ%j4xn&xAX3tI&_5pO=$fb$(viQGAp zo~5NG>RBB4sqQ7fojNV>+rdr_a#miupERFks4FxR5jPo zS1$^47_o&}7+`MDjI%pLXr<7#t58JQ+3O`d{qD!NKx~geca8kiov)8MF~rTjy#MI9xs8aOIWCJ+aX<`*Lt zsQ4(c5j0L`!zeQ*Tt~q(K|ePm`Fe7QUN|8ll><)cJlgatc-^5jiDE z1`*tkiYyWbBS{>KERnoq=oQo-N;ObTD^8D(i_FZUvYv5#Z%qgV$~8w$>neO|z-M2w z;EblDC3RnawHF*hA<3aWgvHohG6-E53Ny`&tAQu-sW}}0*2x}sr7qAv8L?KMS25#& zmte?B0mnm0ZCA^)Hr-Xt-3t+*uA#Ltz0FflxDC_~VM1VO=g<7MXsW2WOW{~@l=bJj z&qre#iq%P>uk$t9)`v4&Kbb>qsisG~OnS>k;TCOpv#W;K@jSUkmCz9~==L9RZP4f7 zNP=%JPQm$Nh2(gvdVhA2H%O)*a;`3NG1JugfTIshMCUd?^J9^(s0zGT@o!;vqv_#@ z0Ka5v)Z(T?h?zG_Kb0x#J+vLf&53mA?T*OQ$_9ZOJYQ@OJ%j^X4Z{Wq7M$3Qe))U*YS>o@^o8*PJJr7pd2WO&GFxOpV- z4&!8YW7^4Nf^;R{)N0d1#%flhsdQJvM{UXSQ3ht#{tx?D4G57i75Qh;+5q{cm6 zOTxx*6hhQKra>X6tFGqAx{v%X?sm~44Aj@Q?bmqSBcW53%Q`CDC8>YI*a|KTo|Xn_ zdH-SbT@=k1TCM7#4QY`!cQgN-q8Ysiut*cs&K(0b+EqV)=UeTS!Q8v7!cLMjK>^ z6hhLx+8>_acJ7y94k9V&`jjFN^+82!jg<&&UU3MytmWb}rc=YMk>sIY7#&6^tW9xb zzlZlO$2A3yi041WzUF^fMr@8K{8yn>#`vGXgPDDg@GToScMj+{_=VO^w%39(zmkQf z*lwRV`;dGs^g_?%lE+XkbJu3M_wEcd$`lCFUY4YO3`?0DsE}kgo85_F7IHKc4I)=; z~U3MMPP~69CpOZ_n$mK1Pyp~%9b%`50&6qUoziqRPKKHcJXp}az zHXZWJrIi;$oQ@eYb?`6g@JPgfKNkOW<;K~m@le=*_BHQe7?u0q->CY5XS*Ri!oE7@ zOztlF5zu;rChT{HFUjl>w)pGsyU2st*-4}YFbN>6@=p?f+LoR=aJ*JN|9Z!IJwumJ zEdjHHr)RnV!f*p@&okkswVEqkrff|^i`*a}@J!+AQx-Al3#~XEFpkVQY=*iFTCKJX zVCr&tU-oPlJ09Q7BlmvP@O5C`o+-Yta=5iAXbLG=xxX;B+Y3+#Em3dpfZ9NtWHV~e z3)E#7i;mn8G{>4~8)a6RDqq59hLQA{=I+uxxJBI<HHasZ6h3S^HxuWp)qr!As~Rjk*4+mk;+u2FCoXe@hQE%KT42GS3h0>roFv zmgmV;BPu}vDV)6 z*11DT*xKpgizQ`1iyh&Rd;kf&P;o2e?E-;5w$Y!^CT%PTKuTgglXAI6?1NK4aab!% zjyoTrX_6i_%}Vl^G5bo@*-TNqep!uHm^+#u&FkV+D4lqZKI6?=lH^N*jQ_RpKRDEHUQ5C0lSO$zvtkbe83L-Gy z2>vwjC4p`xNE;!^|Mj8y+QzxkH=SuLinkqRL2=QKblDNQ_B^uR);inHzlF+!5HBU# z=UkDj{Ws_yI7~kUDUOvYI3QyPY`^rwCY^>d66ROG=H#x{+rL`ATDy)`y0h48_jM!~H2$4Q=wH|5Ql=D|Bt|5{PciC^<9Gk8@WS*OD?FRz9S=8vHoz zv$us&3FGZka((_6E^Mzxd|9GIaCYA)p zjlU_gMGwDT|A!yf- z6$2?i26cVxvLF|6Q3{hn0KgulR-Pu1IXn|mT(q(zBV9}od^Z!%*gHE*f@Xd@*DKnfPOqFX*7!~BU_8RyEbapB$^ z=Z+R?gYDh$%wh_}&MENLY<_oVlFES!rj;LXM%_zY;^xXSo^si~#laIg$gRxsFr0hJ z8NL6TkoBG3`c1dZQ>bOs0S5%V*E^59LmNpsqD=GqCo>x}M03;KOZS8Cs>-La)wY#l zFW!Jgg23|3UbQuqppBmUCqsY0=<_#at!-%{;nz_FeOTj&0{3Ey9uxnJN{)5-* zR8GX<;kn>`p-tMuh9(rLoN|A@_mbV3U5E(ksw8;!X32vfizYn| zWaCc);T%^w{#P3U=7_*HZt7hdN(f%SyM!IzL9OSqcH!oES!cxIa0$Cb=@=y;1_^#4 zt3Re3pS(Xqh#Cc|{Er|3Bpqp_>~+$KkVQ<76F+{M;G7bG@q?}5IxF`zV=8F9Xpxx7 zbz5c!JqBON|Iu`f(Uon@Hny$Pv2EKnJGMHuZQE9doup%R(y?vZHs87Te((G~V~@4h zt~IM_)?8JiY?s}UoqNCn564Vk43_8k-<|RDzaxsF=vEZ%R=XOTH!+aPyTQ!2`V$D+MblKY;2WKeiC{w-<%ZNRylD+?t?t|w=eyPrj@ zMQ+M8?Va;W7t(aC!lHQC?uc95F#Px#)Z*f21>Q8KLIWF?se?5ZV-}IT0HvLno#etD zQYXU)-O7-vM`}V`PRhYv1BvvDjZ<@Q`?DJK1D2~6xe=o*9|N{(3cO5m$j-sH-JiVT z>4l;p<0FSdAN7nQnIz6@oAOVg$pE^W=%2Z8rde(Fj*DL!XVgA!+{vgR7e~20d7BRv zx*lvg9xC*C>P^%ea#VRHNSBmWde8qL7+tDoZKGQNpL5R^?rJ|gL<*VG((M!e7FX3- zIZ%Htj(rF9_ddSW#^B_^NtF|x`*2dIaYAi%gR0!cCY{Q>0%V$>jU7=w$06Nyn5v1v zXNp%HQ1DY>5oR-0z^R==|vcC-gg{-Xd-Cmtb#MS;3In(P%VR6WEa_k#`2rL4Olb68W8FFR5FkFY$&Zc6?<0CSbv8!Fspw+``>RBX~)Q2;Bq7-S#7*} zIX_xFq`8;ba~IN(qjA;uv)ZK=h}QV?w|PgDUb(*E5n&VMsKiQda8;ceM3t@5!n=9! zGcvh8&+ARG>diA3>7fB4Y2J<3DDXJnt{Ln)b-_Z@fiOprM?P*;FsODBLbF7q<3|k` zjhPMQTAfa}#GfKX*U?!FMB|QSlSh-HwI&8P$G9dR_Fkmq+1jst3qIWW0_4f6e(y5< z4^^BcIHmU;(d;T>?n(_$$7V3Xa%2IGj#zOw6ygI%fA2smRNHs|hWf4I!1G$}cAcan za8bv%fuK&VHu5#;W59^X@^lWJdbH4i9j!N;%+ru-C1>peQPyno}}@fs~pmH0cheQ-+WQ_P{9k3Gnn}9&yy4KY5Gd z%HTrmHE9ENrxHvi3t-+!9m8N14osP(JWvs+LTSZ4}z2y&t^pJ?nI&Twg%z zCxT|3AB?ztk0xzcCki9yqZM|5IosKU%7avDeTb-C+;LJIKyksoL8DMKQR_Q$k;g5( zhRd5@)XAM`60L;DTHnQJ!4)-Pv7q~bH$pq>$|ZHG^J!^}^TksnJM7`W7A9sK%L95;O@N`QzNpQ(PhzF+Nr1}cJ3O7h##oZ zd^W*gOd(9hO#jVmqKmX7Ro%}(DJV3TGh3EM+Rjn+{c>S69WADN1h9GfxVzP3;C&wG z;8r8WDeO8U7As~3pc4V%oK7T@%vtIHSF9LdUSQHOHnnDHm2v(t(8;BXu-vbuP^!D<_Z8lpTi7!oR5M zcaiPZw{`Jli+3?9^6zgz^#0L#mugoh`r>Ie9(vUDRqF6MX3ZmAd%}+>F<#pe`EGB1 zNrA#gezdv3#Rgt;R&D{Nw9aJ3d->m+3-_{S;cR+3F8V1f&CPo*QZx3aQoBc9`sHbe zNs9;&#`x+@5@WZKk>--t_}@$VlXpdDN0sm6?(aYCzJnjWVwqC)6VZar$OtQ}!j=X!ot&?j=lE2}JKuHe?Rg}sSdR#0~MSx(&V ze~CJPFhv9l4kk*%Y0AdukUrN%J^Y#Ke_DB_`s2Cai5p=4WAr$kJMI(&Z;A1Jv)`G% zXi%M$j7AdBL1*@FyaIo~I>!PFr9+ zN6#CMWCVR51QyHc3g*NLEapeZRj}SHKtB+6(bqXcbKdY7sh#{vr}VaROQwpV<26 zcs;&BTSPUqw4UW9+)1h*pzZt-Od~R^CpB1`v&=tcnl&X+_^A^avb(Bt6mcw&^~&u2 z0kC_juW*q{y@IFoaWXoW-itG_iUrog;K8?IWlvBoS(Bl1YFHEuDaSa41m05kk#O)m z7OPQF1=CQ-t*1ns_2=Fj{%pwn1exx=q{BD+**UIF(c-Z?Ho4%_;B;+6_eN6P>lZys7iT4r!zfH9-g6UtSl_`kh-drbB!Q5go%*7X z-Jr@*^BsC&RzEp5{Gw=DQT49mpqk7rot}HA(Z3A=m=^E!sbGCtk@+RPnwwqra z70^>Y?PCJfMpIUzhwP=3A=baC;uz6ThtY2++@HVAI14d+(>NG95V?bD?FJTELrYn< zCa2_vTuc<2B7)s5wT>|SCf9DaK7!fN$oGnnJI7igZqwAugx)LtvZPq|NsPpy%hj4d zZ&}a+0&9fyl3|$+=z%HZVMXy?X=!@Y<^>61IO5fa<*DNLp&@m7ye6cVu$=GnpI_PC z@`+L>i~jN#ul1`-wdeZOkqj#K=u>%%sniRjEZD|a#wGm)JxzJA&uvL++hd8YO~{`e z*`p}wx9)F4i`VxYd6J{ID&^h@rDM!B(!n?mQ93PL2YbpN!M!KqXl8Xch((T&s&pyL z<+x8wP!AAoQR9$9gWvQ`%g9DE(0rM5@D?88o<+7HCsZs{I7MpM!QrekN_ULE!92yE zTWB?ILAx2dAM>aI3hNSio|(BL6)LO| zNeJG##^L6@L+4u3%5NI|8LMA%59bV$8=G@0|JzyNKW`qC51-3|?V2w45he3GXJ{W> z{2%4p>wGumuFe{-Yq@<;X}C)daAGuha+*#3Fcw7^2XmF(Al=AbFCQBzElTD2<g2Ma_(Np-JO4E4<(^@ng5Vc=5&#I`hJTt>Ap>;S~hllRR7FMZ{2Jdezsp_uZ03p_KEx zzB?g$vVT-xhd%2Kd1my$s*R}k;XESA zhhZ1E>asQI|3U@$7O~b|SfIDxl<4c~?_vb$Q?eva;}ltes0SNrw5*!Y5C!J%mNr0t#gE<5l`)B75E*%7D4D{OedN=XhTVzLf>3e3MQ z_5iI@oZe@H>RrO~opykD8YxNh0@q-4%XN#W>+fQcL6im~uPqWUQ(?)2E?*tqU9eM| zb2GbBBhdcy-+QvL6El$RhJ`ODC+lQ%HpNe^f-nD3Xe>Y6>+fSmiMetN942g3no1v z^HXGzlRbU5(z*1mrq&?~NcR~F@L1%OE>(E?Swth_u7c$S4L(MV)a@7}!^Duc?Iyxm zF1e&u5_xR)5MZRtnj<@z4%9&XYWFDWRArghta|^=Uat7IH@*UN-c`SzdC}LPA)GL} z2ZSk52M=A##vXF2<&MjcW%|7$NLrSUxMaRb*-DHjQleHe?HdYtc^jX7 zYtcN@$UkPaK|)E*L2>__*{){J>?*R@Nxj8ew*V7lw|~388`{^kTyRGraZ8|u6axjrN{grj41z_g>ln@w7oz@b>6#2z(i z!;=5_F6E|_=73WkQOfc!z2qYaX1|ypUzV2;ZSNA!r0Y7@uah@fPllE##3`xns|<~* zOd=plKV96wz^5r3!TFNT+eO;$m583P9bA1N*|md|bAs1__gSKgQ5H8MmuoMX6!KMG z4cnVx_ebW%LXH{&ge{Zz^_BIO=@&TdgQo`>3_j)@fLt^vkcBF1PWGe!-pQ z)bi7(Ut(-rjPaJ84!ImuUWk7$hF!?X$=2>F(I<^8I)e%8~jVBbhFt+^e6{GkZ>!A5( zpD#i1m$16^2@|TKzW+MDA5|8A$ruhEQswPKQ{% zJoaG$d!XFdVD6L)v#G60>Xby2V%T2p z_?ekBLMeU-^>Iz$C<^h!{VG+c=rs3f_xQ<7y$Fo+^=4C}9q z>RTK9r9r*G`Rp#&XJ$#$3-p;~Wo=K#^b?Y*j((bJIX9-O*rAnV(#3)Y zXXlkIXj@`dxE~bmGHuesaXnI@lD2D6*v(26LA zu0$9dW*@?`PHM|P_IOwF^O)oH*LDTN_ujgHeI#Q*1SSf9AzoHrE8CrY&ZmmC3?Grc zVj#RlRIbK?KZ1lGPdzT7BJ&e6Ys&_9UcM@Q!8OaKbJd!B3`H8eHZS+rjmP7L+wJsTwW?SK5It!F``Tgg1sJT z4S?sevInA^Br}BMXW?3PsL=TGNRQCtzwxZ+nC5>3NzV}ZCa;i;CR~%$kqTAYU$SG% z_3;!gumNx47BiNWTIcOH5tC4fe%MN~J{+_g0EBcXSzT(CQ;AACS{h#Vs7Fl*%^ zk(1{VnNp1;9uxTlQ$*e`?nNoF{C6DiQRC0gonajV& z4|@`5+IYGNLy{LGl1Ab2V3bcAxIX~ z)^n9ub|C+SGED2xTMm7%BD&q)ZE2UFrT8LKVpZ_mx%Wj;!UWd*uz~p4F0Dd1g;=^+ z97J!?DA1GEgm_KL8DCt$tyvyHkyx^NU_uN#{MdhlS z6p*7V^+_bM)o3BGjq^6mL}&_)<$Yh;LhV)LJ3Lsdx1ZXV(yP3hmPY;RhKI?amGb> z>NH(T)Po|pru(w0({SlEDtf7@X~gg4hWCxV`%Gi=(prn4CV2zwOkNuW`l?XwHIbDbG3=5Dx>ZhyD)a?xS@`$d197} zI%|$k1JR?Kfk-meS6_@R)>)rhL(1T|4#8Kz&F@KWxE1?--7`F*pZ2HGw`0z=<9Ibn zZr+y29DFO1Q6mJS{~q_x4$+{I<2N5Oh>fX|U7pOAKrWB#(-NFxBmk! ztwv?W!X$$$>E^;bB7SXXQEZjDI(LycM`eOR2dE$w=?eB@7QdkXkMG0=RHFEjalNUj z>Hk#$iWG9O8{{w|?%FI(@bV!ML=>C}nLy*J!TBGG*ZU!h}cZyyoQdDTR z`_|oiF_$Qh4w-qP;f;xAaUi1qqg~ynMpTx4+ln~!A*mZLz`?c8Df}ty(sKNQ>i)wU z9r3l$^3&v#d)+xHN|X0PFnc*>s&gCw(pUm%w!rhVGQFlysFM&6UO0o;=)Se`-R>ju zN0Cw}3OI57-GdFtPg9F(OX2QYCAOzh2Ry}XCPmVn*0mE~uB@s+Hg>0wD^_Y0(juNJ zJa$06**p`-!cekA5PHiJS5X=b8C_C;s{PVf*9BjBr1=evI-m&u2CMH!PIS(R%45Cs zJoNjV_-V~iCQ=@k36^M$(m%BYl}v0v#!uNG%K1Lj309eHUw?%b5@VUxAyfWlkT$;j z8$|9N_!T5#PYSw_X+~TOZ8a_6SZe^FMV#z7iP13$E|HIEFVsRLbVZe8y-{{3vqXJ(x61 z8T6IRA*id-`AlRaw_~aoP5c_^h9sb@Xv)NX6v{;!Owehec12@1ny1RpR~V`-neOYJHe@!(YhxBc0)At=IB=|wp=+AcB#`*<5csFg zwaD*dRxGs!Z_vF23=Nu@fB zoh88dxFt|rIeI0f445s~AcvJ75x1IlhDp998txzH8w5r@Tgqp2j=NKUvHxKeJg?oj zL`2!(E3O0rG_a;F+Q3$tg-c-@@`g1im&UVV#^5<@=3nqx3Ml#&?oN1KxRYsccS=f-$-jFyzmtEChA z*kEb%`!71~C5B81w%>_G|Dx$G1%S5^-%1&C>YglUnLxxpUF*qcNCfI%qC3JT%U0 zgCOVpRP=OMD@R#Ij(z!|GY#iTKNa;6*QSvq z5QY2FLf$_W?z-uaZPmUlmnD&Su+$QQBIRm(bn^^rl(&tlN*{(Ehd^AW*8WjJ)qm3c z$o$9kMl33d>JrIU`+5#Ly0tpuaBxR?6P1y>X1@+WdIa6cXe0&&xy^ixs+&>L*6j#0 z10Dapf;jC)US`VgCs6ift1)QYG^5{%o7g0%KJ+9eZc6FivEg}$aIGdDnhzIGpqbj7 zcxI+*go!_ry^Eb}vNL2_iU9iQnoDy`hw1GJ&Hm8ARUcN|p3`k?L;^;2V%ham+gMT^ zx0s^CI3F>A5Ps?d9rwZvIGOy$-`p-1Hj0O2j2(?zlR(IJbm+Rv+~h#%(m46Ydp5m| zrm17FWspyg|1J3ENe#(V07ad$G#M3sYV3o)ejvf&$PczBZBKzQf=-mjobUgXO-<@Y z9jIs%x5u1#LXLK4kY*qz3;XN`DKoepFx3Mnor=IV$@)Cg1#9xMA?Rakuaa9eWN zL^4&KPAt{jG#S3tKTGj=epeht9!2X|O@d&pK_gf%`e_zTD?zaSQG}YNZ|Cn6S^F?E zPgrViqwJ}~@F9L?Y8XuOS=2i=6TuV596QIzj3rZU@jn&*Gp5oKfVXMw{A-u^{n zuys-k`TA|f#0wrx0Co@qNRrTY+qT$}jv)~x7P*j~d9dkf(aye!9|a+iOslqY*Pg~# z4Yb}b?PlY%mVG~F*SLt9f3f6BB08tv^oq~wUbmO4_9aD-CZcpb*!Y}Lt+YNV{%_5k zv;v7|Ji9~b;dU6>47Xz8COf;W*4A_QJ6VjqhCmh)cMk_Fgokw-JEO6agPNp0n8MDv z9S0L)JEgWCfM3h$jGZ!|U^hEIT;ZiIsk!)Sy;px|8@om%H5bh4W8ox;><;-bzKbS? z2w)Joez|`Cf*tx!RFh%eWSAliLWn2 zwyA@PFea_P$;Q36Q|toGQ&QXu8=jhf;xlIAc z@RN6Nozq*BCtUXyu9pb??wh`~*TSLpv$rxdgArgHG4in&g>HRtHVgj^&w$BGfV@gk zLiUQ1vP0V#zzHe;Q~e_@yY{?nkWdFG4|gZ%%~;s|SEXQbV=IJ~+*Yr_6*EnK-Gd>2 zal->z#Blf#)AHi~DmjY6(X>h%#fbjV($-l7- zj1&6W2^aId00}#y2SylNZf?|~l+_Wk)#{AD&R0Pzkb5h)h9U9YRks?zOHFGl#drSpIe)HOs#Bv@nd2;L`LC0$*J5WH?JhJoz2C=k8@AgwN9lD@cKD(NssROLGd;kx%x zldO(r7BM_<*la~2fS1#?;Ty>T$SX$5(#=~+6x*V2_g`OQ8de<~AXF1?!TK#&^&Oao zjm_LEt1Gbh`5tM{tr0ATH!$)dPYfOO`R*PgG@1 zEItEOl_x8}X%LJ)FI7f3%GP%l|1u_8)lfODLQjnEs{Z7creV@l`)t`B4AJL-lf?}~H^q|e;FORqErrt)}lKdv@r;r@Jxp`g^b7WIf#35Vyz?>Za1 zuKkhVu5xJMrsFR);qajCDrRR9b{{!^wY$FS`i;vF{ zcDjuL-F;}-QS9IGy4z1q?!@uhF*Fu($RQR{*(B4zDu(B^q&mPV9Q|pybKxY$nci4# z3Al^1=wx z?7VGDqUfHdmsp|scg?1_=_uXAZHG8&pWHa|deuY9AodPWGU%>$A&Iik*o)3w z_c`}zL~zruFFFl36PgOfWTwzm*691t}8|e(d>Rl04$k!XPy@&G? z6y#41LE9X(()<}4-2t+D=8W!M-8gynXvJV@V#tl-S0#@gblk<2Qh9O1w;X9pVLJ)Q zm5U%NlZ#qBjXHmlGsnyfKBCfr;>N_z649a~3v-$U8tg{}<9~A2m;w0!*$jMW=lqJ! zn+aCXle3v~?7lnLQP%rRD;IEM=~ybXgqG`FzZulbP~ucGUGxZ{Jftf0_P}={am{;& z!3~Rududnki&jh_C-y`?Oj;^M+hcF37%X4_pq-`2ycyZYxvax2m*y8$J zuD$-$66?yG(ULNXWVKHza`x1pYAUtTZM(~ntlwfU5^DyU<)X37W{TP(X+eTO@Pvv3 z?e1S+FRp4WM!2uoh3F7fia?@LCe!u$&%!&p!o4Ry-u;eRB3==xl?&0lr3+)ILMlj~ zxmWBeeiI^9x5x&}50Qazm~n)ygUlkPhVY|Mle+27E0{e|4|!( zC2)X@kddhW(pGt|HZRlXY6S5?sn>G+Aoac=vh^MyG*FR=nFdED=sLPKD($iQ>9r46 zT;ct=uG_d!hGkY=T}?NtwV|xnv5qd}u%WDP|9W>%#Eqi~B<|FmDq~p`Z&IEPA-sTh9nWc3Vb7EooL8*lNsC!FGUnB6ycTU;afiAk3au@%*RWCPL-{!g`2zNgG0 z8)PRqGUf_h%KnEd*xe5o<+E($|Nm+q{n|%#_8)WS&}L%DNwdBsw;(?W2FXJ@_4(vD zLY9wmVZqcSBim*C1@k_IiM+9`f&jikv`vRq1{pRv-7T)Xeh zK}xYpT}Xub9}6P@cw05a+iTB&MdOisM%0cjAbNPP66ly>f;_Axkf z*U-gK{DnktT5390o`i`g&APn*!xQE#7&^fUYwm3`faRCFr|*+Wh1eJVua`AWsV`E} z5Q-LHVPndd4aR3PI*B-h|6^S6{q5^IR;Md*>fpS^)XdCGdGPdu9D3Jp(6wlPZem>~SwM>RX}j0xylas2J~$s-J8be>EKAup0Qcb8^J{;h(rvH;vwe_}Lwfm< z>GwtjP$hYMbgCz=wZlvZ@}EDC8H*Z;hbM0}s{2881cJui9GJs1RD!Z4)}P7syV|&u zd$A$EnVB#+fo{u^yvum)WK_r(8bTdBZtoiD4x)6@*npBOotwq|rq}~;3C3(lMG@~e z3u|af%aeaZ`9E^B(!|VI2z)F*-T<;b*hXQf4S;IruV+Dj|6+}~6cg5g{|;G~KV%(j z^-97BXMd@nG{Zj8N-VrAO$r4QI*vknxEw3&|#hdmWRwelVjb#EST$;RF2{l>RK zj5q0e!#ISsB%svbKK!PwG737e_~((h^1={q$Ypx&iGgFeTtc*rLgZo^0D;XO&6mEh?ecK53FYQV>@4bjrJuzQ5E3F4BDOLR!z^N5l#6KKSP}SR&fA3bA82(D z0mnJVztzKtXO|qmbf-ZjvEnGSi96d*JE-h7=kdpotO-(LW%+KT(WKwDl?i(E)Es9xy zR$r>^nOD2*af`R9SPtVys-rDTm#WWC8&r-HT2I~Ww5=PdSi*rxA?6j6;YW_0mSZbl z6`y-{NLC;Uh(v>yy7A*#ev8c+KIIhKxhGGxs$q%)hczwQbuL;^57ORu81nc? zv7Nk41GxoHQBEy80jlfgEG9kkszB%ONk@4j)AW!gS4}4;N|`meU0hoyJEb|`_qqAjU=GoRQ6#wGE*kl{>f6YW%DNq;E zoo3Nt1IYYH;w4slCBo;$z&1#3vJup-GzBYxs*9fqtdxoRvoBFoQBk?uJbLfge82l= z^K@3P6(Yrf*p0Yqv=v&sjAiGq=`j_clW4WEsL3)4rRb@xX(9E$PwU?hr0A z^XcL)KQJcM#iob&V#dmN2qBKdJHWZx#BVaRB6C~sm3d~jlnE?-cF{u+)`x(6vJJRb81yehvdW)rpf%ZH-PL z*q51G1GT(tBl|0)ilIb0y&-+~q94)_9}x}HnM7-MML-MuMYCvJ*|eb$Vn1x1@_mij zS_@MD5Z!dc*k?_O{RDJBV2lV`_P~ny(>oAc2(7er?+M(yX2^;DBsf(1#Bz&jdU5ZbzRibM_5-zulntg zh?eGSKrbzpA0=0Cgh-U%?NmOifK3E?Q9r_wuZ?sTk1l+nTx0BYe+p5t{cZbThPf$X zvMapDVlxMx`u`#VDoY)UyR>mKHEeN7u!U`H&?M}ESN}PmS7IF_xSGleO`1aqL=wuh zzLaWZV<@P#LQZHM1l!E+5;SUW8$}A#(+sT_9UjJj@c|d;$%~=Vj*&m0x_G_Z$WTI# zKUvIPh0G8$9~z_BCJ2bZ`BhZtGe6&4YHK{GIz)b|7QCqFenj8T3L-upVDggcpl)N> zx&hMR>mG`0(nv5RdfMT&YY5*+(5(?EF@u7P;nJ*JDw!A0Et#VQ<19>N+h690V6@ z&Wzha6Z&020#@jU3C>KbQ!aLQb|T*O!Jx(^H|D-`E3At|q>yS^p_ada(Z_7WEJvth zlI*7!5F;%1$D9}d`lr#DKDK{oWEsD~kNsZjDg)$(2>_NrgkD^%aQj-xCd>g=@q=nP z6#kHi;x9Kp<@a2DUqNr#{~6CK2(MM`sr6LI_ehcF7_ASnW;aG^8msr!3jM5Arpklbi2$H^Y6R3=px|H$=i*D1wBs`x?->2coHLKH?g~O*2&tk%i^NNljjd*Yb^s%3A4w2{dS<=UXOZO5?{Z9D5 z+KhUdOv<*BZ-m;dmUAS*z-IZ%GuNXk(Q1+fMadGz=o}G=H?)sUfN(2K@}7^0^6zYx z7o;9t&RXnc<(0bDIcVvX9FSd3j}LF3rdpu(GC7-LpMzi-7+m}lT_|S0&UAnM(Tu;d zUb_z<3myg^29^0V;_E2e6~MJrSxLBIP-)FZgd?XNu8Dg7ZM%~#68WYz_m!#}jFhFE zrsg8U7GKm$;>JGVfwC1U`zA#VJ*>TH7m)HW32A>wpFlV2pwXhH;#HlQXFw{Qs3j0w=nFI4J!7;?R3-bom^y zbxd305PRob*=<7hnP6j2U6+KC?b6EmDCwlx<6gO>$^%7&rufCFLITlu;!50_i9scV zPs2}|g=fr$&_^Dt&=4jqj zWx1L2*qwD8b-Iis5+Q<*0ZcMfD07<1s=wF&a9EH$s7!+qj%dbbnw^;Op}fHi+sK3e zMi&c@ecShUkrj#1Il4>|LMGg@TSUfzI0k1JpsywNY~Jq<&_BfzV=zz-LvOt(Mjv6Y4&&cETEbuxvLcf<-=)@SC*!GlmIY*E2J=0SQIGD zIvI5ODeUwZWBHj5oS;D_A{{H7U$zGHpnIaXe+{e=JjykFGd7AIl2T?}b5BlSmmKHV zxP6ZQ?1;L96Fpw6yzutCeHHL-)lthN>9Nkm)C1=k#d?YQ6UOZ^$z0_A1EaX+?V;mppt`T^6eB&tx$M6mZ9l(S9ZsJpbGwjnBCsf|zM%DI>mRj~3p zh^ap0nX)PGS08@|zrb&(Tn6HoU4-mqx7?hGL(aH5+!btYnRD5bL$<4DPUrC_sN%r4 zI*JX_KRaJ^FFC*V7!?)e>FTO;dHr|R*WcGeqoZZVx*FfEVl9UMGr-gZbr&XB8UJj3 zfx)w<-CmL+Z$~3uBnl-ZF@04rc9i_o8mM8Yz!Usb>Ndd3S7gUs`oaDePWLB&_qp({ zXbcD$2qwyhLi2OB(-PNXK_I?BOb)|#OMP&XM5r!9i?g}T!z(8!I+bW26OX^&CqGQO z^sedEWoGzg4=2p+o=I^y(s}G&$&4*M1O3O}Mn?XJ`zPkX$1-4s159zu9`xrBLOs;Q zw+^GZh4Ll(mAN#0KzR42dx&^sX~v5uAX930krRobdWjxBpVmLNrZn=T7;P3;l%!Ql zSjqfD5abLEz{pK`>Q<#0Y2P^XYmT_HOxz~qELJE+rAn=v2H*RN&VKQJ=>1D-*p;TB zP=r>h(FKxx1K{T65!5YZ```2@hx$xzD*qQ{Rr`Ul&DnPVz&EinKlQ%a2ltkQCPFhZ z?~f-I$e|qJOzBdg$wIf2ZP!3`y)x~qtGL1=Xm1$XR6%4QuC+HisXFi?aXNG3qS*E( z%$;4EbQmy$3JU7@<^M)UN2jN!pX4HI5r>>_b>I_|g%qTW>t$HPq(u)9rDtdNRFvrH z{r|q8n`gCnQ7A>&UHb2fzVjJ8C9fE`l{Xg?1b7f&4oXiaW?Gd8WTY^wDD^!1wO3j} zZCnx%`u>?~JOVah{NPPSUvrmJyv)ixB_0@XEB`)zbak9gT1tQq*le;1hr%mWE1&z= z5PWXwzPi|8SEa!;@H$w|jhp``^Ze(#xZ+(?$VKLfRFOpG2YWFNHE7L~yj@{>!Az9)!`Lt<}Y8S@_^@Xq}2_8(lGxiR-FZppC&UVTQ=8DkB4x zD{n##{d;7W!Gs~j{I|-$;4BL%b-Jcj@8EqC~%^NcvfsG!#lfSB`*xP)4ysU#zRHw??mHC|?`F_#U z0|OW!HK_gJ0u#*pDVDDCt?g{v|3=YIUUYsSbPW5Dk-n}bkKes;?xY)a$BCiq{WR<=c8oILa)1ilf3*-Wg_dJp=ClKR_^~6$LW$NMXZ5NSGQ*A~>YtrN$g(KsS6Eo{G5D z*xoA?ATVv*D@BR^^3`VS_t0UmQlVqN?Mo3BO zO-LvFE4r~)ju|ChB35y6ccXp~Z+<{YOYk2Dz&qvzWKuUR2#PUGOs(G@PkvtHlxI_c z3m4C1_5A*GoO`8-0_=Bn3Fm`MB1W9c&%0#F!9KdaDTGT^Si(YUzVY`*f~s~x6B65c z89p{zWT@W`{p$f`m{jtzEB*g=fRKrKkb-gudX)4J+fW?Wkz*1a13e>s4Uc>G16s)O zpFBN0-4K+BSk}T z0~G)NYyvAwsibp!{};}&F&oLNwzExAcX`E&6cPb%zwQ;g184W<;9?c)R+W_|XDIYo z7L};UOy{FIjg+=7XJkfmD{k<(B5HLsDi{c5GLG?n>L+V~xL;P&u$xF`1x&&mUg#C$ z{)?d||N5ZO(+?q5qOk^h!3X!P_r)!)n2S~JF8is=(u0MyDRfTixa1C`OG4br3_nPr ziM$RMDxF2C(P!jC?(v=tCVC{kE4zgmb$5!o22WxmxAeitJf z1WsxX{PY+Qrrs3?nf7Hd6lO$r6qzxWfAdq|XToL!cNQ-2zqdhTKAN0j4TtRZA5x}} ze!N;KohqGyBzAipU$Nsr*#o6-_c>0zjr5f>fIndV|B}hanREadOO^ zaiN3Z*QTQ1uIg)ew8P{2y3Nq0$3fGceGXq&XM0)8%>2Wn5xFiUL!^q-4}EDuvYk5U0!c^zO8-)~#G;c8|=sCbMj{>IAA03tj;;YKyiJ(fpt6 z7nu8MXb67a&54hXojlJtcTco!!n2s1d{}2a_JRW)F#fC!_7-NO(RQeJUz!B>M*du_ z^J$x_>GAZ^V4bL{%ja@EwC$QH34sXQ`d-@}DgBG(z?3gpzt$kaCoOi6Y9NV9h4i;$ z^q>Z=Tni;_j}LcVgoB8K$b%!q0a=-pVXx^$x9g?(-z|c_fbZGBLt7LBJYrKxyIh-% zHf3sb#xYETl$-y&b>+)p7@O_r@$Km9fNVPZF2>!9aeV;u3AarvRQlUh*IQsQvbB=- zcLM>x+j-hLfcM4n$er`u1`}O+6er6Brh9x54PZP;CWbprY1$Rqy=7Q02v_D#`>b1o z57jyX6^RmnrwemiCttFbbm*&onMt(!s3$*bO6t!+!4G;alKc-F56nUGQA@4d47c*~ zWF=7h6mkW!&2g7$9>rD1zCOYYRycTAnCpL-ds!R5HIHr!)hkh9-J*~bpiQus8t)tl ze9q**J)6A#!N$hg^0*uSdP)`4`@Xfj+m8mLXl`PawnsMjdte#vFEPhYY0iR}fZR9y z+zFJiiPE~=LSsyLqqxA(wMi~QR(7jBmZ^*gqPlv(lRIUKE|9F6ghF2jO z!O>vdU-nnPj$`w5#rr_hqHsLHGU^uk>2B zXZOD^d)x^km{O?2+gh8xKHVz)c+8h&tTc~CwPJnIzc!jdREC14}7G5i2gX_O22Y@mpAn)HChQdCoZw9mnARZo2L-;-Z*45JCgv!Q6V zUu!dQI*J1TEmqH-t=Tf5Aiy*U*=)ox26C}eWRd#B(DlxW9L7C-d(;4e624@>^bh+G z49#xW&L}nm?N$g{c9o0~PYT}AL=ElSHUsRFJ6`+`Hstw2k&U6WSzWH1n#@@PWW3D= zzW+y8a56+(=*Np*hzBsU?ejM7CD*kJ4(vW7L0jX-L82vBkZHk!cIA%F&fD9nA*VJ& zQx7VHVlHX6-E{=2pb=X()VO}?5=5CL0t_SZ1H^9_s1cSl{gKj}Wj5oydp{VUnjGI) z9}fSrXJRw0K>#kzB2?!rc-`lM63sDUdBwy@Z&tC>lV>tQkp7Rbw+@N}3i5S>2X_tb z?(V^5a1RcHyK92GySoJ^xVr=!+#P}kcfXU}z3<(9uWoJC{5w^1&YV8ozpuMblVU(2 z#gC_EjAqyO_5be;)FvRLCE;)E+47d9YjU_aXZi8okd~&&toIGdiFIAHAh^qZBl@hBLe{WUEwBr=A;Konnzx(_b~qG@ZaFy(D1Paf}fk zZU_Enn4|OEKiPaGw>)D^ROcoP-U4Eqg5>#9TKM)-s``1ha^!vCZ z(CT1YG8cu4;4A0YH2siWg*`$t1U`V;G$Lh_xa7C~olFe1n$wF>(eq=ZE9J2&*3NZ= z*joZ}j5K9|YF;c|Z>>XHJ}P$M`N+3PRJ&kIGDSK?)(iBw!u}kFctQ$@fwMsx9XF_)Rfv}^*%lO$0_Mi*u9!*QZasL4>rJb408rv zi|~BacV{7Dg-nGD1peHV zkDk3eoVTBDcT;!}5fW4g-mIf;+c}texy?x1!j8#Q=!pH|8eSwyx5cJSQgdP%|F(x( z$p_4^eVzSw;|QgiJ`3DVNeC!|`wHboZ2uJ=I>A1O_gVQGAuSy?UHP%lrMT;QJSv=? zw9bc5>-|)2kHU=@=q;cAwfQLhmELCeKNu(YZtI07Q>VwdjY?T)YD2{R*ws}!xM|A~ zDE%_2x$V<}ZUPu?qCw_ABAG!<#+PN|IU{olN_f@`V8^%|rKOi-G$9=*R{Ta%y+mA* zfMtV2;OS&}WK%>bv2jdG99Ji6sR|4#!0Gyy0V|pQBG}oY_BI$ffrwVH?rXmtfgtBt zFQi(NjM4gqSjU_??Zq8#>?qDQTNYr~Ejl)vn6f}5jlX9yGzQ>gn>|P%4!F+(|6u%? zrVWOv+#Y|l;$(aLgKK79DHZIq@JHn_X1-P_HnA1uR85m4FNu(bVMl4x-!V*-#^DXW zZpVtLiZ+bXnn}5xScla1`)ZNrP;k1pDV$Un)q{UQgDS)YfDQAt2b5t;!n(+)jrFS3 zDfA$m$SsmfCFnC$9?4jS0sM7++Fdkpv-b`mXbNvkE8HOgihVk?j7FDPU}n3rxek~T zDCS3Vnz3rI{O4S9Rj2ubES+5!G#eRtVfxZ=d67p6M7Pz)UONy2HYL+pNZUa9><`nJQU z#^Gcd7%ny*@S8HMcC77E#(_xK@G*4t_nu8pm;6}TA6N%2DYbDs%#gw|Ql`fUw0GS7 zI+yXC)r3%@oamvbjhseY_uT8hjlV?Kw1Wx{dyWOte77T8=zPGJ;ayQd^k~@s5MC2X zg8jD#)6R`2xrx4XlC+OjLsO3w#wrVJkp-E-Z)j`;h#0KtR=FBa7f1;9H=5N!q~d(# zASIMTLxx>gwtXN5Eo6-yD=k2(Ws9`9uMymN1&~g>51QOpV(}!(GtI~wM}9xXvqK9> z7S?A^q}3upPE4_cDW)k)B<}U2I?LuR=3byzNz_M^F9?m5mJiluJE8D-eWhE>J!_84M zb@GA-v>ERsiYn;U_E)%gaNtKc$#IUwBUdODms5^j4V&H_>{NVd3pCru4U3w>?UK~O zQi$1h<=n@{bgC-8UG%N5U^#Ffe3f&FcT{S-5OTbA)`Wg(K)C9Lg zsS2fpw6o02t)sJnlT7B1+t8Q|Aw82!Z&e`)FLW_DEVYyD!$l&Em+p<}5XS!2WQ@78 zWa!Y$3=T^xZHh_OpbUwaljOLElk|-n%hpzAVqwXJw6=rev1lkZ9DNwZLIn1@{*)A6 zO^VvdqK^VlsZHJaR(h{?W(_q&&*fxdLKE#|Uo7QY#isNc#a}rf&W+UI9H{^PwPLU( z6dclm<>aZ8Eae*pXcCqTz@q|UlYr}8fA*m77i)j$*(fLlSuxv?*x}7aI-Zn;+`wD_ zgg?YoqD!xU^Pa^OPw*Cv@6-JHu47ZF*c!U+?wp@wsbg^I=M0ru43-ruG&Nhq@FUE) zdz1QPAQSQ!z7|enP+)M!algP~>YBF7_N}!7q5a`Op=z^3s=C}&ORbu##ujE~Zf7pU zzYS<0RH zQ#sT*XzrjyNbiC+avCvqf)VJQEym8X_}=~=^7S$3Xv)Zl-8Sp+*$An6;Oe*knWhh6 zn}EffdlsG20Pv*&61LXBw>CiPNrLSsV zxf7c&?C2`a5GUHBt9dh3nrr;aqp`{VyHF~!ApcLH^kTu}!#=oKe^|vg1E9_L`g!qkqv8GRSj(s| z(TqKnx&+zn3Mz;h#S=>9%I=a1%0mQULTR1efOyg(gz(BI_qgz z_PrPrIcx_tt-Tz6Z_1J*zp*rtf-KrA)c1*ODM(83X+d26vP0vkTH2;|L!587tBNGY4QCtsu3-Zi^qMB&}%KS zS#16pFQM0jVH{ZBSNwjna35ffQOsCSeCnJ>vtP_HH)}ip{8P)@oYb=`KLNDKr>U8h zIx}A*l*N)TO3KRS+7-!OO8Xe3AQX(HvMI^pAs9E%a-z^xf>eq*I#$aR%0XmjOd4?O z)S9%DzB_^CcBI&7rt;_lA!lcq^^d<~X^o|1*{m!HR^1g#XyN}JUCf0QjhA7(AupF0 zwG3`MR?LSlaID~cyhG0}_;JJxJ+0%m5taLHY_2j&W+%jAEa^{o5yc(V(Q82R6Qn;0 z+OU%()itITJ=8CX&K11Td9aj!)?-)k?II+cI!5e9iK9f5oayv~a;hqmbJ%p#?0Sbq zsEA=<^0;rgqdKOW=PZeg2*&VGfNqq+&z0}s&|h`jfO$B$M*&OgIfIPK(kTrJx_{cU zN;)<;utuP@L-HJBLOFBl+e6cC#B`OaK(?!;BiZjB?gV@J%mJejjh+{;tqvIVA<=-;rclu7P{hz{ic2q(Oh&Hb<=Z&$J=! z)093IOHe+0ZBMH2$K*Er$Cj&n>wo{+ zhzrrYn7p}+pHszY($(3qR97|E+*dNe{=ZtbF(Xji*X6rlgXMR>qK2Mw8qEJk%61bQ zJ=G0@+A0kVlDh{XhdERPiTQ2L1#nl?wqb21z_6r3gy{%=kkYEQ&XrOj3`2&>F(FuI z=Luq+)HNt0-NfyUc@_3F!`30fRTH``S!XP8JToWik%^ z)rP`|jI`sgo0HoOcjgii}C5Rf16#_zH=hQv{9|?u&Y;rdf z&2B4)u66KgPfnmq@;i)DwHh-h@1UDNpVY<@GV$#Hq-V+g{zH2?@47x0rUKGx~J7e$lL=?r2np{k+9 zF13$Rv>g73ZK>8yMr%l*y{nUEbW!_!0a7jl0dUev4ryNZxGpM)9@#mqds9A`jO@C3 z9N2p7T;hbvHEHV**}S%Dq$z@FfDi4NTSj1}N?Ts|C7Bby_ZoJ4x)jjJ0+15RW(_bq zSM7cTw2^F-hGn|~+snShNxb>mrcPI3(4F*jjfPlL3eVdKX~(&TKABQ^Y z8SXL6@xADzlsZIbpna&ZI30LXGiTCC>KHokc4q0Z)bW=NXoB`N7yzFgMqou(LZ%|q z&K1f}jjX2<50IYG4sMg(0p&2(g&1tkEl{ZK=iX$y_2^oEQ49=31r{r84)4w8MP{M$ zoW#`}PT_X8_3~ZJXjnUtSLV4Vvn>=-l8hzx;UU^$;4ab4Xbw$oV!`)skhNap_KiYX zvEio^WClihI<#JgjE`vzx2@VBWucS|d%4&Iee#fP?V0nmE%M4o!9EdgPCn?5aF|Sf z_nuBptNW+y-Js?=qiP(7FUE`P68Y6Thf z>)Zyg=U^7A&uYmsoBe7g)_*8e67wAhhKHH9glz5qJXC_ki_vVaGN*(eE6ZTz+1Pc9 zn6@6f#H(Dp*>JGf8R6HJRJ;uOsVTBROL2FUn8B?>7@_uagi_x{IT$;I2S84aHlrSn znbfJUl+LZgjT^Mu`j+8+vy*8RooJ_sv_6hjM%~CnW1ky0ae}QfBhz_5v=8K@E`SOj z^j7`KtZV)@wh!i#nk@l-#a_MAm@3}@mT7HYh;>Vb4eJ+*^w*S+9V=!=j@c*q$5ig# zz61hqFtUcMf?oGpuDdobkHIK}h{jNVPDl7|+(&|7I4m`BhRar0_zyp|P1Zqh{lK<<`C)n7qhf)^8dE#xIEZ^l$yw#}bM@otVf1+nHu) z2ZWf@J$V#a7%Crvw4}B=I)BdX zY}H8&6Jja#BgyrIRep-p7hHu?dcV^3&Lf*nMW3L#iGbgMv!uxW>?G$D*hVvF(T?LIR3lfxJE1*K&5l#?z%4F4H!+FfC z9YP=T#oO_!`LQl^_Yj?ZF8alas5%MwvA~0Tu9_Sh`iahAl;(^2nuB+w8cczO3akAt zVnhJR(B)kNGu+I(yCyp>W6ng^QD5c8dCi+E8-OP1ZmP!3g1@xUXo++C@1diWb754h zPHoTou7aRR^eQUn+;MADSps%j4?$}hz&73oWNK4WK5k26T#1S>cEm}aI}1H%@Y107)Qit7@{`xnr%+HqQH;**49h{q@- z^r`JGMz_l^gxkx{<;Wg(EWPGo5W4o48yq!HKs2#5ANE6iRRDC=LA+W0mAuVDT#Xn4 zM#EnHkSeUxhxPHcYeOxgPyiXo z;4?7?Y;bir7(Tm=xSn!hNm8P==H?{o4eHl;s|+_PS|$bR;^qdxOQ3J+Y11IEC(Rwt zr+Wx$y&tevCxCV|H75WNU0Bc#Soxyg>!!cJ)gJ2PlpDlkocEcZQn=xX&yyZI5)d63 zywl)%edS1YLixo!q!8(C7F)ZV*41_2^d--rc1ynqJ%|nO)qW`Fu3=|hPjDY3=C9^j zZTAx*1g`K&x#<04oHxlb*fuWP{XDKsKO5U^iLGS2Y zq8SNT59j9VM#bG4`O(n6?2&Q_&BUUivN?^y-)e=_Dd-j%IWKpor*87lj*CUu2kg(zN8bQ8Z)^{0%tk$OEf5EMoeA4J^6k<$GhUtol!P zk_ot!1Mxv;eu8Hp*bSxXC_VH3V0a^3AGJ^Gc9@OuxJIT)EfJ z3(RjE5lP`$wV(c)eQ1MNv%xtxOtbzjG7>q3u3&I z%a%kogzP@Ry<&cS8Bj<#)e(vAK$Ilh)sC* zO00u9xf#arFtL7~7o4AzrOk`d*C8-tBYY?$#o|iv&D|H55_Tb5akyt>emZO+w1sSz`&$b*_&(H`S4i7q5ElssN13hE(E?H z8f(0;sS#>V)}0iP@Aes0p#Syt5vc*iEKT3eFCBuq_CePu1&NB0+*~=G99fJPa^&Z$ z9@T?y!eaV$aXved0u`o=@v4z)3;~pwS^_Iov2~nQ7HX|{z@3t@u-4OaI(*U1S9SvV z79QpdM;t*)2ZoVPXbQnQP)x|$F?ivJ8Vcp&S~JB9c8W~p&Yl1^Jjg(QikFYHnbDg#x<+? ze2MG4e}M|if_3-TiXH-oJ;Yyv+~b!h!EH5TB=Ju-)aHTFnh3Vg)$Ln)KQ3UYi2{Wr zco-kiR9o1DbNUYk;>g*EV2$IoGOmn5-69ZEnC zkv-x95NWi*6=`7H8MKXb| z8ijTF@zwk6a51G4H3o=8zeV6S)!`2xzwOGK@S~PWOl0pkbL_a(e^a|kL8lJ@&xV!I zk7)L-Xjp!p#aRtRK(c}+RF=^F*R$#+Ru({gJ-j!QaDF|-0;91dlJ#Kz{jjis4_;Si zgD;sbn@$w6XotHjusF2n#lJA`p=o5PkRuUy9fVljVxQpR@n)iMdk zfRO&F-Ys03p9XB28WMXC0kd(C7-k71ut`Js1yh7+`Z9G40C1!^Qr-cJLfjlrYh zzcB9YN#GpH)f9AV5LL=3V0mRubD7sOvKGnG-Y5#-0zf@f2yi4$-&II-dPt1JT-NP* zb}}|V-Q%=a3_`Y&hmw6&aMG z|Kzg#4&?Ou18E+l!=EUl^|dBDQ#y6s2Fi?+yMzM0xU0Wk-MayzG7FnQK^^RFPZJJS z2W;$*dKtJBQ()@@=5^etQgmIApie(M+gu!yULYkU47nrGtyncpn_1KU<)Ky(_g0bY zeE#nY`J>srgyV1y6*B}v(Ta11$t&nP9Qk>?C*}G2hAacR;?I0?kJ7*089~F$=$(mX zA;FXq4p}J;ixh4iGbQpU)v9=>0cq)raFEtXVyJGP?RE13?D#{NDz#fx{}VuFV;DK% z?}`1&Io(z!X_MJ-8y4Ulz6+i44KdXmeCoM%U}e;%a1YII&dpf9YzyWUBpX$*iy#_I zeT`5K2WA-Np~u_?>-e>s_8DTyZy|gfxi;sf zmir^gpPV@OCxc#^i=@IrJiD6LHp6Otv{Za1YZC_Z*;@v#3!9b#f+f?EMen^Q&25k!QG6%b^}bUPN}Np)3o%RsqmweD zVQz|6ea<^(`|f3Dxz@RteIIG0ob1J)BjF>Ky9bQ9`{s9hE>paW;ljP{$vflWXHhZd zRh;3&rBuP08=e(s*NDpPBz4D{Pn0N-N`t=W(eoeJx^{$h(EBKs+8Zs?J%#K(Rmfs8 z!dz?=NvtmPBKOWgsRt4>g)!+DCmp^BJy!key1&5EDNiL0k%A)eX9Gr9RIb8fW{g&W zl~HO{=fw_wJ>%ep0?y4PE0SZ00b_2g_62{=pAAP1lBs@7aRTbk{g5$W#+srt;F)BV zG>e?%PDvC({^vnXKb>#1V`j;ARZKx*EUA+c=i~Hgz1+lc*yHd!oyK9eCVTGug@MZ# zVT+6ooa7!YV>fytx`=r-HGV8BHAI(mY>xAra{!!qdh^eg?Q#DH1iMc=zqf(tS1qd? zxBLp!tGV-k$Py-)4rCNulE#{;#tpkC!c5er7$}3LP@2x|fK>MNjr!#lk6DONh0Kc0 zBh}Ibr*TzcNI6_u4yHdoi_+aP`;?Ld()?90zRS&@Xj1a4z&Z=_{`ydS*p)cf>F`Rm zgcUyTn&{U}_~WXc4uSFihReUKL5j}~fs5=vX-Om?3Y}b+U;2ozCgni#{CcaAD2Fdz z>KG4HCYv$sjm{;aSfAClcq~z=m`jDw(^1=RXh}FtMAc#iX$4Il%R@ZWXZaN{-Xx|q zRK;JBLVYGBQ!_MAk>G{QU{sMIPem^Fm5IMo7(q&=d0m}a_LI25mY{<3FxpPE>Ao)F-v|Ly*?hs)fC{cqnCl43%EdWi){pyrsyPz z*$y>%1TOfH3O3nHtrf*O@0+(kc;?`L{r^CDZ@g^-2swq%A!-<=FZ{z5)oTfme6KC zIFQCV0lK`Fbnc$NSaO){$&cr}+3j&n0zPxZL^LZoE=h>mB=58}3e1%tFX=lv=ve=2 z{yedh{dfJ2K*=GjF{E7#xc}Q<>mZDsH(m@9<-6TP7h2=F&2=B;xJwfMPm)LU9cA@g zB2bq$B|KXcuT~#9hkTjs0tBw_Iby}dpjEO5CX@cq>+$iOI zyB?8agInWTya}!(+-dU^SOSYtHGpY6S_mV9S!ZvDM@y2O$`)l3K$cQj(J|JO&#i)y z2t38I#+h?iboGAsOy%v@U1RbwewH}jbCc7D?WbP|9wEb9RfmeSIbNuGlVQqeQnbQ^ ziz4+in@iJm#kC@yUFxp}e5;s}1Nwv<9BZ|F#gPGawRU&ik{R!`v+DMVjan1EGXIfS zXo85x&L!zZ7UM~epwnEs5aae~+{H_XEn=f4*L^ zij{UC=sLcoxm@$$a!scP=62g|Y~cA?ABDA3Tb&w#!;TGJH3-9LYKHfGtZbBeb}jYo zaJ=yf_n9sN+Mvu6&z>Z6UnGF=JAw2+>KgQeB zQTiHvO?lK7vy~Bc8wWkBCg?!_Vf`FHNBnwUN5>|J(-xK6%$kx5|MW4nnf0!%xoH)6 zxH08CwXr*#`65+MMJce1$2z@vc78RXuH;rObyHGu>~LdT{6r!}p|B)VO>8AcrQz06 zp{J1?vt}f?yj>56wCPVdCraHWIsD^c-}b^Q&1=gih|<|~9MJ1Xyh2OPzB}AjaPtnj zS<8hxx{|mw*QSrk{*$t|e}c&MA!E6VvF%T?-8s>xEf7?l>X^k_Q>~Ge&e!Qu_f9j; zU-zP*SW)K3dC_A~@9qP*-hc;~`(&~vD`I1f)!WE&IN*F(PqzxPgA zR@M;F3&fn7Z_-UsQuVUNiN<7Ac{8A*#dN-$QIGz5NVWK0)IQj^dS6$=s%Sd<*?ZUw zihc}ZpSIg7oiM!9%t7!GHXHgIeD;e^=a_6Xm%4pee}X>L(%`5&&8V*lRo5>@B8EAa zy{@vGT0rAV^GN0ob)s*%(6$&sVUI%e%$l=VI(OmcX<0j?^&a#_G(zvfWZ4fl&t^j7taDR`)W7+p4wAIg2>dvg2k080tZQhXLIEJ3|n%DXoC@YgvBw#1n ziYos+Q1my!Oe5_m)?-mVyROo<^ijmBnN(ww zkEWUB%CD-UslL){PTxx!uiZ3vIjLGN+AY2l8rp^-0wVj9DL4aJtDVE>SX%>2^KxxP zt{-c5#yoH~5|%pJ*4j-6&O8O)AHJs-nWS}y20$)RW5}nkoKddTw!AAuX)gEMODkRT z7`4UfZSyZ>D*lX9<5SIhF2i3f+dFw&ZpsIRwIC-19+WjYAK_0GxQ9DlI$Ah-#7$AL z4mkQVuuQ1`FmM`{q>$!&0x`0mMNngal>nRVmy`i6cv86darGRrvMoKNMYiAt_+U~sqgSNqY--P%+s7{ZZ! zPMq^(xP_872F$o~xLAe$z5Zu!pAMNy|CSJ*he_suL!bmI=NDn=s9t_h3lMKML8D~E zL?Co7eE?~fA(|%6E85lUBf8A9YJY=lHwi6Ovu^!><~80w%G8g z->_aKi?J;w**MqbIjj`Q0rNzt3OH|Xfn$0_YGIt`i7OU|g&lA~Z&2+gMW6NGXY94b zWq~eNgAUHuT#1;?M`UYXylVv#-Hw|-e3sh$I?_SX;L7*>o%?`QmQO7QNCe$C)@)7O zRC{lX@qMlq60IpS6Y_kqbx`vmROEveYLdyrv#;V-ZGXZUFp$wB??eniNIZoo+k5*m zLgtDVLely*@kP}|kw_uwlTL9mmY_m2LClp&NEigHRuko+RfGU)PJUK73ry!&fF4Y< zl>Q>nT}dsI6e!QjKA{kK1aK}Ple@q}Ik$o`(pC8>K31DrjmV=y-LV$~RNWw>JM;au ze}31=mB!dn9Fc=Z?SsKdoD4x&r{VtV;(_Mou+FX)WXfcWr!BW`hUyld#OoNW9Ox7s zng2~W!$uRFwSf;ZOevFR&%+Qk_^}Lqz?viP6~u4@BzXwpbi72H<1*Jj-g0RLut~1j zE*YK^Y;pkZ2S3>^BGV>D0 zIwod?dMy~#WwwH>4^=T>ReL?mCmn1he5#G0VyhqyfnnpUH1&g3pPoW+9U{IVggx9p zox3`Uv($d}6LQ2ovyFdgmgdo06J}}dM#Q3Zgo)=a5XsJ@ZC?AT|J^A^mrdtK8@C`Y zCrJ?@GVxIYv6~WXT?A~L`(&ApczUgcG51Zsx+7;}u>`*_^AtTH zs+~cnGPM8z9ddl|q}VF0e{VEn@}9^Rt=nxH2ET_O;5m``j%K zz8NM9mdaUe?MPUmE4LV=ID}LO+yIpR4ML+5J&S^dp8;IqZ%PF49)^Tl7an;+4JZ=w zr+q<&i1n*d=l?P&pwN5(Y*;z*(9%Ywh)F7!fVuZ_FbH;)+25x>HjS~Pf^E9GZE$(w zoU&=F_yaD-(7%XZ)hd#!QQo37Pa+Sy=gQk@l{bPsGx$yO8`C+RFj_`Vp-NL?4~ZUK^(zF+5HRKo=_CSRe+_ZZdzCdQC7mV;PqR>kK;S` z$eEO6cVw!tCr>@xXc&_!ccflAa)t>J0)o`(r*9ltO4YE*s&i9}>9)fLP^ZW9*@aR$|wV2xL(R+i3rIpGUaxeG%GWW+zWo72dYVA|xpz4|xaqvVG8qq~~ zUGKS0ZL0_PJYN2gj9`du&HOZ^_%t&)U`zc=J%|qb$d$fnj;XmH$uYRhuWmc<(ykw| zYMmAz&12LBSIB+QjDb1^2$ZoMB~Sox?mU^t&_>J@e03fFM3Y`KqogW}$VY7wWv!Um z_$rlgufH#Q?j(slTG!@jFn(>f?o$aZ`HR;;IU}y*$Df@0@!AFX@d9I5@`(m^mL663 z*feIQJp0@QJV_7axg5IV-ARsnP#?EPb=AQ!lgjCpo6TDV1aaN762bPXJOtbW8zk)t z?g~5Fr=l#_w=nP5P{ua0Zy#gqMw*awD2r&ax{SUhwi{B^fxG>&ls7uv&my^dF%#^G zgp99;Ih$9rMQ(JW_r5bZ&mQW>0=RVOYrFY;wRFNe8Dd*K}i zSI}sVNwA-Kx6OuGm%DM;EQ(p*O-16`s{8l>vgx+iU1L^eOuB3tVm| zH|U)>7}Fv9^?uiK0%2X7VDha|jhYbxZ>?u^AwkZgjrE+DQQ!STH->Tf5<7S*8TIR< zSmV1+jgS?yu1X6MC)@m(3YaBCNXt}Ip)w4m+ zc6V-0KGxVM#5pS=#bANjZ4m;!3pSQ+-cod7S#|R{_LuBcbgqQI_{PvY-Cg{hK6u1* zza;Z=Oy1x+j^78ponG3o`xvjvm(1mQkXdqDmfXY3?r%a{2%_zY%mns4sq6WX6-eYH z7R%lI+&D4(IWuxDNk|-)#k(9@o*&%ICM)co59OK+0Wd5YNH)LZ{P*?5rN8R%>kbRm zYn=7Idb*CYZsM;5GC3}{FFn@Ixfia~B}DquUB@P`>%w^rq5Lfdw+bc9;CMMOkuX^8 z)9+i)QZ80z%PK_OXyuCrctCI*<=l61`|rb(gV2{Q@1DJbk7ILejasEgztMa_5EbWFBm;g9kC#zX~1-vv9jP$GabAe zj70ob@ni3AX}Dlr6j32%(VF*wPql~Vj&r>A(m~O5d^SqcgVjWj%|f!H6G|QSHkj zV?#nz$T}ta?IdZp4{N8DKjq+eIW2vG4ReiwocornoRO?mE*4~s6V4x;hq`q5V@m2u(-5HXzo*a@QL%?YSV9^g$2@%gg-|f zJE?i0!XLYCrTz*C!(ZmbpGD?kr5-#oRzk5unH319jYig!i_;yJ-4O6Z+V^f-$w;t+QQqz^dy)2{hqBp8{u>JjZu|j* zUibwN(p+Qug%fx9C#Ql#&)tE@%hFc027^N`ua~=%mEHHfm_3Jmv%NMzg}iV`V2SOWsYdY3 z+wZzj;bP}~889wUYIoxT?wHER&F#6`?&Bp!4joNW5_((u*uSWyNKv`}ng-XFLN1>W z5zH!9n0m-z^>Dsfe5gnvr>Q63)7WJxJOUR6OTFiY^}FBpIb>x!CDCU!twC@l%awRV znL3s~|Lurh*QBJVq|nJwIpZ`77_9}Za_o7;?Bk^$&KgEYQRpIqYQPlWWTCY%xEP9v z7SEG-4pmJI?c&!kDS*y9XdR#n6@YYkrgIUnX=zCES%CF#HSD`h0g>g%x6ni-muww7 zg-O?scY9%`BZ8vJ`RN>A55^I-_Cz@sAy4Qn@DBdUCx6nrKbN>Hv=L^tpsxkyI5I>Dn`w2*LNq17)sS#X$~L7Rt9<)fze08UVzY_jvmi*ixhi^k{qO7j(^JOrv1W&za2GRf zdcnK?#-HH?5SlKTWpF?(wtM>nw`7nwJQdE42}~{K&95Eyv80(k70tt>UqdGe)_W27 z;{Fp9pK_d5W<((tysE6oE3R+;93*(mHbkvUT9txNV#f6HtN$&$)mjt95GNp?r4Ohh z>w`PaqoeziDB?c(=UB1~aW7{Xlhd?MaC)g>$q26br)<8iohuYZv znfR!K;=4>0x^s}jWHDeKdG!gA+LNk`t*IM%pORM>#ZOC;Vt2WMZ`*D3 zkVB!^9ZlC_!EjzBkXpe@p{XY7#O1E<%?_O&V{WJ5$5}=wMPvuqlt~bWIoeETaQ7`s zH_cem)M+P@46Je%R1-}}ceYEg!rw6iE~De!wVZ_{mc}fc*M8Leyi+Zkyh!Y!T? z!TN+rssjnHapRTOnxc};uAEVf){dPWobG(o>a&mQ_?C~XyO~Y01YQp5Ym2#}H8}UV zvHRkDjcz*Sf95-3mVFadVp%WZR9>CED4R$u>^j~D^#Tgh7rSgLNhw)a;8f6mc$T2C z!%YZ=Z?m^g4;v+wq@93i2+su0>MhJWln$hoc5>8+CqIGzg0+l4F6%W4>B`>=cXF;- zegbvXX!g5Qj)j-S`1RsT#c5*N0uauODXz*IQhPly9QMI z;FN}4ezg%EP#E6Uw!qZ)=87ghdgxw{@sK+3NZ_vg@U6J@wY#+(VWk|84Zl?ib7y@b z(#IbNz*1#b|KeBA&d(}J7^G+SG6UL9sr#@TPc3N_Cl}Mwmy8P70>cD7p5Aehg%s7h zZ)Y=MJ?bdqUbzmi%-c0J)h+x)YehZwoQPD8&&N-*CVV+@dtF71=zD|A&b!bW2A1l% zwc>2`5C9E2GyFmwNyNmqkv#l zYf#o*r8QZZ@>g2r{N547YA(~iSJK3SzDLw0O$A&@WLpNcPlHKHZUXvZHMOzCRv6E& zU63cUX+?1DlePBgmW<`m_R(W33vS-Rso#nega<+#HaM@s`TMRm!1_qUb zHX}HkTH&fv&}FyqnR301F>uJ!R=)D{5==^4MUaI(sbQjU^=mspC;lI`!)GBN z8whBRYr3XG;VWd~f0%GRUWf!!q4(ovyj8>P>GVv!o!5M%zeQjpTQFm7zlhKpo0;(l7`;_@PrX*s5 zx+R&)sw{nj$yiOGkbaiv7ZCzCx(>uFIqrDnkE2r;;LpYG?o6K6E!Q^=staJRq8AVu z%05JlGigZM>8qJAeLfTMteg4oFjIT#pT?Zsm4ap-$(s%(UM~F7d}DLujblBFMKML? z7Uorhm%h8qUd0M$LiGN`O3+HAW8^em`<`vjVv`~m)=M~oPY|GSLeea_x&;h-%#mzn zGqvEIoS-`qoyC9+2WM5Gw<52PJB+aa&f}qT=s0~zQaIb8g^=%G|B0siL_ls-SdZt{ zrcg)8p96;E=W&K{CBdipxZEdv)7w>#wA&OI=c*Vi`j1BL&W1FFvhck=yPW5#Qb$~e z_RlohWC57AcPpnEF}b>y(RTadDa6rx8Nt9s>t)>=Cvf_22^*3Q;P9n{<5w1&3dV-O zYPHWIy7Z_(%nPUnf+NUpr@H;RK@tSzsu^W3N8vrvyCNW{bOKJmGJmpB^3?tStG>1p9FoVw2F87Zhi8!V$O7wTDEp$^g z$il>+t6>jKq_hz_%I|tlL$3R2ZbUM6_AjEti0ESp3)KW@^-`Qna_r!6{jt^QrJBd@ z#wLzU3aP9Q&m!CJB7!FGgD+h8*RS@sc_Y0%W>^ssg}9kxtQqNV zPpkR&MwU08{`(*%S|W_O^8q67F*5}lY+EsAyn@?vPe+F-MQLm4RzCZcA?+*;1BF5v z&S>L(35CV$szfWsf?j1Z@#fu-0&kg}a9D-_w?V=E21$f4_x^gvMTVafBfmo^C;qx8 z)~(4(ct&+=T$fsRwgOSJs*RZ)b8LjzMsXDPWxk)}nOo+q7Sa-T;LJZ=Hj}Ap0@N77 za<2$0kP=7)*YVdk_FUj6SP8es5IIuvw6dLMeiK&vTBN4&$^GIBu$`n5x~9u`+Bgxs zEATW1pNn_AN_N31t;HvyN51mkQiZTr0b6Ne9k@R#t--X6V|)-+RyV{d#^2n|FO57CviS$$dQLmUcJU;kdk3M+1jZKV8I^4S{iWL88qV^e^p?h|w)p0t;OTK^Wq}p9d z4c#oDmPVynwV^G+5^ny;pC-D#ffjQUU(9Hl=$i`8obj62uy?bUTGqy~$Z*E4H;2lR zWe3@l;WZ4A-DyfcBj!-loQ8UuO%MoA47z7*-gpF8ERER+%Fw4Enf@fplZES;M|67!e3C!4(p zJ9NWR_87FcS0qJRj*uW%@u{~4HHCAz3EI&m?#IaB3h7xldjjmn=ttQt3>ia)vr(ea zOpws5lR=02OZ7KSKN~b*)hQg9@92+eLWPE8$OI&qx*3Mk%!vsRBCr;Px-WhqmK<;y z>ezf>p7kT$&0EbFDb$O4P7Zbfxw#I({Iu6kViSK_-r+3&ga2)33pJ9#$2 z3_tgb=4a393eytA$K8y_eCv@RWCF7DsT?TlF-kUG&TA^c&yoES+pjIyxnyh)mJ~_Omhd@vtZk!HTsZ ztC-Lp>)qhu4RdpuaOZ2CY;^$?q@@y6xhtvRHDyH!d?TRwk}V%z{%QGfMbiP<9nTQK z7g#81%`R=J?Y1n-IU34t*aeXV=QLe+HHSOBa}j$I0irIw>ozvbHfsigf5L{^QEkO9s50~xu+mE?cuEQGcz41VZyHn{F1@J zFaa*k_$fyjN_xdrqhDfo; zo?rprb-Vt-$p(>;V92G52{RIcjDb5S6}Hym=p=6lN%*h{|xA%A*^f|kq;y$AGA zKS#C}M;iSYT>h+KTvr%xXBNL88;yjo+K{>$&n3D;u#iTz9W%k&?Y> z@cB!=P_IJ{6Q)o%tlFEts`pFzyUbKx7ScGguQS{tGL6}fR_7@wj#Bk17Kd{u%yBx4 zM!bYr_$6nsS8oVC5uWlhKlZ2ONTsx8WsI&{sP^S(XGyYdNm0a4Fwf5l%fxBkU45JW zVBk01>TLAI7#<;>w3V9OWe967TEbq_?XM`_nMah-C`rxia?PA_m}*Zv$%PF`H(|~8 zZj+mtrkdPKe}s}g=?tEEs`5)fOo6}n(bgy->xtoL-WiZ-HCe=th?f~{O3YkaTce0; zgh#9Fuzx(8mK?0)U5zY5{Fzp^49=dm&jW0x0dAZ(DC~erSM^ZNU@^6Eq0dc#lA&&$ z^vhY3tHn2sS3o}8IdjAiDP*YGCof-+!=dITtG;cdyf7MNZejnC5_z<@O0@Hlxi@p- z2NPQ6@Bpj&mAv9C1ib`NmV~zI)zTwBwRqKFI_YZ;b?@XAP`poB5+kqT3)X&Qc#+I} zk~^Nmo&E_&udJ%E-7DnWBZeDNl927Z`iT%5I_5sCa|jH&=ckz>J*t>45BY80O*zf-x3< zO#<1c9Yj&gDI8!P!57P&bD_$ETH|J1eb2sY zpbQ9WA;0;>H}x3I)luK(X13gyPAow9Sb=P~ytp9OgGn!(u(p-8Ipz(<9fmx)DtQ!O zR%mZj&nx&7tu4o1VwrEtrliJd?u*&_-6JnLR8BqlYL(uQ*AU-Aq{JJGI3o5HTDeP6U?pI!bIH!(e99z>5Tn;A731 z<<|*lg^yD(13shiiN4z{r5UfMnHA`Z=ko7{wUae}XOsUzkAvLkmu9n{>AMyJ5BQTJYy??dZ+(6i4;=#eTLIf{^5!FFzED@Wl!wq@Y^%@ z!PgkZ{a26*G5)dfs>n}L7p6=dOETIvT>Jv=-}&2WLsboRQLv@2;UwDU4MG!XjZ|q+ zLat5pOo_@pe~P6Qi|8tD=Pwx^qZN=6{3MHomH<69tLm)`K{9fZoz_HmO(;yYVKbM# zhplJagJGENqcz@;SV*=S!noMz45X*AE@nU>IJws^2dNebaSdFW>QUBY*2M^#;1$$+ z`fU>KkEF>e>_)GgoRS?aZ1NW=G4q-Df(ELLD>ZS$D9!e?8$2yk0;X3nc$aVP86>|yI;HPBF){)Sy-3e>=#GzY zgMReIbf_n~d-#*x73+9~G)UHbw2*-}%&dT?jIP>0L8hc`;?_O-%R;4KP&agx~4_ge}1` zl)p&u`rLjT+LbX1<1rmvy4drX-|L$iiaX(w4)4}%dIOf_@m|W96A?w=hEWZ@CbA2a z3rQt+9=03yFB*xqtHeIu8~y-xL#5-vXSqW8g|s7yn*|-r5(byBw9U|$j-#=ciTSey z7b%KQvXyYqmb1a@SJL0xXXbQM;)KPIoJ2!Gm?XCQ{&Uv`>tQ9iv7}|m+PP=pc4On83 zzoyA|a*(#EI4a&brZ9RYj?Jndvo(UzbiegJ@gc^utZX+ zZy!ezpsbmi)6bhfLIR71Y^yNfA3-0#ED5b$zvL*kI^yf|+J#Y~`U zgkWjr!_Q*lWtHn~t@{_rH`dRDjx1bz^(f`8`cJLXahFxb}%SYA9HfrJCPw!9$q zpI?rRjoanqAuX<+Wb>{}XiL|c{SO~xQ zX-~W}{Ck6`)Tz}BJM*6eTaG4Ryy?LFyWhUZd|gI_Pxgw)nSzIFd@B<|k|}NUrrOk* z(Y$7FC-#7ODdQ$E^GFUkIkMc-=8{*&kDItdgFxnttI1IS%Yk+;{a4WLW$KMdYRa-f zx~$E>_HG+*^IC2+V9ZFCs87=i$a5P@rSwvQQv$LMtkrEx#DC! ztzkdmhgL|8i^0SV~7wH}KT5o~JhWiwJG*LkIWn7uW~%|1Z17%M7Z#A_Fu_MZrQ_y;~1^oW>Xj}^Pv z;k|b5HO_5Trpx7oE>1cUIgkJ0TCX+3+vosIaK?ivG z4Rm%RhgVGAH~)2xjtLzs?POWv0#eH<#W}KzREkf-#<{SX;2~39dGVJ~6meRv403*b zdlb!xJ^bZT;#&sodrhtwl#pLV&Z#cTYqy_Vx$K9~IHHNQB}~uTF0NZH*>I3YiXU8; z#3*#;S*CU9B5)V&OYP<{3B_$NsuCwm_pA+(nMdQXF9vcdtrtTyd zGh}TxLwC5vvP$o3uoJ6klM5kcor|8VX(Reqtnv-Nm&+VQ^o^Gv>{a+yoZ$jF zP-V8+-lhXk zc79goo1Iz}c4=?XKp?hN$icS30 zcpT0A8)-w*SYcqO$D*@>l%$HXplMb)-QXXx;DgCaRXHTu6y)mDIV+v1LU zaqEP#cYiXq>QL`KbU<~v&r3CHUbc@w%* zmoF&g?MCdQE`+87<7qV3BkN=y2C>eSI{>s+_>vmsy>HJ3&wE_cGnq?EZpWLd!`ls6 zCQR{!dNL7L7~`aq#tSS2IR)wDUn=R_d#-!IX0Ob|Ozk!hOYdac(PK7Wisd1$(u3nU7r#o+x%o?khx$EV)GJS>Ed$rjBOJA4&#l^|z z0~_@l15bzZ)|x4YvH5|$N8`F%YA27I=4G)Y>q2B?M;0Z1AjXmMH>VDIojFM-H*H7v zXo~zKSDjA4cWjZ0fPF07M4I+7b`&_djHK#tA$wPKxc-@`GBs z4_*a~wn_C?%i1ON>IF0SC&_K{!c!9MMn5;kcwE(6-(c+TK8HibSSIGPVmS%k6+vOx z4hdvyoyWrK*BH6BDfF+AKbp+*gMBafeeXsIeGl)}Ty*q2V6%G;3yXAE1*xngJ-hrG zW5tn|*xKt$X*bKwZt!YiKXwkm2wJMwA5tJ$hOY1Nf0so#OIe2o!VP7IRTXq|LuM2DFG zvg@5tE2pJ*L9vKMUMB4a_m;OEYSmo&l-&vaK@54al^QKqZqE9&1jrw*1rNCZ4d8@a z1vA7o((v@&bJ?GsgTEr6~q+5OkFX`?yW$e zw(AtSY}bC1q30RJX()g-Ah31siRc!rh;`~?lTk~;t!}L~LSmVuK#L-8&DB$m9K@Ck z7@r&vpd9lwr->)6_n;HEfzn!hFD}iM@@P_(-Kqtr$13lSy2_$hS-PMr z#Y+X?9zyQtMXh=k*tT%Q36|e}D4Kd@o`oViC9H2j+wPIFAi+;T*duZ8fTcFi<5*w*3S5gD}( znIiVbS*>nI?sv24+-4K?OXS7)`LmF9MB&fWFmcbWEaNYjzR;TU+VoWPdb$(4=aigu zTD5{2l}$nv+|r|~ zwi%s2xI>$^3Op+)+cwVX!Tg$<0Tc;205PA7j^ZTteh_qIjV-CEy zUTaa%-FSj3veA`I=zz7(mc#ctAN4H&mWdczs;{*{(Bs{)&s~GIEeWPnsTDkAvdw#1 z30%N!_77lf6(`;FENC+7k+ZUTgYCyL%Oar zlZ)`v1Z^Ze_X+DX{+N<2!Zm1JbezpbjN^VnzVF6jPgE+PmgRX5HsmpVWEu;~ecMM;R&HytYDU;i zxtQ?{vJYd+^Q(e(=e}h4zg$E&+}Rd(7ZL_nVR6x@ih&E{OFjz92(20j)69M4D$3JbfPP@p_k);>4BHk+909a%VYj)_u z^nnCc&ELC|brK5;Nw3zu8I20G>P@qC_{l}$exwhbGx}WrQ5C!SngBs$@e1Ner|k

      9U0e^Xk--3Tm6R+SS0`bR=U=akh`P2 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

      FjhV1iyP$8Dr&hn1$7#&Y9|LMZo3tnCux6w`?m8 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 delta 6294 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 UhVA`(G+?MGsw@0_V~QE{AMX~&>i_@% diff --git a/docs/images/mobile.png b/docs/images/mobile.png index 7aa0539ed9f1fa7c0c43da1c04e0e11a81a12f6b..5a14f91e400dbbba62918fef52e354ee85ad5f15 100644 GIT binary patch literal 398367 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%0APzXEszL)sylFeWBk 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

      Ode2W^`DsQDJD<6L*EZ_zqUhB&2iBw1z<|G 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�G!+pSRo5AZS%P0f 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 BbF=^e literal 5640 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%0DIIpCYd+P-~vkp1{#);ZNNf{NA@Lwm&ViZ+ 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

      >frtetE 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%0DV$b;^dU%PDAWEsR!Xy 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≠U@nQ5)!7(I-Jb;kB@L7RIv zzc@cHs)C{WL~`HPlU+ypsvv*Rg5*%FZ0O7H>#~E-I2!{u!^Ux{`MiDhgiKr@WiT4i z2_OiPy5UWhNJp3Gq>5th$C#KhnSV6+^S%88jG+R6xdbz2=j1_hj5$gPT`z*9Usu^M#y(NMY5?7X&a(hRw(nRXxPN?7{++f z_D2YaQ0A};P2c)jB>A5NWvtl7m3D^J^9T%xUg<;Gv`Ds{uB*Ok(Xo%oin?XMR&BMc z)YKb{n6u-`9TAQ}m=4x9W=Op8qS}gk{L|TE)mnAc-pFko)@$m8>x4GjiUihuo?Lf^ z1rCCE8p;UtZe5Rwgt>|CctfYAD$2Z|U>5>xpcfN9i;{E{kM0U^5UYB*I9pCDiiY>@ zeDIxddi$M6PoBMaarlc*KmFp-qYpp)@b~_^fAyV@zH{&1y`TQ{r$710PY#a`o3=K@ zzBhMvckkT2OK#Bys37xnCHWww;>BW4{?Vq{JPaw(;q1PA{Fwaq!NHAmIQZ~`5ANN$ z^ZDnW{>7jF#h?89Kl$sw`kUYTz2CcGrfM*~fxrW?AjNQF&mZ^!VYC)%l#*#}EpHv#cbiqeY#hJc)gXZ&pYiV93Gq@}9j|Hrc!+ z&`p>rcFA1G07{h@)uA2fjd9UsE$duVE!_Ztml(U!J@$;t(bl>9GcOdWA zZFZiWJUN{&+Tq>Ql!W+fKC25v9t2M!1R||f=DRY+wr&=&$Hb1#8|eaJW+@}|4x5!C zD@h(D%g`|i3OX_>P1EV37j2QsW)umxmvt+8GPfw zcnIH2Wzz!s20V>MBXV!8A+aTxNJn}QMQ_}>+t5+x;;1Yp1G=~g`6LvDDg1JM5rS9A zGh8($Y2u(~wrQ93yl&>6uEAZlH_fOQB1QVJO>Y)! zTJbD9;*^?kjCDmHM>NZ_B}GU@UZYlRXqi0ej8exFYA)KvlJJg^%UR|9)KzuZ&ETu< z?Ldgs;6SI(d6E5(&{ z+CpC`BWptXfxX4-|AS7F*Wn+%{r6QUgSH_;E)@UQNY**D(95ivSJhlqg{HVcW{u88 zS_pqvx~NF3b$PY3;fQ}Ff7(l&*Lq#^T0f=OO2G(co9~OMm720`4z;5qrX7d=K>K#3 zb5A}KT_ZgP7M0QZh2U=B_yfluGk55;bhl)s=XtkO1(!O7o4JX zPcG=r5n>-4Jh-)USMA-p{qawK_IE%2@uM$3r)#mdM~>)VZ*TwZ-MeIJUc7itm*wfR zr!^)poI7{!?Ck8&YD}k7`l@4;Nw@VW(Oeq@_V%5eo}8YYo}ZsTc=OE%58is~%?Gz{ z-&rn;U;N_JhYuhA!$17Pd+)#hz3+dYjxN0d1ctjdXzOw4M@alMhB(tDAVv`z*)hV_ z1Y?Q{HDMH(nxJk$9_bpEDbp|}jSMT@1%Hr4gfhk>Nr&5^NC+{fCJWzos%+JaLi>`8 zwxSnJJe@e8%J#j`b7a^xepgYP3P=*5ZJ7Bk8%Qw`d|&tjvZ}7I1xCTZt<|G#kU^*f zgZO2mBpC8}Cs_@JSYHl@{>_7EunQ!0 zM<>U? zsx;w|U>HX1xYww->jKac(OdR~Y6QAB8lzb1F!t5gb(N@fpfBi!5xFJTC?3FaBBHN) zuTx>Ayqqu%)KM_?i!hEr0T11TP-qx=(r4QEr>>@}ikUSLIc$fAsS||GWFnHpA*V}V z-jxmkO5bA*P@QTTZfiZZ(zIy--i9*UGL4tO!cIaV&(@b^etOb%=u7C8D!YEsEAnkQ z#g)q?dF8^IV>8N+;iGjv=5=Wp>-;u4S(^_#V&)sEz{rfHaHfK`8_>Hj??y4l`3+*b z4P3G$T}+rtQ&qL(8a!Xc5lXZQgp_E?;YKA#8wCb(_C19rCb)%B2&dRXlz4VpYSFLN;~uoh@IN84zc_!KsYrk7P$9-m}o z?vgoGiD4f2iX5cLyL0p-cmXUQc>J5P&f30$cXkL0x-CfmBT4^Bp122i5F3(R5YR|7 ze&TA+QM_kfzcyj!|D@}#)nvSl0294yGJ*qBShDDfETm!2Lzz78 z;I%A(TgfY_`pZE2Wv1-QbRe@iaMpE#era8I^I5)_yOR;2DA4PB-Y^}YzDIV%$Uy48 z_K-P>Lf9E^1B{AgP5_G{0<_B^NfQX85o&o)&BTLg0>q276rapvuDqK{>dj4mp*^~+*EgZ0y=^3-@b)jQdEsF zl#Nu$wh-^e7(*9mK0iD<@a(w&;fA9xC{_&5$^U+7|fBoz6 zV2J8zUBqM#YN)#u8W9xX60%^fIgqpsMUySca{>)P7Zz3Mve4y$kPWj71EE8dF7#sMxLKK?y4?CKq1*3 zABcOyW>5G*G8{v0owmyGuF1G*vSs#Uc5x=-x58j|e}9-Hr^hFYEF&jMv8*)2cW96R ztw_J!E@LUSY-OD`gWxA^)o3`ndE>@#G+NV%_RDNhmj#7E47_J#u9OotV%TdRsUEN9 zLC+%8SKZuBUTJkjbn3O^ImoXB6h|@ZSX49D5uHmYsjOO6l=K~- zt_3SBL2S{Ns_wyolFc(Rl3FO2%vt0irRagyjK(yO^(D6SGqlh`pCaEWz&_= ztnv6-VH?I5f~DX9C*zI+N?V}E%`q(j1HyvzKyDCm>Cwf*Y{#o$)9YBV?Hg~+7-A5F z`;+lSQ=cCn|Lo(B$)`r(H8V9+VT!?~p>NArVbzIg9r9BsE8PmK-&_=5k7*jWNY5mv*O ziNSh@TT>&pp&o@LgTcTiqA41uJ5E?IU(N}KE7e20oveIK2B_o8=;e46kodq&guALz z_KoQo{pv)5NtBqA;h8wwDeB_mcgZcTJsNT(If1Jw3hn;$iXZkhg8RGaB8yH-6{A;Le?3Fao855PXyP!N`Rj9NZc# zeKnxCswliImZTl=k4dQf6J+?lB4W9sP-z7Rkpn{)oNxMmaAq+9UxfS5!{M(^zdV^8 z71N?K(jqOB%8luqiA%;{{u_iz&NYo>+kn{HX=yu>Yy86{BSw#6IWvK3gYKr@5ZU^X z3w@DY77ua0m(wb*7S*ioG=m`E0C|^=_IEgzJJR1VnPx&bHH&tI1GV-r2vLd2GrHJd z%IsQ4pi9@24DGwpTa=6Qz672Y{+&Cw_9nxxzx(D-KK{vH{HMS9`yYS&2 z;QQ~t_g+~*cyd06?r&2!gtc#we;f|UZ$9guot~X677HuAY?E>({B&$m!2a{>?2Pcv z;n5*_f!}!Jop;`S^ytz5{BQovAO7JVe)7pDRZ#?Sbm!h11ORAn>atgTC=c0UM?2=A=p?*CUX) zo3Y7a5r|k%S1pjjH2}JdKhoTC;>t+`Yrv~n@ja+a7apw3+q0hHAizK#b+4gVuTvoc~j;T1E`!pMV*xj#7&;zH%0)h zbdzV!?1BtgPdKbBMOAUba?97*5pCOeH)Be#^ZhHV&1_>QT|Ii1vhVY%tLmy>-}RcX zt;0)98h6alyFuI%6RqZGtLqH+t47{+4ra9-238tcNwJa8vh*_uugNW?sY~bi{J1w^ zjCnk^EoXQwE_el`*eXcD0gxY67>5Nra-TSZn4zl!p)Z{<>2ahK{ea>m@*T98}OwVW$23{G67BQ2S^wq$uRY(`V|M*Bfl zbO%Y}#}qZD^D?<;MW%yz&yPpk@4*9u`LFAR!tH`#OS27!dZ8r+M&hHbSj~FB@9hE zCbe?+p!v%4GGA83vaSjf*dWEqSHgCCd)_3JUM$gVG@eag%&O`6 zY?)EA6Dw0ubQ@r5GhB*~Ha|e7w5Z|QG$vsDM=tsLe8ZZ-5^~+@~kUw_)vE!v}(>GeX%2O<~ zLhGidM{4dmGUQ$$gNP8hXsxTkTnJj;OdbKY)u87NP0w^j1-Zy@XL7K=ODFin(Rr5t z{PE+*fBL6?N)P?u0jfe#6h3?Q?C|h#I=!$n(*#OTMKTno6dY67^zz*|7+u?bHTn@d zw!ObkrfvUgU;EnkzyJNCBMQo1kcs<;AOHRH!{eRFSYO*U(kPGy{E8Pd2@Q+w3&nw~IN{Xg6>% zEtAZq=cmiXg2Eo!I`U++aUO_+o7|NSBDPfB81{qMn0Lo1E72&IytQlE1<=N16SDXx zz7WVh5~`Kli@lveL~o(ok4YcT6?cm%vHGQdrohu(~~lf}KkY#`3_MOKt#3@m}5 z833th;mDj>>UVk>!j&hc-Ew;dfxe%-5gERz`IyaS>+KWTIc?O+gjaf>XuRf>(t+ zZRLTOv!RFC3gtFqNs!<)gK(yb6d87N+7$XAGfl1tisg<2*$*?wL&4>e!qhBRMQL~x z_^%@mdd0N)svXsIzR0#EEW)dT^$iOp3uDs*0b*en#@r7YiQtPT-SCawJ8`9vQ6)Fh_a4@{x+|^)^Gn z%lSo<>Z22k;H0Sf=O<02337Eid!Fl=fY<|VKdwX?hCV%>#WD0TolUi28^YK!Cxh6u z=<=zc4)0<%oY8710*j!lrVSBp5XV4iQ50JoW3{NDcWY`Q(wH^67$I%UGMk>AFAfiz zc_xJ%-nun;qp7$`!d}d+*+JHd4BYeWykgTtVC|T(L1+wwC58Ng*aqu(mBFv-a-+It$1AN z;iW&TWD70X*z=&t8QAZpif>n_b|POdnKiZNdV&fICpXSh5Fb?o%A zhPqztc|#En$S(q-M4CnWEa4P8`!Pk@o~HXqF{*a-R{GySDRhWQ(_hkp3opes#E^UkzB8{tem$a>2j&#iwM4$aa1EqmORg zzWvM3KK=Bw&wfrHzxeFV?OV(D-x2S=ee=dam`DO3GC-Y(Y#pd#ie=v9%4xiaEa!@o zzzJK2A%zABjK=3};C76RLFLqCU$c@NDR}dFJb@(ZU>uLeJ}q;vmJ}0vV(y8u%5~dN znB*4pQe78$`7mw{hVdjKOag)1&c>WdcG{Cx2n=#8CX-_8!l(|?t&bV`jx-2&c83&X z4xpXc8zx`hb5`liSEe?R#;s}B%Ka!y#k|g!=M;Yw+-R#Ab;BN-SREvOQdkY2F6YH` zs@J-bbos4n?r1n9dv|ehF#~_Yg1&io50mudMXFNIrWZ{`%hJi73~lQ(3YegX&Ks{c z%neRYE2sOCVrq;=xVlGMbBo?Py=w0_erwY>W@iXDw6>T~Xse=7Mc!&oIJaMELztn* zRt*%mrBW$(lwKwT{kg%LUoFOtmwIqjA*4f3yw|A)yOxri!#Bak1KY zcpc%aW7kWOFvH5fB3w3Kv?}w%!GNL!3RqW7OUS^>E7z5lzbLw*RCSB`oaw@Gu8OL^ zT4Q}}^VGT%NSg=1ct~0GRpVq_FJnc(8KjZ{d8Htw3rtZE)pkaBWza(+%PPABl}{G4JQAxf+8 zU`x^VVAF4jqsWqoFS3ljlRinSXFEmA$?up+JK2KE5@fMi(^WEZTtDan_pDLm+ZHO9 zU4KLIP)5E?a5VdlmlTN9qNDgwXzAj}IXI|IRd;RY&#NS-$4jE|Epcu&a%ww)6?qgoGx5)Yk&XiUz@!BAf~9ALn}5vK3ab9X!+%@ zinDXHJak4|l;E;j^?m4Td6et4mh3uaxt=MxmZV|-m~XybDZ2V2uX*LG-)CA>s6N56G=O$c+p*S4Sk}z z%!;lo5TXB`V3&tGEimqgmuMQ{azEPJzjg18x8HgD9aoAkzkKxfKmN~jVs8-S{pcey zEH`i7qRl@%JS1QF{P}Y`0AZyiw?{fQu5A@Anh6H$cB`s-_z)C)_wV2T=%bIm_r34E z{ni6QRg1-6o}HZ^9ll@=VZZXNqPTzWjosaS@&eXVmqj_B&2lwYQ7r=GmNeRoXi>p7 zrO@dvBy#!$9FPj?1qhB947}uV=%;=hL`n&DWHIaqNK1jS`)@tH$Ygy;wh`rN;YM0Z;$@_ z@aX8_7hlj*zWLUJdw1`~QFwZCOxC-|7xXZKw!iH?uKe0{D`ZMsIrDK z%vHdEpz+m~Ba(eZ%G6dvFfY@hsM)ym0)osj+z-8m1m(0QZ=Gw2Syc3F*ir@Z%bfva z6yb)n7KO-jH@~1CmJslPBsDNr-FTMRoR;j8R#UG!__Xuua~T%X=rsq;B^8x!R9`tx zX)uALbEG;KJ(6?@1^M0%Q&hA-pbFH&>m*tT7-k?lt9r^Y4FvY<$n>S67Gg?Ep-IWm z=g}|eL#CGtu}$XMW?8$KtJ-MaGUqa}^qRR%y=nA*IpJh4n;jtZL5E5wwmYBGC*0kg za55x>4dFs$F`cHuurJyLTlBu64^yJ8!!=TvS7^Sr8SXc&(^uzTHd1g+kI~9u1mrf) zvcHjXF`u7Lr{tEwBjS0G1}uu{^nzZrEDLKOP?Ty~%Qr)Rmt{F$%*m69O;H&|Vcy!Ahk3ibUM?Bu?Xmi^IIP9!)pYu9*ge!ppXygSH0OT#9(xzv9 zBvon%==+syppgeQx0$n!-enpz12E(F9(ovIJRIJ+eF22gl2untFVGyejko5zH0?;he zWo@atufN61LuNYgT!{pa=$iTA;yHbGkxp*=;UMsQ>3V$46-g+>4p%lUh4PMTShevD zu5YWY7#K8CWT5z?a3A@(AdI1AW6J2bPMO zB(5*G3?Wa>jMACe5vXvYAHa%3a90F_aJU~04nQKpW#24oij4ZaBUBs{#trMxZH#+e z&Yh*hW8l_%l^(~;JV)JJ1fIJy8h`5>-^l0ZKmWzg z&rc5jxBvCueg669-}uG{Z`{B4?z`{p?(RLJk6%4JJv}88J(*09-|1Hp8P_$NuZR!A z=h|}9(cz&b6s80J^{;<}&gzS2&yP=zpFDl`i_bp0|Jj>A{M{ekyZ`3KYCv9hHm&%~ z^(&V{brl^hEv<(@N0ydC`=SpV+ue=%$GRdULC&n0{j#r-%<6 zuk1bPc0rq?egs40HIYXM78zSdtr81r{b&2wTeWs{QjjSYT*X?A!Z2}#w{80hI%h>8 znnoI?&dTsfa-+aN&j86-3kuz`7Yr$nT%N|I0#mWw#Pc)&}g~6ibIT?M8F3Z41 zt02&%&Dhx?bFf@4pFDX&xb2(Y`sS^hH|ZIUkB^KTDD#6za^%;2RB!^fi8PNWTs2*x zjjEQAmsyqo8p4Ab6vep|DuOcNQeT9<8qwe|@&?>q6&W;Od5mCC+|_#+tZ@k45R&hh z!j_?>+a&;HCWfK^nF^gaUfnyhQqD70HBeIk>n>(DB|SA{YUqYPM&;`9Z2YyYT!4|X0_Yl~n(4nfj zIYm(pJscq^!tt~PZB^Ct)sWn6y`wbgI2Uw-a0GD^w!MMm0`V zHeJ#CEO2)x!Qeo~1INW2rl!za1DDlQR4kngmUAB1v^-40V z5g8)_zksQ$OdFjVrd+SV(@bO*DNmrE9WKGpbE2)4IVhEbXevq24IL-34P8uKDa#gf zS_R!W>YR#1Cs2=w~)ULJTO zX2CY9HrrZ6D~agWee=~um@Q(9Rruk&^vY~y*z{|~a=dk^*JerSM%T?rbusNbxO;GLziQ{Y&0j!K^P)>m8Zb{ygcn0xP2t*hO{=P=wG;0Z;TbY>&VcVs zqR|6xBl2R}sxt4EwaX-$qeAUV-jFk-t0s$DoJ~e2gY+VxfYsqm14%SGS*l}w#lex^ zlC^ORRljM$>``6>ih^VWT%kY+MgES^6xurNr%n zgEx@}l6kHnr0uI>S>;Q@K5yQ?bMxT$-+TY9KmOzY@K=BJ*FXE&&;RTH=Jba@{N1m8 z?fu)gZ=0J{wuUc#lUaP3Q{!c8Y<27zq`JzFKmPdf2blc8FKM_aDXd303CC%aYa3b+9noz`P{INwA|{(gqu~huj{y_QfxY=K)90;C zY?#D6%0O7B#UejCs!vaKRkAHKp@kxUNC%ZXaz)3)NYNq!QhjY2>gY9MI_IXj6?)zn zLat}$XS5r1@)atLD7|2!tcR4hXVgLjof5CBI2|ySwCbS9lBO4FC{hoTN+~pbZ1TQq zdsP@cZ{?ZfNScgyz2Vq;riQ@6vTX8(Rh`=ajhLZqc5N{2TF%+Z=3pk$SFF;iYOCW6 zz3;n%ClRA~pzBy`ZWo$*B}ENg=<6}-0}sy?x_|>U>&nK-dQmb@0ajurc`!&Yca6Fd zVL>SDE*Di@p-4k_LAV(FA+G>-e~<|Cuw}6#kf2JpEk%>_Zpn1jbM^mF_GVp@UFVh9 zo#z`<4wW^bP$&QbF_08R+NM_1TJqvUyXE$3zuEqQdQx}mO;)S5tX4}+4J1X8APE#u zC{z_tm6cOWcb<;-{!T<>)&SW~)B+M&krDTvd(QXmZ`#|0fe8SyCn<~w(5m4FR-QLy z*_X9p?(%sr%b@BwfoUhlg)6eErk_`BvIh3-LYT3b0aqFKvuz7O9P=@}!$j&wuxUc5z09*U%hP=$1KS>M9Pha}J6(6(#aGXdzj(e{ z_M><@zH@W`-FxHPM{tD8)#CZ1N6#NTSUi2&td>^YlFgPiQzk_0jrxq)3&po%iH@r# z3Zi04r?j@+PKI`aNEo76lv<~mmJ#;BlB6U1|HK!u_fj)04KhMV7U0*tSXvITOC2#p z8=I47uGFpw4c~~PBUk-0+NTz0&6Wy_Z(wMN}h2a#F!=i)MXBm(jRWKcA zh=SzJH@zgC9bIoPs_tw(FETv1`Pwm7Zsl8{2pkQ)jliuR+};ic7(TZj$X1IFi#sbd z{V}&FKF&)9BWj1RCS@9hyb@54Uhfg0o`uhBQ{_)2j$4P|!cI(z{?7$B`_~78+;NvoPr8UFoVFZ9Bc3`fEX1yM!+mNM>L#(S^ZFC&@KzWjQy%k z!YD2P*+3@0mYfxzN`6?`x}YX2!i>b_Hdsq6BB2^6*ja4>>B;nKUsco=qsfJD0VfeW3wb|&uryKntY zwb$?MPw`xF$wgiWSr&{u!$-^Q z{4T(ODYM+A2Dc?iRw-$+CxkcA$>or--u6{IHT;AVb>w(yEBv+^yxR6;3dX!-XL!w2 zBI2zc9;h@LoZUDIsQVc^ZtMaZ5Lb=tFv_z$D_7;ZaB!Z6&>?pZortG2NGE49coG$-DlkCPlZ=_c&O$d%R4>=!ak6`Qs=t@r5vKhoOD~cF_ z<-pz+I&FBQnl>!*;3*AvWRTn3jKT;o21gg?@qCLbx4&Ybp8tT!+i7t*29~WhR zvFMj8x=WAE-Mij}*NCfc*tks1XJfv0F8W0tdUhCu6b-OfdHeXdS+3j2N9-c(0}3WI zKv?Ds4URef9Y9 z7hgPpV~(P*>)N8A#9Ak_e|oQCE0P~2&naMgbkueocFuf02ZYYE)oO7LKx8*^<%W;jhK zp&KG{(a|1@-_2r`WsAAhtVd>(dIMq%(G#}J*QtDN7Mu@++853QZrgTOxwWW_CO7QV zNI7D`w`bq0#?u4#8PjKuHAF6BQI9jjl<-&$!5T>4PTk0lN6u&*#*uIV8bEbR7}@o* zs;P2_aFyF^FkA~!LoF0d8-OqItKBztSJ=(U>T(`$nEEh<{~wR{X0$bq1OI1?Cxd8i zt6m3)G7$1=ug9h+L%?Krlr^+!r!6_vE;M{$u_lC zX5F`fzeEzuAR-Ps$N)TMcqCF~ zPb$E*(dFwp%Mcdyj3s-;7YLz5=NW~kYBki6(YTghTG)PwiT4=nPC75GU5>hPY>8!K z9&rvClY#>t4`|iXO$ZxXW~r^BCXE2^jw6t`A#!tAzIJ5N*46Du)TEBj6vfuySPCKf zbjpNGh0twa6Ta0_Te@?t7N=JMt`$JXl4|1v_13*lKmFvVKmFPH`GvFt_*VsjUS^|} zhuLg~z~K-6;19n2(YOEkm;d}X|MkEA@gM*3jT<-r=zsa6AOHBrfK9|GxnFgp%^IDWd-3Bw%s?QZ!e*y~pv|UkTfFiy0;~POJ``&_u z!o!nE7migfS1W8+KvL&?T{~9r)|>ZKYwzvv!41|8V^eD7#0lG#1^WQC;Edp5k4NK! z{e3Fk#IdG8#hvSdqSlt{*?&qET1rA_HDvOsDbejU z5jsbqog_|HnDYfzaYKSAVa?^(^R{{-sy!Rp6&Vofq~IAijmPvE?;asj^T?o z+_txuWe8)_*dU$qGBw`XhS2zMcFr7XGJU}!h9jSbIZD#Rl?G%=L$S+|-Kj(|d4WBL zn8^18x3hcl1T})_ggU zYel%3&WCf%`sTb;<6KP`KN~{pEXgaS`yklM;+Sm6Vy#gbx#<*6*t=85pTwy`rAPiq~pJVWAKYsVq~E zdQ+Bc8%9HFsMz?&c5A?z0C1k!rUaWow@2WY*7AjIVGR@|2!ha!Qo}>IUpHm3UM^Qp zkMrZXS;FG&?_Iw+e&d##j{2rtJ^6b6#h0sR&)U_>>-vznZnKyE!Ohv%AWw!I-N26~ zKy(v?9GfKE;-a{iWAou63^tebJT-9`PsZVF>QBZtVh_({qixf7mby$Y=yt+|Y<`yLai(y@K z7Z+{W*}m;3qwru4ro$PexG(ldCudyFG`DTGoyaUxpVu@?VE4B@y6f%e+yygCE|BX9$fH2;C^A7M6HnQ&F zGcIKoUM@CmTLm^0=eh+J(bv~sf3;XFHRa5`x8Hv6z26y)M_+&S)u*3+ig51Zk3Ytz z+`0Q^9Fp628jpAE{G2KFoGZq4*cKjGbkoXw(hbnUesYMXs>xE|*byZG9O=-v?Z&Y3 zfqlYZScO(KjjGV2edq_Fd9XE`hH@D8btXH>guzMe26{FUmqQN|)--tJfR!Wc*@3+Y z6w)K0l<5#A$fzh`V!bLM@x-5&G8C*MI}eVJ%ceQHek1kA)5)|X5XwkH&s=Qkd!A_7 z@E2{ijs$qFrp$D}18I>tKo)6?su9cr-*nrC14Cr+t`bix8Bt+3AaP7L2pNpp?lTr7 z$udIb2fE&~^S;D^%GxKYKq*z;8LJ%Do#QBFhFCkSWL~qw zBCqjTwkk{`GXQjUG?bRPjrafmsk5pV`bjo;Q)w;Ct%18bePihfL`e&8ZJ$`;Ei1RF zr#TQ@5MEIQ&{%e=Ub-zs{gTl*2m?Jt+B6kYPE9SWEvyc<%$5&q#0>&OnM~wS@(Mxd zyj`yp2Xi*6Oy8JT68Xl4^njgZW9?yd+)aA?n|@3CT8%jQ2&JFTXchK+gxHiZM-cly zT#0J>+ORpKMRpHcmt%J$V3L2du66~y$npNthiaE7jh`(Rp*o*_o z&9w9nk};#Kgk|(NxLJn_b80`fqcjczFF<^c1JCYAVWqHbaoP<%l8+l`w=xSZ9vc77lhA4zd zy6a`9Q1%ilpedsVctG7cZyrAC^V05BaO<|-X`ALu`NC%BP6CX!+^TEK9HD1xaI%{6 zzi}Ml0RaAsol)xy=n)HF3~cg+i8Xv%dN(B#!N~^L?urJ^wuaPq4#wWz!6+P$0SfZt zi{*nS#p9=Hv9z1UR-zbhn%jx!%e!!u5lWhHa=1UcdCQApTy#^F+3AQXD7gD2U|-c& zm5tLep6q|?z3H7>ZXDy5b;jD_kXdWCT~yam+l0?fPJa8iS}%fRJbw3`!?$m{No?9~ zC%EtGi^HaxpPZjRJjt^&)fZ7@r`Kn*TQ|~!BY!rwLSM)&O|$8us*dUc?|jzU#cFQ0 zVHzVExE_zko{c5(NlqvoU8WGt1LroYMf=acUd&emnQ#p!;Jd+`R~Z|tdhf#DUnbLu zA9>!vzH@M9uXAg;G~3GdEEm4R_j)^G@&m5QfakGWZWh;Ev?YkS+*eIBOn;cY}jT~Crq zLC>)rU5MlV!k6ihA8Aa%61YNPK~1eo3UU^r97(K838e*)Wp^4PD)xqWB9+l*UVa|f z_H>%qv+JH8;#yNL`0~pqRoVUY?|*)AcJZCx{pf=aKKQ{8esJ&J+YjVRCy7NN+p$D| zbGQ;qYY3uK1{%sp>kJ-v)phM+F@N?9rp~)|cnzoT$3On@bUJKMzng^QnPxZA3bQ?Gc zJ_6=A9>G@ZSW$(rq}LK~|1Z2>YR9-^G9}e@p6lK|I?8~&AAb4d{QS#DkKTIc9X|~5 zG3=EyHXIT0p0AtbSrIL(EL*RZbEZFW zg>lj~$-1+$V({xS_Ify2rN=JRriAvwy<3~~#URWBj^`!^uA4RHdDcHIhN9t6G@#5z zhIWIVWqsif29+tRup>L1#FHeV$dmyjr`uqQVm-fDoS&_7ICFT%#%U_Mt~=OJKnfTX zm?4AZ3d9X0YFWdI0mkqCw>OzO!X%EzfgRq-yV)*h`Z()nT2)??iMa10#$o`FqkvD& z)q4zXKpLkqPJalWv(m!2iI-iYbpNRSfoY?J<}QufV89LtSQd=&T^eFN%r>A!+np<`2M!k zKJ1hi%p|hEe9Y_}LRR<>-?MCTcGab-s@6QoC(q~QjfuTK8YWX~|Hyv6aLzBBvI-+N zo-+FF0^10%yNjN&*Sf3%Al0fWeBYH(vtIi)0uIDEo@e?TN9trS$!=|@F=L(@)df~5 zoE~H&FoM(@VF3`WbfOclOtQvEeM2|QBCK|IYDY3fN8v_~vz~#jEA50-w|p8~DiG1~ z+>M|Bx;ny82G=B$>W)EqN?J8G9Jvhq{Bq^=rQbGgF|uceH*Ov!p>zFU{OSEKe)}o@ ze0u-0-#&cw06X_z|LgyGJf2`7PESvHmL!~0uN#lGH?b?{6+}74)jTQqqC8g9JbU&G zdwV*WzVXHz-~ayifA@Re`}MCs{=g*E|y^fBq9ULBPi1_=O;%@ZC z+Avz0oxdm$_Abh@G$>R_zE$1nB^@$^7rMI$V2=3`%Ld@>-MAii-H84Q*3V|SpDU&= zn-$nb-3_c}nu7|0OO=N0N2`9Q@$}m^$AvjA^~(p{TB09A*O5ey;Dyw#gWA%l4x8M8 z^Q)i!=H}kb@7?*`>o;z!SL>%IPjTAGDKQ?y0N{QuE-vQtIo@G*aB$ieL@tl1CPVsJvX{)96|+m zD`Yra?HVz!PUu_$nk%1cZertYqwhupdoVV7v%(Y8n>tY{Qu2d{iD;TVV>h3v8`obe zfMV`s>n*;z=4}1omu6L&Z8LZ{!9!IRdA2C$XYF#W8s_8y1V}FvML`&fSSAU-fMA>X zyn24p!FiKq!Bxh#K(?E2+E`>3M@;>oWWE|Gp^=_85)4TDu(~1z^|HpN+Rk@r83J5T zUK@Vlq%8?s$#gW(eo5>l^I>6#(4PU!zWL^ zDvR>&-M7f*Y1zF&i7K1S%gS~GCkXw3ZN2$%+1DvQod|qApw2`@x_M>@XHk99KB-QUqkKG?TULrKp(+TQ2IVaY-sjG;NA)HA!c~idEIH z!~~=2^j$#D9tN}68->{Xz+sE$>x+|ByQ&>uS;U+Ayz8k1C9~hGS1?`25rib1PUG3k zAB{HN$OYt?bbvAIa&@w<+c_4_(Mr|rP_OI0sj*n);+zczVdRhZ!r5UEvLZd%-yiRd zv!@q$UX%yfX`}O0HSuQ>GgInc+};n%(_r{OMB)8ZWKo&oWX9e$@$Qgj-BA=LWMDCMP6Zz z@^`x9?13g-gHO#-+j<=@vmrAV)JJEh8AszbI%Sq_y|Kl+bB59x=(#&L@ZvN|{J^gk z_<>uscGGi8a}s*V*oqFVNvqN(>(B51W(jNaU;gT^vG?!YyN5me;fEhC5tT}1cgu35 z+g9wW{R}!mqBBgAF$$zU#n=pnMdZ;k+z>^x_x9d>_uZ#oKgCaga>}awr(gVhxnA6R z`|VpdZ{4}`2Hu=AWL1Sz=F8ZU)CmU7M=W^76}CVbli1E!v5UxJo_*j5gh8P?FKCB` zvb2DqmhO_UNpdJ{?;1%OgD>6g@`o+#uI?zplW@Er zOoWx#Z$ZG4h3!b&f9G1t@hyYNF+(QJ)K$*Cm!tt+W*Aggr>u1$+1#}wm|GrZI{u;a z`U>ujOdgh7+X%GT0ii6llX^CX7tFWyipad;fRo`_ND!>|WrcVpSA+t!~nKbyeWj)BX@s>Ls=B6yNlV_`^ z&&!LYPyqmXcCT`aT^-C;+vyLHlvcR9SroOyF!J1DwOn;=QI*(!DZI7o?oK09rqW&q zq)m`bk&Qh~(s6wJ97hY62_xIc1`8jOJyt#GxWpQkH|mAq;9JV;RK*K+3+xZa0?GWu=PT zT6$``V^*+Z<3g5O>ztEWK$HMaX=0c*7CFo7RaUFIO*o5ZN{`GdMuR01iaA+(`_{E1 zb3ECmsHw-oYTn+gI4hNNUaRxo!lzhWRxCb$Ts&XbWma4qm-AB!zD{T9&9^3ZUFY^8 zZUT|OXd2`*TlIPN<&$B#u8Vase_k!la2>&9^J4dnL$c{px_%hNgB^r>w{MJY+;TbL ztma=md-BUK*3Zww)V=o3b?cow(ex0J&*W%YuOv?W zK5IP7NXeVkwnm)+CXt~o^4t{1%%UJUVqgx%3VV(wZ&6xke4MzO5vo~%&Ncig@BPAeI>^l zal#P8Cltyc0){;iDj8cxcaG&K$*RLhjAA$SeQOogR)nD0Bk!<>8(pjODwrp?`gfv( zWbgZT@80?RH(&q!XTSL6FMs*{AAJAc{@efcyTALp@L!*O{uws7j42>Qa%2NL;?6Hg zg0@U3*sP6^uyVk~$CDF%d;HDu^XLEY5C5>gzmN0y(MR9DdF$3!Up={h|Nh6n`qfYV z?(Yuv5B~5E|M1`Z(Z9KI{rY;fUMv>4qw#n`#U9Jrb)w>Pam&Ja!*$@4Fl#K9w6HrG zK-la=3&SSC!LSxpmsNdiE1&{KR$DRx;S-Tsgh^l4m8OnVuKH7nsCB`(0l;4@u(~~& z2OH62Z-i$-0Ux*~>@i&j+`7qN+tL;Z|2W5AJiQ(t;UfYTcc@oDLQ>y{BdkUGfm||J zE#c0B;~1~y}Z(i8BV}S zf!p4ECo%w*BkZDhe_QyhI0^`yf$tCqqYNq#`b@&4nNbEc&^FA(U?^$gh(uc zN|3SXv(Y+;RIMe?kGsoctJlu-Uj~TkG6!T{iH%{yI<=#X7&NSrK4?n~F0($Z!**S~ zN^>7sEps(`9E*TPXEcVbhc;i4JJ`InCCx1kiBJ{r0b=^o6APOi5qyyi`O<1@G7z$r z!Rq{gIA%N%$xv7LD~EQq>eo3D9*zXVoekN!aiv@SvZYjpSC#3TVd}wxtLC+xgl_=5!iijEJJ6zC>p^1Gc1iQ%8oD+iW>so}abr z(r!#ogdr}8IMtQqzru^TYgdzr0|&5ZB1+a>(-y46xB5)lJA%XQ)v{_1z#^>}2-hl3 zWgDy2N`&85_+QV%lcUCpCsc#BAK5M^acnhcqGiCnx-ZJCq-*!RKCy>J>ZgTi(^>~< zID#pO6UoOQW-1DVO!<0E$z>c1p=(1}1xSP|Va~%=F2cDkZSe+9Gx&q)4VJ1+19rQ= zZ2r|7{z{ooMtr$gHV}vJ4NcL(Z_FFM)^>ZFztC5MQCVK&CQdp@rqj{H^>%EzJr4D1 zF<&j0WKW1$ngnWr8OJA7WE14Pk}E1GJf2(xNrq9}hUpm(r^;|gTMR`t05O=Zx+I_c#^G}tM>`CeGbxJd_?S~A2M5k{;)qij zsKaOJ5j|Vjux5MvvGAOVFfHGLl?)N&!usP0(m<1>tv1MhX|u7F|4+%2L4F06#4Kyr z#KDXDc+}(3W0{(&>uXA+u_M`%V)1Tw8k(VwzuR*#(GCN5f8RbhFjxiaIz+iyhQE%d z328@1Bgc2!;Si*#7?5#^*S~*cIHs99OU^H^~a?r!ZKak3Vj!rK$_5)JPQyI zlSI>IV*m~Yn^!3KXHcof%tM<))fJu^yxBMmN0FpLY=_KFhJiCMNZhU~BTVl(g00P+ z^!QePe9*&mI=f`*nJuOl8p&5QLXgSPMM+m{?Q|9o;H_*|2^}J{aSYs)jI8!XS9hj0 zup2ETXM^QRJ$XG}pXBx2aE8f2x<9`8<~3aRCnwL(fAia40T$f4dFznsN{7?w^!DxB zFj=RkCvdVXr|1C8+Hg%-+wm9ODWYRA$vjYtZ{E3k z_suAdkB^V6xa%eCw^ZG_0G=W*Q;wl=WOOj9S7^YD(P}=D7=taGBry`yD$y`krk84$IC#9M zDwxQUQE}33`Dq$rSy!uWzG@dM0CiKVU|cbE#;)R^TU#7^^Qd8GWGT?>e+i1U@M%RpTK@wPa$0`<(kb zV6**T4KCaq>F->dr|b%a*2_$EFX&9|TCx~jx9j!LwTgapK-g^99V?T8*Li>jkx7o0 zWRu<}S?Ri6EUIVEx-63kBYP8peA8sLLXgyv1I8dJg*%=Ec#7jue{yP^&fARickq`8 z(uwg{vV8HPuec!1Kw!XUV9(FjCEl^^qwCi=zQuD-DGsfDxk;QFX4M;rv;ZI+(iz%9 zruBLSs8?H+^so<%8RGN+5Q(MLu9h#|pYBRx#<&9DG`%mKw-n>>8lVjv+M=Y;f$v%_ zwMt;;0|z+9)0Fw_>Sdi!IW8<~J(xw!KJ~I!8LnJH$sTu=_{j+7LJye(X#jaUB+ozK1oL@HK^ZH21R>_L7VJ(Ee zd6V~$2+8)~e>bNi-TIVLX~llhGJfUK2@*0Ny&slC~{=&yit?wsqV7 zfTRm&7l`3hwZaW!JDG%t!EV zL(Q=y(e%!9{7O$J1ZdJmU291Q*GrGLOhYJmR;`z7im0X)MDT_1uwAt_+srXaMC??a zHLR-#_3AZKDhuauZx&6ba0nG3?D;C6=gim#Ni_C?BupYd4!s7C#v14~t22YsWk7gk zR}FyHy*DIzYpBMuS;Vn|0ALzMuq*Sn%7LWujEAP|YPd?HcZQ_sgqLby+=I);sz&@{ z2cE7>G>cWUyfDgz*(}McbP<$`MOrt2>c9bE?qZ2Oe)4^|KHX`X|_ zPRB*=n?ZFO-rGUyrT{YJ0|&}95#+*pcUE8ZjbhEyRY2U6#G7$Jec#g4#60OX&6K@k zbbEo5uxG0Ud*6jwaYOcjm?dacGCr8o^A6lC!C6ny@Db`ii0v z4tW{r(_A7QCBC{FVYYKFEX(IOlDu2u0$Jjt}gR!~R@6}+uk z_>P|+<9FMx^?mQo8+U&E;~(F+aq}}yhM)e)pZv*<8#li7{mPY8p>rsJ4Rc4i0MQ3%k3ZiZl;@9A} znq~lkb^Vvi985kP^J^o1P^U5_iTx{nwCu@D(ksx2i>mTk~fV+5mi|mj++Ad1c8&S z>I;@dfEC?zLqDn!^rckLuB~L#l;kQMD{T62WM-=Ecg-kU34#Bw`iU?2Q8}`j15!_{ zNnA?am(KP8Wx9my16Di0TEiChrq>z1M8wLidXILprMMnRs7UjmLxBxf`!?HTeuJ;x zq$J>J^SmqazUgu3NXnBkEa?Kjwtd5k!-Rt}u;t7Fc3p#@>hYuUj+HRF2lJ;O*41c4n#wq1jdG@zG)Y#uJrigEfx-DzK zSU2$0I3)mgJcoQtp0#WEMLgknJ-e@z-PA(2=@@vRro_P8+SO}aoo=Yn+z~`zl950vMTnaN~C zTjAYszq7rAMAW`Ec~hz1Ef#DZWI~ta9v_aPRBk_>^|sv`?odCos+>h--=%Pq=-a7p zC|v4%09zk)7 zg0!|StBN#q6h2iwT^t#DT+*K62Z&i})#Q%K1H0_amT6t}%G{OiHltdl&z_0#IEq3_ z%q^FTrzhE2jh}|2Q7|(6$Q|uP#U#uJUl|MKd3o{R!&B{E?C8!YyaIR0WW3+&Q-T#-=T=vRVLv2F^j_MY6xKc4 zN8mAR-@-mNZ5hDr>?lkR598_V+WYTyKw1SESM#&;^|NQ|XD8*wd>}EP$=uA=3Iq7l zJU6Xb6h>JxzYF)FjF>4aPVrK*+V(UhfY?&OF)n-Cd)WWMpt$ZJ)Q+2pNIp_Tetd`` z*(4ShFEyONjXkXIVH!-r2*Hb`&)OCKRJ{|e-40@+rN!zAH702ZW^^RMQ^o_V6d(35^774#bpmY#j$&r{g!r5Q5My$o1PLbEI`8y0m=l~ zgNMKNHp!v6&3M zwvC=1WrCa@52sabMR|cC@93yb`6tCjyZIqOd46 zurHe*9ry$|IJY&2!pTug1&y}Hd90*g#St1D{P%;8K78}mn^<0;l$@Qso|aX%$-N;l zI)@UO1E(HUmaSxQ@d6@KN80{5Gr&{<$%idndq?ETK}Qd#&^Kv@y2fZrvuX@ZPniv+ zAY9xstc$SvamTU0N?;)Qi5&xGzG}+87T>9#9Fe=as>h~Y80j!At>!~&QhQ+b#~A8< zD3zW^72kuCV~|2vy+G@I*;loZuzn#Tlx~15~ zZ)GAPX}V1iw1Ka%C~fDhN_$b7MK3+{%)ZyPp=BAE8ncCD%QCO(I+^B`fu?P3#gu`z zL8_Ok>6jY#ZL=N7kcgPaHSpxp*({19cKhN_p4aE+?R?Jna6H`y^Ga1n1ith*l|ck< z`K}SiMjYWOc2c|OJg-X=HOY;vAPlXVO*T@e%D$m4AbK!xk;*nng4r$BEdj@if(e)HGJ2+cQ$yS|_QL&G6nSX?WyDUd~A4Bg`=&uY$)DYe+2|!Ia)2i-ja@e$DbPb0Y5hsQVNn(Twtkwf2w{Bky zW(|X)Y~RtsLplXzz3B3HecU*LUJ$4n`@i(Nws)f-OylTa63<4-NdJ};zpEn8SF5F_ z_STYKgkNmy)fGKT3=_BnPFNcmC**)gsjjNpp2cw7Q9sze7l??)uD9CQX1|3_ncO@Y z4Y0GDB+8M&Pq7R#Ct8d&`rh6#YFsTLzR*rCw~Pk?7=+mQeK8*rgW{bRQx3RDrp+e7b^rKLMKU?Zi?Pl=%2&{d96 zyHrRUuCQcprm(f(k}15cZW8eJ?&3Cx?jI zmUUJS()55$#KnMNz}c9LN4IZG@7<2C9k3@U%gWP}{P|g(mz_XuY{Qnk61LJWzI9`E z?~Uz?*VXA+b-t#Cn-xeabWhspx+Y1rW3;}h8lDJ=L+Pqpl@UMQKh1LM2fo9X#|CIGuqThE6;R_Qvrf3KGY+t{8?v&%#o; zR?cDADEQ-%de}m>>CNmBLrhznhfd^3BA}A;;xQS>;JR_iJJSV4o1U!5Dd)T3q$pnDo zlTSYZYI*$R@lSs86C9bFH*bzcqw7aUaU7kVo}K|guGa`0B*Wn7sIO(7wU= zdkmjg3$>k1VrH>k^9&9{7=(uh2h-W?!w)}v_UsuJ;T*1^Z9o0wljq0J_xJbTdFP$? zKX~7ls<-BfV@g$$Acm}9lTlRvMGxjnJiAg-V`-ZlDr{> z7~TjM>^VDj7JW!wqG{PU`HeQBp$kY@h2C&DR*@UsvhPcJTq`icv9d;jAoy6es`fAC zCw9|cT5UiYdnMu1+kL6(mg;?h(@cZm&^M9@Mu3y_G0E1PWs4Y?dcj`MOvdFb9U{-{ z8|NZ(gO!(6e%o8EiHM~t0q97(>T?=SDDv1ntX{$yuccIxQUY6Wi6!t45K`6{M&VAa zXkSHPWba1d5ol7gx~A-iBN@W}H4*)e6py|czH~fNld+kO6}2@AxIH{dYn0$|nTzFc zu{0`#MYb)OdA0z*(viIt%Ole$zI6lPd+qw-_-x3^VQ#5QoiPC)?6wXjiL>-<(b}w<45mk>chpEy24U}Gb_C@ ztE$ZVuENel$i)f?1B|+*MmTwI4YDjS_sNNy@g$1l9ep!bEbHov+UeVLWP7317>Auq z@2dkBnl{k3e0pEE=)J*m!*MXVp3bhr>s#A&6b|oVd9hwDVFv|QrZNy;;j1Rejwswxk`dmNd!MYgan|C0&MpqHYi8 zz-+^?Kf5sUg4oFAD(D8O*B2HAI`hr*g3|7Y)YFMEnQ06vytD0+9aADrzM*`h60Y%FkWoRzAw5ZStE zJh^pv?OV4F-?<%*CcuEz)2FKkpJz{=G(~|E&*JM~)CK&o>yDGjP5t6qQ91z-kr#ha zJvrm$uoqp%1vW97sWw@UZ7`^Z67`8jKC9c!ufXyoqC-2FWuR%`D7 zUcX(e>hlYr8R-*HmlO5!-Qase6saiYXayl4lb<-`mUuX6jEO`ocOYl#Hb~qc}`~q8-nC(KcFo0}5AczFe*0%Yk30nZsGmrf9N` ziX#;9CA*!f;U(CUftcHf9cr#S`;%Za!iu@8%3Q5XfsAYh7o~@eqkXKNTVCP@t&a!h z*`dq(0wC;s#?3ujCvBGuD&#z4rP73Pp~Ot+g}y_bBWE{_eDCdh|L%YLcQ@`2(@c{S~*=xj~a0R<_$jq(G%jGkn{K0R0Dw zCU1(z%G?hAzQn2_c+jCX79LC3x3JYNBAvde5dTZjeDFJd!x14rupGA+E|Q*kqd|wG z&PVTmG@7P(ud}mLtjl;zWglFsrgg7nG)~5>`cm``;xL*{r|_3&XJ?NeKRP~sy0iOVYe zyA+f)Us%^cW-5lw_>eYZuIg;ndX&;@8{6nZqusOmTY)tRD2YU}7TfFwr@;B|j9T?T zl77&R<2DT_ckQv7VxKRfyl{)A>r^?|orr+w87c`(UgSUAVVWzH8ykBBv&{;Hu_3@g zBvIB@-+Q*_0(WNF5QeN6W?8S*`!=+9>T0s*g;WYvw>$Df!*oo?(e>;0;lW_LFadQ@ zvEvE{cjQ}XY`G433rQK=GXrS4TZZGyKH?WhX(djz1J?Nayl7Xs>Xbj-Pe$W(%nG+5 zEp~afZi*b?SsZ#@8V}8Y_vd6#)9C0!8cwa9B%W4;7_Jt>b#+YUt+ADoI1Y$WO6<~u z=~R)ii27n(o@;Ii9oaC1?TL6QZaGCd9+Hqquc7B5_C}a&TbCNao5pjJUo^esTH!(? z&e8ZlFv)lvk4Ku9LX+UJKPF#yZ9y(tcD}oaftwbK%K1`B0_j0IR^MTsary!>X>#lW zK!-GXtD;(EkTYBbj8+dToh<=pBVMxY2x{F4%zC|Q* zRhETAZl5%YN3gw2+-^AQHY4z?1O~ntpSMb*xUNrW+auY-kxi)`JG5qPc6_WH-)In!aKQCns4w7>ka|CURFlhl1r5J zu%^1t?jQ-uuHmrP03d;&wH=6W+`f0c*3hztrp~Kb zlC-AQFm5-BlksFanPO`RR}dQlS?Ao&R61L}JL&6Z*ZFEbuZsd6GGJE=UR%K+`=$lt z(ld*~j>AsXWV5zfzzhV`GIoszGB_O-5IR$aXj?jUj$R6CC(A+L@mSSx+neN{s~k4; z;A1#*Y&H}Wlx_mscf&ZDvgb71&NE8KJv&q3OuzrV@53O%_Wa%7|NU1_zFsVrz`ED2 zUB|r!L3sW8bxlsK9i3Fb%`FiQ>EB@7X4AbSN!m^Ir^gZVH$+&Q=^dE3v-7i2I=XxJ z?nmGL=&iTz-FxdT+{N=_{&RkQ{@G`r{p@Ey`|fwYtGVKYr~+Y?EfPqq%ISsWs5~Xi zSc>2A^z^phCbQag+NkawQP9Qy^ujJ~$Zi#fHfsW|Mcd>URxkcS^Y3kuourloV{3bqHtL!DWB0Yz<8-cHKMIoI;{2iz5)QzWG)eT}(rUTn zgr}J1PDU_r8(52L*N$Mpzx?vyZ$J6%VlhwC$0WzJfUA#6Hp2q`2r*|Wn34}@!~B`p!2 z_nhB!?cOu{nL8Y~#?&)nmwUG7ImAce30p;LX1!_m8ftQe%=T1j_Kj)ejkziuHes3m z$gKb^d&FUe1pria4og5V%F+tot8W@SzZBQqwc`&;Q%V^?&u3?)k02pHMAMaJo2@CI zrpea6Ih&#PXjeCeGkCTWPiN7!Bdi_;xq!T)2q%M_({0_t2gji*3RpS|o147;j?yCA zugW=HIw8qWvYA&QY)#{IjNkx1TgHIdAqCV`mlSE`ypL)vyP2<=b%7WZXAxTkk8d!H z*D6L`{pzHDHuQu2$#lUc69lMVPexfNbwY}r)fE%(ROG4Q=r5?DHZ`v$d=j&BfWJ6b*Yy{d2y|u8K zObPcE>GVi$!3HWrq#?ScD4ZR({>UnpMP&@yp=u)T-S zEUT6>gr;MeQRKodPiMZc@@vjUL6UhrUv<4s zl3i+Od=u00uDp(bpst4^XD%d+cE*6Tttr(01KuL~e)3gu zdWJ=0$`|;uYwdLw;O2bag-Jg=Vms1!;_uD8#e%bK)PYpymU5HIN$gSF$59KLYHc)LSY2Ye0|3Jd{ctj# zCdoMESi@%8zh=&l6SYi3x_%;lo#)DCuP6Q+IW{K^`aUqJ{uDaovrH_&OryqzZ>zR3 zaTe;XvCPu2YP;&pg}bhq(ZZPnR3`1vz+kVHx-5rnDJ^#1$r ze+!`F5B}hPJUuym@ZbS!Lru+kGz_(5V)piCFhF>ZY`tDAmq2ekclabf(A0UFz*f&d zAvm2c7Ehi$+223FX$7Fc58wONd(s7a@u&asPygz#{_i_?-u%vYzH{fzJL566SMi33 zdpH|pY7#3)o6bgxHYC~>lxzl(VYOtZx3O$+mxc?AV_D-HvD!_Bt9w@X09zKp9FB#=+Uic~Mqmxe%p- zl_&|bcN#x&Nx}#pP%zf%u~CkWj_^cJPEUXFi+_gY`oRzWhd1y3&J@9PSJk{&$9G(c z?%>n`-mCN4oDW{ZBu#ANdHW_M%Y4KXfc_L4CwzcmvaqMJ%vdeWHPB3p%QG+4SF z@Jg@K%bJ2ZAx^qL6HmEY8coSLcGHDrX+l?^n{h&2n z=H*k<+Yf;Wn#$}iI_r7q=F|_Nkc?w(yP3CaA}{v1s*TRem7YWCykeml&U=2|S2=t# zE?3&-sorPm;^K?b*DudWX|OMxmFxf^H5JJih9J}&ba_?ds2E{v&SvbAUuRa`npaSz z`P%A_cHx_tiRRnmM1L6hp0gPw?ptbS=L5Wn$JuNcL9#`_5M%|=73_$&)%|{10qPZ8 zD{Y-B^8IU*$-JrCvOIqFbboIeCn?DVB(NB^qky~SUz}1r?7;IT<1q)F3@fV|ziN6$ z-QwUWNA4P~wdr)hPU^@G7N*Q$0~Kq3{f_ehE!+b+ac`($-0&LtZO zmaFWG6CAL?oz{b&tt-x)*Oe=Y3Yb_!Yuk$8if+f+Es^A{fSpJfh*RJNM%+mopz8!F zx%>eX0%17Rvk#q+ojcnv9WUyP5e}3#+(llr>=5EO3K0yjR!HV2Y|#x(`|D8rWfeoH zTMeJ|#C=t^^9!SG9MRI+8UhXktyjx}2UHZFQj_VnAY}6&BJ>sYXIXWkrF43@RfQeL zM>UK?H`>#O`AKi#M6~+Mh%MPzWr>%W1Mx?rcz-`k zN7SE2K$Iro8@HTmd$@GR58NQq4PNlHQ7Ya&j=O-Jz0q_$J-U8)_wK>lcaxb9BUC;; zS=|5h;^Cvkd|nPz2@;w@RPl>2nelWfPEJ%O(s|gISoSb9g`EMm7qDqqEvxyWxLCppP_jSshYB2$A9gF{%AamN5F*b+UT;rC5CZY z=>QMf-peZ&v8->_)W_~*%1O6^%20LSTfRF^#|P7WA9umz91AE?yUZ`n&w$Q>&%!7f zq_D`W3UwF!I1KD08mz%?E8LIiIn*`ugTxY1c|;UVWt3zXDx0;`pqPz1Ym~WAj;lNe z-pcX@i_Cg#nP}j={V)jWmfXM$eO2^k0gFGFomQ%3cC7;x(-q+cNUAq=MTR4`Okm;)1Ut1fBSEL^TQwh@c;Nf|M%~G@At-| zu~bSZj@*bGDb`^!o&b5kiJzaJV-d)u(veHW7gD9I;u(`wGL=l87#x2%ZrJw2gM({F z*M9V)AK^+Ke(~@x|MD;Y^I!buKG4X}R=yXyVC?u)7%h9b1vfFq;! z*fqvZKcN$t7GnLD+cQE1LmtF_h0 z9`<9(_mD2A^0JnF!SHg0G)1|>gJPLiNgmCst-#870mpEwY6V6Zzp^h2atFCA>F zX*ruO9FI8~hur5ar{5{B$Kr_)sSWINBV|!QaitMs7gzf15VettZO%3n{G#u&k(m;e z9pAR?M5CD9r>-znvLxzKEepY9a;X8*v^ZZP4^lC?=aILiwcSe9KHk&pgl*K?6`f!1 z1M)&&Jwrh|e zmDw~_Z!H_PLumbi7*HmOeJL&JJ_49gAr)lJ+m|oRRk|7aFktEs5W8AFscx#Sp;{@P zwK-KrUUX#*yu(7UD8*|&?AL81b{^9Hz5r?1t)iFAKkJi+soyeRi(uYo;~v z5ZH|qKMBa?yw&tHH)@OQ`LrCYmWziOr0FID%&a)WXO2b-y%}zqT7AN@#c>mTalp`V zFuQf<@YbFETSxIU#Fi=M%k}Ze`uwb_3Sbv2j?AXB+0o^Mvr%;8=Hcx-Grl<5zWBMk zxEv(WWdRio*mk90ZqqUBU^E7J$~~VX%Xm8J$eB#3`ea&tv2HF-hpJ$Xaer?BK#_5u zo>MV4-w-?2+sw2IXcKvJr8C;xjleCflH_z0grn38BkVj%{#6Bn6&yP^5Lz?aWrIr3 zN`nD=z!amwK|vT^O7u{u8aru7bPa{XA#ggqO7XhMXc9#mx}dTu>zbn0*=mum7Il$# zbe>ie$I>RUWqNSQrv^LhnreM%o4yeAeuL+u89R90%hJ9TC=aP$=$ z)VGb$wnH+bm@OqLnZXT&=AH^wmRBhlF{5X@qe+evPU1_F!cii?+4(KvBEKuLZ0#47 zqZ?^(^N21;gbmc)tco^|>?nvr+#}3M)8=1)jooTKc|8C1$N&7F{?lGj)VFTkJUTjp zshKb4$H&KKr)R93uuM#jx6x>{e{g`UNR=Uxgupsr(MF>bCsB$-oN{h~0qP#MMT@Ei zVKAG`(lmjm`0&FIPfyR{2cKcx9zJ|nQr4?&(F;4%$U~dz0jNh-0dgrxNnNQ&4y~N z;O}!|SQ_SX?o}D?#Fd#mrZizOU6S6@OfaQaJbY#ravy`7ps8HA0y!1FwikKPdN)HZl9)zx3HauvaFsS_m3X6=jR;# zpsJ4jFSX_BmI559v$Gugc{Dbnm}-q|uy1=dYYP7!pQL4v#<3e2Y1UlKn{3rLElird zB|o_2hkYTpWXR|P&W$|@{fTF-*R@cIkeNFWEMvY1&)$+vr+Rt;c8Bz9eu%U8;`U&D@^O$IO?D1?5*Q8RS&3W{Sf~ zoTPxibSNs}dzuOi;Bgeun#j*QT$mJgSIebnppYoVw)D86gHNqnwXT~EuE+Ldq5cJR zu#MD)bbu(>wpFz_BgwFxxZ?v4QGYsSwliOv&mTBAgX!UL0K6_sG_XlTM3pF{*P9gF zAz!5$HojK?4K?1R@=N-+^%}OXX{CeGhR^aNcG&-oTE=>MVZO}p$kt}D@u zh@3O;R1*p)00bzK8Yx@dvRa~qdOd#4ZXkH7SAa&VmD#a&gb@#2DB z?E43M8I)?Yp06nK3=M3hw5REa%|>}Qn|0%nEDOs@g7F>&wS>NDeR;JxJ0(b(-#wXx ziCJ8=r)TAA)zTiBPST^J@$s$f-~iqQln~$Y{X=^_D;%@lzTcViMMh= zP2H^5Y-~>Vr!8&Yu-V|Y%V(^)R`;Rb)ksB#%n+>bDNn4Mq0zM;dSQU%Ev2I&j50Ab zKudJwM0EUg_$dWJBt5{;(wCzMw3#(*S3n*`!x?jeNJCT;d2M7g2;b0{pp=fbQGyPh zY&>NvNf^CaRr6p&KZsg~=E-sx9`v-a#2_+Bij*MI$^AN}Mn{^BqG@-P4F8}GkQY0@vls0H_B{`Bb+pQX7dhTOe-myYtw%ZumF zpU)RdJyfI7i2j_e>+0(2{QSIP%{`}CfB~hlAjq=WtS3+nNWby^Hy%8Ecz%BN=+UDO zfBoTq{~!N@Hude>cmB;e^pfkiyf&QPB>xdEz?*CVdTw!?POiV_^-{0g}Ou~iEc*8|7frNW+S zArpDYbTr>BF_58i(Ja5g%ajiF3~QD5@igvae~KT%BU|w(3f(YD zf3ZznYsNtLw#AGMB)zVEvaVGf#4EGYELcKerClv4H&CmMO$l{Uj9?QSf_$Lhw$RSR zoI*mIL59lE<}TLsQ;Kq@YvLz=gnU7r+0lOa{0oC*mQnbx&o-xZ)lvdS_rMhiZZ?=) z5T=D)*OimEzIE$XfDkYg{A)IyqQnd=iq3=>ddhQ9;|eMApl9V=7o0gIdeud-B3Ohn zZ|!_*g#-YhW2NnMkNh8rsLzB;cD<%^n~suvge2alAEBM*{0<8!0(TVm7>#4#0j+OnooG`JU1JuPcC!KYRh>fP{@6MfV9|HBUYMe@w9@k#<&Ct=+P)3yLe_<93may1 z?g^W?(Pe>h6atT-FQ&Dd{0dN{i(NO(-As_qS)Rv{ZNcz`xCIELPE(aqSe8bGV3}h$ zGam^>6f6~~8bWlGf>b5Nxqwy$Pr1M7p1xw{x}*NHdy8QPdIRUWPa-Xo8O2>IR88=s#W@x+3 zvfZrdZbW%9yR+A?j^?^5&zqhOT?GLMHvp_KV4cOY!(_4_aNDkH>vBGC=Zm2zZOcLc zz9JkdlQg%MQgAvB<2;}2?RiQ}AKst7b=53QZ~Fm`_LfBm-HVeb$mzwt-l!HNl(Y+e9_S1zP~>?zBN6$olf_#M2n)jysEF} z9cN#h4Y~n*4*+(ypB~+c_V>LYY**|0>dF-J$g2sT25gOM*g}Tlbil4L(%G_vQhU)b z5GH5?Zswsfbs( zKIV}fr66a}Prv`Kzxnp<21 zVPt%Im=_X5&tH;VjLkc|gbNplwlw^L4l`qPq3yEQu`}v4E}J??pOSI*psX zs2fMfJFxn_ttB4NrmL+Amfk$y|Zzj`}HY4auw2-^HEdmJkqyNpCpnM2zz44?B z_x6+fcY&g>=C-OmxZ0xm^2MJ>_aEs^+0YWzv?B9N=Aema$I^iCujqAGp_~AXWX%3( zyA$uUuV~%Az;!%qsX=+09_~*Lip;-k7RBYJSkY&qiV(%ujkasv6(nuC4)fa~rOFe^ z=4sPH9%?H#1D>)Jemk&!1BK)mt|J%ln@w;nMlv0h`RKqswMH8|G zA)q7Zr|GSdG)Z}|)KO%5P9!J*wN2S~HQd7q$G|lqAz(*Hplf9bjjcKrkP@TJO5#?F zFMi6~B9t(+eq%!2^pKjST5N1HNUx!g7Uz2`aZl)of(2zVp$bCYT?QSBw$=iP7|b9g zB4VDTDhzJEKfCjRase*_%4CFen(if!L2lz52)=%dY7UB6bhpvrhDYP3tV@6BQq#tk zZnIZI@g!ouFZsFS_q#C_-Wj$(Jr_+Iz#`zt_u^2>jMcGN7(*9j=`R)pQ84aOEbVF; zbOmxBIwB*`w&DQojx3DxAPq3gZo({%r(+rC)x466VZ3gpS|=jT4-bc`>=x_hVooWZ zh*)14YhK7GRg>G{!NYL>j)IPkt`_sflc(kBbG_LRN(J>EvuR$C=O6$c>?!*6qeG3@ zE5^sS9gaaWE{ReDy+J*j(DesNOkciPEHCMq$TKyaB>Vdg$DsL3FSakg*!SB_v5exm z`m`OET!Rm-qGJFGY{l!Z}jzVyhC8<$;^Ld+!qd z`0UfqKKb<1Pac0#Y@otV$ygW$^zSUqma7#fS8K;fn9XK+mQ#G;vWjcPTb_H@v`2X! z`7;m=!9K~~fB*gIWV%?)HwDGC=0`vJ(T{)p<2=vq-M#nquYdjFg9o#{{TBkt7$V!L zk7^-%c2?~%aR%B48x*6AV_*YgZF1v?dZQ>T#vm}w-AkUhfdI5=8-KY}1kUJupN;)I zk0ZZF`{3mW1O7$K1Yi=O;h; z$^ZV|_a1%p=$pUy^?&y#-~IY~@5+I4swR|%PGoDEP&9bDxA#?gV1sF-5A4!6&zJ4# zvwr^Ez{|}ul(xkk1P?H{6}VtvZ@`qD5!Gw90`|q3ZQLo`;so?VPsEI4(2Qq!3?rOh z!d3{?`5wU}!}eJ61D%jIHr~wlj>lquq*6+Ng*)M_qBtM5QSR-dv8fW3#Q{>qvbRgE zHr6ko5oyMOH}cU`QT{MWt0bnBy^rJ&S+IBM(|Y4=ZCZr$(h{(<5!V_Z^nkm-4jIAz z)Tr2qsaS!qLXpVp2>a_mydVKz8#TOYtoRbb+ZJQI&!I=Zu6>V@lD2g`2><9P7>|8c zsI@&3=DI92J)|H+yMPYwzJrG*$0Wbc+Rx4(qT0ugoKoABSp!BhTZ!M3yhsK^egm26m(TQN+=ih8oBApYH^`AK^RLq z_x-(lzzn7b-(7dGD5G-@6D{=r8kCz1iTC zZrwS$b8otTNME2@EQ=>k>t|=SYQiMAAW*SlyeQE|FrnSl{U+Zf&wK|G;w^ zFc+gm7Guasx^$8AO|V|*s2^CU&r#taM8a-MsQYM!Hck>kf)f@-FwACx4m}zCX3zp| zsRJ&~2HBA1ec0Ky42IV11`Z_mN>EsUMzDs>nFte9zc|M&m;U;QgOk%J&?+V-Q5KRP=*bCzdxf@2Ih zL#_AO>FLv_PwTp(eMfm3eePnhSThOFm5rSs6Q(#en}7PJfBNX7N8|B?e*EFXhu`|v zx9FCA^2sOP|Ni&?@dy8Sc6v4*kLiZoKE7R5^=$7AvS*e@z2KM(_iN0rVJzF-R)&ez z_#QzS#PE*CBwsn3Toj{w6H{j3Q*vQx87S1%+SY8=@n$7LMSmt@XiN~?q0n77YYZgP z<$%(=*<4*+QQAb;a72e0#!XQ%CX_=v+~u0|%=Y*fErQ>E{P8b;_OthHA3R8+9s0AV}|=cY1;+G7Q)Ps@9)I0Zp>vr%;$QwvULk_Mbyd_7^$q7%5Afkb?RQLmTy%= zJ#LfnU$V#(uw~z&2}idjfHNI-mk}s7Zmq&Vw>BUTQ{bmyDU-p*gCX27*htz*>>cFd zD3N!~7DdU{@~Uz{Hd|ORvw&FlpumhF44#bRsZNqy+SV z>8;xOq!@EO|7>^3>*rY2zkwDicN5*N0zvnaf}lT{5T1n~{l?cN9YvN0X+h5vO(Wo2 z)GDr6q9~DPD8{E_@4)oumtb1eHKp5I@l9i1k;b_x(Ck!zP>Mqtq_hEYdM}G0&m#rg za_Iyr3sE(yV^@(t@pu&zwztBf+fLR_X4L5xQwXO37tk3Mjw8zRYC2Av7H)_^aIHD< z>I4%HSO(#i_|Gy>(4GPX7;>l}K+=;%#|u@Iah`$h!p$j7aDT&n`;JiyhX&_;4(8p! zAO<}b0R~S3=OfI^&~^BP4ned@9Tll-+s%5lfuCgua!eQ*Zb_(}OB`!qb+noXIs8SuLmN3#?E9ygh8un#Z#+jz^OTraTt&qCj04`uswKeHC^?fJ^j6=;OyB!HoHfG@)w=U1TOGq2qW+ z<31>duHKwKTR)B{0gq?<$#ie>)`NPzpzl?!3rhHKi)g6@ZA+hY`8@hqx0kZ3){7@k ziu3b!xuV4kP99TSA*G_t`t&UP@VCiwjppNeL&s*jTt-+P!p-L3!LwBv+K_Av-mF*U zVgV_azMnt-bSP`d!pEqJ`TmO+^J;17_`1Am%aQ=HU6n)GcG9B7G&zDawD0ebi4g{u8PZ!b9ul9p%Bq_2{RyRP~!_@0$wb)!-Y|hTh%c~v(>>A#@ z^vPk6X8G*oN`GiD0O&_Cw1bs~XB(|u+u;b+Zj!-; z2apjZ3Ix);uw%vS9PM$V=^q~<)lKhh$3l6G&+}n{i1TEyw(+)<)W8G#-Dd$IS9evu zWT_M7VE~&w>?!nn(n1A_yN1_ry}AOD9_QfP(6=h+7%2LUDbHKebcEyy z>D!i0EO?zDV+dG7OF7+1E4ITpR(y_C-sg8Jpi;u&5~~7h}Q znMB?+F*yb97*2^H0UjJLUaUk+udF>?W38G{0C@m#P~6t*zT2!!yYge35D*>j+x>By z_`yY#T`Vbq7iDMvzc3!7xA*soM6f^vqH9o69i(~8!GHWRYQf)*tL!V z?Jc{kjc9lH57z}XAUn`kx2EU*f$a5HS z+pxIdtKcvP_+fP&gdr_{_>3r3!)u^+8v(-S4csLOxlLw!SvG=%UKF~`M>yv4@^ZbR z5MVev!#q5Dl;CZhp)MtT5rQ4!4c% zh%1Ip3&?mv;3HJVi|SS{YcG^t5*a7`Nc+L_taxLCiBEjWQEi~YqzOa?9WudlR2G!p z!Q&oKnDM$*jE9sW;O++oG`cF5(ZYMRsjf)P1XQ!4VxQU7XYDAw!IcLZ1<3BCerkxO*AsiY|7(pBeAp5}_!CF~Ync49N?R6g7jjR%{6<}%}j9RCPFNvRMu}WIf+-&Kkx}NHb8k6>>Cw(uDR>84T}{)-8Yo_;Jvw^ z7$^&mV<1>`Uy!xa&j<|AdSFj#BiVE+@?<0vy4x+t9(CPG*+HRilo2qXOsXhrjS{c- z)vtXi&61~|oUP95pa0;4U;g}8cfa)DkN@qT{M$eMlXt%KrB6P2{DU9-kdE?(;#XZ! zQgjHAF`+nCmL-KLLL|{kQIa>s#OY_P4+N)vuO&rmSvk!+m>9TVyjDlQ|TK< zzd{C1ieQb-4@ybA*=7nplKm&*s=W!ePQQ*?b9kb zKR>4rJJ{dPvW)(SuDm7)yxGJ|pmFo-i2FS0OskF3o$+)+i?3R4`pYYo!3#hz<-*WH zFIqkC+pDHumP3t!Ko!8Ek|4K)B$ewCxQSwMqirJIIF9k!K<0K}0E9c{GJ_r6!90`2 zxvZ-X3un$q`(LV#LUAU=UMvq&J0009lXPB&NZ;{aZB(^V7Yk4KCd_p_t>5@+Ys;~T_R+CW74u<JZef8l5atNw1DYn!!~HYzv_pEy|9Y$J|{qR$O;icg)|L zi-X&$P%wcrU09o_>_ye}?SNFkQ@iQwS87z6ef6AsHcB!~d|51(w8p!(wOPVVYd_2L z>2yX=hVKn*Vd;mQW-g>ALX2+Hk9S6pe4f)N4g=N8=(ytV@!tm8DlHPW)x7uEdn8B**pnnCVsJbmyMt~#Kr3(Bhn zT`#H^&2p&cog?tL_7|@?Psx{(FiP}`qFOGu!a(AtW$lf*LeIWbrFL(|x1usTGe03d z@5PRbiCYIn2&-4MnJ>HHto1U~al9s!6|<0`&53DIX}!j_m1)im9p7Mzo46CXg%*1o zigNej04n@(M46S!;%GJnj=6JZc5*j5nD%yPFITI_&z7H^wd)E_Ysbgq2lprUPU6fN zst8vH*v_8Zh>b2Bxsz{aMxmTu5v3NJazkJ>iU|d`aaZ{*1W;RhB zR$Ji16)b3o_uFk91y?J$iYeK14%{72ZZ(>$BWqGLq@NjNP)WZ->DcseE#DS4P;#K0 zjUomceXyfpD4|@B`T%@UkoM!_!NGwtWDABQ;yq9Aa0douAlkIbh(HG13L89CmUKS1 zelTPSMZo}Wgd5sSo252M8r?qGr+=OuAN}HoAO8GjkDfk$biO=|Qg!QS|7&0UIz^|4 z4Tty`ZGoRn!%#Vt89hBhw`D zooYLM(NT^(#*KI|y@?QF9WVnF)0a^M&5ZSiV%y>V{=Ekeqg!|8emGj!!MdsWHUT5` zooyRaHKHESOVZ4BW0S{gZzE5>Y%3&QrNq4A`S(V~1;+ z&N|7^y+{+Y7s%tl+mA#R2|{)hS$y`0^k~rze${7BR-$Q}JyAttyf1*eA=p|{9oPiT)ff>DmdC~o3JP*}WwpiKi4 zhH)+jCa^Uvy(fjo?Ya7fN4bMs&VzyLkSJp}EhUk#_T}aR%ei)-I3zAnwf2Uv(DgO! zW{#Qm+e5k~(2zCo;!q0^S$Y=EX9aY1E%JL4&$-y=RNd$|Wr2-4n@yUA!uNhO8dFFe zjbTi-ofv|-(x$*aAP74J70!iwz&eI8nuoRnsR+d2Zh=Q7Ai4)z51+@M5(i}{F3jhP zV!hI^`h(Av(1advT@;uLiV97~y*0g6sx}@b67n>~G`Oa0P@A>v3#DsTbyeF6)~oj6 zo&)-!@+T@L#K2PKSA$oJB=c3y#o->>%`h5iMYoY{N%%nac*ZT|kI5JXL^vnw2*d`E z(u%tF*Xt~$bTNtOOL4_)XdA+1gcD){^K@eJLfbvJa2Ri^DsA-!?s-iWSd zGV1`JQ6jWUGt7qs|VU-WoMXc93wMIBrI!B{(W6xb00xanSkUx|Eye8~xFRjDI6TZ~x)j^mqFY z-VO-C&SvXpXVukZzg+5KqnieLEXWpxbIE2f;hJSTwirxdAzWd4%!n~M5%${W)!T_j z*&Agw%Z+GC)&m@$EQQ6perFE$(u=oZZOY@(V0806E|n2z>uS$bobUC6?7hIF%jDfE zonoyzk7no^KHI9xPyzwGud4bELyQM&w>;-7kUFXbmL0UR8GweOnIwFF6tB5i6A$tIzqB^-XiIQbkJ1WEA;v!q(s@J+icPNH?t6LMh9t z$CSi}^kDtAi0ch~y*@~rc-#d*GmaoCdqAsz8HSbMF)7DBaDEd`e#L4h03QVYbT7U0 z;Gh|*(P7vQ<~P6o>Hm3o`IRq!@9t=6_2Ui%n(8FX5s?FZs-gmz9ougZ~uI5)g zB5U)%zxTZ#{_uwcW#0ehH^2I|uO1#8j>qG=stFHOP&gA?LJkk+K=2U!2s%e9Y!J*y zcH+gEF6@>S%40-aG7J15jbfO!2}0T!&L3KU|0{6{cueV%xV(jl~DtR~Oau^;d_?FQ60>18zg4_m1qM;2Z7z%o6BKF4eD3%Al z920_porc%J;F{K&7ZF+*WTS%>0h+*lT2nw z6U34-PJ$$bm0c|p&yNVbwW4iNpO}mcB`!ea_WB&zmMON)FV8leUTrp2b3vK4=kL)b zSq*VvWK?xoWAZ$jPJAOWJ+ghBE9zFqN{34vDk2zRs3^Cl|C2BurC@g5$)7r zUFgLcJ>4ku=n?ZmRxF)oxlm|WR)ioGErxtV$umT{YdW{eqM_$KnlAzQ}oD z=QU}N*|TU01sAESPOAbF1(Clal)bDUvvtjS`JH#J=`hqrzW`>xKD7Qbv?)41x48J^ zGLn}kdtZo%bKL~np{`p(GYw>241|gEoL%k{mm|^|rz~VXzg#UBbXUTN$BRH8MjS?X z-~*B!KZ7{*;|TJnwEdV!2z5K!P-zl7TR3_-MV8fa*|iM?#5jPO5QHm`+hN7D9n`St z5d;xrHBnkoGD)4V)ifXwI#fe-27Pr~LYNo@0A-o&{tA|1g(4f!*#$04XZs3V3XvkX zBq=2JJ=P|tBc^ZV>Ow5fR9#CI_uLIBNA_|0UT`#y_5Hc4jf!Wrm zq6~m?o4(U+sU>}R#A=nM^a^?w7^STmjn5nY6db!@Et-7R?csoOU4_51N!~AGJKf0Ce?MsS%^k6TaUw!o1vk%XfPv){1 z_VaxI=x}zppD?kVo)BbU`u^tk*1Tg}Dgp;6NVs;O(Tx`A2impuL0z-AD^*Ef<>##T`!`zjeHSYp?6|^Yi%+KKRA| z^I!k#kAC>mw(IZRyL)_m%o1@8PhxJKJb6-8puXR|dzT`{cr?1Wyr6Tu6$aij-(Qeq26%`jqwvp_#+O!{7h?-~WT}e1~Allh2;~;0HhW-uJ%u*{7cp zc%oMZEJ{cplx3;Y$;7Nf9I>~&OI#J#p&QnAP`o3zOp{%a1Ac^bU#wRQ!$|7{Q#VOM zK@~U;8a95EK?MWxQ;KU#PB&};?*hUx2~3e-wA6A(&G{A32hv|nClmU=7nhgMpFe;0 z>`5Mndk^m4IXa>h(XQ5dz1Ay;forHe`UF>H975F_t94Yuv<3?JxQ**|9TF`w{zD_fb zwgcS(I=GSj0jtun5@D*Gu(*Uf4G(f->(#wCH9jSkSqz#J9h4>N(cCA}eo{(SelG2xM&NrOL*UdKe+8wibN3?Q@6jlVskpVV}PJ7dtk~wV^;q1zU zo4)3Pr($N1xaltG{L<((A!f6uc|J<>5e2L5NDl3&vR*D1S65eMv4LtYAdW;B?qSo| zv&$N5#Npi`!{sZmwK}BL6q@1Mzyq9aYN_T(!|g4FdG{!^P_F@@TSA^5(N}MaTZTEE z^aK*9a8JkCh_E>!_@wQt-aI!wL~8>!lDGCXap!A&CJW)$$kVaVjaP$YgK>>*Oy_!- z5_Ad6l{h;ih@hs2Dh+IyVB&A5+3d5Uh^bMxY>I-ObVIu(%Y7u%Q9c^eE@>~%{EO!S zEqB5|;{zMTw9y3MaYTm~Etu76CD?T`!JK?F8W|O;qAlwlM%50HdCkzs`!bW|r} zU#GF#ov0ET&P_LL3WTufg*TnX(>=OtH;udLvtsty3s~=ut~){gkFt$1&d3?hl9EoJ zU2cQXIKN|>)--3PT5isNbJh(0jAFpO6WR$e+%&_{Y}_x7`}L+rMW^qWWu;je&ohoV zcN3AzZ9(#;wu1OV;O`36H(JT!3ytFKb>I2LzLPu9qIaTH^5)C72?Bqy-Pd8!2rLbD z<8plnTGMF~jz>@<%ty2wDV-Zu^YY^2>d9vpA3t4wx@e1joJRTaBt1T|akwrvT9gpP zs2khsZ7I}aH_wi11AG)IIKA|ObqadVtHa1oA<#+3NR9!bVbkkgdA*IAFjontw8Nnd zin(P$#n6ac_>EO<-O>&<7A~Gm4M!AZ*hvlMKDdqAl^&4gYeGUM@M53kGF_P&4OcpD)^8 zt=DF;EPnR0pZ(4MJ^A`KzCmc?&Ye4yZC+eFKY#vwxm>bakv=&&Aym||OdKC$gQJd! zms>;SV;;#hrt_w{9JsWa+G~eXo&p zQ$kqHC|5Q_zku<;j-R@-l7BT#w67d*FDDvyr!lk3A$IiO9ok`%5M_y4#XQeM@S~Gl zF_fIgq2jN)!lK(nIpV%GBWMD915@gljsOT`hEZBPID$Z19D&ci+gf=-Q7qP*wq40u zu?HIvgGVW4U-n_D$BCvW3H@`lJ$;y4VtY0J~@_NJ=6$wVJQh za!ttDr?WNnHmO>MvYsZNX|NvJRY3rtKwrO^@hJ3*eP4eW$JMoNGzCR0K6-s9n!})o zpeF7Tir=9V7tz~Bl5qItMMCM`%9&<+Oito6kI<8kIAvUPcG-a3?N3%y*lyz&d<(|) zyrb|}0G5p00%7E@S>%iOz%sFyvKy=4wH>unr7449w8Z5 z3UaKm-l`HjMlTUiC4d3N=a)FST8-OApO)o{f^!2-4qq^kH5_!kyZcNxmd&U2n; z|5GRFy z(w1!&gwy>=e!TCE#>=KDo_uCd>h%+keg@~11}SWS={R6MP&Azyw4hUhwiq2Xbx)YE zqnv~gC#}(xa5_PUZYaW__eNz%SjzZ=&4)f(ZiIoRgCEb5WJZsxZn~wuYMKocQv2R^ zHRWV%S%N-QPg|9aP+Xg8wKtfaxjAtjV2RM8u6wwhHWp{1OAtH2X5Kh~Hu$Jz9 zjf97rR-l>1Z4)*vJDZ^8gsv0IYoVk=>$Fo*9qk!P50f0K>X4VBgwYNyWk*_b12E)y z^ic78cp(Pe5Ypjs9jGJ@u}8o#CWJ?DCQ1WXtK6RLKltYF|H(i7;#VL1_=CUttG^-) z@#p{XKmPF_|M8c<@|D}SZ-4yp$B!O8qJYJ70|f+cxgM!`YUn0pd7XIhqFl|jF^t7^ z?b+E`Rac`=#}vc}I^4ZWsO28L^CzEt`kN0w{N+FW;vfFu`^U$}-~H})|C|MNZ%lfi z6adrCzBOhg#g$TP-|yY@^$n#C3n_C7X&xo9tpn4(lALTn;N1CZiC5RSf$frWpP9{O z6le$5Ii=_kaH)m`rUtqa0(zUGxLhoL`m>+uy1JA7-rX!ap<{--_&6xy7&5!N!hpTb zHtb8n5Z9wO_PQ_dGIn{)CVh$Ex`dN8Rl*OX#?86G&3RYf4g zON~7kaT!K1vt)3N*rLZtHl$HMiWqNb%2=d!P{xCJ*36V;w_4P7#eMt`PCOk(P3ft? zoX7L|Jv}ZQuz09}^O+~uqyuFs$&y>Fd0@ac1HUK4$R13Gs=-!F%A?b(j?`(W&OkD= z(EFlelg>Xck!n1RGk9Y~@euer8O&&8N4Zz5pk1_7w8AAn1ahxxJqjPR3h5BaQ!`4@tw-MPD`r%nsw zTW=w@L{xioHrSKi7L!0N$`#>IeTdKy*Qjks+z`q{;>c&v$v~CGJROs4JCM&^Z8wN6 z+~%Z1k&endOCvuMUc{2lJnkv4uhp40)ADxXOHSPBn)v3>43{b)`VvO5Q;uP)#9_T! zEElkCqbvko(J*g-a}fM5kZNe-OxC$M%o~{JD~<7af<4EO;KE-_Lemk@q^}k9 zE$)8rH`PYb(+b1b6_@;=&$B`KWv{)qgP}=>+%8slK4C=L&1~q9D+;Mc>a>9%YZ>GLr8cyM+uEy#dB54{Cr@lO7gtyMVxFJeiw+Ku zQQ#~J=`Mzja(h!N>;I2m*83OtmaX?D8r2(_N3VB;SxZ7V0Ve}p>UmLL%)9fa{qv{A z)$D+z5!X@YztMC zia=A%@`SVVVS;eh&~{e)^k;Q1E0GeAk5!n`3+O#MVO!dMOw_>~A-sA5MogS^(Mtxa z;vj0^;10WuG>!?}6W|Ilt{gzwD@mgLeF(g~_ug05oAs}M{p;0gwSTbhMEPlF(ZNld zj_?OPtJBldtp=d=oO{vDF^D%#-ngrCA<_K_eaiET=kyXfkO;E8{r21Myz>ryySsNk zq4&DHym)qcN@xkL7<>EQ{`R+H9){p~Y)X7|11G53+C|_mqPXBPxSQfMH+W*kBM@VJ zDD=Cg6dMFyd+dP5<4!sz;0Pv$*L4kvyiuOdW_z%2xVl=w22a!P=^CzB9M8F7)52PB z0KVeBOTY2;J4w19#bwhqeeW6^+xcVmEPYL->vQS>FUH_r+FFviPau>sfy;#_u594K zeC|&=@(n@~%H?9{q;8-Rh&hymdFmdJ8rZ*#k-vUG#$fUNOt>L|D={-YQCzjTo z59X;HXla|RPc|Lfi9-8xlMYGK@Uo}v0IMeWw%VRfk--K7lMRLTL7Ai@OVs03B)*x& zpy=@o1BTm?R1dUpp%ohh$v7eSzZTwSN}kj555gHT9e+Xl#~R9aMxK|o{bt#om6{e~xIjQjXmAm1$O*#$SQ--WR4CC9=2T2!-T-jLRx?O06hZv0rLCnLr$_SQ1jn9oyAHB)n91~2lB7wNPo}e!Y4vU>qa|R_ zLNFoV_6MRaQ~Q`J>Z2Az7uqX|$rMiwcpG_&KJb*@%~gpAI~AK^y;{c~${h1tvN`$ZgSz56v z?W!;}209Q?GbPh-2y{n@YS+iRA_RsIrhCJ^hc+D<$}55pP@C5nXCt0t7+}<^>tSmQ zx2BkGM3yApWV+^o(vE&4&A={Zfvm1*XqOORlB`pHO+$J07j6!-9muKc1|hZngqpRJtArxWy41u4t*!im`Q#jHqja zvM`NC#DIgFQX@P>K>(hPY8CmgMnVshvL;?V{OJ@;)vY3w3K1yh*7&kmj>l`wh zs-u{$VvSS5XS++&b5hHGgZ>~~_nM%ng4HM^1&HqpH_WIEL`+#qwQI_@>guMb`kJCu zEJfHyrU;6)>O`VuQI?o6AZ${>Ee>{#D9P+@trOxC=$Rp(gqOVS#DHt=Y}n|qtWnE{ zIA9BFVIOU1PzobLHgtZ4&>H9X>0zuEU(RPjk71_=XjZZ-D(c~G;tYX}vVvqQy#C&M z@BJVD;XmYA_V|;>bb|lw-~R1Se)5yI?!Wc!d+*X;J$(4^(@#J7@WbC+U0u-zBzWNr z))h}+eF5oeE9C76yE~#`#XWJ&<4g305oL~}5q;-(-hG$u^@E2GpI?BE^EZFrwjUNQ#39JL3UtX>^8~VO`dwVG81dtTzwyiZx;~EM9+Kz=k zQ2`}bg{%Ct?2mm@Ve=KBXWzJ+UYf>p%Dl+7HNUxL$_|bjvE!>X5?!|%BBiWK(#fV!6}-4DhK{788Byvdu3J_+W*nu`CJAg7Nf^ux zz1Q~w{awd6?zJsDTD9nMhLkze_YJL1{XUO0tuW`J0OvnJ52WsO-S&hF=rf{3*(~mT zbrp(_l(?+hOvrtfCK#YKU^3r7RQ^=U@nDbqWR#B8WJ(*~vE<-|T5jk8kB;{uJ#Np= zyQdAh@=*O^vm4hI-w}_*ZYWy3*>P}JE8EKD8nz#0o!K~4QQ)y5GM!A3u|e0TZKs-M z2*a+ei`B9zOIk*>3kkJQ1g9n88|XW!*?z2WH|wS~^cu}nV&$yK&35RNM-#QA3}?_0 z`lB+T+(#ojDDI;3MibHrM^ z)#!HpREmRifZe@&_u$~*{QP{eSg@HhN=J@6!Hov#I5)6)clLEn11tEV(0xl6kwlRq zj#J(67((cf zA-Yq*i#kZcY&4~O1JjRN_AxA73CAq1F50?;5|Ez`27Yt|8h}zbyLdfJ@m9sRl>{#c z!+X7K3pyEOv-aBD6svxIK5VZ1y?u4}wj?N%!lH;y027WVS_cg!tF7HM0Y%_R91?1u z1lsfI7PMfPw6rwfi%CmqIy3Kl#opS8x)wN-u(mPhJ@k?X%F+}P!E{4tMZ1c(pZO^& zIzA=VK#q#_c<5fNHqeGHE5uezh4|Y!e^;e@z49TrJlwO)l`9P!qmH~FOM6HWZYUhX zh6Z^HZLCOaRap>tnEZgDGq(nsrlkl8MITDtvot+X>BJX{P|kg`UbbaL|7xEUUUVL3 z(Rk#IGcO6DLni#l5LQEdXxCkRu?g+}w<^pIxVGs_ zPERnz&|?VMd>{J}gRZoM;6INFfeMtP#W)w;UYowI+7*GZp#*>)bcol}^UpO!p)xXF zEOG)$Z5YtktWo~%1$w>?&1}0ciUYpO9O)vI*GURvEVMlsIy1MK9G9XXH;nn12qmbL z8+H~%1%=)T4_a=geb{(mt7N*JuXn0nV#_3dv7E#o{?Q-({-2}PdudIRn4u65&(*WIPxIpXT<-y;-Tqb$n_{jb+6-Wts(pM3J! zXHO_7-MV#)^23vpKczqX?W5oR-T(Z%fB63QfBeA*U;EnE=q`QvD_>zvbBRtJ#AYM~ zUCK%WIHBBRd~MN!VGcmo_DZ&iOqmD@&)N;VVK$W8(fv-d3>6JXd`T{$5LgWYLUReU zu@w{*Ss9Q*41G43!ZEfq;TuX!Bc*O19PAr2i4(;hgw|0(JZ>%B@N9Mk6z_G!w{>}D ztl;S5M!(pT42ggaC~gLUrNb{xX-UF7#aAr_mZl!sR%*?TT*jT)lF2!KC`^i_q5>x% zxRpzjs7?@q@J**>QH9MWn9l_vvnTU?s;I@Vjy94?Tf!RyjKsJ=6ZfXo$N=xg#>P!nLsiVFrdp)H@R>);2 zFGBIGwG%U_LBL!LTNm=k5>U zFot3;a8_^1iVjR?;AiD-{QX+oaZ4x%GWWLP>sUV5Vim4Sg1h177a)RQRMXn!vI!!) zTJ=p`q48E@m^;bR@hF|mvXt;cj6#(1hB)qg2^3s6pm2sPT|-+~d*Q$W;mT`bTgRq} z2p|va#{whNLfRUs3pRX%i9Ju_7{u4W&$c#dY~0&mFevF7lt6UT(KGE#++?YVlNL(h zaqkHx6gAGp-HndZg*)A9f-90?l0W z!fu{0b;L8X6j3!ZR#^2bh-oKfBiGA-Hw_C|(P>I+DW>;it4_Cpo%RbC#i4LYNdyJK zAW8@ZjYeZS`@tV%L&>)7HtSWfSyDcU0$31HK1+ys7%CfR6|w-KcWqMUT~qzhGBMEB zaC~pN8c4*ql~_EdREV&rrLVKUuWsFvxAx>T16y6Po*AXkqd2T{3jdff_oP3G7Jap|3~;7}8~dXz2bKHfY7}ER>1-vCcE+Ef&%==ek- z1if9}yma&=gmbev^6~X3L|fNN<_0m;3{u#)q4*B{nwXMWfH8bL0$u`giyZl49BZYA zPI_o{1w0D?#T#1Zw71b3gJB{FuAEG{31ApQy#`O&%?%9;FgMv+rN!K2m-9?1?VoS{ z-tV2ApHtrT?CCT5_fLQNQ#xY5{N7h6+5s{`@(sNNB;-6W=8UH^td+ zP=H+*9w;mDr&9=0(DR?qFX!`l0UwD4#i$IX*)|{LPLYq^Xfa=|SF1;l9zB14{`Y_X z_s>qBQTBLpa_`oylPt}ULa@bI(s0 zUNLTwFQq%U2o`P#LXl4-9k8m_RZZ*0Xo!)*m;+-DzGslt1?Xu}w8R$*tk^5_Vo~wx=4i+dV+n<_9ONC{K>aDC+%U`YIE~$?17@e1 zy6ao?SD0XpqvH6Mh|`F2iUztv5ooH)tXA!l(*dHKn8XL1+ZykATY+vD{pqhLC32NR zI`rDkqVQy{?TE#-^CGfo+t;heQq8iTL1vp3!77jgrLYVp-LpU{EZU z?Rrf~Ic)={*v*}G3iA-GYeTb|n)%3VBCq3W8w4!C$_8DUqC;r~GoG+iv~-gaOAzv;AQeV%vW<2crg#qUzFsW| zl(SS`C%uy&^Gh4wpoif4{jYrS?*6p1Y9sr;rupwBg>&LkZfJw&8|*^Q!qn;FUW@+LKsF@#pbHfZPg9| zC_l7e$MpNE<$-XJAWBdyz;SeOEi^XNCdAhPiHELb0R3OO!Oqw1?%z084Zaw!blQck zLkCm@!5Gd7DFrga>l1>zu9*@qd9>ZcGG?nl;GTZTV`}aTo_#?J^E8BK(8IDWj24i0b){^xkorjuXdAa@l1A1AKphZygjH)xbqL}va zM;|R03xYdQoP6{B_usmI?^nP2)j$5=AAkMfuRr?u(bvBAHM+jNy~8jXDL-l92ISNP zUsM}80P>8N3OgYI726BX+e8Z73SpJDTM}|$blA6kVL=*U>3>EOka zp@`|ozx2JiD06#Nlpp@~H3O)s;s*iYA96?bkruQP5fc4 z?1tV0gcUm3TNwB%N-QW?!w13kfmaEC)qASxie}UFWryTEfhI^EhDq-afFZi3d?uA* zYJ>ZJB4SlTbIeZ&RuVYDJ_5NeCs>k9(tHfX3)d&&TMO|hG&sBgdU6A;BX2xWNv?X! z?lWV0)N~;9%eAFcxNAWbfV`=FAs~UFRv}@ymxdX;99y)m+7dN<({;OgxI;WrY$q8! zcs2DKuPlv|ndy33&OAdS{rYxj2D%xb6|_w`zu26e78lQT+Xl)>MH@k|m@Z8ba1ldb zSGiq`?R;d*Nc9fI2~jK?YgF}x2g=C z`-RCR%2EfG%x8_YA)suPOWFu#`3NzZIb=?grewm6&;vXSxrX1{oq+lcFKfd+pbYHe zy*$sa6BoVxrkcJu#S}^gL6hrPHJWl@k@QyTj&9T7`8!dkSEX{D$0X1#Ya9oI-(ymU zP(qf(M~Bh=Q4mtxuAr<0N`YY286Lz=Qd+wK0k*+H-g{^UNXS?oO6kCJ^gL!A#q^!g zjDw?|Z<3foVryzhm<=erdQh|5B1_2~y}B&nH~Ig@4`3zPsU>nX-?8!HRhl5G7=b93rb*xjU%*nfyZ>y_8FzvQ zcP=?cXiP4_hM}$MzOGE$Du!c%Hzd&1AbT0oPPQnzgajcWXhZ8x1`#1Hhz_Jq^xW-M zI!Ti}MJ^t8!5|YKGsE;JQIZNj{AUc9-4Hvzkx*g0#}VTUGG~S|J??gIObaMu;15Cx za#=MEJuW)U-{xQQ`PKKo|NZ9|7r*%V&rjJ2^49U~2M-?5`OYSk{&Kk@{NcQ4ZjNNX zIvT=qE(SMD@$8m&kMV}c@2qIceqIlaM~hEqagdBu0<#wo zXZkK^D@&(a+aWah+!a1NIHWuF?CG=RdQE%&_|~nOO=#xx#dJam;bd7n`uQ(@@!4;F zdpAqJ^WeeThewoS4m_Cgxzx3nOP%)Gl!#Y2??9vID$-aG9?!?LErt%hP8Ho>N_68y zMKOInP1(N$)?ml3G@<)YwoSa$-Wm!!Fam$UAy$&T2)Ik6c`KmM5{3eF;R*N4J11X6qr zQzy||`d+oxev7%Nz>j=d@5wlz^C6cpt?;3zh^*U*6q!>h>bvj%Cqq_(u*TYc^j&s#_w9?+cp-PSgcaDNxde~Fq@|6 zg_0VpybKspG@uJY^^NxDJKvm;$i!U5nouIyZi@<;B17S@!wNpQ{qyt(><2xlAN0`S zLGExq|de=00k%eIeDL5hE0xg+zyKbN0)oz`*$Y%i&Kco?*c!ZYr$)(oiyOHVv-Zg0*R0 zv$^DSzj=NyTQK_4K~Px0_@Z4F4%Hozp)_*!B~~Efqh!R2L_u6673v6&hsra6R*v+a z1peZ$!_m+QJlq)kL*Q7**E!IL$DeX4&6+KojBH~dq)=p@0fKO|k~E&=^SqhOwK!+- zk?OI+`TAbFX{ClOsHJSkceM?BU$uRwiw#u2-MJ zGwRNJE~`K=EhVFc=QU$jeSoPmhm}v01RS*{_oTIG@ieArd`){9zb&o;>;X{D%+wZ@;rO z992Tf1IRV6y;1%J0#SQi&|ZqNiO?iMU%zMXY+Gv^h8N^%o?cw$-dVDk3+^!=grm!0H(TJXH-chX9qEiygMDe|o=>OC<&_5=cbo1_5G2;-fh zYp-`4uitCB-Nv&x-9*75+H%m#tu^IFbnSM_#=f=bWT{KFgr9?pG%(B#G62oxq*W_! z2eyS}!RZLk7e$gdNunapkRkPZdN&++e!%oa1Z-O0uL8eVENCN8H>_PCOC*yHfXK3X zUEF*#3^m7XRY{WrJC-9|I#s|_nryG7xk`Ku|CMnY-XWIQIXYC#ri(q=g>r5zPKwF2 zoz01Y5b^QOXRuSA2BDN}b)nb-}4LqAp=Y+YHZW$p-GQcvO zYwyWya&;F4m@42T5Wpj)c`uvErbvkFf***j<;Gmw2Z52jrlBfPeQ}hYoc3 zK!aYl-|eg#g3J3#dEe4cQ#XpUq5y`&qgUR-c-jeK{q&-WPSUc9DGFY5mul8O8#I?% zkVV59bZB{QxIT97cx{m3R?V)g`MHN}gxj@tTknn8XlLm`<`R&-V98J?3_v$3s!VEE zhN1zVj1X^=1a$ z^7!PW*|MNi%R*DK+nlCX843b)-j+EhuPb^mu&AbSdP>aEHEgG}F=HY=A{@5FNZsS6 zLt>gXTH2DjTiLc3c*F5%G#n{pyJWaw8|gCRgZ#%|s%BlA^|UvrC&sI5&P!=VvuSHC zHE`=lEK^c?Cy8eq?n1RJsTt%hXdH884M0TPY#W{kMPn`DdTy>HoF1zP7b_4^S-2a%5Hu8T9$SqRfgeqm+NK z7tYVmu&)u627}@5?(XL1h8l62&1Q>*r$z$tU%c|g{tEyU#1R; zx*m!S76LIH*Ak$u%S+m3=2@@XRj5j-8j@I=|M86(N61$qwbLQ1q}0sH@$|6okJfQ?U>6x-9f_WbMrFpzL8e+Geo^_Q zvK$TgSJas_KWKY>eXyvdWUu%_axp5};-KTY$5C!tV!%myL8Ir5m6Vlhm9CeM`nu!U z8h&)b>Wxqkmx^s9|EeJ=O4O`O71-&tk+*q>vTlVdrQcK8Hb8=%0FThpmC1krm z7dVzIywK`7!NAX5D>e$M^i^6OTh&BsqugwAiw+C6-mpSq^c|z8n`AfTI7f0oD6?`6 zr*AY}DjzgLO_g>ByQ`v*L0fPJ(}sgVoYu3E9-6wyDU$Ar#fL*p#9;VEgPN7Ny;h#P z?4Y=97({I|om}yNXDfqxAWjhINVTH{y0f9|ZzwwmY8wx;6w5Js30K=2S6c@D$ z$4s0Ul*M7dM&xMHyhWbs0KwT4w>|gDbB9$yPxC^p69Tgtl!B$Ij8U|jT_VnuZB`d` zoeGLGMf6T@SCEx48Bn3``fH{&EK++mOXuf{=H$$`?XXXe>mp771h(<(_H8U<#m`lH zwZ3N0tQ3Bg1Tg;49}Mo^yWj8iMq!v;UYsWJJV~RBeKgmmMH1iwcEzCAQ;NMya3e-S zYHAE?3BUr6$``i30wNT|lZkFcxC1I>!pF~10E{?Z4ScFeZ9udVOvDRO)2B`8G8*Gv zaFiyElQ>UfoFO<}`-7q5`T#VP_9-&IEl4ZN7eG}-oi(l=Hq>X3X~k0DiyQ@}zEV&W zQ7D_-_)4SFV+n9l6jsiiQ_o5pezJ|^)3cnw11tg7$pEZk z7VTrxoVzZ~-b4TpABRb@*2arPQKU^}(9eMkGcj(f3&q?;IGO?nYdWB$SXBB%Fcm#D z3mpAe{{i#R(y?{LTa@#;svB*o@4Z}{OVXSw4B*eT3~wW!Nn2r&Q{~lcIGBnc5jvL7 zu^L-RFeBH*qvAWV*{adU)wUa_Q4w!tbNGtH&Tb3?e;IB6lNiaW1^=+1vLM(g7H-eG7wjOS;JGa~>OrmT-AD`MTVlV7CgON2@ ziEKL~oA zzy|U(>v@(kccag?7+{czVl+zsOMB&pa6MwRlx|%Oi?^@oeRG;vUk>CL;?Y5(yCzG# zh&U9@l3TaZX^CJd@Io{~D6F_@*QW8(D6Ptxi$p;g5fSD}t170u9K6!R!->kvROUlo z$AGRm297|QVA}#)uzQKpvns0T+v8cZN)YaZQCqHN_}H6)ZvxhK`+b~@t9rz@M%C7ZvQV~+tKsL&U ziq1A7HnDZ<*8A^&farU0aFplSH{b5X(ZzIj>+$0|ySp12b=I)KvB2n@Wk@-KfCfkt znK1t34zyms@jJESa4bTm2ND&{v4ZQ`*9j!8v$M1F^K+zn_yCaz=>W$7&-yY^u&it? zB~w|=HLpM0_hx#vS5gFO174Tuv|20K%P)1iwEebqtsJL4R)g2=x`8dJ2^NYcP8J2i zLESi5KZ>nVvt7somDp9c9Lwu>^=z%MOiuY$)l!sCH!IyNa-)hGEw4HM)Fq756{U(R zt~F^j#>zNl>U9# z|1y7}FP$nCer>et4F6i-f_De2cm4Ez19t?joSKG@#cdc)1iah+bj?|NP-15LF5>U3)OBRc6ulwlXz1z2U zY_<+@JT`VbbF<7qSjdvfX3vhZf9+BfWI5HToB9obS3`zAkz`~^T4!-(S+y4GUMP%u zO^C)zIzC%T$ewc^2~2{OU7}^19uMuH!yhD?1}w$vd}TJDPO*G?J)}tVG+R?NZ<=24C=DW0pOCiLr2CgjcQ9K4~(+H%__@k z`Jt}i%d6jVw&>)zNbwxUNs=`pAWhtDYfhQt5jc{-V0Cf6Y(@!0#8SsriXkL6Qq@Cd zRle8DY5*cRpMpaXJI=C^@7Zh-F3BADoR`t%!OMdeXZx4gMe3$HXKf6T0~RFkLmrt@ zRi;V_=U{Dj>UHsyX63EMX2yYO+KvfuhwyCVVJ{vGvp6;K!lo=L>--{a zr|H)c+AB$$wry|PW4$&g-nKW2^qQ_n$6{~dh~FwjH<0t;nv22&4%^&ZrBH3d`Auwr zBFmJOCKV(_r9nKF6uE#c>Bbf<39_vKU zOom}-=p!0!UQe4;bzYSz)~fGxI!+hYshsZw5(#VEP&VFD4U)oY!*-Yo%u9C#S;(!_ zgtVf}(<~j2hJX3Xzj*uJooCOVADzDZo4@&+@!Hx4@4xqNe*W{H{`4pBzWeUiUw`w_ zM;~2WT-eJ#s=h)nt2&Jmm{Iy*S(Y6f?4O^X4Tqzxt*twE?rh(>g}=Uh`Eo{srve`u zyB_)E(IJ0fbfgg7lS=bFYuKk!6X2onHfYidV9Q2KONFBdV5PBr zVKG>2Es273+XN!t`Od_MDSY+ml>g= zfEbE=pq>jIeLS42wl(lQ7r8CcnEGl;Qm$hI3)*3T&^w8uz2oDPg9ALc+dH?1$b(12 zPOoRCNyE{cQmGYc^pRN(X$uihYOpHc0UYV(*69a6ClF4%(C^3jb$-L+EpGr%kVwnn8{O*|sQ`q$_tWYS~oo@|8;522D;9eP$CI(?A?Uy-z zQ0n5vhG+^RC-Rca&TjXHuicA;zD_a~`mDRPBva*Z$#o@)_ z{>8!B;xy4>#2qj9IOo`q7qx7;=szU?Bg_&`!B2p#xGIp9R7P8Cubc}EshR6UBFI*NQvu-&@@Xony5$Un6lAt7 z&cKq%AJdK6D}%sIb6asx_2vAjz6$=Us_jbqbSXP-EWaXi_}3=w*W${mYitoMDkeTo zDJ@COEVE3zozJVq!t8WKGs48tvslav3b<=FaTtfiZMj8eYwF5F)ne)2v~-7k2XUMx z14fjdY3tLj46S4ifLd%-%lQ*Vew!(QBM!SrvpnDDvUUR74Y3$}&k0>A8fZ#YU^UGo za!Iu`f7#Q>IKalFS#xFEI_|1*NkJ(jHA%b>$8SE`g?gb1zZH@U#82?_c6)#c?3kYzBq!dr3@ywjmmEH<^+ zHgRT1CbZAb&!Z^9+r0hOTlep8jmJa0ell5{oLoJ5a{lp0&yYRu>|kXf@pI@`V~D7< z#HYeB;|>sM;Mk$-c$C7+Gd?tpv5I~Ux@O*(X|PlsHIQV+5Pys;3U|!|4dRMc$ zRU1S}8958z<-~&}BQ-wKhyqztQxIGTr5u4OUbJRHhh|Mw0$Sf~9Gi%hjWBu*8#e8+ z`E3ne&*^K<-;0d_&8t1DMdZ~Q|9o!NMU`~ZonbK!anxb!7*zIQJ+jYR!lu^}` z0~Ysrq=!|<~T2jS;S*$Jtzy;?mTVe}@J-m|@``#&yw9T<+Z;<$|RY@_uym-0y z{OHN4RV39w9|nHy;DNVQW)!LI;6~_v8?yESn3*KeY%yD8#yH1Wx9Mn9vdB_acZJ$* z8Lv_ImHxUblBA882azlZq+eCFjm_uM+Q#vj@3!4R?fcDa<^{en93*(^bsZJOJc_g| z8+mS>#Pmxa4m&hf54j)l)>%e|e^E###`cQqd$!}6ir6FON230jWKm4Da80vuX8AtV zfa*HT>AHag4mn6Y^op?``b}4h%Blz*Z{&{c(gBcXvEk(@POomS)4AX24SJ(+=sA98 z-d$92PEuuF)&+}qEl{XEuzN$VXV>=RX!i8^v!`Ewd-U`ui?cukvpa|&nie5_G{n2d zRMf;bt%((~;SF@`PA9~M#Hl&GxY*x+@yREDxHvp)@)T)V>&hf{zwhC>CrNpEd31ge zUtFA>pFMc%M-T4bTN{tRpH;7PTo6_OWf;GtX&ZIRJ(QfUAx0n=F}o;#bLLVO{6a0=ib=Q3Y12iUOQ_E*_pi z;wlhJ(WF_4Cz4}jh5=DI&2FTDPu5AxVO(>(X7zz~C_&#Ok(Q>Ww5MCD(3*-!Y$*1U zaqW-x&)QzTnl=}(A&-VW@Dy^vJ(^CkqeFdT(;bcw_G?2g>Y{B*A6JO&)0j9KaICpR zGbG4XLd(Howp&GGrhnVAWASRji>tY+kzrw>195QGQjN?sOWW-Z9FHS-jGep#2%t7j zCf*9?Ra4Ork%N}Lh(!?z?gq>kl+TlasW*M5XsCmOExab32t&Z)y2>qm*%)|3+ptx2 zmSq=2ek*CkRVSpq9;8`)t3Y@%T4+E>Nj*(SY?TPFSe>w=1>vaQb6H}eX5-GCyJzR; z*e+jw`Q`EP@q-8V-+S-<4?q0yop;_jIXQm*{5j$eV2V0f#Aa1nP4it3A2dob8My7_ zy{7-7x-3NO)BUG&fvVY$_ja1=5W$2p}V8QfecDQ7zn4_fQsdBDOVa*S)#op z6&(7vx3}@q!;|Cvy}il7;Z6{Y-+p^%IP?%r3J!xQbarh4;~*U0WWBUhRq1&{VK|ev zb77|qvBH@-v_8Ou+ZJA(xrlN`7+by4u%f(}$5qH!=W4hYI40dZz==-zC8H7F42^dt z&E(ufy5Mq@TDaw~MK?5ihw^Gk!uecO^oyU~qXI|bheOosiD-Zlr zyPwmr#T%OJ9aKO904EpE@w~v*9lvB$yBMqt|7uR#01pvSlo|eXHx))EV_PpA2 z5NR|u+5ou2kypbLC8tu;OWQ0tP=oZV#+K4qIP7%HPBPCHQFM5G^y2A@Y?iEz*E(Kj zV{@$=jMnWn%eCiLJa3|DF|Ap^6KNU44(ZSx6w~JD$??~}`)Y6RdC^oG>+28iKHS~j zbxnJ|n4e!icr`13!0`rD5_nop+V@%ZkYJG*!8 zZ13(4#$%w8==9}m@5SZm%hQAX1fkURk=Cr!t#COPqJOUeQD1kIWbD~dF7&irCg)4B2H1hX-dZ9A&Q@!jU1bdn5ug&!g)&c~1-7?bYe!`80@w9%VM&S@Rg&f9 zcW|n5IIF3#I00^u+{RHPH>Xiln{F6-uA65*gO4SAZQKGX0to-tGDv%C?o*EVtt!5Vaz6rs;3E2HY?tFhpQOGl66L+Bb8v z)T&rZVm}^rsaK|x{mkkfqCpY~KdGj^4{#+_ds@wIt%_u9hBxu+Te=&_o0{Tp%_#~T z*@(S7m9hETB&lOWEXOcIJY}CVq)S1QB5RABIl-s{+@@t|JGsQ;rFK$P(hxvgW2I%* z7_VAndizGY`vxcB#uwWg=6wt=)T=g{`8+z<*Tod2raCj_bF8)wO=E!Pue$|6WJM-# z&GJPfmSrZ;s4EOA<(%3qYml`VZ>e5wlUHR@RKS3>VRE>jVPyzGW$57qVttk>!7?1T zc7%G=Pzu}$z+1< zfMjod9f5FtFc{#A7Z(?-L&tH44f#HB1>)-2+1agIw-7IX^5YNJ)&{@%P4Meq|L_0) z_g|f!PDf*RbF-)G%0#0KmPnPd{%Qd``OOz_wU{vb;3qB@~UFoYnLh)twBPCJnNc!)GjrL zBI<3&sRB$CUXB204F)~brupk||Dr3t1&wr7i(MO{}aMk20O z!mBlmqBfe+s5RR5xPcxPJaNV7NS6vG8Cos_7=7-p^h)VGJGvPXqjS@WuQgV2lX3#f zMl8*3vnuowmr7XY@b*TqH8ji`q5VP#PlaQZ zo>k$gS){vCO9t@*SpqiC)#c@EKBsc@+6riF-tH= zpo3m88udLIB0HTN7?~>1ez%9?#P9ZTbEcP9Nt#4yhHnTxZ@|`u8-zhE#-_|i>w1zV zWfTEb;VVX6;jr_mA`*JzFew`zr@tM=haOGbEOPM5VH`q5uaCP+%2 zJb7|@de$Ef-+KT3M~@!elTL7_-^b@&310w1WHCwT z^T`qEQ1Vb(B&@{X{}5deBaoxe$|Om0Apqh$+}PL{4M+Im#rZk4t)4x@qg*T&N{AM# z2%8j06MtaapH9w1w6*X+aG>^BQgXY!uHEh61U%WAw^cJ`%MN!=Yp<3@z9ua&(iBSM8H z+cW&iK^mqbVXg9LK9SC(NsB95)M&u5VUn;Ht!sekI^vX!(8#br-SUIxO_{l_ow6u{ z`%G*BY%X`0%xF#Ycqn_IX^FUU%BAz^wt};jYlk{Sn;SE+`n7(8B6yHDngMiNY6#?M zW_fHQ(uB7y)l5Jo-k)+scwH`=TIH*EA;GLtLj78i9;>~kjy29<$EH!7321`I6wT(B_66Ozg216RqR75AMcZ(G4OdlH zi`Hs=Jpj09?Eo0W)D5K)%plsTHiUsA06X5ce9Hj3#aUj88!CebFp*(3N~~rHn#H}W zsd8STV{3lMDtK8mNnE8V?gEl=e>kK9Q<^q$#BoI>)T^4&H9?U_p+t4Is0ut~U-tuwN^xqNVls6p zf(ea`Y_XrpHWSx_)wq`7vYEuF#pUJtA$Cb8xIyPf{K0cCr3p$Yv4*3d)CF{0;ZPeg zF2JQx;W-mD+W6QwA=!yADoeZ$jB5{6bLlcmF#!_8OX``d__fNyQ1$(myHaa^z#~b& zVOzcuXl_aO(WuPLl~pf4ajVP<$!z1a8m9ssVX!S^W3^)D}bd0bA$l_h=XsA8JQf(`|Q9PuC_MQz^2%hNGe13Ft^4S+(465>H+qX7`!*1wL z6P$6Cl0%THQv>W@o9tBT4Yo~T`nA#H-~mD({hk|BIHA9(F#x1O2zy9j(4ka2FcSB<0VZe?4g+vp|EeK$(XD8d;Y4|`Q7Y{kP$_A=X4 zWRB}>wC8D_AZw(tRmDL8qiAVMgp8=xd~L(CEjQ@9zEv1N{V59?Md{S~&pL4e zcXk6Ohz3)CV-Z&+a?S1jV8aTESv0*`&={evWXy{!XC}D-+lZRd3I)zRJUIOByYEg; zj`Feq;Jth2?xTkfZ{ObWf`HA@B%aS^a^SHNj%CV4d3Lr~%&_7Hqv74VciOkCt@TaE zCyrqT5(Y-#H{C8W&6AUZMVcL6PNF;?_qva6-@bikr@y&{6s;=CWHLFM%}y>S=acDT zKEvV#Rsu%dTwA;S@cyj__j`T%isea~FXC*mP-4(n(DNuhzq&fUIKN1yjinEUgFAP2 z5JI#K9XM}xHM=-GKR-ER)(TC=-P@ae8ld#JcW_A34y@5%Pm!03h^B*_*g~9eIaQ_zC!Cz?5You_vr^!o zI0iw9u--HW5^RwLehz3sQ5$xC5vbg$5E9Dp%Qx$z%xn8 zEY=x++mb^aG2Y1+!6Y@lw=@T>n@H4OI0ipkP!gUrVZ>Y$H>kd@#_Ru->$AvD^RY@f zp}3khMd41S!D#GsLndQJi?b+qy{t7dJT|fhDJsA>1QR z=~g#QN4hhMd_K*Sd2Lo!UtejbTU1UW>3wLsv$xE_LA4i4w?ix#fSDEZu zmZ0<->V1YPw^tI7krsGN9bHfB_HZw_oi=av*EgsRHMz=9Pt%LbdJ!+@cUBbO_6;j2 zeWePw63Bl;yF*A$4bTjJV3}mCP5y()`cN5b(>4fu&AB9?RRDPvxjV|>f|DXrYtUb7f19_rZ~x*Kzr3@1=Zi1D_~P>~ z{`#-~`knXQ{SSZjAO6js|M{bbk1j7Szxn2yI8FdQRBKGBkgFCYx z6p@+`_~YOF_P1X?-`oGI zzl#3Te;WG!P}6W0VQ(VC9BO)BGdh6ZbkXEw4Jl2ALl@FFHjkwuENe4lIQa5cTQrh0 z?A{`Z8a6338y5&bkx^Kx;oT88fY!<_r?inXw3bn`<~PvHu}jm_(y``7odAPa+n^C_ByG`Jbzd8p(DUFu=D_R)i)|DEN zGVWE`H%gjfQ1nhuOXQ7a(VFa@09wf=Bgcy!JQl@`vQ5*%Xj~)nHG54%oG=32#FI>L zZs;{4J_oOW`F*M@b*W7(S=CnaI=-US;l|_{Mx;ogKf- zqFnn>NBY5;Y@{GSNO^unebQ=X>hmNyp3EkT#fh#(XJ=`iJ@EZ;w?l8ps=Sz79UUDV zpIu-#VqfZ6=2g{vGKtDO(b`=@AFr>GWxR-3cD=envdAV|!UO4IF}q3^iB?%B_Qlmj z-V|?Xk6MoSR%J|Ep~|g^M&nEUj5SguzgUa_0lw~qy5}&R5=3ioG_jRk>U14<Wtjw^WH1=uzpe}%s3944`v5-M z+uJ|+@sI!f&;HE0ZWXIxqHeF(Y;Eb+y?-IG7Jw$$pHH7YJvcl_0q>;8jOT)1NNaX? zceep(07S6jX0xN?qi56;e~!n5O)e=*)$Miy-y8G*cK}xAIH0p4L)wi;hG(a+7h;p^ zxurTG1j{T(b#;n7+m45KySz9%IXc>V{`|%M!TI@RmS;2Hr|K5)!eV}BcY9;4>sfsY zQ=7H)PivX26=5`dCW}YA8MtmhpGb@1{;F+42&n1TPDjczS6f=hza|jMPE{i%aSfnC z4ct{_0l1Q92~Gu@_p|GWxqVMKKxM_?o)?AHRyq~SNS-uk+|5o^SriM7k5S;=;*6fI z#P&5h^b)n>CX;MP8GBv%sR0eO*WFKJB^WCuJ zIHz;VL)w$*R>FczQe(l(LJDLpQANYGm+HVxtA_10+NrY6UFcP!C#jV-VdFZkCIw~y z9ewGP@|w@?^^A1OiFg5r!iiIAOS)${J&rQEX;#r##;~|r2Fi7iuAF#O$QrUNFR9X) zrdA|Q#;#+9n&q{u)h4X8=!J}B`G`gwwHLvv>v<-+^pgIL9b_#{!PMocp;yVoiHJ%b zAyPuX;{ZbIbe!8e!Nvw~s}}egMQM@RVRM%v^K~u8xMU#cuOtj_l7-*64=UYPYFfAe z>U_qn8llCKMg9&5pU~OOYunt?7HNE$%rEn)W?~i8eJ2d<5Kt1)Id8Q>W1d=@oY|~# zcDN2OHSU_nmZf9AIuY5&$CcNu8i{T5qFlsmfaC46imJf)K%JoLyMCWm^5mru#{^zo z_$BLRoYIusK*Kc$o zUu#A+*ToqbgkujLKb}XY7#euOBElNQwQS$oe*E~I?d^5E@aXvT$&@FhzJY$K&v&vyt8x31O0Ls=&pp}JDr&{~U zBG)1ph-xyGp;cy0su&VTn`(Hv<$L2bbL*C8*|bNB6P!?mQENuYepc<&trV_Z-?jo5 z-vdlhmgWMHA-1u?E4$L2rUx9ZQa`=roTE}c!dl6-Om`AT&qBBLeYb6FJ@pKrd`D|N z{P?W3;<}ub=`?LT4eyVoY`KQZDkL9#p*Mj28Sq})x-1y#a)MZjQoi^6*&jds^zir? z!L-*O+}hc}a-2_R-#vfv{NUi^{Or%$^6uTc%waArzWVAbARa_tp}~$Ab^{+@KRjT% zKc6q~b`KujM`*%xM{qniI>yCpc00Qp>tU}q^1{kIJA3is>gDM)%i7++==HHy7Fd{3 zR4(RDk$Yj_`XfBEY`y@PI{V_wXD2T|n9cr=KmFIVbhj-mp)bGw=H=;GUX_7k^>JEv z18d-&NArWz!{hU#tW1!HZ}vCHesX=sw=28WDGu!R+-}$Jx}j@$bat^#$Exk6w1S1~ z)JKrVacR5e@a|~qN1G=HFOOavb^Hz@OaCYRzSmW8vZ1cGCcJR|+Su4w%;zpg6a1wZ zo#HaP)C>WX*?Ycsaeihy_QvMM+WMNpF$y{;6&dq;HbywUfG>edaE!?g>II>XM+Y2v zczF2Y#S7f=KmF660YU-N?Y(&M`RAVji>65`ic-u}kl*kzBh-rjJhms0mgkclY6>ZY z;tdD}A=3;o(rT68(~?N&sNqQs`P0Y0|KzjJKfAiP^lfLY*9*Kc62r-S_VLNfZ}(pO zMsu!SiF0NtJ4YtGU zr5WKR&=^!QY zmgOu<%n>#1hfJ)Mw`Z-_MO9QSWkou8t2T6N(=BYrzy=CMK&Vbw#w(E~V1f1fNL#xc zo%2jlgd5-o=Si9r>^=uBAbVh$h~gIVHQ*QQB2}1VqNMDQG@&22g(76o6_SnK~ zODpM;o5C|IeWv9etHpat*Oww`a{q8*XNv{S*TU9{Is?Y4OXS&AlsZ?|!qP%OxQ0*7 zB1KGe-pF9JIQ(VG{&J}N0>|(j_$T%nN?D&21}HERgp0<6@|ieMDmn)MRww<07jQCeOaD) zeZ97;I*h;x)Dk_wU;J&7Ztd)B?e5;afB%EWAH4hSyT?aI-#veZ#IzC~Bpv|5%dp?a$%3to zb%)54q-j}{il)NAQ38BMYNCkgN?D3Yf+HBn!v#&JGlx&a?)JKW@+W_iq{XLy{OIuL z_`m$;|M}#}i(mZW#}6KSplNGO88nTvg1i+wsT`yv5TpuF-Aakt6|FBz^~pKJf$X`;k@Zw=t99(kb1FS7YnK#uue1kdyJlt9`$OzQTLfbiMK4d2cri<(h1nQhXt$w;AFs!; zeKzywu{F!9u2FSL-3gjbfKOyjr&W4o5}XB$ngU-b%E2g%1>9JEvqbi6+!FQ%VJ}$Q zDs|f^F6tb?FRg5RYi&^ABPfxFVv%_c`&3oSvD{j>=b3+eWv6)=gw1$p_JC3-fdN>O zq`akM|6>W~RUK9B+-MgRD0YH@HVix;M<8i+R?=!$WopjPo*mm(7fU%Khkzr#RljmK z?7~gw(LCX_5B3yGPD&U~5f85}FM&?}@wdMPKDhtj!F%t%`|!~tEQqI1o}Qom@2Ahc zOS5D&?(;~l8YHR*2ZvvL@j1f${Rj7Vc6R~2J=fje-v>ZFI(brjRf=R><%#V%5YOrH z5l4k@-`?8U-Fon-+wUJA?8jG=Zx0XCMjPzh?W}L~`aRss!1LC+;n23j!LYNohP`)r zb@lY?ufP7}lj!Sju*7zOt2Z_*(I|ScfAH<|J>bM$oS(PG_ujte4tx8jC#UnX!|(PT z!@9qDzkjdqoBn8RG)w`ErbscjhFg#BJQ{7R*`XQW0CRK%nUZpO6l-A^a5<(?7YrJ` zwa#F7c=+;Y@A->tk-0s4e0SWx-N$Y(@=6TOr5suo)VPyg5;b_l$YaS@5H~vf@T;rI z>FLWPNjkj_G8NqWiL`ats;f%k27#3~wXIXBHs#D(^xs(s>=+f6OPx$Y0l69 z{Ia&be&_Dp`*-gQ@MFv3@``9cgmdd?d2S49Bxpza|uBsQxj=Z^U)dvqBlu?x7fEN*Zq9n^QTCM%3t*2k< zu!;x}xtdhp%G+pOMzjM+tT55j+?*G#qxCx8aM&ARosN+fT(hmjp{C)mJ(kLBK1-|2 zb3MZ`Qazn$S10l5d2(K~g`>OXO;5)kwDw$<@0s;cry$rEXno{MIH)a=Gc{~4q;Oif z5UKB6G-0KVPKi#>!|6E0U7bxY=hI1%lC{9HnCVL$iqrbmD$5ZZ}I!CoQ zJlkq)UX?9@$)W`gq>>y0nK7#CoYv56ywmX3vuUo|l8|qvb(`2uPC(NoM2-_G6Dqkv zDgJz4P`!O~faiud(6ad?D%ggtTrP!7Lj3^xaRKL+b!}4E*fVe!g(d zG0w^?zuDpdSgn^CtxPx;kE0%t(WIbzO`=s%Re;R;SefrTyzx&M}e*O3V6N~Ac4?q0NfA??i-n}y(jR6eiQIsZGUKL6; z+i>*3aCrCLJwUW$B*(`m04`zJ;RKWL99UXTV$}+#ykyhNW>c)IE|5#Ni|Cak@%}-I zGh%&x{nqx@uYUFKcXv1c?(hEYx4-@P^z;HzdSm@=rwi0>HVsl6O79?LNyR3zP|7_y mYXSJ22-F-PG0p#9fB^t=s0!@&t^VKu0000@bY`DvCcXtlXVA#;%?#?;5ySpFU-4D)z?|1P}zN`15 zZJIo7(=<(Ie0j@`8b#q13Qw3_nfGY#iO4 z+^iXsSmDShzw^j^=Va&M=H}z&=HQU#lHiiyk(3takl~Y%mgJO{O0xa`AfEpTDuH7+ z_`gh?{|oe$(#>7X!cxH8$;`vS!qHt`O8Bd{gEOnSjk&=8#d7_x*d$JP2>`{2&N2)P zJdDZ@4e8yDd2NlVv6%}c6+(k(O6NM8PnR@G|*OYW#@f7V70rqdwK|Ns`z)QqY@2T zXlh>@Y|1DvFC8CjKV7I~1w>BK(9n!%+Cw0B{T&TSkle`n)y z&Mh+|y}U5vi~r=Rvhw-q{_@=TWR*rlc=*P~`dA<6V0&?4xg1mjC|+2ckItxAogW_W zEgxx!UK`51zuCVy-smf~z8SM{|8rdnTGF!#(>G^ZbIX};FZbC=;cL57^LuBnudiZ%r*}Hdqtj1z ztbTii4Hnga7uq5LJylUPpvJD5t?N>yp)^aEvbnR=1n|<_^xuSI5O5Ocm-35ecsOf# zxoLW|YqLLc-O~ZQS=HOuGYj56IozF?O-_3%6Oo5PR%QV8w)LIEWlfdqMdo#RkvTz{ z+iSfOv!f4ZBSmGSj3%z{m3zUfq|h( zl$R3M@CH|9`03zzb$xWRm~q;~Xvs;yrI(pA(-}nIKMj)Yoev>bH5+OSk=6wO%XMYjKO94+|7)VSd=>(Fs^7_E)vH)s`FI@uR8k=1!1NZN{A}gGbyGpYySTIr-|S_wS;8Uza>2EHDtoY!=SKp;6sI zG&>=*?Wuk{{0}Tre_Lwt`C0@uH+$N}Q;i*!c-`0(F_%DMl76#@@K58rZCHI%1B1}( zP(CKR)0nkglV{WFEC3Bhk!bOFv0M48(P}t51IN=CpHj%eM7?J-n8XOn2b+IvRF#lt zMP>8#T5I|_n+5<9;o{>G{`jEQgzC6nI0KY^Xt5!;7Yjd)rp zNT+i7vvd~fZF4S<{gEeSqF2j_dUaMbAnrx<|W&{6#P7C@}VgK3RmqI^}vheV!0&u++s`^!iAZjtmifvhip`uW&`QU+$QAZR&4 z;^Y14_CV$MwpdZ}aXcoa8a#W(T zfAMkcNLSIOQEaGK}5xgUJW-adX8P*)5_49PE9EhGb`M!f6CIk zqg1Fv9|Hh|qB*~4DE710w`q01UbYK7X>r&&D2bxdoVW_*X|0Fjy@0f)(zXcp2=%Hkx4OmiGi=ot=2wz-x!@Nw;7jLox-h+l z>wA7C%YGQ`Hx0z+IriWahmChSADdZ$)lpSd<^ZU4-9z@~4N$Hg{*7mulGtPZNx`EN z@#UQ^M#ZyZJ;?00KmfALPb9q6WErwcp-2XC1N)W&$fvrb`TlU?_j5s7zx)4qzxG0m z!eIX6%nT?O_~?@Y^tA~U+|9zR%lYbKL#m`2oQIiK$!kS>wN`ScMm9x_ zA9pPjgTB!(_yevn#A+sp;OH5~PLcc5;nYTFvCCOjsY7GgY6Rh((4RZk9L=)|hE^&{ zk8yLD@GF9R84QTi%(X|M+LrRWfb=nT~*Jh90)ik#I>S{IKYebi(z zJ9wl_OmB1iPYkH}E3jdA-oN?HZXbcHzS5+chH&OaT{j1GBxSzSNbEE+~ zj(^gnJsROQwy|&k#NcAZv_R&g1HmtW`wv$i6;nYOp%V`mc4_4fG>8lckRQ-hecbp3bQznI^J- z3Icfe^UuT5@E=tnl@rD3H>19gZV6Ac&m-mHOn4Un1+*XJk6 zdS$Lgeiv{M3BRu-|I=h(6zVRUD7LJdf!2?MBBdu0;4CO7&ZU{$$q;>X#1a7y(6N0? ze^I19)A~G9agT{|45~XP zAPgqBIoBQg@hXpwCy2IA1`|FS^0L1U(l3pcYTmuJb8*zONX^=ww5PnDcSh>y3x>^q zRDcj|m#ywn;!Lqh-isvj$O8htrG!J~nMrbgSw^00Z6~|a*m5^db(VFee3i7JFsya{ z4$3Dhy?c}5J?WIl_hR<6p55U)%VPl7Q~bM!MMcc&#fHp)TD$AOz`6<4Fw=UBWA{hM zpR?u1->={Aa(+oUK9#!^-ui|%Q)d+Dco%Y@=fPV>L#MnCnW)AI*#K-S^i8WX#Kzdy zu;|SjP}~pY0AW~6xf-?PW!=E9aat&db3>Q`0%Ql~DBIX1W}rHpoc}2FxQbe1-p){g z!409aTU~|d^^ow(+nReoJcwugf}^l0cf<`xz;1%6gR@2%Ch|oLK5&SANH1Q=@6nK- zyiQ(p<<|F-A{k$$9N>?X$$2fkk?o0i%M5z3xT(4_^urCTM44Wj#9+=tku#a7Jtb*AwoqnnGWcX~6$7-3Qr&tbS`vE&w zUq1fiv96&3h4fvnoG_wc#%_y#AgO2eA#-#*usE4|J#XFy0+L}cyEia3#JeSb`AxrZ zEig3eYKz`nHw%Q2ckJ;}7v#_8%&HX9(fnA1pvR@-Q$(J2_;&KrfY5nthlau=p8il} zGA{nBXrphaW*9HP$9T0#SsT+6Sp4HUFLVnN+fvDg`dxdw^6P;>>)Rz>_vJ*j-1B~t zGOB>!&w*^AazH<|aH`1@3|ppNhQJ)WotCYRa~aRw3k@FL8>y7WWoQqJ0&peoaSh0=`H;%m@qd4fcQf-1x>&q|G2com!@qo{0NRD&sULGZw!0P^atLX1mhmVuz53W%=Hu>jW2KUHWT{Rz*r zi3~M01{|@SH%BY8T0cEqKDA!@N|q7bBk5Qa9Bp}BOVz|Z=qRYEQx_)4reuTh$hFjf ziheQqi8(nYgCk;wwq`~2Jc}!C%EgrSe7Xir7K(HkYokxIrdYQ5FxS{$Vx;5{^7&PW zD7vkIqwdOY{t(nlQgmmsEQr6C)l_*TdMYU^$4b3w8IzEFGbBPPlZ6DB=03{Ob)w@EpX^rQi<~#t&N(f; zVIT^bI7|MkC1JKfLghd;Hk=vk8Cu^YA|2`E$pSjYX9AM#n{Y;3@q6!8Ir8Ac*posA zz}lc6M1gP^ejs3Qq;D(^aq%PWM#@Fa zOvr=8C!Ib|wiuz}VO{i#2*%}t1I&zL5EYGrfs}m1ST~-V8v|-3mTc&lL=^C=gHT}2 zuTDKLJ9cRGP*dk04lE?1j)$oo-C`&s0M9N%F|F^3^$BwZDZ=C$UdY&*q(+cC{)vBL z2WB)p6K&zv@8v|Z)!&aa_RQrMeT&QRx4#$APe903pp7~sdY@;ZX=^u;+umpS=pg)m zMiDBUFksJMNF9dZahuiV(+b@YvGHOie3Tc<=heDqhKNYT*n*vh9o*y9#Ph^9K*Bdp zA+m+&2A+IR)uv``x7F{b1QyL(o$vnaUI%Bjii$I=@iPl&H>ir8gN1#Rddzpk+Zxje zxv=sj$wLRRX_qzAsN~8x4C2QE%2O@=yvkBkxUtp>G77RG`D%ZirHDv=lC$7MNflG~ z;S_oeFrZ44C^k67ac|x?KqHU309}Fylf#}LHBu&Fw2RiZPP|Q-_OUYg!*(2HVcQ&V zh%Fai0#5g%RsW2|V1aFwJvR!K{b&R^{qs0*Nt(ngz9z^rpq4iP{UmV;t(j?}rD|kI z)(EJ~Mh)5QzTe}zDhrB8S_v7)jBpoP{#CJ_la;!~{X45OR|A7dqDA*C3=op!1Cyf1 z?RE{UBl322{h{Ym`$jVLWk#w7^D!c3wE{=l+P!Fjk2$(brek$z7U$=~ww&2$orwNk zCvXs1*26XVlE;QQBT;5PF9JJS#wDBzch-lxBGIT&Mn!vKY@)^HoHa+BpYycQ;1rrYd4j55Xy^&2-xm?5xt4Y{=#^qR0_M84x6mS+lA5=92^XfjGZLU zQZwQz07Phv`mhS<@~xCue^DiB70$-o^0m`e#DC1W?-fLlxnqET1bCtT)pY4dHP`IQ z3w%cGYhE|K^A#uWh5KctXwOT`LsvLz9kY+BBym>erEogv$`p_E4mez_Uz?Fk)&F_c zV0*sFi}Rt_3U5XfHV~8@Mh>^wFsn@C<*Axor;9(18Kj8v6){JOG;ZACd*+l@qTlVc zAe?xl`qwD7r$Io#JK)*P58(1~dWY;bZ)`)S8~yddoD?37tXGhoGcunj%t9^^!2^~y zZkum()?94ru4MgX9R!N-E#-pt=K|h+er_(5BVSQtiF(yeDXIThFywE?&Y&pTamT_A zGbID9U3mpDAq21KG?PzR(hL^Vn7f!pO6{&MJ>MPKmMCS50&M2c*o6E(y!Bj<4j;av z8}zV?)j%(quhef=0!3-g2N=`0;$gYS80EU*8%E#A%p5VaA@XyA3+F(29&F3^w{q$K z$}9J8wlcX8%ghlC!=CQ|Q8*%=EF94>vQ#@Pi&bdF!nLGi;F~9QA_FE#+5Uz#Glu6( z(=UttD=O*$96b_VkhdH0As-!fmOb#9wlTln0#$m zC&;UE-T9A)hw({JZ$~3LK9b1_!t@aqDbnE9KR15>e7`%L7Rk%2WET__6?CL?k*8gv z#ch@l{j_hUv=Lgb_qP@m|9egVFYPMUa{sqlg6IIf%#3*8CtQrAT1NlQ;bosW&tqi4 zbJC%5b?}Xlhb;~$lq=v7ao9WwSREoQgo8mjSHHgFoEM5zG`6Wp3G#Lb#7r>mndrH} zfpv8ObkZ1-iDlA~M@@@+6wq+xbI)K-2|dlQbv>1HQGr$7)3hi+KR?|MtIOHBTWw+)Hd?pcGMR*3)TkY2Rqnm{JL;Y-6I=HT|6|vvuo;+c%shH7gMDn zT4kH4GW0m~^MgduBSb3Szq5;mJUC%dOjYaDQ8F&`rHRIOjrGjMZ;+a@L1Y? zcQoh-guc)pIS6q236y!wHW8mNG7QQ!mvS%snKl>V^_nZf@Y4A~`6S$EJ=Y6J|IleX zoypha2$jl6YAjW{-*ns>M@u~zDS%k%&^3eP9sh}ID*HT3kxM`m)lQc>|ovXUaL()4e}ffJdP`8H`QvV{s5Kx zo+curt8$y=L63uKiC^Dph)K83bhd7 zlJJ=2=ki#*u{g~wjFJ|>B$*+N?@k;CsHy(ke3R#yhAVPli3~`Uq!I$WYc4f$#fyB) zNWvK${f9RzH7MBTdmr`*Ps#r|)?$8l@cH=}NI30h?ev!VZ_4$e>=Q5XA)oyvpNGF1I~g>G|+!4p8*wgESV&2`L9bPn)@s`a?}6$Kz5p$ z{|=mAMmcZRAQhZ9nIr5s+OevflfjE+8q!-k91-4KJYm-FtW3x#;`p+Nz zs#D@jWEU%UyxpEkvh}zBt1TI}A5HY(2-UQn|GQkU3E!KaPTwWz4YJiqze&fHvG*m!5A!s=!?>dUAPO=hYu zv4smM-W^pxbOFd%Lh4~6aNsq;+)fYYKQjw9^*N!9nu;Z20TO9an@j@zlm>&Q2LukkJvjLom-hdwmDWm8XtI}&!+WitlsOxP4F?{GN!dxi&X=rrm#>9w<1;I~j_cSt6N3s~E?e{=Q$O zOQ}{c3y27!w|f3eq8ddD2`sTwC+Ovii%|XY7H#=@ z6da;3+7+k7b3Q}V#nKA!h_SjaX7b1{S=q@{>v?Y7-DT5v6m;}(%rcfxml?8`19>l1 zz1=sfni9H^Pk^Y;3PE|)>p{;p-Q&rdt03^)Tv;!JIUBxpAO;!VZDI)_?M8G_QIUKS zfbKweIC1IHyOgW7Z9SUlRPZUatUJyr*74W;mndJQbrVFG`u=}xUHq8ldc;;SE**yGC@DQ!Zqf?lO{KJOJr+}$0z|-OW6K9}MpjIdJq2i|SAsV7ZK0bPmEx+_1 zjTSe!%)hZGCG$TcoZbC7O9DAAOt4zSIj+&1rN5)lfE72QP)_>I1l+}*Sde^r#T<&E zqm!1+8&%0F!tkj}6Uj}62>oa)=jnb$&(i=sY@eRSF}H9<(3XCQ(qrBzM8-P+pnmHt zAWVBU6I1T|>tbn|a@P)hxazs*_tvN7Vn+wBr-AoNJJ;8Ph8RW)6h z-X+u9R61g;9|oSR#FwF)@=CApr?tUv!G+qT?h#> zGQVeF!$_BDY?Rs~t?>+XT&>jtfM|!Rh3+I@cspwwL{ND`V4i`co!l%#K*qxXn@Vk7 zSVLKp^Z)=cMK00nT}(}w;kdy>8V1j-eMsWIG&05rlHlvahovsR5~r(y%&DB36&H{W zkt$p$K7Q*9VE->aT)2UHds(1Ss?M+TD?Ps#Nd0;X3$Yh|5uV`c>YrgiXOoBKUivc0 zvSicSFvS+hL9bvR<3k00i5k}w&`r8eFS$<*VY=@d(LoT}w*|}7w{$k8tRSQX1YGtN zI7e@>5s#x8m;-OqDTj>Vd?9*=#zwmQan07+LaI8u>b>c)*7n(N&{tx-z#`S5S6-`O zfs3kGcIYyjVH+P{@3aJN_5*ggo*#E5f(`)v|++zr~CLIHNxo_KjCwOn+X9Ugdgca#I&=vlLVeh$nzII!gUb1O84jLVeekLi?>!R+JG@MNu_!V;WN>UPjPE&*kEO=8ncQVeJziYhq;vMr-8t-?Sx!ss ze%zd<1Npo780P^lgOa<8s$Wfwj~&7Nowx?@Zz8vkuESQD=vI5haBbN1KTF zwEx(#md*>CLn~(yI?igMkQHU{&H9T0>DM`QoOvW2&U=}`c{V!5ANVsb=gmm>M!-3b z*n;}RM8zP0lnPIuNf4SlpCB4)=A@NZTLs$TdSYoO`6d7Nq!KD7VXh#0&(w=m!q262 z4C(NQWS^qBF3+JH1%*HWzIJEN>zdsp`~}WmWsR4#MJK;Vo{AYA6D}0-QE&dN3LsDP zER&;awuHHj)5pI8?6BgNQtKir14oO!e#WNw0f!BMm8qE9SK6(n{__ULj)N(PRx27P zFqyQuRwWuP1CGY+YrpB#NK4xBFl(4lcr`^cFG*~{W}XfEJ`1td+XI+z&2~iJWEo;c62N~1AR0!&Qki+s&_2cffYM9PrVfk&gmv`f~ff)pxCmAgX z{#GJoc^pUH=g$PC3(pXhbESkq#ABK=tc{n#d4VVwb-r8BeZ%0quO#9sIf+i)JgZet zq?k6oZODbmO+Co%1nJ?4moPgevh)znhi?F6d5LV!OWKf6k6je-eOps8sp2R z8VTZMz|t9tYgtpIDirwA$IU=$S{VmafEdoF6Y1jdPsEXM(UO_3YI0*eH+`iPxlOCY zmw&{*sLBiCTfOFlU2w0h4+Dt?uRG_EJnZs|z(e18vh(D?RMe^wH4WVW;7MdUh6upY z9Hg_ZsnQ)R-t^X&CsM=$-L1cN0{t31J`mLwp#9({T)0EoBl@Pv5JoZ0uq^u#OkcLl zg+2;{?~q_GgM-_@A0ipaO>h9+eHcFKxKkP^qK56V8>}~LA47ZngxvS1m{NK>kzR3b zoQF8b)i|htFASuu`Rpgl#ku*7#Q_kdI|U9$kxuNvVx8d2wc&UQ0X##Ewyy(vW#!-} zapkp2eqB*xBb2v$Z}+%vHM)B~3kckCfQMC+jcnAH=*KxCJlj!=LX^Z?$k;?k)7_rT z!`J)&#zc18KCOSRCYBrxh&A^wUrQVv4^Y~nS8 zl%hZg{T+#bqNqkhwqd>E1;EofhvbzJ&}hjGAR&8Js_CMPg_4Kk~AvEUiS5z$Rz)qd(?$9!*cSA zod+ZY2Yz?Axv|xlI=m{DP{~A`Q zmbe(@$4+F2B<*`-$k8`+sZJ@!s0)l63uwGW0&k;Y@}R%QMgp{!FB4N4>7{9K@_t6kTPCn+U(kr5WY9DgPZm0ixV5@)kmGmzI_CE-6 z6}vn+(fA{Q-eExlLDTyMOZ@x zfRDx7voldaR&7;T88(`L@c?ie!dhQ6u}gYXkDz%AK=tmE$mo+dD4p+|S7G7vDr{&K zQm;-0e@haa#4ku(c1mh@B&$o*oKs>$ynT<`(MD44}|08Ov$s&_f;|S43%*; zKb)L8os0Bx2Iac7;25N<;dFgZAbu2QG<|qZ#jEvmM|dA3p3dif%wVFY-b(<`0OF8!~DJ&9cE^g0vny&rV~icQbmxP zq%et6!aXQStnsBwWv&Vb!d0q$?z8umb;Dy%k>nHi)!ExQV~Z{v!U{R2vZRhm{VQ?0 zmSD-Fsy*e4vZ{3kW-zhRnBomMP^mh|B9Q#zM$o(Nd?k9GDXzNl>>EuG9ctEY*xbz& zpf-qaS(!pGwJz0EHPu{KZFGCL%Go~}^kcNg=ege*(UB4DadKuArv1zvQ`EaR#W{lt z8`!|6IJzp22}||^$pnn07mo3 on8%>rG~MWM?8OKc3C2w6Tlup^odgWbe{YcT(n?Y_62>9_53BO^U;qFB From 56be19a42d10426d923c978f41a52ca9d5e6f84e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 30 Jun 2015 15:13:08 +0200 Subject: [PATCH 1600/2207] Fix nomenclature of point scale/unscale methods, see #3570 --- src/geometry/Point.js | 4 ++-- src/layer/tile/GridLayer.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/geometry/Point.js b/src/geometry/Point.js index b899f6aad3e..9bc0267cf17 100644 --- a/src/geometry/Point.js +++ b/src/geometry/Point.js @@ -55,11 +55,11 @@ L.Point.prototype = { return this; }, - dotProduct: function(point) { + scaleBy: function(point) { return new L.Point(this.x * point.x, this.y * point.y); }, - dotDivision: function(point) { + unscaleBy: function(point) { return new L.Point(this.x / point.x, this.y / point.y); }, diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index c2e0a7f2d26..bf9e83e49f9 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -513,7 +513,7 @@ L.GridLayer = L.Layer.extend({ var map = this._map, tileSize = this.getTileSize(), - nwPoint = coords.dotProduct(tileSize), + nwPoint = coords.scaleBy(tileSize), sePoint = nwPoint.add(tileSize), nw = map.wrapLatLng(map.unproject(nwPoint, coords.z)), @@ -644,7 +644,7 @@ L.GridLayer = L.Layer.extend({ }, _getTilePos: function (coords) { - return coords.dotProduct(this.getTileSize()).subtract(this._level.origin); + return coords.scaleBy(this.getTileSize()).subtract(this._level.origin); }, _wrapCoords: function (coords) { @@ -658,8 +658,8 @@ L.GridLayer = L.Layer.extend({ _pxBoundsToTileRange: function (bounds) { var tileSize = this.getTileSize(); return new L.Bounds( - bounds.min.dotDivision(tileSize).floor(), - bounds.max.dotDivision(tileSize).ceil().subtract([1, 1])); + bounds.min.unscaleBy(tileSize).floor(), + bounds.max.unscaleBy(tileSize).ceil().subtract([1, 1])); }, _noTilesToLoad: function () { From 8f1a37ca2d1ba7444083e20b132fc8765209140e Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Tue, 30 Jun 2015 23:14:24 +1000 Subject: [PATCH 1601/2207] Updates homepage logos --- docs/css/main.css | 115 +++++++++++++++++++++++++++++------------- docs/images/logos.png | Bin 0 -> 204267 bytes index.html | 4 +- 3 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 docs/images/logos.png diff --git a/docs/css/main.css b/docs/css/main.css index c838130baab..5b08b666c4b 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -221,9 +221,11 @@ h3.tagline { } .container pre code { padding: .75em 1em; - background: #ddd; - color: #444; + background: #f5f5f5; + color: #444; border-radius: 5px; + white-space: pre; + overflow: scroll; } .container pre { border-radius: 5px; @@ -249,45 +251,90 @@ h3.tagline { margin-bottom: 50px; } -h2.usedby-title { - background: #999; - border-radius: 0; - margin-bottom: 0; - text-align: center; - font-weight: normal; - text-shadow: none; +.usedby-title { + text-align: center; + background-color: #f5f5f5; + padding: 1.5em 1em 1em; + margin: 0; } + .usedby { - background: #f7f7f7; - margin: 0px 0 70px; - text-align: center; - padding: 10px 10px 15px; - box-shadow: inset 0 0 25px rgba(0,0,0,0.2); + margin: 0; + text-align: center; + padding: 0 3em 2em; + background-color: #f5f5f5; } .logo { - opacity: 0.6; - padding-top: 55px; - overflow: hidden; - height: 0; - margin-right: 20px; - display: inline-block; - background: url(https://www.mapbox.com/home/home@2x.png); - background-size: 300px 1360px; + display: inline-block; + opacity: 0.6; + height: 32px; + overflow: hidden; + text-indent: -9999px; + margin: 1em; + background: url(../images/logos.png); + background-size: 100%; + vertical-align: middle; } -.logo:hover { - opacity: 1; + +.logo:hover { opacity: 1; } + +.logo-github { + background-position: 4px -529px; + width: 110px; + background-size: 110px; +} + +.logo-foursquare { + background-position: 50% -4px; + width: 135px; +} + +.logo-pinterest { + background-position: 50% -39px; + width: 115px; +} + +.logo-500px { + background-position: 50% -48px; + width: 55px; + background-size: 5em; +} + +.logo-evernote { + background-position: 50% -713px; + width: 170px; + height: 43px; +} + +.logo-ftimes { + background-position: 9px -189px; + width: 130px; + height: 40px; + background-size: 145px; +} + +.logo-wpost { + background-position: 50% -870px; + width: 170px; +} + +.logo-npr { + background-position: 50% -641px; + width: 120px; + height: 40px; +} + +.logo-usatoday { + background-position: 50% -682px; + width: 120px; + height: 30px; +} + +.logo-hipmunk { + background-position: 50% -741px; + width: 125px; } -.logo-github { background-position: 50% -660px; width: 110px; } -.logo-wpost { background-position: 50% -720px; width: 170px; } -.logo-pinterest { background-position: 50% -1260px; width: 115px; } -.logo-foursquare { background-position: 50% -360px; width: 135px; } -.logo-500px { background-position: 50% -1200px; width: 65px; } -.logo-usatoday { background-position: 50% -420px; width: 100px; } -.logo-npr { background-position: 50% -600px; width: 120px; } -.logo-ftimes { background-position: 50% -780px; width: 145px; } -.logo-hipmunk { background-position: 50% -540px; width: 125px; } -.logo-nps { background-position: 50% -960px; width: 45px; padding-top: 60px; position: relative; top: 5px;} .features { -webkit-column-count: 3; diff --git a/docs/images/logos.png b/docs/images/logos.png new file mode 100644 index 0000000000000000000000000000000000000000..29207dd90afc6c25d28fe33db096ef2baf8a5446 GIT binary patch literal 204267 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 315bdd981e9..4f84f15e55f 100644 --- a/index.html +++ b/index.html @@ -40,11 +40,11 @@

      Trusted by the best

      + - + - From 9ed06a52fdb6c65d15bb393ff79dc4d0cd549d19 Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Tue, 30 Jun 2015 23:46:58 +1000 Subject: [PATCH 1602/2207] Adds code block styles. Other small design fixes. --- docs/css/main.css | 66 +++++++++++++++++++------------- docs/highlight/styles/github.css | 5 ++- index.html | 2 + 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 5b08b666c4b..ece0c904b28 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -146,21 +146,27 @@ h1 a { } @-webkit-keyframes leafanim { - 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } + 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } } @keyframes leafanim { 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } } +h1 a img { + display: block; + margin: auto; + max-width: 100%; +} + h1 a:hover, h1 a:focus { - -webkit-filter: hue-rotate(-70deg) saturate(1.5); + -webkit-filter: hue-rotate(-70deg) saturate(1.5); } h3.tagline { font-weight: 300; - font-size: 30px; - margin-top: -15px; + font-size: 1.5em; + margin-top: -.75em; color: #777; text-align: center; margin-bottom: 30px; @@ -171,15 +177,15 @@ h3.tagline { list-style: none; padding: 0 30px; text-align: center; - font-size: 24px; + font-size: 1.25em; margin-bottom: 40px; border-bottom: 1px solid #ddd; padding-bottom: 40px; } .nav li { - display: inline; - padding: 10px; + display: inline-block; + padding: .333em .5em; color: #999; } @@ -220,9 +226,8 @@ h3.tagline { -webkit-font-smoothing: subpixel-antialiased; } .container pre code { + font-size: 14px; padding: .75em 1em; - background: #f5f5f5; - color: #444; border-radius: 5px; white-space: pre; overflow: scroll; @@ -261,7 +266,7 @@ h3.tagline { .usedby { margin: 0; text-align: center; - padding: 0 3em 2em; + padding: 0 3em 3.5em; background-color: #f5f5f5; } @@ -400,14 +405,25 @@ table.plugins td:first-child a { /* API docs */ .api-page .toc-col { - float: left; - width: 160px; + position: relative; + float: left; + width: 20%; + padding-right: 1em; + margin: 0; + box-sizing: border-box; +} + +.api-page .toc-col.map-col { + padding-right: 1.5em; + border-right: thin solid #eee; } -.map-col { - width: 180px; - border-right: 1px solid #ddd; - margin-right: 40px; +.api-page .toc-col.map-col ~ .toc-col { + right: -1.5em; +} + +.api-page .toc-col.map-col h4 { + color: #666; } #toc h4 { @@ -644,10 +660,9 @@ table.plugins td:first-child a { top: -1000px; bottom: -1000px; left: 0; - right: 3em; + width: 12.5em; background: white; background: rgba(255,255,255,0.9); - display: block; } #toc-copy h4:hover, #toc-copy h4.hover { @@ -755,6 +770,7 @@ tr:target { #toc .toc-col { width: 50%; float: none; + position: static; display: inline-block; margin: 0; border: 0; @@ -768,11 +784,6 @@ tr:target { clear: both; } - .container pre code { - word-wrap: break-word; - white-space: pre; - } - table.plugins tbody tr { display: block; padding-bottom: 1em; @@ -872,9 +883,6 @@ tr:target { } .features { -webkit-column-count: 2; } - - .api-page h2[id]:before { - } } @media screen and (max-width: 500px) { @@ -906,6 +914,12 @@ tr:target { border: 0; } + .post-date { + float: none; + width: auto; + margin: 0 0 .333em; + } + .api-page h2[id] { text-indent: 24px; } .api-page h2[id]:before { margin-left: -28px; } } diff --git a/docs/highlight/styles/github.css b/docs/highlight/styles/github.css index ba1fabd9198..c0fe43c252d 100644 --- a/docs/highlight/styles/github.css +++ b/docs/highlight/styles/github.css @@ -5,9 +5,10 @@ github.com style (c) Vasily Polovnyov */ pre code { - display: block; padding: 0.5em; + display: block; + padding: 0.5em; color: #000; - background: #f8f8ff + background: #f5f5f5; } code .comment, diff --git a/index.html b/index.html index 4f84f15e55f..1ca6951501a 100644 --- a/index.html +++ b/index.html @@ -36,6 +36,7 @@

      Trusted by the best

      +
      @@ -46,6 +47,7 @@

      Trusted by the best

      +

      Yhdc?qofu-2qDRb(IA38zCQvZ;Y5 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

      From 4b7f599644cbe48e2bfc35f4c112efef1dd17dfb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 30 Jun 2015 18:40:27 +0300 Subject: [PATCH 1603/2207] fix docs floating menu --- docs/css/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/css/main.css b/docs/css/main.css index ece0c904b28..20afbaf950b 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -484,6 +484,10 @@ table.plugins td:first-child a { z-index: 10; } +#toc-copy .toc-col { + position: static; +} + @media screen and (max-width: 1350px) { #toc-copy { display: block; From 3261a47826266660ffb2d1bda819caaf7bdfe568 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 30 Jun 2015 18:45:59 +0300 Subject: [PATCH 1604/2207] consistent whitepace in CSS --- docs/css/main.css | 950 +++++++++++++++++++++++----------------------- 1 file changed, 475 insertions(+), 475 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 20afbaf950b..22560320a14 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -2,16 +2,16 @@ /* general styles */ html, body, input, select, button, textarea, table { - font-size: 100%; - font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; + font-size: 100%; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; } body { - line-height: 1.5; - color: #333; + line-height: 1.5; + color: #333; } p { @@ -19,11 +19,11 @@ p { } a { - color: #1EB300; + color: #1EB300; } a:hover, a:focus { - color: #160; + color: #160; } hr { @@ -37,12 +37,12 @@ hr { .clearfix:before, .clearfix:after { - content: " "; /* 1 */ - display: table; /* 2 */ + content: " "; + display: table; } .clearfix:after { - clear: both; + clear: both; } table { @@ -52,57 +52,57 @@ table { th, td { text-align: left; - border: 0; - padding: 1em; + border: 0; + padding: 1em; } table td { - color: #666; + color: #666; } table td:first-child { - color: #777; + color: #777; } table td:last-child { - color: black; + color: black; } table td code i { - color: #00A707; + color: #00A707; } table td code b { - color: black; - font-weight: normal; + color: black; + font-weight: normal; } table tbody tr { - background-color: #fafafa; + background-color: #fafafa; } table tbody tr:nth-child(odd) { - background-color: #f5f5f5; + background-color: #f5f5f5; } /* headings */ h2 { - margin: 30px 0 20px; - padding-top: 20px; - font-weight: 400; - font-size: 2em; - font-weight: 300; - color: black; + margin: 30px 0 20px; + padding-top: 20px; + font-weight: 400; + font-size: 2em; + font-weight: 300; + color: black; } .container > h2:first-child { - margin-bottom: 40px; + margin-bottom: 40px; } h2:target { - color: #1EB300; + color: #1EB300; } h3 { @@ -119,7 +119,7 @@ h4 { .container { max-width: 54em; - padding: 0 6em 1.5em; + padding: 0 6em 1.5em; margin: 0 auto; } .footer { @@ -136,31 +136,31 @@ h1 { } h1 a { - display: block; - margin: auto; - padding: 0 2em; + display: block; + margin: auto; + padding: 0 2em; -webkit-transition: 0.8s all; -webkit-animation: leafanim 3s ease 3s 1 normal none; - transition: 0.8s all; - animation: leafanim 3s ease 3s 1 normal none; + transition: 0.8s all; + animation: leafanim 3s ease 3s 1 normal none; } @-webkit-keyframes leafanim { - 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } + 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } } @keyframes leafanim { - 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } + 50% { -webkit-filter: hue-rotate(-70deg) saturate(1.2); } } h1 a img { - display: block; - margin: auto; - max-width: 100%; + display: block; + margin: auto; + max-width: 100%; } h1 a:hover, h1 a:focus { - -webkit-filter: hue-rotate(-70deg) saturate(1.5); + -webkit-filter: hue-rotate(-70deg) saturate(1.5); } h3.tagline { @@ -184,8 +184,8 @@ h3.tagline { } .nav li { - display: inline-block; - padding: .333em .5em; + display: inline-block; + padding: .333em .5em; color: #999; } @@ -195,16 +195,16 @@ h3.tagline { } .ext-links { - position: fixed; - top: 1.5em; - right: 1.5em; + position: fixed; + top: 1.5em; + right: 1.5em; } .ext-link { - display: block; - opacity: 0.5; - -webkit-animation: fadein 1s; - animation: fadein 1s; + display: block; + opacity: 0.5; + -webkit-animation: fadein 1s; + animation: fadein 1s; } .ext-link:hover { opacity: 1; @@ -214,8 +214,8 @@ h3.tagline { to { opacity: 0.5; } } @keyframes fadein { - from { opacity: 0; } - to { opacity: 0.5; } + from { opacity: 0; } + to { opacity: 0.5; } } @@ -223,14 +223,14 @@ h3.tagline { .container code, .container pre code { font-family: "Consolas", "Menlo", "Lucida Console", "Courier New", monospace; - -webkit-font-smoothing: subpixel-antialiased; + -webkit-font-smoothing: subpixel-antialiased; } .container pre code { - font-size: 14px; + font-size: 14px; padding: .75em 1em; - border-radius: 5px; - white-space: pre; - overflow: scroll; + border-radius: 5px; + white-space: pre; + overflow: scroll; } .container pre { border-radius: 5px; @@ -257,88 +257,88 @@ h3.tagline { } .usedby-title { - text-align: center; - background-color: #f5f5f5; - padding: 1.5em 1em 1em; - margin: 0; + text-align: center; + background-color: #f5f5f5; + padding: 1.5em 1em 1em; + margin: 0; } .usedby { - margin: 0; - text-align: center; - padding: 0 3em 3.5em; - background-color: #f5f5f5; + margin: 0; + text-align: center; + padding: 0 3em 3.5em; + background-color: #f5f5f5; } .logo { - display: inline-block; - opacity: 0.6; - height: 32px; - overflow: hidden; - text-indent: -9999px; - margin: 1em; - background: url(../images/logos.png); - background-size: 100%; - vertical-align: middle; + display: inline-block; + opacity: 0.6; + height: 32px; + overflow: hidden; + text-indent: -9999px; + margin: 1em; + background: url(../images/logos.png); + background-size: 100%; + vertical-align: middle; } .logo:hover { opacity: 1; } .logo-github { - background-position: 4px -529px; - width: 110px; - background-size: 110px; + background-position: 4px -529px; + width: 110px; + background-size: 110px; } .logo-foursquare { - background-position: 50% -4px; - width: 135px; + background-position: 50% -4px; + width: 135px; } .logo-pinterest { - background-position: 50% -39px; - width: 115px; + background-position: 50% -39px; + width: 115px; } .logo-500px { - background-position: 50% -48px; - width: 55px; - background-size: 5em; + background-position: 50% -48px; + width: 55px; + background-size: 5em; } .logo-evernote { - background-position: 50% -713px; - width: 170px; - height: 43px; + background-position: 50% -713px; + width: 170px; + height: 43px; } .logo-ftimes { - background-position: 9px -189px; - width: 130px; - height: 40px; - background-size: 145px; + background-position: 9px -189px; + width: 130px; + height: 40px; + background-size: 145px; } .logo-wpost { - background-position: 50% -870px; - width: 170px; + background-position: 50% -870px; + width: 170px; } .logo-npr { - background-position: 50% -641px; - width: 120px; - height: 40px; + background-position: 50% -641px; + width: 120px; + height: 40px; } .logo-usatoday { - background-position: 50% -682px; - width: 120px; - height: 30px; + background-position: 50% -682px; + width: 120px; + height: 30px; } .logo-hipmunk { - background-position: 50% -741px; - width: 125px; + background-position: 50% -741px; + width: 125px; } .features { @@ -360,15 +360,15 @@ h3.tagline { .example-img { float: left; - width: 10em; - max-width: 100%; - border-radius: 5px; - margin: 0 1.5em 1.5em 0; - border: thin solid #ccc; + width: 10em; + max-width: 100%; + border-radius: 5px; + margin: 0 1.5em 1.5em 0; + border: thin solid #ccc; } .examples .container h3 { - margin-top: 0; + margin-top: 0; } .post-date { float: left; @@ -393,7 +393,7 @@ h3.tagline { } table.plugins td:first-child a { - font-weight: bold; + font-weight: bold; } .plugins-page .toc-col { @@ -405,25 +405,25 @@ table.plugins td:first-child a { /* API docs */ .api-page .toc-col { - position: relative; - float: left; - width: 20%; - padding-right: 1em; - margin: 0; - box-sizing: border-box; + position: relative; + float: left; + width: 20%; + padding-right: 1em; + margin: 0; + box-sizing: border-box; } .api-page .toc-col.map-col { - padding-right: 1.5em; - border-right: thin solid #eee; + padding-right: 1.5em; + border-right: thin solid #eee; } .api-page .toc-col.map-col ~ .toc-col { - right: -1.5em; + right: -1.5em; } .api-page .toc-col.map-col h4 { - color: #666; + color: #666; } #toc h4 { @@ -438,50 +438,50 @@ table.plugins td:first-child a { } #toc .colborder { - padding-right: 14px; + padding-right: 14px; } #toc .span-3 { - margin: 0; - padding-right: 3em; - width: 16.825%; - box-sizing: border-box; + margin: 0; + padding-right: 3em; + width: 16.825%; + box-sizing: border-box; } #toc .span-3.last { - padding-right: 0; + padding-right: 0; } #toc-copy { - display: none; + display: none; } #toc-copy div { - border: 0; - margin: 0; - padding: 0; - width: auto; - float: none; + border: 0; + margin: 0; + padding: 0; + width: auto; + float: none; } #toc-copy h4 { - margin: 0; - padding-bottom: .333em; + margin: 0; + padding-bottom: .333em; } #toc-copy ul { - display: none; - list-style: none; + display: none; + list-style: none; } #toc-copy ul li { - white-space: nowrap; + white-space: nowrap; } #toc-copy ul li a { - position: relative; - padding: .25em .5em 0; - z-index: 10; + position: relative; + padding: .25em .5em 0; + z-index: 10; } #toc-copy .toc-col { @@ -489,190 +489,190 @@ table.plugins td:first-child a { } @media screen and (max-width: 1350px) { - #toc-copy { - display: block; - position: fixed; - top: 0.1em; - left: 0.25em; - width: 32px; - height: 32px; - opacity: 0; - cursor: pointer; - -webkit-transition: opacity .2s ease; - transition: opacity .2s ease; - } - - #toc-copy > div { display: none; } - - .scrolled #toc-copy { - opacity: 1; - background: white; - } - - #toc-copy.active { - background-color: white; - background-color: rgba(255, 255, 255, 0.9); - padding: 2em; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: scroll; - cursor: default; - box-sizing: border-box; - } - - #toc-copy:before, - #toc-copy:after { - content: ''; - position: absolute; - left: 5px; - width: 22px; - height: 14px; - border-top: 2px solid black; - cursor: pointer; - box-sizing: border-box; - -webkit-transition: -webkit-transform .25s ease; - transition: transform .25s ease; - } - - #toc-copy:before { - top: 9px; - border-bottom: 2px solid black; - } - - #toc-copy:after { - top: 15px; - } - - #toc-copy.active:before { - top: 5px; - left: 9px; - border-bottom: 0; - -webkit-transform: rotate(-135deg); - transform: rotate(-135deg); - } - - #toc-copy.active:after { - top: 13px; - left: 9px; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - } - - #toc-copy.active div { display: block; } - - #toc-copy h4.active, #toc-copy h4:hover { - color: black; - cursor: pointer; - } - - #toc-copy h4.active + ul { - display: block; - padding: 0; - margin: 0 0 .5em; - } - - #toc-copy ul li a { padding: .25em 0; } + #toc-copy { + display: block; + position: fixed; + top: 0.1em; + left: 0.25em; + width: 32px; + height: 32px; + opacity: 0; + cursor: pointer; + -webkit-transition: opacity .2s ease; + transition: opacity .2s ease; + } + + #toc-copy > div { display: none; } + + .scrolled #toc-copy { + opacity: 1; + background: white; + } + + #toc-copy.active { + background-color: white; + background-color: rgba(255, 255, 255, 0.9); + padding: 2em; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: scroll; + cursor: default; + box-sizing: border-box; + } + + #toc-copy:before, + #toc-copy:after { + content: ''; + position: absolute; + left: 5px; + width: 22px; + height: 14px; + border-top: 2px solid black; + cursor: pointer; + box-sizing: border-box; + -webkit-transition: -webkit-transform .25s ease; + transition: transform .25s ease; + } + + #toc-copy:before { + top: 9px; + border-bottom: 2px solid black; + } + + #toc-copy:after { + top: 15px; + } + + #toc-copy.active:before { + top: 5px; + left: 9px; + border-bottom: 0; + -webkit-transform: rotate(-135deg); + transform: rotate(-135deg); + } + + #toc-copy.active:after { + top: 13px; + left: 9px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + + #toc-copy.active div { display: block; } + + #toc-copy h4.active, #toc-copy h4:hover { + color: black; + cursor: pointer; + } + + #toc-copy h4.active + ul { + display: block; + padding: 0; + margin: 0 0 .5em; + } + + #toc-copy ul li a { padding: .25em 0; } } @media screen and (min-width: 900px) and (max-width: 1350px) { - #toc-copy { - width: 40px; - height: 40px; - } + #toc-copy { + width: 40px; + height: 40px; + } - #toc-copy.active { - padding: 2.5em; - } + #toc-copy.active { + padding: 2.5em; + } - #toc-copy:before, - #toc-copy:after { - left: 8px; - } + #toc-copy:before, + #toc-copy:after { + left: 8px; + } - #toc-copy:before { top: 13px; } + #toc-copy:before { top: 13px; } - #toc-copy:after { top: 19px; } + #toc-copy:after { top: 19px; } - #toc-copy.active:before { - top: 7px; - left: 10px; - } + #toc-copy.active:before { + top: 7px; + left: 10px; + } - #toc-copy.active:after { - top: 15px; - left: 10px; - } + #toc-copy.active:after { + top: 15px; + left: 10px; + } } @media screen and (min-width: 1350px) and (min-height: 600px) { - #toc-copy { - display: block; - position: fixed; - top: 0; - left: 0; - width: auto; - height: auto; - padding: 2em; - opacity: 0; - transition: opacity .25s ease; - -webkit-transition: opacity .25s ease; - } - - #toc-copy:before { - content: 'Table of contents'; - display: block; - margin: -.25em 0 1em; - font-size: 75%; - font-weight: 300; - text-transform: uppercase; - } - - .scrolled #toc-copy { opacity: 1; } - - #toc-copy h4 { padding-right: 5em; } - - #toc-copy ul { - position: absolute; - left: 100%; - margin: -4.9em 0 0 -4.5em; - padding: 3em 6em 3em 0; - } - - #toc-copy h4:hover + ul, - #toc-copy ul:hover { - display: block; - } - - #toc-copy h4:hover + ul:before, - #toc-copy ul:hover:before { - content: ''; - position: absolute; - top: 3.775em; - right: 100%; - margin-right: .25em; - width: 1em; - height: 1em; - border-top: 2px solid #eee; - } - - #toc-copy h4:hover + ul:after, - #toc-copy ul:hover:after { - content: ''; - position: absolute; - z-index: -1; - top: -1000px; - bottom: -1000px; - left: 0; - width: 12.5em; - background: white; - background: rgba(255,255,255,0.9); - } - - #toc-copy h4:hover, #toc-copy h4.hover { - color: black; - cursor: pointer; - } + #toc-copy { + display: block; + position: fixed; + top: 0; + left: 0; + width: auto; + height: auto; + padding: 2em; + opacity: 0; + transition: opacity .25s ease; + -webkit-transition: opacity .25s ease; + } + + #toc-copy:before { + content: 'Table of contents'; + display: block; + margin: -.25em 0 1em; + font-size: 75%; + font-weight: 300; + text-transform: uppercase; + } + + .scrolled #toc-copy { opacity: 1; } + + #toc-copy h4 { padding-right: 5em; } + + #toc-copy ul { + position: absolute; + left: 100%; + margin: -4.9em 0 0 -4.5em; + padding: 3em 6em 3em 0; + } + + #toc-copy h4:hover + ul, + #toc-copy ul:hover { + display: block; + } + + #toc-copy h4:hover + ul:before, + #toc-copy ul:hover:before { + content: ''; + position: absolute; + top: 3.775em; + right: 100%; + margin-right: .25em; + width: 1em; + height: 1em; + border-top: 2px solid #eee; + } + + #toc-copy h4:hover + ul:after, + #toc-copy ul:hover:after { + content: ''; + position: absolute; + z-index: -1; + top: -1000px; + bottom: -1000px; + left: 0; + width: 12.5em; + background: white; + background: rgba(255,255,255,0.9); + } + + #toc-copy h4:hover, #toc-copy h4.hover { + color: black; + cursor: pointer; + } } /* API docs - tables */ @@ -687,8 +687,8 @@ table.plugins td:first-child a { color: black; } .api-page table td:last-child code { - word-break: break-word; - white-space: pre-wrap; + word-break: break-word; + white-space: pre-wrap; } .api-page table td code i { color: #9a9; @@ -709,7 +709,7 @@ table.plugins td:first-child a { tr:target { background: yellow; -webkit-animation: highlight 2s ease 0.5s 1 normal forwards; - animation: highlight 2s ease 0.5s 1 normal forwards; + animation: highlight 2s ease 0.5s 1 normal forwards; } @-webkit-keyframes highlight { @@ -740,190 +740,190 @@ tr:target { } .api-page h2[id]:before { - margin-left: -32px; - margin-top: 14px; + margin-left: -32px; + margin-top: 14px; } .api-page tr[id] td:first-child:before { - opacity: 0; + opacity: 0; } .api-page tr[id]:hover td:first-child:before { - opacity: 1; + opacity: 1; } .api-page h2[id]:hover:before { opacity: 1; } @media (-webkit-min-device-pixel-ratio: 1.25),(min-resolution: 120dpi) { - .api-page h2[id]:before, - .api-page tr[id] td:first-child:before { - background-image: url(../images/sprite.svg); - } + .api-page h2[id]:before, + .api-page tr[id] td:first-child:before { + background-image: url(../images/sprite.svg); + } } @media screen and (max-width: 767px) { - #toc .colborder { - padding: 0; - } - - .colborder { - margin: 0; - border: 0; - } - - #toc .toc-col { - width: 50%; - float: none; - position: static; - display: inline-block; - margin: 0; - border: 0; - padding-right: .5em; - margin-right: -.25em; - vertical-align: top; - box-sizing: border-box; - } - - .toc-col.last-col { - clear: both; - } - - table.plugins tbody tr { - display: block; - padding-bottom: 1em; - } - - table.plugins tbody tr td { - white-space: normal; - display: inline-block; - padding-bottom: 0; - } - - table.plugins tr:first-child { - padding-bottom: 0; - } - - table.plugins tr:first-child th { - display: block; - } - - table.plugins tr:first-child th ~ th { - display: none; - } - - table.plugins td:first-child { - display: block; - white-space: normal; - } - - .api-page table tbody tr { - display: block; - } - - .api-page table tbody tr th, - .api-page table tbody tr td { - display: inline-block; - background-color: transparent; - width: auto; - } - - .api-page table tr:first-child th ~ th { - display: none; - } - - .api-page table tbody tr th:nth-child(2), - .api-page table tbody tr th:nth-child(3) { - display: inline-block; - } - - .api-page table tr th:last-child { - display: none !important; - } - - .api-page table tbody tr td:last-child { - display: block; - border-top: thin dashed #ddd; - padding: 1em; - } - - .api-page table tbody tr td:last-child:before { - content: 'Description'; - display: block; - text-transform: uppercase; - font-size: 90%; - margin-bottom: .75em; - color: #666; - } - - td code { - word-break: break-word; - } + #toc .colborder { + padding: 0; + } + + .colborder { + margin: 0; + border: 0; + } + + #toc .toc-col { + width: 50%; + float: none; + position: static; + display: inline-block; + margin: 0; + border: 0; + padding-right: .5em; + margin-right: -.25em; + vertical-align: top; + box-sizing: border-box; + } + + .toc-col.last-col { + clear: both; + } + + table.plugins tbody tr { + display: block; + padding-bottom: 1em; + } + + table.plugins tbody tr td { + white-space: normal; + display: inline-block; + padding-bottom: 0; + } + + table.plugins tr:first-child { + padding-bottom: 0; + } + + table.plugins tr:first-child th { + display: block; + } + + table.plugins tr:first-child th ~ th { + display: none; + } + + table.plugins td:first-child { + display: block; + white-space: normal; + } + + .api-page table tbody tr { + display: block; + } + + .api-page table tbody tr th, + .api-page table tbody tr td { + display: inline-block; + background-color: transparent; + width: auto; + } + + .api-page table tr:first-child th ~ th { + display: none; + } + + .api-page table tbody tr th:nth-child(2), + .api-page table tbody tr th:nth-child(3) { + display: inline-block; + } + + .api-page table tr th:last-child { + display: none !important; + } + + .api-page table tbody tr td:last-child { + display: block; + border-top: thin dashed #ddd; + padding: 1em; + } + + .api-page table tbody tr td:last-child:before { + content: 'Description'; + display: block; + text-transform: uppercase; + font-size: 90%; + margin-bottom: .75em; + color: #666; + } + + td code { + word-break: break-word; + } } @media screen and (max-width: 56em) { - .container { - padding: 0 2em 1.5em; - } + .container { + padding: 0 2em 1.5em; + } - .footer, .social-buttons { - text-align: center; - } + .footer, .social-buttons { + text-align: center; + } - .footer { - margin-top: 2em; - } + .footer { + margin-top: 2em; + } - .ext-links { - position: static; - margin: 0 auto 2em; - text-align: center; - clear: both; - } + .ext-links { + position: static; + margin: 0 auto 2em; + text-align: center; + clear: both; + } - .ext-link { - display: inline-block; - vertical-align: middle; - margin: .25em; - } + .ext-link { + display: inline-block; + vertical-align: middle; + margin: .25em; + } - .features { -webkit-column-count: 2; } + .features { -webkit-column-count: 2; } } @media screen and (max-width: 500px) { - .nav { - font-size: 1.25em; - } - - h3.tagline { - font-size: 1.333em; - margin: 0 2em; - } - - .container { - padding: 0 1.5em 1.5em; - } - - .usedby { - padding-left: 0; - padding-right: 0; - } - - .features { -webkit-column-count: 1; } - - .example-img { - float: none; - display: block; - width: auto; - margin: 0 0 -.25em; - border: 0; - } - - .post-date { - float: none; - width: auto; - margin: 0 0 .333em; - } - - .api-page h2[id] { text-indent: 24px; } - .api-page h2[id]:before { margin-left: -28px; } + .nav { + font-size: 1.25em; + } + + h3.tagline { + font-size: 1.333em; + margin: 0 2em; + } + + .container { + padding: 0 1.5em 1.5em; + } + + .usedby { + padding-left: 0; + padding-right: 0; + } + + .features { -webkit-column-count: 1; } + + .example-img { + float: none; + display: block; + width: auto; + margin: 0 0 -.25em; + border: 0; + } + + .post-date { + float: none; + width: auto; + margin: 0 0 .333em; + } + + .api-page h2[id] { text-indent: 24px; } + .api-page h2[id]:before { margin-left: -28px; } } From ff5ad196f4f7480ea5626f81791838aaed1773d0 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 30 Jun 2015 19:16:31 +0300 Subject: [PATCH 1605/2207] docs page adjustments --- docs/css/main.css | 46 +++++++++++++++++++++++++++++++++------------- download.md | 1 + reference.html | 2 +- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 22560320a14..43828d5c7d5 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -48,12 +48,18 @@ hr { table { width: 100%; border-collapse: collapse; + margin-bottom: 2em; } th, td { text-align: left; border: 0; - padding: 1em; + border-bottom: 1px solid #eee; + padding: 0.5em 1em 0.5em 5px; +} + +table th { + background: #eee; } table td { @@ -77,14 +83,6 @@ table td code b { font-weight: normal; } -table tbody tr { - background-color: #fafafa; -} - -table tbody tr:nth-child(odd) { - background-color: #f5f5f5; -} - /* headings */ @@ -111,7 +109,7 @@ h3 { } h4 { color: #999; - margin: 1em 0 0.5em; + margin: 1em 0 1em; } @@ -414,7 +412,6 @@ table.plugins td:first-child a { } .api-page .toc-col.map-col { - padding-right: 1.5em; border-right: thin solid #eee; } @@ -702,8 +699,8 @@ table.plugins td:first-child a { font-size: 14px; } -.api-page h4 { - margin-top: 20px; +.api-page p { + margin-top: 0; } tr:target { @@ -927,3 +924,26 @@ tr:target { .api-page h2[id] { text-indent: 24px; } .api-page h2[id]:before { margin-left: -28px; } } + +.width250 { + width: 250px; +} +.width200 { + width: 200px; +} +.width300 { + width: 300px; +} +.width100 { + width: 100px; +} +.width140 { + width: 140px; +} +.minwidth { + width: 1px; +} + +.download-page table td a { + white-space: nowrap; +} diff --git a/download.md b/download.md index 49aedaaa3da..86d68a6129f 100644 --- a/download.md +++ b/download.md @@ -1,6 +1,7 @@ --- layout: v2 title: Download +bodyclass: download-page --- ## Download Leaflet diff --git a/reference.html b/reference.html index 497ad66b5d2..2f7c14ac303 100644 --- a/reference.html +++ b/reference.html @@ -1471,7 +1471,7 @@

      Methods

      - + From 2862fe8a09efe71a5b50061db08dcb3a83300e5a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 30 Jun 2015 19:46:29 +0300 Subject: [PATCH 1606/2207] adjust "used by" block --- docs/css/main.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 43828d5c7d5..f55c1edf017 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -257,14 +257,14 @@ h3.tagline { .usedby-title { text-align: center; background-color: #f5f5f5; - padding: 1.5em 1em 1em; + padding: 1.5em 1em 0.5em; margin: 0; } .usedby { margin: 0; text-align: center; - padding: 0 3em 3.5em; + padding: 0 3em 2em; background-color: #f5f5f5; } From 6bd7b1a88df233da29392215a57174ba814c2516 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 30 Jun 2015 20:01:03 +0300 Subject: [PATCH 1607/2207] fix features columns in FF --- docs/css/main.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/css/main.css b/docs/css/main.css index f55c1edf017..2867ed9fa66 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -341,6 +341,8 @@ h3.tagline { .features { -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; } .features ul { padding-left: 1.2em; From 58a7d4378df29329ded95b8370827fd5fc72c859 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 30 Jun 2015 20:03:55 +0300 Subject: [PATCH 1608/2207] bigger thumbs in tutorials --- docs/css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/css/main.css b/docs/css/main.css index 2867ed9fa66..ea4b8295a6a 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -360,7 +360,7 @@ h3.tagline { .example-img { float: left; - width: 10em; + width: 14em; max-width: 100%; border-radius: 5px; margin: 0 1.5em 1.5em 0; From f41d06eaf2a814633d585e7243a8b80d18e966d9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 00:26:34 +0300 Subject: [PATCH 1609/2207] update highlight.js and color theme --- _layouts/v2.html | 4 +- docs/css/main.css | 6 +- docs/highlight/highlight.pack.js | 2 +- docs/highlight/styles/github-gist.css | 211 ++++++++++++++++++++++++++ 4 files changed, 217 insertions(+), 6 deletions(-) create mode 100644 docs/highlight/styles/github-gist.css diff --git a/_layouts/v2.html b/_layouts/v2.html index a502f4296f7..32af78f4d0e 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -31,7 +31,7 @@ - + @@ -123,7 +123,7 @@

      an open-source JavaScript library
      for mobile-friendly in ",rE:!0,sL:""}},s,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:/[^ \/><\n\t]+/,r:0},c]}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,e.NM,s,a,t]}}); \ No newline at end of file diff --git a/docs/highlight/styles/github-gist.css b/docs/highlight/styles/github-gist.css new file mode 100644 index 00000000000..a5bef1668b2 --- /dev/null +++ b/docs/highlight/styles/github-gist.css @@ -0,0 +1,211 @@ +/** + * GitHub Gist Theme + * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro + */ + +.hljs { + display: block; + background:#f8f8f8; + padding: 0.5em; + color: #333333; + overflow-x: auto; + -webkit-text-size-adjust: none; +} + +.hljs-comment, +.bash .hljs-shebang, +.java .hljs-javadoc, +.javascript .hljs-javadoc { + color: #969896; +} + +.hljs-string, +.apache .hljs-sqbracket, +.coffeescript .hljs-subst, +.coffeescript .hljs-regexp, +.cpp .hljs-preprocessor, +.c .hljs-preprocessor, +.javascript .hljs-regexp, +.json .hljs-attribute, +.makefile .hljs-variable, +.markdown .hljs-value, +.markdown .hljs-link_label, +.markdown .hljs-strong, +.markdown .hljs-emphasis, +.markdown .hljs-blockquote, +.nginx .hljs-regexp, +.nginx .hljs-number, +.objectivec .hljs-preprocessor .hljs-title, +.perl .hljs-regexp, +.php .hljs-regexp, +.xml .hljs-value, +.less .hljs-built_in, +.scss .hljs-built_in { + color: #df5000; +} + +.hljs-keyword, +.css .hljs-at_rule, +.css .hljs-important, +.http .hljs-request, +.ini .hljs-setting, +.java .hljs-javadoctag, +.javascript .hljs-tag, +.javascript .hljs-javadoctag, +.nginx .hljs-title, +.objectivec .hljs-preprocessor, +.php .hljs-phpdoc, +.sql .hljs-built_in, +.less .hljs-tag, +.less .hljs-at_rule, +.scss .hljs-tag, +.scss .hljs-at_rule, +.scss .hljs-important, +.stylus .hljs-at_rule, +.go .hljs-typename, +.swift .hljs-preprocessor { + color: #a71d5d; +} + +.apache .hljs-common, +.apache .hljs-cbracket, +.apache .hljs-keyword, +.bash .hljs-literal, +.bash .hljs-built_in, +.coffeescript .hljs-literal, +.coffeescript .hljs-built_in, +.coffeescript .hljs-number, +.cpp .hljs-number, +.cpp .hljs-built_in, +.c .hljs-number, +.c .hljs-built_in, +.cs .hljs-number, +.cs .hljs-built_in, +.css .hljs-attribute, +.css .hljs-hexcolor, +.css .hljs-number, +.css .hljs-function, +.http .hljs-literal, +.http .hljs-attribute, +.java .hljs-number, +.javascript .hljs-built_in, +.javascript .hljs-literal, +.javascript .hljs-number, +.json .hljs-number, +.makefile .hljs-keyword, +.markdown .hljs-link_reference, +.nginx .hljs-built_in, +.objectivec .hljs-literal, +.objectivec .hljs-number, +.objectivec .hljs-built_in, +.php .hljs-literal, +.php .hljs-number, +.python .hljs-number, +.ruby .hljs-prompt, +.ruby .hljs-constant, +.ruby .hljs-number, +.ruby .hljs-subst .hljs-keyword, +.ruby .hljs-symbol, +.sql .hljs-number, +.puppet .hljs-function, +.less .hljs-number, +.less .hljs-hexcolor, +.less .hljs-function, +.less .hljs-attribute, +.scss .hljs-preprocessor, +.scss .hljs-number, +.scss .hljs-hexcolor, +.scss .hljs-function, +.scss .hljs-attribute, +.stylus .hljs-number, +.stylus .hljs-hexcolor, +.stylus .hljs-attribute, +.stylus .hljs-params, +.go .hljs-built_in, +.go .hljs-constant, +.swift .hljs-built_in, +.swift .hljs-number { + color: #0086b3; +} + +.apache .hljs-tag, +.cs .hljs-xmlDocTag, +.css .hljs-tag, +.xml .hljs-title, +.stylus .hljs-tag { + color: #63a35c; +} + +.bash .hljs-variable, +.cs .hljs-preprocessor, +.cs .hljs-preprocessor .hljs-keyword, +.css .hljs-attr_selector, +.css .hljs-value, +.ini .hljs-value, +.ini .hljs-keyword, +.javascript .hljs-tag .hljs-title, +.makefile .hljs-constant, +.nginx .hljs-variable, +.xml .hljs-tag, +.scss .hljs-variable { + color: #333333; +} + +.bash .hljs-title, +.coffeescript .hljs-title, +.cpp .hljs-title, +.c .hljs-title, +.cs .hljs-title, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo, +.ini .hljs-title, +.java .hljs-title, +.javascript .hljs-title, +.makefile .hljs-title, +.objectivec .hljs-title, +.perl .hljs-sub, +.php .hljs-title, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-parent, +.ruby .hljs-title, +.xml .hljs-attribute, +.puppet .hljs-title, +.less .hljs-id, +.less .hljs-pseudo, +.less .hljs-class, +.scss .hljs-id, +.scss .hljs-pseudo, +.scss .hljs-class, +.stylus .hljs-class, +.stylus .hljs-id, +.stylus .hljs-pseudo, +.stylus .hljs-title, +.swift .hljs-title, +.diff .hljs-chunk { + color: #795da3; +} + +.coffeescript .hljs-reserved, +.coffeescript .hljs-attribute { + color: #1d3e81; +} + +.diff .hljs-chunk { + font-weight: bold; +} + +.diff .hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.diff .hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.markdown .hljs-link_url { + text-decoration: underline; +} From 29eac1d26741f597eea5df0bfd6255f4781ac907 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 00:30:43 +0300 Subject: [PATCH 1610/2207] bring back the back link --- _layouts/tutorial.html | 2 +- docs/css/main.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/_layouts/tutorial.html b/_layouts/tutorial.html index affbb8de5f7..fecfeb48773 100644 --- a/_layouts/tutorial.html +++ b/_layouts/tutorial.html @@ -4,6 +4,6 @@ tutorial: true --- - +

      ← Tutorials

      {{ content }} diff --git a/docs/css/main.css b/docs/css/main.css index c1cf511c050..30f9c53c860 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -949,3 +949,7 @@ tr:target { .download-page table td a { white-space: nowrap; } + +.tutorials-back { + margin-bottom: -3em; +} From dad04909758e8cc3db3a65c860de4b3f2b898e3d Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 10:04:54 +0300 Subject: [PATCH 1611/2207] add logo links, remove Hipmunk --- index.html | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index 1ca6951501a..1ccd8fde30a 100644 --- a/index.html +++ b/index.html @@ -37,16 +37,15 @@

      Trusted by the best

      From 59c78a1c03f0067572e4d9227d5d9c480d131596 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 10:14:40 +0300 Subject: [PATCH 1612/2207] mobile table adjustments --- docs/css/main.css | 13 +++++++++++-- plugins.md | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 30f9c53c860..02ca5754b37 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -787,6 +787,15 @@ tr:target { clear: both; } + th, + td { + border: 0; + } + + tr { + border-bottom: 1px solid #eee; + } + table.plugins tbody tr { display: block; padding-bottom: 1em; @@ -845,14 +854,14 @@ tr:target { padding: 1em; } - .api-page table tbody tr td:last-child:before { + /*.api-page table tbody tr td:last-child:before { content: 'Description'; display: block; text-transform: uppercase; font-size: 90%; margin-bottom: .75em; color: #666; - } + }*/ td code { word-break: break-word; diff --git a/plugins.md b/plugins.md index 20cb5990791..0b23da36661 100644 --- a/plugins.md +++ b/plugins.md @@ -154,7 +154,7 @@ Ready-to-go basemaps, with little or no configuration at all.

      From 907176e9a09964b8a527a1c6709b7f53fa7672bb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 10:33:12 +0300 Subject: [PATCH 1613/2207] simplify features section copy --- index.html | 64 +++++++++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/index.html b/index.html index 1ccd8fde30a..6b415a74556 100644 --- a/index.html +++ b/index.html @@ -53,19 +53,17 @@

      Trusted by the best

      Features

      -

      Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly. It should still satisfy the needs of the vast majority of map apps developers while being easily extended by third-party plugins.

      +

      Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly.

      -

      Map Layers Out of the Box

      +

      Layers Out of the Box

        -
      • Tile layers
      • -
      • Markers
      • -
      • Popups
      • -
      • Image overlays
      • +
      • Tile layers, WMS
      • +
      • Markers, Popups
      • Vector layers: polylines, polygons, circles, rectangles
      • +
      • Image overlays
      • GeoJSON
      • -
      • WMS
      @@ -73,28 +71,11 @@

      Interaction Features

      • Drag panning with inertia
      • -
      - -

      On Desktop Browsers

      - -
      • Scroll wheel zoom
      • +
      • Pinch-zoom on mobile
      • Double click zoom
      • Zoom to area (shift-drag)
      • -
      • Keyboard navigation (with arrows and +/- keys)
      • -
      - - -

      Mobile Browsers

      - -
        -
      • Pinch-zoom (iOS, Android 4+, Win8)
      • -
      • Double tap zoom
      • -
      - -

      For Layers

      - -
        +
      • Keyboard navigation
      • Events: click, mouseover, etc.
      • Marker dragging
      @@ -102,11 +83,10 @@

      For Layers

      Visual Features

        -
      • Zoom and pan animation (for all layers, including tile layers, markers and vector layers)
      • -
      • Smooth pinch-zoom on modern mobile devices
      • +
      • Zoom and pan animation
      • Tile and popup fade animation
      • -
      • Very nice default design for markers, popups and other map controls
      • -
      • Retina resolution support for tile layers and markers
      • +
      • Very nice default design for markers, popups and map controls
      • +
      • Retina resolution support
      @@ -115,7 +95,7 @@

      Customization Features

      • Pure CSS3 popups and controls for easy restyling
      • Image- and HTML-based markers
      • -
      • A simple interface for implementing custom map layers and controls
      • +
      • A simple interface for custom map layers and controls
      • Custom map projections (with EPSG:3857/4326/3395 out of the box)
      • Powerful OOP facilities for extending existing classes

      @@ -123,11 +103,11 @@

      Customization Features

      Performance Features

        -
      • Hardware acceleration on iOS (and other modern browsers) makes it feel as smooth as native apps
      • -
      • Utilizing CSS3 features like Transitions, Transforms, requestAnimationFrame to make panning and zooming really smooth
      • -
      • Smart polyline/polygon rendering with dynamic clipping and simplification makes it responsive even when displaying objects with thousands of points
      • -
      • Modular design and a build system allow you to reduce the library size by leaving out features you don't need
      • -
      • Tap delay elimination on mobile devices makes controls and layers respond to taps immediately
      • +
      • Hardware acceleration on mobile makes it feel as smooth as native apps
      • +
      • Utilizing CSS3 features to make panning and zooming really smooth
      • +
      • Smart polyline/polygon rendering with dynamic clipping and simplification makes it very fast
      • +
      • Modular design and a build system for leaving out features you don't need
      • +
      • Tap delay elimination on mobile

      Map Controls

      @@ -155,23 +135,23 @@

      On Desktop

      On Mobile

        -
      • Safari for iOS 3–7+
      • +
      • Safari for iOS 7+
      • Android browser 2.2+, 3.1+, 4+
      • -
      • Chrome for Android 4+ and iOS
      • -
      • Firefox for Android
      • -
      • IE10/11 for Win8 devices
      • +
      • Chrome for mobile
      • +
      • Firefox for mobile
      • +
      • IE10+ for Win8 devices

      Misc

        -
      • Extremely lightweight — around 34 KB of gzipped JS code
      • +
      • Extremely lightweight
      • No external dependencies
      -

      If you find some feature really missing in Leaflet, please vote for it on the Leaflet UserVoice page.

      +

      If you find some feature really missing in Leaflet, first check if there's a plugin for it. If not, please vote for the feature on the Leaflet UserVoice page.

      Getting Involved

      From 9fc80c0c3480ec01b5c4a0f4d702865f212c1d94 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 10:44:13 +0300 Subject: [PATCH 1614/2207] update docs keyword highlighting --- reference.html | 690 ++++++++++++++++++++++++------------------------- 1 file changed, 345 insertions(+), 345 deletions(-) diff --git a/reference.html b/reference.html index 2f7c14ac303..162f3974ee9 100644 --- a/reference.html +++ b/reference.html @@ -175,37 +175,37 @@

      Map State Options

      - + - + - + - + - + - + @@ -228,68 +228,68 @@

      Interaction Options

      - + - + - - + + - - + + - + - + - + - + - + - - + + - - + +
      MethodMethod Returns Description
      Provides easy setup of the tile layers from Kartverket (The Norwegian Mapping Authority) - Kultur og naturreise / Atle Frenvik Sveen + Kultur og naturreise / Atle Frenvik Sveen
      center LatLngnullnull Initial geographical center of the map.
      zoom Numbernullnull Initial map zoom.
      layers ILayer[]nullnull Layers that will be added to the map initially.
      minZoom Numbernullnull Minimum zoom level of the map. Overrides any minZoom set on map layers.
      maxZoom Numbernullnull Maximum zoom level of the map. This overrides any maxZoom set on map layers.
      maxBounds LatLngBoundsnullnull When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view. To set the restriction dynamically, use setMaxBounds method
      dragging Booleantruetrue Whether the map be draggable with mouse/touch or not.
      touchZoom Booleantruetrue Whether the map can be zoomed by touch-dragging with two fingers.
      scrollWheelZoom BooleantrueWhether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was.trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was.
      doubleClickZoom BooleantrueWhether the map can be zoomed in by double clicking on it and zoomed out by double clicking while holding shift. If passed 'center', double-click zoom will zoom to the center of the view regardless of where the mouse was.trueWhether the map can be zoomed in by double clicking on it and zoomed out by double clicking while holding shift. If passed 'center', double-click zoom will zoom to the center of the view regardless of where the mouse was.
      boxZoom Booleantruetrue Whether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift.
      tap Booleantruetrue Enables mobile hacks for supporting instant taps (fixing 200ms click delay on iOS/Android) and touch holds (fired as contextmenu events).
      tapTolerance Number1515 The max number of pixels a user can shift his finger during touch for it to be considered a valid tap.
      trackResize Booleantruetrue Whether the map automatically handles browser window resize to update itself.
      worldCopyJump Booleanfalsefalse With this option enabled, the map tracks when you pan to another "copy" of the world and seamlessly jumps to the original one so that all overlays like markers and vector layers are still visible.
      closePopupOnClick BooleantrueSet it to false if you don't want popups to close when user clicks the map.trueSet it to false if you don't want popups to close when user clicks the map.
      bounceAtZoomLimits BooleantrueSet it to false if you don't want the map to zoom beyond min/max zoom and then bounce back when pinch-zooming.trueSet it to false if you don't want the map to zoom beyond min/max zoom and then bounce back when pinch-zooming.
      @@ -305,19 +305,19 @@

      Keyboard Navigation Options

      keyboard Boolean - true + true Makes the map focusable and allows users to navigate the map with keyboard arrows and +/- keys. keyboardPanOffset Number - 80 + 80 Amount of pixels to pan when pressing an arrow key. keyboardZoomOffset Number - 1 + 1 Number of zoom levels to change when pressing + or - key. @@ -334,26 +334,26 @@

      Panning Inertia Options

      inertia Boolean - true + true If enabled, panning of the map will have an inertia effect where the map builds momentum while dragging and continues moving in the same direction for some time. Feels especially nice on touch devices. inertiaDeceleration Number - 3000 + 3000 The rate with which the inertial movement slows down, in pixels/second2. inertiaMaxSpeed Number - 1500 + 1500 Max speed of the inertial movement, in pixels/second. inertiaThreshold Number depends - Number of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default. + Number of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default. @@ -369,13 +369,13 @@

      Control options

      zoomControl Boolean - true + true Whether the zoom control is added to the map by default. attributionControl Boolean - true + true Whether the attribution control is added to the map by default. @@ -404,7 +404,7 @@

      Animation options

      zoomAnimationThreshold Number - 4 + 4 Won't animate zoom if the zoom difference exceeds this value. @@ -613,7 +613,7 @@

      Methods for Modifying Map State

      <Number> zoom?, <zoom/pan options> options? )
      - this + this Sets the view of the map (geographical center and zoom) with the given animation options. @@ -621,7 +621,7 @@

      Methods for Modifying Map State

      <Number> zoom, <zoom options> options? )
      - this + this Sets the zoom of the map. @@ -629,16 +629,16 @@

      Methods for Modifying Map State

      <Number> delta?, <zoom options> options? ) - this - Increases the zoom of the map by delta (1 by default). + this + Increases the zoom of the map by delta (1 by default). zoomOut( <Number> delta?, <zoom options> options? ) - this - Decreases the zoom of the map by delta (1 by default). + this + Decreases the zoom of the map by delta (1 by default). setZoomAround( @@ -646,7 +646,7 @@

      Methods for Modifying Map State

      <Number> zoom, <zoom options> options? )
      - this + this Zooms the map while keeping a specified point on the map stationary (e.g. used internally for scroll zoom and double-click zoom). @@ -654,14 +654,14 @@

      Methods for Modifying Map State

      <LatLngBounds> bounds, <fitBounds options> options? ) - this + this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. fitWorld( <fitBounds options> options? ) - this + this Sets a map view that mostly contains the whole world with the maximum zoom level possible. @@ -669,7 +669,7 @@

      Methods for Modifying Map State

      <LatLng> latlng, <pan options> options? ) - this + this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. @@ -677,7 +677,7 @@

      Methods for Modifying Map State

      <LatLngBounds> bounds, <pan options> options? ) - this + this Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. @@ -685,46 +685,46 @@

      Methods for Modifying Map State

      <Point> point, <pan options> options? ) - this + this Pans the map by a given number of pixels (animated). invalidateSize( <Boolean> animate ) - this + this Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. invalidateSize( <zoom/pan options> options ) - this - Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. If options.debounceMoveend is true, it will delay moveend event so that it doesn't happen often even if the method is called many times in a row. + this + Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. If options.debounceMoveend is true, it will delay moveend event so that it doesn't happen often even if the method is called many times in a row. setMaxBounds( <LatLngBounds> bounds - this + this Restricts the map view to the given bounds (see map maxBounds option). locate( <Locate options> options? ) - this + this Tries to locate the user using the Geolocation API, firing a locationfound event with location data on success or a locationerror event on failure, and optionally sets the map view to the user's location with respect to detection accuracy (or to the world view if geolocation failed). See Locate options for more details. stopLocate() - this + this Stops watching location previously initiated by map.locate({watch: true}) and aborts resetting the map view if map.locate was called with {setView: true}. remove() - this + this Destroys the map and clears all related event listeners. @@ -770,7 +770,7 @@

      Methods for Getting Map State

      Number - Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. + Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. getSize() @@ -802,7 +802,7 @@

      Methods for Layers and Controls

      <ILayer> layer, - this + this Adds the given layer to the map. @@ -810,7 +810,7 @@

      Methods for Layers and Controls

      <ILayer> layer ) - this + this Removes the given layer from the map. @@ -819,14 +819,14 @@

      Methods for Layers and Controls

      Boolean - Returns true if the given layer is currently added to the map. + Returns true if the given layer is currently added to the map. eachLayer( <Function> fn, <Object> context? ) - this + this Iterates over the layers of the map, optionally specifying context of the iterator function.
      map.eachLayer(function (layer) {
       	layer.bindPopup('Hello');
      @@ -839,7 +839,7 @@ 

      Methods for Layers and Controls

      <Popup> popup )
      - this + this Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability). @@ -849,14 +849,14 @@

      Methods for Layers and Controls

      <Popup options> options? ) - this + this Creates a popup with the specified options and opens it in the given point on a map. closePopup( <Popup> popup? ) - this + this Closes the popup previously opened with openPopup (or the given one). @@ -864,7 +864,7 @@

      Methods for Layers and Controls

      <IControl> control ) - this + this Adds the given control to the map. @@ -872,7 +872,7 @@

      Methods for Layers and Controls

      <IControl> control ) - this + this Removes the given control from the map. @@ -1017,37 +1017,37 @@

      Locate options

      watch Boolean - false - If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. + false + If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. setView Boolean - false - If true, automatically sets the map view to the user location with respect to detection accuracy, or to world view if geolocation failed. + false + If true, automatically sets the map view to the user location with respect to detection accuracy, or to world view if geolocation failed. maxZoom Number - Infinity + Infinity The maximum zoom for automatic view setting when using `setView` option. timeout Number - 10000 + 10000 Number of milliseconds to wait for a response from geolocation before firing a locationerror event. maximumAge Number - 0 + 0 Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, locate will return a cached location. enableHighAccuracy Boolean - false + false Enables high accuracy, see description in the W3C spec. @@ -1065,8 +1065,8 @@

      Zoom/pan options

      reset Boolean - false - If true, the map view will be completely reset (without any animations). + false + If true, the map view will be completely reset (without any animations). pan @@ -1083,7 +1083,7 @@

      Zoom/pan options

      animate Boolean - - + - An equivalent of passing animate to both zoom and pan options (see below). @@ -1101,25 +1101,25 @@

      Pan options

      animate Boolean - - If true, panning will always be animated if possible. If false, it will not animate panning, either resetting the map view if panning more than a screen away, or just setting a new offset for the map pane (except for `panBy` which always does the latter). + If true, panning will always be animated if possible. If false, it will not animate panning, either resetting the map view if panning more than a screen away, or just setting a new offset for the map pane (except for `panBy` which always does the latter). duration Number - 0.25 + 0.25 Duration of animated panning. easeLinearity Number - 0.25 - The curvature factor of panning animation easing (third parameter of the Cubic Bezier curve). 1.0 means linear animation, the less the more bowed the curve. + 0.25 + The curvature factor of panning animation easing (third parameter of the Cubic Bezier curve). 1.0 means linear animation, the less the more bowed the curve. noMoveStart Boolean - false - If true, panning won't fire movestart event on start (used internally for panning inertia). + false + If true, panning won't fire movestart event on start (used internally for panning inertia). @@ -1136,7 +1136,7 @@

      Zoom options

      animate Boolean - - If not specified, zoom animation will happen if the zoom origin is inside the current view. If true, the map will attempt animating zoom disregarding where zoom origin is. Setting false will make it always reset the view completely without animation. + If not specified, zoom animation will happen if the zoom origin is inside the current view. If true, the map will attempt animating zoom disregarding where zoom origin is. Setting false will make it always reset the view completely without animation. @@ -1154,25 +1154,25 @@

      fitBounds options

      paddingTopLeft Point - [0, 0] + [0, 0] Sets the amount of padding in the top left corner of a map container that shouldn't be accounted for when setting the view to fit bounds. Useful if you have some control overlays on the map like a sidebar and you don't want them to obscure objects you're zooming to. paddingBottomRight Point - [0, 0] + [0, 0] The same for bottom right corner of the map. padding Point - [0, 0] + [0, 0] Equivalent of setting both top left and bottom right padding to the same value. maxZoom Number - null + null The maximum possible zoom to use. @@ -1332,55 +1332,55 @@

      Options

      clickable Boolean - true - If false, the marker will not emit mouse events and will act as a part of the underlying map. + true + If false, the marker will not emit mouse events and will act as a part of the underlying map. draggable Boolean - false + false Whether the marker is draggable with mouse/touch or not. keyboard Boolean - true + true Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. title String - '' + '' Text for the browser tooltip that appear on marker hover (no tooltip by default). alt String - '' + '' Text for the alt attribute of the icon image (useful for accessibility). zIndexOffset Number - 0 + 0 By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). opacity Number - 1.0 + 1.0 The opacity of the marker. riseOnHover Boolean - false - If true, the marker will get on top of others when you hover the mouse over it. + false + If true, the marker will get on top of others when you hover the mouse over it. riseOffset Number - 250 + 250 The z-index offset used for the riseOnHover feature. @@ -1480,7 +1480,7 @@

      Methods

      <Map> map )
      - this + this Adds the marker to the map. @@ -1493,7 +1493,7 @@

      Methods

      <LatLng> latlng )
      - this + this Changes the marker position to the given point. @@ -1501,7 +1501,7 @@

      Methods

      <Icon> icon )
      - this + this Changes the marker icon. @@ -1509,21 +1509,21 @@

      Methods

      <Number> offset )
      - this + this Changes the zIndex offset of the marker. setOpacity( <Number> opacity ) - this + this Changes the opacity of the marker. update() - this + this Updates the marker position, useful if coordinates of its latLng object were changed directly. @@ -1532,17 +1532,17 @@

      Methods

      <Popup options> options? )
      - this + this Binds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method. unbindPopup() - this + this Unbinds the popup previously bound to the marker with bindPopup. openPopup() - this + this Opens the popup previously bound by the bindPopup method. @@ -1552,12 +1552,12 @@

      Methods

      closePopup() - this + this Closes the bound popup of the marker if it's opened. togglePopup() - this + this Toggles the popup previously bound by the bindPopup method. @@ -1565,7 +1565,7 @@

      Methods

      <String> html | <HTMLElement> el )
      - this + this Sets an HTML content of the popup of this marker. @@ -1641,83 +1641,83 @@ maxWidth Number - 300 + 300 Max width of the popup. minWidth Number - 50 + 50 Min width of the popup. maxHeight Number - null + null If set, creates a scrollable container of the given height inside a popup if its content exceeds it. autoPan Boolean - true - Set it to false if you don't want the map to do panning animation to fit the opened popup. + true + Set it to false if you don't want the map to do panning animation to fit the opened popup. keepInView Boolean - false - Set it to true if you want to prevent users from panning the popup off of the screen while it is open. + false + Set it to true if you want to prevent users from panning the popup off of the screen while it is open. closeButton Boolean - true + true Controls the presense of a close button in the popup. offset Point - Point(0, 6) + Point(0, 6) The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays. autoPanPaddingTopLeft Point - null + null The margin between the popup and the top left corner of the map view after autopanning was performed. autoPanPaddingBottomRight Point - null + null The margin between the popup and the bottom right corner of the map view after autopanning was performed. autoPanPadding Point - Point(5, 5) + Point(5, 5) Equivalent of setting both top left and bottom right autopan padding to the same value. zoomAnimation Boolean - true + true Whether to animate the popup on zoom. Disable it if you have problems with Flash content inside popups. closeOnClick Boolean - null - Set it to false if you want to override the default behavior of the popup closing when user clicks the map (set globally by the Map closePopupOnClick option). + null + Set it to false if you want to override the default behavior of the popup closing when user clicks the map (set globally by the Map closePopupOnClick option). className String - '' + '' A custom class name to assign to the popup. @@ -1735,7 +1735,7 @@

      Methods

      <Map> map )
      - this + this Adds the popup to the map. @@ -1743,7 +1743,7 @@

      Methods

      <Map> map ) - this + this Adds the popup to the map and closes the previous one. The same as map.openPopup(popup). @@ -1751,7 +1751,7 @@

      Methods

      <LatLng> latlng ) - this + this Sets the geographical point where the popup will open. @@ -1764,7 +1764,7 @@

      Methods

      <String|HTMLElement> htmlContent ) - this + this Sets the HTML content of the popup. @@ -1775,7 +1775,7 @@

      Methods

      update() - this + this Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded. @@ -1833,115 +1833,115 @@

      Options

      minZoom Number - 0 + 0 Minimum zoom number. maxZoom Number - 18 + 18 Maximum zoom number. maxNativeZoom Number - null + null Maximum zoom number the tiles source has available. If it is specified, the tiles on all zoom levels higher than maxNativeZoom will be loaded from maxZoom level and auto-scaled. tileSize Number - 256 + 256 Tile size (width and height in pixels, assuming tiles are square). subdomains String or String[] - 'abc' + 'abc' Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings. errorTileUrl String - '' + '' URL to the tile image to show in place of the tile that failed to load. attribution String - '' + '' e.g. "© Mapbox" — the string used by the attribution control, describes the layer data. tms Boolean - false - If true, inverses Y axis numbering for tiles (turn this on for TMS services). + false + If true, inverses Y axis numbering for tiles (turn this on for TMS services). continuousWorld Boolean - false - If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). + false + If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). noWrap Boolean - false - If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. + false + If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. zoomOffset Number - 0 + 0 The zoom number used in tile URLs will be offset with this value. zoomReverse Boolean - false - If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) + false + If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) opacity Number - 1.0 + 1.0 The opacity of the tile layer. zIndex Number - null + null The explicit zIndex of the tile layer. Not set by default. unloadInvisibleTiles Boolean depends - If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. + If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. updateWhenIdle Boolean depends - If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. + If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. detectRetina Boolean - false - If true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. + false + If true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. reuseTiles Boolean - false - If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. + false + If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. bounds LatLngBounds - null + null When this option is set, the TileLayer only loads tiles that are in the given geographical bounds. @@ -1996,17 +1996,17 @@

      Methods

      <Map> map ) - this + this Adds the layer to the map. bringToFront() - this + this Brings the tile layer to the top of all tile layers. bringToBack() - this + this Brings the tile layer to the bottom of all tile layers. @@ -2014,7 +2014,7 @@

      Methods

      <Number> opacity ) - this + this Changes the opacity of the tile layer. @@ -2022,19 +2022,19 @@

      Methods

      <Number> zIndex ) - this + this Sets the zIndex of the tile layer. redraw() - this + this Causes the layer to clear all the tiles and request them again. setUrl( <String> urlTemplate ) - this + this Updates the layer's URL template and redraws it. @@ -2092,37 +2092,37 @@

      Options

      layers String - '' + '' (required) Comma-separated list of WMS layers to show. styles String - '' + '' Comma-separated list of WMS styles. format String - 'image/jpeg' - WMS image format (use 'image/png' for layers with transparency). + 'image/jpeg' + WMS image format (use 'image/png' for layers with transparency). transparent Boolean - false - If true, the WMS service will return images with transparency. + false + If true, the WMS service will return images with transparency. version String - '1.1.1' + '1.1.1' Version of the WMS service to use. crs CRS - null + null Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means. @@ -2140,8 +2140,8 @@

      Methods

      <WMS parameters> params, <Boolean> noRedraw? ) - this - Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true). + this + Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true). @@ -2187,7 +2187,7 @@

      Options

      async Boolean - false + false Indicates that tiles will be drawn asynchronously. tileDrawn method should be called for each tile after drawing completion. @@ -2206,7 +2206,7 @@

      Methods

      <Point> tilePoint, <Number> zoom ) - this + this You need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom. @@ -2259,13 +2259,13 @@

      Options

      opacity Number - 1.0 + 1.0 The opacity of the image overlay. attribution String - '' + '' The attribution text of the image overlay. @@ -2282,7 +2282,7 @@

      Methods

      <Map> map ) - this + this Adds the overlay to the map. @@ -2290,7 +2290,7 @@

      Methods

      <Number> opacity ) - this + this Sets the opacity of the overlay. @@ -2298,17 +2298,17 @@

      Methods

      <String> imageUrl ) - this + this Changes the URL of the image. bringToFront() - this + this Brings the layer to the top of all overlays. bringToBack() - this + this Brings the layer to the bottom of all overlays. @@ -2328,32 +2328,32 @@

      Options

      stroke Boolean - true - Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. + true + Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. color String - '#03f' + '#03f' Stroke color. weight Number - 5 + 5 Stroke width in pixels. opacity Number - 0.5 + 0.5 Stroke opacity. fill Boolean depends - Whether to fill the path with color. Set it to false to disable filling on polygons or circles. + Whether to fill the path with color. Set it to false to disable filling on polygons or circles. fillColor @@ -2364,49 +2364,49 @@

      Options

      fillOpacity Number - 0.2 + 0.2 Fill opacity. fillRule String - 'evenodd' + 'evenodd' A string that defines how the inside of a shape is determined. dashArray String - null + null A string that defines the stroke dash pattern. Doesn't work on canvas-powered layers (e.g. Android 2). lineCap String - null + null A string that defines shape to be used at the end of the stroke. lineJoin String - null + null A string that defines shape to be used at the corners of the stroke. clickable Boolean - true - If false, the vector will not emit mouse events and will act as a part of the underlying map. + true + If false, the vector will not emit mouse events and will act as a part of the underlying map. pointerEvents String - null + null Sets the pointer-events attribute on the path if SVG backend is used. className String - '' + '' Custom class name set on an element. @@ -2485,7 +2485,7 @@

      Methods

      <Map> map ) - this + this Adds the layer to the map. @@ -2494,7 +2494,7 @@

      Methods

      <Popup options> options? ) - this + this Binds a popup with a particular HTML content to a click on this path. @@ -2503,12 +2503,12 @@

      Methods

      <Popup options> options? ) - this + this Binds a given popup object to the path. unbindPopup() - this + this Unbinds the popup previously bound to the path with bindPopup. @@ -2516,13 +2516,13 @@

      Methods

      <LatLng> latlng? ) - this + this Opens the popup previously bound by the bindPopup method in the given point, or in one of the path's points if not specified. closePopup() - this + this Closes the path's bound popup if it is opened. @@ -2530,7 +2530,7 @@

      Methods

      <Path options> object ) - this + this Changes the appearance of a Path based on the options in the Path options object. @@ -2540,17 +2540,17 @@

      Methods

      bringToFront() - this + this Brings the layer to the top of all path layers. bringToBack() - this + this Brings the layer to the bottom of all path layers. redraw() - this + this Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. @@ -2579,12 +2579,12 @@

      Static properties

      CANVAS Boolean depends - True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. + True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. CLIP_PADDING Number - 0.5 for SVG
      0.02 for VML + 0.5 for SVG
      0.02 for VML How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance. @@ -2634,13 +2634,13 @@

      Options

      smoothFactor Number - 1.0 + 1.0 How much to simplify the polyline on each zoom level. More means better performance and smoother look, and less means more accurate representation. noClip Boolean - false + false Disabled polyline clipping. @@ -2660,7 +2660,7 @@

      Methods

      <LatLng> latlng ) - this + this Adds a given point to the polyline. @@ -2668,7 +2668,7 @@

      Methods

      <LatLng[]> latlngs ) - this + this Replaces all the points in the polyline with the given array of geographical points. @@ -2742,7 +2742,7 @@

      Methods

      <LatLng[][]> latlngs ) - this + this Replace all lines and their paths with the given array of arrays of geographical points. @@ -2851,7 +2851,7 @@

      Methods

      <LatLng[][]> latlngs ) - this + this Replace all polygons and their paths with the given array of arrays of geographical points. @@ -2923,7 +2923,7 @@

      Methods

      <LatLngBounds> bounds ) - this + this Redraws the rectangle with the passed bounds. @@ -2978,7 +2978,7 @@

      Methods

      <LatLng> latlng ) - this + this Sets the position of a circle to a new location. @@ -2986,7 +2986,7 @@

      Methods

      <Number> radius ) - this + this Sets the radius of a circle. Units are in meters. @@ -3034,7 +3034,7 @@

      Methods

      <LatLng> latlng ) - this + this Sets the position of a circle marker to a new location. @@ -3042,7 +3042,7 @@

      Methods

      <Number> radius ) - this + this Sets the radius of a circle marker. Units are in pixels. @@ -3092,7 +3092,7 @@

      Methods

      <Map> map ) - this + this Adds the group of layers to the map. @@ -3100,7 +3100,7 @@

      Methods

      <ILayer> layer ) - this + this Adds a given layer to the group. @@ -3108,7 +3108,7 @@

      Methods

      <ILayer> layer ) - this + this Removes a given layer from the group. @@ -3116,7 +3116,7 @@

      Methods

      <String> id ) - this + this Removes a given layer of the given id from the group. @@ -3125,7 +3125,7 @@

      Methods

      Boolean - Returns true if the given layer is currently added to the group. + Returns true if the given layer is currently added to the group. getLayer( @@ -3142,7 +3142,7 @@

      Methods

      clearLayers() - this + this Removes all the layers from the group. @@ -3150,7 +3150,7 @@

      Methods

      <Function> fn, <Object> context? )
      - this + this Iterates over the layers of the group, optionally specifying context of the iterator function.
      group.eachLayer(function (layer) {
       	layer.bindPopup('Hello');
      @@ -3210,7 +3210,7 @@ 

      Methods

      <Popup options> options? )
      - this + this Binds a popup with a particular HTML content to a click on any layer from the group that has a bindPopup method. @@ -3222,17 +3222,17 @@

      Methods

      setStyle( <Path options> style ) - this + this Sets the given path options to each layer of the group that has a setStyle method. bringToFront() - this + this Brings the layer group to the top of all other layers. bringToBack() - this + this Brings the layer group to the bottom of all other layers. @@ -3392,7 +3392,7 @@

      Methods

      <Function> style ) - this + this Changes styles of GeoJSON vector layers with the given style function. @@ -3400,7 +3400,7 @@

      Methods

      <Path> layer ) - this + this Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. @@ -3429,7 +3429,7 @@

      Static methods

      LatLng - Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). + Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). coordsToLatLngs( @@ -3439,7 +3439,7 @@

      Static methods

      Array - Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). + Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). @@ -3520,7 +3520,7 @@

      Methods

      Boolean - Returns true if the given LatLng point is at the same position (within a small margin of error). + Returns true if the given LatLng point is at the same position (within a small margin of error). toString() @@ -3534,7 +3534,7 @@

      Methods

      LatLng - Returns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default). + Returns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default). @@ -3550,19 +3550,19 @@

      Constants

      DEG_TO_RAD Number - Math.PI / 180 + Math.PI / 180 A multiplier for converting degrees into radians. RAD_TO_DEG Number - 180 / Math.PI + 180 / Math.PI A multiplier for converting radians into degrees. MAX_MARGIN Number - 1.0E-9 + 1.0E-9 Max margin of error for the equality check. @@ -3624,7 +3624,7 @@

      Methods

      <LatLng|LatLngBounds> latlng ) - this + this Extends the bounds to contain the given point or bounds. @@ -3678,7 +3678,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given one. + Returns true if the rectangle contains the given one. contains( @@ -3686,7 +3686,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given point. + Returns true if the rectangle contains the given point. intersects( @@ -3694,7 +3694,7 @@

      Methods

      Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. equals( @@ -3702,12 +3702,12 @@

      Methods

      Boolean - Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. + Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. toBBoxString() String - Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. + Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. pad( @@ -3722,7 +3722,7 @@

      Methods

      Boolean - Returns true if the bounds are properly initialized. + Returns true if the bounds are properly initialized. @@ -3753,7 +3753,7 @@

      Creation

      <Boolean> round? ) - Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. + Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. @@ -3816,7 +3816,7 @@

      Methods

      Point - Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. + Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. distanceTo( @@ -3847,7 +3847,7 @@

      Methods

      Boolean - Returns true if the given point has the same coordinates. + Returns true if the given point has the same coordinates. contains( @@ -3855,7 +3855,7 @@

      Methods

      Boolean - Returns true if the both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). + Returns true if the both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). toString() @@ -3952,7 +3952,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given one. + Returns true if the rectangle contains the given one. contains( @@ -3960,7 +3960,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given point. + Returns true if the rectangle contains the given point. intersects( @@ -3968,13 +3968,13 @@

      Methods

      Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. isValid() Boolean - Returns true if the bounds are properly initialized. + Returns true if the bounds are properly initialized. getSize() @@ -4093,7 +4093,7 @@

      DivIcon

      L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
      -

      By default, it has a 'leaflet-div-icon' class and is styled as a little white square with a shadow.

      +

      By default, it has a 'leaflet-div-icon' class and is styled as a little white square with a shadow.

      Creation

      @@ -4140,7 +4140,7 @@

      Options

      className String - A custom class name to assign to the icon. 'leaflet-div-icon' by default. + A custom class name to assign to the icon. 'leaflet-div-icon' by default. html @@ -4189,7 +4189,7 @@

      Options

      position String - 'topright' + 'topright' The initial position of the control (one of the map corners). See control positions. @@ -4206,7 +4206,7 @@

      Methods

      <String> position )
      - this + this Sets the position of the control. See control positions. @@ -4219,7 +4219,7 @@

      Methods

      <Map> map )
      - this + this Adds the control to the map. @@ -4227,7 +4227,7 @@

      Methods

      <Map> map ) - this + this Removes the control from the map. @@ -4247,19 +4247,19 @@

      Control Positions

      Description - 'topleft' + 'topleft' Top left of the map. - 'topright' + 'topright' Top right of the map. - 'bottomleft' + 'bottomleft' Bottom left of the map. - 'bottomright' + 'bottomright' Bottom right of the map. @@ -4267,7 +4267,7 @@

      Control Positions

      Control.zoom

      -

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      +

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      Creation

      @@ -4297,31 +4297,31 @@

      Options

      - + - + - + - + - +
      position String'topleft''topleft' The position of the control (one of the map corners). See control positions.
      zoomInText String'+''+' The text set on the zoom in button.
      zoomOutText String'-''-' The text set on the zoom out button.
      zoomInTitle String'Zoom in''Zoom in' The title set on the zoom in button.
      zoomOutTitle String'Zoom out''Zoom out' The title set on the zoom out button.
      @@ -4330,7 +4330,7 @@

      Options

      Control.Attribution

      -

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      +

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      Creation

      @@ -4361,14 +4361,14 @@

      Options

      - + - - + +
      position String'bottomright''bottomright' The position of the control (one of the map corners). See control positions.
      prefix String'Leaflet'The HTML text shown before the attributions. Pass false to disable.'Leaflet'The HTML text shown before the attributions. Pass false to disable.
      @@ -4383,21 +4383,21 @@

      Methods

      setPrefix( <String> prefix ) - this + this Sets the text before the attributions. addAttribution( <String> text ) - this - Adds an attribution text (e.g. 'Vector data &copy; Mapbox'). + this + Adds an attribution text (e.g. 'Vector data &copy; Mapbox'). removeAttribution( <String> text ) - this + this Removes an attribution text. @@ -4448,7 +4448,7 @@

      Methods

      <ILayer> layer, <String> name ) - this + this Adds a base layer (radio button entry) with the given name to the control. @@ -4456,14 +4456,14 @@

      Methods

      <ILayer> layer, <String> name ) - this + this Adds an overlay (checkbox entry) with the given name to the control. removeLayer( <ILayer> layer ) - this + this Remove the given layer from the control. @@ -4480,20 +4480,20 @@

      Options

      position String - 'topright' + 'topright' The position of the control (one of the map corners). See control positions. collapsed Boolean - true - If true, the control will be collapsed into an icon and expanded on mouse hover or touch. + true + If true, the control will be collapsed into an icon and expanded on mouse hover or touch. autoZIndex Boolean - true - If true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + true + If true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. @@ -4576,32 +4576,32 @@

      Options

      position String - 'bottomleft' + 'bottomleft' The position of the control (one of the map corners). See control positions. maxWidth Number - 100 + 100 Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500). metric Boolean - true + true Whether to show the metric scale line (m/km). imperial Boolean - true + true Whether to show the imperial scale line (mi/ft). updateWhenIdle Boolean - false - If true, the control is updated on moveend, otherwise it's always up-to-date (updated on move). + false + If true, the control is updated on moveend, otherwise it's always up-to-date (updated on move). @@ -4609,7 +4609,7 @@

      Options

      Events methods

      -

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

      +

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

      Example

      @@ -4638,8 +4638,8 @@

      Methods

      <Object> context? )
      - this - Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). + this + Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). addOneTimeEventListener( @@ -4648,7 +4648,7 @@

      Methods

      <Object> context? )
      - this + this The same as above except the listener will only get fired once and then removed. @@ -4657,7 +4657,7 @@

      Methods

      <Object> context? )
      - this + this Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} @@ -4667,7 +4667,7 @@

      Methods

      <Object> context? )
      - this + this Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to addEventListener, you must pass the same context to removeEventListener in order to remove the listener. @@ -4676,13 +4676,13 @@

      Methods

      <Object> context? )
      - this + this Removes a set of type/listener pairs. removeEventListener() - this + this Removes all listeners. An alias to clearAllEventListeners when you use it without arguments. @@ -4691,7 +4691,7 @@

      Methods

      Boolean - Returns true if a particular event type has some listeners attached to it. + Returns true if a particular event type has some listeners attached to it. fireEvent( @@ -4699,33 +4699,33 @@

      Methods

      <Object> data? )
      - this + this Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. clearAllEventListeners() - this + this Removes all listeners to all events on the object. on( … ) - this + this Alias to addEventListener. once( … ) - this + this Alias to addOneTimeEventListener. off( … ) - this + this Alias to removeEventListener. fire( … ) - this + this Alias to fireEvent. @@ -4752,7 +4752,7 @@

      Event

      type String - The event type (e.g. 'click'). + The event type (e.g. 'click'). target @@ -5176,77 +5176,77 @@

      Browser

      ie Boolean - true for all Internet Explorer versions. + true for all Internet Explorer versions. ie6 Boolean - true for Internet Explorer 6. + true for Internet Explorer 6. ie7 Boolean - true for Internet Explorer 7. + true for Internet Explorer 7. webkit Boolean - true for webkit-based browsers like Chrome and Safari (including mobile versions). + true for webkit-based browsers like Chrome and Safari (including mobile versions). webkit3d Boolean - true for webkit-based browsers that support CSS 3D transformations. + true for webkit-based browsers that support CSS 3D transformations. android Boolean - true for Android mobile browser. + true for Android mobile browser. android23 Boolean - true for old Android stock browsers (2 and 3). + true for old Android stock browsers (2 and 3). mobile Boolean - true for modern mobile browsers (including iOS Safari and different Android browsers). + true for modern mobile browsers (including iOS Safari and different Android browsers). mobileWebkit Boolean - true for mobile webkit-based browsers. + true for mobile webkit-based browsers. mobileOpera Boolean - true for mobile Opera. + true for mobile Opera. touch Boolean - true for all browsers on touch devices. + true for all browsers on touch devices. msTouch Boolean - true for browsers with Microsoft touch model (e.g. IE10). + true for browsers with Microsoft touch model (e.g. IE10). retina Boolean - true for devices with Retina screens. + true for devices with Retina screens. @@ -5279,7 +5279,7 @@

      Methods

      Function - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind). + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind). stamp( <Object> obj ) @@ -5317,7 +5317,7 @@

      Methods

      falseFn() Function - Always returns false. + Always returns false. formatNum( @@ -5351,7 +5351,7 @@

      Methods

      String - Converts an object into a parameter URL string, e.g.
      {a: "foo", b: "bar"} translates to '?a=foo&b=bar'. + Converts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'. template( @@ -5359,7 +5359,7 @@

      Methods

      String - Simple templating facility, accepts a template string of the form 'Hello {a}, {b}' and a data object like {a: 'foo', b: 'bar'}, returns evaluated string ('Hello foo, bar'). You can also specify functions instead of strings for data values — they will be evaluated passing data as an argument. + Simple templating facility, accepts a template string of the form 'Hello {a}, {b}' and a data object like {a: 'foo', b: 'bar'}, returns evaluated string ('Hello foo, bar'). You can also specify functions instead of strings for data values — they will be evaluated passing data as an argument. isArray( @@ -5367,7 +5367,7 @@

      Methods

      Boolean - Returns true if the given object is an array. + Returns true if the given object is an array. trim( @@ -5562,8 +5562,8 @@

      Methods

      <Object> context? )
      - this - Adds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified. + this + Adds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified. removeListener( @@ -5572,7 +5572,7 @@

      Methods

      <Function> fn )
      - this + this Removes an event listener from the element. @@ -5580,7 +5580,7 @@

      Methods

      <DOMEvent> e ) - this + this Stop the given event from propagation to parent elements. Used inside the listener functions:
      L.DomEvent.addListener(div, 'click', function (e) {
       	L.DomEvent.stopPropagation(e);
      @@ -5592,7 +5592,7 @@ 

      Methods

      <DOMEvent> e )
      - this + this Prevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions.
      @@ -5601,7 +5601,7 @@

      Methods

      <DOMEvent> e ) - this + this Does stopPropagation and preventDefault at the same time. @@ -5609,8 +5609,8 @@

      Methods

      <HTMLElement> el ) - this - Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events. + this + Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events. getMousePosition( @@ -5700,7 +5700,7 @@

      Methods

      Boolean - Returns true if the element class attribute contains name. + Returns true if the element class attribute contains name. addClass( @@ -5736,8 +5736,8 @@

      Methods

      <String[]> props )
      - String or false - Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. + String or false + Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. getTranslateString( @@ -5764,7 +5764,7 @@

      Methods

      - - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. + Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. getPosition( @@ -5788,7 +5788,7 @@

      Properties

      TRANSITION String - Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). + Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). TRANSFORM @@ -5837,8 +5837,8 @@

      Methods

      <Number> easeLinearity? )
      - this - Run an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default) + this + Run an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default) @@ -5959,17 +5959,17 @@

      Methods

      START String - Name of the DOM event that initiates dragging. 'mousedown' for desktop browsers, 'touchstart' for mobile devices. + Name of the DOM event that initiates dragging. 'mousedown' for desktop browsers, 'touchstart' for mobile devices. MOVE String - Name of the DOM event for drag moving. 'mousemove' for desktop browsers, 'touchmove' for mobile devices. + Name of the DOM event for drag moving. 'mousemove' for desktop browsers, 'touchmove' for mobile devices. END String - Name of the DOM event that ends dragging. 'mouseup' for desktop browsers, 'touchend' for mobile devices. + Name of the DOM event that ends dragging. 'mouseup' for desktop browsers, 'touchend' for mobile devices. --> @@ -5997,7 +5997,7 @@

      IHandler

      enabled() Boolean - Returns true if the handler is enabled. + Returns true if the handler is enabled. @@ -6290,7 +6290,7 @@

      Properties

      code String - Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). + Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). @@ -6330,7 +6330,7 @@

      Defined CRS

      Global Switches

      -

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      +

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      <script>L_PREFER_CANVAS = true;</script>
       <script src="leaflet.js"></script>
      From e2ba50769c0730b33c58c8043d1d771ce8a3fe70 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 12:29:15 +0300 Subject: [PATCH 1615/2207] frontpage mobile adjustments --- docs/css/main.css | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 02ca5754b37..7c8145f8ff8 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -900,20 +900,37 @@ tr:target { @media screen and (max-width: 500px) { .nav { font-size: 1.25em; + padding-bottom: 1em; + line-height: 1.2; + } + + h1 { + margin: 1em 0; } h3.tagline { - font-size: 1.333em; - margin: 0 2em; + font-size: 1.1em; + margin: 0 1em; } .container { padding: 0 1.5em 1.5em; } + .logo { + margin: 0.6em; + } + + .usedby-title { + padding-top: 1em; + padding-bottom: 0.5em; + font-size: 1.8em; + } + .usedby { padding-left: 0; padding-right: 0; + padding-bottom: 0; } .features { -webkit-column-count: 1; } From 259d816a9767f103a5dff13a94bc08bdf31c4ea5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 12:51:57 +0300 Subject: [PATCH 1616/2207] better headings styling --- docs/css/main.css | 25 +++++++++++++++++++------ index.html | 6 +++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 7c8145f8ff8..917586a86eb 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -105,10 +105,13 @@ h2:target { h3 { margin-top: 2em; - color: #777; + color: black; + font-weight: 500; + font-size: 1.4em; } h4 { - color: #999; + font-size: 1.1em; + font-weight: 500; margin: 1em 0 1em; } @@ -345,14 +348,14 @@ h3.tagline { column-count: 3; } .features ul { - padding-left: 1.2em; - margin: 0 0 1em; + padding-left: 1.6em; + margin: 0 0 1.5em; } .features h3 { - margin: 0.5em 0; + margin: 0 0 0.5em; } .features h4 { - margin: 0; + margin: 0 0 0.3em; } @@ -425,6 +428,16 @@ table.plugins td:first-child a { color: #666; } +.api-page h2 { + border-bottom: 7px solid #bbb; +} +.api-page h2:target { + border-color: #1EB300; +} +.api-page h2:first-child { + border: none; +} + #toc h4 { margin-top: 0; } diff --git a/index.html b/index.html index 6b415a74556..cb22e80c618 100644 --- a/index.html +++ b/index.html @@ -106,7 +106,7 @@

      Performance Features

    85. Hardware acceleration on mobile makes it feel as smooth as native apps
    86. Utilizing CSS3 features to make panning and zooming really smooth
    87. Smart polyline/polygon rendering with dynamic clipping and simplification makes it very fast
    88. -
    89. Modular design and a build system for leaving out features you don't need
    90. +
    91. Modular build system for leaving out features you don't need
    92. Tap delay elimination on mobile
    93. @@ -122,7 +122,7 @@

      Map Controls

      Browser Support

      -

      On Desktop

      +

      Desktop

      • Chrome
      • @@ -132,7 +132,7 @@

        On Desktop

      • IE 7–11
      -

      On Mobile

      +

      Mobile

      From 0bd44d04161dacae2bbed82c8b5e373e4ad9f59a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 17:24:15 +0300 Subject: [PATCH 1628/2207] reorder logos, spacing fixes --- blog.md | 1 + docs/css/main.css | 10 +++++++--- index.html | 10 +++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/blog.md b/blog.md index 209aab0c445..ac2a7511d4a 100644 --- a/blog.md +++ b/blog.md @@ -1,6 +1,7 @@ --- layout: v2 title: Blog +bodyclass: blog-page --- ## Leaflet Developer Blog diff --git a/docs/css/main.css b/docs/css/main.css index 511683ee245..edfbc417782 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -110,6 +110,10 @@ h3 { font-size: 1.4em; } +.blog-page h3 { + padding-top: 0; +} + h4 { font-size: 1.1em; font-weight: 500; @@ -267,7 +271,7 @@ h3.tagline { } .usedby { - margin: 0; + margin: 0 0 3em; text-align: center; padding: 0 3em 2em; background-color: #f5f5f5; @@ -390,10 +394,10 @@ h3.tagline { } .features ul { padding-left: 1.6em; - margin: 0 0 1.5em; + margin: 0 0 1.8em; } .features h3 { - margin: 0 0 0.5em; + margin: 0 0 0.8em; padding: 0; } .features h4 { diff --git a/index.html b/index.html index 95ca5742a50..b2c98547d7d 100644 --- a/index.html +++ b/index.html @@ -40,17 +40,17 @@

      Trusted by the best

      - + + + + + - - - - From a2864dc5c1add4fcd4b388490071bf01d4932674 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 17:28:54 +0300 Subject: [PATCH 1629/2207] mobile fixes --- docs/css/main.css | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index edfbc417782..619e44073ce 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -959,14 +959,18 @@ tr:target { margin: .25em; } - .features { -webkit-column-count: 2; } + .features { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; + } } @media screen and (max-width: 500px) { .nav { font-size: 1.25em; padding-bottom: 1em; - line-height: 1.2; + line-height: 1; } h1 { @@ -974,7 +978,7 @@ tr:target { } h3.tagline { - font-size: 1.1em; + font-size: 1.05em; margin: 0 1em; } @@ -998,7 +1002,11 @@ tr:target { padding-bottom: 0; } - .features { -webkit-column-count: 1; } + .features { + -webkit-column-count: 1; + -moz-column-count: 1; + column-count: 1; + } .example-img { float: none; From e5e156a634efa48aeab46e0e69827a10903b14b1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 18:24:30 +0300 Subject: [PATCH 1630/2207] adjust margins on post pages --- _layouts/post.html | 1 + docs/css/main.css | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/_layouts/post.html b/_layouts/post.html index e97f3acf13d..67efba622d4 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -2,6 +2,7 @@ layout: v2 root: ../../../ post: true +bodyclass: post-page ---

      ← Back to the list of blog posts

      diff --git a/docs/css/main.css b/docs/css/main.css index 619e44073ce..ea6735b199d 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -1052,3 +1052,7 @@ tr:target { .tutorials-back { margin-bottom: -3em; } + +.post-page h2 { + margin-top: 0; +} From e2384516847f60c716b035faa182d8b75664c06c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 18:24:44 +0300 Subject: [PATCH 1631/2207] Leaflet is Alive and Kicking blog post --- ...2015-07-01-leaflet-is-alive-and-kicking.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 _posts/2015-07-01-leaflet-is-alive-and-kicking.md diff --git a/_posts/2015-07-01-leaflet-is-alive-and-kicking.md b/_posts/2015-07-01-leaflet-is-alive-and-kicking.md new file mode 100644 index 00000000000..c6ec8f1c50b --- /dev/null +++ b/_posts/2015-07-01-leaflet-is-alive-and-kicking.md @@ -0,0 +1,21 @@ +--- +layout: post +title: Leaflet is Alive and Kicking, Stay Tuned for 1.0! +description: Leaflet 0.7 Released — with IE11 touch support, upscaling tiles and tons of other improvements and bugfixes! Meanwhile, I've joined the MapBox team full-time. +author: Vladimir Agafonkin +authorsite: http://agafonkin.com/en +--- + +I know this blog hasn't been updated for a long time — 1.5 years actually! But that's just because I'm a lazy blogger, and there has been _a lot_ going on with Leaflet during this time despite the lack of blog posts and major releases. + +We're on the finishing line of releasing Leaflet 1.0 — the biggest and greatest Leaflet release _ever_. The latest stable version, 0.7.3, is already perfect, so you won't believe how much awesome stuff we've managed to pack into the upcoming release — 914 commits later! But I'll leave that for a separate `1.0-beta1` blog post after we fix [that one last issue](https://github.com/Leaflet/Leaflet/pull/3307). + +Meanwhile, I'm happy to present you the new redesigned [Leaflet website](http://leafletjs.com/)! Now finally mobile-friendly, simple, clean, minimal and modern, just like the library itself. Also notice the floating menu when scrolling down the [Docs](/reference.html) and [Plugins](/plugins.html) pages, a highly requested feature that'll make navigation much easier. Big thanks to [Rowan Hogan](https://github.com/rowanhogan) for the help with the new design! + +P.S. I recently made a quirky 13-minute video for the [Geospatial World Forum](http://www.geospatialworldforum.org/), sharing the fun story behind Leaflet and how it became what it is today. Watch it and share it with your geofriends so that we can make the GIS world fun again! + +Love,
      +Vladimir. + + + From ffa979e0b7f42182f49445f0a6cf9e5b057df312 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 18:34:29 +0300 Subject: [PATCH 1632/2207] lots of lets -> let's fixes --- examples/choropleth.md | 4 ++-- examples/custom-icons.md | 2 +- examples/layers-control.md | 6 +++--- examples/quick-start.md | 2 +- index.html | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/choropleth.md b/examples/choropleth.md index 8eb80c9bd06..42d5a8614b6 100644 --- a/examples/choropleth.md +++ b/examples/choropleth.md @@ -113,7 +113,7 @@ Looks much better now! ### Adding Interaction -Now lets make the states highlighted visually in some way when they are hovered with a mouse. First we'll define an event listener for layer `mouseover` event: +Now let's make the states highlighted visually in some way when they are hovered with a mouse. First we'll define an event listener for layer `mouseover` event: function highlightFeature(e) { var layer = e.target; @@ -144,7 +144,7 @@ The handy `geojson.resetStyle` method will reset the layer style to its default // ... our listeners geojson = L.geoJson(...); -As an additional touch, lets define a `click` listener that zooms to the state: +As an additional touch, let's define a `click` listener that zooms to the state: function zoomToFeature(e) { map.fitBounds(e.target.getBounds()); diff --git a/examples/custom-icons.md b/examples/custom-icons.md index f4e4a17f5ab..b1650061402 100644 --- a/examples/custom-icons.md +++ b/examples/custom-icons.md @@ -48,7 +48,7 @@ Now putting a marker with this icon on a map is easy: ### Defining an icon class -What if we need to create several icons that have lots in common? Lets define our own icon class containing the shared options, inheriting from `L.Icon`! It's really easy in Leaflet: +What if we need to create several icons that have lots in common? Let's define our own icon class containing the shared options, inheriting from `L.Icon`! It's really easy in Leaflet: var LeafIcon = L.Icon.extend({ options: { diff --git a/examples/layers-control.md b/examples/layers-control.md index 333d149be4f..86119333e43 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -14,7 +14,7 @@ This tutorial will show you how to group several layers into one, and how to use ### Layer Groups -Lets suppose you have a bunch of layers you want to combine into a group to handle them as one in your code: +Let's suppose you have a bunch of layers you want to combine into a group to handle them as one in your code: var littleton = L.marker([39.61, -105.02]).bindPopup('This is Littleton, CO.'), denver = L.marker([39.74, -104.99]).bindPopup('This is Denver, CO.'), @@ -31,7 +31,7 @@ Easy enough! Now you have a `cities` layer that combines your city markers into Leaflet has a nice little control that allows your users control what layers they want to see on your map. In addition to showing you how to use it, we'll show another handy use for layer groups. -There are two types of layers --- base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays --- all the other stuff you put over the base layers. In this example, we want to have two base layers (grayscale and night-style base map) to switch between, and an overlay to switch on and off --- city markers (those we created earlier). Lets create those layers and add the default ones to the map: +There are two types of layers --- base layers that are mutually exclusive (only one can be visible on your map), e.g. tile layers, and overlays --- all the other stuff you put over the base layers. In this example, we want to have two base layers (grayscale and night-style base map) to switch between, and an overlay to switch on and off --- city markers (those we created earlier). Let's create those layers and add the default ones to the map:
      var grayscale = L.tileLayer(mapboxUrl, {id: 'MapID', attribution: mapboxAttribution}),
       	streets   = L.tileLayer(mapboxUrl, {id: 'MapID', attribution: mapboxAttribution});
      @@ -61,7 +61,7 @@ Note that we added `grayscale`, `motorways` and `cities` layers to the map but d
       
       Also note that when using multiple base layers, only one of them should be added to the map at instantiation, but all of them should be present in the base layers object when creating the layers control.
       
      -Now lets [view the result on a separate page →](layers-control-example.html)
      +Now let's [view the result on a separate page →](layers-control-example.html)
       
       
      +	
      +
      +
      +
      +	
      + + + + diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 7854d60579a..54cfd337bc7 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -127,7 +127,8 @@ L.Layer.include({ _popupAnchor: function (layer) { var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0, 0]; - return L.point(anchor).add(L.Popup.prototype.options.offset); + var offsetToAdd = layer._popup ? layer._popup.options.offset : L.Popup.prototype.options.offset; + return L.point(anchor).add(offsetToAdd); }, _movePopup: function (e) { From d48191f42683cd50fd59116d21f9a33216ec1944 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 1 Jul 2015 22:16:36 +0300 Subject: [PATCH 1636/2207] Revert "Fix setting of offset for popups." This reverts commit 30d2959c23bc179225bb0628769a2e1ad533d5b9. --- debug/tests/popup_offset.html | 36 ----------------------------------- src/layer/Layer.Popup.js | 3 +-- 2 files changed, 1 insertion(+), 38 deletions(-) delete mode 100644 debug/tests/popup_offset.html diff --git a/debug/tests/popup_offset.html b/debug/tests/popup_offset.html deleted file mode 100644 index ca88e1f9ca7..00000000000 --- a/debug/tests/popup_offset.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
      - - - - diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 54cfd337bc7..7854d60579a 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -127,8 +127,7 @@ L.Layer.include({ _popupAnchor: function (layer) { var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0, 0]; - var offsetToAdd = layer._popup ? layer._popup.options.offset : L.Popup.prototype.options.offset; - return L.point(anchor).add(offsetToAdd); + return L.point(anchor).add(L.Popup.prototype.options.offset); }, _movePopup: function (e) { From 18933e1764fd087b0e0af47c8289347c8ad18f12 Mon Sep 17 00:00:00 2001 From: petr Date: Wed, 1 Jul 2015 10:29:08 -0700 Subject: [PATCH 1637/2207] accept geojson with null geometry --- spec/suites/layer/GeoJSONSpec.js | 10 ++++++++++ src/layer/GeoJSON.js | 18 ++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 29be03fd6b0..78b69e200a2 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -7,6 +7,10 @@ describe("L.GeoJSON", function () { type: 'Point', coordinates: [20, 10, 5] } + }, geoJSONEmpty = { + type: 'Feature', + properties: {}, + geometry: null }; it("sets feature property on member layers", function () { @@ -20,6 +24,12 @@ describe("L.GeoJSON", function () { layer.addData(geoJSON.geometry); expect(layer.getLayers()[0].feature).to.eql(geoJSON); }); + + it("accepts geojson with null geometry", function () { + var layer = new L.GeoJSON(); + layer.addData(geoJSONEmpty); + expect(layer.getLayers().length).to.eql(0); + }); }); }); diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 871bd1110ab..cbee4d395e6 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -34,6 +34,9 @@ L.GeoJSON = L.FeatureGroup.extend({ if (options.filter && !options.filter(geojson)) { return this; } var layer = L.GeoJSON.geometryToLayer(geojson, options); + if (!layer) { + return this; + } layer.feature = L.GeoJSON.asFeature(geojson); layer.defaultOptions = layer.options; @@ -73,12 +76,16 @@ L.extend(L.GeoJSON, { geometryToLayer: function (geojson, options) { var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, - coords = geometry.coordinates, + coords = geometry ? geometry.coordinates : null, layers = [], pointToLayer = options && options.pointToLayer, coordsToLatLng = options && options.coordsToLatLng || this.coordsToLatLng, latlng, latlngs, i, len; + if (!coords && !geometry) { + return null; + } + switch (geometry.type) { case 'Point': latlng = coordsToLatLng(coords); @@ -103,12 +110,15 @@ L.extend(L.GeoJSON, { case 'GeometryCollection': for (i = 0, len = geometry.geometries.length; i < len; i++) { - - layers.push(this.geometryToLayer({ + var layer = this.geometryToLayer({ geometry: geometry.geometries[i], type: 'Feature', properties: geojson.properties - }, options)); + }, options); + + if (layer) { + layers.push(layer); + } } return new L.FeatureGroup(layers); From 3687ed81e66636afb377060b6094e06990e541fd Mon Sep 17 00:00:00 2001 From: Steve Kashishian Date: Tue, 9 Jun 2015 14:25:46 -0500 Subject: [PATCH 1638/2207] Fix setting of offset for popups. Fixes #3525 --- debug/tests/popup_offset.html | 36 +++++++++++++++++++++++++++++++++++ src/layer/Layer.Popup.js | 3 ++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 debug/tests/popup_offset.html diff --git a/debug/tests/popup_offset.html b/debug/tests/popup_offset.html new file mode 100644 index 00000000000..ca88e1f9ca7 --- /dev/null +++ b/debug/tests/popup_offset.html @@ -0,0 +1,36 @@ + + + + Leaflet debug page + + + + + + + + + + + + +
      + + + + diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 7854d60579a..54cfd337bc7 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -127,7 +127,8 @@ L.Layer.include({ _popupAnchor: function (layer) { var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0, 0]; - return L.point(anchor).add(L.Popup.prototype.options.offset); + var offsetToAdd = layer._popup ? layer._popup.options.offset : L.Popup.prototype.options.offset; + return L.point(anchor).add(offsetToAdd); }, _movePopup: function (e) { From 6bf0f98796abecba05943e5dc7c5c2896d611568 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Wed, 1 Jul 2015 13:00:05 -0700 Subject: [PATCH 1639/2207] fix popup offseting --- debug/map/markers.html | 1 + src/layer/Layer.Popup.js | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/debug/map/markers.html b/debug/map/markers.html index 1bf803cf7d5..075dea218cb 100644 --- a/debug/map/markers.html +++ b/debug/map/markers.html @@ -41,6 +41,7 @@ var poly = new L.Polygon([[0, 10], [0, 15.5], [0, 50], [20, 20.5]]); map.addLayer(poly); + poly.bindPopup("Polygon"); markerDraggable.on('click', function(e) { diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 54cfd337bc7..c9135e3ce58 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -26,6 +26,9 @@ L.Layer.include({ this._popupHandlersAdded = true; } + // save the originally passed offset + this._originalPopupOffset = this._popup.options.offset; + return this; }, @@ -60,9 +63,16 @@ L.Layer.include({ } if (this._popup && this._map) { + // set the popup offset for this layer this._popup.options.offset = this._popupAnchor(layer); + + // set popup source to this layer this._popup._source = layer; + + // update the popup (content, layout, ect...) this._popup.update(); + + // open the popup on the map this._map.openPopup(this._popup, latlng); } @@ -126,8 +136,13 @@ L.Layer.include({ }, _popupAnchor: function (layer) { + // where shold we anchor the popup on this layer? var anchor = layer._getPopupAnchor ? layer._getPopupAnchor() : [0, 0]; - var offsetToAdd = layer._popup ? layer._popup.options.offset : L.Popup.prototype.options.offset; + + // add the users passed offset to that + var offsetToAdd = this._originalPopupOffset || L.Popup.prototype.options.offset; + + // return the final point to anchor the popup return L.point(anchor).add(offsetToAdd); }, From 40001c149c3bb00b7ec12018f1288cc08bee47a4 Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Thu, 2 Jul 2015 09:13:02 +1000 Subject: [PATCH 1640/2207] Cap max width of youtube videos (iframes) on mobile) --- docs/css/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/css/main.css b/docs/css/main.css index efe01474d88..cdb75ec1bad 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -1061,3 +1061,7 @@ tr:target { color: #888; margin-top: -1em; } + +iframe[src*='youtube.com'] { + max-width: 100% !important; +} From c11b8d2a1cc1d250be8f01d15977586ccfcedfe1 Mon Sep 17 00:00:00 2001 From: Rowan Hogan Date: Thu, 2 Jul 2015 12:31:02 +1000 Subject: [PATCH 1641/2207] Updates API docs heading styles --- docs/css/main.css | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index cdb75ec1bad..63989131451 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -91,7 +91,8 @@ h2 { font-size: 2em; font-weight: 300; color: black; - margin-top: 1.8em; + margin-top: 1.6em; + padding-top: .2em; } h2:first-child { @@ -470,10 +471,14 @@ table.plugins td:first-child a { right: -1.5em; } -.api-page h2 { - border-bottom: 7px solid #bbb; +.api-page #toc ~ h2 { + font-weight: 700; + font-size: 1.75em; + color: #333; + border-bottom: 3px solid #555; + transition: border-color .25s ease; } -.api-page h2:target { +.api-page #toc ~ h2:target { border-color: #1EB300; } .api-page h2:first-child { From 515518da5f6df0d621f851600c16e9b4a7085943 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 2 Jul 2015 13:37:02 +0300 Subject: [PATCH 1642/2207] remove leftovers --- docs/css/blueprint/ie.css | 36 -- docs/css/blueprint/print.css | 29 -- docs/css/blueprint/screen.css | 265 -------------- docs/css/main.css | 7 +- docs/css/screen.css | 551 ------------------------------ docs/highlight/styles/default.css | 133 -------- docs/highlight/styles/github.css | 139 -------- docs/images/paper.png | Bin 85055 -> 0 bytes 8 files changed, 6 insertions(+), 1154 deletions(-) delete mode 100644 docs/css/blueprint/ie.css delete mode 100644 docs/css/blueprint/print.css delete mode 100644 docs/css/blueprint/screen.css delete mode 100644 docs/css/screen.css delete mode 100644 docs/highlight/styles/default.css delete mode 100644 docs/highlight/styles/github.css delete mode 100644 docs/images/paper.png diff --git a/docs/css/blueprint/ie.css b/docs/css/blueprint/ie.css deleted file mode 100644 index 61a53714370..00000000000 --- a/docs/css/blueprint/ie.css +++ /dev/null @@ -1,36 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* ie.css */ -body {text-align:center;} -.container {text-align:left;} -* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} -* html legend {margin:0px -8px 16px 0;padding:0;} -sup {vertical-align:text-top;} -sub {vertical-align:text-bottom;} -html>body p code {*white-space:normal;} -hr {margin:-8px auto 11px;} -img {-ms-interpolation-mode:bicubic;} -.clearfix, .container {display:inline-block;} -* html .clearfix, * html .container {height:1%;} -fieldset {padding-top:0;} -legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;} -textarea {overflow:auto;} -label {vertical-align:middle;position:relative;top:-0.25em;} -input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input.text:focus, input.title:focus {border-color:#666;} -input.text, input.title, textarea, select {margin:0.5em 0;} -input.checkbox, input.radio {position:relative;top:.25em;} -form.inline div, form.inline p {vertical-align:middle;} -form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} -button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/docs/css/blueprint/print.css b/docs/css/blueprint/print.css deleted file mode 100644 index fe2e0894467..00000000000 --- a/docs/css/blueprint/print.css +++ /dev/null @@ -1,29 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* print.css */ -body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} -.container {background:none;} -hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} -hr.space {background:#fff;color:#fff;visibility:hidden;} -h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} -code {font:.9em "Courier New", Monaco, Courier, monospace;} -a img {border:none;} -p img.top {margin-top:0;} -blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} -.small {font-size:.9em;} -.large {font-size:1.1em;} -.quiet {color:#999;} -.hide {display:none;} -a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} -a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff --git a/docs/css/blueprint/screen.css b/docs/css/blueprint/screen.css deleted file mode 100644 index d0ef713d2a3..00000000000 --- a/docs/css/blueprint/screen.css +++ /dev/null @@ -1,265 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* reset.css */ -html {margin:0;padding:0;border:0;} -body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} -article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} -body {line-height:1.5;background:white;} -table {border-collapse:separate;border-spacing:0;} -caption, th, td {text-align:left;font-weight:normal;float:none !important;} -table, th, td {vertical-align:middle;} -blockquote:before, blockquote:after, q:before, q:after {content:'';} -blockquote, q {quotes:"" "";} -a img {border:none;} -/*:focus {outline:0;}*/ - -/* typography.css */ -html {font-size:100.01%;} -body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} -h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} -h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} -h2 {font-size:2em;margin-bottom:0.75em;} -h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} -h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} -h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} -h6 {font-size:1em;font-weight:bold;} -h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} -p {margin:0 0 1.5em;} -.left {float:left !important;} -p .left {margin:1.5em 1.5em 1.5em 0;padding:0;} -.right {float:right !important;} -p .right {margin:1.5em 0 1.5em 1.5em;padding:0;} -a:focus, a:hover {color:#09f;} -a {color:#06c;text-decoration:underline;} -blockquote {margin:1.5em;color:#666;font-style:italic;} -strong, dfn {font-weight:bold;} -em, dfn {font-style:italic;} -sup, sub {line-height:0;} -abbr, acronym {border-bottom:1px dotted #666;} -address {margin:0 0 1.5em;font-style:italic;} -del {color:#666;} -pre {margin:1.5em 0;white-space:pre;} -pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} -li ul, li ol {margin:0;} -ul, ol {margin:0 1.5em 1.5em 0;padding-left:1.5em;} -ul {list-style-type:disc;} -ol {list-style-type:decimal;} -dl {margin:0 0 1.5em 0;} -dl dt {font-weight:bold;} -dd {margin-left:1.5em;} -table {margin-bottom:1.4em;width:100%;} -th {font-weight:bold;} -thead th {background:#c3d9ff;} -th, td, caption {padding:4px 10px 4px 5px; border: 1px solid #ccc;} -/*tbody tr:nth-child(even) td, tbody tr.even td {background:#e5ecf9;}*/ -tfoot {font-style:italic;} -caption {background:#eee;} -.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} -.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} -.hide {display:none;} -.quiet {color:#666;} -.loud {color:#000;} -.highlight {background:#ff0;} -.added {background:#060;color:#fff;} -.removed {background:#900;color:#fff;} -.first {margin-left:0;padding-left:0;} -.last {margin-right:0;padding-right:0;} -.top {margin-top:0;padding-top:0;} -.bottom {margin-bottom:0;padding-bottom:0;} - -/* forms.css */ -label {font-weight:bold;} -fieldset {padding:0 1.4em 1.4em 1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} -legend {font-weight:bold;font-size:1.2em;margin-top:-0.2em;margin-bottom:1em;} -fieldset, #IE8#HACK {padding-top:1.4em;} -legend, #IE8#HACK {margin-top:0;margin-bottom:0;} -input[type=text], input[type=password], input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus {border-color:#666;} -select {background-color:#fff;border-width:1px;border-style:solid;} -input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} -input.text, input.title {width:300px;padding:5px;} -input.title {font-size:1.5em;} -textarea {width:390px;height:250px;padding:5px;} -form.inline {line-height:3;} -form.inline p {margin-bottom:0;} -.error, .alert, .notice, .success/*, .info*/ {padding:0.8em;margin-bottom:1em;border:2px solid #ddd;} -.error, .alert {background:#fbe3e4;color:#8a1f11;border-color:#fbc2c4;} -.notice {background:#fff6bf;color:#514721;border-color:#ffd324;} -.success {background:#e6efc2;color:#264409;border-color:#c6d880;} -/*.info {background:#d5edf8;color:#205791;border-color:#92cae4;}*/ -.error a, .alert a {color:#8a1f11;} -.notice a {color:#514721;} -.success a {color:#264409;} -/*.info a {color:#205791;}*/ - -/* grid.css */ -.container {width:950px;margin:0 auto;} -.showgrid {background:url(src/grid.png);} -.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;} -.last {margin-right:0;} -.span-1 {width:30px;} -.span-2 {width:70px;} -.span-3 {width:110px;} -.span-4 {width:150px;} -.span-5 {width:190px;} -.span-6 {width:230px;} -.span-7 {width:270px;} -.span-8 {width:310px;} -.span-9 {width:350px;} -.span-10 {width:390px;} -.span-11 {width:430px;} -.span-12 {width:470px;} -.span-13 {width:510px;} -.span-14 {width:550px;} -.span-15 {width:590px;} -.span-16 {width:630px;} -.span-17 {width:670px;} -.span-18 {width:710px;} -.span-19 {width:750px;} -.span-20 {width:790px;} -.span-21 {width:830px;} -.span-22 {width:870px;} -.span-23 {width:910px;} -.span-24 {width:950px;margin-right:0;} -input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;} -input.span-1, textarea.span-1 {width:18px;} -input.span-2, textarea.span-2 {width:58px;} -input.span-3, textarea.span-3 {width:98px;} -input.span-4, textarea.span-4 {width:138px;} -input.span-5, textarea.span-5 {width:178px;} -input.span-6, textarea.span-6 {width:218px;} -input.span-7, textarea.span-7 {width:258px;} -input.span-8, textarea.span-8 {width:298px;} -input.span-9, textarea.span-9 {width:338px;} -input.span-10, textarea.span-10 {width:378px;} -input.span-11, textarea.span-11 {width:418px;} -input.span-12, textarea.span-12 {width:458px;} -input.span-13, textarea.span-13 {width:498px;} -input.span-14, textarea.span-14 {width:538px;} -input.span-15, textarea.span-15 {width:578px;} -input.span-16, textarea.span-16 {width:618px;} -input.span-17, textarea.span-17 {width:658px;} -input.span-18, textarea.span-18 {width:698px;} -input.span-19, textarea.span-19 {width:738px;} -input.span-20, textarea.span-20 {width:778px;} -input.span-21, textarea.span-21 {width:818px;} -input.span-22, textarea.span-22 {width:858px;} -input.span-23, textarea.span-23 {width:898px;} -input.span-24, textarea.span-24 {width:938px;} -.append-1 {padding-right:40px;} -.append-2 {padding-right:80px;} -.append-3 {padding-right:120px;} -.append-4 {padding-right:160px;} -.append-5 {padding-right:200px;} -.append-6 {padding-right:240px;} -.append-7 {padding-right:280px;} -.append-8 {padding-right:320px;} -.append-9 {padding-right:360px;} -.append-10 {padding-right:400px;} -.append-11 {padding-right:440px;} -.append-12 {padding-right:480px;} -.append-13 {padding-right:520px;} -.append-14 {padding-right:560px;} -.append-15 {padding-right:600px;} -.append-16 {padding-right:640px;} -.append-17 {padding-right:680px;} -.append-18 {padding-right:720px;} -.append-19 {padding-right:760px;} -.append-20 {padding-right:800px;} -.append-21 {padding-right:840px;} -.append-22 {padding-right:880px;} -.append-23 {padding-right:920px;} -.prepend-1 {padding-left:40px;} -.prepend-2 {padding-left:80px;} -.prepend-3 {padding-left:120px;} -.prepend-4 {padding-left:160px;} -.prepend-5 {padding-left:200px;} -.prepend-6 {padding-left:240px;} -.prepend-7 {padding-left:280px;} -.prepend-8 {padding-left:320px;} -.prepend-9 {padding-left:360px;} -.prepend-10 {padding-left:400px;} -.prepend-11 {padding-left:440px;} -.prepend-12 {padding-left:480px;} -.prepend-13 {padding-left:520px;} -.prepend-14 {padding-left:560px;} -.prepend-15 {padding-left:600px;} -.prepend-16 {padding-left:640px;} -.prepend-17 {padding-left:680px;} -.prepend-18 {padding-left:720px;} -.prepend-19 {padding-left:760px;} -.prepend-20 {padding-left:800px;} -.prepend-21 {padding-left:840px;} -.prepend-22 {padding-left:880px;} -.prepend-23 {padding-left:920px;} -.border {padding-right:4px;margin-right:5px;border-right:1px solid #ddd;} -.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #ddd;} -.pull-1 {margin-left:-40px;} -.pull-2 {margin-left:-80px;} -.pull-3 {margin-left:-120px;} -.pull-4 {margin-left:-160px;} -.pull-5 {margin-left:-200px;} -.pull-6 {margin-left:-240px;} -.pull-7 {margin-left:-280px;} -.pull-8 {margin-left:-320px;} -.pull-9 {margin-left:-360px;} -.pull-10 {margin-left:-400px;} -.pull-11 {margin-left:-440px;} -.pull-12 {margin-left:-480px;} -.pull-13 {margin-left:-520px;} -.pull-14 {margin-left:-560px;} -.pull-15 {margin-left:-600px;} -.pull-16 {margin-left:-640px;} -.pull-17 {margin-left:-680px;} -.pull-18 {margin-left:-720px;} -.pull-19 {margin-left:-760px;} -.pull-20 {margin-left:-800px;} -.pull-21 {margin-left:-840px;} -.pull-22 {margin-left:-880px;} -.pull-23 {margin-left:-920px;} -.pull-24 {margin-left:-960px;} -.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} -.push-1 {margin:0 -40px 1.5em 40px;} -.push-2 {margin:0 -80px 1.5em 80px;} -.push-3 {margin:0 -120px 1.5em 120px;} -.push-4 {margin:0 -160px 1.5em 160px;} -.push-5 {margin:0 -200px 1.5em 200px;} -.push-6 {margin:0 -240px 1.5em 240px;} -.push-7 {margin:0 -280px 1.5em 280px;} -.push-8 {margin:0 -320px 1.5em 320px;} -.push-9 {margin:0 -360px 1.5em 360px;} -.push-10 {margin:0 -400px 1.5em 400px;} -.push-11 {margin:0 -440px 1.5em 440px;} -.push-12 {margin:0 -480px 1.5em 480px;} -.push-13 {margin:0 -520px 1.5em 520px;} -.push-14 {margin:0 -560px 1.5em 560px;} -.push-15 {margin:0 -600px 1.5em 600px;} -.push-16 {margin:0 -640px 1.5em 640px;} -.push-17 {margin:0 -680px 1.5em 680px;} -.push-18 {margin:0 -720px 1.5em 720px;} -.push-19 {margin:0 -760px 1.5em 760px;} -.push-20 {margin:0 -800px 1.5em 800px;} -.push-21 {margin:0 -840px 1.5em 840px;} -.push-22 {margin:0 -880px 1.5em 880px;} -.push-23 {margin:0 -920px 1.5em 920px;} -.push-24 {margin:0 -960px 1.5em 960px;} -.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:left;position:relative;} -div.prepend-top, .prepend-top {margin-top:1.5em;} -div.append-bottom, .append-bottom {margin-bottom:1.5em;} -.box {padding:1.5em;margin-bottom:1.5em;background:#e5eCf9;} -hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:1px;margin:0 0 1.45em;border:none;} -hr.space {background:#fff;color:#fff;visibility:hidden;} -.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} -.clearfix, .container {display:block;} -.clear {clear:both;} diff --git a/docs/css/main.css b/docs/css/main.css index 63989131451..2b6aeb0f0b5 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -778,7 +778,7 @@ table.plugins td:first-child a { tr:target { background: yellow; -webkit-animation: highlight 2s ease 0.5s 1 normal forwards; - animation: highlight 2s ease 0.5s 1 normal forwards; + animation: highlight 2s ease 0.5s 1 normal forwards; } @-webkit-keyframes highlight { @@ -1070,3 +1070,8 @@ tr:target { iframe[src*='youtube.com'] { max-width: 100% !important; } + +#disqus_thread { + margin-top: 3em; +} + diff --git a/docs/css/screen.css b/docs/css/screen.css deleted file mode 100644 index 7696a49c0a8..00000000000 --- a/docs/css/screen.css +++ /dev/null @@ -1,551 +0,0 @@ -body { - background: #f0f0f0 url(../images/paper.png); - } - -.container { - background: white; - position: relative; - z-index: 1; - - padding: 15px 40px 20px; - width: 790px; - - /*border: 1px solid #dfdfdf;*/ - border-top: 0; - - box-shadow: 0 0 60px rgba(0,0,0,0.15); - } -h1 { - margin-bottom: 0; - } -h1 a { - display: block; - height: 0; - padding-top: 73px; - width: 220px; - overflow: hidden; - background: url(../images/logo.png) 0 0 no-repeat; - margin-left: -10px; - margin-bottom: 8px; - text-decoration: none; - -webkit-transition: 0.8s all; - } - -h1 a:hover, h1 a:focus { - -webkit-filter: hue-rotate(-70deg) saturate(1.5); -} - - - -h2 { - font-size: 1.8em; - margin-top: 20px; - margin-bottom: 16px; - font-weight: bold; - padding: 4px 12px 3px; - margin-left: 0; - margin-right: 0; - background: #edeeef; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; - - color: white; - - background-color: #b0de5c; - background-image: -moz-linear-gradient(top, #b0de5c, #82cb00); /* FF3.6 */ - background-image: -o-linear-gradient(top, #b0de5c, #82cb00); /* Opera 11.10+ */ - background-image: -webkit-gradient(linear, left top, left bottom, from(#b0de5c), to(#82cb00)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #b0de5c, #82cb00); /* Chrome 10+, Saf5.1+ */ - background-image: linear-gradient(top, #b0de5c, #82cb00); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#b0de5c', EndColorStr='#82cb00'); /* IE6�IE9 */ - - border-radius: 5px; - - text-shadow: 0 -1px 1px rgba(0,0,0,0.35); - } - -.api-page h2, .plugins-page h2, .plugins-page h3 { - cursor: pointer; - } - -.api-page h2[id]:before, -.plugins-page h2[id]:before, -.plugins-page h3[id]:before, -.api-page tr[id] td:first-child:before { - content: 'Permalink'; - display: inline-block; - margin: 0px 5px 0px -35px; - width: 30px; - height: 20px; - line-height: 20px; - vertical-align: baseline; - background: url(../images/sprite.png) -0px -0px no-repeat; - opacity: 0.2; - border-radius: 50%; - text-indent: -9999px; - overflow: hidden; - cursor: pointer; - position: absolute; - } - -.plugins-page h3[id]:before { - margin: 0px 5px 0px -23px; - } - -.api-page tr[id] td:first-child:before { - opacity:0; - } - -.api-page tr[id]:hover td:first-child:before { - opacity:1; - } - -.api-page h2[id]:hover:before, -.plugins-page h2[id]:hover:before, -.plugins-page h3[id]:hover:before { - opacity:1; - } - -.api-page h2 { - margin-top: 2.5em; - } -h3 { - margin-top: 1.5em; - } -h3.alt { - margin-top: 0; - } -h4 { - margin-bottom: 0.5em; - line-height: inherit; - font-size: 1.1em; - font-weight: bold; - color: #777; - } - -h3.alt { - color: #999; - font-family: Georgia, serif; - font-style: italic; - font-weight: normal; - font-size: 1.7em; - } - -.container code, .container pre code { - font-family: "Consolas", "Menlo", "Lucida Console", "Courier New", monospace; - } -.container pre code { - padding: 10px 15px; - border: 1px solid #ccc; - background: white; - color: #444; - - box-shadow: 0 0 15px #ddd; - - border-radius: 5px; - } -pre code a { - text-decoration: none; - } -pre code a:hover { - text-decoration: underline; - } - -p code, td:last-child code { - color: #666; -} - -p, ul, ol, table { - font-size: 13px; -} -code { - font-size: 12px; -} - -/*.api-page td:last-child pre { - margin-top: 0.5em; -}*/ - -table { - border-collapse: collapse; - box-shadow: 0 3px 15px #f0f0f0; - } -th { - background-color: #eeeeee; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#d7d7d7)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #eeeeee, #d7d7d7); /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, #eeeeee, #d7d7d7); /* FF3.6+ */ - background-image: -o-linear-gradient(top, #eeeeee, #d7d7d7); /* Opera 11.10+ */ - background-image: linear-gradient(to bottom, #eeeeee, #d7d7d7); - - text-shadow: 1px 1px 0 white; - - padding: 5px 10px; - } -th, td { - vertical-align: top; - /*line-height: 1.4;*/ - } -td { - padding: 8px 10px; - /*border-right: 1px solid #eee;*/ -} - - -.nav { - padding: 0; - margin: 28px 0 28px; - - list-style: none; - font-size: 1.2em; - border: 1px solid #dcddde; - overflow: hidden; - - background-color: #ffffff; - background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#eaebec)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #ffffff, #eaebec); /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, #ffffff, #eaebec); /* FF3.6+ */ - background-image: -o-linear-gradient(top, #ffffff, #eaebec); /* Opera 11.10+ */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eff0f1'); /* IE6-IE9 */ - - border-radius: 10px; - box-shadow: 0 0 8px #eee; - } - - .nav li a, .nav li span { - float: left; - padding: 0 13px; - border-right: 1px solid #ddd; - text-shadow: 1px 1px 0 white; - line-height: 40px; - } - .nav a { - text-decoration: none; - color: #000; - background-color: rgba(0,0,0,0); - background-repeat: no-repeat; - -webkit-transition: 0.08s all; - } - .nav li span { - color: #000; - - background-color: #e8e9ea; - background-color: #f3f4f5; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f3f4f5), to(#cacbcc)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #f3f4f5, #cacbcc); /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, #f3f4f5, #cacbcc); /* FF3.6+ */ - background-image: -o-linear-gradient(top, #f3f4f5, #cacbcc); /* Opera 11.10+ */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f8f9fa', EndColorStr='#d4d5d6'); - } - .nav li a:hover, .nav li a:focus { - color: black; - - background-color: rgba(0,0,0,0.03); - - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); - } - .nav li a.active { - color: black; - - background-color: rgba(0,0,0,0.06); - - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#eff0f1', EndColorStr='#f6f7f8'); - } - .nav li a.github-link, - .nav li a.twitter-link, - .nav li a.forum-link { - font-size: 12px; - color: #555; - float: right; - border-right: none; - border-left: 1px solid #ddd; - padding-left: 30px; - padding-right: 10px; - filter: none; - background-position: 9px 12px; - } - .nav li a.github-link { - background-image: url(../images/github.png); - background-position: 10px 12px; - padding-left: 32px; - } - .nav li a.twitter-link { - background-image: url(../images/twitter.png); - } - .nav li a.forum-link { - padding-right: 12px; - background-image: url(../images/forum.png); - } - .nav li a.github-link:hover, - .nav li a.twitter-link:hover, - .nav li a.forum-link:hover { - color: black; - } - - -#toc { - padding-left: 20px; - } - #toc ul { - list-style-type: none; - padding-left: 0; - } - #toc .colborder { - padding-right: 14px; - } - -#map-class { - margin-top: 1em; - } -a.nodocs { - color: #bbb; - } - -#features { - margin-top: -1.5em; - } - #features .quiet { - color: #777; - } - .noimpl { - color: #bbb; - } - -.container .map { - border: 1px solid #ccc; - margin: 1.5em 0; -} -.container .map:focus { - border-color: #999; -} - -h3 span { - color: #888; - } -h3.alt a { - color: #56b1ee; - text-decoration: none; -} -h3.alt a:hover { - text-decoration: underline; -} - -.example-img { - float: left; - margin: 0 18px 18px 0; - padding: 1px; - } -.bordered-img { - padding: 0; - border: 1px solid #ddd; - } - -.text-cut[class] { - font-size: 0; - color: white; -} - -.text-cut:after { - content: attr(data-cut); - font-size: 12px; - color: #777; -} - -.last ul { - margin-right: 0; -} - -table td { - color: #666; -} -table td:first-child { - color: #777; -} -table td:last-child { - color: black; -} - -table td code i { - color: #00A707; -} - -table td code b { - color: black; - font-weight: normal; -} - -.width250 { - width: 250px; -} -.width200 { - width: 200px; -} -.width300 { - width: 300px; -} -.width100 { - width: 100px; -} -.width140 { - width: 140px; -} -.minwidth { - width: 1px; -} - -table.factory-table { - width: 1px; -} - -table.factory-table td, table.factory-table th { - white-space: nowrap; - color: black; -} - -.factory-usage { - white-space: nowrap; -} - -.factory-usage code { - color: black; -} - -.social-buttons { - margin: 18px 0 0; - padding: 6px 0 2px 8px; - background: #f3f3f3; - position: absolute; - top: 10px; - right: 40px; - border-radius: 5px; -} - -.twitter-follow-button { - margin-left: 10px; -} - -.footer { - margin-top: 2.5em; -} - -dl { - overflow: hidden; -} - -dl dt { - font-size: 14px; - font-weight: normal; - float: left; - clear: left; - width: 160px; -} - -dl dd { - margin-bottom: 2em; - float: left; - width: 500px; -} - -.plugins td:first-child, .plugins td:last-child { - white-space: nowrap; -} - -.plugins td { - color: black; -} - - -#back-to-top { - text-decoration: none; - padding: 0px 10px 2px; - background: white; - color: black; - font-weight: bold; - font-size: 16px; - position: fixed; - top: -1px; - left: 0; - box-shadow: 0 3px 20px rgba(0, 0, 0, 0.1); -} - -.api-page td pre { - margin: 1em 0 0; - -} - -.api-page td pre code { - padding: 0 10px; - border: 0; - box-shadow: none; -} - - -p.notice { - border: none; - border-radius: 10px; - color: #444; - background: #DBF8A7; - padding: 5px 10px; - margin-bottom: 1.5em; -} - -.usedby a { - text-decoration: none; - margin: 0 2px; - color: #777; - font-size: 13px; -} - -.usedby a:hover { - text-decoration: underline; - color: black; -} - -.usedby { - background: #f3f3f3; - border-radius: 5px; - padding: 5px 7px; - margin: 1.5em -7px; - white-space: nowrap; - overflow: hidden; -} - -.post-title { - margin-top: 0; -} - -.post-date { - color: #777; - font-size: 18px; - line-height: 1; -} - -.post-meta { - color: #888; - margin-top: -1em; -} - -#disqus_thread { - margin-top: 3em; -} - -tr:target { - background: yellow; - -webkit-animation: highlight 2s ease 0.5s 1 normal forwards; - -moz-animation: highlight 2s ease 0.5s 1 normal forwards; - -o-animation: highlight 2s ease 0.5s 1 normal forwards; - animation: highlight 2s ease 0.5s 1 normal forwards; -} - -@-webkit-keyframes highlight { - 0% { background: yellow; } - 100% { background: white; } -} -@-moz-keyframes highlight { - 0% { background: yellow; } - 100% { background: white; } -} -@keyframes highlight { - 0% { background: yellow; } - 100% { background: white; } -} diff --git a/docs/highlight/styles/default.css b/docs/highlight/styles/default.css deleted file mode 100644 index 8717dd4ced3..00000000000 --- a/docs/highlight/styles/default.css +++ /dev/null @@ -1,133 +0,0 @@ -/* - -Original style from softwaremaniacs.org (c) Ivan Sagalaev - -*/ - -pre code { - display: block; padding: 0.5em; - background: #F0F0F0; -} - -pre code, -pre .ruby .subst, -pre .tag .title, -pre .lisp .title, -pre .nginx .title { - color: black; -} - -pre .string, -pre .title, -pre .constant, -pre .parent, -pre .tag .value, -pre .rules .value, -pre .rules .value .number, -pre .preprocessor, -pre .ruby .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .instancevar, -pre .aggregate, -pre .template_tag, -pre .django .variable, -pre .smalltalk .class, -pre .addition, -pre .flow, -pre .stream, -pre .bash .variable, -pre .apache .tag, -pre .apache .cbracket, -pre .tex .command, -pre .tex .special, -pre .erlang_repl .function_or_atom, -pre .markdown .header { - color: #800; -} - -pre .comment, -pre .annotation, -pre .template_comment, -pre .diff .header, -pre .chunk, -pre .markdown .blockquote { - color: #888; -} - -pre .number, -pre .date, -pre .regexp, -pre .literal, -pre .smalltalk .symbol, -pre .smalltalk .char, -pre .go .constant, -pre .change, -pre .markdown .bullet, -pre .markdown .link_url { - color: #080; -} - -pre .label, -pre .javadoc, -pre .ruby .string, -pre .decorator, -pre .filter .argument, -pre .localvars, -pre .array, -pre .attr_selector, -pre .important, -pre .pseudo, -pre .pi, -pre .doctype, -pre .deletion, -pre .envvar, -pre .shebang, -pre .apache .sqbracket, -pre .nginx .built_in, -pre .tex .formula, -pre .erlang_repl .reserved, -pre .input_number, -pre .markdown .link_label, -pre .vhdl .attribute { - color: #88F -} - -pre .keyword, -pre .id, -pre .phpdoc, -pre .title, -pre .built_in, -pre .aggregate, -pre .css .tag, -pre .javadoctag, -pre .phpdoc, -pre .yardoctag, -pre .smalltalk .class, -pre .winutils, -pre .bash .variable, -pre .apache .tag, -pre .go .typename, -pre .tex .command, -pre .markdown .strong, -pre .request, -pre .status { - font-weight: bold; -} - -pre .markdown .emphasis { - font-style: italic; -} - -pre .nginx .built_in { - font-weight: normal; -} - -pre .coffeescript .javascript, -pre .xml .css, -pre .xml .javascript, -pre .xml .vbscript, -pre .tex .formula { - opacity: 0.5; -} diff --git a/docs/highlight/styles/github.css b/docs/highlight/styles/github.css deleted file mode 100644 index c0fe43c252d..00000000000 --- a/docs/highlight/styles/github.css +++ /dev/null @@ -1,139 +0,0 @@ -/* - -github.com style (c) Vasily Polovnyov - -*/ - -pre code { - display: block; - padding: 0.5em; - color: #000; - background: #f5f5f5; -} - -code .comment, -pre .template_comment, -pre .diff .header, -pre .javadoc { - color: #998; -} - -code .keyword, -pre .css .rule .keyword, -pre .winutils, -/*pre .javascript .title,*/ -pre .lisp .title, -pre .nginx .title, -pre .subst, -pre .request, -pre .status { - color: #026D97; - font-weight: normal; -} - -pre .javascript .title { - color: black; - font-weight: bold; -} - -code .number, -pre .hexcolor, -code .literal { - color: #00A707 -} - -code .string, -pre .tag .value, -pre .phpdoc, -pre .tex .formula { - color: #E43E59; -} - -pre .title, -pre .id { - color: #900; - font-weight: bold -} - -pre .javascript .title, -pre .lisp .title, -pre .subst { - font-weight: normal -} - -pre .class .title, -pre .haskell .type, -pre .vhdl .literal, -pre .tex .command { - color: #458; - font-weight: bold -} - -pre .tag, -pre .tag .title, -pre .rules .property, -pre .django .tag .keyword { - color: #000080; - font-weight: normal -} - -pre .attribute, -pre .variable, -pre .instancevar, -pre .lisp .body { - color: #008080 -} - -pre .regexp { - color: #009926 -} - -pre .class { - color: #458; - font-weight: bold -} - -pre .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .lisp .keyword, -pre .tex .special, -pre .input_number { - color: #990073 -} - -pre .builtin, -pre .built_in, -pre .lisp .title { - color: #0086b3 -} - -pre .preprocessor, -pre .pi, -pre .doctype, -pre .shebang, -pre .cdata { - color: #999; - font-weight: bold -} - -pre .deletion { - background: #fdd -} - -pre .addition { - background: #dfd -} - -pre .diff .change { - background: #0086b3 -} - -pre .chunk { - color: #aaa -} - -pre .tex .formula { - opacity: 0.5; -} diff --git a/docs/images/paper.png b/docs/images/paper.png deleted file mode 100644 index 5977961667679963fa3200be4a8f082e430667ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85055 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 Scu)%f0000 Date: Thu, 2 Jul 2015 15:37:53 +0100 Subject: [PATCH 1643/2207] Only mouse over one feature at a time --- src/layer/vector/Canvas.js | 42 ++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index b85bdeb8151..67ea31b4514 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -200,37 +200,35 @@ L.Canvas = L.Renderer.extend({ if (!this._map || this._map._animatingZoom) { return; } var point = this._map.mouseEventToLayerPoint(e); - var id; - - // TODO don't do on each move event, throttle since it's expensive - for (id in this._layers) { - this._handleMouseOut(this._layers[id], e, point); - } - - for (id in this._layers) { - this._handleMouseHover(this._layers[id], e, point); - } + this._handleMouseOut(e, point); + this._handleMouseHover(e, point); }, - _handleMouseOut: function (layer, e, point) { - if (layer.options.interactive && layer._mouseInside && !layer._containsPoint(point)) { + _handleMouseOut: function (e, point) { + var layer = this._hoveredLayer; + if (layer && !layer._containsPoint(point)) { // if we're leaving the layer, fire mouseout L.DomUtil.removeClass(this._container, 'leaflet-interactive'); this._fireEvent(layer, e, 'mouseout'); - layer._mouseInside = false; + this._hoveredLayer = null; } }, - _handleMouseHover: function (layer, e, point) { - if (layer.options.interactive && layer._containsPoint(point)) { - // if we just got inside the layer, fire mouseover - if (!layer._mouseInside) { - L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor - this._fireEvent(layer, e, 'mouseover'); - layer._mouseInside = true; + _handleMouseHover: function (e, point) { + var id, layer; + if (!this._hoveredLayer) { + for (id in this._layers) { + layer = this._layers[id]; + if (layer.options.interactive && layer._containsPoint(point)) { + L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor + this._fireEvent(layer, e, 'mouseover'); + this._hoveredLayer = layer; + break; + } } - // fire mousemove - this._fireEvent(layer, e); + } + if (this._hoveredLayer) { + this._fireEvent(this._hoveredLayer, e); } }, From b3678d2ca8f7d739fe7e4b1540427b5024aa2dd0 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Thu, 2 Jul 2015 12:02:47 -0700 Subject: [PATCH 1644/2207] Allow for wide use of pane z-index for ordering. --- dist/leaflet.css | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index bd0c499ce61..f95258d3467 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -70,16 +70,16 @@ -moz-user-select: none; } -.leaflet-pane { z-index: 4; } +.leaflet-pane { z-index: 400; } -.leaflet-tile-pane { z-index: 2; } -.leaflet-overlay-pane { z-index: 4; } -.leaflet-shadow-pane { z-index: 5; } -.leaflet-marker-pane { z-index: 6; } -.leaflet-popup-pane { z-index: 7; } +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-popup-pane { z-index: 700; } -.leaflet-map-pane canvas { z-index: 1; } -.leaflet-map-pane svg { z-index: 2; } +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } .leaflet-vml-shape { width: 1px; From a410d4d1ad6edcf8730ccbd38b57808c13c7a3e2 Mon Sep 17 00:00:00 2001 From: Ishmael Smyrnow Date: Thu, 2 Jul 2015 15:54:57 -0400 Subject: [PATCH 1645/2207] Update plugin description Updated description of Leaflet.FunctionalTileLayer plugin to better represent use case. --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index f32a4153df7..561a000c178 100644 --- a/plugins.md +++ b/plugins.md @@ -403,7 +403,7 @@ The following plugins change the way that tile layers are loaded into the map. Leaflet.FunctionalTileLayer - Allows you to define tile layer URLs using a function, with support for jQuery deferreds. + Allows you to define tile layer URLs using a function. Even works with asynchronous sources, using promises. Ishmael Smyrnow From caf692d2a8afff3ebf1633ec838cea37ade35247 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Thu, 2 Jul 2015 13:35:23 -0700 Subject: [PATCH 1646/2207] Allow for access to imageData on L.ImageOverlay This implements the changes in https://github.com/Leaflet/Leaflet/pull/2621 for cross origin tiles for `L.ImageOverlay` so that the image data can be accessed in canvas and saved. --- src/layer/ImageOverlay.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 48e23a21b91..8e46e7e775d 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -8,6 +8,10 @@ L.ImageOverlay = L.Layer.extend({ opacity: 1, alt: '', interactive: false + + /* + crossOrigin: , + */ }, initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) @@ -114,6 +118,11 @@ L.ImageOverlay = L.Layer.extend({ img.onmousemove = L.Util.falseFn; img.onload = L.bind(this.fire, this, 'load'); + + if (this.options.crossOrigin) { + img.crossOrigin = ''; + } + img.src = this._url; img.alt = this.options.alt; }, From 40c1ce9659bce6ad7a4c23a56ebd26c5d047a8d5 Mon Sep 17 00:00:00 2001 From: James Seppi Date: Thu, 2 Jul 2015 14:55:54 -0500 Subject: [PATCH 1647/2207] instructions for using downloaded leaflet ref #3338 reorder usage sections --- download.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/download.md b/download.md index edfb1b0a720..f5911a80e4a 100644 --- a/download.md +++ b/download.md @@ -38,6 +38,20 @@ it straight away, place this in the `head` of your HTML code: +### Using a Downloaded Version of Leaflet + +Inside the archives downloaded from the above links, you will see four things: + +- `leaflet.js` - This is the minified Leaflet JavaScript code. +- `leaflet-src.js` - This is the readable, unminified Leaflet JavaScript, which is sometimes helpful for debugging. +- `leaflet.css` - This is the stylesheet for Leaflet. +- `images` - This is a folder that contains images referenced by `leaflet.css`. It must be in the same directory as `leaflet.css`. + +Unzip the downloaded archive to your website's directory and add this to the `head` of your HTML code: + + + + ### Leaflet Source Code These download packages above only contain the library itself. From 0d09d9c526aa494c852e98382c6d2d6d6fb6c2f3 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Thu, 2 Jul 2015 08:11:27 +0200 Subject: [PATCH 1648/2207] Update information for Leaflet Routing Machine --- plugins.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins.md b/plugins.md index 561a000c178..13379684eac 100644 --- a/plugins.md +++ b/plugins.md @@ -2322,10 +2322,12 @@ The following plugins use external services to calculate driving or walking rout From b75c8f4bc86059bf7e52b04ca9c84448bc93fb92 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Thu, 2 Jul 2015 08:51:36 +0200 Subject: [PATCH 1649/2207] Update providers list for Leaflet Control Geocoder --- plugins.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 13379684eac..bb6aee8689c 100644 --- a/plugins.md +++ b/plugins.md @@ -2402,7 +2402,8 @@ External services that transform an address or the name of a place into latitude From 05e7d53486af0899a9c16d017ad5adbf37e8a092 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 3 Jul 2015 11:50:40 +0300 Subject: [PATCH 1650/2207] Revert "update docs keyword highlighting" This reverts commit 9fc80c0c3480ec01b5c4a0f4d702865f212c1d94. --- reference.html | 690 ++++++++++++++++++++++++------------------------- 1 file changed, 345 insertions(+), 345 deletions(-) diff --git a/reference.html b/reference.html index 162f3974ee9..2f7c14ac303 100644 --- a/reference.html +++ b/reference.html @@ -175,37 +175,37 @@

      Map State Options

      - + - + - + - + - + - + @@ -228,68 +228,68 @@

      Interaction Options

      - + - + - - + + - - + + - + - + - + - + - + - - + + - - + +
      PluginDescriptionMaintainer
      - Leaflet Routing Machine + Leaflet Routing Machine - Control for route search between waypoints, displaying itinerary and alternative routes. Currently - uses OSRM to search routes. + Control for route search with via points, displaying itinerary and alternative routes. Uses + OSRM by default, but also supports + GraphHopper, + Mapbox Directions API and more. Per Liedman Leaflet Control Geocoder - A clean and extensible control that uses Nominatim (OSM) or Bing to locate places. Easy to adapt for other providers. + A clean and extensible control for both geocoding and reverse geocoding. Builtin support for + Nominatim, Bing, MapQuest, Mapbox, What3Words, Google and Photon. Easy to extend to other providers. Per Liedman
      center LatLngnullnull Initial geographical center of the map.
      zoom Numbernullnull Initial map zoom.
      layers ILayer[]nullnull Layers that will be added to the map initially.
      minZoom Numbernullnull Minimum zoom level of the map. Overrides any minZoom set on map layers.
      maxZoom Numbernullnull Maximum zoom level of the map. This overrides any maxZoom set on map layers.
      maxBounds LatLngBoundsnullnull When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view. To set the restriction dynamically, use setMaxBounds method
      dragging Booleantruetrue Whether the map be draggable with mouse/touch or not.
      touchZoom Booleantruetrue Whether the map can be zoomed by touch-dragging with two fingers.
      scrollWheelZoom BooleantrueWhether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was.trueWhether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was.
      doubleClickZoom BooleantrueWhether the map can be zoomed in by double clicking on it and zoomed out by double clicking while holding shift. If passed 'center', double-click zoom will zoom to the center of the view regardless of where the mouse was.trueWhether the map can be zoomed in by double clicking on it and zoomed out by double clicking while holding shift. If passed 'center', double-click zoom will zoom to the center of the view regardless of where the mouse was.
      boxZoom Booleantruetrue Whether the map can be zoomed to a rectangular area specified by dragging the mouse while pressing shift.
      tap Booleantruetrue Enables mobile hacks for supporting instant taps (fixing 200ms click delay on iOS/Android) and touch holds (fired as contextmenu events).
      tapTolerance Number1515 The max number of pixels a user can shift his finger during touch for it to be considered a valid tap.
      trackResize Booleantruetrue Whether the map automatically handles browser window resize to update itself.
      worldCopyJump Booleanfalsefalse With this option enabled, the map tracks when you pan to another "copy" of the world and seamlessly jumps to the original one so that all overlays like markers and vector layers are still visible.
      closePopupOnClick BooleantrueSet it to false if you don't want popups to close when user clicks the map.trueSet it to false if you don't want popups to close when user clicks the map.
      bounceAtZoomLimits BooleantrueSet it to false if you don't want the map to zoom beyond min/max zoom and then bounce back when pinch-zooming.trueSet it to false if you don't want the map to zoom beyond min/max zoom and then bounce back when pinch-zooming.
      @@ -305,19 +305,19 @@

      Keyboard Navigation Options

      keyboard Boolean - true + true Makes the map focusable and allows users to navigate the map with keyboard arrows and +/- keys. keyboardPanOffset Number - 80 + 80 Amount of pixels to pan when pressing an arrow key. keyboardZoomOffset Number - 1 + 1 Number of zoom levels to change when pressing + or - key. @@ -334,26 +334,26 @@

      Panning Inertia Options

      inertia Boolean - true + true If enabled, panning of the map will have an inertia effect where the map builds momentum while dragging and continues moving in the same direction for some time. Feels especially nice on touch devices. inertiaDeceleration Number - 3000 + 3000 The rate with which the inertial movement slows down, in pixels/second2. inertiaMaxSpeed Number - 1500 + 1500 Max speed of the inertial movement, in pixels/second. inertiaThreshold Number depends - Number of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default. + Number of milliseconds that should pass between stopping the movement and releasing the mouse or touch to prevent inertial movement. 32 for touch devices and 14 for the rest by default. @@ -369,13 +369,13 @@

      Control options

      zoomControl Boolean - true + true Whether the zoom control is added to the map by default. attributionControl Boolean - true + true Whether the attribution control is added to the map by default. @@ -404,7 +404,7 @@

      Animation options

      zoomAnimationThreshold Number - 4 + 4 Won't animate zoom if the zoom difference exceeds this value. @@ -613,7 +613,7 @@

      Methods for Modifying Map State

      <Number> zoom?, <zoom/pan options> options? )
      - this + this Sets the view of the map (geographical center and zoom) with the given animation options. @@ -621,7 +621,7 @@

      Methods for Modifying Map State

      <Number> zoom, <zoom options> options? )
      - this + this Sets the zoom of the map. @@ -629,16 +629,16 @@

      Methods for Modifying Map State

      <Number> delta?, <zoom options> options? )
      - this - Increases the zoom of the map by delta (1 by default). + this + Increases the zoom of the map by delta (1 by default). zoomOut( <Number> delta?, <zoom options> options? ) - this - Decreases the zoom of the map by delta (1 by default). + this + Decreases the zoom of the map by delta (1 by default). setZoomAround( @@ -646,7 +646,7 @@

      Methods for Modifying Map State

      <Number> zoom, <zoom options> options? )
      - this + this Zooms the map while keeping a specified point on the map stationary (e.g. used internally for scroll zoom and double-click zoom). @@ -654,14 +654,14 @@

      Methods for Modifying Map State

      <LatLngBounds> bounds, <fitBounds options> options? ) - this + this Sets a map view that contains the given geographical bounds with the maximum zoom level possible. fitWorld( <fitBounds options> options? ) - this + this Sets a map view that mostly contains the whole world with the maximum zoom level possible. @@ -669,7 +669,7 @@

      Methods for Modifying Map State

      <LatLng> latlng, <pan options> options? ) - this + this Pans the map to a given center. Makes an animated pan if new center is not more than one screen away from the current one. @@ -677,7 +677,7 @@

      Methods for Modifying Map State

      <LatLngBounds> bounds, <pan options> options? ) - this + this Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. @@ -685,46 +685,46 @@

      Methods for Modifying Map State

      <Point> point, <pan options> options? ) - this + this Pans the map by a given number of pixels (animated). invalidateSize( <Boolean> animate ) - this + this Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. invalidateSize( <zoom/pan options> options ) - this - Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. If options.debounceMoveend is true, it will delay moveend event so that it doesn't happen often even if the method is called many times in a row. + this + Checks if the map container size changed and updates the map if so — call it after you've changed the map size dynamically, also animating pan by default. If options.pan is false, panning will not occur. If options.debounceMoveend is true, it will delay moveend event so that it doesn't happen often even if the method is called many times in a row. setMaxBounds( <LatLngBounds> bounds - this + this Restricts the map view to the given bounds (see map maxBounds option). locate( <Locate options> options? ) - this + this Tries to locate the user using the Geolocation API, firing a locationfound event with location data on success or a locationerror event on failure, and optionally sets the map view to the user's location with respect to detection accuracy (or to the world view if geolocation failed). See Locate options for more details. stopLocate() - this + this Stops watching location previously initiated by map.locate({watch: true}) and aborts resetting the map view if map.locate was called with {setView: true}. remove() - this + this Destroys the map and clears all related event listeners. @@ -770,7 +770,7 @@

      Methods for Getting Map State

      Number - Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. + Returns the maximum zoom level on which the given bounds fit to the map view in its entirety. If inside (optional) is set to true, the method instead returns the minimum zoom level on which the map view fits into the given bounds in its entirety. getSize() @@ -802,7 +802,7 @@

      Methods for Layers and Controls

      <ILayer> layer, - this + this Adds the given layer to the map. @@ -810,7 +810,7 @@

      Methods for Layers and Controls

      <ILayer> layer ) - this + this Removes the given layer from the map. @@ -819,14 +819,14 @@

      Methods for Layers and Controls

      Boolean - Returns true if the given layer is currently added to the map. + Returns true if the given layer is currently added to the map. eachLayer( <Function> fn, <Object> context? ) - this + this Iterates over the layers of the map, optionally specifying context of the iterator function.
      map.eachLayer(function (layer) {
       	layer.bindPopup('Hello');
      @@ -839,7 +839,7 @@ 

      Methods for Layers and Controls

      <Popup> popup )
      - this + this Opens the specified popup while closing the previously opened (to make sure only one is opened at one time for usability). @@ -849,14 +849,14 @@

      Methods for Layers and Controls

      <Popup options> options? ) - this + this Creates a popup with the specified options and opens it in the given point on a map. closePopup( <Popup> popup? ) - this + this Closes the popup previously opened with openPopup (or the given one). @@ -864,7 +864,7 @@

      Methods for Layers and Controls

      <IControl> control ) - this + this Adds the given control to the map. @@ -872,7 +872,7 @@

      Methods for Layers and Controls

      <IControl> control ) - this + this Removes the given control from the map. @@ -1017,37 +1017,37 @@

      Locate options

      watch Boolean - false - If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. + false + If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. setView Boolean - false - If true, automatically sets the map view to the user location with respect to detection accuracy, or to world view if geolocation failed. + false + If true, automatically sets the map view to the user location with respect to detection accuracy, or to world view if geolocation failed. maxZoom Number - Infinity + Infinity The maximum zoom for automatic view setting when using `setView` option. timeout Number - 10000 + 10000 Number of milliseconds to wait for a response from geolocation before firing a locationerror event. maximumAge Number - 0 + 0 Maximum age of detected location. If less than this amount of milliseconds passed since last geolocation response, locate will return a cached location. enableHighAccuracy Boolean - false + false Enables high accuracy, see description in the W3C spec. @@ -1065,8 +1065,8 @@

      Zoom/pan options

      reset Boolean - false - If true, the map view will be completely reset (without any animations). + false + If true, the map view will be completely reset (without any animations). pan @@ -1083,7 +1083,7 @@

      Zoom/pan options

      animate Boolean - - + - An equivalent of passing animate to both zoom and pan options (see below). @@ -1101,25 +1101,25 @@

      Pan options

      animate Boolean - - If true, panning will always be animated if possible. If false, it will not animate panning, either resetting the map view if panning more than a screen away, or just setting a new offset for the map pane (except for `panBy` which always does the latter). + If true, panning will always be animated if possible. If false, it will not animate panning, either resetting the map view if panning more than a screen away, or just setting a new offset for the map pane (except for `panBy` which always does the latter). duration Number - 0.25 + 0.25 Duration of animated panning. easeLinearity Number - 0.25 - The curvature factor of panning animation easing (third parameter of the Cubic Bezier curve). 1.0 means linear animation, the less the more bowed the curve. + 0.25 + The curvature factor of panning animation easing (third parameter of the Cubic Bezier curve). 1.0 means linear animation, the less the more bowed the curve. noMoveStart Boolean - false - If true, panning won't fire movestart event on start (used internally for panning inertia). + false + If true, panning won't fire movestart event on start (used internally for panning inertia). @@ -1136,7 +1136,7 @@

      Zoom options

      animate Boolean - - If not specified, zoom animation will happen if the zoom origin is inside the current view. If true, the map will attempt animating zoom disregarding where zoom origin is. Setting false will make it always reset the view completely without animation. + If not specified, zoom animation will happen if the zoom origin is inside the current view. If true, the map will attempt animating zoom disregarding where zoom origin is. Setting false will make it always reset the view completely without animation. @@ -1154,25 +1154,25 @@

      fitBounds options

      paddingTopLeft Point - [0, 0] + [0, 0] Sets the amount of padding in the top left corner of a map container that shouldn't be accounted for when setting the view to fit bounds. Useful if you have some control overlays on the map like a sidebar and you don't want them to obscure objects you're zooming to. paddingBottomRight Point - [0, 0] + [0, 0] The same for bottom right corner of the map. padding Point - [0, 0] + [0, 0] Equivalent of setting both top left and bottom right padding to the same value. maxZoom Number - null + null The maximum possible zoom to use. @@ -1332,55 +1332,55 @@

      Options

      clickable Boolean - true - If false, the marker will not emit mouse events and will act as a part of the underlying map. + true + If false, the marker will not emit mouse events and will act as a part of the underlying map. draggable Boolean - false + false Whether the marker is draggable with mouse/touch or not. keyboard Boolean - true + true Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. title String - '' + '' Text for the browser tooltip that appear on marker hover (no tooltip by default). alt String - '' + '' Text for the alt attribute of the icon image (useful for accessibility). zIndexOffset Number - 0 + 0 By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). opacity Number - 1.0 + 1.0 The opacity of the marker. riseOnHover Boolean - false - If true, the marker will get on top of others when you hover the mouse over it. + false + If true, the marker will get on top of others when you hover the mouse over it. riseOffset Number - 250 + 250 The z-index offset used for the riseOnHover feature. @@ -1480,7 +1480,7 @@

      Methods

      <Map> map )
      - this + this Adds the marker to the map. @@ -1493,7 +1493,7 @@

      Methods

      <LatLng> latlng )
      - this + this Changes the marker position to the given point. @@ -1501,7 +1501,7 @@

      Methods

      <Icon> icon )
      - this + this Changes the marker icon. @@ -1509,21 +1509,21 @@

      Methods

      <Number> offset )
      - this + this Changes the zIndex offset of the marker. setOpacity( <Number> opacity ) - this + this Changes the opacity of the marker. update() - this + this Updates the marker position, useful if coordinates of its latLng object were changed directly. @@ -1532,17 +1532,17 @@

      Methods

      <Popup options> options? )
      - this + this Binds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method. unbindPopup() - this + this Unbinds the popup previously bound to the marker with bindPopup. openPopup() - this + this Opens the popup previously bound by the bindPopup method. @@ -1552,12 +1552,12 @@

      Methods

      closePopup() - this + this Closes the bound popup of the marker if it's opened. togglePopup() - this + this Toggles the popup previously bound by the bindPopup method. @@ -1565,7 +1565,7 @@

      Methods

      <String> html | <HTMLElement> el )
      - this + this Sets an HTML content of the popup of this marker. @@ -1641,83 +1641,83 @@ maxWidth Number - 300 + 300 Max width of the popup. minWidth Number - 50 + 50 Min width of the popup. maxHeight Number - null + null If set, creates a scrollable container of the given height inside a popup if its content exceeds it. autoPan Boolean - true - Set it to false if you don't want the map to do panning animation to fit the opened popup. + true + Set it to false if you don't want the map to do panning animation to fit the opened popup. keepInView Boolean - false - Set it to true if you want to prevent users from panning the popup off of the screen while it is open. + false + Set it to true if you want to prevent users from panning the popup off of the screen while it is open. closeButton Boolean - true + true Controls the presense of a close button in the popup. offset Point - Point(0, 6) + Point(0, 6) The offset of the popup position. Useful to control the anchor of the popup when opening it on some overlays. autoPanPaddingTopLeft Point - null + null The margin between the popup and the top left corner of the map view after autopanning was performed. autoPanPaddingBottomRight Point - null + null The margin between the popup and the bottom right corner of the map view after autopanning was performed. autoPanPadding Point - Point(5, 5) + Point(5, 5) Equivalent of setting both top left and bottom right autopan padding to the same value. zoomAnimation Boolean - true + true Whether to animate the popup on zoom. Disable it if you have problems with Flash content inside popups. closeOnClick Boolean - null - Set it to false if you want to override the default behavior of the popup closing when user clicks the map (set globally by the Map closePopupOnClick option). + null + Set it to false if you want to override the default behavior of the popup closing when user clicks the map (set globally by the Map closePopupOnClick option). className String - '' + '' A custom class name to assign to the popup. @@ -1735,7 +1735,7 @@

      Methods

      <Map> map )
      - this + this Adds the popup to the map. @@ -1743,7 +1743,7 @@

      Methods

      <Map> map ) - this + this Adds the popup to the map and closes the previous one. The same as map.openPopup(popup). @@ -1751,7 +1751,7 @@

      Methods

      <LatLng> latlng ) - this + this Sets the geographical point where the popup will open. @@ -1764,7 +1764,7 @@

      Methods

      <String|HTMLElement> htmlContent ) - this + this Sets the HTML content of the popup. @@ -1775,7 +1775,7 @@

      Methods

      update() - this + this Updates the popup content, layout and position. Useful for updating the popup after something inside changed, e.g. image loaded. @@ -1833,115 +1833,115 @@

      Options

      minZoom Number - 0 + 0 Minimum zoom number. maxZoom Number - 18 + 18 Maximum zoom number. maxNativeZoom Number - null + null Maximum zoom number the tiles source has available. If it is specified, the tiles on all zoom levels higher than maxNativeZoom will be loaded from maxZoom level and auto-scaled. tileSize Number - 256 + 256 Tile size (width and height in pixels, assuming tiles are square). subdomains String or String[] - 'abc' + 'abc' Subdomains of the tile service. Can be passed in the form of one string (where each letter is a subdomain name) or an array of strings. errorTileUrl String - '' + '' URL to the tile image to show in place of the tile that failed to load. attribution String - '' + '' e.g. "© Mapbox" — the string used by the attribution control, describes the layer data. tms Boolean - false - If true, inverses Y axis numbering for tiles (turn this on for TMS services). + false + If true, inverses Y axis numbering for tiles (turn this on for TMS services). continuousWorld Boolean - false - If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). + false + If set to true, the tile coordinates won't be wrapped by world width (-180 to 180 longitude) or clamped to lie within world height (-90 to 90). Use this if you use Leaflet for maps that don't reflect the real world (e.g. game, indoor or photo maps). noWrap Boolean - false - If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. + false + If set to true, the tiles just won't load outside the world width (-180 to 180 longitude) instead of repeating. zoomOffset Number - 0 + 0 The zoom number used in tile URLs will be offset with this value. zoomReverse Boolean - false - If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) + false + If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) opacity Number - 1.0 + 1.0 The opacity of the tile layer. zIndex Number - null + null The explicit zIndex of the tile layer. Not set by default. unloadInvisibleTiles Boolean depends - If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. + If true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false. updateWhenIdle Boolean depends - If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. + If false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false. detectRetina Boolean - false - If true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. + false + If true and user is on a retina display, it will request four tiles of half the specified size and a bigger zoom level in place of one to utilize the high resolution. reuseTiles Boolean - false - If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. + false + If true, all the tiles that are not visible after panning are placed in a reuse queue from which they will be fetched when new tiles become visible (as opposed to dynamically creating new ones). This will in theory keep memory usage low and eliminate the need for reserving new memory whenever a new tile is needed. bounds LatLngBounds - null + null When this option is set, the TileLayer only loads tiles that are in the given geographical bounds. @@ -1996,17 +1996,17 @@

      Methods

      <Map> map ) - this + this Adds the layer to the map. bringToFront() - this + this Brings the tile layer to the top of all tile layers. bringToBack() - this + this Brings the tile layer to the bottom of all tile layers. @@ -2014,7 +2014,7 @@

      Methods

      <Number> opacity ) - this + this Changes the opacity of the tile layer. @@ -2022,19 +2022,19 @@

      Methods

      <Number> zIndex ) - this + this Sets the zIndex of the tile layer. redraw() - this + this Causes the layer to clear all the tiles and request them again. setUrl( <String> urlTemplate ) - this + this Updates the layer's URL template and redraws it. @@ -2092,37 +2092,37 @@

      Options

      layers String - '' + '' (required) Comma-separated list of WMS layers to show. styles String - '' + '' Comma-separated list of WMS styles. format String - 'image/jpeg' - WMS image format (use 'image/png' for layers with transparency). + 'image/jpeg' + WMS image format (use 'image/png' for layers with transparency). transparent Boolean - false - If true, the WMS service will return images with transparency. + false + If true, the WMS service will return images with transparency. version String - '1.1.1' + '1.1.1' Version of the WMS service to use. crs CRS - null + null Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means. @@ -2140,8 +2140,8 @@

      Methods

      <WMS parameters> params, <Boolean> noRedraw? ) - this - Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true). + this + Merges an object with the new parameters and re-requests tiles on the current screen (unless noRedraw was set to true). @@ -2187,7 +2187,7 @@

      Options

      async Boolean - false + false Indicates that tiles will be drawn asynchronously. tileDrawn method should be called for each tile after drawing completion. @@ -2206,7 +2206,7 @@

      Methods

      <Point> tilePoint, <Number> zoom ) - this + this You need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom. @@ -2259,13 +2259,13 @@

      Options

      opacity Number - 1.0 + 1.0 The opacity of the image overlay. attribution String - '' + '' The attribution text of the image overlay. @@ -2282,7 +2282,7 @@

      Methods

      <Map> map ) - this + this Adds the overlay to the map. @@ -2290,7 +2290,7 @@

      Methods

      <Number> opacity ) - this + this Sets the opacity of the overlay. @@ -2298,17 +2298,17 @@

      Methods

      <String> imageUrl ) - this + this Changes the URL of the image. bringToFront() - this + this Brings the layer to the top of all overlays. bringToBack() - this + this Brings the layer to the bottom of all overlays. @@ -2328,32 +2328,32 @@

      Options

      stroke Boolean - true - Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. + true + Whether to draw stroke along the path. Set it to false to disable borders on polygons or circles. color String - '#03f' + '#03f' Stroke color. weight Number - 5 + 5 Stroke width in pixels. opacity Number - 0.5 + 0.5 Stroke opacity. fill Boolean depends - Whether to fill the path with color. Set it to false to disable filling on polygons or circles. + Whether to fill the path with color. Set it to false to disable filling on polygons or circles. fillColor @@ -2364,49 +2364,49 @@

      Options

      fillOpacity Number - 0.2 + 0.2 Fill opacity. fillRule String - 'evenodd' + 'evenodd' A string that defines how the inside of a shape is determined. dashArray String - null + null A string that defines the stroke dash pattern. Doesn't work on canvas-powered layers (e.g. Android 2). lineCap String - null + null A string that defines shape to be used at the end of the stroke. lineJoin String - null + null A string that defines shape to be used at the corners of the stroke. clickable Boolean - true - If false, the vector will not emit mouse events and will act as a part of the underlying map. + true + If false, the vector will not emit mouse events and will act as a part of the underlying map. pointerEvents String - null + null Sets the pointer-events attribute on the path if SVG backend is used. className String - '' + '' Custom class name set on an element. @@ -2485,7 +2485,7 @@

      Methods

      <Map> map ) - this + this Adds the layer to the map. @@ -2494,7 +2494,7 @@

      Methods

      <Popup options> options? ) - this + this Binds a popup with a particular HTML content to a click on this path. @@ -2503,12 +2503,12 @@

      Methods

      <Popup options> options? ) - this + this Binds a given popup object to the path. unbindPopup() - this + this Unbinds the popup previously bound to the path with bindPopup. @@ -2516,13 +2516,13 @@

      Methods

      <LatLng> latlng? ) - this + this Opens the popup previously bound by the bindPopup method in the given point, or in one of the path's points if not specified. closePopup() - this + this Closes the path's bound popup if it is opened. @@ -2530,7 +2530,7 @@

      Methods

      <Path options> object ) - this + this Changes the appearance of a Path based on the options in the Path options object. @@ -2540,17 +2540,17 @@

      Methods

      bringToFront() - this + this Brings the layer to the top of all path layers. bringToBack() - this + this Brings the layer to the bottom of all path layers. redraw() - this + this Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. @@ -2579,12 +2579,12 @@

      Static properties

      CANVAS Boolean depends - True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. + True if Canvas is used for vector rendering (Android 2). You can also force this by setting global variable L_PREFER_CANVAS to true before the Leaflet include on your page — sometimes it can increase performance dramatically when rendering thousands of circle markers, but currently suffers from a bug that causes removing such layers to be extremely slow. CLIP_PADDING Number - 0.5 for SVG
      0.02 for VML + 0.5 for SVG
      0.02 for VML How much to extend the clip area around the map view (relative to its size, e.g. 0.5 is half the screen in each direction). Smaller values mean that you will see clipped ends of paths while you're dragging the map, and bigger values decrease drawing performance. @@ -2634,13 +2634,13 @@

      Options

      smoothFactor Number - 1.0 + 1.0 How much to simplify the polyline on each zoom level. More means better performance and smoother look, and less means more accurate representation. noClip Boolean - false + false Disabled polyline clipping. @@ -2660,7 +2660,7 @@

      Methods

      <LatLng> latlng ) - this + this Adds a given point to the polyline. @@ -2668,7 +2668,7 @@

      Methods

      <LatLng[]> latlngs ) - this + this Replaces all the points in the polyline with the given array of geographical points. @@ -2742,7 +2742,7 @@

      Methods

      <LatLng[][]> latlngs ) - this + this Replace all lines and their paths with the given array of arrays of geographical points. @@ -2851,7 +2851,7 @@

      Methods

      <LatLng[][]> latlngs ) - this + this Replace all polygons and their paths with the given array of arrays of geographical points. @@ -2923,7 +2923,7 @@

      Methods

      <LatLngBounds> bounds ) - this + this Redraws the rectangle with the passed bounds. @@ -2978,7 +2978,7 @@

      Methods

      <LatLng> latlng ) - this + this Sets the position of a circle to a new location. @@ -2986,7 +2986,7 @@

      Methods

      <Number> radius ) - this + this Sets the radius of a circle. Units are in meters. @@ -3034,7 +3034,7 @@

      Methods

      <LatLng> latlng ) - this + this Sets the position of a circle marker to a new location. @@ -3042,7 +3042,7 @@

      Methods

      <Number> radius ) - this + this Sets the radius of a circle marker. Units are in pixels. @@ -3092,7 +3092,7 @@

      Methods

      <Map> map ) - this + this Adds the group of layers to the map. @@ -3100,7 +3100,7 @@

      Methods

      <ILayer> layer ) - this + this Adds a given layer to the group. @@ -3108,7 +3108,7 @@

      Methods

      <ILayer> layer ) - this + this Removes a given layer from the group. @@ -3116,7 +3116,7 @@

      Methods

      <String> id ) - this + this Removes a given layer of the given id from the group. @@ -3125,7 +3125,7 @@

      Methods

      Boolean - Returns true if the given layer is currently added to the group. + Returns true if the given layer is currently added to the group. getLayer( @@ -3142,7 +3142,7 @@

      Methods

      clearLayers() - this + this Removes all the layers from the group. @@ -3150,7 +3150,7 @@

      Methods

      <Function> fn, <Object> context? )
      - this + this Iterates over the layers of the group, optionally specifying context of the iterator function.
      group.eachLayer(function (layer) {
       	layer.bindPopup('Hello');
      @@ -3210,7 +3210,7 @@ 

      Methods

      <Popup options> options? )
      - this + this Binds a popup with a particular HTML content to a click on any layer from the group that has a bindPopup method. @@ -3222,17 +3222,17 @@

      Methods

      setStyle( <Path options> style ) - this + this Sets the given path options to each layer of the group that has a setStyle method. bringToFront() - this + this Brings the layer group to the top of all other layers. bringToBack() - this + this Brings the layer group to the bottom of all other layers. @@ -3392,7 +3392,7 @@

      Methods

      <Function> style ) - this + this Changes styles of GeoJSON vector layers with the given style function. @@ -3400,7 +3400,7 @@

      Methods

      <Path> layer ) - this + this Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. @@ -3429,7 +3429,7 @@

      Static methods

      LatLng - Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). + Creates a LatLng object from an array of 2 numbers (latitude, longitude) used in GeoJSON for points. If reverse is set to true, the numbers will be interpreted as (longitude, latitude). coordsToLatLngs( @@ -3439,7 +3439,7 @@

      Static methods

      Array - Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). + Creates a multidimensional array of LatLng objects from a GeoJSON coordinates array. levelsDeep specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). If reverse is set to true, the numbers will be interpreted as (longitude, latitude). @@ -3520,7 +3520,7 @@

      Methods

      Boolean - Returns true if the given LatLng point is at the same position (within a small margin of error). + Returns true if the given LatLng point is at the same position (within a small margin of error). toString() @@ -3534,7 +3534,7 @@

      Methods

      LatLng - Returns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default). + Returns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default). @@ -3550,19 +3550,19 @@

      Constants

      DEG_TO_RAD Number - Math.PI / 180 + Math.PI / 180 A multiplier for converting degrees into radians. RAD_TO_DEG Number - 180 / Math.PI + 180 / Math.PI A multiplier for converting radians into degrees. MAX_MARGIN Number - 1.0E-9 + 1.0E-9 Max margin of error for the equality check. @@ -3624,7 +3624,7 @@

      Methods

      <LatLng|LatLngBounds> latlng ) - this + this Extends the bounds to contain the given point or bounds. @@ -3678,7 +3678,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given one. + Returns true if the rectangle contains the given one. contains( @@ -3686,7 +3686,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given point. + Returns true if the rectangle contains the given point. intersects( @@ -3694,7 +3694,7 @@

      Methods

      Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. equals( @@ -3702,12 +3702,12 @@

      Methods

      Boolean - Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. + Returns true if the rectangle is equivalent (within a small margin of error) to the given bounds. toBBoxString() String - Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. + Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. pad( @@ -3722,7 +3722,7 @@

      Methods

      Boolean - Returns true if the bounds are properly initialized. + Returns true if the bounds are properly initialized. @@ -3753,7 +3753,7 @@

      Creation

      <Boolean> round? ) - Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. + Creates a Point object with the given x and y coordinates. If optional round is set to true, rounds the x and y values. @@ -3816,7 +3816,7 @@

      Methods

      Point - Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. + Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. distanceTo( @@ -3847,7 +3847,7 @@

      Methods

      Boolean - Returns true if the given point has the same coordinates. + Returns true if the given point has the same coordinates. contains( @@ -3855,7 +3855,7 @@

      Methods

      Boolean - Returns true if the both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). + Returns true if the both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). toString() @@ -3952,7 +3952,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given one. + Returns true if the rectangle contains the given one. contains( @@ -3960,7 +3960,7 @@

      Methods

      Boolean - Returns true if the rectangle contains the given point. + Returns true if the rectangle contains the given point. intersects( @@ -3968,13 +3968,13 @@

      Methods

      Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. isValid() Boolean - Returns true if the bounds are properly initialized. + Returns true if the bounds are properly initialized. getSize() @@ -4093,7 +4093,7 @@

      DivIcon

      L.marker([50.505, 30.57], {icon: myIcon}).addTo(map);
      -

      By default, it has a 'leaflet-div-icon' class and is styled as a little white square with a shadow.

      +

      By default, it has a 'leaflet-div-icon' class and is styled as a little white square with a shadow.

      Creation

      @@ -4140,7 +4140,7 @@

      Options

      className String - A custom class name to assign to the icon. 'leaflet-div-icon' by default. + A custom class name to assign to the icon. 'leaflet-div-icon' by default. html @@ -4189,7 +4189,7 @@

      Options

      position String - 'topright' + 'topright' The initial position of the control (one of the map corners). See control positions. @@ -4206,7 +4206,7 @@

      Methods

      <String> position )
      - this + this Sets the position of the control. See control positions. @@ -4219,7 +4219,7 @@

      Methods

      <Map> map )
      - this + this Adds the control to the map. @@ -4227,7 +4227,7 @@

      Methods

      <Map> map ) - this + this Removes the control from the map. @@ -4247,19 +4247,19 @@

      Control Positions

      Description - 'topleft' + 'topleft' Top left of the map. - 'topright' + 'topright' Top right of the map. - 'bottomleft' + 'bottomleft' Bottom left of the map. - 'bottomright' + 'bottomright' Bottom right of the map. @@ -4267,7 +4267,7 @@

      Control Positions

      Control.zoom

      -

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      +

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      Creation

      @@ -4297,31 +4297,31 @@

      Options

      - + - + - + - + - +
      position String'topleft''topleft' The position of the control (one of the map corners). See control positions.
      zoomInText String'+''+' The text set on the zoom in button.
      zoomOutText String'-''-' The text set on the zoom out button.
      zoomInTitle String'Zoom in''Zoom in' The title set on the zoom in button.
      zoomOutTitle String'Zoom out''Zoom out' The title set on the zoom out button.
      @@ -4330,7 +4330,7 @@

      Options

      Control.Attribution

      -

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      +

      The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its attributionControl option to false, and it fetches attribution texts from layers with getAttribution method automatically. Extends Control.

      Creation

      @@ -4361,14 +4361,14 @@

      Options

      - + - - + +
      position String'bottomright''bottomright' The position of the control (one of the map corners). See control positions.
      prefix String'Leaflet'The HTML text shown before the attributions. Pass false to disable.'Leaflet'The HTML text shown before the attributions. Pass false to disable.
      @@ -4383,21 +4383,21 @@

      Methods

      setPrefix( <String> prefix ) - this + this Sets the text before the attributions. addAttribution( <String> text ) - this - Adds an attribution text (e.g. 'Vector data &copy; Mapbox'). + this + Adds an attribution text (e.g. 'Vector data &copy; Mapbox'). removeAttribution( <String> text ) - this + this Removes an attribution text. @@ -4448,7 +4448,7 @@

      Methods

      <ILayer> layer, <String> name ) - this + this Adds a base layer (radio button entry) with the given name to the control. @@ -4456,14 +4456,14 @@

      Methods

      <ILayer> layer, <String> name ) - this + this Adds an overlay (checkbox entry) with the given name to the control. removeLayer( <ILayer> layer ) - this + this Remove the given layer from the control. @@ -4480,20 +4480,20 @@

      Options

      position String - 'topright' + 'topright' The position of the control (one of the map corners). See control positions. collapsed Boolean - true - If true, the control will be collapsed into an icon and expanded on mouse hover or touch. + true + If true, the control will be collapsed into an icon and expanded on mouse hover or touch. autoZIndex Boolean - true - If true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + true + If true, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. @@ -4576,32 +4576,32 @@

      Options

      position String - 'bottomleft' + 'bottomleft' The position of the control (one of the map corners). See control positions. maxWidth Number - 100 + 100 Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500). metric Boolean - true + true Whether to show the metric scale line (m/km). imperial Boolean - true + true Whether to show the imperial scale line (mi/ft). updateWhenIdle Boolean - false - If true, the control is updated on moveend, otherwise it's always up-to-date (updated on move). + false + If true, the control is updated on moveend, otherwise it's always up-to-date (updated on move). @@ -4609,7 +4609,7 @@

      Options

      Events methods

      -

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

      +

      A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

      Example

      @@ -4638,8 +4638,8 @@

      Methods

      <Object> context? )
      - this - Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). + this + Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). addOneTimeEventListener( @@ -4648,7 +4648,7 @@

      Methods

      <Object> context? )
      - this + this The same as above except the listener will only get fired once and then removed. @@ -4657,7 +4657,7 @@

      Methods

      <Object> context? )
      - this + this Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} @@ -4667,7 +4667,7 @@

      Methods

      <Object> context? )
      - this + this Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to addEventListener, you must pass the same context to removeEventListener in order to remove the listener. @@ -4676,13 +4676,13 @@

      Methods

      <Object> context? )
      - this + this Removes a set of type/listener pairs. removeEventListener() - this + this Removes all listeners. An alias to clearAllEventListeners when you use it without arguments. @@ -4691,7 +4691,7 @@

      Methods

      Boolean - Returns true if a particular event type has some listeners attached to it. + Returns true if a particular event type has some listeners attached to it. fireEvent( @@ -4699,33 +4699,33 @@

      Methods

      <Object> data? )
      - this + this Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. clearAllEventListeners() - this + this Removes all listeners to all events on the object. on( … ) - this + this Alias to addEventListener. once( … ) - this + this Alias to addOneTimeEventListener. off( … ) - this + this Alias to removeEventListener. fire( … ) - this + this Alias to fireEvent. @@ -4752,7 +4752,7 @@

      Event

      type String - The event type (e.g. 'click'). + The event type (e.g. 'click'). target @@ -5176,77 +5176,77 @@

      Browser

      ie Boolean - true for all Internet Explorer versions. + true for all Internet Explorer versions. ie6 Boolean - true for Internet Explorer 6. + true for Internet Explorer 6. ie7 Boolean - true for Internet Explorer 7. + true for Internet Explorer 7. webkit Boolean - true for webkit-based browsers like Chrome and Safari (including mobile versions). + true for webkit-based browsers like Chrome and Safari (including mobile versions). webkit3d Boolean - true for webkit-based browsers that support CSS 3D transformations. + true for webkit-based browsers that support CSS 3D transformations. android Boolean - true for Android mobile browser. + true for Android mobile browser. android23 Boolean - true for old Android stock browsers (2 and 3). + true for old Android stock browsers (2 and 3). mobile Boolean - true for modern mobile browsers (including iOS Safari and different Android browsers). + true for modern mobile browsers (including iOS Safari and different Android browsers). mobileWebkit Boolean - true for mobile webkit-based browsers. + true for mobile webkit-based browsers. mobileOpera Boolean - true for mobile Opera. + true for mobile Opera. touch Boolean - true for all browsers on touch devices. + true for all browsers on touch devices. msTouch Boolean - true for browsers with Microsoft touch model (e.g. IE10). + true for browsers with Microsoft touch model (e.g. IE10). retina Boolean - true for devices with Retina screens. + true for devices with Retina screens. @@ -5279,7 +5279,7 @@

      Methods

      Function - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind). + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind). stamp( <Object> obj ) @@ -5317,7 +5317,7 @@

      Methods

      falseFn() Function - Always returns false. + Always returns false. formatNum( @@ -5351,7 +5351,7 @@

      Methods

      String - Converts an object into a parameter URL string, e.g.
      {a: "foo", b: "bar"} translates to '?a=foo&b=bar'. + Converts an object into a parameter URL string, e.g. {a: "foo", b: "bar"} translates to '?a=foo&b=bar'. template( @@ -5359,7 +5359,7 @@

      Methods

      String - Simple templating facility, accepts a template string of the form 'Hello {a}, {b}' and a data object like {a: 'foo', b: 'bar'}, returns evaluated string ('Hello foo, bar'). You can also specify functions instead of strings for data values — they will be evaluated passing data as an argument. + Simple templating facility, accepts a template string of the form 'Hello {a}, {b}' and a data object like {a: 'foo', b: 'bar'}, returns evaluated string ('Hello foo, bar'). You can also specify functions instead of strings for data values — they will be evaluated passing data as an argument. isArray( @@ -5367,7 +5367,7 @@

      Methods

      Boolean - Returns true if the given object is an array. + Returns true if the given object is an array. trim( @@ -5562,8 +5562,8 @@

      Methods

      <Object> context? )
      - this - Adds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified. + this + Adds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified. removeListener( @@ -5572,7 +5572,7 @@

      Methods

      <Function> fn )
      - this + this Removes an event listener from the element. @@ -5580,7 +5580,7 @@

      Methods

      <DOMEvent> e ) - this + this Stop the given event from propagation to parent elements. Used inside the listener functions:
      L.DomEvent.addListener(div, 'click', function (e) {
       	L.DomEvent.stopPropagation(e);
      @@ -5592,7 +5592,7 @@ 

      Methods

      <DOMEvent> e )
      - this + this Prevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions.
      @@ -5601,7 +5601,7 @@

      Methods

      <DOMEvent> e ) - this + this Does stopPropagation and preventDefault at the same time. @@ -5609,8 +5609,8 @@

      Methods

      <HTMLElement> el ) - this - Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events. + this + Adds stopPropagation to the element's 'click', 'doubleclick', 'mousedown' and 'touchstart' events. getMousePosition( @@ -5700,7 +5700,7 @@

      Methods

      Boolean - Returns true if the element class attribute contains name. + Returns true if the element class attribute contains name. addClass( @@ -5736,8 +5736,8 @@

      Methods

      <String[]> props )
      - String or false - Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. + String or false + Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. getTranslateString( @@ -5764,7 +5764,7 @@

      Methods

      - - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. + Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. getPosition( @@ -5788,7 +5788,7 @@

      Properties

      TRANSITION String - Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). + Vendor-prefixed transition style name (e.g. 'webkitTransition' for WebKit). TRANSFORM @@ -5837,8 +5837,8 @@

      Methods

      <Number> easeLinearity? )
      - this - Run an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default) + this + Run an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default) @@ -5959,17 +5959,17 @@

      Methods

      START String - Name of the DOM event that initiates dragging. 'mousedown' for desktop browsers, 'touchstart' for mobile devices. + Name of the DOM event that initiates dragging. 'mousedown' for desktop browsers, 'touchstart' for mobile devices. MOVE String - Name of the DOM event for drag moving. 'mousemove' for desktop browsers, 'touchmove' for mobile devices. + Name of the DOM event for drag moving. 'mousemove' for desktop browsers, 'touchmove' for mobile devices. END String - Name of the DOM event that ends dragging. 'mouseup' for desktop browsers, 'touchend' for mobile devices. + Name of the DOM event that ends dragging. 'mouseup' for desktop browsers, 'touchend' for mobile devices. --> @@ -5997,7 +5997,7 @@

      IHandler

      enabled() Boolean - Returns true if the handler is enabled. + Returns true if the handler is enabled. @@ -6290,7 +6290,7 @@

      Properties

      code String - Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). + Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). @@ -6330,7 +6330,7 @@

      Defined CRS

      Global Switches

      -

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      +

      Global switches are created for rare cases and generally make Leaflet to not detect a particular browser feature even if it's there. You need to set the switch as a global variable to true before including Leaflet on the page, like this:

      <script>L_PREFER_CANVAS = true;</script>
       <script src="leaflet.js"></script>
      From 3bb3c3973f83d2de077c3ab583b33ba18c3e916e Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 2 Jan 2014 16:56:39 -0600 Subject: [PATCH 1651/2207] remove DomUtil.getViewportOffset as changelog indicates it has been removed. --- reference.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/reference.html b/reference.html index 2f7c14ac303..701e3835623 100644 --- a/reference.html +++ b/reference.html @@ -5663,14 +5663,6 @@

      Methods

      String Returns the value for a certain style attribute on an element, including computed values or values set through CSS. - - getViewportOffset( - <HTMLElement> el ) - - - Point - Returns the offset to the viewport for the requested element. - create( <String> tagName, From 016d56568d7cae64cf184cedfce3db934b37c8f4 Mon Sep 17 00:00:00 2001 From: danzel Date: Wed, 29 Jan 2014 11:41:08 +1300 Subject: [PATCH 1652/2207] Documentation for oldLatlng in marker move event. refs #2412 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 701e3835623..ab04526d50b 100644 --- a/reference.html +++ b/reference.html @@ -1443,7 +1443,7 @@

      Events

      move Event - Fired when the marker is moved via setLatLng. New coordinate include in event arguments. + Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatlng, latlng. add From f14f4070ec486211bc716a203d0af8f2338395eb Mon Sep 17 00:00:00 2001 From: danzel Date: Wed, 29 Jan 2014 14:52:41 +1300 Subject: [PATCH 1653/2207] oldLatLng --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index ab04526d50b..8340b1149c8 100644 --- a/reference.html +++ b/reference.html @@ -1443,7 +1443,7 @@

      Events

      move Event - Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatlng, latlng. + Fired when the marker is moved via setLatLng. Old and new coordinates are included in event arguments as oldLatLng, latlng. add From ae4e53fc996a6809fba2575b0d314a4b0bbd2b64 Mon Sep 17 00:00:00 2001 From: Andrey Geonya Date: Wed, 5 Feb 2014 19:41:23 +0200 Subject: [PATCH 1654/2207] Update reference.html --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 8340b1149c8..0b03b2fbc23 100644 --- a/reference.html +++ b/reference.html @@ -5915,7 +5915,7 @@

      Events

      dragend - Event + DragEndEvent Fired when the dragging ends. From f4250f12e8ca8df41ce5f0e6eafff9b6f2e464d1 Mon Sep 17 00:00:00 2001 From: mtmail Date: Sat, 8 Mar 2014 13:34:06 +0100 Subject: [PATCH 1655/2207] Update reference related to touchZoom:center ( using the correct gh-pages-master branch now) Documenting the accepted pull request https://github.com/Leaflet/Leaflet/pull/2527 --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 0b03b2fbc23..df362abaf1f 100644 --- a/reference.html +++ b/reference.html @@ -235,7 +235,7 @@

      Interaction Options

      touchZoom Boolean true - Whether the map can be zoomed by touch-dragging with two fingers. + Whether the map can be zoomed by touch-dragging with two fingers. If passed 'center', it will zoom to the center of the view regardless of where the touch events (fingers) were. scrollWheelZoom From 02f28b9160f4acc7be19d89c1af5d6a61c0af4e6 Mon Sep 17 00:00:00 2001 From: bennlich Date: Tue, 22 Apr 2014 22:59:33 -0700 Subject: [PATCH 1656/2207] Updated reference for crossOrigin option --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index df362abaf1f..b79b32d132c 100644 --- a/reference.html +++ b/reference.html @@ -1943,6 +1943,12 @@

      Options

      LatLngBounds null When this option is set, the TileLayer only loads tiles that are in the given geographical bounds. + + + crossOrigin + Boolean + false + If true, all tiles will have their crossOrigin attribute set to ''. This is needed if you want to access tile pixel data. From f5b85f05f13c200badd4db589d1ef0ea16666fab Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 17:08:51 +0300 Subject: [PATCH 1657/2207] #2501, wheelDebounceTime option documented --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index b79b32d132c..c18f6469235 100644 --- a/reference.html +++ b/reference.html @@ -243,6 +243,12 @@

      Interaction Options

      true Whether the map can be zoomed by using the mouse wheel. If passed 'center', it will zoom to the center of the view regardless of where the mouse was. + + wheelDebounceTime + Number + 40 + Limits the rate at which a wheel can fire (in milliseconds). By default user can't zoom via wheel more often than once per 40 ms. + doubleClickZoom Boolean From bc63eb6052d8cd4c6377acc7c2ba6052e6dea1db Mon Sep 17 00:00:00 2001 From: AndreyGeonya Date: Tue, 5 Aug 2014 18:16:11 +0300 Subject: [PATCH 1658/2207] this commit fixes #2499 documentation --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index c18f6469235..1239091f338 100644 --- a/reference.html +++ b/reference.html @@ -1336,7 +1336,7 @@

      Options

      Icon class to use for rendering the marker. See Icon documentation for details on how to customize the marker icon. Set to new L.Icon.Default() by default. - clickable + interactive Boolean true If false, the marker will not emit mouse events and will act as a part of the underlying map. @@ -2404,7 +2404,7 @@

      Options

      A string that defines shape to be used at the corners of the stroke. - clickable + interactive Boolean true If false, the vector will not emit mouse events and will act as a part of the underlying map. From a72321a30d36922163fbc5ce32600bb4af42ed80 Mon Sep 17 00:00:00 2001 From: Kevin DeLoach Date: Tue, 5 Aug 2014 14:01:23 -0400 Subject: [PATCH 1659/2207] Add documentation for WMS TileLayer uppercase option. --- reference.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.html b/reference.html index 1239091f338..3a765dc9a31 100644 --- a/reference.html +++ b/reference.html @@ -2137,6 +2137,12 @@

      Options

      null Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means. + + uppercase + Boolean + false + If true, WMS request parameter keys will be uppercase. +

      Methods

      From 2bab64fde4803463bf2fee9f6f86d1851edcdc25 Mon Sep 17 00:00:00 2001 From: bennlich Date: Mon, 29 Sep 2014 12:29:51 -0700 Subject: [PATCH 1660/2207] Removed documented url property of TileEvent --- reference.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reference.html b/reference.html index 3a765dc9a31..d09056e6792 100644 --- a/reference.html +++ b/reference.html @@ -4927,11 +4927,6 @@

      TileEvent

      HTMLElement The tile element (image). - - url - String - The source URL of the tile. -

      ResizeEvent

      From 645915e755863324ecf3ffd2a64aca04d6236263 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 21 Dec 2014 07:52:37 -0800 Subject: [PATCH 1661/2207] add nav links and headers --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index d09056e6792..5d4138bdc0e 100644 --- a/reference.html +++ b/reference.html @@ -88,6 +88,8 @@

      Events

      Utility

      • Class
      • +
      • Evented
      • +
      • Layer
      • Browser
      • Util
      • Transformation
      • @@ -5171,6 +5173,9 @@

        Constructor Hooks

        MyClass.addInitHook('methodName', arg1, arg2, …);
        +

        + +

        Browser

        From 66f6c80a37371a3b21f6fc8423c9726a793672dc Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 21 Dec 2014 08:44:24 -0800 Subject: [PATCH 1662/2207] L.Evented docs --- reference.html | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 5d4138bdc0e..4fc7b330785 100644 --- a/reference.html +++ b/reference.html @@ -5128,7 +5128,7 @@

        Options

        Includes

        -

        includes is a special class property that merges all specified objects into the class (such objects are called mixins). A good example of this is L.Mixin.Events that event-related methods like on, off and fire to the class.

        +

        includes is a special class property that merges all specified objects into the class (such objects are called mixins).

         var MyMixin = {
         	foo: function () { ... },
        @@ -5173,9 +5173,35 @@ 

        Constructor Hooks

        MyClass.addInitHook('methodName', arg1, arg2, …);
        -

        +

        Evented

        -

        +

        When creating a plguin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-releated methods like on, off and fire

        + +
        MyEventedClass = L.Evented.extend({
        +	fire: function(){
        +		this.fire('custom', {
        +			// you can attach optional data to an event as an object
        +		});
        +	}
        +});
        +
        +var myEvents = new MyEventedClass();
        +
        +myEvents.on('custom', function(e){
        +	// e.type will  be 'custom'
        +	// anything else you passed in the
        +});
        +
        +myEvents.fire();
        + +You can still use the old-style `L.Mixin.Events` for backward compatibility. + +
        // this class will include all event methods
        +MyEventedClass = L.Class.extend({
        +	includes: L.Mixin.Evvents
        +});
        + +

        Layer

        Browser

        From 6cd55b4c727b58eac324f1ae08c71bdadaae7596 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 21 Dec 2014 13:16:19 -0800 Subject: [PATCH 1663/2207] layer and evented docs --- reference-tpl.html | 17 ++++++++ reference.html | 100 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 103 insertions(+), 14 deletions(-) diff --git a/reference-tpl.html b/reference-tpl.html index 2e3cee70374..82033923ba1 100644 --- a/reference-tpl.html +++ b/reference-tpl.html @@ -70,3 +70,20 @@

        Options

        [description] + + + +

        Events

        + + + + + + + + + + + + +
        EventDataDescription
        [name][type][description]
        diff --git a/reference.html b/reference.html index 4fc7b330785..369827b9841 100644 --- a/reference.html +++ b/reference.html @@ -5175,7 +5175,7 @@

        Constructor Hooks

        Evented

        -

        When creating a plguin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-releated methods like on, off and fire

        +

        When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

        MyEventedClass = L.Evented.extend({
         	fire: function(){
        @@ -5198,11 +5198,80 @@ 

        Evented

        // this class will include all event methods
         MyEventedClass = L.Class.extend({
        -	includes: L.Mixin.Evvents
        +	includes: L.Mixin.Events
         });

        Layer

        +

        When implementing a custom layer the L.Layer class can be extended to implementing basic functionality that all layers need to share, these methods can be used when extending L.Layer when implementing custom layers.

        + +

        Options

        + + + + + + + + + + + + + + +
        OptionTypeDefault valueDescription
        paneString'overlayPane'By default the layer will be added to the maps overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
        + +

        Events

        + + + + + + + + + + + + + + + + + +
        EventDataDescription
        addEventFired after the layer is added to a map.
        removeEventFired after the layer is removed from a map.
        + +

        Methods

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        MethodReturnsDescription
        addTo(<Map> map)thisAdds the layer to the given map.
        removeFrom(<Map> map)thisRemoves the layer to the given map.
        remove()thisRemoves the layer from the map it is currently active on.
        getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
        +

        Browser

        A namespace with properties for browser/feature detection used by Leaflet internally.

        @@ -6040,7 +6109,7 @@

        IHandler

        ILayer

        -

        Represents an object attached to a particular location (or a set of locations) on a map. Implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

        +

        Represents an object attached to a particular location (or a set of locations) on a map. Extends the L.Layer base class and is implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

        Methods

        @@ -6070,6 +6139,8 @@

        Methods

        Implementing Custom Layers

        +

        Custom layers should extend the L.Layer base class. L.Layer provides convenience methods for your layer like addTo(map), removeFrom(map) and getPane().

        +

        The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

        Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

        @@ -6080,29 +6151,32 @@

        Custom Layer Example

        Here's how a custom layer implementation usually looks:

        -
        var MyCustomLayer = L.Class.extend({
        +
        var MyCustomLayer = L.Layer.extend({
         
         	initialize: function (latlng) {
         		// save position of the layer or any options from the constructor
         		this._latlng = latlng;
         	},
         
        -	onAdd: function (map) {
        -		this._map = map;
        +	// these events will be added and removed from the map with the layer
        +	getEvents: function(){
        +		return {
        +			viewreset: this._reset
        +		}
        +	},
         
        -		// create a DOM element and put it into one of the map panes
        +	onAdd: function (map) {
        +		// create a DOM element and put it into one of the map panes, by default the overlayPane
         		this._el = L.DomUtil.create('div', 'my-custom-layer leaflet-zoom-hide');
        -		map.getPanes().overlayPane.appendChild(this._el);
        +		this.getPane().appendChild(this._el);
         
         		// add a viewreset event listener for updating layer's position, do the latter
        -		map.on('viewreset', this._reset, this);
         		this._reset();
         	},
         
         	onRemove: function (map) {
         		// remove layer's DOM elements and listeners
        -		map.getPanes().overlayPane.removeChild(this._el);
        -		map.off('viewreset', this._reset, this);
        +		this.getPane().overlayPane.removeChild(this._el);
         	},
         
         	_reset: function () {
        @@ -6112,11 +6186,9 @@ 

        Custom Layer Example

        } }); -map.addLayer(new MyCustomLayer(latlng)); +var myLayer = new MyCustomLayer(latlng).addTo(map);
        - -

        IControl

        Represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls.

        From 5445a488e14f4dabbb5241af694a8bec812b1c35 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 26 Dec 2014 15:19:27 -0800 Subject: [PATCH 1664/2207] refactory into utilities and base classes --- reference.html | 1293 +++++++++++++++++++++++------------------------- 1 file changed, 631 insertions(+), 662 deletions(-) diff --git a/reference.html b/reference.html index 369827b9841..94bf9e5ff7f 100644 --- a/reference.html +++ b/reference.html @@ -72,7 +72,6 @@

        Basic Types

      Controls

      Utility

      -

      Interfaces

      +

      Base Classes

      Misc

      @@ -188,7 +186,7 @@

      Map State Options

      layers - ILayer[] + ILayer[] null Layers that will be added to the map initially. @@ -212,7 +210,7 @@

      Map State Options

      crs - CRS + CRS L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means. @@ -807,7 +805,7 @@

      Methods for Layers and Controls

      addLayer( - <ILayer> layer, + <ILayer> layer this @@ -815,7 +813,7 @@

      Methods for Layers and Controls

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -823,7 +821,7 @@

      Methods for Layers and Controls

      hasLayer( - <ILayer> layer ) + <ILayer> layer ) Boolean @@ -869,7 +867,7 @@

      Methods for Layers and Controls

      addControl( - <IControl> control ) + <IControl> control ) this @@ -877,7 +875,7 @@

      Methods for Layers and Controls

      removeControl( - <IControl> control ) + <IControl> control ) this @@ -1188,7 +1186,7 @@

      fitBounds options

      Properties

      -

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      +

      Map properties include interaction handlers that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging or touch zoom (see IHandler methods). Example:

      map.doubleClickZoom.disable();
      @@ -1204,37 +1202,37 @@

      Properties

      dragging - IHandler + IHandler Map dragging handler (by both mouse and touch). touchZoom - IHandler + IHandler Touch zoom handler. doubleClickZoom - IHandler + IHandler Double click zoom handler. scrollWheelZoom - IHandler + IHandler Scroll wheel zoom handler. boxZoom - IHandler + IHandler Box (shift-drag with mouse) zoom handler. keyboard - IHandler + IHandler Keyboard navigation handler. tap - IHandler + IHandler Mobile touch hacks (quick tap and touch hold) handler. @@ -1585,7 +1583,7 @@

      Methods

      Interaction handlers

      -

      Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

      +

      Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see IHandler methods). Example:

      marker.dragging.disable();
      @@ -1597,7 +1595,7 @@

      Interaction handlers

      dragging - IHandler + IHandler Marker dragging handler (by both mouse and touch). @@ -1629,7 +1627,7 @@

      Creation

      L.popup( <Popup options> options?, - <ILayer> source? ) + <ILayer> source? ) @@ -1792,7 +1790,7 @@

      Methods

      TileLayer

      -

      Used to load and display tile layers on the map, implements ILayer interface.

      +

      Used to load and display tile layers on the map, implements ILayer interface.

      Usage example

      @@ -2135,7 +2133,7 @@

      Options

      crs - CRS + CRS null Coordinate Reference System to use for the WMS requests, defaults to map CRS. Don't change this if you're not sure what it means. @@ -2239,7 +2237,7 @@

      Methods

      ImageOverlay

      -

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      +

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      Usage example

      @@ -3076,7 +3074,7 @@

      Methods

      LayerGroup

      -

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      +

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      L.layerGroup([marker1, marker2])
       	.addLayer(polyline)
      @@ -3090,8 +3088,8 @@ 

      Creation

      Description - L.layerGroup( - <ILayer[]> layers? ) + L.LayerGroup( + <ILayer[]> layers? ) @@ -3117,7 +3115,7 @@

      Methods

      addLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -3125,7 +3123,7 @@

      Methods

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this @@ -3141,7 +3139,7 @@

      Methods

      hasLayer( - <ILayer> layer ) + <ILayer> layer ) Boolean @@ -3152,7 +3150,7 @@

      Methods

      <String> id )
      - ILayer + ILayer Returns the layer with the given id. @@ -3188,7 +3186,7 @@

      Methods

      FeatureGroup

      -

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      +

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
      @@ -3205,7 +3203,7 @@ 

      Creation

      L.featureGroup( - <ILayer[]> layers? ) + <ILayer[]> layers? ) @@ -3367,7 +3365,7 @@

      Options

      onEachFeature( <GeoJSON> featureData, - <ILayer> layer ) + <ILayer> layer ) Function that will be called on each created feature layer. Useful for attaching events and popups to features. @@ -3375,7 +3373,7 @@

      Options

      filter( <GeoJSON> featureData, - <ILayer> layer ) + <ILayer> layer ) Function that will be used to decide whether to show a feature or not. @@ -3439,7 +3437,7 @@

      Static methods

      <Function> pointToLayer? )
      - ILayer + ILayer Creates a layer from a given GeoJSON feature. @@ -4169,122 +4167,6 @@

      Options

      - - - -

      Control

      - -

      The base class for all Leaflet controls. Implements IControl interface. You can add controls to the map like this:

      - -
      control.addTo(map);
      -// the same as
      -map.addControl(control);
      - -

      Creation

      - - - - - - - - - - - - - -
      FactoryDescription
      L.control( - <Control options> options? ) - Creates a control with the given options.
      - -

      Options

      - - - - - - - - - - - - - -
      OptionTypeDefaultDescription
      positionString'topright'The initial position of the control (one of the map corners). See control positions.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setPosition( - <String> position ) - thisSets the position of the control. See control positions.
      getPosition()StringReturns the current position of the control.
      addTo( - <Map> map ) - thisAdds the control to the map.
      removeFrom( - <Map> map ) - thisRemoves the control from the map.
      getContainer()HTMLElementReturns the HTML container of the control.
      - -

      Control Positions

      - -

      Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.

      - - - - - - - - - - - - - - - - - - - - - - -
      PositionDescription
      'topleft'Top left of the map.
      'topright'Top right of the map.
      'bottomleft'Bottom left of the map.
      'bottomright'Bottom right of the map.
      - -

      Control.zoom

      A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its zoomControl option to false. Extends Control.

      @@ -4465,7 +4347,7 @@

      Methods

      addBaseLayer( - <ILayer> layer, + <ILayer> layer, <String> name ) this @@ -4473,7 +4355,7 @@

      Methods

      addOverlay( - <ILayer> layer, + <ILayer> layer, <String> name ) this @@ -4481,7 +4363,7 @@

      Methods

      removeLayer( - <ILayer> layer ) + <ILayer> layer ) this Remove the given layer from the control. @@ -4891,7 +4773,7 @@

      LayerEvent

      layer - ILayer + ILayer The layer that was added or removed. @@ -4906,7 +4788,7 @@

      LayersControlEvent

      layer - ILayer + ILayer The layer that was added or removed. @@ -4961,7 +4843,7 @@

      GeoJSON event

      layer - ILayer + ILayer The layer for the GeoJSON feature that is being added to the map. @@ -5014,384 +4896,127 @@

      DragEndEvent

      +

      Browser

      +

      A namespace with properties for browser/feature detection used by Leaflet internally.

      -

      Class

      - -

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      -

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      - -
      var MyClass = L.Class.extend({
      -	initialize: function (greeter) {
      -		this.greeter = greeter;
      -		// class constructor
      -	},
      -
      -	greet: function (name) {
      -		alert(this.greeter + ', ' + name)
      -	}
      -});
      -
      -// create instance of MyClass, passing "Hello" to the constructor
      -var a = new MyClass("Hello");
      -
      -// call greet method, alerting "Hello, World"
      -a.greet("World");
      -
      - -

      The initialize method is your class's constructor function, meaning that it gets called when you do new MyClass(...).

      - - -

      Class Factories

      - -

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      - -
      new L.Map('map'); // becomes:
      -L.map('map');
      - -

      The factories are implemented very easily, and you can do this for your own classes:

      +
      if (L.Browser.ie6) {
      +	alert('Upgrade your browser, dude!');
      +}
      -
      L.map = function (id, options) {
      -	return new L.Map(id, options);
      -};
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      propertytypedescription
      ieBooleantrue for all Internet Explorer versions.
      ie6Booleantrue for Internet Explorer 6.
      ie7Booleantrue for Internet Explorer 7.
      webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
      webkit3dBooleantrue for webkit-based browsers that support CSS 3D transformations.
      androidBooleantrue for Android mobile browser.
      android23Booleantrue for old Android stock browsers (2 and 3).
      mobileBooleantrue for modern mobile browsers (including iOS Safari and different Android browsers).
      mobileWebkitBooleantrue for mobile webkit-based browsers.
      mobileOperaBooleantrue for mobile Opera.
      touchBooleantrue for all browsers on touch devices.
      msTouchBooleantrue for browsers with Microsoft touch model (e.g. IE10).
      retinaBooleantrue for devices with Retina screens.
      -

      Inheritance

      +

      Util

      -

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      +

      Various utility functions, used by Leaflet internally.

      -
      var MyChildClass = MyClass.extend({
      -	// ... new properties and methods
      -});
      +

      Methods

      -

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      + + + + + + + + -
      var a = new MyChildClass();
      -a instanceof MyChildClass; // true
      -a instanceof MyClass; // true
      -
      + + + + + -

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      + -
      var MyChildClass = MyClass.extend({
      -	initialize: function () {
      -		MyClass.prototype.initialize.call(this, "Yo");
      -	},
      -
      -	greet: function (name) {
      -		MyClass.prototype.greet.call(this, 'bro ' + name + '!');
      -	}
      -});
      -
      -var a = new MyChildClass();
      -a.greet('Jason'); // alerts "Yo, bro Jason!"
      - -

      Options

      - -

      options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

      - -
      var MyClass = L.Class.extend({
      -	options: {
      -		myOption1: 'foo',
      -		myOption2: 'bar'
      -	}
      -});
      -
      -var MyChildClass = MyClass.extend({
      -	options: {
      -		myOption1: 'baz',
      -		myOption3: 5
      -	}
      -});
      -
      -var a = new MyChildClass();
      -a.options.myOption1; // 'baz'
      -a.options.myOption2; // 'bar'
      -a.options.myOption3; // 5
      - -

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defaults defined in the class:

      - -
      var MyClass = L.Class.extend({
      -	options: {
      -		foo: 'bar',
      -		bla: 5
      -	},
      -
      -	initialize: function (options) {
      -		L.Util.setOptions(this, options);
      -		...
      -	}
      -});
      -
      -var a = new MyClass({bla: 10});
      -a.options; // {foo: 'bar', bla: 10}
      - -

      Includes

      - -

      includes is a special class property that merges all specified objects into the class (such objects are called mixins). - -

       var MyMixin = {
      -	foo: function () { ... },
      -	bar: 5
      -};
      -
      -var MyClass = L.Class.extend({
      -	includes: MyMixin
      -});
      -
      -var a = new MyClass();
      -a.foo();
      - -

      You can also do such includes in runtime with the include method:

      - -
      MyClass.include(MyMixin);
      - -

      Statics

      - -

      statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

      - -
      var MyClass = L.Class.extend({
      -	statics: {
      -		FOO: 'bar',
      -		BLA: 5
      -	}
      -});
      -
      -MyClass.FOO; // 'bar'
      - - -

      Constructor Hooks

      - -

      If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

      - -
      MyClass.addInitHook(function () {
      -	// ... do something in constructor additionally
      -	// e.g. add event listeners, set custom properties etc.
      -});
      - -

      You can also use the following shortcut when you just need to make one additional method call:

      - -
      MyClass.addInitHook('methodName', arg1, arg2, …);
      - -

      Evented

      - -

      When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

      - -
      MyEventedClass = L.Evented.extend({
      -	fire: function(){
      -		this.fire('custom', {
      -			// you can attach optional data to an event as an object
      -		});
      -	}
      -});
      -
      -var myEvents = new MyEventedClass();
      -
      -myEvents.on('custom', function(e){
      -	// e.type will  be 'custom'
      -	// anything else you passed in the
      -});
      -
      -myEvents.fire();
      - -You can still use the old-style `L.Mixin.Events` for backward compatibility. - -
      // this class will include all event methods
      -MyEventedClass = L.Class.extend({
      -	includes: L.Mixin.Events
      -});
      - -

      Layer

      - -

      When implementing a custom layer the L.Layer class can be extended to implementing basic functionality that all layers need to share, these methods can be used when extending L.Layer when implementing custom layers.

      - -

      Options

      - -
      MethodReturnsDescription
      extend( + <Object> dest, + <Object> src?.. ) + ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
      bind( + <Function> fn, + <Object> obj ) + Function
      - - - - - - - - - - - - -
      OptionTypeDefault valueDescription
      paneString'overlayPane'By default the layer will be added to the maps overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
      - -

      Events

      - - - - - - - - - - - - - - - - - -
      EventDataDescription
      addEventFired after the layer is added to a map.
      removeEventFired after the layer is removed from a map.
      - -

      Methods

      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      addTo(<Map> map)thisAdds the layer to the given map.
      removeFrom(<Map> map)thisRemoves the layer to the given map.
      remove()thisRemoves the layer from the map it is currently active on.
      getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
      - -

      Browser

      - -

      A namespace with properties for browser/feature detection used by Leaflet internally.

      - -
      if (L.Browser.ie6) {
      -	alert('Upgrade your browser, dude!');
      -}
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      propertytypedescription
      ieBooleantrue for all Internet Explorer versions.
      ie6Booleantrue for Internet Explorer 6.
      ie7Booleantrue for Internet Explorer 7.
      webkitBooleantrue for webkit-based browsers like Chrome and Safari (including mobile versions).
      webkit3dBooleantrue for webkit-based browsers that support CSS 3D transformations.
      androidBooleantrue for Android mobile browser.
      android23Booleantrue for old Android stock browsers (2 and 3).
      mobileBooleantrue for modern mobile browsers (including iOS Safari and different Android browsers).
      mobileWebkitBooleantrue for mobile webkit-based browsers.
      mobileOperaBooleantrue for mobile Opera.
      touchBooleantrue for all browsers on touch devices.
      msTouchBooleantrue for browsers with Microsoft touch model (e.g. IE10).
      retinaBooleantrue for devices with Retina screens.
      - - -

      Util

      - -

      Various utility functions, used by Leaflet internally.

      - -

      Methods

      - - - - - - - - - - - - - - - - - @@ -5997,156 +5622,311 @@

      Creation

      <HTMLElement> dragHandle? ) - - -
      MethodReturnsDescription
      extend( - <Object> dest, - <Object> src?.. ) - ObjectMerges the properties of the src object (or multiple objects) into dest object and returns the latter. Has an L.extend shortcut.
      bind( - <Function> fn, - <Object> obj ) - Function Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind).
      Creates a Draggable object for moving the given element when you start dragging the dragHandle element (equals the element itself by default).
      + Creates a Draggable object for moving the given element when you start dragging the dragHandle element (equals the element itself by default). + + + +

      Events

      + +

      You can subscribe to the following events using these methods.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      EventDataDescription
      dragstartEventFired when the dragging starts.
      predragEventFired continuously during dragging before each corresponding update of the element position.
      dragEventFired continuously during dragging.
      dragendDragEndEventFired when the dragging ends.
      + +

      Methods

      + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      enable()-Enables the dragging ability.
      disable()-Disables the dragging ability.
      + + + +

      Class

      + +

      L.Class powers the OOP facilities of Leaflet and is used to create almost all of the Leaflet classes documented here.

      +

      In addition to implementing a simple classical inheritance model, it introduces several special properties for convenient code organization — options, includes and statics.

      + +
      var MyClass = L.Class.extend({
      +	initialize: function (greeter) {
      +		this.greeter = greeter;
      +		// class constructor
      +	},
      +
      +	greet: function (name) {
      +		alert(this.greeter + ', ' + name)
      +	}
      +});
      +
      +// create instance of MyClass, passing "Hello" to the constructor
      +var a = new MyClass("Hello");
      +
      +// call greet method, alerting "Hello, World"
      +a.greet("World");
      +
      + + +

      Class Factories

      + +

      You may have noticed that Leaflet objects are created without using the new keyword. This is achieved by complementing each class with a lowercase factory method:

      + +
      new L.Map('map'); // becomes:
      +L.map('map');
      + +

      The factories are implemented very easily, and you can do this for your own classes:

      + +
      L.map = function (id, options) {
      +	return new L.Map(id, options);
      +};
      + + +

      Inheritance

      + +

      You use L.Class.extend to define new classes, but you can use the same method on any class to inherit from it:

      + +
      var MyChildClass = MyClass.extend({
      +	// ... new properties and methods
      +});
      + +

      This will create a class that inherits all methods and properties of the parent class (through a proper prototype chain), adding or overriding the ones you pass to extend. It will also properly react to instanceof:

      + +
      var a = new MyChildClass();
      +a instanceof MyChildClass; // true
      +a instanceof MyClass; // true
      +
      + +

      You can call parent methods (including constructor) from corresponding child ones (as you do with super calls in other languages) by accessing parent class prototype and using JavaScript's call or apply:

      + +
      var MyChildClass = MyClass.extend({
      +	initialize: function () {
      +		MyClass.prototype.initialize.call("Yo");
      +	},
      +
      +	greet: function (name) {
      +		MyClass.prototype.greet.call(this, 'bro ' + name + '!');
      +	}
      +});
      +
      +var a = new MyChildClass();
      +a.greet('Jason'); // alerts "Yo, bro Jason!"
      + +

      Options

      + +

      options is a special property that unlike other objects that you pass to extend will be merged with the parent one instead of overriding it completely, which makes managing configuration of objects and default values convenient:

      + +
      var MyClass = L.Class.extend({
      +	options: {
      +		myOption1: 'foo',
      +		myOption2: 'bar'
      +	}
      +});
      +
      +var MyChildClass = L.Class.extend({
      +	options: {
      +		myOption1: 'baz',
      +		myOption3: 5
      +	}
      +});
      +
      +var a = new MyChildClass();
      +a.options.myOption1; // 'baz'
      +a.options.myOption2; // 'bar'
      +a.options.myOption3; // 5
      + +

      There's also L.Util.setOptions, a method for conveniently merging options passed to constructor with the defauls defines in the class:

      + +
      var MyClass = L.Class.extend({
      +	options: {
      +		foo: 'bar',
      +		bla: 5
      +	},
      +
      +	initialize: function (options) {
      +		L.Util.setOptions(this, options);
      +		...
      +	}
      +});
      +
      +var a = new MyClass({bla: 10});
      +a.options; // {foo: 'bar', bla: 10}
      + +

      Includes

      + +

      includes is a special class property that merges all specified objects into the class (such objects are called mixins). + +

       var MyMixin = {
      +	foo: function () { ... },
      +	bar: 5
      +};
      +
      +var MyClass = L.Class.extend({
      +	includes: MyMixin
      +});
      +
      +var a = new MyClass();
      +a.foo();
      + +

      You can also do such includes in runtime with the include method:

      + +
      MyClass.include(MyMixin);
      + +

      Statics

      + +

      statics is just a convenience property that injects specified object properties as the static properties of the class, useful for defining constants:

      + +
      var MyClass = L.Class.extend({
      +	statics: {
      +		FOO: 'bar',
      +		BLA: 5
      +	}
      +});
      +
      +MyClass.FOO; // 'bar'
      + + +

      Constructor Hooks

      + +

      If you're a plugin developer, you often need to add additional initialization code to existing classes (e.g. editing hooks for L.Polyline). Leaflet comes with a way to do it easily using the addInitHook method:

      + +
      MyClass.addInitHook(function () {
      +	// ... do something in constructor additionally
      +	// e.g. add event listeners, set custom properties etc.
      +});
      + +

      You can also use the following shortcut when you just need to make one additional method call:

      -

      Events

      +
      MyClass.addInitHook('methodName', arg1, arg2, …);
      -

      You can subscribe to the following events using these methods.

      +

      Evented

      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventDataDescription
      dragstartEventFired when the dragging starts.
      predragEventFired continuously during dragging before each corresponding update of the element position.
      dragEventFired continuously during dragging.
      dragendDragEndEventFired when the dragging ends.
      +

      When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

      -

      Methods

      +
      MyEventedClass = L.Evented.extend({
      +	fire: function(){
      +		this.fire('custom', {
      +			// you can attach optional data to an event as an object
      +		});
      +	}
      +});
       
      -
      -	
      -		
      -		
      -		
      -	
      -	
      -		
      -		
      -		
      -	
      -	
      -		
      -		
      -		
      -	
      -
      MethodReturnsDescription
      enable()-Enables the dragging ability.
      disable()-Disables the dragging ability.
      +var myEvents = new MyEventedClass(); - +myEvents.fire();
      +You can still use the old-style `L.Mixin.Events` for backward compatibility. +
      // this class will include all event methods
      +MyEventedClass = L.Class.extend({
      +	includes: L.Mixin.Events
      +});
      -

      IHandler

      -

      An interface implemented by interaction handlers.

      +

      Layer

      - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      +

      The base class for all Leaflet layers that impliments basic shared methods and functionality. Can be extended to create custom layers by extending L.Layer and implimenting the onAdd and onRemove methods.

      + +

      Implementing Custom Layers

      +

      Custom layers should extend the L.Layer base class. L.Layer provides convenience methods for your layer like addTo(map), removeFrom(map) and getPane().

      + +

      The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

      -

      ILayer

      +

      Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

      -

      Represents an object attached to a particular location (or a set of locations) on a map. Extends the L.Layer base class and is implemented by tile layers, markers, popups, image overlays, vector layers and layer groups.

      +

      Another thing to note is that you'll usually need to add leaflet-zoom-hide class to the DOM elements you create for the layer so that it hides during zoom animation. Implementing zoom animation for custom layers is a complex topic and will be documented separately in future, but meanwhile you can take a look at how it's done for Leaflet layers (e.g. ImageOverlay) in the source.

      Methods

      - +

      Every layer should extend from L.Layer and impliment the following methods:

      + +
      - - - + + - - - - + + + + + + + +
      Method Returns Description
      onAdd( - <Map> map ) - -onAdd(<Map> map)this Should contain code that creates DOM elements for the overlay, adds them to map panes where they should belong and puts listeners on relevant map events. Called on map.addLayer(layer).
      onRemove( - <Map> map ) - -Should contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).onRemove(<Map> map)thisShould contain all clean up code that removes the overlay's elements from the DOM and removes listeners previously added in onAdd. Called on map.removeLayer(layer).
      getEvents()ObjectThis optional method should return an object like { viewreset: this._reset }for addEventListener. These events will be automatically added and removed from the map with your layer.
      -

      Implementing Custom Layers

      - -

      Custom layers should extend the L.Layer base class. L.Layer provides convenience methods for your layer like addTo(map), removeFrom(map) and getPane().

      - -

      The most important things know about when implementing custom layers are Map viewreset event and latLngToLayerPoint method. viewreset is fired when the map needs to reposition its layers (e.g. on zoom), and latLngToLayerPoint is used to get coordinates for the layer's new position.

      - -

      Another event often used in layer implementations is moveend which fires after any movement of the map (panning, zooming, etc.).

      - -

      Another thing to note is that you'll usually need to add leaflet-zoom-hide class to the DOM elements you create for the layer so that it hides during zoom animation. Implementing zoom animation for custom layers is a complex topic and will be documented separately in future, but meanwhile you can take a look at how it's done for Leaflet layers (e.g. ImageOverlay) in the source.

      -

      Custom Layer Example

      Here's how a custom layer implementation usually looks:

      @@ -6176,7 +5956,7 @@

      Custom Layer Example

      onRemove: function (map) { // remove layer's DOM elements and listeners - this.getPane().overlayPane.removeChild(this._el); + this.getPane().removeChild(this._el); }, _reset: function () { @@ -6189,9 +5969,82 @@

      Custom Layer Example

      var myLayer = new MyCustomLayer(latlng).addTo(map);
      -

      IControl

      +

      Inherited Options

      + +

      Classes extending from L.Layer will also inherit the following options:

      + + + + + + + + + + + + + + +
      OptionTypeDefault valueDescription
      paneString'overlayPane'By default the layer will be added to the maps overlay pane. Overriding this option will cause the layer to be placed on another pane by default.
      + +

      Inherited Events

      + +

      Classes extending from L.Layer will also fire the following events:

      + + + + + + + + + + + + + + + + + +
      EventDataDescription
      addEventFired after the layer is added to a map.
      removeEventFired after the layer is removed from a map.
      + +

      Inherited Methods

      + +

      Classes extending from L.Layer will also inherit the following methods:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      addTo(<Map> map)thisAdds the layer to the given map.
      removeFrom(<Map> map)thisRemoves the layer to the given map.
      remove()thisRemoves the layer from the map it is currently active on.
      getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
      + +

      Control

      -

      Represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls.

      +

      Controls represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls. Can be used to create custom controls by extending L.Control and implimenting the onAdd and onRemove methods.

      Methods

      @@ -6255,16 +6108,132 @@

      Custom Control Example

      map.addControl(new MyControl('bar', {position: 'bottomleft'}));
      +

      Options

      + +

      Classes extending from L.Control will also inherit the following options:

      + + + + + + + + + + + + + + +
      OptionTypeDefaultDescription
      positionString'topright'The initial position of the control (one of the map corners). See control positions.
      + +

      Inherited Methods

      + +

      Classes extending from L.Control will also inherit the following methods:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      setPosition( + <String> position ) + thisSets the position of the control. See control positions.
      getPosition()StringReturns the current position of the control.
      addTo( + <Map> map ) + thisAdds the control to the map.
      removeFrom( + <Map> map ) + thisRemoves the control from the map.
      getContainer()HTMLElementReturns the HTML container of the control.
      + +

      Control Positions

      + +

      Control positions (map corner to put a control to) are set using strings. Margins between controls and the map border are set with CSS, so that you can easily override them.

      + + + + + + + + + + + + + + + + + + + + + +
      PositionDescription
      'topleft'Top left of the map.
      'topright'Top right of the map.
      'bottomleft'Bottom left of the map.
      'bottomright'Bottom right of the map.
      + + +

      Handler

      +

      An interface implemented by interaction handlers.

      + + + + + + + + + + + + + + + + + + + + + +
      MethodReturnsDescription
      enable()-Enables the handler.
      disable()-Disables the handler.
      enabled()BooleanReturns true if the handler is enabled.
      -

      IProjection

      +

      Projection

      An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See Map projection.

      Methods

      - +
      @@ -6317,13 +6286,13 @@

      Defined Projections

      -

      ICRS

      +

      CRS

      Defines coordinate reference systems for projecting geographical points into pixel (screen) coordinates and back (and to coordinates in other units for WMS services). See Spatial reference system.

      Methods

      -
      Method Returns
      +
      @@ -6375,7 +6344,7 @@

      Methods

      Properties

      -
      Method Returns
      +
      @@ -6384,7 +6353,7 @@

      Properties

      - + From f25f97a381729d9220843f59e07eda038261bd88 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 26 Dec 2014 15:25:11 -0800 Subject: [PATCH 1665/2207] remove interface references --- reference.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reference.html b/reference.html index 94bf9e5ff7f..a8ece6e6960 100644 --- a/reference.html +++ b/reference.html @@ -1790,7 +1790,7 @@

      Methods

      TileLayer

      -

      Used to load and display tile layers on the map, implements ILayer interface.

      +

      Used to load and display tile layers on the map. Extends Layer.

      Usage example

      @@ -2237,7 +2237,7 @@

      Methods

      ImageOverlay

      -

      Used to load and display a single image over specific bounds of the map, implements ILayer interface.

      +

      Used to load and display a single image over specific bounds of the map. Extends Layer.

      Usage example

      @@ -3074,7 +3074,7 @@

      Methods

      LayerGroup

      -

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Implements ILayer interface.

      +

      Used to group several layers and handle them as one. If you add it to the map, any layers added or removed from the group will be added/removed on the map as well. Extends Layer.

      L.layerGroup([marker1, marker2])
       	.addLayer(polyline)
      @@ -3186,7 +3186,7 @@ 

      Methods

      FeatureGroup

      -

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Implements ILayer interface.

      +

      Extended layerGroup that also has mouse events (propagated from members of the group) and a shared bindPopup method. Extends Layer.

      L.featureGroup([marker1, marker2, polyline])
       	.bindPopup('Hello world!')
      @@ -6202,7 +6202,7 @@ 

      Control Positions

      Handler

      -

      An interface implemented by interaction handlers.

      +

      Implemented by map interaction handlers.

      Property Type
      projectionIProjectionIProjection Projection that this CRS uses.
      From 68308085fd7b32ba8ffabf7834d991fb187f7013 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 12:48:46 +0200 Subject: [PATCH 1666/2207] impliment -> implement typo fixes --- reference.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index a8ece6e6960..a38465d2f82 100644 --- a/reference.html +++ b/reference.html @@ -5888,7 +5888,7 @@

      Evented

      Layer

      -

      The base class for all Leaflet layers that impliments basic shared methods and functionality. Can be extended to create custom layers by extending L.Layer and implimenting the onAdd and onRemove methods.

      +

      The base class for all Leaflet layers that implements basic shared methods and functionality. Can be extended to create custom layers by extending L.Layer and implementing the onAdd and onRemove methods.

      Implementing Custom Layers

      @@ -5902,7 +5902,7 @@

      Implementing Custom Layers

      Methods

      -

      Every layer should extend from L.Layer and impliment the following methods:

      +

      Every layer should extend from L.Layer and implement the following methods:

      @@ -6044,7 +6044,7 @@

      Inherited Methods

      Control

      -

      Controls represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls. Can be used to create custom controls by extending L.Control and implimenting the onAdd and onRemove methods.

      +

      Controls represents a UI element in one of the corners of the map. Implemented by zoom, attribution, scale and layers controls. Can be used to create custom controls by extending L.Control and implementing the onAdd and onRemove methods.

      Methods

      From 8ec0d3fdfc2ad3728ac7f089525cef0702d9c2d8 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:18:59 -0800 Subject: [PATCH 1667/2207] remove multi shapes from ref, examples for polygon+polyline --- reference.html | 190 ++++++++++++++++--------------------------------- 1 file changed, 63 insertions(+), 127 deletions(-) diff --git a/reference.html b/reference.html index a38465d2f82..2e853a096df 100644 --- a/reference.html +++ b/reference.html @@ -46,9 +46,7 @@

      Vector Layers

      • Path
      • Polyline
      • -
      • MultiPolyline
      • Polygon
      • -
      • MultiPolygon
      • Rectangle
      • Circle
      • CircleMarker
      • @@ -2614,6 +2612,33 @@

        Polyline

        Usage example

        // create a red polyline from an array of LatLng points
        +var latlngs = [
        +  [-122.68, 45.51],
        +  [-122.43, 37.77],
        +  [-118.2, 34.04]
        +];
        +
        +var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
        +
        +// zoom the map to the polyline
        +map.fitBounds(polyline.getBounds());
        + +

        You can also pass a multi-dimensional array to represent a MultiPolyline shape.

        + +
        // create a red polyline from an arrays  of arrays of LatLng points
        +var latlngs = [
        +	[
        +	  [-122.68, 45.51],
        +	  [-122.43, 37.77],
        +	  [-118.2, 34.04]
        +	],
        +	[
        +	  [-73.91, 40.78],
        +	  [-87.62, 41.83],
        +	  [-96.72, 32.76]
        +	]
        +]
        +
         var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
         
         // zoom the map to the polyline
        @@ -2634,7 +2659,7 @@ 

        Creation

        -
      +
      Instantiates a polyline object given an array of geographical points and optionally an options object.Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a a Polyline with multiple separate lines (MultiPolyline) by passing an array that contains arrays of geographic points.
      @@ -2717,80 +2742,54 @@

      Methods

      +

      Polygon

      -

      MultiPolyline

      - -

      Extends FeatureGroup to allow creating multi-polylines (single layer that consists of several polylines that share styling/popup).

      - -

      Creation

      - - - - - - - - - - - +

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      - - -
      FactoryDescription
      L.multiPolyline( - <LatLng[][]> latlngs, - <Polyline options> options? ) - Instantiates a multi-polyline object given an array of arrays of geographical points (one for each individual polyline) and optionally an options object.
      +

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      +

      Usage example

      +
      // create a red polygon from an arrays of LatLng points
      +var latlngs = [
      +  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      +];
       
      -

      Methods

      +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); -

      MultiPolylines accept all Polyline methods but -have different behavior around their coordinate contents since they can contain -multiple line features:

      +// zoom the map to the polygon +map.fitBounds(polygon.getBounds());
      - - - - - - - - +

      You can also pass a array of arrays of latlngs, the first array represents the outer shape and the other arrays represent holes in the outer shape.

      - - - - - +
      // create a red polygon from an arrays of LatLng points
      +var latlngs = [
      +  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      +  [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      +];
       
      -		
      - - - - +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); - - - - - - - - -
      MethodReturnsDescription
      setLatLngs( - <LatLng[][]> latlngs ) - thisReplace all lines and their paths with the given array of arrays of - geographical points.
      getLatLngs()<LatLng[][]> latlngs - Returns an array of arrays of geographical points in each line.
      openPopup()thisOpens the popup previously bound by bindPopup.
      toGeoJSON()ObjectReturns a GeoJSON representation of the multipolyline (GeoJSON MultiLineString Feature).
      +// zoom the map to the polygon +map.fitBounds(polygon.getBounds());
      +

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      +
      // create a red polygon from an arrays of arrays of LatLng points
      +var latlngs = [
      +  [
      +    [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ],
      +    [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      +  ],
      +  [
      +    [ [-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38] ]
      +  ]
      +]
       
      -

      Polygon

      +var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); -

      A class for drawing polygon overlays on a map. Extends Polyline. Use Map#addLayer to add it to the map.

      +// zoom the map to the polygon +map.fitBounds(polygon.getBounds());
      -

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      Creation

      @@ -2807,7 +2806,7 @@

      Creation

      - Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. + Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a Polygon with multiple separate lines (MultiPolygon) by passing an array of Polygon coordinates. @@ -2829,69 +2828,6 @@

      Methods

      -

      MultiPolygon

      - -

      Extends FeatureGroup to allow creating multi-polygons (single layer that consists of several polygons that share styling/popup).

      - -

      Creation

      - - - - - - - - - - - - - -
      FactoryDescription
      L.multiPolygon( - <LatLng[][]> latlngs, - <Polyline options> options? ) - Instantiates a multi-polygon object given an array of latlngs arrays (one for each individual polygon) and optionally an options object (the same as for MultiPolyline).
      - -

      Methods

      - -

      MultiPolygons accept all Polyline methods but -have different behavior around their coordinate contents since they can contain -multiple polygon features:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      MethodReturnsDescription
      setLatLngs( - <LatLng[][]> latlngs ) - thisReplace all polygons and their paths with the given array of arrays of - geographical points.
      getLatLngs()<LatLng[][]> latlngs - Returns an array of arrays of geographical points in each polygon.
      openPopup()thisOpens the popup previously bound by bindPopup.
      toGeoJSON()ObjectReturns a GeoJSON representation of the multipolygon (GeoJSON MultiPolygon Feature).

      Rectangle

      From 4b0e4d7c5aa6f3c6201102ca817f54064d9ff980 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:23:26 -0800 Subject: [PATCH 1668/2207] update default path options --- reference.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reference.html b/reference.html index 2e853a096df..805436b2267 100644 --- a/reference.html +++ b/reference.html @@ -2350,19 +2350,19 @@

      Options

      color String - '#03f' + '#3388ff' Stroke color. weight Number - 5 + 3 Stroke width in pixels. opacity Number - 0.5 + 1 Stroke opacity. @@ -2398,13 +2398,13 @@

      Options

      lineCap String - null + 'round' A string that defines shape to be used at the end of the stroke. lineJoin String - null + 'round' A string that defines shape to be used at the corners of the stroke. @@ -2417,7 +2417,7 @@

      Options

      pointerEvents String null - Sets the pointer-events attribute on the path if SVG backend is used. + Sets the pointer-events attribute on the path if SVG renderer is used. className From ceed74ba5068014875ba19af720b3c6520b86f68 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:26:20 -0800 Subject: [PATCH 1669/2207] getCenter() docs --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index 805436b2267..f0c60f09c0c 100644 --- a/reference.html +++ b/reference.html @@ -2734,6 +2734,11 @@

      Methods

      LatLngBounds Returns the LatLngBounds of the polyline. + + getCenter() + LatLng + Returns the center (centroid) of the polyline. + toGeoJSON() Object From 98d83e5b921b3a96b023b1483c8cbd6f91de1f50 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:28:45 -0800 Subject: [PATCH 1670/2207] flip Circle/CircleMarker inheritance --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index f0c60f09c0c..a1cfc3a7b45 100644 --- a/reference.html +++ b/reference.html @@ -2890,7 +2890,7 @@

      Methods

      Circle

      -

      A class for drawing circle overlays on a map. Extends Path. Use Map#addLayer to add it to the map.

      +

      A class for drawing circle overlays on a map. Extends CircleMarker. Use Map#addLayer to add it to the map.

      L.circle([50.5, 30.5], 200).addTo(map);
      @@ -2959,7 +2959,7 @@

      Methods

      CircleMarker

      -

      A circle of a fixed size with radius specified in pixels. Extends Circle. Use Map#addLayer to add it to the map.

      +

      A circle of a fixed size with radius specified in pixels. Extends Path. Use Map#addLayer to add it to the map.

      Creation

      From d7c6788211015cd97727576d813d5a405aa68f25 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 22 Dec 2014 08:50:35 -0800 Subject: [PATCH 1671/2207] renderer docs and methods --- reference.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/reference.html b/reference.html index a1cfc3a7b45..f806a10353d 100644 --- a/reference.html +++ b/reference.html @@ -212,6 +212,12 @@

      Map State Options

      L.CRS.
      EPSG3857
      Coordinate Reference System to use. Don't change this if you're not sure what it means. + + renderer + Renderer + depends + The default method for drawing vector layers on the map. L.SVG or L.Canvas by default depending on browser support. +

      Interaction Options

      @@ -879,6 +885,13 @@

      Methods for Layers and Controls

      this Removes the given control from the map. + getRenderer( + <ILayer> layer) + + + Renderer + Returns the renderer for the given layer. + @@ -2413,6 +2426,12 @@

      Options

      true If false, the vector will not emit mouse events and will act as a part of the underlying map. + + renderer + Renderer + depends + L.SVG or L.Canvas by default depending on browser support. + pointerEvents String From 62de364d2edba35e36726a3ee680a0cc592f5e17 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 13:05:28 +0200 Subject: [PATCH 1672/2207] polygon/polyline docs fixes and cleanup --- reference.html | 73 ++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/reference.html b/reference.html index f806a10353d..9987207f749 100644 --- a/reference.html +++ b/reference.html @@ -2642,26 +2642,17 @@

      Usage example

      // zoom the map to the polyline map.fitBounds(polyline.getBounds());
      -

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      +

      You can also pass a multi-dimensional array to represent a MultiPolyline shape:

      -
      // create a red polyline from an arrays  of arrays of LatLng points
      +
      // create a red polyline from an array of arrays of LatLng points
       var latlngs = [
      -	[
      -	  [-122.68, 45.51],
      -	  [-122.43, 37.77],
      -	  [-118.2, 34.04]
      -	],
      -	[
      -	  [-73.91, 40.78],
      -	  [-87.62, 41.83],
      -	  [-96.72, 32.76]
      -	]
      -]
      -
      -var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);
      -
      -// zoom the map to the polyline
      -map.fitBounds(polyline.getBounds());
      + [[-122.68, 45.51], + [-122.43, 37.77], + [-118.2, 34.04]], + [[-73.91, 40.78], + [-87.62, 41.83], + [-96.72, 32.76]] +];

      Creation

      @@ -2678,7 +2669,7 @@

      Creation

      - Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a a Polyline with multiple separate lines (MultiPolyline) by passing an array that contains arrays of geographic points. + Instantiates a polyline object given an array of geographical points and optionally an options object. You can create a Polyline object with multiple separate lines (MultiPolyline) by passing an array of arrays of geographic points. @@ -2773,46 +2764,34 @@

      Polygon

      Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points.

      Usage example

      -
      // create a red polygon from an arrays of LatLng points
      -var latlngs = [
      -  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      -];
      +
      // create a red polygon from an array of LatLng points
      +var latlngs = [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]];
       
       var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
       
       // zoom the map to the polygon
       map.fitBounds(polygon.getBounds());
      -

      You can also pass a array of arrays of latlngs, the first array represents the outer shape and the other arrays represent holes in the outer shape.

      +

      You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape:

      -
      // create a red polygon from an arrays of LatLng points
      +
      
       var latlngs = [
      -  [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ]
      -  [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      -];
      -
      -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
      +  [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring
      +  [[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole
      +];
      -// zoom the map to the polygon -map.fitBounds(polygon.getBounds());
      +

      Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape.

      -

      You can also pass a multi-dimensional array to represent a MultiPolyline shape.

      - -
      // create a red polygon from an arrays of arrays of LatLng points
      +
      
       var latlngs = [
      -  [
      -    [ [-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41] ],
      -    [ [-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29] ]
      +  [ // first polygon
      +    [[-111.03, 41],[-111.04, 45],[-104.05, 45],[-104.05, 41]], // outer ring
      +    [[-108.58,37.29],[-108.58,40.71],[-102.50,40.71],[-102.50,37.29]] // hole
         ],
      -  [
      -    [ [-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38] ]
      +  [ // second polygon
      +    [[-109.05, 37],[-109.03, 41],[-102.05, 41],[-102.04, 37],[-109.05, 38]]
         ]
      -]
      -
      -var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map);
      -
      -// zoom the map to the polygon
      -map.fitBounds(polygon.getBounds());
      +];

      Creation

      @@ -2830,7 +2809,7 @@

      Creation

      - Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a Polygon with multiple separate lines (MultiPolygon) by passing an array of Polygon coordinates. + Instantiates a polygon object given an array of geographical points and optionally an options object (the same as for Polyline). You can also create a polygon with holes by passing an array of arrays of latlngs, with the first latlngs array representing the exterior ring while the remaining represent the holes inside. You can create a a Polygon with multiple separate shapes (MultiPolygon) by passing an array of Polygon coordinates. From 62860ca4148e33f2dcf48eb7ae3344c97a7f0b03 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Mon, 29 Dec 2014 09:49:56 -0800 Subject: [PATCH 1673/2207] more layer docs --- reference-tpl.html | 2 +- reference.html | 1178 +++++++++++++++++++++++++++----------------- 2 files changed, 721 insertions(+), 459 deletions(-) diff --git a/reference-tpl.html b/reference-tpl.html index 82033923ba1..8c789bf7015 100644 --- a/reference-tpl.html +++ b/reference-tpl.html @@ -45,7 +45,7 @@

      Methods

      Description - [method]( argument, argument ) + [method](<type> argument, <type> argument) [return-type] [description] diff --git a/reference.html b/reference.html index 9987207f749..b260d3137c0 100644 --- a/reference.html +++ b/reference.html @@ -39,7 +39,6 @@

      Raster Layers

      Vector Layers

      @@ -58,6 +57,7 @@

      Other Layers

    94. LayerGroup
    95. FeatureGroup
    96. GeoJSON
    97. +
    98. GridLayer
    99. Basic Types

        @@ -77,10 +77,11 @@

        Controls

      -

      Events

      +

      Shared Methods

      Utility

        @@ -113,6 +114,7 @@

        Base Classes

        Misc

          +
        • Event objects
        • global switches
        • noConflict
        • version
        • @@ -1008,6 +1010,20 @@

          Other Methods

          HTMLElement Returns the container element of the map. + + createPane( + <String> name, <HTMLElement> contianer? + ) + MapPane + Creates a pane with the given name. Created panes will be given a generated class based on the name like .leaflet-pane-name" + + + getPane( + <String> name + ) + MapPane + Returns the HTML element representing the named map pane. + getPanes() MapPanes @@ -1261,47 +1277,51 @@

          Properties

          Map Panes

          -

          An object literal (returned by map.getPanes) that contains different map panes that you can use to put your custom overlays in. The difference is mostly in zIndex order that such overlays get.

          +

          Panes are DOM elements used to control the ordering of layers on the map. You can access panes with map.getPane or map.getPanesmethods. New panes can be created with the map.createPane method.

          + +

          Every map has the following panes that differ only in zIndex.

          - + + + + - + - + + + - - - - - + +
          PropertyPane TypeZ Index Description
          mapPane HTMLElement'auto' Pane that contains all other map panes.
          tilePane HTMLElement2 Pane for tile layers.
          objectsPaneoverlayPane HTMLElementPane that contains all the panes except tile pane.4Pane for overlays like polylines and polygons.
          shadowPane HTMLElement5 Pane for overlay shadows (e.g. marker shadows).
          overlayPaneHTMLElementPane for overlays like polylines and polygons.
          markerPane HTMLElement6 Pane for marker icons.
          popupPane HTMLElement7 Pane for popups.
          @@ -1309,7 +1329,7 @@

          Map Panes

          Marker

          -

          Used to put markers on the map.

          +

          Used to put markers on the map. Extends Layer.

          L.marker([50.5, 30.5]).addTo(map);
          @@ -1400,6 +1420,18 @@

          Options

          250 The z-index offset used for the riseOnHover feature. + + pane + String + 'markerPane' + Map pane where the markers icon will be added. + + + shadowPane + String + 'shadowPane' + Map pane where the markers shadow will be added. +

          Events

          @@ -1486,20 +1518,14 @@

          Events

          Methods

          +

          In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          + - - - - - - @@ -1739,21 +1765,35 @@
          Method Returns Description
          addTo( - <Map> map ) - thisAdds the marker to the map.
          getLatLng() LatLng
          -

          Methods

          +

          Events

          - - + + - + + + + + + + + + +
          MethodReturnsEventData Description
          addTo( - <Map> map ) - addedPopupEventFired when the popup is added to the map.
          removedPopupEventFired when the popup is removed from the map.
          - this - Adds the popup to the map. +

          Methods

          + +

          In addition to shared layer methods like addTo() and remove() you can also use the following methods:

          + + + + + + + + + + + + @@ -2004,6 +2050,11 @@

          Events

          + + + + +
          MethodReturnsDescription
          openOn( @@ -1830,9 +1870,9 @@

          URL template

          A string of the following form:

          -
          'http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png'
          +
          'http://{s}.somedomain.com/blabla/{z}/{x}/{y}{r}.png'
          -

          {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates.

          +

          {s} means one of the available subdomains (used sequentially to help with browser parallel requests per domain limitation; subdomain values are specified in options; a, b or c by default, can be omitted), {z} — zoom level, {x} and {y} — tile coordinates. {r} can be used to add @2x to the URL to load retina tiles.

          You can use custom keys in the template, which will be evaluated from TileLayer options, like this:

          @@ -1931,6 +1971,12 @@

          Options

          null The explicit zIndex of the tile layer. Not set by default.
          updateIntervalNumber200Tiles will not update more then once every updateInterval.
          unloadInvisibleTiles Boolean TileEvent Fired when a tile is removed (e.g. when you have unloadInvisibleTiles on).
          tileerrorTileEventFired when there is an error loading a tile.

          Methods

          @@ -2175,77 +2226,6 @@

          Methods

          -

          TileLayer.Canvas

          - -

          Used to create Canvas-based tile layers where tiles get drawn on the browser side. Extends TileLayer.

          - -

          Usage example

          - -
          var canvasTiles = L.tileLayer.canvas();
          -
          -canvasTiles.drawTile = function(canvas, tilePoint, zoom) {
          -	var ctx = canvas.getContext('2d');
          -	// draw something on the tile canvas
          -}
          - -

          Creation

          - - - - - - - - - - - - -
          FactoryDescription
          L.tileLayer.canvas( - <TileLayer options> options? ) - Instantiates a Canvas tile layer object given an options object (optionally).
          - -

          Options

          - - - - - - - - - - - - - -
          OptionTypeDefaultDescription
          asyncBooleanfalseIndicates that tiles will be drawn asynchronously. tileDrawn method should be called for each tile after drawing completion.
          - -

          Methods

          - - - - - - - - - - - - - - - - - -
          MethodReturnsDescription
          drawTile( - <HTMLCanvasElement> canvas, - <Point> tilePoint, - <Number> zoom ) - thisYou need to define this method after creating the instance to draw tiles; canvas is the actual canvas tile on which you can draw, tilePoint represents the tile numbers, and zoom is the current zoom.
          tileDrawn( <HTMLCanvasElement> canvas )-If async option is defined, this function should be called for each tile after drawing completion. canvas is the same canvas element, that was passed to drawTile.
          - -

          ImageOverlay

          Used to load and display a single image over specific bounds of the map. Extends Layer.

          @@ -2344,7 +2324,7 @@

          Methods

          Path

          -

          An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. +

          An abstract class that contains options and constants shared between vector overlays (Polygon, Polyline, Circle). Do not use it directly. Extends Layer.

          Options

          @@ -2509,43 +2489,15 @@

          Events

          Methods

          + +

          In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + +
          Method Returns Description
          addTo( - <Map> map ) - thisAdds the layer to the map.
          bindPopup( - <String> html | <HTMLElement> el | <Popup> popup, - <Popup options> options? ) - thisBinds a popup with a particular HTML content to a click on this path.
          bindPopup( - <Popup> popup, - <Popup options> options? ) - thisBinds a given popup object to the path.
          unbindPopup()thisUnbinds the popup previously bound to the path with bindPopup.
          openPopup( <LatLng> latlng? ) @@ -2554,12 +2506,6 @@

          Methods

          this Opens the popup previously bound by the bindPopup method in the given point, or in one of the path's points if not specified.
          closePopup()thisCloses the path's bound popup if it is opened.
          setStyle( <Path options> object ) @@ -2700,7 +2646,7 @@

          Options

          Methods

          -

          You can use Path methods and additionally the following methods:

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          @@ -2815,7 +2761,7 @@

          Creation

          Methods

          -

          Polygon has the same options and methods as Polyline, with the following differences:

          +

          In addition to Path methods like redraw() and bringToFront(), Polyline mehtods like setLatLngs() and getLatLngs(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          @@ -2867,7 +2813,7 @@

          Creation

          Methods

          -

          You can use Path methods and additionally the following methods:

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          @@ -2914,6 +2860,8 @@

          Creation

          Methods

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          +
          @@ -2980,6 +2928,8 @@

          Creation

          Methods

          +

          In addition to Path methods like redraw() and bringToFront(), shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          +
          Method
          @@ -3153,8 +3103,6 @@

          Creation

          Methods

          -

          Has all layerGroup methods and additionally:

          -
          Method
          @@ -3400,130 +3348,338 @@

          Static methods

          Method
          +

          GridLayer

          +

          Generic class for handling a tiled grid of HTML elements. This is the base class for all tile layers and replaces TileLayer.Canvas.

          +

          GridLayer can be extended to create a tiled grid of HTML Elements like <canvas>, <img> or <div>.GridLayer will handle creating and animating these DOM elements for you.

          -

          LatLng

          +

          Synchronous usage example

          -

          Represents a geographical point with a certain latitude and longitude.

          -
          var latlng = L.latLng(50.5, 30.5);
          +

          To create a custom layer, extend GridLayer and impliment the createTile() method, which will be passed a Point object with the x, y, and z (zoom level) coordinates to draw your tile.

          -

          All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

          +
          var CanvasLayer = L.GridLayer.extend({
          +	createTile: function(coords){
          +		// create a <canvas> element for drawing
          +		var tile = L.DomUtil.create('canvas', 'leaflet-tile');
           
          -
          map.panTo([50, 30]);
          -map.panTo({lon: 30, lat: 50});
          -map.panTo({lat: 50, lng: 30});
          -map.panTo(L.latLng(50, 30));
          + // setup tile width and height according to the options + tile.width = tile.height = this.options.tileSize; -

          Creation

          + // get a canvas context and draw something on it using coords.x, coords.y and coords.z + var ctx = canvas.getContext('2d'); - - - + // return the tile so it can be rendered on screen + return tile; + } +}); - - - - +

          Asyncronous usage example

          +

          Tile creation can also be asyncronous, this is useful when using a third-party drawing library. Once the tile is finsihed drawing it can be passed to the done() callback.

          - - -
          FactoryDescription
          L.latLng( - <Number> latitude, - <Number> longitude, - <Number> altitude? ) - Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
          +
          var CanvasLayer = L.GridLayer.extend({
          +	createTile: function(coords, done){
          +		var error;
           
          -

          Properties

          + // create a <canvas> element for drawing + var tile = L.DomUtil.create('canvas', 'leaflet-tile'); - + // setup tile width and height according to the options + tile.width = tile.height = this.options.tileSize; + + // draw something and pass the tile to the done() callback + done(error, tile); + } +}); + +

          Constructor

          + +
          - - + - - - - - - - - + +
          PropertyTypeFactory Description
          latNumberLatitude in degrees.
          lngNumberLongitude in degrees.L.gridLayer(<GridLayer options> options?)Creates a new instance of GridLayer with the supplied options.
          -

          Methods

          +

          Options

          - +
          - - + + + - - + - + + - - - - + + + + - - - + + + + - - - - + + + + -
          MethodReturnsOptionTypeDefault value Description
          distanceTo( - <LatLng> otherLatlng ) - maxZoom NumberReturns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia'tilePane'The map pane the layer will be added to.
          equals( - <LatLng> otherLatlng ) - BooleanReturns true if the given LatLng point is at the same position (within a small margin of error).tileSizeNumber256Width and height of tiles in the grid. Can be used in the createTile() function.
          toString()StringReturns a string representation of the point (for debugging purposes).opacityNumber1Opacity of the tiles. Can be used in the createTile() function.
          wrap( - <Number> left, - <Number> right ) - LatLngReturns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default).unloadInvisibleTilesBooleandependsIf true, all the tiles that are not visible after panning are removed (for better performance). true by default on mobile WebKit, otherwise false.
          - -

          Constants

          - - - - - - + + + + - + - - + + - + - - + + - - - - + + + + -
          ConstantTypeValueDescriptionupdateWhenIdleBooleandependsIf false, new tiles are loaded during panning, otherwise only after it (for better performance). true by default on mobile WebKit, otherwise false.
          DEG_TO_RADupdateInterval NumberMath.PI / 180A multiplier for converting degrees into radians.200Tiles will not update more then once every updateInterval.
          RAD_TO_DEGzIndex Number180 / Math.PIA multiplier for converting radians into degrees.nullThe explicit zIndex of the tile layer. Not set by default.
          MAX_MARGINNumber1.0E-9Max margin of error for the equality check.boundsLatLngBoundsnullIf set tiles will only be loaded inside inside the set LatLngBounds.
          - +
          boundsLatLngBoundsnullIf set tiles will only be loaded inside inside the set LatLngBounds.
          minZoomNumber0The minimum zoom level that tiles will be loaded at. By default the entire map.
          + +

          Methods

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          bringToFront()thisBrings the tile layer to the top of all tile layers.
          bringToBack()thisBrings the tile layer to the bottom of all tile layers.
          setOpacity( + <Number> opacity ) + thisChanges the opacity of the tile layer.
          setZIndex( + <Number> zIndex ) + thisSets the zIndex of the tile layer.
          redraw()thisCauses the layer to clear all the tiles and request them again.
          getContainer() + HTMLElementReturns the HTML element that contains the tiles for this layer.
          + +

          Events

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          EventDataDescription
          loadingEventFired when the tile layer starts loading tiles.
          loadEventFired when the tile layer loaded all visible tiles.
          tileloadstartTileEventFired when a tile is requested and starts loading.
          tileloadTileEventFired when a tile loads.
          tileunloadTileEventFired when a tile is removed (e.g. when you have unloadInvisibleTiles on).
          tileerrorTileEventFired when there is an error loading a tile.
          + +

          LatLng

          + +

          Represents a geographical point with a certain latitude and longitude.

          +
          var latlng = L.latLng(50.5, 30.5);
          + +

          All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent:

          + +
          map.panTo([50, 30]);
          +map.panTo({lon: 30, lat: 50});
          +map.panTo({lat: 50, lng: 30});
          +map.panTo(L.latLng(50, 30));
          + +

          Creation

          + + + + + + + + + + + + + +
          FactoryDescription
          L.latLng( + <Number> latitude, + <Number> longitude, + <Number> altitude? ) + Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude).
          + +

          Properties

          + + + + + + + + + + + + + + + + + +
          PropertyTypeDescription
          latNumberLatitude in degrees.
          lngNumberLongitude in degrees.
          + +

          Methods

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          MethodReturnsDescription
          distanceTo( + <LatLng> otherLatlng ) + NumberReturns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia
          equals( + <LatLng> otherLatlng ) + BooleanReturns true if the given LatLng point is at the same position (within a small margin of error).
          toString()StringReturns a string representation of the point (for debugging purposes).
          wrap( + <Number> left, + <Number> right ) + LatLngReturns a new LatLng object with the longitude wrapped around left and right boundaries (-180 to 180 by default).
          + +

          Constants

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          ConstantTypeValueDescription
          DEG_TO_RADNumberMath.PI / 180A multiplier for converting degrees into radians.
          RAD_TO_DEGNumber180 / Math.PIA multiplier for converting radians into degrees.
          MAX_MARGINNumber1.0E-9Max margin of error for the equality check.
          + @@ -4447,10 +4603,9 @@

          Options

          -

          Events methods

          -

          A set of methods shared between event-powered classes (like Map). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map 'click' event).

          +

          A set of methods shared between event-powered classes (like Map and Marker). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire 'click' event).

          Example

          @@ -4572,269 +4727,99 @@

          Methods

          -

          Event objects

          - -

          Event object is an object that you receive as an argument in a listener function when some event is fired, containing useful information about that event. For example:

          +

          Layer methods

          -
          map.on('click', function(e) {
          -	alert(e.latlng); // e is an event object (MouseEvent in this case)
          -});
          +A set of methods inherited from the Layer base class that all Leaflet layers use. -

          Event

          +
          var layer = L.Marker(latlng).addTo(map);
          +layer.addTo(map);
          +layer.remove();
          -

          The base event object. All other event objects contain these properties too.

          +

          Methods

          - +
          - - - + + + - - - + + + - - - + + + -
          propertytypedescriptionMethodReturnsDescription
          typeStringThe event type (e.g. 'click').addTo(<Map> map)thisAdds the layer to the given map.
          targetObjectThe object that fired the event.removeFrom(<Map> map)thisRemoves the layer to the given map.
          - -

          MouseEvent

          - - - - - + + + - - - - - - - - - - - - - - - - - - + + +
          propertytypedescriptionremove()thisRemoves the layer from the map it is currently active on.
          latlngLatLngThe geographical point where the mouse event occured.
          layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.
          containerPointPointPixel coordinates of the point where the mouse event occured relative to the map сontainer.
          originalEventDOMMouseEventThe original DOM mouse event fired by the browser.getPane(<String> name?)HTMLElementReturns the HTMLElement representing the named pane on the map. Or if name is omitted the pane for this layer.
          -

          LocationEvent

          +

          Popup methods

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          propertytypedescription
          latlngLatLngDetected geographical location of the user.
          boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
          accuracyNumberAccuracy of location in meters.
          altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
          altitudeAccuracyNumberAccuracy of altitude in meters.
          headingNumberThe direction of travel in degrees counting clockwise from true North.
          speedNumberCurrent velocity in meters per second.
          timestampNumberThe time when the position was acquired.
          - -

          ErrorEvent

          - - - - - - - - - - - - - - - - - -
          propertytypedescription
          messageStringError message.
          codeNumberError code (if applicable).
          - -

          LayerEvent

          - - - - - - - - - - - - -
          propertytypedescription
          layerILayerThe layer that was added or removed.
          - -

          LayersControlEvent

          - - - - - - - - - - - - - - - - - -
          propertytypedescription
          layerILayerThe layer that was added or removed.
          nameStringThe name of the layer that was added or removed.
          +A set of methods inherited from the Layer base class that all Leaflet layers use. These methods provide convieniant ways of binding popups to any layer. -

          TileEvent

          - - - - - - - - - - - - -
          propertytypedescription
          tileHTMLElementThe tile element (image).
          +
          var layer = L.Polgon(latlngs).bindPopup('Hi There!').addTo(map);
          +layer.openPopup();
          +layer.closePopup();
          +
          -

          ResizeEvent

          +Popups will also be automatically opened when the layer is clicked on and closed when the layer is removed from the map or another popup is opened. - +

          Methods

          +
          - - - + + + - - - + + + - - - - -
          propertytypedescriptionMethodReturnsDescription
          oldSizePointThe old size before resize event.bindPopup(<String|HTMLElement|Popup> content, <PopupOptions> options?)thisBinds the passed content to the layer and sets up the neccessary event listeners.
          newSizePointThe new size after the resize event.
          - -

          GeoJSON event

          - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - - -
          propertytypedescriptionunbindPopup()thisRemoves the popup previously bound with bindPopup.
          layerILayerThe layer for the GeoJSON feature that is being added to the map.openPopup(LatLng latlng?)thisOpens the bound popup at the specificed latlng or at the default popup anchor if no latlng is passed.
          propertiesObjectGeoJSON properties of the feature.closePopup()thisCloses the popup if it is open.
          geometryTypeStringGeoJSON geometry type of the feature.togglePopup()thisOpens or closes the popup depending on its current state.
          idStringGeoJSON ID of the feature (if present).
          - - - - - - - - + + + - + - - -
          propertytypedescriptionsetPopupContent(<String|HTMLElement|Popup> content, <PopupOptions> options?)thisSets the content of the popup.
          popupgetPopup() PopupThe popup that was opened or closed.
          - -

          DragEndEvent

          - - - - - - - - - - - +
          propertytypedescription
          distanceNumberThe distance in pixels the draggable element was moved by.Returns the popup bound to this layer.
          - - -

          Browser

          A namespace with properties for browser/feature detection used by Leaflet internally.

          @@ -4953,10 +4938,8 @@

          Methods

          <Function> fn, <Object> obj ) - Function - - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. Not a polyfill for ES 5 bind (compare L.bind to the MDN-recommended polyfill for Function.prototype.bind). + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. stamp( <Object> obj ) @@ -4994,7 +4977,7 @@

          Methods

          falseFn() Function - Always returns false. + Returns a function which always returns false. formatNum( @@ -5315,6 +5298,7 @@

          DomUtil

          Utility functions to work with the DOM tree, used by Leaflet internally.

          +>>>>>>> more layer docs

          Methods

          @@ -5368,9 +5352,13 @@

          Methods

          - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1818,11 +1776,11 @@

          Methods

          - + @@ -3103,21 +3061,14 @@

          Creation

          Methods

          +

          In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          +
          BooleanReturns true if the element class attribute contains name.
          falseFn()FunctionAlways returns false.
          addClass( <HTMLElement> el, @@ -6343,6 +6331,280 @@

          Defined CRS

          If you want to use some obscure CRS not listed here, take a look at the Proj4Leaflet plugin.

          +

          Event objects

          + +

          Event object is an object that you recieve as an argument in a listener function when some event is fired, containing useful information about that event. For example:

          + +
          map.on('click', function(e) {
          +	alert(e.latlng); // e is an event object (MouseEvent in this case)
          +});
          + +

          Event

          + +

          The base event object. All other event objects contain these properties too.

          + + + + + + + + + + + + + + + + + +
          propertytypedescription
          typeStringThe event type (e.g. 'click').
          targetObjectThe object that fired the event.
          + +

          MouseEvent

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          propertytypedescription
          latlngLatLngThe geographical point where the mouse event occured.
          layerPointPointPixel coordinates of the point where the mouse event occured relative to the map layer.
          containerPointPointPixel coordinates of the point where the mouse event occured relative to the map сontainer.
          originalEventDOMMouseEventThe original DOM mouse event fired by the browser.
          + +

          LocationEvent

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          propertytypedescription
          latlngLatLngDetected geographical location of the user.
          boundsLatLngBoundsGeographical bounds of the area user is located in (with respect to the accuracy of location).
          accuracyNumberAccuracy of location in meters.
          altitudeNumberHeight of the position above the WGS84 ellipsoid in meters.
          altitudeAccuracyNumberAccuracy of altitude in meters.
          headingNumberThe direction of travel in degrees counting clockwise from true North.
          speedNumberCurrent velocity in meters per second.
          timestampNumberThe time when the position was acquired.
          + +

          ErrorEvent

          + + + + + + + + + + + + + + + + + +
          propertytypedescription
          messageStringError message.
          codeNumberError code (if applicable).
          + +

          LayerEvent

          + + + + + + + + + + + + +
          propertytypedescription
          layerILayerThe layer that was added or removed.
          + +

          LayersControlEvent

          + + + + + + + + + + + + + + + + + +
          propertytypedescription
          layerILayerThe layer that was added or removed.
          nameStringThe name of the layer that was added or removed.
          + +

          TileEvent

          + + + + + + + + + + + + +
          propertytypedescription
          tileHTMLElementThe tile element (image).
          + +

          TileErrorEvent

          + + + + + + + + + + + + +
          propertytypedescription
          tileHTMLElementThe tile element (image).
          + +

          ResizeEvent

          + + + + + + + + + + + + + + + + + +
          propertytypedescription
          oldSizePointThe old size before resize event.
          newSizePointThe new size after the resize event.
          + +

          GeoJSON event

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          propertytypedescription
          layerILayerThe layer for the GeoJSON feature that is being added to the map.
          propertiesObjectGeoJSON properties of the feature.
          geometryTypeStringGeoJSON geometry type of the feature.
          idStringGeoJSON ID of the feature (if present).
          + + + + + + + + + + + + + + +
          propertytypedescription
          popupPopupThe popup that was opened or closed.
          + +

          DragEndEvent

          + + + + + + + + + + + + +
          propertytypedescription
          distanceNumberThe distance in pixels the draggable element was moved by.

          Global Switches

          From e708fbc94bd65cd0118bacc6da495a3eb0c72629 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 6 Mar 2015 13:42:58 +0200 Subject: [PATCH 1674/2207] clean up docs merges --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b260d3137c0..8d749ab180e 100644 --- a/reference.html +++ b/reference.html @@ -5787,7 +5787,7 @@

          Constructor Hooks

          Evented

          -

          When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

          +

          When creating a plugin you may want your code to have access to the event methods. By extending the Evented class you can create a class which inherits event-related methods like on, off and fire

          MyEventedClass = L.Evented.extend({
           	fire: function(){
          
          From acd56a00961df63ba5fd165c0e13c4050244dd71 Mon Sep 17 00:00:00 2001
          From: Patrick Arlt 
          Date: Sat, 28 Mar 2015 19:00:21 -0700
          Subject: [PATCH 1675/2207] remove shared methods from method lists
          
          ---
           reference.html | 71 +++++++++-----------------------------------------
           1 file changed, 13 insertions(+), 58 deletions(-)
          
          diff --git a/reference.html b/reference.html
          index 8d749ab180e..dc6267602f1 100644
          --- a/reference.html
          +++ b/reference.html
          @@ -1569,48 +1569,6 @@ 

          Methods

          this Updates the marker position, useful if coordinates of its latLng object were changed directly.
          bindPopup( - <String> html | <HTMLElement> el | <Popup> popup, - <Popup options> options? ) - thisBinds a popup with a particular HTML content to a click on this marker. You can also open the bound popup with the Marker openPopup method.
          unbindPopup()thisUnbinds the popup previously bound to the marker with bindPopup.
          openPopup()thisOpens the popup previously bound by the bindPopup method.
          getPopup()PopupReturns the popup previously bound by the bindPopup method.
          closePopup()thisCloses the bound popup of the marker if it's opened.
          togglePopup()thisToggles the popup previously bound by the bindPopup method.
          setPopupContent( - <String> html | <HTMLElement> el ) - thisSets an HTML content of the popup of this marker.
          toGeoJSON() Object
          setContent( - <String|HTMLElement> htmlContent ) + <String|HTMLElement|Function> htmlContent ) thisSets the HTML content of the popup.Sets the HTML content of the popup. If a function is passed the source layer will be passed to the function. The function should return a String or HTMLElement to be used in the popup.
          getContent()
          - - - - - - @@ -3202,10 +3153,9 @@

          GeoJson

          L.geoJson(data, {
           	style: function (feature) {
           		return {color: feature.properties.color};
          -	},
          -	onEachFeature: function (feature, layer) {
          -		layer.bindPopup(feature.properties.description);
           	}
          +}).bindPopup(function (layer) {
          +	return layer.feature.properties.description;
           }).addTo(map);

          Each feature layer created by it gets a feature property that links to the GeoJSON feature data the layer was created from (so that you can access its properties later).

          @@ -3278,6 +3228,8 @@

          Options

          Methods

          +

          In addition to shared layer methods like addTo() and remove() and popup methods like bindPopup() you can also use the following methods:

          +
          Method Returns Description
          bindPopup( - <String> htmlContent, - <Popup options> options? ) - thisBinds a popup with a particular HTML content to a click on any layer from the group that has a bindPopup method.
          getBounds() LatLngBounds
          @@ -4784,9 +4736,12 @@

          Methods

          - + - + +
          featureGroup.bindPopup(function(layer){
          +	return "a unique template for this layer.";
          +});
          From 7b7b56622f1d6346e3fcede196927c64a0311a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 22 Apr 2015 23:10:14 +0200 Subject: [PATCH 1676/2207] Add flyTo() and flyToBounds() to the API reference --- reference.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/reference.html b/reference.html index dc6267602f1..16d23093179 100644 --- a/reference.html +++ b/reference.html @@ -739,6 +739,23 @@

          Methods for Modifying Map State

          + + + + + + + + + +
          Method Description
          bindPopup(<String|HTMLElement|Popup> content, <PopupOptions> options?)bindPopup(<String|HTMLElement|Function|Popup> content, <PopupOptions> options?) thisBinds the passed content to the layer and sets up the neccessary event listeners.Binds the passed content to the layer and sets up the neccessary event listeners. If a Function is passed the function will recive a layer as the first argument and should return a String or HTMLElement.
          unbindPopup()this Destroys the map and clears all related event listeners.
          flyTo( + <LatLng> latlng, + <Number> zoom?, + <zoom/pan options> options? ) + thisSets the view of the map (geographical center and zoom) performing a smooth pan-zoom animation.
          flyToBounds( + <LatLngBounds> bounds, + <fitBounds options> options? ) + thisSets the view of the map with a smooth animation like flyTo, but takes a bounds parameter like fitBounds.

          Methods for Getting Map State

          From f947853f3b8bdf70b002c9c5b6b5dcd74bf951b3 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 8 May 2015 18:21:25 +0200 Subject: [PATCH 1677/2207] Update L.Polyline.addLatLng doc --- reference.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 16d23093179..aab82817acf 100644 --- a/reference.html +++ b/reference.html @@ -2631,11 +2631,12 @@

          Methods

          addLatLng( -
          <LatLng> latlng ) + <LatLng> latlng, + <LatLng[]> latlngs ) this - Adds a given point to the polyline. + Adds a given point to the polyline. By default, adds to the first ring of the polyline in case of a multi-polyline, but can be overriden passing another LatLngs group with latlngs parameter. setLatLngs( From 86c0649d443267828a94d9fe463657850d1db96f Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 8 May 2015 18:39:39 +0200 Subject: [PATCH 1678/2207] More L.Polyline doc on LatLng related methods --- reference.html | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/reference.html b/reference.html index aab82817acf..ff155bbf248 100644 --- a/reference.html +++ b/reference.html @@ -2636,7 +2636,7 @@

          Methods

          this - Adds a given point to the polyline. By default, adds to the first ring of the polyline in case of a multi-polyline, but can be overriden passing another LatLngs group with latlngs parameter. + Adds a given point to the polyline. By default, adds to the first ring of the polyline in case of a multi-polyline, but can be overridden by passing a specific ring as a LatLng array (that you can earlier access with getLatLngs). setLatLngs( @@ -2649,17 +2649,7 @@

          Methods

          getLatLngs() LatLng[] - Returns an array of the points in the path. - - - spliceLatLngs( - <Number> index, - <Number> pointsToRemove, - <LatLng> latlng?, … ) - - - LatLng[] - Allows adding, removing or replacing points in the polyline. Syntax is the same as in Array#splice. Returns the array of removed points (if any). + Returns an array of the points in the path, or nested arrays of points in case of multi-polyline. getBounds() From 08afc5a10409c098ede0f0e9dbd6ffba0b0e08a2 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 9 May 2015 23:08:39 +0200 Subject: [PATCH 1679/2207] Add Polyline.isEmpty to the doc --- reference.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reference.html b/reference.html index ff155bbf248..f75adf911b3 100644 --- a/reference.html +++ b/reference.html @@ -2651,6 +2651,11 @@

          Methods

          LatLng[] Returns an array of the points in the path, or nested arrays of points in case of multi-polyline. + + isEmpty() + Boolean + Returns true if the Polyline has no LatLng. + getBounds() LatLngBounds From f15fd92bd3afe549ac7695650b3bb0a56fba5850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 3 Jun 2015 22:33:50 +0200 Subject: [PATCH 1680/2207] Documentation for maxBoundsViscosity (see #3510) --- reference.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index f75adf911b3..472483cbe57 100644 --- a/reference.html +++ b/reference.html @@ -206,8 +206,14 @@

          Map State Options

          maxBounds LatLngBounds null - When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view. To set the restriction dynamically, use setMaxBounds method - + When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view. To set the restriction dynamically, use setMaxBounds method. + + + maxBoundsViscosity + Number + 0.0 + If maxBounds is set, this options will control how solid the bounds are when dragging the map around. The default value of 0.0 allows the user to drag outside the bounds at normal speed, higher values will slow down map dragging outside bounds, and 1.0 makes the bounds fully solid, preventing the user from dragging outside the bounds. + crs CRS From 2396b9714380962e1d48b02a72b4178de75a2c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 4 Jun 2015 14:31:03 +0200 Subject: [PATCH 1681/2207] Document Bounds.overlap and LatLngBounds.overlap (see #3508) --- reference.html | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 472483cbe57..38b5fe3cc24 100644 --- a/reference.html +++ b/reference.html @@ -3778,7 +3778,15 @@

          Methods

          Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. + + + overlaps( + <LatLngBounds> otherBounds ) + + + Boolean + Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. equals( @@ -4052,7 +4060,15 @@

          Methods

          Boolean - Returns true if the rectangle intersects the given bounds. + Returns true if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. + + + overlaps( + <Bounds> otherBounds ) + + + Boolean + Returns true if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. isValid() From 745cad469fc1307036935cb0416bae5bab980a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 8 Jun 2015 13:39:34 +0200 Subject: [PATCH 1682/2207] Miscellaneous bits of documentation (see #3098) --- reference.html | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/reference.html b/reference.html index 38b5fe3cc24..57eac7c5953 100644 --- a/reference.html +++ b/reference.html @@ -3600,11 +3600,12 @@

          Methods

          equals( - <LatLng> otherLatlng ) + <LatLng> otherLatlng, + <Number> maxMargin? ) Boolean - Returns true if the given LatLng point is at the same position (within a small margin of error). + Returns true if the given LatLng point is at the same position (within a small margin of error). The margin of error can be overriden by setting maxMargin to a small number. toString() @@ -3933,6 +3934,11 @@

          Methods

          Point Returns a copy of the current point with floored coordinates (rounded down). + + ceil() + Point + Returns a copy of the current point with ceiled coordinates (rounded up). + equals( <Point> otherPoint ) @@ -4926,10 +4932,13 @@

          Methods

          bind( <Function> fn, - <Object> obj ) + <Object> obj, + <Any> arg1?, + <Any> arg2?, + <Any> arg3?, … ) Function - Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). Has an L.bind shortcut. + Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). The arguments received by the bound function will be any arguments passed when binding the function, followed by any arguments passed when invoking the bound function. Has an L.bind shortcut. Works exactly like Function.prototype.bind in modern browsers compliant with ECMAScript 5. stamp( <Object> obj ) @@ -4978,6 +4987,16 @@

          Methods

          Number Returns the number num rounded to digits decimals. + + wrapNum( +
          <Number> num, + <Array> range, + <Boolean> includeMax ) + + + Number + Returns the number num modulo range in such a way so it lies within range[0] and range[1]. The returned value will be always smaller than range[1] unless includeMax is set to true. + splitWords( <String> str ) @@ -5369,6 +5388,25 @@

          Methods

          Removes name from the element's class attribute. + + getClass( + <Element> el ) + + + <String> + + Returns the element's CSS class (for HTML elements) or SVG class (for SVG elements). + + + setClass( + <HTMLElement> el, + <String> name ) + + + - + + Sets the element's CSS class (for HTML elements) or SVG class (for SVG elements). + setOpacity( <HTMLElement> el, From 3c177564f6b97034ff248b955b421fa9eee0d373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Jun 2015 12:43:56 +0200 Subject: [PATCH 1683/2207] Bits of documentation for L.DomEvent and L.DomUtil (see #3098) --- reference.html | 68 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/reference.html b/reference.html index 57eac7c5953..ee394994f2f 100644 --- a/reference.html +++ b/reference.html @@ -5223,26 +5223,47 @@

          Methods

          Returns Description + + on( + <HTMLElement> el, + <String> types, + <Function> fn, + <Object> context? ) + + + this + Adds a listener fn to the element's DOM events. types is a space-separated list of DOM event types to listen to. this keyword inside the listener will point to context, or to the element if not specified. + addListener( <HTMLElement> el, - <String> type, + <String> types, <Function> fn, <Object> context? ) this - Adds a listener fn to the element's DOM event of the specified type. this keyword inside the listener will point to context, or to the element if not specified. + Alias for DomEvent.on. + + + off( + <HTMLElement> el, + <String> types, + <Function> fn ) + + + this + Removes the event listener fn from the element, for the DOM event types in types (a space-separated list). fn must be equal to the function currently listening to the event for it to be removed. removeListener( <HTMLElement> el, - <String> type, + <String> types, <Function> fn ) this - Removes an event listener from the element. + Alias for DomEvent.off. stopPropagation( @@ -5344,6 +5365,20 @@

          Methods

          Creates an element with tagName, sets the className, and optionally appends it to container element. + + remove( + <HTMLElement> el ) + + - + Removes el from its parent element. + + + empty( + <HTMLElement> el ) + + - + Removes all of el's children elements from el. + disableTextSelection() - @@ -5425,31 +5460,22 @@

          Methods

          Goes through the array of style names and returns the first name that is a valid style name for an element. If no such name is found, it returns false. Useful for vendor-prefixed styles like transform. - getTranslateString( - <Point> point ) - - - String - Returns a CSS transform string to move an element by the offset provided in the given point. Uses 3D translate on WebKit for hardware-accelerated transforms and 2D on other browsers. - - - getScaleString( - <Number> scale, - <Point> origin ) + setTransform( + <HTMLElement> el, + <Point> offset, + <Number> scale? ) - - String - Returns a CSS transform string to scale an element (with the given scale origin). + - + Resets the 3D CSS transform of el so it is translated by offset and optionally scaled by scale. Does not have an effect if the browser doesn't support 3D CSS transforms. setPosition( <HTMLElement> el, - <Point> point, - <Boolean> disable3D? ) + <Point> point ) - - Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). Forces top/left positioning if disable3D is true. + Sets the position of an element to coordinates specified by point, using CSS translate or top/left positioning depending on the browser (used by Leaflet internally to position its layers). getPosition( From b64655535ad06fd4d58284171e70402a04066def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Jun 2015 13:07:12 +0200 Subject: [PATCH 1684/2207] Bits of documentation for L.DomUtil's methods used internally --- reference.html | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/reference.html b/reference.html index ee394994f2f..79eceab9d95 100644 --- a/reference.html +++ b/reference.html @@ -5485,6 +5485,28 @@

          Methods

          Point Returns the coordinates of an element previously positioned with setPosition. + + disableImageDrag() + - + Prevents the user from generating dragstart DOM events, usually generated when the user drags an image. Used internally by Leaflet to override the behaviour of any click-and-drag interaction on the map. Affects drag interactions on the whole document. + + + enableImageDrag() + - + Cancels the effects of a previous L.DomUtil.disableImageDrag. + + + preventOutline( + <HTMLElement> el ) + + - + Makes the outline of the element el invisible. Used internally by Leaflet to prevent focusable elements from displaying an outline when the user performs a drag interaction on them. + + + restoreOutline() + - + Cancels the effects of a previous L.DomUtil.preventOutline. +

          Properties

          From fdddb648e8e7b9ed2223983d87350341f9d205c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Jun 2015 13:13:16 +0200 Subject: [PATCH 1685/2207] Cleanup L.DomUtil docs (see #3098). --- reference.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 79eceab9d95..e51ddf97f52 100644 --- a/reference.html +++ b/reference.html @@ -5249,17 +5249,19 @@

          Methods

          off( <HTMLElement> el, <String> types, - <Function> fn ) + <Function> fn, + <Object> context? ) this - Removes the event listener fn from the element, for the DOM event types in types (a space-separated list). fn must be equal to the function currently listening to the event for it to be removed. + Removes the event listener fn from the element, for the DOM event types in types (a space-separated list). Both fn and context must be equal to the function and context used previously on a L.DomEvent.on call. removeListener( <HTMLElement> el, <String> types, - <Function> fn ) + <Function> fn, + <Object> context? ) this From 7192bde5f9a318a474a4bf5fa9bc5cead0ef3473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Jun 2015 15:17:27 +0200 Subject: [PATCH 1686/2207] Misc docs: Evented aliases, deprecated LatLng stuff, Util.throttle. See #3098. --- reference.html | 83 ++++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 54 deletions(-) diff --git a/reference.html b/reference.html index e51ddf97f52..437b97fea5e 100644 --- a/reference.html +++ b/reference.html @@ -3623,36 +3623,6 @@

          Methods

          -

          Constants

          - - - - - - - - - - - - - - - - - - - - - - - - - - -
          ConstantTypeValueDescription
          DEG_TO_RADNumberMath.PI / 180A multiplier for converting degrees into radians.
          RAD_TO_DEGNumber180 / Math.PIA multiplier for converting radians into degrees.
          MAX_MARGINNumber1.0E-9Max margin of error for the equality check.
          - -

          LatLngBounds

          @@ -4621,7 +4591,7 @@

          Methods

          Description - addEventListener( + on( <String> type, <Function> fn, <Object> context? ) @@ -4631,7 +4601,7 @@

          Methods

          Adds a listener function (fn) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). - addOneTimeEventListener( + once( <String> type, <Function> fn, <Object> context? ) @@ -4641,7 +4611,7 @@

          Methods

          The same as above except the listener will only get fired once and then removed. - addEventListener( + on( <Object> eventMap, <Object> context? ) @@ -4650,17 +4620,17 @@

          Methods

          Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} - removeEventListener( + off( <String> type, <Function> fn?, <Object> context? ) this - Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to addEventListener, you must pass the same context to removeEventListener in order to remove the listener. + Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener. - removeEventListener( + off( <Object> eventMap, <Object> context? ) @@ -4669,21 +4639,21 @@

          Methods

          Removes a set of type/listener pairs.
          - removeEventListener() + off() this - Removes all listeners. An alias to clearAllEventListeners when you use it without arguments. + Removes all listeners to all events on the object. - hasEventListeners( + listens( <String> type ) Boolean - Returns true if a particular event type has some listeners attached to it. + Returns true if a particular event type has any listeners attached to it. - fireEvent( + fire( <String> type, <Object> data? ) @@ -4692,30 +4662,35 @@

          Methods

          Fires an event of the specified type. You can optionally provide an data object — the first argument of the listener function will contain its properties. - clearAllEventListeners() - + addEventListener( … ) this - Removes all listeners to all events on the object.
          + Alias to on. - on( … ) + addOneTimeEventListener( … ) this - Alias to addEventListener. + Alias to once. - once( … ) + removeEventListener( … ) + this + Alias to off. + + + clearAllEventListeners() + this - Alias to addOneTimeEventListener. + Alias to off().
          - off( … ) + hasEventListeners( … ) this - Alias to removeEventListener. + Alias to listens. - fire( … ) + fireEvent( … ) this - Alias to fireEvent. + Alias to fire. @@ -4963,14 +4938,14 @@

          Methods

          Cancels a previous request to requestAnimFrame. - limitExecByInterval( + throttle( <Function> fn, <Number> time, <Object> context? ) Function - Returns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time, but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called. + Returns a wrapper around the function fn that makes sure it's called not more often than a certain time interval time (in milliseconds), but as fast as possible otherwise (for example, it is used for checking and requesting new tiles while dragging the map), optionally passing the scope (context) in which the function will be called. From 2f287ba1dd4da88ce5a7663ae10919e0c6d1f8a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Jun 2015 17:30:34 +0200 Subject: [PATCH 1687/2207] More consistency between L.Evented and L.DomEvent docs. (see #3098) --- reference.html | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/reference.html b/reference.html index 437b97fea5e..c3e1bda4f96 100644 --- a/reference.html +++ b/reference.html @@ -5207,10 +5207,21 @@

          Methods

          this - Adds a listener fn to the element's DOM events. types is a space-separated list of DOM event types to listen to. this keyword inside the listener will point to context, or to the element if not specified. + + Adds a listener function (fn) to a particular DOM event type of the element el. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. 'click dblclick'). - addListener( + on( + <HTMLElement> el, + <Object> eventMap, + <Object> context? ) + + + this + Adds a set of type/listener pairs, e.g. {click: onClick, mousemove: onMouseMove} + + + off( <HTMLElement> el, <String> types, <Function> fn, @@ -5218,10 +5229,20 @@

          Methods

          this - Alias for DomEvent.on. + + Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular DOM event from the element. Note that if you passed a custom context to on, you must pass the same context to off in order to remove the listener. off( + <HTMLElement> el, + <Object> eventMap, + <Object> context? ) + + + this + Removes a set of type/listener pairs.
          + + addListener( <HTMLElement> el, <String> types, <Function> fn, @@ -5229,7 +5250,7 @@

          Methods

          this - Removes the event listener fn from the element, for the DOM event types in types (a space-separated list). Both fn and context must be equal to the function and context used previously on a L.DomEvent.on call. + Alias to on. removeListener( @@ -5240,7 +5261,7 @@

          Methods

          this - Alias for DomEvent.off. + Alias to off. stopPropagation( From 30233fba26849185c0787892536b319b1749ceed Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Tue, 9 Jun 2015 20:42:53 +0200 Subject: [PATCH 1688/2207] Document Projection bounds property --- reference.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/reference.html b/reference.html index c3e1bda4f96..d662ac3841d 100644 --- a/reference.html +++ b/reference.html @@ -6232,6 +6232,21 @@

          Projection

          An object with methods for projecting geographical coordinates of the world onto a flat surface (and back). See Map projection.

          +

          Properties

          + + + + + + + + + + + + +
          PropertyTypeDescription
          boundsLatLngBoundsThe bounds where the projection is valid
          +

          Methods

          From 41315ecf800fcf97dd75baad9b1590e97cc76b19 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Tue, 9 Jun 2015 21:04:55 +0200 Subject: [PATCH 1689/2207] Document CRS wrapLat, wrapLng, infinite and getProjectedBounds --- reference.html | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/reference.html b/reference.html index d662ac3841d..9d83777e8d4 100644 --- a/reference.html +++ b/reference.html @@ -6234,7 +6234,7 @@

          Projection

          Properties

          -
          +
          @@ -6349,12 +6349,12 @@

          Methods

          - - - + +
          Property Type Returns the scale used when transforming projected coordinates into pixel coordinates for a particular zoom. For example, it returns 256 * 2^zoom for Mercator-based CRS.
          getSize( + getProjectedBounds( <Number> zoom ) PointReturns the size of the world in pixels for a particular zoom.BoundsReturns the projection's bounds scaled and transformed for the provided zoom.
          @@ -6385,6 +6385,21 @@

          Properties

          String Standard code name of the CRS passed into WMS services (e.g. 'EPSG:3857'). + + wrapLat + Number[] + Latitude bounds, lower followed by upper, at which latitudes should wrap around, or null to disable wrapping + + + wrapLng + Number[] + Longitude bounds, lower followed by upper, at which longitudes should wrap around, or null to disable wrapping + + + infinite + Boolean + true if the CRS bounds should be ignored; coordinates in an infinite CRS will not be wrapped +

          Defined CRS

          From 7e3a82d4a3ee3061ff38e59fe72da05b967684b7 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Tue, 9 Jun 2015 21:15:07 +0200 Subject: [PATCH 1690/2207] Document Map getPixelWorldBounds --- reference.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/reference.html b/reference.html index 9d83777e8d4..95d8649a8ab 100644 --- a/reference.html +++ b/reference.html @@ -822,6 +822,14 @@

          Methods for Getting Map State

          Point Returns the projected pixel coordinates of the top left point of the map layer (useful in custom layer and overlay implementations). + + getPixelWorldBounds( + <Number> zoom? ) + + Bounds + Returns the world's bounds in pixel coordinates for zoom level zoom. If zoom is omitted, the map's + current zoom is used. +

          Methods for Layers and Controls

          From d6336dc7ebc92912cdd9f724a1054d473b39b199 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Tue, 9 Jun 2015 22:39:07 +0200 Subject: [PATCH 1691/2207] Document CRS unproject --- reference.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/reference.html b/reference.html index 95d8649a8ab..e4f92ee23dd 100644 --- a/reference.html +++ b/reference.html @@ -6348,6 +6348,14 @@

          Methods

          Point Projects geographical coordinates into coordinates in units accepted for this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). + + unproject( + <Point> point ) + + + LatLng + Given a projected coordinate returns the corresponding LatLng. The inverse of project. + scale( <Number> zoom ) From 6e1e54c9c8b9f147c2cf9285a99aa302f6ddc65d Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Tue, 9 Jun 2015 22:48:15 +0200 Subject: [PATCH 1692/2207] Document CRS and Map wrapLatLng --- reference.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reference.html b/reference.html index e4f92ee23dd..cbab7a50f50 100644 --- a/reference.html +++ b/reference.html @@ -1026,6 +1026,14 @@

          Conversion Methods

          LatLng Returns the geographical coordinates of the point the mouse clicked on given the click's event object. + + wrapLatLng( + <LatLng> latlng ) + + + LatLng + Returns a LatLng where lat and lng has been wrapped according to the map's CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds. +

          Other Methods

          @@ -6372,6 +6380,14 @@

          Methods

          Bounds Returns the projection's bounds scaled and transformed for the provided zoom. + + wrapLatLng( + <LatLng> latlng ) + + + LatLng + Returns a LatLng where lat and lng has been wrapped according to the CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds. +

          Properties

          From e28c59f41d496fa0dd1b24feeec4d42d79f24fd6 Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Wed, 10 Jun 2015 21:41:21 +0200 Subject: [PATCH 1693/2207] Document L.CRS.Earth --- reference.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reference.html b/reference.html index cbab7a50f50..5ddabb20895 100644 --- a/reference.html +++ b/reference.html @@ -6443,6 +6443,13 @@

          Defined CRS

          Projection Description + + L.CRS.Earth + + Serves as the base for CRS that are global such that they cover the earth. Can only be used as the base for + other CRS and cannot be used directly, since it does not have a code, projection or + transformation. + L.CRS.EPSG3857 From 4bc3a7708cf1abda627f092afc92a62bf93c799d Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Wed, 10 Jun 2015 22:05:09 +0200 Subject: [PATCH 1694/2207] Document Map and CRS distance --- reference.html | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/reference.html b/reference.html index 5ddabb20895..287115ca34d 100644 --- a/reference.html +++ b/reference.html @@ -1034,6 +1034,15 @@

          Conversion Methods

          LatLng Returns a LatLng where lat and lng has been wrapped according to the map's CRS's wrapLat and wrapLng properties, if they are outside the CRS's bounds. + + distance( + <LatLng> latlng1, + <LatLng> latlng2 ) + + + LatLng + Returns the distance in meters between two geographic coordinates in the map's CRS. +

          Other Methods

          @@ -6380,6 +6389,15 @@

          Methods

          Bounds Returns the projection's bounds scaled and transformed for the provided zoom. + + distance( + <LatLng> latlng1, + <LatLng> latlng2 ) + + + Number + Returns the distance in meters between two geographic coordinates in this CRS. + wrapLatLng( <LatLng> latlng ) From f2673ff0d97c463fbfa4e8c288618c7d7c243810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 30 Jun 2015 15:07:27 +0200 Subject: [PATCH 1695/2207] Document changes introduced by non-square tiles in #3570/#3573. --- reference.html | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/reference.html b/reference.html index 287115ca34d..fd9f4a7f931 100644 --- a/reference.html +++ b/reference.html @@ -3360,7 +3360,9 @@

          Synchronous usage example

          var tile = L.DomUtil.create('canvas', 'leaflet-tile'); // setup tile width and height according to the options - tile.width = tile.height = this.options.tileSize; + var size = this.getTileSize(); + tile.width = size.x; + tile.height = size.y; // get a canvas context and draw something on it using coords.x, coords.y and coords.z var ctx = canvas.getContext('2d'); @@ -3382,7 +3384,9 @@

          Asyncronous usage example

          var tile = L.DomUtil.create('canvas', 'leaflet-tile'); // setup tile width and height according to the options - tile.width = tile.height = this.options.tileSize; + var size = this.getTileSize(); + tile.width = size.x; + tile.height = size.y; // draw something and pass the tile to the done() callback done(error, tile); @@ -3419,9 +3423,9 @@

          Options

          tileSize - Number + Number or Point 256 - Width and height of tiles in the grid. Can be used in the createTile() function. + Width and height of tiles in the grid. Use a number if width and height are equal, or L.point(width, height) otherwise. opacity @@ -3513,6 +3517,12 @@

          Methods

          HTMLElement Returns the HTML element that contains the tiles for this layer. + + getTileSize() + + Point + Normalizes the tileSize option into a point. Used by the createTile() method. +

          Events

          @@ -3906,6 +3916,22 @@

          Methods

          Point Returns the result of division of the current point by the given number. If optional round is set to true, returns a rounded result. + + scaleBy( + <Point> scale ) + + + Point + Multiply each coordinate of the current point by each coordinate of scale. In linear algebra terms, multiply the point by the scaling matrix defined by scale. + + + unscaleBy( + <Point> otherPoint ) + + + Point + Inverse of multiplyCoordinates. Divide each coordinate of the current point by each coordinate of scale. + distanceTo( <Point> otherPoint ) From 416a22747c7e02df74bb275f9d86315792a566eb Mon Sep 17 00:00:00 2001 From: Alex Paterson Date: Fri, 3 Jul 2015 11:37:09 +0100 Subject: [PATCH 1696/2207] Added Leaflet.EdgeBuffer to plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index f32a4153df7..756614d634d 100644 --- a/plugins.md +++ b/plugins.md @@ -436,6 +436,15 @@ The following plugins change the way that tile layers are loaded into the map. Eric Brelsford + + + Leaflet.EdgeBuffer + + Buffer tiles beyond the edge of the viewport. Demo. + + Alex Paterson + + From 4833e000aeb3b2abc8bbb5c56404dcf3e6cb4702 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Fri, 3 Jul 2015 07:45:09 -0700 Subject: [PATCH 1697/2207] new test for roundtripping complex geojson --- debug/tests/geojson-roundtrip.html | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 debug/tests/geojson-roundtrip.html diff --git a/debug/tests/geojson-roundtrip.html b/debug/tests/geojson-roundtrip.html new file mode 100644 index 00000000000..bbe2d0e0fd0 --- /dev/null +++ b/debug/tests/geojson-roundtrip.html @@ -0,0 +1,54 @@ + + + + Leaflet debug page + + + + + + + + + + + + +
          + + + + + From 0d3448d494b4c6191f20282c679ecefa27bb3c50 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 13 Mar 2015 22:08:50 +0100 Subject: [PATCH 1698/2207] Always fire DOM event on the map too --- debug/tests/mousemove_on_polygons.html | 48 ++++++++++++++++ spec/suites/map/MapSpec.js | 76 ++++++++++++++++++++++++++ src/dom/DomEvent.js | 4 +- src/map/Map.js | 10 +++- 4 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 debug/tests/mousemove_on_polygons.html diff --git a/debug/tests/mousemove_on_polygons.html b/debug/tests/mousemove_on_polygons.html new file mode 100644 index 00000000000..ea374dae305 --- /dev/null +++ b/debug/tests/mousemove_on_polygons.html @@ -0,0 +1,48 @@ + + + + Leaflet debug page + + + + + + + + + + + + +
          + + + + diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index eeb033fed58..e1d7ac5be64 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -619,4 +619,80 @@ describe("Map", function () { }); + describe('#DOM events', function () { + + var c, map; + + beforeEach(function () { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + map = new L.Map(c); + map.setView(new L.LatLng(0, 0), 0); + document.body.appendChild(c); + }); + + afterEach(function () { + document.body.removeChild(c); + }); + + it("DOM events propagate from polygon to map", function () { + var spy = sinon.spy(); + map.on("mousemove", spy); + var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); + happen.mousemove(layer._path); + expect(spy.calledOnce).to.be.ok(); + }); + + it("DOM events propagate from marker to map", function () { + var spy = sinon.spy(); + map.on("mousemove", spy); + var layer = new L.Marker([1, 2]).addTo(map); + happen.mousemove(layer._icon); + expect(spy.calledOnce).to.be.ok(); + }); + + it("DOM events fired on marker can be cancelled before being caught by the map", function () { + var mapSpy = sinon.spy(); + var layerSpy = sinon.spy(); + map.on("mousemove", mapSpy); + var layer = new L.Marker([1, 2]).addTo(map); + layer.on("mousemove", L.DomEvent.stopPropagation).on("mousemove", layerSpy); + happen.mousemove(layer._icon); + expect(layerSpy.calledOnce).to.be.ok(); + expect(mapSpy.called).not.to.be.ok(); + }); + + it("mouseout is only forwared if fired on the original target", function () { + var mapSpy = sinon.spy(), + layerSpy = sinon.spy(), + otherSpy = sinon.spy(); + var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); + var other = new L.Polygon([[10, 20], [30, 40], [50, 60]]).addTo(map); + map.on("mouseout", mapSpy); + layer.on("mouseout", layerSpy); + other.on("mouseout", otherSpy); + happen.mouseout(layer._path); + expect(mapSpy.called).not.to.be.ok(); + expect(otherSpy.called).not.to.be.ok(); + expect(layerSpy.calledOnce).to.be.ok(); + }); + + it("mouseout is not forwared to layers if fired on the map", function () { + var mapSpy = sinon.spy(), + layerSpy = sinon.spy(), + otherSpy = sinon.spy(); + var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); + var other = new L.Polygon([[10, 20], [30, 40], [50, 60]]).addTo(map); + map.on("mouseout", mapSpy); + layer.on("mouseout", layerSpy); + other.on("mouseout", otherSpy); + happen.mouseout(map._container); + expect(otherSpy.called).not.to.be.ok(); + expect(layerSpy.called).not.to.be.ok(); + expect(mapSpy.calledOnce).to.be.ok(); + }); + + }); + }); diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 9d67761ff4e..0e0d049a18d 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -128,12 +128,14 @@ L.DomEvent = { stopPropagation: function (e) { + L.DomEvent._skipped(e); if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; + // In case of Leaflet event. + L.DomEvent._fakeStop(e); } - L.DomEvent._skipped(e); return this; }, diff --git a/src/map/Map.js b/src/map/Map.js index 21274dc89fb..1e439b68211 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -646,14 +646,20 @@ L.Map = L.Evented.extend({ // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave if (!target && (type === 'mouseover' || type === 'mouseout') && - !L.DomEvent._checkMouse(this._container, e)) { return; } + !L.DomEvent._checkMouse(this._container, e)) { return; } // prevents outline when clicking on keyboard-focusable element if (type === 'mousedown') { L.DomUtil.preventOutline(e.target || e.srcElement); } - this._fireDOMEvent(target || this, e, type); + if (target && target !== this) { + this._fireDOMEvent(target, e, type); + if (type === 'mouseover' || type === 'mouseout') { return; } + } + if (!L.DomEvent._skipped(e)) { // In case the Leaflet event has been stopped on some target listener. + this._fireDOMEvent(this, e, type); + } }, _fireDOMEvent: function (target, e, type) { From d1864cd13878fd832a8b9801f56535110702e19c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 27 May 2015 11:27:37 +0200 Subject: [PATCH 1699/2207] Move 'preclick' event handling around so it propagates before 'click'. --- src/map/Map.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 1e439b68211..9318e7f7e65 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -644,12 +644,19 @@ L.Map = L.Evented.extend({ var target = this._findEventTarget(e.target || e.srcElement), type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; + if (e.type === 'click') { + // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups). + var synth = L.Util.extend({}, e); + synth.type = 'preclick'; + this._handleDOMEvent(synth); + } + // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave if (!target && (type === 'mouseover' || type === 'mouseout') && !L.DomEvent._checkMouse(this._container, e)) { return; } - // prevents outline when clicking on keyboard-focusable element if (type === 'mousedown') { + // prevents outline when clicking on keyboard-focusable element L.DomUtil.preventOutline(e.target || e.srcElement); } @@ -663,7 +670,7 @@ L.Map = L.Evented.extend({ }, _fireDOMEvent: function (target, e, type) { - if (!target.listens(type, true) && (type !== 'click' || !target.listens('preclick', true))) { return; } + if (!target.listens(type, true)) { return; } if (type === 'contextmenu') { L.DomEvent.preventDefault(e); @@ -681,9 +688,6 @@ L.Map = L.Evented.extend({ data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); data.latlng = this.layerPointToLatLng(data.layerPoint); } - if (type === 'click') { - target.fire('preclick', data, true); - } target.fire(type, data, true); }, From d67cbb24c13261b3d2570a9348d9be31e6a84e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 28 May 2015 13:16:56 +0200 Subject: [PATCH 1700/2207] More complete test webpage for #3307 --- debug/tests/mousemove_on_polygons.html | 123 ++++++++++++++++++------- 1 file changed, 91 insertions(+), 32 deletions(-) diff --git a/debug/tests/mousemove_on_polygons.html b/debug/tests/mousemove_on_polygons.html index ea374dae305..96c08acb3de 100644 --- a/debug/tests/mousemove_on_polygons.html +++ b/debug/tests/mousemove_on_polygons.html @@ -1,48 +1,107 @@ - Leaflet debug page + Leaflet debug page - + - + - - - - + + + + + + + + + +
          Enter Move Exit Click
          Triangle 1:
          Triangle 2:
          Map:
          -
          +
          + + + From 54c89258184fd9341c5a0b1de4785572359acf7f Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 1 Jun 2015 22:32:50 +0200 Subject: [PATCH 1701/2207] Add map as layer event parent --- src/core/Events.js | 1 + src/dom/DomEvent.js | 5 ++--- src/layer/Layer.js | 5 +++++ src/map/Map.js | 15 +++++---------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/Events.js b/src/core/Events.js index 6702d2ae43e..9452124e8c8 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -211,6 +211,7 @@ L.Evented = L.Class.extend({ _propagateEvent: function (e) { for (var id in this._eventParents) { + if (e._stopped) { break; } this._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true); } } diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 0e0d049a18d..4f078437f06 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -128,14 +128,13 @@ L.DomEvent = { stopPropagation: function (e) { - L.DomEvent._skipped(e); if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; - // In case of Leaflet event. - L.DomEvent._fakeStop(e); + e._stopped = true; // In case of Leaflet event. } + L.DomEvent._skipped(e); return this; }, diff --git a/src/layer/Layer.js b/src/layer/Layer.js index b34dcc9666a..352f6c407a3 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -67,6 +67,9 @@ L.Layer = L.Evented.extend({ L.Map.include({ addLayer: function (layer) { var id = L.stamp(layer); + + layer.addEventParent(this); + if (this._layers[id]) { return layer; } this._layers[id] = layer; @@ -84,6 +87,8 @@ L.Map.include({ removeLayer: function (layer) { var id = L.stamp(layer); + layer.removeEventParent(this); + if (!this._layers[id]) { return this; } if (this._loaded) { diff --git a/src/map/Map.js b/src/map/Map.js index 9318e7f7e65..9b9373a23e9 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -660,13 +660,7 @@ L.Map = L.Evented.extend({ L.DomUtil.preventOutline(e.target || e.srcElement); } - if (target && target !== this) { - this._fireDOMEvent(target, e, type); - if (type === 'mouseover' || type === 'mouseout') { return; } - } - if (!L.DomEvent._skipped(e)) { // In case the Leaflet event has been stopped on some target listener. - this._fireDOMEvent(this, e, type); - } + this._fireDOMEvent(target || this, e, type); }, _fireDOMEvent: function (target, e, type) { @@ -680,15 +674,16 @@ L.Map = L.Evented.extend({ if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } var data = { - originalEvent: e - }; + originalEvent: e + }, + propagate = (type !== 'mouseover' && type !== 'mouseout'); if (e.type !== 'keypress') { data.containerPoint = target instanceof L.Marker ? this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); data.latlng = this.layerPointToLatLng(data.layerPoint); } - target.fire(type, data, true); + target.fire(type, data, propagate); }, _draggableMoved: function (obj) { From 68195aa2bd159180199c21d300fcf070de1a05ce Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 19 Jun 2015 09:33:57 +0200 Subject: [PATCH 1702/2207] More natural event bubbling --- src/core/Events.js | 1 - src/dom/DomEvent.js | 3 ++- src/layer/Layer.js | 5 ----- src/map/Map.js | 45 ++++++++++++++++++++++++++++----------------- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/core/Events.js b/src/core/Events.js index 9452124e8c8..6702d2ae43e 100644 --- a/src/core/Events.js +++ b/src/core/Events.js @@ -211,7 +211,6 @@ L.Evented = L.Class.extend({ _propagateEvent: function (e) { for (var id in this._eventParents) { - if (e._stopped) { break; } this._eventParents[id].fire(e.type, L.extend({layer: e.target}, e), true); } } diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 4f078437f06..2a87a5e6d32 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -130,9 +130,10 @@ L.DomEvent = { if (e.stopPropagation) { e.stopPropagation(); + } else if (e.originalEvent) { // In case of Leaflet event. + e.originalEvent._stopped = true; } else { e.cancelBubble = true; - e._stopped = true; // In case of Leaflet event. } L.DomEvent._skipped(e); diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 352f6c407a3..b34dcc9666a 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -67,9 +67,6 @@ L.Layer = L.Evented.extend({ L.Map.include({ addLayer: function (layer) { var id = L.stamp(layer); - - layer.addEventParent(this); - if (this._layers[id]) { return layer; } this._layers[id] = layer; @@ -87,8 +84,6 @@ L.Map.include({ removeLayer: function (layer) { var id = L.stamp(layer); - layer.removeEventParent(this); - if (!this._layers[id]) { return this; } if (this._loaded) { diff --git a/src/map/Map.js b/src/map/Map.js index 9b9373a23e9..37b958d8a10 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -601,6 +601,7 @@ L.Map = L.Evented.extend({ if (!L.DomEvent) { return; } this._targets = {}; + this._targets[L.stamp(this._container)] = this; var onOff = remove ? 'off' : 'on'; @@ -623,26 +624,27 @@ L.Map = L.Evented.extend({ this._container.scrollLeft = 0; }, - _findEventTarget: function (src) { + _findEventTargets: function (src, bubble) { + var targets = [], target; while (src) { - var target = this._targets[L.stamp(src)]; + target = this._targets[L.stamp(src)]; if (target) { - return target; + targets.push(target); + if (!bubble) { break; } } if (src === this._container) { break; } src = src.parentNode; } - return null; + return targets; }, _handleDOMEvent: function (e) { if (!this._loaded || L.DomEvent._skipped(e)) { return; } - // find the layer the event is propagating from - var target = this._findEventTarget(e.target || e.srcElement), - type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; + // find the layer the event is propagating from and its parents + var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; if (e.type === 'click') { // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups). @@ -651,39 +653,48 @@ L.Map = L.Evented.extend({ this._handleDOMEvent(synth); } - // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave - if (!target && (type === 'mouseover' || type === 'mouseout') && - !L.DomEvent._checkMouse(this._container, e)) { return; } - if (type === 'mousedown') { // prevents outline when clicking on keyboard-focusable element L.DomUtil.preventOutline(e.target || e.srcElement); } - this._fireDOMEvent(target || this, e, type); + this._fireDOMEvent(e, type); }, - _fireDOMEvent: function (target, e, type) { - if (!target.listens(type, true)) { return; } + _fireDOMEvent: function (e, type) { if (type === 'contextmenu') { L.DomEvent.preventDefault(e); } + var targets = this._findEventTargets(e.target || e.srcElement, !(e.type === 'mouseover' || e.type === 'mouseout')); + + if (!targets.length) { + targets = [this]; + + // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave + if ((type === 'mouseover' || type === 'mouseout') && + !L.DomEvent._checkMouse(this._container, e)) { return; } + } + + var target = targets[0]; // prevents firing click after you just dragged an object if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } var data = { originalEvent: e - }, - propagate = (type !== 'mouseover' && type !== 'mouseout'); + }; if (e.type !== 'keypress') { data.containerPoint = target instanceof L.Marker ? this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); data.latlng = this.layerPointToLatLng(data.layerPoint); } - target.fire(type, data, propagate); + for (var i = 0; i < targets.length; i++) { + if (data.originalEvent._stopped) { break; } + if (!targets[i].listens(type, true)) { continue; } + targets[i].fire(type, data); + } }, _draggableMoved: function (obj) { From f4cc307e70a8a2b9c5f2d069107aeb47fce90f0a Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 24 Jun 2015 08:31:59 +0200 Subject: [PATCH 1703/2207] Add preclick related unitest --- spec/suites/map/MapSpec.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index e1d7ac5be64..4ea8d98d0ba 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -693,6 +693,28 @@ describe("Map", function () { expect(mapSpy.calledOnce).to.be.ok(); }); + it("preclick is fired before click on marker and map", function () { + var called = 0; + var layer = new L.Marker([1, 2]).addTo(map); + layer.on("preclick", function (e) { + expect(called++).to.eql(0); + expect(e.latlng).to.ok(); + }); + layer.on("click", function (e) { + expect(called++).to.eql(2); + expect(e.latlng).to.ok(); + }); + map.on("preclick", function (e) { + expect(called++).to.eql(1); + expect(e.latlng).to.ok(); + }); + map.on("click", function (e) { + expect(called++).to.eql(3); + expect(e.latlng).to.ok(); + }); + happen.click(layer._icon); + }); + }); }); From 50d7121f72b97a9c34fe96e369509f19f40ae135 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 4 Jul 2015 17:25:26 +0200 Subject: [PATCH 1704/2207] Make _fireDOMEvent accept optional targets In the case of canvas path, we can't add the canvas element itself as an interactiveTarget, given that it's big like the path bbox, and thus would make all this bbox target of events (so also clicking outside of the path itself, the layer would fire click event, for example) --- debug/vector/vector-canvas.html | 9 ++++++--- spec/suites/map/MapSpec.js | 30 ++++++++++++++++++++++++++++++ src/layer/vector/Canvas.js | 2 +- src/map/Map.js | 4 ++-- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/debug/vector/vector-canvas.html b/debug/vector/vector-canvas.html index 7216a646ef7..430ed130407 100644 --- a/debug/vector/vector-canvas.html +++ b/debug/vector/vector-canvas.html @@ -29,7 +29,8 @@ for (var i = 0, latlngs = [], len = route.length; i < len; i++) { latlngs.push(new L.LatLng(route[i][0], route[i][1])); } - var path = new L.Polyline(latlngs); + var canvas = L.canvas(); + var path = new L.Polyline(latlngs, {renderer: canvas}); var map = new L.Map('map', {layers: [osm]}); @@ -41,7 +42,8 @@ circleOptions = { color: 'red', fillColor: 'yellow', - fillOpacity: 0.7 + fillOpacity: 0.7, + renderer: canvas }; var circle = new L.Circle(circleLocation, 500000, circleOptions), @@ -79,7 +81,8 @@ var polygon = new L.Polygon([polygonPoints, holePoints], { fillColor: "#333", - color: 'green' + color: 'green', + renderer: canvas }); group.addLayer(polygon); diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 4ea8d98d0ba..43f692c702c 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -644,6 +644,14 @@ describe("Map", function () { expect(spy.calledOnce).to.be.ok(); }); + it("DOM events propagate from canvas polygon to map", function () { + var spy = sinon.spy(); + map.on("mousemove", spy); + var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]], {rendered: L.canvas()}).addTo(map); + happen.mousemove(layer._path); + expect(spy.calledOnce).to.be.ok(); + }); + it("DOM events propagate from marker to map", function () { var spy = sinon.spy(); map.on("mousemove", spy); @@ -663,6 +671,28 @@ describe("Map", function () { expect(mapSpy.called).not.to.be.ok(); }); + it("DOM events fired on polygon can be cancelled before being caught by the map", function () { + var mapSpy = sinon.spy(); + var layerSpy = sinon.spy(); + map.on("mousemove", mapSpy); + var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); + layer.on("mousemove", L.DomEvent.stopPropagation).on("mousemove", layerSpy); + happen.mousemove(layer._path); + expect(layerSpy.calledOnce).to.be.ok(); + expect(mapSpy.called).not.to.be.ok(); + }); + + it("DOM events fired on canvas polygon can be cancelled before being caught by the map", function () { + var mapSpy = sinon.spy(); + var layerSpy = sinon.spy(); + map.on("mousemove", mapSpy); + var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]], {rendered: L.canvas()}).addTo(map); + layer.on("mousemove", L.DomEvent.stopPropagation).on("mousemove", layerSpy); + happen.mousemove(layer._path); + expect(layerSpy.calledOnce).to.be.ok(); + expect(mapSpy.called).not.to.be.ok(); + }); + it("mouseout is only forwared if fired on the original target", function () { var mapSpy = sinon.spy(), layerSpy = sinon.spy(), diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 67ea31b4514..ec2c0042ee4 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -233,7 +233,7 @@ L.Canvas = L.Renderer.extend({ }, _fireEvent: function (layer, e, type) { - this._map._fireDOMEvent(layer, e, type || e.type); + this._map._fireDOMEvent(e, type || e.type, [layer]); }, // TODO _bringToFront & _bringToBack, pretty tricky diff --git a/src/map/Map.js b/src/map/Map.js index 37b958d8a10..7df04481f6e 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -661,12 +661,12 @@ L.Map = L.Evented.extend({ this._fireDOMEvent(e, type); }, - _fireDOMEvent: function (e, type) { + _fireDOMEvent: function (e, type, targets) { if (type === 'contextmenu') { L.DomEvent.preventDefault(e); } - var targets = this._findEventTargets(e.target || e.srcElement, !(e.type === 'mouseover' || e.type === 'mouseout')); + targets = (targets || []).concat(this._findEventTargets(e.target || e.srcElement, !(e.type === 'mouseover' || e.type === 'mouseout'))); if (!targets.length) { targets = [this]; From d86c6002d7914a3d48c70e1392bba0d2d2189c3c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 3 Jul 2015 18:10:53 +0300 Subject: [PATCH 1705/2207] minor cleanup --- src/map/Map.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 7df04481f6e..d04784d350e 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -666,14 +666,15 @@ L.Map = L.Evented.extend({ if (type === 'contextmenu') { L.DomEvent.preventDefault(e); } - targets = (targets || []).concat(this._findEventTargets(e.target || e.srcElement, !(e.type === 'mouseover' || e.type === 'mouseout'))); + + var isHover = type === 'mouseover' || type === 'mouseout'; + targets = (targets || []).concat(this._findEventTargets(e.target || e.srcElement, !isHover)); if (!targets.length) { targets = [this]; // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave - if ((type === 'mouseover' || type === 'mouseout') && - !L.DomEvent._checkMouse(this._container, e)) { return; } + if (isHover && !L.DomEvent._checkMouse(this._container, e)) { return; } } var target = targets[0]; @@ -682,18 +683,21 @@ L.Map = L.Evented.extend({ if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } var data = { - originalEvent: e - }; + originalEvent: e + }; + if (e.type !== 'keypress') { data.containerPoint = target instanceof L.Marker ? this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); data.latlng = this.layerPointToLatLng(data.layerPoint); } + for (var i = 0; i < targets.length; i++) { - if (data.originalEvent._stopped) { break; } - if (!targets[i].listens(type, true)) { continue; } - targets[i].fire(type, data); + if (targets[i].listens(type, true)) { + targets[i].fire(type, data); + if (data.originalEvent._stopped) { return; } + } } }, From fd1b94550c64806b868c439d8b1a0d87f70d6413 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 6 Jul 2015 11:13:09 +0200 Subject: [PATCH 1706/2207] Fix popup broken since 9b7f24f5f6efb94be2a96d7d7f4c604783135d10 Popup where binded by the LayerGroup, which was not finring the click event, because not propagated from the layers --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index d04784d350e..663e963b33f 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -695,7 +695,7 @@ L.Map = L.Evented.extend({ for (var i = 0; i < targets.length; i++) { if (targets[i].listens(type, true)) { - targets[i].fire(type, data); + targets[i].fire(type, data, true); if (data.originalEvent._stopped) { return; } } } From e71bd4b71f0493cb8570b4b4ca5bae2505163c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 6 Jul 2015 16:57:46 +0200 Subject: [PATCH 1707/2207] Make L.TileLayer.getTileSize aware of non-square tiles, #3600 --- src/layer/tile/TileLayer.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 1a1801c6980..d9e54e44e1b 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -101,16 +101,16 @@ L.TileLayer = L.GridLayer.extend({ done(e, tile); }, - _getTileSize: function () { + getTileSize: function () { var map = this._map, - options = this.options, - zoom = this._tileZoom + options.zoomOffset, - zoomN = options.maxNativeZoom; + tileSize = L.GridLayer.prototype.getTileSize.call(this), + zoom = this._tileZoom + this.options.zoomOffset, + zoomN = this.options.maxNativeZoom; // increase tile size when overscaling return zoomN !== null && zoom > zoomN ? - Math.round(options.tileSize / map.getZoomScale(zoomN, zoom)) : - options.tileSize; + Math.round(tileSize / map.getZoomScale(zoomN, zoom)) : + tileSize; }, _onTileRemove: function (e) { From 12c1daec24c432c7dd5c33a3f85d1a960cdbb23e Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Mon, 22 Jun 2015 22:35:22 -0500 Subject: [PATCH 1708/2207] GeoJSON object array documentation --- examples/geojson.html | 11 +++++++++++ reference.html | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/examples/geojson.html b/examples/geojson.html index 4ddb2bea6c5..fbcb19c4f85 100644 --- a/examples/geojson.html +++ b/examples/geojson.html @@ -113,6 +113,17 @@

          The GeoJSON layer

          L.geoJson(geojsonFeature).addTo(map);
          +

          GeoJSON objects may also be passed as an array of valid GeoJSON objects.

          + +
          var myLines = [{
          +	"type": "LineString",
          +	"coordinates": [[-100, 40], [-105, 45], [-110, 55]]
          +}, {
          +	"type": "LineString",
          +	"coordinates": [[-105, 40], [-110, 45], [-115, 55]]
          +}];
          +
          +

          Alternatively, we could create an empty GeoJSON layer and assign it to a variable so that we can add more features to it later.

          var myLayer = L.geoJson().addTo(map);
          diff --git a/reference.html b/reference.html
          index 162f3974ee9..0ea3c86eb60 100644
          --- a/reference.html
          +++ b/reference.html
          @@ -3292,7 +3292,7 @@ 

          Events

          GeoJson

          -

          Represents a GeoJSON layer. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

          +

          Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse GeoJSON data and display it on the map. Extends FeatureGroup.

          L.geoJson(data, {
           	style: function (feature) {
          
          From d2513b2d53ba64217b61456844e7c47f6bb9ef65 Mon Sep 17 00:00:00 2001
          From: Vladimir Agafonkin 
          Date: Tue, 7 Jul 2015 16:32:51 +0300
          Subject: [PATCH 1709/2207] fix maxNativeZoom regression, thanks @ktoto
          
          ---
           src/layer/tile/TileLayer.js | 2 +-
           1 file changed, 1 insertion(+), 1 deletion(-)
          
          diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js
          index d9e54e44e1b..5b5a132238e 100644
          --- a/src/layer/tile/TileLayer.js
          +++ b/src/layer/tile/TileLayer.js
          @@ -109,7 +109,7 @@ L.TileLayer = L.GridLayer.extend({
           
           		// increase tile size when overscaling
           		return zoomN !== null && zoom > zoomN ?
          -				Math.round(tileSize / map.getZoomScale(zoomN, zoom)) :
          +				tileSize.divideBy(map.getZoomScale(zoomN, zoom)).round() :
           				tileSize;
           	},
           
          
          From e7f981257f9971a386137bc2eb301499a046f0eb Mon Sep 17 00:00:00 2001
          From: Vladimir Agafonkin 
          Date: Wed, 8 Jul 2015 17:27:02 +0300
          Subject: [PATCH 1710/2207] fix blog post description
          
          ---
           _posts/2015-07-01-leaflet-is-alive-and-kicking.md | 2 +-
           1 file changed, 1 insertion(+), 1 deletion(-)
          
          diff --git a/_posts/2015-07-01-leaflet-is-alive-and-kicking.md b/_posts/2015-07-01-leaflet-is-alive-and-kicking.md
          index c6ec8f1c50b..110c95a35c2 100644
          --- a/_posts/2015-07-01-leaflet-is-alive-and-kicking.md
          +++ b/_posts/2015-07-01-leaflet-is-alive-and-kicking.md
          @@ -1,7 +1,7 @@
           ---
           layout: post
           title: Leaflet is Alive and Kicking, Stay Tuned for 1.0!
          -description: Leaflet 0.7 Released — with IE11 touch support, upscaling tiles and tons of other improvements and bugfixes! Meanwhile, I've joined the MapBox team full-time.
          +description: We're on the finishing line of releasing Leaflet 1.0 — the biggest and greatest Leaflet release _ever_. Meanwhile, I'm happy to present you the new redesigned Leaflet website!
           author: Vladimir Agafonkin
           authorsite: http://agafonkin.com/en
           ---
          
          From 39bf8e209c54f54855c3ed2b1261753c3f8d8998 Mon Sep 17 00:00:00 2001
          From: Vladimir Agafonkin 
          Date: Wed, 8 Jul 2015 17:27:50 +0300
          Subject: [PATCH 1711/2207] no formatting in blog descriptions
          
          ---
           _posts/2015-07-01-leaflet-is-alive-and-kicking.md | 2 +-
           1 file changed, 1 insertion(+), 1 deletion(-)
          
          diff --git a/_posts/2015-07-01-leaflet-is-alive-and-kicking.md b/_posts/2015-07-01-leaflet-is-alive-and-kicking.md
          index 110c95a35c2..0b182a5ab60 100644
          --- a/_posts/2015-07-01-leaflet-is-alive-and-kicking.md
          +++ b/_posts/2015-07-01-leaflet-is-alive-and-kicking.md
          @@ -1,7 +1,7 @@
           ---
           layout: post
           title: Leaflet is Alive and Kicking, Stay Tuned for 1.0!
          -description: We're on the finishing line of releasing Leaflet 1.0 — the biggest and greatest Leaflet release _ever_. Meanwhile, I'm happy to present you the new redesigned Leaflet website!
          +description: We're on the finishing line of releasing Leaflet 1.0 — the biggest and greatest Leaflet release ever. Meanwhile, I'm happy to present you the new redesigned Leaflet website!
           author: Vladimir Agafonkin
           authorsite: http://agafonkin.com/en
           ---
          
          From 74018f284e8c58d022a9a127406867438aa2a4d0 Mon Sep 17 00:00:00 2001
          From: Yohan Boniface 
          Date: Wed, 8 Jul 2015 11:34:19 +0200
          Subject: [PATCH 1712/2207] Add nonBubblingEvents option (fix #3604)
          
          ---
           spec/suites/layer/marker/MarkerSpec.js | 30 ++++++++++++++++++++++++++
           src/core/Util.js                       |  7 ++++++
           src/layer/Layer.js                     |  3 ++-
           src/layer/marker/Marker.js             |  1 +
           src/map/Map.js                         |  3 ++-
           5 files changed, 42 insertions(+), 2 deletions(-)
          
          diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js
          index be8abee067c..a1e02ac59a1 100644
          --- a/spec/suites/layer/marker/MarkerSpec.js
          +++ b/spec/suites/layer/marker/MarkerSpec.js
          @@ -207,5 +207,35 @@ describe("Marker", function () {
           			expect(spy.calledTwice).to.be.ok();
           		});
           
          +		it("do not propagate click event", function () {
          +			var spy = sinon.spy();
          +			var spy2 = sinon.spy();
          +			var mapSpy = sinon.spy();
          +			var marker = new L.Marker(new L.LatLng(55.8, 37.6));
          +			map.addLayer(marker);
          +			marker.on('click', spy);
          +			marker.on('click', spy2);
          +			map.on('click', mapSpy);
          +			happen.click(marker._icon);
          +			expect(spy.called).to.be.ok();
          +			expect(spy2.called).to.be.ok();
          +			expect(mapSpy.called).not.to.be.ok();
          +		});
          +
          +		it("do not propagate dblclick event", function () {
          +			var spy = sinon.spy();
          +			var spy2 = sinon.spy();
          +			var mapSpy = sinon.spy();
          +			var marker = new L.Marker(new L.LatLng(55.8, 37.6));
          +			map.addLayer(marker);
          +			marker.on('dblclick', spy);
          +			marker.on('dblclick', spy2);
          +			map.on('dblclick', mapSpy);
          +			happen.dblclick(marker._icon);
          +			expect(spy.called).to.be.ok();
          +			expect(spy2.called).to.be.ok();
          +			expect(mapSpy.called).not.to.be.ok();
          +		});
          +
           	});
           });
          diff --git a/src/core/Util.js b/src/core/Util.js
          index 5927ef0177e..d7c681c5c33 100644
          --- a/src/core/Util.js
          +++ b/src/core/Util.js
          @@ -147,6 +147,13 @@ L.Util = {
           		return (Object.prototype.toString.call(obj) === '[object Array]');
           	},
           
          +	indexOf: function (array, el) {
          +		for (var i = 0; i < array.length; i++) {
          +			if (array[i] === el) { return i; }
          +		}
          +		return -1;
          +	},
          +
           	// minimal image URI, set to an image when disposing to flush memory
           	emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
           };
          diff --git a/src/layer/Layer.js b/src/layer/Layer.js
          index b34dcc9666a..10fff4c61a5 100644
          --- a/src/layer/Layer.js
          +++ b/src/layer/Layer.js
          @@ -2,7 +2,8 @@
           L.Layer = L.Evented.extend({
           
           	options: {
          -		pane: 'overlayPane'
          +		pane: 'overlayPane',
          +		nonBubblingEvents: []  // Array of events that should not be bubbled to DOM parents (like the map)
           	},
           
           	addTo: function (map) {
          diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js
          index 13cfb6186cb..d25e986f558 100644
          --- a/src/layer/marker/Marker.js
          +++ b/src/layer/marker/Marker.js
          @@ -6,6 +6,7 @@ L.Marker = L.Layer.extend({
           
           	options: {
           		pane: 'markerPane',
          +		nonBubblingEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'],
           
           		icon: new L.Icon.Default(),
           		// title: '',
          diff --git a/src/map/Map.js b/src/map/Map.js
          index 663e963b33f..1899470ee8a 100644
          --- a/src/map/Map.js
          +++ b/src/map/Map.js
          @@ -696,7 +696,8 @@ L.Map = L.Evented.extend({
           		for (var i = 0; i < targets.length; i++) {
           			if (targets[i].listens(type, true)) {
           				targets[i].fire(type, data, true);
          -				if (data.originalEvent._stopped) { return; }
          +				if (data.originalEvent._stopped
          +					|| (targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; }
           			}
           		}
           	},
          
          From 0821c7345d6e0f382f38cc9d3a3dfc7161654216 Mon Sep 17 00:00:00 2001
          From: Lyzi Diamond 
          Date: Tue, 7 Jul 2015 17:20:26 -0700
          Subject: [PATCH 1713/2207] Update Mapbox examples to v4 API and replace
           examples map IDs
          
          ---
           _layouts/default.html                |  9 ++++-----
           _layouts/v2.html                     | 16 +++++++---------
           examples/choropleth-example.html     |  4 ++--
           examples/choropleth.md               | 11 ++++++-----
           examples/custom-icons.md             |  4 ++--
           examples/geojson-example.html        |  4 ++--
           examples/geojson.html                |  2 +-
           examples/layers-control-example.html |  8 ++++----
           examples/layers-control.md           |  4 ++--
           examples/mobile-example.html         |  4 ++--
           examples/mobile.md                   |  2 +-
           examples/quick-start-example.html    |  4 ++--
           examples/quick-start.md              |  8 ++++----
           13 files changed, 39 insertions(+), 41 deletions(-)
          
          diff --git a/_layouts/default.html b/_layouts/default.html
          index fd1e7485e42..5e2b11870cf 100644
          --- a/_layouts/default.html
          +++ b/_layouts/default.html
          @@ -41,12 +41,11 @@
           	{% if page.css %}{% endif %}
           
           	
          diff --git a/_layouts/v2.html b/_layouts/v2.html
          index 32af78f4d0e..73ca2026903 100644
          --- a/_layouts/v2.html
          +++ b/_layouts/v2.html
          @@ -40,17 +40,15 @@
           	{% if page.css %}{% endif %}
           
           	
          diff --git a/examples/choropleth-example.html b/examples/choropleth-example.html
          index dec2640f5e2..8bd916a424b 100644
          --- a/examples/choropleth-example.html
          +++ b/examples/choropleth-example.html
          @@ -51,12 +51,12 @@
           
           		var map = L.map('map').setView([37.8, -96], 4);
           
          -		L.tileLayer('https://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png', {
          +		L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6IjZjNmRjNzk3ZmE2MTcwOTEwMGY0MzU3YjUzOWFmNWZhIn0.Y8bhBaUMqFiPrDRW9hieoQ', {
           			maxZoom: 18,
           			attribution: 'Map data © OpenStreetMap contributors, ' +
           				'CC-BY-SA, ' +
           				'Imagery © Mapbox',
          -			id: 'examples.map-20v6611k'
          +			id: 'mapbox.light'
           		}).addTo(map);
           
           
          diff --git a/examples/choropleth.md b/examples/choropleth.md
          index 42d5a8614b6..4dda687f157 100644
          --- a/examples/choropleth.md
          +++ b/examples/choropleth.md
          @@ -64,10 +64,11 @@ The GeoJSON with state shapes was kindly shared by [Mike Bostock](http://bost.oc
           
           Let's display our states data on a map with a custom Mapbox style for nice grayscale tiles that look perfect as a background for visualizations:
           
          +	var mapboxAccessToken = {your access token here};
           	var map = L.map('map').setView([37.8, -96], 4);
           
          -	L.tileLayer('http://{s}.tiles.mapbox.com/{id}/{z}/{x}/{y}.png', {
          -		id: 'examples.map-20v6611k',
          +	L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=' + mapboxAccessToken, {
          +		id: 'mapbox.light',
           		attribution: ...
           	}).addTo(map);
           
          @@ -262,18 +263,18 @@ Enjoy the result on [the top of this page](#map) or on a [separate page](choropl
           
           
          -	
          -
          -	
          -	
          -	
          -
          -	{% if page.css %}{% endif %}
          -
          -	
          -
          -
          -	
          -

          Leaflet

          -

          An Open-Source JavaScript Library for Mobile-Friendly Interactive Maps

          - - - - - - {{ content }} - - -
          - - - - - - - - diff --git a/_layouts/v2.html b/_layouts/v2.html index 73ca2026903..c93b718f407 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -122,38 +122,23 @@

          an open-source JavaScript library
          for mobile-friendly in + + + + +
          +
          + + +
          - - - - -
          -
          - - -
          diff --git a/debug/tests/canvasloop.html b/debug/tests/canvasloop.html index d8a2ed41dec..6e64c9089b5 100644 --- a/debug/tests/canvasloop.html +++ b/debug/tests/canvasloop.html @@ -1,9 +1,6 @@ - @@ -20,7 +17,8 @@ //Init a map, and attempt a locate. var map = L.map('map', { center: [39.84, -96.591], - zoom: 4 + zoom: 4, + preferCanvas: true }).locate(); L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { diff --git a/debug/tests/click_on_canvas.html b/debug/tests/click_on_canvas.html index ac9b21f4e12..6b20a623e03 100644 --- a/debug/tests/click_on_canvas.html +++ b/debug/tests/click_on_canvas.html @@ -11,7 +11,6 @@ - - - - - - -
          - - diff --git a/debug/vector/vector-canvas.html b/debug/vector/vector-canvas.html index 430ed130407..c1749115fde 100644 --- a/debug/vector/vector-canvas.html +++ b/debug/vector/vector-canvas.html @@ -7,9 +7,6 @@ - @@ -32,7 +29,7 @@ var canvas = L.canvas(); var path = new L.Polyline(latlngs, {renderer: canvas}); - var map = new L.Map('map', {layers: [osm]}); + var map = new L.Map('map', {layers: [osm], preferCanvas: true}); var group = new L.LayerGroup(); diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index dfb8f62476b..1c0ac5cd64c 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -86,7 +86,7 @@ L.Map.include({ var renderer = layer.options.renderer || this._getPaneRenderer(layer.options.pane) || this.options.renderer || this._renderer; if (!renderer) { - renderer = this._renderer = window.L_PREFER_CANVAS ? L.canvas() : L.svg(); + renderer = this._renderer = (this.options.preferCanvas && L.canvas()) || L.svg(); } if (!this.hasLayer(renderer)) { From 3e5c29abd95a399e0a598c7f8df03de63682992f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 14 Jul 2015 15:58:23 +0300 Subject: [PATCH 1728/2207] changelog improvements --- CHANGELOG.md | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14db92eb438..654f6a54585 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,9 @@ An in-progress version being developed on the `master` branch. Includes `stable` This version contains a lot of beneficial but potentially breaking changes (especially if you're a plugin author), so please read through the changes carefully before upgrading. -### Vectors refactoring +### Vectors API improvements -Leaflet vector layers rendering got a major rewrite, making it possible to switch between rendering backends (Canvas, SVG) dynamically (and even use both for different layers at the same time), have more than one physical pane for vector layers, significantly improving Canvas performance and adding retina support, getting rid of ugly hacks and generally making the code much cleaner. Main PR [#2290](https://github.com/Leaflet/Leaflet/pull/2290). +Leaflet vector layers rendering got a major rewrite, making it possible to switch between rendering backends (Canvas, SVG) dynamically (and even use both for different layers at the same time), have more than one physical pane for vector layers, significantly improving performance, adding Canvas retina support, getting rid of ugly hacks and generally making the code much cleaner. Main PR [#2290](https://github.com/Leaflet/Leaflet/pull/2290). * Added `Renderer` layer (inherited by SVG/Canvas implementations) that handles renderer bounds and zoom animation. * Added `SVG` & `Canvas` classes that now contain all renderer-specific code for vector layers and can be added as layers to the map. @@ -32,7 +32,7 @@ Leaflet vector layers rendering got a major rewrite, making it possible to switc * Added the ability to specify a custom pane for vector layers (making it possible to easily do stacks like vectors-tiles-vectors with proper z-index order) (by [@Jakobud](https://github.com/Jakobud)). [#3266](https://github.com/Leaflet/Leaflet/pull/3266) [#2786](https://github.com/Leaflet/Leaflet/pull/2786) * Added vector layers `fillRule` option (by [@bullgare](https://github.com/bullgare)). [#2834](https://github.com/Leaflet/Leaflet/pull/2834) -### Layers refactoring +### Layers API improvements All Leaflet layers (including markers, popups, tile and vector layers) have been refactored to have a common parent, `Layer` class, that shares the basic logic of adding and removing. The leads to the following changes (main PR [#2266](https://github.com/Leaflet/Leaflet/pull/2266)): @@ -58,11 +58,11 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been In addition, layer events implementation was rewritten to use **event delegation**, significantly improving add/remove performance and memory footprint. [#3032](https://github.com/Leaflet/Leaflet/pull/3032) [#46](https://github.com/Leaflet/Leaflet/issues/46) -### TileLayer & Projections refactoring +### TileLayer & Projections API improvements TileLayer code and everything projections-related has undergone a major refactoring, documented in PR [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): -#### TileLayer-related changes +#### TileLayer API improvements These changes make implementing custom grid-like layers for Leaflet much easier. @@ -71,7 +71,7 @@ These changes make implementing custom grid-like layers for Leaflet much easier. * Improved tile wrapping and bounding logic in `TileLayer` to work transparently and completely depent on the CRS used; removed the need for `TileLayer` hacks when using custom projections. * Removed `url` property in `tileload` and `tileloadstart` events (get it through `tile.src`). -#### Projections-related changes +#### Projections API improvements These changes were targeted at removing any hardcoded projection-specific logic accross Leaflet classes, making it transparent and driven by the chosen CRS. They make using Leaflet with custom projections (including flat maps) much easier, and remove the need for ugly hacks in the [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. @@ -91,11 +91,16 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed scale control precision in non-EPSG:3857 projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) * Fixed `ImageOverlay` not working properly in some non-standard projections. [#3011](https://github.com/Leaflet/Leaflet/issues/3011) -### Animations refactoring +### UX improvements * Improved panning inertia behavior so that there are no tearing during animation when panning around quickly. [#2360](https://github.com/Leaflet/Leaflet/issues/2360) +* Improved inertial scrolling to have a nicer, more natural feel (by [@RickMohr](https://github.com/RickMohr)). [Leaflet/Leaflet#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3062](https://github.com/Leaflet/Leaflet/issues/3062) [#2987](https://github.com/Leaflet/Leaflet/issues/2987) +* Added popup fade out animation. +* Improved keyboard support to ignore keystrokes with modifier keys (Ctrl, Alt, Meta) to not interfere with OS shortcuts. +* Made popup to close when pressing Escape (by [@snkashis](https://github.com/snkashis)). [#951](https://github.com/Leaflet/Leaflet/issues/951) [#3000](https://github.com/Leaflet/Leaflet/pull/3000) +* Improved keyboard zoom to zoom by 3 levels if shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)). [#3024](https://github.com/Leaflet/Leaflet/pull/3024) -## Other performance improvements +### Misc. performance improvements * Significantly [improved](http://jsperf.com/leaflet-parsefloat-in-latlng/2) `LatLng` creation performance (8x). * Improved performance of layer objects construction. @@ -103,14 +108,6 @@ These changes were targeted at removing any hardcoded projection-specific logic * Improved Leaflet events and DOM events memory footprint. * Improved `Evented` `off` performance by about 2 times. -### Misc usability improvements - -* Improved inertial scrolling to have a nicer, more natural feel (by [@RickMohr](https://github.com/RickMohr)). [Leaflet/Leaflet#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3062](https://github.com/Leaflet/Leaflet/issues/3062) [#2987](https://github.com/Leaflet/Leaflet/issues/2987) -* Added popup fade out animation. -* Improved keyboard support to ignore keystrokes with modifier keys (Ctrl, Alt, Meta) to not interfere with OS shortcuts. -* Made popup to close when pressing Escape (by [@snkashis](https://github.com/snkashis)). [#951](https://github.com/Leaflet/Leaflet/issues/951) [#3000](https://github.com/Leaflet/Leaflet/pull/3000) -* Improved keyboard zoom to zoom by 3 levels if shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)). [#3024](https://github.com/Leaflet/Leaflet/pull/3024) - ### Other breaking API changes * Changed `DomUtil` `off` to require `context` attribute if you remove a listener that was previously added with a particular context. @@ -214,6 +211,7 @@ These changes were targeted at removing any hardcoded projection-specific logic * Added a plugin guide section on module loaders and publishing plugins (by [@patrickarlt](https://github.com/patrickarlt)). [#2955](https://github.com/Leaflet/Leaflet/pull/2955) [Leaflet/Leaflet#2955](https://github.com/Leaflet/Leaflet/pull/2955) * Fixed the build system to work in non-git Leaflet folder (by [@cschwarz](https://github.com/cschwarz)). [#2758](https://github.com/Leaflet/Leaflet/pull/2758) + ## 0.7.3 (May 23, 2014) * Added proper **bower** and **component** support (by [@calvinmetcalf](https://github.com/calvinmetcalf)). [#2561](https://github.com/Leaflet/Leaflet/pull/2561) [#1903](https://github.com/Leaflet/Leaflet/issues/1903) From 4d26d9103af08fe5a48e4f27ba4220ebb71e7e53 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 14 Jul 2015 16:54:19 +0300 Subject: [PATCH 1729/2207] changelog updates about animations --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 654f6a54585..182e2be040e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,6 +91,15 @@ These changes were targeted at removing any hardcoded projection-specific logic * Fixed scale control precision in non-EPSG:3857 projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) * Fixed `ImageOverlay` not working properly in some non-standard projections. [#3011](https://github.com/Leaflet/Leaflet/issues/3011) + +### Animations improvements and fractional zoom + +Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https://github.com/Leaflet/Leaflet/pull/2382)), bringing improvements such as: + +- Multi-level tile buffering for more seamless zooming experience with less flickering +- Optimal path animation (`map.flyTo`) for zooming to a particular place in a curve (simultaneously zooming and panning) +- Fractional zoom support — now you can do things like `map.setZoom(12.45)` and it just works. + ### UX improvements * Improved panning inertia behavior so that there are no tearing during animation when panning around quickly. [#2360](https://github.com/Leaflet/Leaflet/issues/2360) @@ -144,6 +153,7 @@ These changes were targeted at removing any hardcoded projection-specific logic * Added `TileLayer.WMS` `uppercase` option (now `false` by default) (by [@kdeloach](https://github.com/kdeloach)). [#2831](https://github.com/Leaflet/Leaflet/pull/2831) [#1751](https://github.com/Leaflet/Leaflet/issues/1751) * Added `ImageOverlay` `alt` option (by [@francis-liberty](https://github.com/francis-liberty)). [#2767](https://github.com/Leaflet/Leaflet/pull/2767) [#2564](https://github.com/Leaflet/Leaflet/issues/2564) * Improved `L.Util.extend` performance (by [@fab1an](https://github.com/fab1an)). [#2746](https://github.com/Leaflet/Leaflet/pull/2746) +* Added `Map` `stop` method for stopping panning or `flyTo` animation. ### Bugfixes From 46d2d6afb2bfc2035338a5992916d0ecdbdbc055 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 14 Jul 2015 17:20:58 +0300 Subject: [PATCH 1730/2207] final 1.0-beta1 changelog update --- CHANGELOG.md | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 182e2be040e..946fb5451b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,13 @@ Leaflet Changelog ## 1.0-dev (master) -An in-progress version being developed on the `master` branch. Includes `stable` branch fixes. +An in-progress version being developed on the `master` branch. No changes since the last tagged release yet. -This version contains a lot of beneficial but potentially breaking changes (especially if you're a plugin author), so please read through the changes carefully before upgrading. +## 1.0-beta1 (July 14, 2015) + +The first beta of the huge, long-awaited Leaflet 1.0 release. + +This version contains a lot of beneficial but potentially breaking changes (especially if you're a plugin author), so please read through the changes carefully if your code breaks after upgrading. ### Vectors API improvements @@ -31,6 +35,7 @@ Leaflet vector layers rendering got a major rewrite, making it possible to switc * Changed `Polygon` `getLatLngs` to always return an array of rings (nested array) by [@yohanboniface](https://github.com/yohanboniface)). [#2618](https://github.com/Leaflet/Leaflet/issues/2618) [#3386](https://github.com/Leaflet/Leaflet/pull/3386) [Leaflet/Leaflet#3279](https://github.com/Leaflet/Leaflet/pull/3279) [#2648](https://github.com/Leaflet/Leaflet/issues/2648) * Added the ability to specify a custom pane for vector layers (making it possible to easily do stacks like vectors-tiles-vectors with proper z-index order) (by [@Jakobud](https://github.com/Jakobud)). [#3266](https://github.com/Leaflet/Leaflet/pull/3266) [#2786](https://github.com/Leaflet/Leaflet/pull/2786) * Added vector layers `fillRule` option (by [@bullgare](https://github.com/bullgare)). [#2834](https://github.com/Leaflet/Leaflet/pull/2834) +* Removed `L_PREFER_CANVAS` global switch and added `Map` `preferCanvas` option instead (by [@yohanboniface](https://github.com/yohanboniface)). [#3623](https://github.com/Leaflet/Leaflet/pull/3623) ### Layers API improvements @@ -45,7 +50,7 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Simplified map panes — removed `objectsPane`, all panes are on the same level now. * Added `shadowPane` option to markers as well. * Added `getEvents` method to all layers that returns an `{event: listener, ...}` hash; layers now manage its listeners automatically without having to do this in `onAdd`/`onRemove`. -* Added `togglePopup`, `setPopupContent`, `getPopup` methods to all layers. [#2279](https://github.com/Leaflet/Leaflet/issues/2279) [#2292](https://github.com/Leaflet/Leaflet/issues/2292) +* Added `togglePopup`, `setPopupContent`, `getPopup`, `isPopupOpen` methods to all layers. [#2279](https://github.com/Leaflet/Leaflet/issues/2279) [#2292](https://github.com/Leaflet/Leaflet/issues/2292) * Improved performance of adding/removing layers with layers control present (instead of listening to any layer add/remove, the control only listens to layers added in configuration). * Fixed `FeatureGroup` `getBounds` to work correctly when containing circle markers. * Removed `Map` `tilelayersload` event. @@ -55,6 +60,9 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Added `ImageOverlay` interactivity (mouse events, etc.) (by [@snkashis](https://github.com/snkashis)). [#3009](https://github.com/Leaflet/Leaflet/pull/3009) [#1727](https://github.com/Leaflet/Leaflet/issues/1727) * Added `ImageOverlay` `getBounds` (by [@brunob](https://github.com/brunob)). [#2848](https://github.com/Leaflet/Leaflet/pull/2848) * Renamed `clickable` option to `interactive` (by [@AndriiHeonia](https://github.com/AndriiHeonia)). [#2838](https://github.com/Leaflet/Leaflet/pull/2838) [#2499](https://github.com/Leaflet/Leaflet/issues/2499) +* Changed the default z-index of panes to be bigger, leaving more room for customization (by [@patrickarlt](https://github.com/patrickarlt)). [#3591](https://github.com/Leaflet/Leaflet/pull/3591) +* Improved DOM event bubbling mechanism for layers (by [@yohanboniface](https://github.com/yohanboniface)). [Leaflet/Leaflet#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3450](https://github.com/Leaflet/Leaflet/pull/3450) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) +* Added `nonBubblingEvents` option to layers (by [@yohanboniface](https://github.com/yohanboniface)). [#3605](https://github.com/Leaflet/Leaflet/pull/3605) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3604](https://github.com/Leaflet/Leaflet/issues/3604) In addition, layer events implementation was rewritten to use **event delegation**, significantly improving add/remove performance and memory footprint. [#3032](https://github.com/Leaflet/Leaflet/pull/3032) [#46](https://github.com/Leaflet/Leaflet/issues/46) @@ -69,6 +77,7 @@ These changes make implementing custom grid-like layers for Leaflet much easier. * Moved most of the `TileLayer` logic into the new `GridLayer` class (which `TileLayer` now inherits, extending it with logic specific to tile servers). * Removed `TileLayer.Canvas` in favor of the much more flexible and powerful `GridLayer`. * Improved tile wrapping and bounding logic in `TileLayer` to work transparently and completely depent on the CRS used; removed the need for `TileLayer` hacks when using custom projections. +* Added non-square tiles support (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3573](https://github.com/Leaflet/Leaflet/pull/3573) [#3570](https://github.com/Leaflet/Leaflet/issues/3570) * Removed `url` property in `tileload` and `tileloadstart` events (get it through `tile.src`). #### Projections API improvements @@ -99,6 +108,7 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: - Multi-level tile buffering for more seamless zooming experience with less flickering - Optimal path animation (`map.flyTo`) for zooming to a particular place in a curve (simultaneously zooming and panning) - Fractional zoom support — now you can do things like `map.setZoom(12.45)` and it just works. +- Layers now rely on `zoom` event in addition to `viewreset` for frame-by-frame zoom animations. [#3278](https://github.com/Leaflet/Leaflet/pull/3278) ### UX improvements @@ -108,6 +118,7 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: * Improved keyboard support to ignore keystrokes with modifier keys (Ctrl, Alt, Meta) to not interfere with OS shortcuts. * Made popup to close when pressing Escape (by [@snkashis](https://github.com/snkashis)). [#951](https://github.com/Leaflet/Leaflet/issues/951) [#3000](https://github.com/Leaflet/Leaflet/pull/3000) * Improved keyboard zoom to zoom by 3 levels if shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)). [#3024](https://github.com/Leaflet/Leaflet/pull/3024) +* Improved layers control to become scrollable when there are too many layers (by [@rowanwins](https://github.com/rowanwins)). [#3571](https://github.com/Leaflet/Leaflet/pull/3571) [#3167](https://github.com/Leaflet/Leaflet/issues/3167) ### Misc. performance improvements @@ -154,6 +165,9 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: * Added `ImageOverlay` `alt` option (by [@francis-liberty](https://github.com/francis-liberty)). [#2767](https://github.com/Leaflet/Leaflet/pull/2767) [#2564](https://github.com/Leaflet/Leaflet/issues/2564) * Improved `L.Util.extend` performance (by [@fab1an](https://github.com/fab1an)). [#2746](https://github.com/Leaflet/Leaflet/pull/2746) * Added `Map` `stop` method for stopping panning or `flyTo` animation. +* Added `Map` `maxBoundsViscosity` option that controls how much the map resits dragging out of max bounds (set to `1` for a hard limit) (by [@IvanSanchez](https://github.com/IvanSanchez)). [#2224](https://github.com/Leaflet/Leaflet/pull/2224) [#3510](https://github.com/Leaflet/Leaflet/pull/3510) [#1673](https://github.com/Leaflet/Leaflet/issues/1673) +* Added `Bounds` and `LatLngBounds` `overlaps` method (by [@IvanSanchez](https://github.com/IvanSanchez)). [#2981](https://github.com/Leaflet/Leaflet/issues/2981) [#3508](https://github.com/Leaflet/Leaflet/pull/3508) +* Added `ImageOverlay` `crossOrigin` option (by [@patrickarlt](https://github.com/patrickarlt)). [#3594](https://github.com/Leaflet/Leaflet/pull/3594) [#2621](https://github.com/Leaflet/Leaflet/pull/2621) ### Bugfixes @@ -210,6 +224,13 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: * Fixed a memory leak with `Marker` `setIcon` (by [@jfgodoy](https://github.com/jfgodoy)). [#2811](https://github.com/Leaflet/Leaflet/pull/2811) * Fixed `LatLng` `distanceTo` to not return `NaN` on equal locations. [#2705](https://github.com/Leaflet/Leaflet/issues/2705) * Fixed a bug where `TileLayer` `maxNativeZoom` didn't work properly with `bounds` option set (by [@mlegenhausen](https://github.com/mlegenhausen)). [#2725](https://github.com/Leaflet/Leaflet/pull/2725) [#2704](https://github.com/Leaflet/Leaflet/issues/2704) +* Fixed a bug where tiles touching the edge of the bounds from outside where loaded (by [@IvanSanchez](https://github.com/IvanSanchez)). [#2981](https://github.com/Leaflet/Leaflet/issues/2981) [#3508](https://github.com/Leaflet/Leaflet/pull/3508) +* Fixed a memory leak in `map.remove()` (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3514](https://github.com/Leaflet/Leaflet/pull/3514) [#2718](https://github.com/Leaflet/Leaflet/issues/2718) +* Fixed a bug where layers control collapsed when hovering over a disabled radio button (by [@rowanwins](https://github.com/rowanwins)). [#3564](https://github.com/Leaflet/Leaflet/pull/3564) [#2771](https://github.com/Leaflet/Leaflet/issues/2771) [Leaflet#2771](https://github.com/Leaflet/Leaflet/issues/2771) +* Fixed GeoJSON not accepting null geometry (by [@pglotov](https://github.com/pglotov)). [#3585](https://github.com/Leaflet/Leaflet/pull/3585) +* Fixed occasional popup 1px horizontal offset (by [@patrickarlt](https://github.com/patrickarlt)). [#3587](https://github.com/Leaflet/Leaflet/pull/3587) [#3526](https://github.com/Leaflet/Leaflet/pull/3526) [#3586](https://github.com/Leaflet/Leaflet/issues/3586) [#3525](https://github.com/Leaflet/Leaflet/issues/3525) +* Fixed some inconsistencies in mouse events for Canvas vector layers (by [@wpf500](https://github.com/wpf500)). [#3590](https://github.com/Leaflet/Leaflet/pull/3590) [#3568](https://github.com/Leaflet/Leaflet/issues/3568) [#3618](https://github.com/Leaflet/Leaflet/pull/3618) +* Fixed scale control for non-earth CRS (by [@cmulders](https://github.com/cmulders)). [#3614](https://github.com/Leaflet/Leaflet/pull/3614) ### Misc improvements From fd8759d5e1da256eb1228f128fb78bbf5ed0cdb8 Mon Sep 17 00:00:00 2001 From: Will Franklin Date: Tue, 30 Jun 2015 18:02:10 +0100 Subject: [PATCH 1731/2207] Use ID lookup instead to avoid re-adding layer on style change --- src/layer/vector/Canvas.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 185ee4ac3c9..9b04d03fd6e 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -27,7 +27,7 @@ L.Canvas = L.Renderer.extend({ _update: function () { if (this._map._animatingZoom && this._bounds) { return; } - this._drawnLayers = []; + this._drawnLayers = {}; L.Renderer.prototype._update.call(this); @@ -119,7 +119,7 @@ L.Canvas = L.Renderer.extend({ if (!len) { return; } - this._drawnLayers.push(layer); + this._drawnLayers[layer._leaflet_id] = layer; ctx.beginPath(); From f717fd60e510ea58fa4e0274adee0889ce6fecf6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 11:59:27 +0300 Subject: [PATCH 1732/2207] fix preventOutline exception, close #3625 --- src/dom/DomUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index e2dd91c3f35..8cd9a5d1021 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -224,7 +224,7 @@ L.DomUtil = { while (element.tabIndex === -1) { element = element.parentNode; } - if (!element) { return; } + if (!element || !element.style) { return; } L.DomUtil.restoreOutline(); this._outlineElement = element; this._outlineStyle = element.style.outline; From 3e636d26b96b32037752c406709610c7047c8094 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 12:12:53 +0300 Subject: [PATCH 1733/2207] bump versions --- package.json | 2 +- src/Leaflet.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 950f6791caf..82d7f8638b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.2", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.2.1", diff --git a/src/Leaflet.js b/src/Leaflet.js index 8732082b41e..d390508686b 100644 --- a/src/Leaflet.js +++ b/src/Leaflet.js @@ -1,6 +1,6 @@ var L = { - version: '1.0-dev' + version: '1.0.0-beta.2' }; function expose() { From 218114532e715b3eb33f3cd50b5bd0f37bf890df Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 14:00:13 +0300 Subject: [PATCH 1734/2207] update download page --- download.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/download.md b/download.md index f5911a80e4a..9445ce41bc6 100644 --- a/download.md +++ b/download.md @@ -20,7 +20,11 @@ bodyclass: download-page Previous stable version, released on June 26, 2013 and last updated on July 25, 2013. - Leaflet 0.8-dev + Leaflet 1.0 beta 1 + Last 1.0 beta, released on July 14, 2015. + + + Leaflet 1.0-dev In-progress version, developed on the master branch. @@ -35,8 +39,8 @@ so please read the changelog carefully when upgrading to it. The latest stable Leaflet release is hosted on a CDN — to start using it straight away, place this in the `head` of your HTML code: - - + + ### Using a Downloaded Version of Leaflet From 0389d24062c31fd3c6db5ea6033a9362cecda9fb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 14:00:58 +0300 Subject: [PATCH 1735/2207] 1.0 beta 1 blog post --- .../2015-07-15-leaflet-1.0-beta1-released.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 _posts/2015-07-15-leaflet-1.0-beta1-released.md diff --git a/_posts/2015-07-15-leaflet-1.0-beta1-released.md b/_posts/2015-07-15-leaflet-1.0-beta1-released.md new file mode 100644 index 00000000000..257a3132fd3 --- /dev/null +++ b/_posts/2015-07-15-leaflet-1.0-beta1-released.md @@ -0,0 +1,56 @@ +--- +layout: post +title: Announcing Leaflet 1.0 beta 1 +description: Leaflet 1.0 beta 1 released. It's the biggest Leaflet release ever, with tons of improvements and bugfixes. We're starting a short beta release cycle, and need your help testing the release. +author: Vladimir Agafonkin +authorsite: http://agafonkin.com/en +--- + +Over the past year, we set out on an ambitious quest to implement pretty much all the features Leaflet users have been asking for years, while heavily focusing on performance, code cleanup and stabilizing the API. It was an extremely challenging road with many bumps, but now we're finally approaching the finish line. + +Today, I'm happy and proud to announce the release of *Leaflet 1.0 beta 1*, our first formal release after more than a year of work and a thousand commits by 36 contributors. + +### What's new + +1.0 will be the best Leaflet release ever, bringing a _huge_ amount of improvements and bugfixes. Highlights of the release include: + +- _huge_ performance improvements, especially for vector layers +- flyover animations (zooming and panning in a curve with `map.flyTo`) +- fractional zoom level support (`map.setZoom(12.34)`) +- much nicer tile loading with less flickering +- custom pane management (including multiple vector layer panes) +- better support for non-standard projections +- more accessibility features +- lots of bugfixes and stability improvements + +A much more detailed list of changes can be found [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) (beware, it's a long read). + +### Beta cycle and upgrading + +The release sports a number of minor breaking API changes, and some of the plugins will have to be updated. To make the upgrade less painful, we're doing a short beta cycle before the final 1.0 to allow users and plugin developers to catch up to the changes while we find and fix remaining issues. + +A lot of effort since the last stable release has been put into refactoring. Many changes that we made are not visible to users, but make the source code much simpler and easier to understand and also open up many new possibilities for our wonderful community of plugin developers. Basically, half of Leaflet code was fully rewritten under the hood, and now the codebase is ready for some pretty extreme extensions (who just said "rotation" and "WebGL"?). + +We plan to write a comprehensive 1.0 upgrade guide before the release. Meanwhile, if something breaks after you upgrade to 1.0-beta, please look through the changelog. If you can't find the corresponding breaking change, please file a GitHub issue. + +### Get the new release + +Test out the new release on your app, and help us catch remaining issues to bring the final 1.0 close to perfection! + +You can use our CDN: + + + + +The release is also available through NPM, Bower, and [GitHub download](https://github.com/Leaflet/Leaflet/archive/v1.0.0-beta.1.zip). + +### Thank you + +I'm incredibly thankful to everyone who made this release possible — by using the library, spreading the word about it, reporting issues and sending your contributions. Your help is invaluable! + +Special thanks to [Ivan Sanchez](https://github.com/IvanSanchez), [Yohan Boniface](https://github.com/yohanboniface), [John Firebaugh](https://github.com/jfirebaugh), [Dave Leaver](https://github.com/danzel), [Patrick Arlt](https://github.com/patrickarlt), [Per Liedman](https://github.com/perliedman), [Jake Wilson](https://github.com/Jakobud) and [Steve Kashishian](https://github.com/snkashis) for lots of amazing contributions and support throughout the last year. All these people are now a part of the core Leaflet team. Keep'em coming! + +![](http://www.reactiongifs.com/r/msy.gif) + +Love,
          +Vladimir. From 1f9d0771aa7991c5f30650d5e9efd4959c214717 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 14:10:01 +0300 Subject: [PATCH 1736/2207] add a flyover gif --- _posts/2015-07-15-leaflet-1.0-beta1-released.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_posts/2015-07-15-leaflet-1.0-beta1-released.md b/_posts/2015-07-15-leaflet-1.0-beta1-released.md index 257a3132fd3..d20de504371 100644 --- a/_posts/2015-07-15-leaflet-1.0-beta1-released.md +++ b/_posts/2015-07-15-leaflet-1.0-beta1-released.md @@ -25,6 +25,8 @@ Today, I'm happy and proud to announce the release of *Leaflet 1.0 beta 1*, our A much more detailed list of changes can be found [in the changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) (beware, it's a long read). +![](https://camo.githubusercontent.com/07c492b230f1a3762118eaf457f0cc182fb0a98d/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f32353339352f313936353934392f32613934343166342d383263312d313165332d393836372d6230343033663266643966372e676966) + ### Beta cycle and upgrading The release sports a number of minor breaking API changes, and some of the plugins will have to be updated. To make the upgrade less painful, we're doing a short beta cycle before the final 1.0 to allow users and plugin developers to catch up to the changes while we find and fix remaining issues. From d083eaaa7d2895c8fb4ba7ec9a83b800e842812e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 15:30:32 +0300 Subject: [PATCH 1737/2207] update docs version notice --- reference.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 393e261ab7d..4be3fe6597a 100644 --- a/reference.html +++ b/reference.html @@ -125,8 +125,7 @@

          Misc


          -

          This reference reflects Leaflet 0.7. -Docs for 0.6 are available in the source form (see instructions for running docs).

          +

          This reference reflects Leaflet 1.0.

          Map

          @@ -6491,7 +6490,7 @@

          Defined CRS

          L.CRS.Earth Serves as the base for CRS that are global such that they cover the earth. Can only be used as the base for - other CRS and cannot be used directly, since it does not have a code, projection or + other CRS and cannot be used directly, since it does not have a code, projection or transformation. From 2774ac82212bec336f6ed6489e1d6dff9c128c27 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 15 Jul 2015 15:33:24 +0300 Subject: [PATCH 1738/2207] add a note about 1.0 docs --- _posts/2015-07-15-leaflet-1.0-beta1-released.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_posts/2015-07-15-leaflet-1.0-beta1-released.md b/_posts/2015-07-15-leaflet-1.0-beta1-released.md index d20de504371..2fc5646f05d 100644 --- a/_posts/2015-07-15-leaflet-1.0-beta1-released.md +++ b/_posts/2015-07-15-leaflet-1.0-beta1-released.md @@ -35,6 +35,8 @@ A lot of effort since the last stable release has been put into refactoring. Man We plan to write a comprehensive 1.0 upgrade guide before the release. Meanwhile, if something breaks after you upgrade to 1.0-beta, please look through the changelog. If you can't find the corresponding breaking change, please file a GitHub issue. +The API reference for 1.0 is temporarily [available here](http://mourner.github.io/Leaflet/reference.html). It's built from Leaflet `gh-pages-master` branch — fixes and additions are welcome! + ### Get the new release Test out the new release on your app, and help us catch remaining issues to bring the final 1.0 close to perfection! From 7d26169d5873ee6b0311bddbc52355852a0c74ea Mon Sep 17 00:00:00 2001 From: stefanocudini Date: Wed, 15 Jul 2015 15:26:23 +0200 Subject: [PATCH 1739/2207] added new plugin Leaflet GeoJSON Encoded --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 1706adfc742..3fe158e0ef3 100644 --- a/plugins.md +++ b/plugins.md @@ -247,6 +247,15 @@ Plugins for loading basemaps or GIS raster layers in common (albeit non-default) Eugene Mikhalev + + + Leaflet GeoJSON Encoded + + Extends the L.GeoJSON layer using Google polyline encoding algorithm, allowing an optimized data transfer. + + Geobricks + + From 8ef55006eca892850e1c062aa0700b11867c821d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 15 Jul 2015 15:49:06 +0200 Subject: [PATCH 1740/2207] Minor typo in blog post --- _posts/2015-07-15-leaflet-1.0-beta1-released.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2015-07-15-leaflet-1.0-beta1-released.md b/_posts/2015-07-15-leaflet-1.0-beta1-released.md index 2fc5646f05d..3cc30cb1b2d 100644 --- a/_posts/2015-07-15-leaflet-1.0-beta1-released.md +++ b/_posts/2015-07-15-leaflet-1.0-beta1-released.md @@ -52,7 +52,7 @@ The release is also available through NPM, Bower, and [GitHub download](https:// I'm incredibly thankful to everyone who made this release possible — by using the library, spreading the word about it, reporting issues and sending your contributions. Your help is invaluable! -Special thanks to [Ivan Sanchez](https://github.com/IvanSanchez), [Yohan Boniface](https://github.com/yohanboniface), [John Firebaugh](https://github.com/jfirebaugh), [Dave Leaver](https://github.com/danzel), [Patrick Arlt](https://github.com/patrickarlt), [Per Liedman](https://github.com/perliedman), [Jake Wilson](https://github.com/Jakobud) and [Steve Kashishian](https://github.com/snkashis) for lots of amazing contributions and support throughout the last year. All these people are now a part of the core Leaflet team. Keep'em coming! +Special thanks to [Iván Sánchez](https://github.com/IvanSanchez), [Yohan Boniface](https://github.com/yohanboniface), [John Firebaugh](https://github.com/jfirebaugh), [Dave Leaver](https://github.com/danzel), [Patrick Arlt](https://github.com/patrickarlt), [Per Liedman](https://github.com/perliedman), [Jake Wilson](https://github.com/Jakobud) and [Steve Kashishian](https://github.com/snkashis) for lots of amazing contributions and support throughout the last year. All these people are now a part of the core Leaflet team. Keep'em coming! ![](http://www.reactiongifs.com/r/msy.gif) From dde5862581aff77028d8bcb8554fb2187af64da4 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 15 Jul 2015 10:51:47 -0500 Subject: [PATCH 1741/2207] Fix typo in b1 changelog for FeatureGroup popups --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 946fb5451b1..71f367d2665 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,7 +56,7 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Removed `Map` `tilelayersload` event. * Removed `Popup` `open` and `close` events in favor of `add` and `remove` for consistency. * Moved all layer-related logic in `Map.js` to `Layer.js`. -* Improved `FeatureGroup` `bindPopup` to accept a function for generating popup content, significantly improving memory footpring when adding popups to a huge number of layers (by [@patrickarlt](https://github.com/patrickarlt)). [#3109](https://github.com/Leaflet/Leaflet/pull/3109) [#3059](https://github.com/Leaflet/Leaflet/pull/3059) +* Improved `FeatureGroup` `bindPopup` to accept a function for generating popup content, significantly improving memory footprint when adding popups to a huge number of layers (by [@patrickarlt](https://github.com/patrickarlt)). [#3109](https://github.com/Leaflet/Leaflet/pull/3109) [#3059](https://github.com/Leaflet/Leaflet/pull/3059) * Added `ImageOverlay` interactivity (mouse events, etc.) (by [@snkashis](https://github.com/snkashis)). [#3009](https://github.com/Leaflet/Leaflet/pull/3009) [#1727](https://github.com/Leaflet/Leaflet/issues/1727) * Added `ImageOverlay` `getBounds` (by [@brunob](https://github.com/brunob)). [#2848](https://github.com/Leaflet/Leaflet/pull/2848) * Renamed `clickable` option to `interactive` (by [@AndriiHeonia](https://github.com/AndriiHeonia)). [#2838](https://github.com/Leaflet/Leaflet/pull/2838) [#2499](https://github.com/Leaflet/Leaflet/issues/2499) From 44bc29ba1c2e74b44af15d21b4b086ca557964ff Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Thu, 16 Jul 2015 14:25:53 +0300 Subject: [PATCH 1742/2207] Manual tuning: replaced all ILayer words with just Layer --- reference.html | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/reference.html b/reference.html index 4be3fe6597a..0d1ce1b088a 100644 --- a/reference.html +++ b/reference.html @@ -185,7 +185,7 @@

          Map State Options

          layers - ILayer[] + Layer[] null Layers that will be added to the map initially. @@ -841,7 +841,7 @@

          Methods for Layers and Controls

          addLayer( - <ILayer> layer + <Layer> layer this @@ -849,7 +849,7 @@

          Methods for Layers and Controls

          removeLayer( - <ILayer> layer ) + <Layer> layer ) this @@ -857,7 +857,7 @@

          Methods for Layers and Controls

          hasLayer( - <ILayer> layer ) + <Layer> layer ) Boolean @@ -918,7 +918,7 @@

          Methods for Layers and Controls

          Removes the given control from the map. getRenderer( - <ILayer> layer) + <Layer> layer) Renderer @@ -1669,11 +1669,11 @@

          Creation

          L.popup( <Popup options> options?, - <ILayer> source? ) + <Layer> source? ) - Instantiates a Popup object given an optional options object that describes its appearance and location and an optional source object that is used to tag the popup with a reference to the ILayer to which it refers. + Instantiates a Popup object given an optional options object that describes its appearance and location and an optional source object that is used to tag the popup with a reference to the Layer to which it refers. @@ -2979,7 +2979,7 @@

          Creation

          L.LayerGroup( - <ILayer[]> layers? ) + <Layer[]> layers? ) @@ -3005,7 +3005,7 @@

          Methods

          addLayer( - <ILayer> layer ) + <Layer> layer ) this @@ -3013,7 +3013,7 @@

          Methods

          removeLayer( - <ILayer> layer ) + <Layer> layer ) this @@ -3029,7 +3029,7 @@

          Methods

          hasLayer( - <ILayer> layer ) + <Layer> layer ) Boolean @@ -3040,7 +3040,7 @@

          Methods

          <String> id )
          - ILayer + Layer Returns the layer with the given id. @@ -3093,7 +3093,7 @@

          Creation

          L.featureGroup( - <ILayer[]> layers? ) + <Layer[]> layers? ) @@ -3245,7 +3245,7 @@

          Options

          onEachFeature( <GeoJSON> featureData, - <ILayer> layer ) + <Layer> layer ) Function that will be called on each created feature layer. Useful for attaching events and popups to features. @@ -3253,7 +3253,7 @@

          Options

          filter( <GeoJSON> featureData, - <ILayer> layer ) + <Layer> layer ) Function that will be used to decide whether to show a feature or not. @@ -3319,7 +3319,7 @@

          Static methods

          <Function> pointToLayer? )
          - ILayer + Layer Creates a layer from a given GeoJSON feature. @@ -4455,7 +4455,7 @@

          Methods

          addBaseLayer( - <ILayer> layer, + <Layer> layer, <String> name ) this @@ -4463,7 +4463,7 @@

          Methods

          addOverlay( - <ILayer> layer, + <Layer> layer, <String> name ) this @@ -4471,7 +4471,7 @@

          Methods

          removeLayer( - <ILayer> layer ) + <Layer> layer ) this Remove the given layer from the control. @@ -6657,7 +6657,7 @@

          LayerEvent

          layer - ILayer + Layer The layer that was added or removed. @@ -6672,7 +6672,7 @@

          LayersControlEvent

          layer - ILayer + Layer The layer that was added or removed. @@ -6742,7 +6742,7 @@

          GeoJSON event

          layer - ILayer + Layer The layer for the GeoJSON feature that is being added to the map. From 187b7cb2639f15a1b3cf30bc049591cce0cfe69d Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Thu, 16 Jul 2015 14:36:21 +0300 Subject: [PATCH 1743/2207] Fixed couple of remaining ilayer anchors --- reference.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference.html b/reference.html index 0d1ce1b088a..12141d07b99 100644 --- a/reference.html +++ b/reference.html @@ -918,7 +918,7 @@

          Methods for Layers and Controls

          Removes the given control from the map. getRenderer( - <Layer> layer) + <Layer> layer) Renderer @@ -6657,7 +6657,7 @@

          LayerEvent

          layer - Layer + Layer The layer that was added or removed. @@ -6672,7 +6672,7 @@

          LayersControlEvent

          layer - Layer + Layer The layer that was added or removed. @@ -6742,7 +6742,7 @@

          GeoJSON event

          layer - Layer + Layer The layer for the GeoJSON feature that is being added to the map. From bd65b443e4a5a1df880ae63d860c49ab995cf7a2 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 16 Jul 2015 15:40:45 +0200 Subject: [PATCH 1744/2207] Do not fire preclick when dragging (fix #3632) --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 6e6a481b40d..b27ee344d9e 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -680,7 +680,7 @@ L.Map = L.Evented.extend({ var target = targets[0]; // prevents firing click after you just dragged an object - if (e.type === 'click' && !e._simulated && this._draggableMoved(target)) { return; } + if ((e.type === 'click' || e.type === 'preclick') && !e._simulated && this._draggableMoved(target)) { return; } var data = { originalEvent: e From ab1995e1ceba2353e457a0ba2430246f47f65afd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 16 Jul 2015 16:47:54 +0300 Subject: [PATCH 1745/2207] fix box-zoom regression, close #3633 --- dist/leaflet.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index f95258d3467..6848834a125 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -63,7 +63,7 @@ height: 0; -moz-box-sizing: border-box; box-sizing: border-box; - z-index: 8; + z-index: 800; } /* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ .leaflet-overlay-pane svg { From 8d980ce49b9285a8d9fc1ad94f9c57c0e80da50a Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 16 Jul 2015 17:01:44 +0200 Subject: [PATCH 1746/2207] Add a unittest to cover dragging map not closing open popup (cf #3632) --- spec/suites/SpecHelper.js | 35 ++++++++++++++++++++++++++++++++++ spec/suites/layer/PopupSpec.js | 21 ++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 1e5256b02a8..4b0f7ff6abf 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -40,3 +40,38 @@ expect.Assertion.prototype.nearLatLng = function (expected, delta) { expect(this.obj.lng).to .be.within(expected.lng - delta, expected.lng + delta); }; + +happen.at = function (what, x, y, props) { + this.once(document.elementFromPoint(x, y), L.Util.extend({ + type: what, + clientX: x, + clientY: y, + screenX: x, + screenY: y, + which: 1, + button: 0 + }, props || {})); +}; +happen.drag = function (fromX, fromY, toX, toY, then, duration) { + happen.at('mousemove', fromX, fromY); + happen.at('mousedown', fromX, fromY); + var moveX = function () { + if (fromX <= toX) { + happen.at('mousemove', fromX++, fromY); + window.setTimeout(moveX, 5); + } + }; + moveX(); + var moveY = function () { + if (fromY <= toY) { + happen.at('mousemove', fromX, fromY++); + window.setTimeout(moveY, 5); + } + }; + moveY(); + window.setTimeout(function () { + happen.at('mouseup', toX, toY); + happen.at('click', toX, toY); + if (then) { then(); } + }, duration || 100); +}; diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 9dfc72f5fa9..d90a9ab5bd5 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -275,4 +275,25 @@ describe("L.Map#openPopup", function () { expect(map.hasLayer(p1)).to.be(true); expect(map.hasLayer(p2)).to.be(true); }); + + it('should not be closen when dragging map', function (done) { + document.body.appendChild(c); + c.style.position = 'absolute'; + c.style.left = 0; + c.style.top = 0; + c.style.zIndex = 10000; + var coords = map._container.getBoundingClientRect(); + var spy = sinon.spy(); + var p = new L.Popup().setLatLng(new L.LatLng(55.8, 37.6)); + map.openPopup(p); + expect(map.hasLayer(p)).to.be(true); + map.on('drag', spy); + happen.drag(coords.left + 100, coords.top + 100, coords.left + 110, coords.top + 110, function () { + expect(spy.called).to.be(true); + expect(map.hasLayer(p)).to.be(true); + document.body.removeChild(c); + done(); + }); + }); + }); From 8870c2abf8b6cc16739cccdea8e94c98d65d8358 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 17 Jul 2015 11:09:15 +0200 Subject: [PATCH 1747/2207] Fix boxZoom._moved remaining in bad state after use (cf #3026) --- debug/map/map.html | 2 +- src/map/handler/Map.BoxZoom.js | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/debug/map/map.html b/debug/map/map.html index 6b7c57ea508..fd6c5aeab3e 100644 --- a/debug/map/map.html +++ b/debug/map/map.html @@ -43,7 +43,7 @@ function logEvent(e) { console.log(e.type); } - // map.on('click', logEvent); + map.on('click', logEvent); // map.on('movestart', logEvent); // map.on('move', logEvent); diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js index dff5069066b..a0d5f06f989 100644 --- a/src/map/handler/Map.BoxZoom.js +++ b/src/map/handler/Map.BoxZoom.js @@ -26,10 +26,14 @@ L.Map.BoxZoom = L.Handler.extend({ return this._moved; }, + _resetState: function () { + this._moved = false; + }, + _onMouseDown: function (e) { if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } - this._moved = false; + this._resetState(); L.DomUtil.disableTextSelection(); L.DomUtil.disableImageDrag(); @@ -88,6 +92,9 @@ L.Map.BoxZoom = L.Handler.extend({ this._finish(); if (!this._moved) { return; } + // Postpone to next JS tick so internal click event handling + // still see it as "moved". + setTimeout(L.bind(this._resetState, this), 0); var bounds = new L.LatLngBounds( this._map.containerPointToLatLng(this._startPoint), From 7d52912a0cabcce8ddeb94524edb9c1c1b9b8c05 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 17 Jul 2015 17:31:12 +0300 Subject: [PATCH 1748/2207] use wheel event where possible --- src/dom/DomEvent.js | 19 +++++-------------- src/map/handler/Map.ScrollWheelZoom.js | 5 ++--- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 2a87a5e6d32..129674e69de 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -61,8 +61,7 @@ L.DomEvent = { } else if ('addEventListener' in obj) { if (type === 'mousewheel') { - obj.addEventListener('DOMMouseScroll', handler, false); - obj.addEventListener(type, handler, false); + obj.addEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { handler = function (e) { @@ -108,8 +107,7 @@ L.DomEvent = { } else if ('removeEventListener' in obj) { if (type === 'mousewheel') { - obj.removeEventListener('DOMMouseScroll', handler, false); - obj.removeEventListener(type, handler, false); + obj.removeEventListener('onwheel' in obj ? 'wheel' : 'mousewheel', handler, false); } else { obj.removeEventListener( @@ -184,16 +182,9 @@ L.DomEvent = { }, getWheelDelta: function (e) { - - var delta = 0; - - if (e.wheelDelta) { - delta = e.wheelDelta / 120; - } - if (e.detail) { - delta = -e.detail / 3; - } - return delta; + return e.deltaY ? -e.deltaY : + e.wheelDelta ? e.wheelDelta / 40 : + e.detail ? -e.detail : 0; }, _skipEvents: {}, diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index 18edef60a1e..3aa2ed78e59 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -26,6 +26,7 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ _onWheelScroll: function (e) { var delta = L.DomEvent.getWheelDelta(e); + var debounce = this._map.options.wheelDebounceTime; this._delta += delta; @@ -50,9 +51,7 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ map.stop(); // stop panning and fly animations if any - delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); - delta = Math.max(Math.min(delta, 4), -4); - delta = map._limitZoom(zoom + delta) - zoom; + delta = map._limitZoom(zoom + (delta > 0 ? 1 : -1)) - zoom; this._delta = 0; this._startTime = null; From 78b486ac482ab6ab80e93d0f32036be5bf9a906a Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 17 Jul 2015 17:15:19 +0200 Subject: [PATCH 1749/2207] Dont call preventDefault on contextmenu if no target listen to it (fix #3638) --- debug/map/map.html | 3 ++- src/map/Map.js | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/debug/map/map.html b/debug/map/map.html index fd6c5aeab3e..f245ba31141 100644 --- a/debug/map/map.html +++ b/debug/map/map.html @@ -43,7 +43,8 @@ function logEvent(e) { console.log(e.type); } - map.on('click', logEvent); + // map.on('click', logEvent); + // map.on('contextmenu', logEvent); // map.on('movestart', logEvent); // map.on('move', logEvent); diff --git a/src/map/Map.js b/src/map/Map.js index b27ee344d9e..aeec67d8689 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -663,10 +663,6 @@ L.Map = L.Evented.extend({ _fireDOMEvent: function (e, type, targets) { - if (type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - var isHover = type === 'mouseover' || type === 'mouseout'; targets = (targets || []).concat(this._findEventTargets(e.target || e.srcElement, type, !isHover)); @@ -675,6 +671,9 @@ L.Map = L.Evented.extend({ // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave if (isHover && !L.DomEvent._checkMouse(this._container, e)) { return; } + } else if (type === 'contextmenu') { + // we only want to call preventDefault when targets listen to it. + L.DomEvent.preventDefault(e); } var target = targets[0]; From 64f7ef58cbcc9b6cfc52a10c21a1a41876ee5e68 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 19 Jul 2015 09:35:20 -0700 Subject: [PATCH 1750/2207] Move controls on top of layers In my PR to expand the zindex of panes I forgot to also adjust the zindex of `.leaflet-control`. This will make controls appear on top of layers again. --- dist/leaflet.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 6848834a125..371a2455bd3 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -96,7 +96,7 @@ .leaflet-control { position: relative; - z-index: 7; + z-index: 800; pointer-events: auto; } .leaflet-top, From c75af44ca2ed736cbff98a8b6d417b04355e275c Mon Sep 17 00:00:00 2001 From: David Beitey Date: Mon, 20 Jul 2015 09:36:23 +1000 Subject: [PATCH 1751/2207] Ensure marker images show if max-width configured Previous versions of Leaflet had ``.leaflet-container img { max-width: none !important }`` prior to the change in https://github.com/Leaflet/Leaflet/commit/b3ff3a0e526d9644c0389e06d709075771d67905, when the selector became more specific. This change ensures markers continue to be shown in the case of the page loading Leaflet has a CSS rule like ``img { max-width: 100%; }`` applied. --- dist/leaflet.css | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/leaflet.css b/dist/leaflet.css index 371a2455bd3..c981a98d94f 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -44,6 +44,7 @@ /* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ /* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ .leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, .leaflet-container .leaflet-tile-pane img { max-width: none !important; } From c1f21eb38f62b73977a8a7654297c4863ca439d3 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 20 Jul 2015 15:56:11 +0200 Subject: [PATCH 1752/2207] Fix mouseout bubbling while initial target was not listening (fix #3648) --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index b27ee344d9e..079031ea721 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -630,8 +630,8 @@ L.Map = L.Evented.extend({ target = this._targets[L.stamp(src)]; if (target && target.listens(type, true)) { targets.push(target); - if (!bubble) { break; } } + if (!bubble) { break; } if (src === this._container) { break; } From a9060741a208edde674d2733616676d288b606b2 Mon Sep 17 00:00:00 2001 From: davidlukerice Date: Mon, 20 Jul 2015 09:55:55 -0500 Subject: [PATCH 1753/2207] loop backwards on input click in case elements get removed --- src/control/Control.Layers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 301c99bfa4b..4b757b8afad 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -220,7 +220,7 @@ L.Control.Layers = L.Control.extend({ this._handlingClick = true; - for (var i = 0, len = inputs.length; i < len; i++) { + for (var i = inputs.length - 1; i >= 0; i--) { input = inputs[i]; layer = this._layers[input.layerId].layer; hasLayer = this._map.hasLayer(layer); From cf70095140c6975d82ac3a70133f86c1d30785fd Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 20 Jul 2015 19:24:57 +0300 Subject: [PATCH 1754/2207] get rid of MozMousePixelScroll --- src/dom/DomEvent.js | 4 ++-- src/map/handler/Map.ScrollWheelZoom.js | 10 ++-------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 129674e69de..bfba206b617 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -139,7 +139,7 @@ L.DomEvent = { }, disableScrollPropagation: function (el) { - return L.DomEvent.on(el, 'mousewheel MozMousePixelScroll', L.DomEvent.stopPropagation); + return L.DomEvent.on(el, 'mousewheel', L.DomEvent.stopPropagation); }, disableClickPropagation: function (el) { @@ -183,7 +183,7 @@ L.DomEvent = { getWheelDelta: function (e) { return e.deltaY ? -e.deltaY : - e.wheelDelta ? e.wheelDelta / 40 : + e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 40 : e.detail ? -e.detail : 0; }, diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index 3aa2ed78e59..6d7588e4709 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -9,19 +9,13 @@ L.Map.mergeOptions({ L.Map.ScrollWheelZoom = L.Handler.extend({ addHooks: function () { - L.DomEvent.on(this._map._container, { - mousewheel: this._onWheelScroll, - MozMousePixelScroll: L.DomEvent.preventDefault - }, this); + L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); this._delta = 0; }, removeHooks: function () { - L.DomEvent.off(this._map._container, { - mousewheel: this._onWheelScroll, - MozMousePixelScroll: L.DomEvent.preventDefault - }, this); + L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll, this); }, _onWheelScroll: function (e) { From b19581a58808fab8b1cb28282ab0ad6f81d060c1 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 20 Jul 2015 19:25:18 +0300 Subject: [PATCH 1755/2207] adjust wheel zooming values --- src/map/handler/Map.ScrollWheelZoom.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index 6d7588e4709..bb8d94eb284 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -45,7 +45,9 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ map.stop(); // stop panning and fly animations if any - delta = map._limitZoom(zoom + (delta > 0 ? 1 : -1)) - zoom; + // map the delta with a sigmoid function to -4..4 range leaning on -1..1 + var d2 = Math.ceil(4 * Math.log(2 / (1 + Math.exp(-Math.abs(delta / 200)))) / Math.LN2); + delta = map._limitZoom(zoom + (delta > 0 ? d2 : -d2)) - zoom; this._delta = 0; this._startTime = null; From 45ebba4159679cee3f16c777f9efaf710dfadad7 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 22 Jul 2015 19:34:00 +0300 Subject: [PATCH 1756/2207] Fix panTo with no anim resetting the view, close #3355 --- src/map/anim/Map.PanAnimation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 007ead8872d..0c73e85412f 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -20,11 +20,11 @@ L.Map.include({ } // try animating pan or zoom - var animated = (this._zoom !== zoom) ? + var moved = (this._zoom !== zoom) ? this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : this._tryAnimatedPan(center, options.pan); - if (animated) { + if (moved) { // prevent resize handler call, the view will refresh after animation anyway clearTimeout(this._sizeTimer); return this; @@ -97,6 +97,6 @@ L.Map.include({ this.panBy(offset, options); - return (options && options.animate) !== false; + return true; } }); From 80b8d5f4c907d9c6423a0ec06219d017f7a8fb39 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 22 Jul 2015 19:37:24 +0300 Subject: [PATCH 1757/2207] improve canvas removeLayer perf, close #3076 --- src/layer/vector/Canvas.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 9b04d03fd6e..ef6fc00cd43 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -100,12 +100,13 @@ L.Canvas = L.Renderer.extend({ for (var id in this._layers) { layer = this._layers[id]; - if (!this._redrawBounds || layer._pxBounds.intersects(this._redrawBounds)) { - layer._updatePath(); - } + if (clear && layer._removed) { delete layer._removed; delete this._layers[id]; + + } else if (!this._redrawBounds || layer._pxBounds.intersects(this._redrawBounds)) { + layer._updatePath(); } } }, From f5ed2cb2acbdddebd865ecfdec54beef422bb22f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 22 Jul 2015 19:39:43 +0300 Subject: [PATCH 1758/2207] ditch Android 2 hack for overzooming image overlay, close #2282 --- dist/leaflet.css | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index c981a98d94f..346fab996cb 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -45,12 +45,9 @@ /* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ .leaflet-container .leaflet-overlay-pane svg, .leaflet-container .leaflet-marker-pane img, -.leaflet-container .leaflet-tile-pane img { - max-width: none !important; - } -/* stupid Android 2 doesn't understand "max-width: none" properly */ +.leaflet-container .leaflet-tile-pane img, .leaflet-container img.leaflet-image-layer { - max-width: 15000px !important; + max-width: none !important; } .leaflet-tile { filter: inherit; From 64333d2dc32e3be605c647e991caa2c3451f20d4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 22 Jul 2015 19:41:01 +0300 Subject: [PATCH 1759/2207] reduce the throttle for canvas layers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It felt laggy with 66. 32 is just about right — 30fps. --- src/layer/vector/Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index ef6fc00cd43..705d0c5887b 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -17,7 +17,7 @@ L.Canvas = L.Renderer.extend({ var container = this._container = document.createElement('canvas'); L.DomEvent - .on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 66, this), this) + .on(container, 'mousemove', L.Util.throttle(this._onMouseMove, 32, this), this) .on(container, 'click dblclick mousedown mouseup contextmenu', this._onClick, this) .on(container, 'mouseout', this._handleMouseOut, this); From c2de88c68892e2ba0bec041d4026facec0703b56 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 22 Jul 2015 19:42:57 +0300 Subject: [PATCH 1760/2207] fire moveend on panBy without movement, close #3655 --- src/map/anim/Map.PanAnimation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 0c73e85412f..ca3fcd8bcd3 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -42,7 +42,7 @@ L.Map.include({ options = options || {}; if (!offset.x && !offset.y) { - return this; + return this.fire('moveend'); } //If we pan too far then chrome gets issues with tiles // and makes them disappear or appear in the wrong place (slightly offset) #2602 From bf8f0b45b1e734fcf317505511b8bc2fc0229c50 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 23 Jul 2015 12:29:55 +0300 Subject: [PATCH 1761/2207] Revert canvas removeLayer regression, close #3661 This reverts commit 80b8d5f4c907d9c6423a0ec06219d017f7a8fb39. --- src/layer/vector/Canvas.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 705d0c5887b..b8c596c771a 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -100,13 +100,12 @@ L.Canvas = L.Renderer.extend({ for (var id in this._layers) { layer = this._layers[id]; - + if (!this._redrawBounds || layer._pxBounds.intersects(this._redrawBounds)) { + layer._updatePath(); + } if (clear && layer._removed) { delete layer._removed; delete this._layers[id]; - - } else if (!this._redrawBounds || layer._pxBounds.intersects(this._redrawBounds)) { - layer._updatePath(); } } }, From 62f8261b10c30d045132f661d321fd0d659d8681 Mon Sep 17 00:00:00 2001 From: fminuti Date: Thu, 23 Jul 2015 11:33:58 +0200 Subject: [PATCH 1762/2207] Fix for #2809 Fix for "Vector layers loose styling in IE8 when removing and adding back to the map" #2809 --- src/layer/vector/SVG.VML.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/SVG.VML.js b/src/layer/vector/SVG.VML.js index e67ba579300..50c72f4f705 100644 --- a/src/layer/vector/SVG.VML.js +++ b/src/layer/vector/SVG.VML.js @@ -70,8 +70,8 @@ L.SVG.include(!L.Browser.vml ? {} : { if (options.stroke) { if (!stroke) { stroke = layer._stroke = L.SVG.create('stroke'); - container.appendChild(stroke); } + container.appendChild(stroke); stroke.weight = options.weight + 'px'; stroke.color = options.color; stroke.opacity = options.opacity; @@ -94,8 +94,8 @@ L.SVG.include(!L.Browser.vml ? {} : { if (options.fill) { if (!fill) { fill = layer._fill = L.SVG.create('fill'); - container.appendChild(fill); } + container.appendChild(fill); fill.color = options.fillColor || options.color; fill.opacity = options.fillOpacity; From fc23c162b41d0847fb7742b2f460ba4578533081 Mon Sep 17 00:00:00 2001 From: fminuti Date: Thu, 23 Jul 2015 12:16:30 +0200 Subject: [PATCH 1763/2207] FlyTo with targetCenter == currentCenter not animated Please see http://jsfiddle.net/v1so6m56/4/ If targetCenter is the same of currenteCenter the parameter u1 (the distance between "to" and "from" is 0. The proposed patch resolve this by forcing the distance to 1. --- src/map/anim/Map.FlyTo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index 5518446eef9..1b3c36444e3 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -19,7 +19,7 @@ L.Map.include({ var w0 = Math.max(size.x, size.y), w1 = w0 * this.getZoomScale(startZoom, targetZoom), - u1 = to.distanceTo(from), + u1 = (to.distanceTo(from)) || 1, rho = 1.42, rho2 = rho * rho; From 5e32cd190c253d928c8f21e5332a4a0823ec68cf Mon Sep 17 00:00:00 2001 From: w8r Date: Thu, 23 Jul 2015 21:10:29 +0200 Subject: [PATCH 1764/2207] fixes #3652 by container opacity approach --- debug/map/tile-opacity.html | 32 ++++++++++++++++++++++++++++++++ src/layer/tile/GridLayer.js | 10 +++++----- 2 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 debug/map/tile-opacity.html diff --git a/debug/map/tile-opacity.html b/debug/map/tile-opacity.html new file mode 100644 index 00000000000..26936cbcf30 --- /dev/null +++ b/debug/map/tile-opacity.html @@ -0,0 +1,32 @@ + + + + Leaflet debug page + + + + + + + + + + +
          + + + + diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index bf9e83e49f9..7e96c2e0f81 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -156,14 +156,14 @@ L.GridLayer = L.Layer.extend({ _updateOpacity: function () { if (!this._map) { return; } - var opacity = this.options.opacity; // IE doesn't inherit filter opacity properly, so we're forced to set it on tiles - if (!L.Browser.ielt9 && !this._map._fadeAnimated) { - L.DomUtil.setOpacity(this._container, opacity); + if (L.Browser.ielt9 || !this._map._fadeAnimated) { return; } + L.DomUtil.setOpacity(this._container, this.options.opacity); + var now = +new Date(), nextFrame = false, willPrune = false; @@ -173,11 +173,11 @@ L.GridLayer = L.Layer.extend({ if (!tile.current || !tile.loaded) { continue; } var fade = Math.min(1, (now - tile.loaded) / 200); + + L.DomUtil.setOpacity(tile.el, fade); if (fade < 1) { - L.DomUtil.setOpacity(tile.el, opacity * fade); nextFrame = true; } else { - L.DomUtil.setOpacity(tile.el, opacity); if (tile.active) { willPrune = true; } tile.active = true; } From 9017ea262fadf51d48738b6aa6677c139d096603 Mon Sep 17 00:00:00 2001 From: stefanocudini Date: Sun, 26 Jul 2015 01:28:22 +0200 Subject: [PATCH 1765/2207] added new plugin leaflet location picker --- plugins.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 3fe158e0ef3..b3ef67fae77 100644 --- a/plugins.md +++ b/plugins.md @@ -1350,7 +1350,7 @@ Plugins that search for overlays and enhance how to display information about th - leaflet-search + Leaflet Search A control for search Markers/Features location by custom property in LayerGroup/GeoJSON. Support AJAX/JSONP, Autocompletion and 3rd party service @@ -1941,6 +1941,17 @@ Show the geographical coordinates under the mouse cursor in different ways. Johannes Rudolph + + + Leaflet Location Picker + + + Simple location picker with mini Leaflet map (Demo) + + + Stefano Cudini + + From 08674721bc296c4aba1ea2dc2d5b5956d8685451 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 27 Jul 2015 15:39:26 +0200 Subject: [PATCH 1766/2207] Fix baselayerchange event argument (fix #3677) --- spec/suites/control/Control.LayersSpec.js | 22 ++++++++++++++-------- src/control/Control.Layers.js | 6 +++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/spec/suites/control/Control.LayersSpec.js b/spec/suites/control/Control.LayersSpec.js index 8a7e1fe037c..f8268a816ce 100644 --- a/spec/suites/control/Control.LayersSpec.js +++ b/spec/suites/control/Control.LayersSpec.js @@ -6,18 +6,24 @@ describe("Control.Layers", function () { }); describe("baselayerchange event", function () { + beforeEach(function () { + map.setView([0, 0], 14); + }); + it("is fired on input that changes the base layer", function () { - var baseLayers = {"Layer 1": L.tileLayer(), "Layer 2": L.tileLayer()}, + var baseLayers = {"Layer 1": L.tileLayer(''), "Layer 2": L.tileLayer('')}, layers = L.control.layers(baseLayers).addTo(map), spy = sinon.spy(); - map.on('baselayerchange', spy) - .whenReady(function () { - happen.click(layers._baseLayersList.getElementsByTagName("input")[0]); - - expect(spy.called).to.be.ok(); - expect(spy.mostRecentCall.args[0].layer).to.be(baseLayers["Layer 1"]); - }); + map.on('baselayerchange', spy); + happen.click(layers._baseLayersList.getElementsByTagName("input")[0]); + expect(spy.called).to.be.ok(); + expect(spy.args[0][0].name).to.be("Layer 1"); + expect(spy.args[0][0].layer).to.be(baseLayers["Layer 1"]); + happen.click(layers._baseLayersList.getElementsByTagName("input")[1]); + expect(spy.calledTwice).to.be.ok(); + expect(spy.args[1][0].name).to.be("Layer 2"); + expect(spy.args[1][0].layer).to.be(baseLayers["Layer 2"]); }); it("is not fired on input that doesn't change the base layer", function () { diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 4b757b8afad..7d4b9f3c32c 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -154,14 +154,14 @@ L.Control.Layers = L.Control.extend({ this._update(); } - var overlay = this._layers[L.stamp(e.target)].overlay; + var obj = this._layers[L.stamp(e.target)]; - var type = overlay ? + var type = obj.overlay ? (e.type === 'add' ? 'overlayadd' : 'overlayremove') : (e.type === 'add' ? 'baselayerchange' : null); if (type) { - this._map.fire(type, e.target); + this._map.fire(type, obj); } }, From 28bbd81204a7d42fb0610f1bf7a1456f66fa32ea Mon Sep 17 00:00:00 2001 From: Fabrizio Minuti Date: Tue, 28 Jul 2015 11:23:46 +0200 Subject: [PATCH 1767/2207] Add ImageOverlay setBounds Add ImageOverlay setBounds method. --- src/layer/ImageOverlay.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 8e46e7e775d..f2f62d71d4b 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -85,6 +85,13 @@ L.ImageOverlay = L.Layer.extend({ return this; }, + setBounds: function (bounds) { + this._bounds = bounds; + + this._reset(); + return this; + }, + getAttribution: function () { return this.options.attribution; }, From 93c2b526042a1dbb9dcc120c77131634991b4d2b Mon Sep 17 00:00:00 2001 From: Fabrizio Minuti Date: Tue, 28 Jul 2015 12:10:40 +0200 Subject: [PATCH 1768/2207] fix imageoverlay setBound when not added to map If imageoverlay#setBounds is called when the layer is not added to a map, the _reset method gets errors on execution --- spec/suites/layer/ImageOverlaySpec.js | 9 +++++++++ src/layer/ImageOverlay.js | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/ImageOverlaySpec.js b/spec/suites/layer/ImageOverlaySpec.js index a3befa57ed0..e52709c058b 100644 --- a/spec/suites/layer/ImageOverlaySpec.js +++ b/spec/suites/layer/ImageOverlaySpec.js @@ -5,4 +5,13 @@ describe('ImageOverlay', function () { expect(overlay.options.opacity).to.equal(0.5); }); }); + describe('#setBounds', function () { + it('sets bounds', function () { + var bounds = new L.LatLngBounds( + new L.LatLng(14, 12), + new L.LatLng(30, 40)); + var overlay = L.imageOverlay().setBounds(bounds); + expect(overlay._bounds).to.equal(bounds); + }); + }); }); diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index f2f62d71d4b..246fd9431bd 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -88,7 +88,9 @@ L.ImageOverlay = L.Layer.extend({ setBounds: function (bounds) { this._bounds = bounds; - this._reset(); + if (this._map) { + this._reset(); + } return this; }, From 5d255df9c547bcfb083da4dd9a5cc354fd32e0d5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 28 Jul 2015 17:47:53 +0300 Subject: [PATCH 1769/2207] temporarily remove master download link, update 0.7.3 link --- download.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/download.md b/download.md index 9445ce41bc6..f08117aae2c 100644 --- a/download.md +++ b/download.md @@ -12,21 +12,21 @@ bodyclass: download-page Description - Leaflet 0.7.3 + Leaflet 0.7.3 Stable version, released on November 18, 2013 and last updated on May 23, 2014. - + Leaflet 1.0 beta 1 Last 1.0 beta, released on July 14, 2015. - + [View Changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) From 2b03540c23c1291608f4d8e1633da2a30e4a4f0b Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Tue, 28 Jul 2015 15:26:20 +0200 Subject: [PATCH 1770/2207] Do not stop mousedown event on L.Draggable Rationale is to let Leaflet plugins use the mousedown event. --- src/dom/Draggable.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 670c8a543a9..053d2e529da 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -46,9 +46,8 @@ L.Draggable = L.Evented.extend({ _onDown: function (e) { this._moved = false; - if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } - - L.DomEvent.stopPropagation(e); + if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + L.Draggable._dragging = true; // Prevent dragging multiple objects at once. if (this._preventOutline) { L.DomUtil.preventOutline(this._element); @@ -142,5 +141,6 @@ L.Draggable = L.Evented.extend({ } this._moving = false; + L.Draggable._dragging = false; } }); From dd579830937bcef23319fd24874e2ea29645b110 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 28 Jul 2015 18:47:02 +0300 Subject: [PATCH 1771/2207] switch to new artifacts config --- .travis.yml | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/.travis.yml b/.travis.yml index a8a9d28f24b..3be69f23f8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,30 +1,23 @@ ---- sudo: false language: node_js -node_js: -- "0.10" +node_js: 0.12 +addons: + artifacts: + paths: + - dist + target_paths: + - content/build/${TRAVIS_BRANCH} env: global: - - "ARTIFACTS_S3_BUCKET=leaflet-cdn" + - ARTIFACTS_BUCKET=leafletjs-cdn + - ARTIFACTS_PERMISSIONS=public-read - secure: |- - LnvY/vWpmAIObabLrpu1mWYw1udllVpZJrrhzsn3traL+qU6yaGniQOn6u+l - iWSCuu7kXX3xv1GD7Fc6lTfQCg9F9dukWv9zlc4gFciyRpiUBuluuqtdV51A - 5yqpLkMpX2PMG7vwrOYttVW0uDlUcwGjyHxWZvnBOXCnnHSpnbI= + JlC1rD7WryxlUbWmD3NWVX9E60XB/+ss7+j0OaY3WqWziGUWDCuoVkOMGXnp + Ev27O8qhlmRkeyiimUN64UzK0yeZ139DcZMY6r4A5E2kwHYRAO/H/zl5RAGo + Yd9GUPwZfr3xV8WhH2GFy/L/mRjkGwue2o6ZxdsqBOKfYaF9Ryg= - secure: |- - EQ4c2c8VklzFZRxKnizI0/VK0anHhlyc1Rv0vqkMj/YPKxmbWNfOlsOCN2gM - p+q8QzCG1Np9D1Kq9K0miYqHgZxgu4D/4Mwy04bh1UfyoUcDfB1tJmEtsKY/ - 8Bl46ZfhxbTG39b6Y315GuU+49QdFMEXhSqx/G7on1xC4aYLXLc= -before_script: > - test ${TRAVIS_BRANCH} = master || - test ${TRAVIS_BRANCH} = stable && - test ${TRAVIS_PULL_REQUEST} = false && - gem install --no-document --version 0.8.9 faraday && - gem install --no-document travis-artifacts || true + XW1hzORAtSpTgTKkQwel5gRMDy6SotzeSRsVV2jQCn46VIMx8G/J5nOI+ImL + yeoH12PhCR0h39dM7mq8TYJo5DHwvbotI5nQhpMruSt8eMFbym8nGiqQh806 + fSJXkxmQ4MAjUdNFDIirBHhdZme8q3PueFzJ+5odFMvPGn/aITQ= after_success: > - test ${TRAVIS_BRANCH} = master || - test ${TRAVIS_BRANCH} = stable && - test ${TRAVIS_PULL_REQUEST} = false && - travis-artifacts upload --path dist --target-path build/${TRAVIS_BRANCH} && - cd dist && zip -x .DS_Store -r leaflet-${TRAVIS_BRANCH}.zip . && - travis-artifacts upload --path leaflet-${TRAVIS_BRANCH}.zip --target-path build || - echo did not upload branch ${TRAVIS_BRANCH}, pr ${TRAVIS_PULL_REQUEST} + zip -x .DS_Store -rj dist/leaflet.zip dist/* From f40dfa2eb6853e34f3206a708f5f4a22dfc49d01 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 28 Jul 2015 19:45:58 +0300 Subject: [PATCH 1772/2207] fix the archive build artifact --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3be69f23f8d..95d3e84fe3f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,4 +20,4 @@ env: yeoH12PhCR0h39dM7mq8TYJo5DHwvbotI5nQhpMruSt8eMFbym8nGiqQh806 fSJXkxmQ4MAjUdNFDIirBHhdZme8q3PueFzJ+5odFMvPGn/aITQ= after_success: > - zip -x .DS_Store -rj dist/leaflet.zip dist/* + cd dist && zip -x .DS_Store -r leaflet.zip . From 2ca1b779a63a9d9c5e97f379665fe65c4aaca5e3 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 28 Jul 2015 19:49:39 +0300 Subject: [PATCH 1773/2207] add master build back --- download.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/download.md b/download.md index f08117aae2c..53233afc303 100644 --- a/download.md +++ b/download.md @@ -23,10 +23,10 @@ bodyclass: download-page Leaflet 1.0 beta 1 Last 1.0 beta, released on July 14, 2015. - + [View Changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md) From afa0d1d87b4c522ca3cbeef785c829b886355982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 28 Jul 2015 19:41:09 +0200 Subject: [PATCH 1774/2207] Change L.Browser.msPointer detection code to MS recommendation --- src/core/Browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 599ff325817..0ad3dcdb6d1 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -16,7 +16,7 @@ gecko = ua.indexOf('gecko') !== -1 && !webkit && !window.opera && !ie, mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1, - msPointer = navigator.msPointerEnabled && navigator.msMaxTouchPoints && !window.PointerEvent, + msPointer = !window.PointerEvent && window.MSPointerEvent, pointer = (window.PointerEvent && navigator.pointerEnabled && navigator.maxTouchPoints) || msPointer, ie3d = ie && ('transition' in doc.style), From 6bb447bafe10aa1adbde9410961b84656e1653da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 29 Jul 2015 10:16:34 +0200 Subject: [PATCH 1775/2207] Allow disabling dragging during mid-drag. --- src/dom/Draggable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 053d2e529da..073a735401b 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -46,7 +46,7 @@ L.Draggable = L.Evented.extend({ _onDown: function (e) { this._moved = false; - if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches) || !this._enabled) { return; } L.Draggable._dragging = true; // Prevent dragging multiple objects at once. if (this._preventOutline) { From 39f03304a6df9fa8f456d2fb05eb3004cc2b7f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 29 Jul 2015 11:21:19 +0200 Subject: [PATCH 1776/2207] Fix Marker dragging with changing Icon, see #3687 --- src/layer/marker/Marker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index d25e986f558..c758ba2d821 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -130,7 +130,6 @@ L.Marker = L.Layer.extend({ } this._icon = icon; - this._initInteraction(); if (options.riseOnHover) { this.on({ @@ -160,6 +159,7 @@ L.Marker = L.Layer.extend({ if (addIcon) { this.getPane().appendChild(this._icon); + this._initInteraction(); } if (newShadow && addShadow) { this.getPane('shadowPane').appendChild(this._shadow); From 1d74d27c9cdcfed9aa78504d10de18afd022d298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 29 Jul 2015 11:36:32 +0200 Subject: [PATCH 1777/2207] Add plugins from #3201, #3252, #3253 --- plugins.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b3ef67fae77..47c3aa0b4be 100644 --- a/plugins.md +++ b/plugins.md @@ -799,6 +799,15 @@ These plugins provide new markers or news ways of converting abstract data into Lennard Voogdt + + + Leaflet.Extra-Markers + + Shameless copy of Awesome-Markers with more shapes, colors and semantic-ui support + + Cory Silva + + Leaflet.MakiMarkers @@ -1018,6 +1027,15 @@ When you are displaying a lot of data, these plugins will make your map look cle Nicholas Hallahan + + + Leaflet.ConditionalLayer + + A FeatureGroup that does not show any more than a certain amount of markers visible in the viewport. (Demo) + + EPP + + ### Heatmaps @@ -2154,7 +2172,17 @@ Buttons, sliders, toolbars, sidebars, and panels. David Albrecht - + + + Leaflet.Slider + + + Adds a <input type="range"> slider that calls a function every time its input is changed (Demo) + + + EPP + + From 4a8e1b6a871a0c78bb6683e3efad33b390116455 Mon Sep 17 00:00:00 2001 From: Fabrizio Minuti Date: Wed, 29 Jul 2015 14:10:20 +0200 Subject: [PATCH 1778/2207] Fix Internet Explorer map overflow outside container --- src/dom/DomUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index 8cd9a5d1021..607af9f08f3 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -143,7 +143,7 @@ L.DomUtil = { var pos = offset || new L.Point(0, 0); el.style[L.DomUtil.TRANSFORM] = - 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)' + (scale ? ' scale(' + scale + ')' : ''); + (L.Browser.ie3d ? 'translate(' + pos.x + 'px,' + pos.y + 'px' + ')' : 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)') + (scale ? ' scale(' + scale + ')' : ''); }, setPosition: function (el, point) { // (HTMLElement, Point[, Boolean]) From 895a75de4872a58561002bc182f2aa538b134149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 30 Jul 2015 10:33:57 +0200 Subject: [PATCH 1779/2207] Do not set draggable flags during a zoom animation --- src/dom/Draggable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 073a735401b..48644e4d86a 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -46,6 +46,8 @@ L.Draggable = L.Evented.extend({ _onDown: function (e) { this._moved = false; + if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } + if (L.Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches) || !this._enabled) { return; } L.Draggable._dragging = true; // Prevent dragging multiple objects at once. @@ -53,8 +55,6 @@ L.Draggable = L.Evented.extend({ L.DomUtil.preventOutline(this._element); } - if (L.DomUtil.hasClass(this._element, 'leaflet-zoom-anim')) { return; } - L.DomUtil.disableImageDrag(); L.DomUtil.disableTextSelection(); From 723c22312d34d0f4c021909c86f46cad163ca103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 30 Jul 2015 13:59:09 +0200 Subject: [PATCH 1780/2207] L.Control.Layers shows disabled inputs for non-visible tilelayers --- src/control/Control.Layers.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 7d4b9f3c32c..3cd23ae395b 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -26,13 +26,20 @@ L.Control.Layers = L.Control.extend({ } }, - onAdd: function () { + onAdd: function (map) { this._initLayout(); this._update(); + this._map = map; + map.on('zoomend', this._checkDisabledLayers, this); + return this._container; }, + onRemove: function() { + this._map.off('zoomend', this._checkDisabledLayers, this); + }, + addBaseLayer: function (layer, name) { this._addLayer(layer, name); return this._update(); @@ -209,6 +216,7 @@ L.Control.Layers = L.Control.extend({ var container = obj.overlay ? this._overlaysList : this._baseLayersList; container.appendChild(label); + this._checkDisabledLayers(); return label; }, @@ -254,10 +262,26 @@ L.Control.Layers = L.Control.extend({ L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar'); this._form.style.height = acceptableHeight + 'px'; } + this._checkDisabledLayers(); }, _collapse: function () { L.DomUtil.removeClass(this._container, 'leaflet-control-layers-expanded'); + }, + + _checkDisabledLayers: function () { + var inputs = this._form.getElementsByTagName('input'), + input, + layer, + zoom = this._map.getZoom(); + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._layers[input.layerId].layer; + input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) || + (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom); + + } } }); From 936b8d119d3d709047f583fbad849cf4efa3e2e7 Mon Sep 17 00:00:00 2001 From: Fabrizio Minuti Date: Mon, 3 Aug 2015 14:49:19 +0200 Subject: [PATCH 1781/2207] Remove extra params from L.Util.requestAnimFrame calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I removed the parameters from the calls to L.Util.requestAnimFrame: they don’t seem to be used. --- src/dom/Draggable.js | 2 +- src/map/Map.js | 2 +- src/map/handler/Map.TouchZoom.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 48644e4d86a..0056e8d02bb 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -104,7 +104,7 @@ L.Draggable = L.Evented.extend({ L.Util.cancelAnimFrame(this._animRequest); this._lastEvent = e; - this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); + this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true); }, _updatePosition: function () { diff --git a/src/map/Map.js b/src/map/Map.js index 6d911363f5e..5db707d5f53 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -616,7 +616,7 @@ L.Map = L.Evented.extend({ _onResize: function () { L.Util.cancelAnimFrame(this._resizeRequest); this._resizeRequest = L.Util.requestAnimFrame( - function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); + function () { this.invalidateSize({debounceMoveend: true}); }, this); }, _onScroll: function () { diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 2f8f13af105..f142e1a42b9 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -79,7 +79,7 @@ L.Map.TouchZoom = L.Handler.extend({ L.Util.cancelAnimFrame(this._animRequest); var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}); - this._animRequest = L.Util.requestAnimFrame(moveFn, this, true, map._container); + this._animRequest = L.Util.requestAnimFrame(moveFn, this, true); L.DomEvent.preventDefault(e); }, From fecd412209c3dd9674d9f6e7094daf94307dbb1d Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Mon, 3 Aug 2015 21:26:56 +0200 Subject: [PATCH 1782/2207] Truncate high/low latitudes for Spherical Mercator like previous versions. Close #3700. --- spec/suites/layer/tile/GridLayerSpec.js | 16 ++++++++-------- .../projection/Projection.SphericalMercator.js | 6 ++++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index 4d4882ee93c..de8b1c5fb5b 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -57,14 +57,14 @@ describe('GridLayer', function () { } expect(loaded).to.eql({ - '144:44': [0, 0], - '400:44': [1, 0], - '144:300': [0, 1], - '400:300': [1, 1], - '-112:44': [1, 0], - '656:44': [0, 0], - '-112:300': [1, 1], - '656:300': [0, 1] + '144:0': [0, 0], + '400:0': [1, 0], + '144:256': [0, 1], + '400:256': [1, 1], + '-112:0': [1, 0], + '656:0': [0, 0], + '-112:256': [1, 1], + '656:256': [0, 1] }); }); diff --git a/src/geo/projection/Projection.SphericalMercator.js b/src/geo/projection/Projection.SphericalMercator.js index 4367cbad8ec..278e1529051 100644 --- a/src/geo/projection/Projection.SphericalMercator.js +++ b/src/geo/projection/Projection.SphericalMercator.js @@ -5,11 +5,13 @@ L.Projection.SphericalMercator = { R: 6378137, + MAX_LATITUDE: 85.0511287798, project: function (latlng) { var d = Math.PI / 180, - max = 1 - 1E-15, - sin = Math.max(Math.min(Math.sin(latlng.lat * d), max), -max); + max = this.MAX_LATITUDE, + lat = Math.max(Math.min(max, latlng.lat), -max), + sin = Math.sin(lat * d); return new L.Point( this.R * latlng.lng * d, From 81e71fe7e03aa252735f540d2e66af61ee6ce1a5 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 4 Aug 2015 13:39:51 +0300 Subject: [PATCH 1783/2207] check for geolocation clearWatch, #3707 --- src/map/ext/Map.Geolocation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index bf728a7a599..c1fcf98a200 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -37,7 +37,7 @@ L.Map.include({ }, stopLocate: function () { - if (navigator.geolocation) { + if (navigator.geolocation && navigator.geolocation.clearWatch) { navigator.geolocation.clearWatch(this._locationWatchId); } if (this._locateOptions) { From 0848635b9a94ae318de15cad45083da6f2a90be2 Mon Sep 17 00:00:00 2001 From: Andreas Knab Date: Thu, 6 Aug 2015 15:31:27 +0200 Subject: [PATCH 1784/2207] Use radius if radiusY is not set --- src/layer/vector/Circle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index 9bfd8998af2..bfef81ced53 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -21,7 +21,7 @@ L.Circle = L.CircleMarker.extend({ }, getBounds: function () { - var half = [this._radius, this._radiusY]; + var half = [this._radius, this._radiusY || this._radius]; return new L.LatLngBounds( this._map.layerPointToLatLng(this._point.subtract(half)), From 66e6e856de94bbbc86e5b423e02fb92464da1498 Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 9 Aug 2015 15:42:24 -0700 Subject: [PATCH 1785/2207] Always force GridLayer to have a zIndex Fixes https://github.com/Leaflet/Leaflet/issues/3721 --- src/layer/tile/GridLayer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7e96c2e0f81..7ff565f4391 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -9,12 +9,12 @@ L.GridLayer = L.Layer.extend({ tileSize: 256, opacity: 1, + zIndex: 1, updateWhenIdle: L.Browser.mobile, updateInterval: 200, - + attribution: null, - zIndex: null, bounds: null, minZoom: 0 From 431547c28e182f5c6cab29088ea4d8ba917f636f Mon Sep 17 00:00:00 2001 From: Patrick Arlt Date: Sun, 9 Aug 2015 15:45:18 -0700 Subject: [PATCH 1786/2207] Trailing whitespace --- src/layer/tile/GridLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7ff565f4391..7c83f9a2a0b 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -13,7 +13,7 @@ L.GridLayer = L.Layer.extend({ updateWhenIdle: L.Browser.mobile, updateInterval: 200, - + attribution: null, bounds: null, From 62f1cd2f58a626fa86f845a251156ec6310b6d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 10 Aug 2015 15:04:21 +0200 Subject: [PATCH 1787/2207] Build sourcemaps via magic-string --- .gitignore | 1 + build/build.js | 37 ++++++++++++++++++++++++++++--------- package.json | 1 + 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index d3c27b0e1b4..3e1080a7c14 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ tmp/**/* *.sublime-* _site dist/*.js +dist/*.map coverage/ *.js.html index.html diff --git a/build/build.js b/build/build.js index dc05665fff9..b198a6d51f1 100644 --- a/build/build.js +++ b/build/build.js @@ -1,6 +1,7 @@ var fs = require('fs'), UglifyJS = require('uglify-js'), zlib = require('zlib'), + MagicString = require('magic-string'), deps = require('./deps.js').deps; @@ -69,12 +70,21 @@ function loadSilently(path) { } } -function combineFiles(files) { - var content = ''; +function bundleFiles(files, copy) { + var bundle = new MagicString.Bundle(); + for (var i = 0, len = files.length; i < len; i++) { - content += fs.readFileSync(files[i], 'utf8') + '\n\n'; + bundle.addSource({ + filename: files[i], + content: new MagicString( fs.readFileSync(files[i], 'utf8') + '\n\n' ) + }); } - return content; + + bundle.prepend( + copy + '(function (window, document, undefined) {' + ).append('}(window, document));'); + + return bundle; } function bytesToKB(bytes) { @@ -85,15 +95,19 @@ exports.build = function (callback, version, compsBase32, buildName) { var files = getFiles(compsBase32); - console.log('Concatenating and compressing ' + files.length + ' files...'); + console.log('Bundling and compressing ' + files.length + ' files...'); var copy = fs.readFileSync('src/copyright.js', 'utf8').replace('{VERSION}', version), - intro = '(function (window, document, undefined) {', - outro = '}(window, document));', - newSrc = copy + intro + combineFiles(files) + outro, - pathPart = 'dist/leaflet' + (buildName ? '-' + buildName : ''), + filenamePart = 'leaflet' + (buildName ? '-' + buildName : ''), + pathPart = 'dist/' + filenamePart, srcPath = pathPart + '-src.js', + mapPath = pathPart + '-src.map', + srcFilename = filenamePart + '-src.js', + mapFilename = filenamePart + '-src.map', + + bundle = bundleFiles(files, copy), + newSrc = bundle.toString() + '\n//# sourceMappingURL=' + mapFilename, oldSrc = loadSilently(srcPath), srcDelta = getSizeDelta(newSrc, oldSrc, true); @@ -102,6 +116,11 @@ exports.build = function (callback, version, compsBase32, buildName) { if (newSrc !== oldSrc) { fs.writeFileSync(srcPath, newSrc); + fs.writeFileSync(mapPath, bundle.generateMap({ + file: srcFilename, + includeContent: true, + hires: false + })); console.log('\tSaved to ' + srcPath); } diff --git a/package.json b/package.json index 82d7f8638b4..5dc8fc30a5d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "karma-mocha": "~0.2.0", "karma-phantomjs-launcher": "^0.2.0", "karma-safari-launcher": "~0.1.1", + "magic-string": "^0.6.4", "mocha": "~2.2.5", "tin": "^0.5.0", "uglify-js": "~2.4.23" From 485c1987f08001bed5ec5c64b4e445504c903384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 11 Aug 2015 10:04:21 +0200 Subject: [PATCH 1788/2207] Document createTile async mode --- reference.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reference.html b/reference.html index 12141d07b99..45d9b8fbe50 100644 --- a/reference.html +++ b/reference.html @@ -3373,9 +3373,10 @@

          Synchronous usage example

          Asyncronous usage example

          -

          Tile creation can also be asyncronous, this is useful when using a third-party drawing library. Once the tile is finsihed drawing it can be passed to the done() callback.

          +

          Tile creation can also be asyncronous, this is useful when using a third-party drawing library. Once the tile has finished drawing it must be passed to the done() callback.

          var CanvasLayer = L.GridLayer.extend({
          +	// createTile has a 'done' parameter when on async mode
           	createTile: function(coords, done){
           		var error;
           
          @@ -3387,8 +3388,14 @@ 

          Asyncronous usage example

          tile.width = size.x; tile.height = size.y; - // draw something and pass the tile to the done() callback - done(error, tile); + // For this example simply wait one second before tile is ready + window.setTimeout(function(){ + // draw something and pass the tile to the done() callback + done(error, tile); + }, 1000); + + // return the tile so its progress can be tracked + return tile; } });
          From 21ae5c6859956607db4b4f60e401929bee8fe978 Mon Sep 17 00:00:00 2001 From: Daniel Peukert Date: Tue, 18 Aug 2015 22:28:17 +0200 Subject: [PATCH 1789/2207] Fixed various typos in the documentation --- reference.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reference.html b/reference.html index 47f7696a64b..67cd41b76f1 100644 --- a/reference.html +++ b/reference.html @@ -1018,7 +1018,7 @@

          Locate options

          watch Boolean false - If true, starts continous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. + If true, starts continuous watching of location changes (instead of detecting it once) using W3C watchPosition method. You can later stop watching using map.stopLocate() method. setView @@ -1363,7 +1363,7 @@

          Options

          zIndexOffset Number 0 - By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). + By default, zIndex for the marker image is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like 1000 (or high negative value, respectively). opacity @@ -4772,17 +4772,17 @@

          MouseEvent

          latlng LatLng - The geographical point where the mouse event occured. + The geographical point where the mouse event occurred. layerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map layer. + Pixel coordinates of the point where the mouse event occurred relative to the map layer. containerPoint Point - Pixel coordinates of the point where the mouse event occured relative to the map сontainer. + Pixel coordinates of the point where the mouse event occurred relative to the map сontainer. originalEvent @@ -5535,7 +5535,7 @@

          Methods

          Point[] - Clips the polygon geometry defined by the given points by rectangular bounds. Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping than polyline, so there's a seperate method for it. + Clips the polygon geometry defined by the given points by rectangular bounds. Used by Leaflet to only show polygon points that are on the screen or near, increasing performance. Note that polygon points needs different algorithm for clipping than polyline, so there's a separate method for it. From b0259a1f8d0f83f4711eb57562f2e6b10ff9fdde Mon Sep 17 00:00:00 2001 From: James Badger Date: Tue, 18 Aug 2015 15:51:55 -0600 Subject: [PATCH 1790/2207] Add PolarMap.js plugin to basemap providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PolarMap.js is a wrapper library around Leaflet that makes integration with the ArcticWebMap tile server easy. http://webmap.arcticconnect.org/polarmap.html The API has a simple layer that makes it easy to get started, and a lower-level layer that can be used to integrate with other Leaflet plugins or applications. ArcticWebMap is a tile server our research lab runs and it provides OpenStreetMap data in five Arctic-focused projections: EPSG:3571 – EPSG:3576. In these projections, Arctic areas do not suffer from the distortion present in Web Mercator at the expense that everything below 45˚N is highly distorted. See the [ArcticWebMap](http://webmap.arcticconnect.org/index.html) page for an example. We are using [a fork of the openstreetmap-carto style](https://github.com/GeoSensorWebLab/awm-styles) that has been modified to include bathymetry data, more lake data, CanVec contour data (Canadian Territories only), and other enhancements for northern communities. Both ArcticWebMap and PolarMap.js are a part of the [ArcticConnect research project](http://arcticconnect.org). If you have any questions, feel free to ask! --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 47c3aa0b4be..4c9c86170d1 100644 --- a/plugins.md +++ b/plugins.md @@ -166,6 +166,15 @@ Ready-to-go basemaps, with little or no configuration at all. Patricio Soriano + + + PolarMap.js + + JavaScript library for displaying tiles from ArcticWebMap, a free tile provider with OSM data in multiple Arctic polar projections. Includes lower-level API for deeper integration with other Leaflet plugins. + + GeoSensorWeb Lab + + From 2a2c23d459b1251dd215b5b69a36cd92896af766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 16 Jun 2015 16:31:13 +0200 Subject: [PATCH 1791/2207] WIP Map rotation, with working math. --- debug/map/rotate.html | 194 +++++++++++++++++++++++++++++++++++++ src/dom/DomUtil.js | 29 ++++-- src/geometry/Point.js | 20 ++++ src/layer/marker/Marker.js | 6 +- src/map/Map.js | 132 ++++++++++++++++++++++--- 5 files changed, 362 insertions(+), 19 deletions(-) create mode 100644 debug/map/rotate.html diff --git a/debug/map/rotate.html b/debug/map/rotate.html new file mode 100644 index 00000000000..94193c77328 --- /dev/null +++ b/debug/map/rotate.html @@ -0,0 +1,194 @@ + + + + Leaflet debug page + + + + + + + + + + + + + + + +
          +
          + +
          + + + + + + + + + +
          LatLng
          Rel to pane
          Rel to container
          Pivot
          Pane offset
          + + + + + + + + + + + + + + diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index 607af9f08f3..44ad44a14cd 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -139,21 +139,34 @@ L.DomUtil = { return false; }, - setTransform: function (el, offset, scale) { + setTransform: function (el, offset, scale, bearing, pivot) { var pos = offset || new L.Point(0, 0); - el.style[L.DomUtil.TRANSFORM] = - (L.Browser.ie3d ? 'translate(' + pos.x + 'px,' + pos.y + 'px' + ')' : 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)') + (scale ? ' scale(' + scale + ')' : ''); + if (!bearing) { + el.style[L.DomUtil.TRANSFORM] = + (L.Browser.ie3d ? 'translate(' + pos.x + 'px,' + pos.y + 'px' + ')' : 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)') + (scale ? ' scale(' + scale + ')' : ''); + } else { + pos = pos.rotateFrom(bearing, pivot); + +// console.log('translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)' + +// (scale ? ' scale(' + scale + ')' : '') + +// ' rotate(' + bearing + 'rad)'); + + el.style[L.DomUtil.TRANSFORM] = + 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)' + + (scale ? ' scale(' + scale + ')' : '') + + ' rotate(' + bearing + 'rad)'; + } }, - setPosition: function (el, point) { // (HTMLElement, Point[, Boolean]) + setPosition: function (el, point, bearing, pivot) { // (HTMLElement, Point[, Boolean]) /*eslint-disable */ el._leaflet_pos = point; /*eslint-enable */ if (L.Browser.any3d) { - L.DomUtil.setTransform(el, point); + L.DomUtil.setTransform(el, point, undefined, bearing, pivot); } else { el.style.left = point.x + 'px'; el.style.top = point.y + 'px'; @@ -165,7 +178,11 @@ L.DomUtil = { // so it's safe to cache the position for performance return el._leaflet_pos; - } + }, + + // Constants for rotation + DEG_TO_RAD: Math.PI / 180, + RAD_TO_DEG: 180 / Math.PI }; diff --git a/src/geometry/Point.js b/src/geometry/Point.js index 9bc0267cf17..5c8f8c8e463 100644 --- a/src/geometry/Point.js +++ b/src/geometry/Point.js @@ -120,6 +120,26 @@ L.Point.prototype = { return 'Point(' + L.Util.formatNum(this.x) + ', ' + L.Util.formatNum(this.y) + ')'; + }, + + rotate: function(theta) { + if (!theta) { return this; } + // Rotate around (0,0) by applying the 2D rotation matrix: + // [ x ] = [ x ] [ cos θ -sin θ ] + // [ y ] = [ y ] [ sin θ cos θ ] + // Theta must be given in radians. + var sinTheta = Math.sin(theta); + var cosTheta = Math.cos(theta); + + return new L.Point( + this.x * cosTheta - this.y * sinTheta, + this.x * sinTheta + this.y * cosTheta + ); + }, + + rotateFrom: function(theta, pivot) { + if (!theta) { return this; } + return this.clone().subtract(pivot).rotate(theta).add(pivot); } }; diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index c758ba2d821..6f227ecaa3a 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -94,7 +94,7 @@ L.Marker = L.Layer.extend({ update: function () { if (this._icon) { - var pos = this._map.latLngToLayerPoint(this._latlng).round(); + var pos = this._map.latLngToLayerPoint(this._latlng, true).round(); this._setPos(pos); } @@ -188,7 +188,9 @@ L.Marker = L.Layer.extend({ }, _setPos: function (pos) { - L.DomUtil.setPosition(this._icon, pos); + var anchor = this.options.icon.options.iconAnchor; + L.DomUtil.setPosition(this._icon, pos, -this._map._bearing, pos.add(anchor)); +// L.DomUtil.setPosition(this._icon, pos); if (this._shadow) { L.DomUtil.setPosition(this._shadow, pos); diff --git a/src/map/Map.js b/src/map/Map.js index 5db707d5f53..732da6f62ff 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -16,12 +16,15 @@ L.Map = L.Evented.extend({ fadeAnimation: true, trackResize: true, markerZoomAnimation: true, - maxBoundsViscosity: 0.0 + maxBoundsViscosity: 0.0, + bearing: 0 }, initialize: function (id, options) { // (HTMLElement or String, Object) options = L.setOptions(this, options); + if (options.bearing) { this._bearing = options.bearing; } + this._initContainer(id); this._initLayout(); @@ -416,14 +419,19 @@ L.Map = L.Evented.extend({ return this.options.crs.pointToLatLng(L.point(point), zoom); }, - layerPointToLatLng: function (point) { // (Point) + layerPointToLatLng: function (point/*, rotate*/) { // (Point) + //// FIXME: Add branch for rotated panes var projectedPoint = L.point(point).add(this.getPixelOrigin()); return this.unproject(projectedPoint); }, - latLngToLayerPoint: function (latlng) { // (LatLng) + latLngToLayerPoint: function (latlng/*, rotate*/) { // (LatLng) var projectedPoint = this.project(L.latLng(latlng))._round(); - return projectedPoint._subtract(this.getPixelOrigin()); +// if (!rotate) { + return projectedPoint._subtract(this.getPixelOrigin()); +// } else { +// return projectedPoint._subtract(this.getPixelOrigin()).rotateFrom(this._bearing, this._getCenterLayerPoint()); +// } }, wrapLatLng: function (latlng) { @@ -435,11 +443,13 @@ L.Map = L.Evented.extend({ }, containerPointToLayerPoint: function (point) { // (Point) - return L.point(point).subtract(this._getMapPanePos()); +// return L.point(point).subtract(this._getMapPanePos()); + return L.point(point).subtract(this._getMapPanePos()).rotateFrom(-this._bearing, this.getSize().divideBy(2)); }, layerPointToContainerPoint: function (point) { // (Point) - return L.point(point).add(this._getMapPanePos()); +// return L.point(point).add(this._getMapPanePos()); + return L.point(point).add(this._getMapPanePos()).rotateFrom(this._bearing, this.getSize().divideBy(2)); }, containerPointToLatLng: function (point) { @@ -464,6 +474,98 @@ L.Map = L.Evented.extend({ }, + // Rotation methods + setBearing: function(theta) { + + console.log('old center: ', this.getCenter()); + var oldPixelCenter = this.latLngToLayerPoint(this.getCenter()); + + + var rotatePanePos = this._getRotatePanePos(); + + var halfSize = this.getSize().divideBy(2); + + var pivot = this._getMapPanePos().clone().multiplyBy(-1).add(halfSize); + + rotatePanePos = rotatePanePos.rotateFrom( -this._bearing, pivot ); + + + /// DEBUG!! + L.DomUtil.setPosition(this._rotatePane, rotatePanePos); + + +// var currCenterLatLng = this.containerPointToLatLng(this.getSize().divideBy(2)); +// L.DomUtil.setPosition(this._rotatePane, new L.Point(0, 0)); +// this._lastCenter = currCenterLatLng; + +// L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); +// this._pixelOrigin = this._getNewPixelOrigin(currCenterLatLng); +// L.DomUtil.setPosition(this._rotatePane, new L.Point(0, 0)); +// this._pixelOrigin = this._getNewPixelOrigin(this.getCenter()); + +// var newBearing = theta * L.DomUtil.DEG_TO_RAD; + +// var halfSize = this.getSize().divideBy(2); + +// this._resetView(currCenterLatLng, this.getZoom()); + +// console.log('Old, new pivots:', this._pivot, this._getCenterLayerPoint()); + +// var pos = this._getMapPanePos(); //.multiplyBy(-1); +// var panePos = new L.Point(0, 0); //.multiplyBy(-1); + +// var panePos = this._getMapPanePos().clone().multiplyBy(-1); +// var panePos = this._getMapPanePos(); +// var panePos = this._getMapPanePos().rotateFrom( -newBearing, halfSize ).multiplyBy(-1); +// panePos.y = -panePos.y; + +// var rotatePaneOffset = L.DomUtil.getPosition(this._rotatePane) || new L.Point(0, 0); +// this._pivot = this._getCenterLayerPoint(); +// var newPivot = this.getSize().divideBy(2).add( panePos ); +// var newPivot = this.getSize().divideBy(2).subtract( panePos ); +// var newPivot = this.latLngToLayerPoint(this.getCenter()).subtract( panePos ); +// var newPivot = this.getSize().divideBy(2); + // .subtract( panePos ); + +// var offset = pos.rotateFrom(-this._bearing, this._pivot).rotate(newBearing, newPivot).multiplyBy(-1); +// +// console.log('offset: ', offset); +// L.DomUtil.setPosition(this._mapPane, offset); + +// this._bearing = newBearing; + this._bearing = theta * L.DomUtil.DEG_TO_RAD;; + this._pivot = pivot; + +// var pos = new L.Point(0, 0); + + +// L.DomUtil.setPosition(this._rotatePane, new L.Point(0, 0), this._bearing, this.getSize().divideBy(2).subtract(this._getMapPanePos())); +// L.DomUtil.setPosition(this._rotatePane, new L.Point(0, 0), this._bearing, this.getSize().divideBy(2)); + L.DomUtil.setPosition(this._rotatePane, rotatePanePos, this._bearing, pivot); + + this._rotatePanePos = rotatePanePos.rotateFrom(this._bearing, pivot); + + for (var i in this._layers) { + // Consider doing this in the markers instead. + if (this._layers[i].options.pane === 'markerPane') { + this._layers[i].update(); + } + } + this.fire('rotate'); +// console.log('new center: ', this.getCenter()); + var newPixelCenter = this.latLngToLayerPoint(this.getCenter()); + console.log('new center: ', this.getCenter()); + var offset = newPixelCenter.subtract(oldPixelCenter); + console.log('offset in pixels:', offset); + + }, + + getBearing: function() { + return this._bearing || 0; + }, + + + // map initialization methods _initContainer: function (id) { @@ -511,11 +613,15 @@ L.Map = L.Evented.extend({ this._mapPane = this.createPane('mapPane', this._container); L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - this.createPane('tilePane'); - this.createPane('shadowPane'); - this.createPane('overlayPane'); - this.createPane('markerPane'); - this.createPane('popupPane'); + this._pivot = this.getSize().divideBy(2); + this._rotatePane = this.createPane('rotatePane', this._mapPane); + L.DomUtil.setPosition(this._rotatePane, new L.Point(0, 0), this._bearing, this._pivot); + + this.createPane('tilePane', this._rotatePane); + this.createPane('shadowPane', this._rotatePane); + this.createPane('overlayPane', this._rotatePane); + this.createPane('markerPane', this._rotatePane); + this.createPane('popupPane', this._rotatePane); if (!this.options.markerZoomAnimation) { L.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide'); @@ -727,6 +833,10 @@ L.Map = L.Evented.extend({ return L.DomUtil.getPosition(this._mapPane) || new L.Point(0, 0); }, + _getRotatePanePos: function () { + return this._rotatePanePos || new L.Point(0, 0); + }, + _moved: function () { var pos = this._getMapPanePos(); return pos && !pos.equals([0, 0]); From 50ec52c026a2a27a13e558086409f9a9eebc7f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 17 Jun 2015 10:43:27 +0200 Subject: [PATCH 1792/2207] Working zoom animations with map rotation. --- debug/map/rotate.html | 68 ++++++++++++++++++++++------- src/map/Map.js | 99 +++++++++++++------------------------------ 2 files changed, 82 insertions(+), 85 deletions(-) diff --git a/debug/map/rotate.html b/debug/map/rotate.html index 94193c77328..96a647dc322 100644 --- a/debug/map/rotate.html +++ b/debug/map/rotate.html @@ -22,18 +22,29 @@ th { text-align: left; } + td.long { + width: calc(90vw - 21em); + max-width: calc(90vw - 21em); + } div.crosshair { position:absolute; width:1px; height:1px; - border: 1px solid green; + border: 1px dotted green; z-index: 100; } div.pivot { position:absolute; width:1px; height:1px; - border: 1px solid red; + border: 1px solid purple; + z-index: 100; + } + div.pixelorigin { + position:absolute; + width:1px; + height:1px; + border: 1px solid cyan; z-index: 100; } div.panebounds.main { @@ -75,22 +86,38 @@ - - - - - + + + + + + + + + + + +
          LatLng
          Rel to pane
          Rel to container
          Pivot
          Pane offset
          LatLng LatLng of mouse pointer
          Rel to pane Mouse pointer pixel coords relative to _rotatePane
          Rel to containerMouse pointer coords relative to map <div>
          Pivot Last _rotationPane pivot pixel coords relative to _rotationPane
          Pane offset Pixel offset of _mapPane
          Pixel origin Negative pixel coords of the (0,0) CRS point relative to _rotatePane
          - - - - - - - +
          + + + + + + + +
          + +
          + + + +
          + + + + + + + + +
          + + + +
          + + + + + + + +
          + + + + diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 0056e8d02bb..2d0f59e1fa2 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -43,6 +43,10 @@ L.Draggable = L.Evented.extend({ this._moved = false; }, + updateMapBearing: function(mapBearing) { + this._mapBearing = mapBearing; + }, + _onDown: function (e) { this._moved = false; @@ -80,7 +84,13 @@ L.Draggable = L.Evented.extend({ var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), newPoint = new L.Point(first.clientX, first.clientY), - offset = newPoint.subtract(this._startPoint); + offset = newPoint.subtract(this._startPoint), + bearing = this._mapBearing || 0; + + console.log(offset, bearing, offset.rotate(bearing)); + if (bearing) { + offset = offset.rotate(-bearing); + } if (!offset.x && !offset.y) { return; } if (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; } diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js index 108bcff385a..bed83de924d 100644 --- a/src/layer/marker/Marker.Drag.js +++ b/src/layer/marker/Marker.Drag.js @@ -5,7 +5,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ initialize: function (marker) { this._marker = marker; - }, +}, addHooks: function () { var icon = this._marker._icon; @@ -44,6 +44,7 @@ L.Handler.MarkerDrag = L.Handler.extend({ .closePopup() .fire('movestart') .fire('dragstart'); + this._draggable.updateMapBearing(this._marker._map._bearing); }, _onDrag: function (e) { @@ -52,6 +53,11 @@ L.Handler.MarkerDrag = L.Handler.extend({ iconPos = L.DomUtil.getPosition(marker._icon), latlng = marker._map.layerPointToLatLng(iconPos); + if (this._marker._map._bearing) { + var anchor = marker.options.icon.options.iconAnchor; + L.DomUtil.setPosition(marker._icon, iconPos, -marker._map._bearing, iconPos.add(anchor)) + } + // update shadow position if (shadow) { L.DomUtil.setPosition(shadow, iconPos); diff --git a/src/map/Map.js b/src/map/Map.js index 0d0f64f2797..af6b4caca62 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -419,19 +419,14 @@ L.Map = L.Evented.extend({ return this.options.crs.pointToLatLng(L.point(point), zoom); }, - layerPointToLatLng: function (point/*, rotate*/) { // (Point) - //// FIXME: Add branch for rotated panes + layerPointToLatLng: function (point) { // (Point) var projectedPoint = L.point(point).add(this.getPixelOrigin()); return this.unproject(projectedPoint); }, latLngToLayerPoint: function (latlng/*, rotate*/) { // (LatLng) var projectedPoint = this.project(L.latLng(latlng))._round(); -// if (!rotate) { - return projectedPoint._subtract(this.getPixelOrigin()); -// } else { -// return projectedPoint._subtract(this.getPixelOrigin()).rotateFrom(this._bearing, this._getCenterLayerPoint()); -// } + return projectedPoint._subtract(this.getPixelOrigin()); }, wrapLatLng: function (latlng) { @@ -495,7 +490,7 @@ L.Map = L.Evented.extend({ rotatePanePos = rotatePanePos.rotateFrom( -this._bearing, this._pivot ); - this._bearing = theta * L.DomUtil.DEG_TO_RAD;; + this._bearing = theta * L.DomUtil.DEG_TO_RAD; this._rotatePanePos = rotatePanePos.rotateFrom(this._bearing, this._pivot); L.DomUtil.setPosition(this._rotatePane, this._rotatePanePos, this._bearing, this._rotatePanePos); @@ -510,7 +505,7 @@ L.Map = L.Evented.extend({ }, getBearing: function() { - return this._bearing || 0; + return (this._bearing || 0) * L.DomUtil.RAD_TO_DEG; }, @@ -809,8 +804,6 @@ L.Map = L.Evented.extend({ .add(this._getRotatePanePos()) .rotate(-this._bearing) ._round(); -// - }, _latLngToNewLayerPoint: function (latlng, zoom, center) { From 2d39c209e2b17dece1e22adbc8fb7bbf9d58977e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 17 Jun 2015 17:04:25 +0200 Subject: [PATCH 1794/2207] Map rotation: GridLayer tile range calculations. --- debug/map/rotate-and-drag.html | 10 +++++++++- debug/tests/tile-bounds.html | 24 +++++++++++++++++++----- src/dom/Draggable.js | 2 +- src/layer/tile/GridLayer.js | 22 +++++++++++++++++----- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/debug/map/rotate-and-drag.html b/debug/map/rotate-and-drag.html index eb77e919f47..58565efb72a 100644 --- a/debug/map/rotate-and-drag.html +++ b/debug/map/rotate-and-drag.html @@ -63,7 +63,15 @@ marker4.bindPopup(loremIpsum + '

          DF

          ').addTo(map); marker5.bindPopup(loremIpsum + '

          Trd

          ').addTo(map); - + function rotate(ev) { + if (ev.buttons === 0) return; + var angle = ev.target.valueAsNumber; +// console.log(angle); + map.setBearing(angle); + } + + document.getElementById('rho_input').addEventListener('change', rotate); + document.getElementById('rho_input').addEventListener('mousemove', rotate); diff --git a/debug/tests/tile-bounds.html b/debug/tests/tile-bounds.html index acf9558fe75..7d3da6499f6 100644 --- a/debug/tests/tile-bounds.html +++ b/debug/tests/tile-bounds.html @@ -15,18 +15,32 @@ #map { margin: 256px; width: auto; - overflow: visible + overflow: visible; + z-index:0; } +
          + The CSS in this page makes the boundaries of the GridLayer tiles visible. Tiles which do not overlap the map bounds shall not be shown, even at fractional zoom levels. - The CSS in this page makes the boundaries of the GridLayer tiles visible. Tiles which do not overlap the map bounds shall not be shown, even at fractional zoom levels. + + - - +
          + + + + + + + +
          +
          -
          +
          +
          +
          + + + + + + diff --git a/debug/rotate/rotate-mobile.html b/debug/rotate/rotate-mobile.html new file mode 100644 index 00000000000..b7c836c5062 --- /dev/null +++ b/debug/rotate/rotate-mobile.html @@ -0,0 +1,51 @@ + + + + Leaflet geolocation debug page + + + + + + + + + + + +
          + + + + diff --git a/debug/map/rotate.html b/debug/rotate/rotate.html similarity index 96% rename from debug/map/rotate.html rename to debug/rotate/rotate.html index 36e6d48214a..1d59f574dde 100644 --- a/debug/map/rotate.html +++ b/debug/rotate/rotate.html @@ -142,7 +142,7 @@ }); - var map = L.map('map') //, {bearing: Math.PI / 4}) + var map = L.map('map', {rotate: true}) .setView([55, 10], 0) .addLayer(osm) .addLayer(path); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 2f5cedd5326..d921775d9cd 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -33,7 +33,7 @@ L.GridLayer = L.Layer.extend({ this._resetView(); this._update(); - map.on('rotate', this._onMoveEnd, this); + map.on('rotateend', this._onMoveEnd, this); }, beforeAdd: function (map) { @@ -45,7 +45,7 @@ L.GridLayer = L.Layer.extend({ map._removeZoomLimit(this); this._container = null; this._tileZoom = null; - map.off('rotate', this._onMoveEnd, this); + map.off('rotateend', this._onMoveEnd, this); }, bringToFront: function () { @@ -410,7 +410,7 @@ L.GridLayer = L.Layer.extend({ }, _onMoveEnd: function () { - if (!this._map) { return; } + if (!this._map || this._map.isRotating()) { return; } this._update(); this._pruneTiles(); diff --git a/src/map/Map.js b/src/map/Map.js index d109d88c4d1..1d9bf1910c9 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -17,7 +17,8 @@ L.Map = L.Evented.extend({ trackResize: true, markerZoomAnimation: true, maxBoundsViscosity: 0.0, - bearing: 0 + bearing: 0, + rotate: false }, initialize: function (id, options) { // (HTMLElement or String, Object) @@ -481,8 +482,20 @@ L.Map = L.Evented.extend({ // Rotation methods - setBearing: function(theta, skipEvent) { - if (!L.Browser.any3d) { return; } + // setBearing will work with just the 'theta' parameter. unfinished is + // completely optional. + // Set theta to the desired bearing, in degrees. + // Set unfinished to true in order to not fire the 'rotateend' event. This is useful + // when a lot of rotations are going to happen in a short period of time, e.g. + // a touchscreen rotation or dragging a rotation slider. + // Make sure that a final call with unfinished=false is sent at the end of such + // a series of rotations. + setBearing: function(theta, unfinished) { + if (!L.Browser.any3d || !this.options.rotate) { return; } + + if (!this._rotating) { + this.fire('rotatestart'); + } var rotatePanePos = this._getRotatePanePos(); var halfSize = this.getSize().divideBy(2); @@ -495,17 +508,14 @@ L.Map = L.Evented.extend({ L.DomUtil.setPosition(this._rotatePane, this._rotatePanePos, this._bearing, this._rotatePanePos); - for (var i in this._layers) { - // Consider doing this in the markers instead. - if (this._layers[i].options.pane === 'markerPane') { - this._layers[i].update(); - } - } - + this.fire('rotate'); // We don't want to fire the rotate event on every frame of a touchscreen // gesture - if (skipEvent) { - this.fire('rotate'); + if (unfinished) { + this._rotating = true; + } else { + this.fire('rotateend'); + this._rotating = false; } }, @@ -513,6 +523,11 @@ L.Map = L.Evented.extend({ return (this._bearing || 0) * L.DomUtil.RAD_TO_DEG; }, + // Some code will need to know if the map will fire a 'rotateend' event in the + // near future, to account for animations and such + isRotating: function() { + return this._rotating; + }, // map initialization methods diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index edd8eca5b79..6a308dd33a5 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -37,6 +37,7 @@ L.Map.TouchZoom = L.Handler.extend({ this._startBearing = map.getBearing(); this._moved = false; + this._rotated = false; this._zooming = true; map.stop(); @@ -71,11 +72,16 @@ L.Map.TouchZoom = L.Handler.extend({ this._center = map.unproject(map.project(this._pinchStartLatLng).subtract(delta)); } - var theta = Math.atan(vector.x / vector.y); - var bearingDelta = (theta - this._startTheta) * L.DomUtil.RAD_TO_DEG; - if (bearingDelta) { - map.setBearing( this._startBearing - bearingDelta ); - console.log(bearingDelta, this._startBearing ); + if (map.options.rotate) { + var theta = Math.atan(vector.x / vector.y); + var bearingDelta = (theta - this._startTheta) * L.DomUtil.RAD_TO_DEG; + if (vector.y < 0) { bearingDelta += 180; } + if (bearingDelta) { + /// TODO: The pivot should be the last touch point, but zoomAnimation manages to + /// overwrite the rotate pane position. Maybe related to #3529. + map.setBearing(this._startBearing - bearingDelta, true); + this._rotated = true; + } } if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } @@ -115,7 +121,13 @@ L.Map.TouchZoom = L.Handler.extend({ zoom = this._map._limitZoom(zoom - this._startZoom > 0 ? Math.ceil(zoom) : Math.floor(zoom)); +<<<<<<< e10f66b6fca9e02d48a5eb3c01fae7b6131fa9d1 this._map._animateZoom(this._center, zoom, true, true); +======= + if (this._rotated) { + this._map.setBearing(this._map.getBearing()); + } +>>>>>>> Map rotation: more/better events, moved debug pages, added demo rotation control. } }); From 1438c0d0f4c51528ef865c75e41e416903edf2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 21 Aug 2015 09:14:07 +0200 Subject: [PATCH 1801/2207] Implement demo with half-working absolute compass heading. --- debug/rotate/rotate-control.html | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/debug/rotate/rotate-control.html b/debug/rotate/rotate-control.html index f0641bc6983..7f1b5394f8f 100644 --- a/debug/rotate/rotate-control.html +++ b/debug/rotate/rotate-control.html @@ -147,6 +147,10 @@ // New state is follow device orientation this._follow = true; L.DomEvent.on(window, 'deviceorientation', this._onDeviceOrientation, this); +// L.DomEvent.once(window, 'deviceorientation', function(ev){ +// console.log('absolute orientation:', ev.absolute); +// console.log('orientation event', ev); +// }); } } else { // New state is rotation enabled @@ -177,8 +181,15 @@ }, _unthrottledOnDeviceOrientation: function(ev) { + + if (ev.absolute) { +// console.log('Absolute orientation alpha:', ev.alpha); + this._map.setBearing(ev.alpha); + return; + } + if (this._alpha === undefined) { - // Just store initial alpha + // Just store initial alpha. Ignore the first event. this._alpha = ev.alpha; return; } From 1894e927db7970d405f6c6644d89a35091d87315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 25 Aug 2015 10:11:04 +0200 Subject: [PATCH 1802/2207] Map rotation: fix conflicts from rebase. --- src/layer/tile/GridLayer.js | 6 ++++-- src/map/handler/Map.TouchZoom.js | 5 +---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index d921775d9cd..3eb16ba5fe5 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -429,9 +429,9 @@ L.GridLayer = L.Layer.extend({ map.containerPointToLayerPoint([size.x, 0]).floor(), map.containerPointToLayerPoint([0, size.y]).floor(), map.containerPointToLayerPoint([size.x, size.y]).floor() - ]).getSize().divideBy(scale * 2), + ]).getSize().divideBy(scale * 2); - return new L.Bounds(pixelCenter.subtract(halfPaneSize)); + return new L.Bounds(pixelCenter.subtract(halfPaneSize), pixelCenter.add(halfPaneSize)); }, _update: function (center, zoom) { @@ -446,6 +446,8 @@ L.GridLayer = L.Layer.extend({ if (tileZoom > this.options.maxZoom || tileZoom < this.options.minZoom) { return; } + var pixelBounds = this._getTiledPixelBounds(center, zoom, tileZoom); + var tileRange = this._pxBoundsToTileRange(pixelBounds), tileCenter = tileRange.getCenter(), queue = []; diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index 6a308dd33a5..caf56d47d59 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -120,14 +120,11 @@ L.Map.TouchZoom = L.Handler.extend({ var zoom = this._zoom; zoom = this._map._limitZoom(zoom - this._startZoom > 0 ? Math.ceil(zoom) : Math.floor(zoom)); - -<<<<<<< e10f66b6fca9e02d48a5eb3c01fae7b6131fa9d1 this._map._animateZoom(this._center, zoom, true, true); -======= + if (this._rotated) { this._map.setBearing(this._map.getBearing()); } ->>>>>>> Map rotation: more/better events, moved debug pages, added demo rotation control. } }); From 5a61a5ec48909f591c8016e53eea0eaf9d6e7eaa Mon Sep 17 00:00:00 2001 From: "i.taratuhin" Date: Tue, 25 Aug 2015 14:47:18 +0600 Subject: [PATCH 1803/2207] fix init bug when script in document don't have src --- src/layer/marker/Icon.Default.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/marker/Icon.Default.js b/src/layer/marker/Icon.Default.js index 46c21d2c2d0..6eeca7bdcca 100644 --- a/src/layer/marker/Icon.Default.js +++ b/src/layer/marker/Icon.Default.js @@ -35,7 +35,7 @@ L.Icon.Default.imagePath = (function () { var i, len, src, path; for (i = 0, len = scripts.length; i < len; i++) { - src = scripts[i].src; + src = scripts[i].src || ''; if (src.match(leafletRe)) { path = src.split(leafletRe)[0]; From 7fb33eb3d7d13a42334c89a03adaa207995d3f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 25 Aug 2015 15:13:45 +0200 Subject: [PATCH 1804/2207] Map rotation handlers: CompassBearing, refactored TouchZoom into TouchGestures --- build/deps.js | 9 +- debug/rotate/rotate-control.html | 81 ++++--------- debug/rotate/rotate-mobile.html | 13 ++- src/map/handler/Map.CompassBearing.js | 66 +++++++++++ src/map/handler/Map.TouchGestures.js | 156 ++++++++++++++++++++++++++ src/map/handler/Map.TouchRotate.js | 20 ++++ src/map/handler/Map.TouchZoom.js | 119 +------------------- 7 files changed, 284 insertions(+), 180 deletions(-) create mode 100644 src/map/handler/Map.CompassBearing.js create mode 100644 src/map/handler/Map.TouchGestures.js create mode 100644 src/map/handler/Map.TouchRotate.js diff --git a/build/deps.js b/build/deps.js index b493e7dd8f1..23828d2046e 100644 --- a/build/deps.js +++ b/build/deps.js @@ -177,10 +177,12 @@ var deps = { 'dom/DomEvent.DoubleTap.js', 'dom/DomEvent.Pointer.js', 'core/Handler.js', + 'map/handler/Map.TouchGestures.js', 'map/handler/Map.TouchZoom.js', + 'map/handler/Map.TouchRotate.js', 'map/handler/Map.Tap.js'], deps: ['AnimationZoom'], - desc: 'Enables smooth touch zoom / tap / longhold / doubletap on iOS, IE10, Android.' + desc: 'Enables smooth touch zoom / rotate / tap / longhold / doubletap on iOS, IE10, Android.' }, BoxZoom: { @@ -194,6 +196,11 @@ var deps = { desc: 'Enables keyboard pan/zoom when the map is focused.' }, + CompassBearing: { + src: ['map/handler/Map.CompassBearing.js'], + desc: 'Enables rotating the map based on the device compass' + }, + MarkerDrag: { src: ['layer/marker/Marker.Drag.js'], deps: ['Marker'], diff --git a/debug/rotate/rotate-control.html b/debug/rotate/rotate-control.html index 7f1b5394f8f..5db6ec1c75f 100644 --- a/debug/rotate/rotate-control.html +++ b/debug/rotate/rotate-control.html @@ -69,7 +69,7 @@ onAdd: function(map) { this._onDeviceOrientation = L.Util.throttle(this._unthrottledOnDeviceOrientation, 100, this); - var container = L.DomUtil.create('div', 'leaflet-control-rotate leaflet-bar'); + var container = this._container = L.DomUtil.create('div', 'leaflet-control-rotate leaflet-bar'); // this.button = L.Control.Zoom.prototype._createButton.call(this, 'R', 'leaflet-control-rotate', 'leaflet-control-rotate', container, this._toggleLock); @@ -108,53 +108,34 @@ this._follow = false; this._canFollow = false; - // Detect compass/accelerometer by responding to the first device orientation event ever. - L.DomEvent.on(window, 'deviceorientation', this._onFirstDeviceOrientation, this); - if (this.options.closeOnZeroBearing && map.getBearing() === 0) { - this._link.style.display = 'none'; + container.style.display = 'none'; } return container; }, - _onFirstDeviceOrientation: function() { - this._canFollow = true; - L.DomEvent.off(window, 'deviceorientation', this._onFirstDeviceOrientation, this); - }, - _cycleState: function(ev) { - if (!this._map) { return; } + var map = this._map; - if (this._map.options.rotate) { + if (!map) { return; } + + if (!map.touchRotate.enabled()) { + // Go from disabled to touch + map.touchRotate.enable(); + } else { + + if (!map.compassBearing.enabled()) { + // Go from touch to compass + map.touchRotate.disable(); + map.compassBearing.enable(); - if (this._follow || !this._canFollow) { - // New state is off - - if (this._follow) { - this._follow = false; - L.DomEvent.off(window, 'deviceorientation', this._onDeviceOrientation, this); - this._alpha = undefined; - } - - this._map.setBearing(0); - if (this.options.closeOnZeroBearing) { - this._link.style.display = 'none'; - } else { - this._map.options.rotate = false; - } + // It is possible that compass is not supported. If so, + // the hangler will automatically go from compass to disabled. } else { - // New state is follow device orientation - this._follow = true; - L.DomEvent.on(window, 'deviceorientation', this._onDeviceOrientation, this); -// L.DomEvent.once(window, 'deviceorientation', function(ev){ -// console.log('absolute orientation:', ev.absolute); -// console.log('orientation event', ev); -// }); + // Go from compass to disabled + map.compassBearing.disabled(); } - } else { - // New state is rotation enabled - this._map.options.rotate = true; } this._restyle(); }, @@ -178,30 +159,6 @@ } else { this._link.style.color = '#bbb'; } - }, - - _unthrottledOnDeviceOrientation: function(ev) { - - if (ev.absolute) { -// console.log('Absolute orientation alpha:', ev.alpha); - this._map.setBearing(ev.alpha); - return; - } - - if (this._alpha === undefined) { - // Just store initial alpha. Ignore the first event. - this._alpha = ev.alpha; - return; - } - -// console.log(this._alpha, ev.alpha, this._alpha - ev.alpha); - - var alphaDelta = this._alpha - ev.alpha; - - if (Math.abs(alphaDelta) > 1) { - this._map.setBearing(this._map.getBearing() - alphaDelta); - this._alpha = ev.alpha; - } } }); @@ -214,6 +171,8 @@ var map = new L.Map('map', {zoom: 15, layers: [osm], rotate: true}).setView([63.41, 10.41], 17); + map.touchRotate.enable(); + map.addControl(rotateControl = new L.Control.RotateLock()); function logEvent(e) { console.log(e.type); } diff --git a/debug/rotate/rotate-mobile.html b/debug/rotate/rotate-mobile.html index b7c836c5062..f59d2854e08 100644 --- a/debug/rotate/rotate-mobile.html +++ b/debug/rotate/rotate-mobile.html @@ -21,7 +21,14 @@ osmAttrib = '© OpenStreetMap contributors', osm = L.tileLayer(osmUrl, {maxZoom: 18, attribution: osmAttrib}); - var map = new L.Map('map', {zoom: 15, layers: [osm], rotate: true}); + var map = new L.Map('map', { + zoom: 15, + layers: [osm], + rotate: true, + touchRotate: true + }); + + map.compassBearing.enable(); function logEvent(e) { console.log(e.type); } @@ -35,8 +42,8 @@ } - map.on('locationerror', logEvent); - map.on('locationfound', logEvent); +// map.on('locationerror', logEvent); +// map.on('locationfound', logEvent); map.on('locationfound', resetHeading); window.setInterval( function(){ diff --git a/src/map/handler/Map.CompassBearing.js b/src/map/handler/Map.CompassBearing.js new file mode 100644 index 00000000000..7f885fa25c0 --- /dev/null +++ b/src/map/handler/Map.CompassBearing.js @@ -0,0 +1,66 @@ +/* + * L.Map.CompassBearing will rotate the map according to a smartphone's compass. + */ + +L.Map.CompassBearing = L.Handler.extend({ + + initialize: function(map) { + + this._capable = false; + this._map = map; + + if (!window.DeviceOrientationEvent) { return; } + + this._probing = true; + this._throttled = L.Util.throttle(this._onDeviceOrientation, 100, this); + + L.DomEvent.on(window, 'deviceorientation', this._probe, this); + window.setTimeout(this._cancelProbe.bind(this), 1000); + }, + + addHooks: function () { + if (this._capable) { + alert('Tracking compass'); + L.DomEvent.on(window, 'deviceorientation', this._throttled, this); + } else if (!this._probing) { + alert('Not tracking compass'); + this._enabled = false; + } else { +// console.log('Waiting for feature probing'); + } + }, + + removeHooks: function () { + if (this._capable) { + L.DomEvent.off(window, 'deviceorientation', this._throttled, this); + } + }, + + _onDeviceOrientation: function(ev) { + if (ev.absolute) { + this._map.setBearing(ev.alpha); + return; + } + }, + + _probe: function(ev) { +// console.log('Probed deviceOrientation', ev); + L.DomEvent.off(window, 'deviceorientation', this._probe, this); + this._capable = true; + if (this._enabled) { + this.addHooks(); + } + }, + + _cancelProbe: function(ev) { + L.DomEvent.off(window, 'deviceorientation', this._probe, this); + +// if (!this._capable) { +// alert('No device orientation'); +// } + + this._probing = false; + } +}); + +L.Map.addInitHook('addHandler', 'compassBearing', L.Map.CompassBearing); diff --git a/src/map/handler/Map.TouchGestures.js b/src/map/handler/Map.TouchGestures.js new file mode 100644 index 00000000000..b8d309f8e72 --- /dev/null +++ b/src/map/handler/Map.TouchGestures.js @@ -0,0 +1,156 @@ +/* + * L.Handler.TouchGestures is both TouchZoom plus TouchRotate. + */ + +L.Map.mergeOptions({ + bounceAtZoomLimits: true +}); + +L.Map.TouchGestures = L.Handler.extend({ + + initialize: function (map) { + this._map = map; + this.rotate = !!this._map.options.touchRotate; + this.zoom = !!this._map.options.touchZoom; + }, + + addHooks: function () { + L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); + }, + + removeHooks: function () { + L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); + }, + + _onTouchStart: function (e) { + var map = this._map; + + if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming || this._rotating) { return; } + + var p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]), + vector = p1.subtract(p2); + + this._centerPoint = map.getSize()._divideBy(2); + this._startLatLng = map.containerPointToLatLng(this._centerPoint); + + if (this.zoom) { + if (map.options.touchZoom !== 'center') { + this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2)); + } + this._startDist = p1.distanceTo(p2); + this._startZoom = map.getZoom(); + this._zooming = true; + } else { + this._zooming = false; + } + + if (this.rotate) { + this._startTheta = Math.atan(vector.x / vector.y); + this._startBearing = map.getBearing(); + if (vector.y < 0) { this._startBearing += 180; } + this._rotating = true; + } else { + this._rotating = false; + } + this._rotated = false; + + this._moved = false; + + map.stop(); + + L.DomEvent + .on(document, 'touchmove', this._onTouchMove, this) + .on(document, 'touchend', this._onTouchEnd, this); + + L.DomEvent.preventDefault(e); + }, + + _onTouchMove: function (e) { + if (!e.touches || e.touches.length !== 2 || !(this._zooming || this._rotating)) { return; } + + var map = this._map, + p1 = map.mouseEventToContainerPoint(e.touches[0]), + p2 = map.mouseEventToContainerPoint(e.touches[1]), + vector = p1.subtract(p2), + scale = p1.distanceTo(p2) / this._startDist, + delta; + + if (this._rotating) { + var theta = Math.atan(vector.x / vector.y); + var bearingDelta = (theta - this._startTheta) * L.DomUtil.RAD_TO_DEG; + if (vector.y < 0) { bearingDelta += 180; } + if (bearingDelta) { + /// TODO: The pivot should be the last touch point, but zoomAnimation manages to + /// overwrite the rotate pane position. Maybe related to #3529. + map.setBearing(this._startBearing - bearingDelta, true); + this._rotated = true; + } + } + + if (this._zooming) { + this._zoom = map.getScaleZoom(scale, this._startZoom); + + if (map.options.touchZoom === 'center') { + this._center = this._startLatLng; + if (scale === 1) { return; } + } else { + // Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng + delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint); + if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } + + var alpha = this.rotate ? - map.getBearing() * L.DomUtil.DEG_TO_RAD || 0; + + this._center = map.unproject(map.project(this._pinchStartLatLng).subtract(delta.rotate(alpha))); + } + + if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } + + if (!map.options.bounceAtZoomLimits) { + if ((this._zoom <= map.getMinZoom() && scale < 1) || + (this._zoom >= map.getMaxZoom() && scale > 1)) { return; } + } + + } + + if (!this._moved) { + map._moveStart(true); + this._moved = true; + } + + L.Util.cancelAnimFrame(this._animRequest); + + var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}); + this._animRequest = L.Util.requestAnimFrame(moveFn, this, true); + + L.DomEvent.preventDefault(e); + }, + + _onTouchEnd: function () { + if (!this._moved || !this._zooming) { + this._zooming = false; + return; + } + + this._zooming = false; + this._rotating = false; + L.Util.cancelAnimFrame(this._animRequest); + + L.DomEvent + .off(document, 'touchmove', this._onTouchMove) + .off(document, 'touchend', this._onTouchEnd); + + if (this.zoom) { + var zoom = this._zoom; + zoom = this._map._limitZoom(zoom - this._startZoom > 0 ? Math.ceil(zoom) : Math.floor(zoom)); + + this._map._animateZoom(this._center, zoom, true, true); + } + + if (this.rotate && this._rotated) { + this._map.setBearing(this._map.getBearing()); + } + } +}); + +L.Map.addInitHook('addHandler', 'touchGestures', L.Map.TouchGestures); diff --git a/src/map/handler/Map.TouchRotate.js b/src/map/handler/Map.TouchRotate.js new file mode 100644 index 00000000000..6b6d25fef8f --- /dev/null +++ b/src/map/handler/Map.TouchRotate.js @@ -0,0 +1,20 @@ +/* + * L.Handler.TouchRotate is used by L.Map to add two-finger rotation gestures. + */ + +L.Map.mergeOptions({ + touchRotate: L.Browser.touch && !L.Browser.android23 +}); + +L.Map.TouchRotate = L.Handler.extend({ + addHooks: function () { + this._map.touchGestures.enable(); + this._map.touchGestures.rotate = true; + }, + + removeHooks: function () { + this._map.touchGestures.rotate = false; + } +}); + +L.Map.addInitHook('addHandler', 'touchRotate', L.Map.TouchRotate); diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index caf56d47d59..4a5777a16bf 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -3,128 +3,17 @@ */ L.Map.mergeOptions({ - touchZoom: L.Browser.touch && !L.Browser.android23, - bounceAtZoomLimits: true + touchZoom: L.Browser.touch && !L.Browser.android23 }); L.Map.TouchZoom = L.Handler.extend({ addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); + this._map.touchGestures.enable(); + this._map.touchGestures.zoom = true; }, removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - _onTouchStart: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } - - var p1 = map.mouseEventToContainerPoint(e.touches[0]), - p2 = map.mouseEventToContainerPoint(e.touches[1]), - vector = p1.subtract(p2); - - this._centerPoint = map.getSize()._divideBy(2); - this._startLatLng = map.containerPointToLatLng(this._centerPoint); - if (map.options.touchZoom !== 'center') { - this._pinchStartLatLng = map.containerPointToLatLng(p1.add(p2)._divideBy(2)); - } - - this._startDist = p1.distanceTo(p2); - this._startZoom = map.getZoom(); - this._startTheta = Math.atan(vector.x / vector.y); - this._startBearing = map.getBearing(); - - this._moved = false; - this._rotated = false; - this._zooming = true; - - map.stop(); - - L.DomEvent - .on(document, 'touchmove', this._onTouchMove, this) - .on(document, 'touchend', this._onTouchEnd, this); - - L.DomEvent.preventDefault(e); - }, - - _onTouchMove: function (e) { - if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } - - var map = this._map, - p1 = map.mouseEventToContainerPoint(e.touches[0]), - p2 = map.mouseEventToContainerPoint(e.touches[1]), - - vector = p1.subtract(p2), - scale = p1.distanceTo(p2) / this._startDist, - delta; - - this._zoom = map.getScaleZoom(scale, this._startZoom); - - if (map.options.touchZoom === 'center') { - this._center = this._startLatLng; - if (scale === 1) { return; } - } else { - // Get delta from pinch to center, so centerLatLng is delta applied to initial pinchLatLng - var delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint); - if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } - this._center = map.unproject(map.project(this._pinchStartLatLng).subtract(delta)); - } - - if (map.options.rotate) { - var theta = Math.atan(vector.x / vector.y); - var bearingDelta = (theta - this._startTheta) * L.DomUtil.RAD_TO_DEG; - if (vector.y < 0) { bearingDelta += 180; } - if (bearingDelta) { - /// TODO: The pivot should be the last touch point, but zoomAnimation manages to - /// overwrite the rotate pane position. Maybe related to #3529. - map.setBearing(this._startBearing - bearingDelta, true); - this._rotated = true; - } - } - - if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } - - if (!map.options.bounceAtZoomLimits) { - if ((this._zoom <= map.getMinZoom() && scale < 1) || - (this._zoom >= map.getMaxZoom() && scale > 1)) { return; } - } - - if (!this._moved) { - map._moveStart(true); - this._moved = true; - } - - L.Util.cancelAnimFrame(this._animRequest); - - var moveFn = L.bind(map._move, map, this._center, this._zoom, {pinch: true, round: false}); - this._animRequest = L.Util.requestAnimFrame(moveFn, this, true); - - L.DomEvent.preventDefault(e); - }, - - _onTouchEnd: function () { - if (!this._moved || !this._zooming) { - this._zooming = false; - return; - } - - this._zooming = false; - L.Util.cancelAnimFrame(this._animRequest); - - L.DomEvent - .off(document, 'touchmove', this._onTouchMove) - .off(document, 'touchend', this._onTouchEnd); - - var zoom = this._zoom; - zoom = this._map._limitZoom(zoom - this._startZoom > 0 ? Math.ceil(zoom) : Math.floor(zoom)); - - this._map._animateZoom(this._center, zoom, true, true); - - if (this._rotated) { - this._map.setBearing(this._map.getBearing()); - } + this._map.touchGestures.zoom = false; } }); From b076ff17be872993e265842b7d41b8303a9149d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 25 Aug 2015 16:11:18 +0200 Subject: [PATCH 1805/2207] Map rotation: improve bearing control demo --- debug/rotate/rotate-control.html | 41 ++++++++++++++++++++------- src/map/handler/Map.CompassBearing.js | 7 ++--- src/map/handler/Map.TouchGestures.js | 2 +- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/debug/rotate/rotate-control.html b/debug/rotate/rotate-control.html index 5db6ec1c75f..dbb6df0ec9f 100644 --- a/debug/rotate/rotate-control.html +++ b/debug/rotate/rotate-control.html @@ -59,7 +59,7 @@ // Unlocked (user can pinch-rotate) // Follow (rotation follows device orientation, if available) - L.Control.RotateLock = L.Control.extend({ + L.Control.Bearing = L.Control.extend({ options: { position: 'topleft', @@ -120,9 +120,11 @@ if (!map) { return; } - if (!map.touchRotate.enabled()) { + if (!map.touchRotate.enabled() && !map.compassBearing.enabled()) { // Go from disabled to touch map.touchRotate.enable(); + +// console.log('state is now: touch rotate'); } else { if (!map.compassBearing.enabled()) { @@ -130,11 +132,20 @@ map.touchRotate.disable(); map.compassBearing.enable(); +// console.log('state is now: compass'); + // It is possible that compass is not supported. If so, // the hangler will automatically go from compass to disabled. } else { // Go from compass to disabled - map.compassBearing.disabled(); + map.compassBearing.disable(); + +// console.log('state is now: locked'); + + map.setBearing(0); + if (this.options.closeOnZeroBearing) { + map.touchRotate.enable(); + } } } this._restyle(); @@ -145,22 +156,26 @@ var bearing = this._map.getBearing(); this._link.style.color = 'inherit'; if (this.options.closeOnZeroBearing && bearing) { - this._link.style.display = 'block'; + this._container.style.display = 'block'; } var cssTransform = 'rotate(' + bearing + 'deg)'; this._glyphs.style.transform = cssTransform; - if (this._follow) { + if (map.compassBearing.enabled()) { this._glyphs.style.color = 'orange'; - } else { + } else if (map.touchRotate.enabled()){ this._glyphs.style.color = 'inherit'; + } else { + this._glyphs.style.color = 'grey'; + if (this.options.closeOnZeroBearing && map.getBearing() === 0) { + this._container.style.display = 'none'; + } } } else { - this._link.style.color = '#bbb'; + L.DomUtil.addClass(link, 'leaflet-disabled'); } } - }); @@ -169,11 +184,15 @@ osmAttrib = '© OpenStreetMap contributors', osm = L.tileLayer(osmUrl, {maxZoom: 17, attribution: osmAttrib, rotate:true}); - var map = new L.Map('map', {zoom: 15, layers: [osm], rotate: true}).setView([63.41, 10.41], 17); + var map = new L.Map('map', { + zoom: 15, + layers: [osm], + rotate: true + }).setView([63.41, 10.41], 17); - map.touchRotate.enable(); +// map.touchRotate.enable(); - map.addControl(rotateControl = new L.Control.RotateLock()); + map.addControl(bearingControl = new L.Control.Bearing({closeOnZeroBearing: true})); function logEvent(e) { console.log(e.type); } diff --git a/src/map/handler/Map.CompassBearing.js b/src/map/handler/Map.CompassBearing.js index 7f885fa25c0..4f865d7a828 100644 --- a/src/map/handler/Map.CompassBearing.js +++ b/src/map/handler/Map.CompassBearing.js @@ -20,10 +20,10 @@ L.Map.CompassBearing = L.Handler.extend({ addHooks: function () { if (this._capable) { - alert('Tracking compass'); +// alert('Tracking compass'); L.DomEvent.on(window, 'deviceorientation', this._throttled, this); } else if (!this._probing) { - alert('Not tracking compass'); +// alert('Not tracking compass'); this._enabled = false; } else { // console.log('Waiting for feature probing'); @@ -37,9 +37,8 @@ L.Map.CompassBearing = L.Handler.extend({ }, _onDeviceOrientation: function(ev) { - if (ev.absolute) { + if (ev.absolute && this._enabled) { this._map.setBearing(ev.alpha); - return; } }, diff --git a/src/map/handler/Map.TouchGestures.js b/src/map/handler/Map.TouchGestures.js index b8d309f8e72..3830303cfbd 100644 --- a/src/map/handler/Map.TouchGestures.js +++ b/src/map/handler/Map.TouchGestures.js @@ -99,7 +99,7 @@ L.Map.TouchGestures = L.Handler.extend({ delta = p1._add(p2)._divideBy(2)._subtract(this._centerPoint); if (scale === 1 && delta.x === 0 && delta.y === 0) { return; } - var alpha = this.rotate ? - map.getBearing() * L.DomUtil.DEG_TO_RAD || 0; + var alpha = -map.getBearing() * L.DomUtil.DEG_TO_RAD; this._center = map.unproject(map.project(this._pinchStartLatLng).subtract(delta.rotate(alpha))); } From da8149c1648229e5357d510c1c5396fe30a5f7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 27 Aug 2015 23:56:02 +0200 Subject: [PATCH 1806/2207] Move L.Layer.isPopupOpen to appropiate file --- src/layer/Layer.Popup.js | 4 ++++ src/layer/Layer.js | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index c9135e3ce58..a098761a5e6 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -97,6 +97,10 @@ L.Layer.include({ return this; }, + isPopupOpen: function() { + return this._popup.isOpen(); + }, + setPopupContent: function (content) { if (this._popup) { this._popup.setContent(content); diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 10fff4c61a5..c55f557a269 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -36,10 +36,6 @@ L.Layer = L.Evented.extend({ return this; }, - isPopupOpen: function() { - return this._popup.isOpen(); - }, - _layerAdd: function (e) { var map = e.target; From e698f641afadd4a0b412a6c9e065a6dbfbe16f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 28 Aug 2015 12:39:28 +0200 Subject: [PATCH 1807/2207] Rectangle.setBounds() must return a value --- src/layer/vector/Rectangle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Rectangle.js b/src/layer/vector/Rectangle.js index 0af0a0a9571..4fd9f087e9d 100644 --- a/src/layer/vector/Rectangle.js +++ b/src/layer/vector/Rectangle.js @@ -8,7 +8,7 @@ L.Rectangle = L.Polygon.extend({ }, setBounds: function (latLngBounds) { - this.setLatLngs(this._boundsToLatLngs(latLngBounds)); + return this.setLatLngs(this._boundsToLatLngs(latLngBounds)); }, _boundsToLatLngs: function (latLngBounds) { From 809186dcc94ee8648ab08c3d063c3c1ff54a1684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 31 Aug 2015 16:41:54 +0200 Subject: [PATCH 1808/2207] Make linter happy about whitespace --- src/layer/Layer.Popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index a098761a5e6..6f83a285e0d 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -97,7 +97,7 @@ L.Layer.include({ return this; }, - isPopupOpen: function() { + isPopupOpen: function() { return this._popup.isOpen(); }, From 0f4e84f04cf64d29ce23f0d1684fdd20f9bbe633 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Tue, 1 Sep 2015 12:50:05 +0200 Subject: [PATCH 1809/2207] update to 0.7.4 --- dist/leaflet-src.js | 170 +++++++++++++++++++--------------------- dist/leaflet.css | 0 dist/leaflet.js | 8 +- download.md | 8 +- examples/quick-start.md | 4 +- 5 files changed, 91 insertions(+), 99 deletions(-) mode change 100644 => 100755 dist/leaflet-src.js mode change 100644 => 100755 dist/leaflet.css mode change 100644 => 100755 dist/leaflet.js diff --git a/dist/leaflet-src.js b/dist/leaflet-src.js old mode 100644 new mode 100755 index cb6613d0b5b..aecf2677ba6 --- a/dist/leaflet-src.js +++ b/dist/leaflet-src.js @@ -7,7 +7,7 @@ var oldL = window.L, L = {}; -L.version = '0.7.2'; +L.version = '0.7.4'; // define Leaflet for Node module pattern loaders, including Browserify if (typeof module === 'object' && typeof module.exports === 'object') { @@ -519,8 +519,7 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; gecko = ua.indexOf('gecko') !== -1, mobile = typeof orientation !== undefined + '', - msPointer = window.navigator && window.navigator.msPointerEnabled && - window.navigator.msMaxTouchPoints && !window.PointerEvent, + msPointer = !window.PointerEvent && window.MSPointerEvent, pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || msPointer, retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || @@ -534,38 +533,8 @@ L.Mixin.Events.fire = L.Mixin.Events.fireEvent; opera3d = 'OTransition' in doc.style, any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; - - // PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch. - // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151 - - var touch = !window.L_NO_TOUCH && !phantomjs && (function () { - - var startName = 'ontouchstart'; - - // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc. - if (pointer || (startName in doc)) { - return true; - } - - // Firefox/Gecko - var div = document.createElement('div'), - supported = false; - - if (!div.setAttribute) { - return false; - } - div.setAttribute(startName, 'return;'); - - if (typeof div[startName] === 'function') { - supported = true; - } - - div.removeAttribute(startName); - div = null; - - return supported; - }()); - + var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window || + (window.DocumentTouch && document instanceof window.DocumentTouch)); L.Browser = { ie: ie, @@ -1632,15 +1601,16 @@ L.Map = L.Class.extend({ var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), - zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)), - paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), + zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); + + zoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom; + + var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), swPoint = this.project(bounds.getSouthWest(), zoom), nePoint = this.project(bounds.getNorthEast(), zoom), center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); - zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom; - return this.setView(center, zoom, options); }, @@ -2104,13 +2074,13 @@ L.Map = L.Class.extend({ var loading = !this._loaded; this._loaded = true; + this.fire('viewreset', {hard: !preserveMapOffset}); + if (loading) { this.fire('load'); this.eachLayer(this._layerAdd, this); } - this.fire('viewreset', {hard: !preserveMapOffset}); - this.fire('move'); if (zoomChanged || afterZoomAnim) { @@ -2436,7 +2406,8 @@ L.TileLayer = L.Class.extend({ attribution: '', zoomOffset: 0, opacity: 1, - /* (undefined works too) + /* + maxNativeZoom: null, zIndex: null, tms: false, continuousWorld: false, @@ -2485,9 +2456,6 @@ L.TileLayer = L.Class.extend({ // create a container div for tiles this._initContainer(); - // create an image to clone for tiles - this._createTileProto(); - // set up events map.on({ 'viewreset': this._reset, @@ -2707,9 +2675,10 @@ L.TileLayer = L.Class.extend({ if (!this._map) { return; } - var bounds = this._map.getPixelBounds(), - zoom = this._map.getZoom(), - tileSize = this.options.tileSize; + var map = this._map, + bounds = map.getPixelBounds(), + zoom = map.getZoom(), + tileSize = this._getTileSize(); if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { return; @@ -2783,7 +2752,7 @@ L.TileLayer = L.Class.extend({ } if (options.bounds) { - var tileSize = options.tileSize, + var tileSize = this._getTileSize(), nwPoint = tilePoint.multiplyBy(tileSize), sePoint = nwPoint.add([tileSize, tileSize]), nw = this._map.unproject(nwPoint), @@ -2870,12 +2839,14 @@ L.TileLayer = L.Class.extend({ zoom = options.maxZoom - zoom; } - return zoom + options.zoomOffset; + zoom += options.zoomOffset; + + return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom; }, _getTilePos: function (tilePoint) { var origin = this._map.getPixelOrigin(), - tileSize = this.options.tileSize; + tileSize = this._getTileSize(); return tilePoint.multiplyBy(tileSize).subtract(origin); }, @@ -2918,12 +2889,6 @@ L.TileLayer = L.Class.extend({ return this.options.subdomains[index]; }, - _createTileProto: function () { - var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile'); - img.style.width = img.style.height = this.options.tileSize + 'px'; - img.galleryimg = 'no'; - }, - _getTile: function () { if (this.options.reuseTiles && this._unusedTiles.length > 0) { var tile = this._unusedTiles.pop(); @@ -2937,7 +2902,10 @@ L.TileLayer = L.Class.extend({ _resetTile: function (/*tile*/) {}, _createTile: function () { - var tile = this._tileImg.cloneNode(false); + var tile = L.DomUtil.create('img', 'leaflet-tile'); + tile.style.width = tile.style.height = this._getTileSize() + 'px'; + tile.galleryimg = 'no'; + tile.onselectstart = tile.onmousemove = L.Util.falseFn; if (L.Browser.ielt9 && this.options.opacity !== undefined) { @@ -3140,13 +3108,9 @@ L.TileLayer.Canvas = L.TileLayer.extend({ this.drawTile(tile, tile._tilePoint, this._map._zoom); }, - _createTileProto: function () { - var proto = this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile'); - proto.width = proto.height = this.options.tileSize; - }, - _createTile: function () { - var tile = this._canvasProto.cloneNode(false); + var tile = L.DomUtil.create('canvas', 'leaflet-tile'); + tile.width = tile.height = this.options.tileSize; tile.onselectstart = tile.onmousemove = L.Util.falseFn; return tile; }, @@ -3574,7 +3538,9 @@ L.Marker = L.Class.extend({ update: function () { if (this._icon) { var pos = this._map.latLngToLayerPoint(this._latlng).round(); - this._setPos(pos); + L.Util.requestAnimFrame(function () { + this._setPos(pos); + }, this); } return this; @@ -4234,6 +4200,7 @@ L.Marker.include({ if (content instanceof L.Popup) { L.setOptions(content, options); this._popup = content; + content._source = this; } else { this._popup = new L.Popup(options, this) .setContent(content); @@ -5089,7 +5056,8 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : } this._requestUpdate(); - + + this.fire('remove'); this._map = null; }, @@ -5119,6 +5087,13 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : if (options.fill) { this._ctx.fillStyle = options.fillColor || options.color; } + + if (options.lineCap) { + this._ctx.lineCap = options.lineCap; + } + if (options.lineJoin) { + this._ctx.lineJoin = options.lineJoin; + } }, _drawPath: function () { @@ -5156,7 +5131,7 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : if (options.fill) { ctx.globalAlpha = options.fillOpacity; - ctx.fill(); + ctx.fill(options.fillRule || 'evenodd'); } if (options.stroke) { @@ -5171,15 +5146,14 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : _initEvents: function () { if (this.options.clickable) { - // TODO dblclick this._map.on('mousemove', this._onMouseMove, this); - this._map.on('click', this._onClick, this); + this._map.on('click dblclick contextmenu', this._fireMouseEvent, this); } }, - _onClick: function (e) { + _fireMouseEvent: function (e) { if (this._containsPoint(e.layerPoint)) { - this.fire('click', e); + this.fire(e.type, e); } }, @@ -6611,12 +6585,12 @@ L.DomEvent = { var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); - // are they closer together than 1000ms yet more than 100ms? + // are they closer together than 500ms yet more than 100ms? // Android typically triggers them ~300ms apart while multiple listeners // on the same event should be triggered far faster; // or check if click is simulated on the element, and if it is, reject any non-simulated events - if ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) { + if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { L.DomEvent.stop(e); return; } @@ -6714,6 +6688,7 @@ L.Draggable = L.Class.extend({ offset = newPoint.subtract(this._startPoint); if (!offset.x && !offset.y) { return; } + if (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; } L.DomEvent.preventDefault(e); @@ -6724,7 +6699,8 @@ L.Draggable = L.Class.extend({ this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); L.DomUtil.addClass(document.body, 'leaflet-dragging'); - L.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target'); + this._lastTarget = e.target || e.srcElement; + L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target'); } this._newPos = this._startPos.add(offset); @@ -6740,9 +6716,13 @@ L.Draggable = L.Class.extend({ this.fire('drag'); }, - _onUp: function (e) { + _onUp: function () { L.DomUtil.removeClass(document.body, 'leaflet-dragging'); - L.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target'); + + if (this._lastTarget) { + L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target'); + this._lastTarget = null; + } for (var i in L.Draggable.MOVE) { L.DomEvent @@ -7397,7 +7377,7 @@ L.Map.TouchZoom = L.Handler.extend({ center = map.layerPointToLatLng(origin), zoom = map.getScaleZoom(this._scale); - map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta); + map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true); }, _onTouchEnd: function () { @@ -8382,8 +8362,8 @@ L.Control.Layers = L.Control.extend({ onRemove: function (map) { map - .off('layeradd', this._onLayerChange) - .off('layerremove', this._onLayerChange); + .off('layeradd', this._onLayerChange, this) + .off('layerremove', this._onLayerChange, this); }, addBaseLayer: function (layer, name) { @@ -8924,9 +8904,11 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : { return true; }, - _animateZoom: function (center, zoom, origin, scale, delta, backwards) { + _animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) { - this._animatingZoom = true; + if (!forTouchZoom) { + this._animatingZoom = true; + } // put transform transition on all layers with leaflet-zoom-animated class L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); @@ -8940,17 +8922,22 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : { L.Draggable._disabled = true; } - this.fire('zoomanim', { - center: center, - zoom: zoom, - origin: origin, - scale: scale, - delta: delta, - backwards: backwards - }); + L.Util.requestAnimFrame(function () { + this.fire('zoomanim', { + center: center, + zoom: zoom, + origin: origin, + scale: scale, + delta: delta, + backwards: backwards + }); + // horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689 + setTimeout(L.bind(this._onZoomTransitionEnd, this), 250); + }, this); }, _onZoomTransitionEnd: function () { + if (!this._animatingZoom) { return; } this._animatingZoom = false; @@ -8996,6 +8983,11 @@ L.TileLayer.include({ // force reflow L.Util.falseFn(bg.offsetWidth); + var zoom = this._map.getZoom(); + if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { + this._clearBgBuffer(); + } + this._animating = false; }, diff --git a/dist/leaflet.css b/dist/leaflet.css old mode 100644 new mode 100755 diff --git a/dist/leaflet.js b/dist/leaflet.js old mode 100644 new mode 100755 index fd266e20950..7c5a0829714 --- a/dist/leaflet.js +++ b/dist/leaflet.js @@ -3,7 +3,7 @@ (c) 2010-2013, Vladimir Agafonkin (c) 2010-2011, CloudMade */ -!function(t,e,i){var n=t.L,o={};o.version="0.7.2","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?(o=!0,void 0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),t.apply(i,a),void 0)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints&&!t.PointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return s=e&&e.maxZoom?Math.min(e.maxZoom,s):s,this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_; -return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),this._createTileProto(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||en;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=o.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=o.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return this._parts=[n],void 0;this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?(o.DomEvent.stop(t),void 0):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return this._moved=!0,void 0;var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),o.DomUtil.addClass(t.target||t.srcElement,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){o.DomUtil.removeClass(e.body,"leaflet-dragging"),o.DomUtil.removeClass(t.target||t.srcElement,"leaflet-drag-target");for(var i in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[i],this._onMove).off(e,o.Draggable.END[i],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return this._zooming=!1,void 0;var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,clearTimeout(this._holdTimeout),void 0;var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this),void 0)},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,this.fire("step"),void 0):(this._onTransitionEnd(),void 0)},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",this._stopLoadingImages(t),void 0):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),clearTimeout(this._clearBgBufferTimer),void 0)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file +!function(t,e,i){var n=t.L,o={};o.version="0.7.4","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=!t.PointerEvent&&t.MSPointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&(m||"ontouchstart"in t||t.DocumentTouch&&e instanceof t.DocumentTouch);o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n));s=e.maxZoom?Math.min(e.maxZoom,s):s;var a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-(1/0),o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395", +projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-(1/0));for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||in;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=this._getTileSize(),o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+=t.zoomOffset,t.maxNativeZoom?Math.min(e,t.maxNativeZoom):e},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this._getTileSize();return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=o.DomUtil.create("img","leaflet-tile");return t.style.width=t.style.height=this._getTileSize()+"px",t.galleryimg="no",t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;e.detectRetina&&o.Browser.retina?i.width=i.height=2*n:i.width=i.height=n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTile:function(){var t=o.DomUtil.create("canvas","leaflet-tile");return t.width=t.height=this.options.tileSize,t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();o.Util.requestAnimFrame(function(){this._setPos(t)},this)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t,t._source=this):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,i.dashArray?t.dashStyle=o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):t.dashStyle="",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this.fire("remove"),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color),t.lineCap&&(this._ctx.lineCap=t.lineCap),t.lineJoin&&(this._ctx.lineJoin=t.lineJoin)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill(e.fillRule||"evenodd")),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click dblclick contextmenu",this._fireMouseEvent,this))},_fireMouseEvent:function(t){this._containsPoint(t.layerPoint)&&this.fire(t.type,t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return void(this._parts=[n]);this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&500>n||t.target._simulatedClick&&!t._simulated?void o.DomEvent.stop(t):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return void(this._moved=!0);var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.Browser.touch&&Math.abs(s.x)+Math.abs(s.y)<3||(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,o.DomUtil.addClass(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget)))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.DomUtil.removeClass(e.body,"leaflet-dragging"),this._lastTarget&&(o.DomUtil.removeClass(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null);for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],"function"==typeof n?s[a]=n.bind(h):s[a]=n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n); +case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta,!1,!0)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),void o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this))},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange,this).off("layerremove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,void this.fire("step")):void this._onTransitionEnd()},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a,r){r||(this._animatingZoom=!0),o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),o.Util.requestAnimFrame(function(){this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a}),setTimeout(o.bind(this._onZoomTransitionEnd,this),250)},this)},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1))}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth);var i=this._map.getZoom();(i>this.options.maxZoom||i.5&&.5>n?(t.style.visibility="hidden",void this._stopLoadingImages(t)):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),void clearTimeout(this._clearBgBufferTimer))},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file diff --git a/download.md b/download.md index 53233afc303..232f6e607e0 100644 --- a/download.md +++ b/download.md @@ -12,8 +12,8 @@ bodyclass: download-page Description - Leaflet 0.7.3 - Stable version, released on November 18, 2013 and last updated on May 23, 2014. + Leaflet 0.7.4 + Stable version, released on November 18, 2013 and last updated on Sep 1, 2015. Leaflet 1.0 beta 1 Last 1.0 beta, released on July 14, 2015. @@ -39,8 +35,8 @@ so please read the changelog carefully when upgrading to it. The latest stable Leaflet release is hosted on a CDN — to start using it straight away, place this in the `head` of your HTML code: - - + + ### Using a Downloaded Version of Leaflet diff --git a/examples/quick-start.md b/examples/quick-start.md index 531113de463..12d38880355 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -19,11 +19,11 @@ Before writing any code for the map, you need to do the following preparation st * Include Leaflet CSS file in the head section of your document: - + * Include Leaflet JavaScript file: - + * Put a `div` element with a certain `id` where you want your map to be: From ed0cf6e7729488a7a9b75032ca2421a57af4cc2c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 2 Sep 2015 10:25:29 +0200 Subject: [PATCH 1815/2207] update changelog about 0.7.5 --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9924e44b9fc..4de3c09efc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -243,7 +243,12 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: * Fixed the build system to work in non-git Leaflet folder (by [@cschwarz](https://github.com/cschwarz)). [#2758](https://github.com/Leaflet/Leaflet/pull/2758) -## 0.7.4 (Sep 01, 2015) +## 0.7.5 (September 2, 2015) + +* Fixed a regression that broke animation in Leaflet.markercluster. [#3796](https://github.com/Leaflet/Leaflet/issues/3796) + + +## 0.7.4 (September 1, 2015) * Fixed a bug introduced by a recent Chrome update that caused the map not to react to interactions until all tiles are loaded. [#3689](https://github.com/Leaflet/Leaflet/issues/3689) * Fixed a bug where tile layers were not respecting their `minZoom` or `maxZoom` options (by [@ivansanchez](https://github.com/ivansanchez)) [#3778](https://github.com/Leaflet/Leaflet/pull/3778) From 61c07bd3e3d9a5a2bb4855ba81e1f368cc80090b Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 4 Sep 2015 10:02:11 +0200 Subject: [PATCH 1816/2207] Call layer.getEvents before calling layer.onAdd (fix #3745) --- src/layer/Layer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layer/Layer.js b/src/layer/Layer.js index c55f557a269..5bdcea6ca65 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -45,16 +45,16 @@ L.Layer = L.Evented.extend({ this._map = map; this._zoomAnimated = map._zoomAnimated; + if (this.getEvents) { + map.on(this.getEvents(), this); + } + this.onAdd(map); if (this.getAttribution && this._map.attributionControl) { this._map.attributionControl.addAttribution(this.getAttribution()); } - if (this.getEvents) { - map.on(this.getEvents(), this); - } - this.fire('add'); map.fire('layeradd', {layer: this}); } From 55d3d49b54dee159e1ff276615655d215c71089c Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 4 Sep 2015 16:24:03 +0200 Subject: [PATCH 1817/2207] Remove check for webkitMobile before calling update on GridLayer._setView Fix #3659 --- src/layer/tile/GridLayer.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7e96c2e0f81..0f29bf3982e 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -356,9 +356,7 @@ L.GridLayer = L.Layer.extend({ this._updateLevels(); this._resetGrid(); - if (!L.Browser.mobileWebkit) { - this._update(center, tileZoom); - } + this._update(center, tileZoom); if (!noPrune) { this._pruneTiles(); From 08d655fe664a8136b88689b70c6b00024c632b1c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 4 Sep 2015 17:46:55 +0200 Subject: [PATCH 1818/2207] upgrade deps and stricter eslint --- .eslintrc | 41 +++++++++++++++++++++----------- build/build.js | 3 ++- package.json | 12 +++++----- spec/.eslintrc | 14 ----------- spec/suites/SpecHelper.js | 2 +- spec/suites/layer/PopupSpec.js | 8 +++---- src/control/Control.Layers.js | 3 +-- src/geometry/LineUtil.js | 28 ++++++++++------------ src/geometry/Point.js | 4 ++-- src/layer/Layer.Popup.js | 2 +- src/layer/marker/Marker.Popup.js | 2 +- src/map/anim/Map.FlyTo.js | 2 +- src/map/handler/Map.Drag.js | 2 +- 13 files changed, 60 insertions(+), 63 deletions(-) diff --git a/.eslintrc b/.eslintrc index c6678be8b01..4dc01117940 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,22 +1,34 @@ { "rules": { - "camelcase": 2, + "eqeqeq": 2, + "consistent-return": 2, + "no-loop-func": 2, + "no-use-before-define": [2, "nofunc"], + "no-lonely-if": 2, + "no-else-return": 2, + "no-new": 2, + "no-throw-literal": 2, + "no-self-compare": 2, + "no-void": 2, + "no-eq-null": 2, + "quotes": [2, "single"], - "no-mixed-spaces-and-tabs": [2, "smart-tabs"], - "space-after-function-name": 2, + "camelcase": 2, + "comma-style": 2, + "comma-spacing": 2, + "new-cap": 2, + "no-empty": 2, + "brace-style": [2, "1tbs", {"allowSingleLine": true}], "space-in-parens": 2, - "space-in-brackets": 2, "space-before-blocks": 2, "space-after-keywords": 2, - "no-lonely-if": 2, - "comma-style": 2, - "indent": [2, "tab"], - "no-underscore-dangle": 0, - "no-constant-condition": 0, - "no-multi-spaces": 0, - "strict": 0, - "key-spacing": 0, - "no-shadow": 0 + "space-infix-ops": 2, + "space-unary-ops": 2, + "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}], + "array-bracket-spacing": 2, + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + + "no-constant-condition": 0 }, "globals": { "L": true, @@ -25,5 +37,6 @@ }, "env": { "browser": true - } + }, + "extends": "eslint:recommended" } diff --git a/build/build.js b/build/build.js index b198a6d51f1..dd11b2ef44b 100644 --- a/build/build.js +++ b/build/build.js @@ -197,7 +197,7 @@ exports.test = function(complete, fail) { console.log('Running tests...'); - karma.server.start(testConfig, function(exitCode) { + var server = new karma.Server(testConfig, function(exitCode) { if (!exitCode) { console.log('\tTests ran successfully.\n'); complete(); @@ -205,4 +205,5 @@ exports.test = function(complete, fail) { process.exit(exitCode); } }); + server.start(); }; diff --git a/package.json b/package.json index 5dc8fc30a5d..839124a1d7b 100644 --- a/package.json +++ b/package.json @@ -4,18 +4,18 @@ "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.2.1", - "eslint": "^0.24.1", - "happen": "~0.1.3", + "eslint": "^1.3.1", + "happen": "~0.2.0", "jake": "~8.0.12", - "karma": "~0.12.37", + "karma": "~0.13.9", "karma-chrome-launcher": "^0.2.0", - "karma-coverage": "~0.4.2", + "karma-coverage": "~0.5.1", "karma-firefox-launcher": "~0.1.6", "karma-mocha": "~0.2.0", "karma-phantomjs-launcher": "^0.2.0", "karma-safari-launcher": "~0.1.1", - "magic-string": "^0.6.4", - "mocha": "~2.2.5", + "magic-string": "^0.7.0", + "mocha": "~2.3.0", "tin": "^0.5.0", "uglify-js": "~2.4.23" }, diff --git a/spec/.eslintrc b/spec/.eslintrc index e3a29ac7dfd..ff48b0da137 100644 --- a/spec/.eslintrc +++ b/spec/.eslintrc @@ -1,21 +1,7 @@ { "rules": { - "camelcase": 2, - "no-mixed-spaces-and-tabs": [2, "smart-tabs"], - "space-after-function-name": 2, - "space-in-parens": 2, - "space-in-brackets": 2, - "space-before-blocks": 2, - "space-after-keywords": 2, - "no-lonely-if": 2, - "comma-style": 2, "no-unused-vars": 0, "quotes": 0, - "no-underscore-dangle": 0, - "no-constant-condition": 0, - "no-multi-spaces": 0, - "strict": 0, - "key-spacing": 0, "no-shadow": 0, "no-irregular-whitespace": 0, "no-console": 0 diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 4b0f7ff6abf..13f736a4772 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -3,7 +3,7 @@ if (!Array.prototype.map) { Array.prototype.map = function (fun /*, thisp */) { "use strict"; - if (this === void 0 || this === null) { + if (this === undefined || this === null) { throw new TypeError(); } diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index d90a9ab5bd5..0cd3f7823d0 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -73,7 +73,7 @@ describe('Popup', function () { marker1.description = "I'm marker 1."; marker2.description = "I'm marker 2."; - group.bindPopup(function(layer) { + group.bindPopup(function (layer) { return layer.description; }); @@ -103,7 +103,7 @@ describe('Popup', function () { marker1.description = "I'm marker 1."; marker2.description = "I'm marker 2."; - group.bindPopup(function(layer) { + group.bindPopup(function (layer) { return layer.description; }); @@ -128,13 +128,13 @@ describe('Popup', function () { expect(group._popup._contentNode.innerHTML).to.be("I'm marker 2."); }); - it("should use a function for popup content when a source is passed to Popup", function() { + it("should use a function for popup content when a source is passed to Popup", function () { var marker = new L.Marker(new L.LatLng(55.8, 37.6)).addTo(map); var popup = L.popup({}, marker); marker.description = "I am a marker."; - marker.bindPopup(function(layer) { + marker.bindPopup(function (layer) { return layer.description; }); diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 7d4b9f3c32c..36cda185fc5 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -249,8 +249,7 @@ L.Control.Layers = L.Control.extend({ _expand: function () { L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); var acceptableHeight = this._map._size.y - (this._container.offsetTop * 4); - if (acceptableHeight < this._form.clientHeight) - { + if (acceptableHeight < this._form.clientHeight) { L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar'); this._form.style.height = acceptableHeight + 'px'; } diff --git a/src/geometry/LineUtil.js b/src/geometry/LineUtil.js index aecfc5b3469..e3abcffaf65 100644 --- a/src/geometry/LineUtil.js +++ b/src/geometry/LineUtil.js @@ -108,24 +108,22 @@ L.LineUtil = { while (true) { // if a,b is inside the clip window (trivial accept) - if (!(codeA | codeB)) { - return [a, b]; + if (!(codeA | codeB)) { return [a, b]; } + // if a,b is outside the clip window (trivial reject) - } else if (codeA & codeB) { - return false; + if (codeA & codeB) { return false; } + // other cases + codeOut = codeA || codeB; + p = this._getEdgeIntersection(a, b, codeOut, bounds, round); + newCode = this._getBitCode(p, bounds); + + if (codeOut === codeA) { + a = p; + codeA = newCode; } else { - codeOut = codeA || codeB; - p = this._getEdgeIntersection(a, b, codeOut, bounds, round); - newCode = this._getBitCode(p, bounds); - - if (codeOut === codeA) { - a = p; - codeA = newCode; - } else { - b = p; - codeB = newCode; - } + b = p; + codeB = newCode; } } }, diff --git a/src/geometry/Point.js b/src/geometry/Point.js index 9bc0267cf17..43ec06c4e40 100644 --- a/src/geometry/Point.js +++ b/src/geometry/Point.js @@ -55,11 +55,11 @@ L.Point.prototype = { return this; }, - scaleBy: function(point) { + scaleBy: function (point) { return new L.Point(this.x * point.x, this.y * point.y); }, - unscaleBy: function(point) { + unscaleBy: function (point) { return new L.Point(this.x / point.x, this.y / point.y); }, diff --git a/src/layer/Layer.Popup.js b/src/layer/Layer.Popup.js index 6f83a285e0d..885684118c9 100644 --- a/src/layer/Layer.Popup.js +++ b/src/layer/Layer.Popup.js @@ -97,7 +97,7 @@ L.Layer.include({ return this; }, - isPopupOpen: function() { + isPopupOpen: function () { return this._popup.isOpen(); }, diff --git a/src/layer/marker/Marker.Popup.js b/src/layer/marker/Marker.Popup.js index 9802516ae3a..b3788ff5152 100644 --- a/src/layer/marker/Marker.Popup.js +++ b/src/layer/marker/Marker.Popup.js @@ -3,7 +3,7 @@ */ L.Marker.include({ - _getPopupAnchor: function() { + _getPopupAnchor: function () { return this.options.icon.options.popupAnchor || [0, 0]; } }); diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index 1b3c36444e3..7e7a8a61c88 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -67,7 +67,7 @@ L.Map.include({ return this; }, - flyToBounds: function(bounds, options) { + flyToBounds: function (bounds, options) { var target = this._getBoundsCenterZoom(bounds, options); return this.flyTo(target.center, target.zoom, options); } diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index f1359e0010c..73c0f768436 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -106,7 +106,7 @@ L.Map.Drag = L.Handler.extend({ this._worldWidth = this._map.getPixelWorldBounds().getSize().x; }, - _viscousLimit: function(value, threshold) { + _viscousLimit: function (value, threshold) { return value - (value - threshold) * this._viscosity; }, From 504c7d79d7a5e6fc3614ac32fc17b543c3da3d1b Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 4 Sep 2015 18:18:14 +0200 Subject: [PATCH 1819/2207] don't break feature blocks on main page --- docs/css/main.css | 4 + index.html | 203 +++++++++++++++++++++++++--------------------- 2 files changed, 114 insertions(+), 93 deletions(-) diff --git a/docs/css/main.css b/docs/css/main.css index 2b6aeb0f0b5..63072faa19e 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -1075,3 +1075,7 @@ iframe[src*='youtube.com'] { margin-top: 3em; } +.no-break { + display: inline-block; + width: 100%; +} diff --git a/index.html b/index.html index 80ac1cf4f1b..da6a761883c 100644 --- a/index.html +++ b/index.html @@ -63,99 +63,116 @@

          Features

          Leaflet doesn't try to do everything for everyone. Instead it focuses on making the basic things work perfectly.

          -

          Layers Out of the Box

          - -
            -
          • Tile layers, WMS
          • -
          • Markers, Popups
          • -
          • Vector layers: polylines, polygons, circles, rectangles
          • -
          • Image overlays
          • -
          • GeoJSON
          • -
          - - -

          Interaction Features

          - -
            -
          • Drag panning with inertia
          • -
          • Scroll wheel zoom
          • -
          • Pinch-zoom on mobile
          • -
          • Double click zoom
          • -
          • Zoom to area (shift-drag)
          • -
          • Keyboard navigation
          • -
          • Events: click, mouseover, etc.
          • -
          • Marker dragging
          • -
          - -

          Visual Features

          - -
            -
          • Zoom and pan animation
          • -
          • Tile and popup fade animation
          • -
          • Very nice default design for markers, popups and map controls
          • -
          • Retina resolution support
          • -
          - - -

          Customization Features

          - -
            -
          • Pure CSS3 popups and controls for easy restyling
          • -
          • Image- and HTML-based markers
          • -
          • A simple interface for custom map layers and controls
          • -
          • Custom map projections (with EPSG:3857/4326/3395 out of the box)
          • -
          • Powerful OOP facilities for extending existing classes

            -
          - -

          Performance Features

          - -
            -
          • Hardware acceleration on mobile makes it feel as smooth as native apps
          • -
          • Utilizing CSS3 features to make panning and zooming really smooth
          • -
          • Smart polyline/polygon rendering with dynamic clipping and simplification makes it very fast
          • -
          • Modular build system for leaving out features you don't need
          • -
          • Tap delay elimination on mobile
          • -
          - -

          Map Controls

          - -
            -
          • Zoom buttons
          • -
          • Attribution
          • -
          • Layer switcher
          • -
          • Scale
          • -
          - - -

          Browser Support

          - -

          Desktop

          - -
            -
          • Chrome
          • -
          • Firefox
          • -
          • Safari 5+
          • -
          • Opera 12+
          • -
          • IE 7–11
          • -
          - -

          Mobile

          - -
            -
          • Safari for iOS 7+
          • -
          • Android browser 2.2+, 3.1+, 4+
          • -
          • Chrome for mobile
          • -
          • Firefox for mobile
          • -
          • IE10+ for Win8 devices
          • -
          - - -

          Misc

          - -
            -
          • Extremely lightweight
          • -
          • No external dependencies
          • -
          +
          +

          Layers Out of the Box

          + +
            +
          • Tile layers, WMS
          • +
          • Markers, Popups
          • +
          • Vector layers: polylines, polygons, circles, rectangles
          • +
          • Image overlays
          • +
          • GeoJSON
          • +
          +
          + + +
          +

          Interaction Features

          + +
            +
          • Drag panning with inertia
          • +
          • Scroll wheel zoom
          • +
          • Pinch-zoom on mobile
          • +
          • Double click zoom
          • +
          • Zoom to area (shift-drag)
          • +
          • Keyboard navigation
          • +
          • Events: click, mouseover, etc.
          • +
          • Marker dragging
          • +
          +
          + +
          +

          Visual Features

          + +
            +
          • Zoom and pan animation
          • +
          • Tile and popup fade animation
          • +
          • Very nice default design for markers, popups and map controls
          • +
          • Retina resolution support
          • +
          +
          + + +
          +

          Customization Features

          + +
            +
          • Pure CSS3 popups and controls for easy restyling
          • +
          • Image- and HTML-based markers
          • +
          • A simple interface for custom map layers and controls
          • +
          • Custom map projections (with EPSG:3857/4326/3395 out of the box)
          • +
          • Powerful OOP facilities for extending existing classes
          • +
          +
          + +
          +

          Performance Features

          + +
            +
          • Hardware acceleration on mobile makes it feel as smooth as native apps
          • +
          • Utilizing CSS3 features to make panning and zooming really smooth
          • +
          • Smart polyline/polygon rendering with dynamic clipping and simplification makes it very fast
          • +
          • Modular build system for leaving out features you don't need
          • +
          • Tap delay elimination on mobile
          • +
          +
          + +
          +

          Map Controls

          + +
            +
          • Zoom buttons
          • +
          • Attribution
          • +
          • Layer switcher
          • +
          • Scale
          • +
          +
          + + +
          +

          Browser Support

          + +

          Desktop

          + +
            +
          • Chrome
          • +
          • Firefox
          • +
          • Safari 5+
          • +
          • Opera 12+
          • +
          • IE 7–11
          • +
          +
          + +
          +

          Mobile

          + +
            +
          • Safari for iOS 7+
          • +
          • Android browser 2.2+, 3.1+, 4+
          • +
          • Chrome for mobile
          • +
          • Firefox for mobile
          • +
          • IE10+ for Win8 devices
          • +
          +
          + +
          +

          Misc

          + +
            +
          • Extremely lightweight
          • +
          • No external dependencies
          • +
          +

          If you find some feature really missing in Leaflet, first check if there's a plugin for it. If not, please vote for the feature on the Leaflet UserVoice page.

          From 471bec5f9a0075a8404cc7f8685d9a5ae48cc1a4 Mon Sep 17 00:00:00 2001 From: Vladimir Kulev Date: Mon, 7 Sep 2015 21:26:06 +0300 Subject: [PATCH 1820/2207] Fix typo in popup event names --- reference.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference.html b/reference.html index 45d9b8fbe50..fae3b1974ef 100644 --- a/reference.html +++ b/reference.html @@ -1779,12 +1779,12 @@

          Events

          Description - added + add PopupEvent Fired when the popup is added to the map. - removed + remove PopupEvent Fired when the popup is removed from the map. From 944f2de3a8932a2347acb33f72b83080c4f1b031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 7 Sep 2015 17:37:25 +0200 Subject: [PATCH 1821/2207] Fix TileLayer._update so it doesn't break drag-then-pinch interactions. --- src/layer/tile/GridLayer.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7e96c2e0f81..0e42d838a90 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -343,8 +343,15 @@ L.GridLayer = L.Layer.extend({ }, _setView: function (center, zoom, noPrune, noUpdate) { - var tileZoom = Math.round(zoom), - tileZoomChanged = this._tileZoom !== tileZoom; + var tileZoom = Math.round(zoom); + if (this.options.maxZoom !== undefined) { + tileZoom = Math.min(tileZoom, this.options.maxZoom); + } + if (this.options.minZoom !== undefined) { + tileZoom = Math.max(tileZoom, this.options.minZoom); + } + + var tileZoomChanged = (this._tileZoom !== tileZoom); if (!noUpdate && tileZoomChanged) { @@ -431,12 +438,8 @@ L.GridLayer = L.Layer.extend({ if (center === undefined) { center = map.getCenter(); } if (zoom === undefined) { zoom = map.getZoom(); } - var tileZoom = Math.round(zoom); - - if (tileZoom > this.options.maxZoom || - tileZoom < this.options.minZoom) { return; } - var pixelBounds = this._getTiledPixelBounds(center, zoom, tileZoom); + var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom); var tileRange = this._pxBoundsToTileRange(pixelBounds), tileCenter = tileRange.getCenter(), @@ -446,11 +449,13 @@ L.GridLayer = L.Layer.extend({ this._tiles[key].current = false; } + if (Math.abs(zoom - this._tileZoom) > 1) { return; } + // create a queue of coordinates to load tiles from for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { for (var i = tileRange.min.x; i <= tileRange.max.x; i++) { var coords = new L.Point(i, j); - coords.z = tileZoom; + coords.z = this._tileZoom; if (!this._isValidTile(coords)) { continue; } From 7098b04cd7ccbd465a403a95c86aa96ba36f2814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 9 Sep 2015 14:03:12 +0200 Subject: [PATCH 1822/2207] Modify GridLayer update logic to run smoother on zoom pinch & flyTo anims. --- debug/map/zoompan.html | 5 ++--- src/layer/tile/GridLayer.js | 27 ++++++++++++++------------- src/layer/tile/TileLayer.js | 4 ++-- src/map/anim/Map.FlyTo.js | 3 ++- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 91884de0ab1..1f277ca30d0 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -52,9 +52,8 @@ var map = L.map('map').setView(dc, 10); - var tiles = L.tileLayer('http://{s}.tiles.mapbox.com/v3/{id}/{z}/{x}/{y}.png', { - attribution: 'Terms and Feedback', - id: 'examples.map-20v6611k' + var positron = L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors, © CartoDB' }).addTo(map); var marker1 = L.marker(kyiv).addTo(map), diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 0e42d838a90..0fb02235c5b 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -183,7 +183,7 @@ L.GridLayer = L.Layer.extend({ } } - if (willPrune) { this._pruneTiles(); } + if (willPrune && !this._noPrune) { this._pruneTiles(); } if (nextFrame) { L.Util.cancelAnimFrame(this._fadeFrame); @@ -334,8 +334,8 @@ L.GridLayer = L.Layer.extend({ }, _resetView: function (e) { - var pinch = e && e.pinch; - this._setView(this._map.getCenter(), this._map.getZoom(), pinch, pinch); + var animating = e && (e.pinch || e.flyTo); + this._setView(this._map.getCenter(), this._map.getZoom(), animating, animating); }, _animateZoom: function (e) { @@ -351,9 +351,9 @@ L.GridLayer = L.Layer.extend({ tileZoom = Math.max(tileZoom, this.options.minZoom); } - var tileZoomChanged = (this._tileZoom !== tileZoom); + var tileZoomChanged = (Math.abs(tileZoom - this._tileZoom) > 1 || this._tileZoom === undefined); - if (!noUpdate && tileZoomChanged) { + if (!noUpdate || tileZoomChanged) { if (this._abortLoading) { this._abortLoading(); @@ -363,13 +363,15 @@ L.GridLayer = L.Layer.extend({ this._updateLevels(); this._resetGrid(); - if (!L.Browser.mobileWebkit) { - this._update(center, tileZoom); - } + this._update(center, tileZoom); if (!noPrune) { this._pruneTiles(); } + + // Flag to prevent _updateOpacity from pruning tiles during + // a zoom anim or a pinch gesture + this._noPrune = !!noPrune; } this._setZoomTransforms(center, zoom); @@ -417,8 +419,7 @@ L.GridLayer = L.Layer.extend({ _onMoveEnd: function () { if (!this._map) { return; } - this._update(); - this._pruneTiles(); + this._resetView(); }, _getTiledPixelBounds: function (center, zoom, tileZoom) { @@ -432,12 +433,12 @@ L.GridLayer = L.Layer.extend({ }, _update: function (center, zoom) { - var map = this._map; if (!map) { return; } if (center === undefined) { center = map.getCenter(); } if (zoom === undefined) { zoom = map.getZoom(); } + if (this._tileZoom === undefined) { return; } var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom); @@ -449,7 +450,7 @@ L.GridLayer = L.Layer.extend({ this._tiles[key].current = false; } - if (Math.abs(zoom - this._tileZoom) > 1) { return; } + if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); } // create a queue of coordinates to load tiles from for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { @@ -588,7 +589,7 @@ L.GridLayer = L.Layer.extend({ // we know that tile is async and will be ready later; otherwise if (this.createTile.length < 2) { // mark tile as ready, but delay one frame for opacity animation to happen - setTimeout(L.bind(this._tileReady, this, coords, null, tile), 0); + L.Util.requestAnimFrame(this._tileReady, this, coords, null, tile); } // we prefer top/left over translate3d so that we don't create a HW-accelerated layer from each tile diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 5b5a132238e..73f140c582e 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -56,8 +56,8 @@ L.TileLayer = L.GridLayer.extend({ createTile: function (coords, done) { var tile = document.createElement('img'); - tile.onload = L.bind(this._tileOnLoad, this, done, tile); - tile.onerror = L.bind(this._tileOnError, this, done, tile); + L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile)); + L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile)); if (this.options.crossOrigin) { tile.crossOrigin = ''; diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index 7e7a8a61c88..a238919f9f3 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -52,7 +52,8 @@ L.Map.include({ this._move( this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom), - this.getScaleZoom(w0 / w(s), startZoom)); + this.getScaleZoom(w0 / w(s), startZoom), + {flyTo: true}); } else { this From 3c3f23f33918f6105d354bf0261586cce05036e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 9 Sep 2015 15:41:56 +0200 Subject: [PATCH 1823/2207] Fix small minZoom/maxZoom infinite-loop-on-map-load regression --- src/layer/tile/GridLayer.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 0fb02235c5b..0faeab8b5d3 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -344,14 +344,12 @@ L.GridLayer = L.Layer.extend({ _setView: function (center, zoom, noPrune, noUpdate) { var tileZoom = Math.round(zoom); - if (this.options.maxZoom !== undefined) { - tileZoom = Math.min(tileZoom, this.options.maxZoom); - } - if (this.options.minZoom !== undefined) { - tileZoom = Math.max(tileZoom, this.options.minZoom); + if ((this.options.maxZoom !== undefined && tileZoom > this.options.maxZoom) || + (this.options.minZoom !== undefined && tileZoom < this.options.minZoom)) { + tileZoom = undefined; } - var tileZoomChanged = (Math.abs(tileZoom - this._tileZoom) > 1 || this._tileZoom === undefined); + var tileZoomChanged = (tileZoom !== this._tileZoom); if (!noUpdate || tileZoomChanged) { @@ -363,7 +361,9 @@ L.GridLayer = L.Layer.extend({ this._updateLevels(); this._resetGrid(); - this._update(center, tileZoom); + if (tileZoom !== undefined) { + this._update(center, tileZoom); + } if (!noPrune) { this._pruneTiles(); @@ -589,7 +589,7 @@ L.GridLayer = L.Layer.extend({ // we know that tile is async and will be ready later; otherwise if (this.createTile.length < 2) { // mark tile as ready, but delay one frame for opacity animation to happen - L.Util.requestAnimFrame(this._tileReady, this, coords, null, tile); + L.Util.requestAnimFrame(L.bind(this._tileReady, this, coords, null, tile)); } // we prefer top/left over translate3d so that we don't create a HW-accelerated layer from each tile From e5a208c670d4418f72196932d5e9cf85f86db89e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 9 Sep 2015 16:06:57 +0200 Subject: [PATCH 1824/2207] Fix #3355 by not aborting tile loading for tiles in the "active" zoom level. --- src/layer/tile/GridLayer.js | 3 ++- src/layer/tile/TileLayer.js | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 0faeab8b5d3..09eb98b8363 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -353,11 +353,12 @@ L.GridLayer = L.Layer.extend({ if (!noUpdate || tileZoomChanged) { + this._tileZoom = tileZoom; + if (this._abortLoading) { this._abortLoading(); } - this._tileZoom = tileZoom; this._updateLevels(); this._resetGrid(); diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index 73f140c582e..eacc2b0f140 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -140,14 +140,16 @@ L.TileLayer = L.GridLayer.extend({ _abortLoading: function () { var i, tile; for (i in this._tiles) { - tile = this._tiles[i].el; + if (this._tiles[i].coords.z !== this._tileZoom) { + tile = this._tiles[i].el; - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; + tile.onload = L.Util.falseFn; + tile.onerror = L.Util.falseFn; - if (!tile.complete) { - tile.src = L.Util.emptyImageUrl; - L.DomUtil.remove(tile); + if (!tile.complete) { + tile.src = L.Util.emptyImageUrl; + L.DomUtil.remove(tile); + } } } } From 641cdd07f73b37c321e1e0bb1f6c7b17313f8800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 9 Sep 2015 16:25:20 +0200 Subject: [PATCH 1825/2207] Clarifications for GridLayer._update --- src/layer/tile/GridLayer.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 09eb98b8363..603d82f4710 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -354,7 +354,7 @@ L.GridLayer = L.Layer.extend({ if (!noUpdate || tileZoomChanged) { this._tileZoom = tileZoom; - + if (this._abortLoading) { this._abortLoading(); } @@ -433,13 +433,14 @@ L.GridLayer = L.Layer.extend({ return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); }, + // Private method to load tiles in the grid's active zoom level according to map bounds _update: function (center, zoom) { var map = this._map; if (!map) { return; } if (center === undefined) { center = map.getCenter(); } if (zoom === undefined) { zoom = map.getZoom(); } - if (this._tileZoom === undefined) { return; } + if (this._tileZoom === undefined) { return; } // if out of minzoom/maxzoom var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom); @@ -451,7 +452,9 @@ L.GridLayer = L.Layer.extend({ this._tiles[key].current = false; } - if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); } + // _update just loads more tiles. If the tile zoom level differs too much + // from the map's, let _setView reset levels and prune old tiles. + if (Math.abs(zoom - this._tileZoom) > 1) { return this._setView(center, zoom); } // create a queue of coordinates to load tiles from for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { From bc36fb645d91475a38383c26b15aaec59fb644bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 9 Sep 2015 16:46:09 +0200 Subject: [PATCH 1826/2207] Make linter happy. --- src/layer/tile/GridLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 603d82f4710..821e43355d0 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -454,7 +454,7 @@ L.GridLayer = L.Layer.extend({ // _update just loads more tiles. If the tile zoom level differs too much // from the map's, let _setView reset levels and prune old tiles. - if (Math.abs(zoom - this._tileZoom) > 1) { return this._setView(center, zoom); } + if (Math.abs(zoom - this._tileZoom) > 1) { this._setView(center, zoom); return; } // create a queue of coordinates to load tiles from for (var j = tileRange.min.y; j <= tileRange.max.y; j++) { From fa79c182ca1f53fb348638141c2baa9ea7447778 Mon Sep 17 00:00:00 2001 From: Filip Zavadil Date: Wed, 9 Sep 2015 17:27:54 +0200 Subject: [PATCH 1827/2207] add leaflet-icon-pulse --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 4c9c86170d1..89540e02005 100644 --- a/plugins.md +++ b/plugins.md @@ -908,6 +908,16 @@ These plugins provide new markers or news ways of converting abstract data into Gismartwaredev + ++ ++ leaflet-icon-pulse ++ ++ Renders pulsing icon using CSS3. It can be used for location marker. ++ ++ mapshakers/ ++ Filip Zavadil ++ ++ From ae98502af20595df5c3aebc844c18db081d6df37 Mon Sep 17 00:00:00 2001 From: Filip Zavadil Date: Wed, 9 Sep 2015 17:36:06 +0200 Subject: [PATCH 1828/2207] add leaflet-control-window --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 89540e02005..73a7f4c52cc 100644 --- a/plugins.md +++ b/plugins.md @@ -2202,6 +2202,16 @@ Buttons, sliders, toolbars, sidebars, and panels. EPP + ++ ++ leaflet-control-window ++ ++ Creates modal/modeless, draggable, responsive, customisable window in your map. ++ ++ mapshakers/ ++ Filip Zavadil ++ ++ From 0c8d7148841c3f4b465b77e4f67d25ed9eb333ca Mon Sep 17 00:00:00 2001 From: Filip Zavadil Date: Wed, 9 Sep 2015 17:45:32 +0200 Subject: [PATCH 1829/2207] typo leaflet-control-window --- plugins.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins.md b/plugins.md index 73a7f4c52cc..19e3faf3835 100644 --- a/plugins.md +++ b/plugins.md @@ -2203,15 +2203,15 @@ Buttons, sliders, toolbars, sidebars, and panels. -+ -+ leaflet-control-window -+ -+ Creates modal/modeless, draggable, responsive, customisable window in your map. -+ -+ mapshakers/ -+ Filip Zavadil -+ -+ + + leaflet-control-window + + Creates modal/modeless, draggable, responsive, customisable window in your map. + + mapshakers/ + Filip Zavadil + + From fb71e2c11e9f5cb6d56cff34924d247914a19d6a Mon Sep 17 00:00:00 2001 From: Dave Leaver Date: Thu, 10 Sep 2015 09:15:59 +1200 Subject: [PATCH 1830/2207] Remove + characters --- plugins.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins.md b/plugins.md index 89540e02005..05368c7fc0d 100644 --- a/plugins.md +++ b/plugins.md @@ -909,15 +909,15 @@ These plugins provide new markers or news ways of converting abstract data into -+ -+ leaflet-icon-pulse -+ -+ Renders pulsing icon using CSS3. It can be used for location marker. -+ -+ mapshakers/ -+ Filip Zavadil -+ -+ + + leaflet-icon-pulse + + Renders pulsing icon using CSS3. It can be used for location marker. + + mapshakers/ + Filip Zavadil + + From e5182affc63b05ea362502e00fb454be953a5993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 10 Sep 2015 09:41:39 +0200 Subject: [PATCH 1831/2207] Make GridLayer._update always depend on the map's zoom level. --- src/layer/tile/GridLayer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 821e43355d0..c81f2b8cd21 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -363,7 +363,7 @@ L.GridLayer = L.Layer.extend({ this._resetGrid(); if (tileZoom !== undefined) { - this._update(center, tileZoom); + this._update(center); } if (!noPrune) { @@ -434,12 +434,12 @@ L.GridLayer = L.Layer.extend({ }, // Private method to load tiles in the grid's active zoom level according to map bounds - _update: function (center, zoom) { + _update: function (center) { var map = this._map; if (!map) { return; } + var zoom = map.getZoom(); if (center === undefined) { center = map.getCenter(); } - if (zoom === undefined) { zoom = map.getZoom(); } if (this._tileZoom === undefined) { return; } // if out of minzoom/maxzoom var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom); From 0a6239d042974a79f8d9fd3826de8eb26cbeaef6 Mon Sep 17 00:00:00 2001 From: Filip Zavadil Date: Thu, 10 Sep 2015 10:33:26 +0200 Subject: [PATCH 1832/2207] added leaflet-mapkey-icon --- plugins.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b7cb448d900..b7073d3fb29 100644 --- a/plugins.md +++ b/plugins.md @@ -912,7 +912,17 @@ These plugins provide new markers or news ways of converting abstract data into leaflet-icon-pulse - Renders pulsing icon using CSS3. It can be used for location marker. + Renders pulsing icon using CSS3. It can be used for location marker. + + mapshakers/ + Filip Zavadil + + + + + leaflet-mapkey-icon + + Set of cartographic font icons based on mapkeyicons. mapshakers/ Filip Zavadil From c5172f3088b820325e726f57f0b09b16b1ec498d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 11 Sep 2015 09:42:32 +0200 Subject: [PATCH 1833/2207] Prevent to use extreme values in transform3d - FF bugs in positioning the element - Chrom(e|ium) have a one pixel offset --- src/layer/tile/GridLayer.js | 2 -- src/map/Map.js | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 7e96c2e0f81..bac2827a59d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -586,8 +586,6 @@ L.GridLayer = L.Layer.extend({ setTimeout(L.bind(this._tileReady, this, coords, null, tile), 0); } - // we prefer top/left over translate3d so that we don't create a HW-accelerated layer from each tile - // which is slow, and it also fixes gaps between tiles in Safari L.DomUtil.setPosition(tile, tilePos); // save tile in cache diff --git a/src/map/Map.js b/src/map/Map.js index 5db707d5f53..3632613cbcb 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -16,7 +16,8 @@ L.Map = L.Evented.extend({ fadeAnimation: true, trackResize: true, markerZoomAnimation: true, - maxBoundsViscosity: 0.0 + maxBoundsViscosity: 0.0, + transform3DLimit: 9999990 }, initialize: function (id, options) { // (HTMLElement or String, Object) @@ -611,6 +612,8 @@ L.Map = L.Evented.extend({ if (this.options.trackResize) { L.DomEvent[onOff](window, 'resize', this._onResize, this); } + + this[onOff]('moveend', this._onMoveEnd); }, _onResize: function () { @@ -624,6 +627,16 @@ L.Map = L.Evented.extend({ this._container.scrollLeft = 0; }, + _onMoveEnd: function () { + if (L.Browser.any3d && this.options.transform3DLimit && + (Math.abs(this._mapPane._leaflet_pos.x) >= this.options.transform3DLimit + || Math.abs(this._mapPane._leaflet_pos.y) >= this.options.transform3DLimit)) { + // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have + // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ + this._resetView(this.getCenter(), this.getZoom()); + } + }, + _findEventTargets: function (src, type, bubble) { var targets = [], target; while (src) { From 5f1b230bda4d943dbb77c3a210dd21c6cf4d31bd Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 11 Sep 2015 12:20:51 +0200 Subject: [PATCH 1834/2207] Cleaner code for L.Map._onMoveEnd --- src/map/Map.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 3632613cbcb..3b2cb01204b 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -613,7 +613,9 @@ L.Map = L.Evented.extend({ L.DomEvent[onOff](window, 'resize', this._onResize, this); } - this[onOff]('moveend', this._onMoveEnd); + if (L.Browser.any3d && this.options.transform3DLimit) { + this[onOff]('moveend', this._onMoveEnd); + } }, _onResize: function () { @@ -628,9 +630,8 @@ L.Map = L.Evented.extend({ }, _onMoveEnd: function () { - if (L.Browser.any3d && this.options.transform3DLimit && - (Math.abs(this._mapPane._leaflet_pos.x) >= this.options.transform3DLimit - || Math.abs(this._mapPane._leaflet_pos.y) >= this.options.transform3DLimit)) { + var pos = this._getMapPanePos(); + if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) { // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ this._resetView(this.getCenter(), this.getZoom()); From 17c180e1eff97932c3450447d5d17fda199f7c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 11 Sep 2015 16:18:24 +0200 Subject: [PATCH 1835/2207] Update max precision of CSS transforms to those of 32-bit floats, as used by Firefox --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 3b2cb01204b..fd42415d1be 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -17,7 +17,7 @@ L.Map = L.Evented.extend({ trackResize: true, markerZoomAnimation: true, maxBoundsViscosity: 0.0, - transform3DLimit: 9999990 + transform3DLimit: 8388608 // Precision limit of a 32-bit float }, initialize: function (id, options) { // (HTMLElement or String, Object) From c6d858775341667dceefd0f7b9f0718cf7d52c0e Mon Sep 17 00:00:00 2001 From: danzel Date: Mon, 14 Sep 2015 13:18:43 +1200 Subject: [PATCH 1836/2207] Don't use maxTouchPoints detection in IE11+ (or edge) either, matching our msPointer detection. --- src/core/Browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Browser.js b/src/core/Browser.js index 0ad3dcdb6d1..e5ab98b6ac2 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -17,7 +17,7 @@ mobile = typeof orientation !== 'undefined' || ua.indexOf('mobile') !== -1, msPointer = !window.PointerEvent && window.MSPointerEvent, - pointer = (window.PointerEvent && navigator.pointerEnabled && navigator.maxTouchPoints) || msPointer, + pointer = (window.PointerEvent && navigator.pointerEnabled) || msPointer, ie3d = ie && ('transition' in doc.style), webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, From c60fd1d17b55af8815274cbcfcaf1f8ecb3fa32f Mon Sep 17 00:00:00 2001 From: danzel Date: Mon, 14 Sep 2015 13:19:16 +1200 Subject: [PATCH 1837/2207] Only preventDefault for non-mouse events, this makes mouse events still cause mousedown/up events, which is usually what you want. Fixes #3804 --- src/dom/DomEvent.Pointer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js index 4e4ced58de3..475ffc4fd3c 100644 --- a/src/dom/DomEvent.Pointer.js +++ b/src/dom/DomEvent.Pointer.js @@ -49,7 +49,9 @@ L.extend(L.DomEvent, { _addPointerStart: function (obj, handler, id) { var onDown = L.bind(function (e) { - L.DomEvent.preventDefault(e); + if (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) { + L.DomEvent.preventDefault(e); + } this._handlePointer(e, handler); }, this); From 76868ad3f4099dd5eb34e4ba22778b6b653c2d3d Mon Sep 17 00:00:00 2001 From: javimolla Date: Mon, 14 Sep 2015 16:13:46 +0200 Subject: [PATCH 1838/2207] Extract logic from getScaleZoom to CRS Added tests for custom crs with zooms not power of two related --- spec/index.html | 3 +++ spec/suites/geo/CRSSpec.js | 40 ++++++++++++++++++++++++++++++++++++++ spec/suites/map/MapSpec.js | 10 +++++++++- src/geo/crs/CRS.js | 4 ++++ src/map/Map.js | 4 ++-- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/spec/index.html b/spec/index.html index 5c94956efde..7e2387f640e 100644 --- a/spec/index.html +++ b/spec/index.html @@ -84,6 +84,9 @@ + + + diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js index a75efb92c40..32b18289f7c 100644 --- a/spec/suites/geo/CRSSpec.js +++ b/spec/suites/geo/CRSSpec.js @@ -157,3 +157,43 @@ describe("CRS.Simple", function () { }); }); }); + +describe("CRS", function () { + var crs = L.CRS; + + describe("#zoom && #scale", function () { + it("convert zoom to scale and viceversa and return the same values", function () { + var zoom = 2.5; + var scale = crs.scale(zoom); + expect(crs.zoom(scale)).to.eql(zoom); + }); + }); +}); + +describe("CRS.ZoomNotPowerOfTwo", function () { + var crs = L.extend({}, L.CRS, { + scale: function (zoom) { + return 256 * Math.pow(1.5, zoom); + }, + zoom: function (scale) { + return Math.log(scale / 256) / Math.log(1.5); + } + }); + + describe("#scale", function () { + it("of zoom levels are related by a power of 1.5", function () { + var zoom = 5; + var scale = crs.scale(zoom); + expect(crs.scale(zoom + 1)).to.eql(1.5 * scale); + expect(crs.zoom(1.5 * scale)).to.eql(zoom + 1); + }); + }); + + describe("#zoom && #scale", function () { + it("convert zoom to scale and viceversa and return the same values", function () { + var zoom = 2; + var scale = crs.scale(zoom); + expect(crs.zoom(scale)).to.eql(zoom); + }); + }); +}); \ No newline at end of file diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 43f692c702c..d0302ce870c 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -746,5 +746,13 @@ describe("Map", function () { }); }); - + + describe('#getScaleZoom && #getZoomScale', function () { + it("convert zoom to scale and viceversa and return the same values", function () { + var toZoom = 6.25; + var fromZoom = 8.5; + var scale = map.getScaleZoom(toZoom, fromZoom); + expect(Math.round(map.getZoomScale(scale, fromZoom) * 100) / 100).to.eql(toZoom); + }); + }); }); diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js index e7288df41ae..4a00f0491b4 100644 --- a/src/geo/crs/CRS.js +++ b/src/geo/crs/CRS.js @@ -33,6 +33,10 @@ L.CRS = { scale: function (zoom) { return 256 * Math.pow(2, zoom); }, + + zoom: function (scale) { + return Math.log(scale / 256) / Math.LN2; + }, // returns the bounds of the world in projected coords if applicable getProjectedBounds: function (zoom) { diff --git a/src/map/Map.js b/src/map/Map.js index 3632613cbcb..ade0ced5eb1 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -400,11 +400,11 @@ L.Map = L.Evented.extend({ }, getScaleZoom: function (scale, fromZoom) { + var crs = this.options.crs; fromZoom = fromZoom === undefined ? this._zoom : fromZoom; - return fromZoom + (Math.log(scale) / Math.LN2); + return crs.zoom(scale * crs.scale(fromZoom)); }, - // conversion methods project: function (latlng, zoom) { // (LatLng[, Number]) -> Point From bd55613cb58b1b62e80cac9a8f64333e2681a0df Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 12 Sep 2015 07:31:31 +0200 Subject: [PATCH 1839/2207] Always call renderer.getEvents before Path.getEvents (fix #3836) --- src/layer/vector/Path.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js index 0ca7656ba6b..fa23db71ef0 100644 --- a/src/layer/vector/Path.js +++ b/src/layer/vector/Path.js @@ -23,8 +23,13 @@ L.Path = L.Layer.extend({ interactive: true }, + beforeAdd: function (map) { + // Renderer is set here because we need to call renderer.getEvents + // before this.getEvents. + this._renderer = map.getRenderer(this); + }, + onAdd: function () { - this._renderer = this._map.getRenderer(this); this._renderer._initPath(this); this._reset(); this._renderer._addPath(this); From b8aea43414d06064a7ad76a67a2d36517e77a07f Mon Sep 17 00:00:00 2001 From: Matthew Mueller Date: Fri, 4 Sep 2015 15:56:21 -0400 Subject: [PATCH 1840/2207] Fixing negative acceptableHeights and supporting browser resize The previous formula calculated acceptableHeight as (map height - (4 * element offset). If the element had other controls above it, it might be pushed lower on the screen, which depending on screen size means that the acceptableHeight could quickly become a negative value which causes a bug. For example: my map has a height of 815px, and my layer control is offset from the top 277px so it is almost halfway down my screen. Using the old formula, the acceptable height would be 815 - (277 * 4) = -293. Since the acceptable height was less than the client height the scrollbar would show up, but it would be greyed out, and because the height limit was negative, the window would not have a height limit and expand off the map. Using the new formula it takes the vertical offset, and adds 50px(element is 36px,+ bottom credits height + a few pixels for a bottom margin) to determine max height. This means the element will be able to expand until it is a few pixels above the credits at the bottom of the map before it stops expanding. Additionally, by resetting the form.style.height to null before checking the clientHeight, we are removing the limit on the height of the control, so that if someone resizes their browser window to make it larger when viewing the layer list, the list will reset the max height instead of keeping the smaller max height that was already set, and in addition, if the scrollbar is no longer needed, it will be removed. --- src/control/Control.Layers.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 36cda185fc5..0488972f76d 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -248,10 +248,13 @@ L.Control.Layers = L.Control.extend({ _expand: function () { L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded'); - var acceptableHeight = this._map._size.y - (this._container.offsetTop * 4); + this._form.style.height = null; + var acceptableHeight = this._map._size.y - (this._container.offsetTop + 50); if (acceptableHeight < this._form.clientHeight) { L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar'); this._form.style.height = acceptableHeight + 'px'; + } else { + L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar'); } }, From 3924d49bcdd4d88099b0d9a3196ebcd29479a4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 4 Sep 2015 09:13:37 +0200 Subject: [PATCH 1841/2207] Consistency between L.circle and L.circleMarker (#3785) --- spec/suites/layer/vector/CircleSpec.js | 19 ++++++++++++++++++- src/layer/vector/Circle.js | 12 ++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/spec/suites/layer/vector/CircleSpec.js b/spec/suites/layer/vector/CircleSpec.js index 0b45bc8d22b..7efdb0d9e72 100644 --- a/spec/suites/layer/vector/CircleSpec.js +++ b/spec/suites/layer/vector/CircleSpec.js @@ -5,7 +5,7 @@ describe('Circle', function () { beforeEach(function () { map = L.map(document.createElement('div')).setView([0, 0], 4); - circle = L.circle([50, 30], 200).addTo(map); + circle = L.circle([50, 30], {radius: 200}).addTo(map); }); it('returns bounds', function () { @@ -15,4 +15,21 @@ describe('Circle', function () { expect(bounds.getNorthEast()).nearLatLng(new L.LatLng(50.05646, 30.08789)); }); }); + + describe('Legacy factory', function () { + + var map, circle; + + beforeEach(function () { + map = L.map(document.createElement('div')).setView([0, 0], 4); + circle = L.circle([50, 30], 200).addTo(map); + }); + + it('returns same bounds as 1.0 factory', function () { + var bounds = circle.getBounds(); + + expect(bounds.getSouthWest()).nearLatLng(new L.LatLng(49.94347, 29.91211)); + expect(bounds.getNorthEast()).nearLatLng(new L.LatLng(50.05646, 30.08789)); + }); + }); }); diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index bfef81ced53..b4f7aebfdd3 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -5,10 +5,10 @@ L.Circle = L.CircleMarker.extend({ - initialize: function (latlng, radius, options) { + initialize: function (latlng, options) { L.setOptions(this, options); this._latlng = L.latLng(latlng); - this._mRadius = radius; + this._mRadius = options.radius; }, setRadius: function (radius) { @@ -62,6 +62,10 @@ L.Circle = L.CircleMarker.extend({ } }); -L.circle = function (latlng, radius, options) { - return new L.Circle(latlng, radius, options); +L.circle = function (latlng, options, legacyOptions) { + if (typeof options === 'number') { + // Backwards compatibility with 0.7.x factory (latlng, radius, options?) + options = L.extend({}, legacyOptions, {radius: options}); + } + return new L.Circle(latlng, options); }; From e576ce528ea6a980a23f49b447ccbf80899dfe79 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 20 Sep 2015 12:32:15 +0200 Subject: [PATCH 1842/2207] Linting --- src/control/Control.Layers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 9ba13aad39d..88556c2b16a 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -36,7 +36,7 @@ L.Control.Layers = L.Control.extend({ return this._container; }, - onRemove: function() { + onRemove: function () { this._map.off('zoomend', this._checkDisabledLayers, this); }, From f643d25637a934586b125d9fcf10969fa682b1ba Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 14 Sep 2015 13:05:48 +0200 Subject: [PATCH 1843/2207] Use clip to limit canvas redraw area (fix #3583) --- src/layer/vector/Canvas.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index b8c596c771a..018dd8cf91a 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -9,7 +9,8 @@ L.Canvas = L.Renderer.extend({ this._layers = this._layers || {}; - // redraw vectors since canvas is cleared upon removal + // Redraw vectors since canvas is cleared upon removal, + // in case of removing the renderer itself from the map. this._draw(); }, @@ -96,11 +97,17 @@ L.Canvas = L.Renderer.extend({ _draw: function (clear) { this._clear = clear; - var layer; + var layer, bounds = this._redrawBounds; + this._ctx.save(); + if (bounds) { + this._ctx.beginPath(); + this._ctx.rect(bounds.min.x, bounds.min.y, bounds.max.x - bounds.min.x, bounds.max.y - bounds.min.y); + this._ctx.clip(); + } for (var id in this._layers) { layer = this._layers[id]; - if (!this._redrawBounds || layer._pxBounds.intersects(this._redrawBounds)) { + if (!bounds || layer._pxBounds.intersects(bounds)) { layer._updatePath(); } if (clear && layer._removed) { @@ -108,6 +115,7 @@ L.Canvas = L.Renderer.extend({ delete this._layers[id]; } } + this._ctx.restore(); // Restore state before clipping. }, _updatePoly: function (layer, closed) { From 8ea42c1cccd3c2446cd5ba0916444ec9190fbd71 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 20 Sep 2015 11:25:50 +0200 Subject: [PATCH 1844/2207] Add padding on canvas redraw bounds --- src/layer/vector/Canvas.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 018dd8cf91a..bfce28e7aaa 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -80,8 +80,10 @@ L.Canvas = L.Renderer.extend({ _requestRedraw: function (layer) { if (!this._map) { return; } + var padding = (layer.options.weight || 0) + 1; this._redrawBounds = this._redrawBounds || new L.Bounds(); - this._redrawBounds.extend(layer._pxBounds.min).extend(layer._pxBounds.max); + this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding])) + this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding])); this._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this); }, From 458d5c9ac8dd83345c176571dc9250fb53de3f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Zeutzheim?= Date: Tue, 22 Sep 2015 01:49:05 +0900 Subject: [PATCH 1845/2207] Fix bug with maxNativeZoom == 0 Setting `maxNativeZoom` to `0` does not work as expected (only use zoom level 0) but instead disables the function. This PR fixes this problem. Same fix applies for (afaik current stable) 0.7.5 --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index eacc2b0f140..db35008a71f 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -128,7 +128,7 @@ L.TileLayer = L.GridLayer.extend({ zoom += options.zoomOffset; - return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom; + return options.maxNativeZoom !== null ? Math.min(zoom, options.maxNativeZoom) : zoom; }, _getSubdomain: function (tilePoint) { From 3a174528dd34d5e82b326a54e8c8cdb10b3326fe Mon Sep 17 00:00:00 2001 From: elfalem Date: Mon, 21 Sep 2015 20:53:02 -0400 Subject: [PATCH 1846/2207] Add new plugin - Leaflet.curve --- plugins.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b7073d3fb29..3181fa017ed 100644 --- a/plugins.md +++ b/plugins.md @@ -741,7 +741,7 @@ The following plugins provide new ways of displaying overlay data information. ### Markers & renderers -These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also known these as symbolizers. +These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also know these as symbolizers. @@ -928,6 +928,15 @@ These plugins provide new markers or news ways of converting abstract data into Filip Zavadil + + +
          PluginDescriptionMaintainer
          + Leaflet.curve + + A Leaflet plugin for drawing Bézier curves and other complex shapes. Demo. + + elfalem +
          From 6f8b278f86e0144ac01c7f7f862d5676f827ab94 Mon Sep 17 00:00:00 2001 From: Egon Steiner Date: Tue, 22 Sep 2015 10:12:09 +0200 Subject: [PATCH 1847/2207] fix typo in pull url --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4de3c09efc5..57c3de621f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -254,7 +254,7 @@ Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https: * Fixed a bug where tile layers were not respecting their `minZoom` or `maxZoom` options (by [@ivansanchez](https://github.com/ivansanchez)) [#3778](https://github.com/Leaflet/Leaflet/pull/3778) * Improved detection of touch-capable web browsers, in particular fixing touch interactions in device emulation mode in Chrome and Firefox (by [@ivansanchez](https://github.com/ivansanchez)) [#3520](https://github.com/Leaflet/Leaflet/pull/3520) [#3710](https://github.com/Leaflet/Leaflet/pull/3710) * Fixed a bug where tile layers with `maxNativeZoom` were not checking bounds properly (by [@jlaxon](https://github.com/jlaxon)) [#3415](https://github.com/Leaflet/Leaflet/pull/3152) -* Fixed a bug where popups were not remembering which layer originated them after calling `bindPopup(popup)` (by [@Eschon](https://github.com/Eschon)) [#3675](https://github.com/Leaflet/Leaflet/pull/3765) +* Fixed a bug where popups were not remembering which layer originated them after calling `bindPopup(popup)` (by [@Eschon](https://github.com/Eschon)) [#3675](https://github.com/Leaflet/Leaflet/pull/3675) * Fixed a race condition between markers and zoom animation (by [@perliedman](https://github.com/perliedman)) [#3152](https://github.com/Leaflet/Leaflet/pull/3152) * Fixed a bug with `Map.fitBounds` padding (by [@bsstoner](https://github.com/bsstoner)). [#2489](https://github.com/Leaflet/Leaflet/issues/2489) * Allow canvas paths to fire `dblclick` and `contextmenu` events (by [@ivansanchez](https://github.com/ivansanchez)) [#3482](https://github.com/Leaflet/Leaflet/pull/3482) From c1f05fc80ffad87c4c1e06fac8c67d5e4cdf5731 Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Wed, 23 Sep 2015 10:23:11 +0200 Subject: [PATCH 1848/2207] Fix dead urls because of username change. --- plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 3181fa017ed..a1ac91bcfc9 100644 --- a/plugins.md +++ b/plugins.md @@ -410,11 +410,11 @@ The following plugins change the way that tile layers are loaded into the map. From d52707a007762d5b2cd3b04d27304165abb674c8 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 24 Sep 2015 17:14:08 +0300 Subject: [PATCH 1849/2207] horrible hack that could fix a tile loading race condition in iOS --- src/map/anim/Map.ZoomAnimation.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 253f221e2f2..615776c61d5 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -100,10 +100,12 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : { L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - this._resetView(this._animateToCenter, this._animateToZoom, true, true); + L.Util.requestAnimFrame(function () { + this._resetView(this._animateToCenter, this._animateToZoom, true, true); - if (L.Draggable) { - L.Draggable._disabled = false; - } + if (L.Draggable) { + L.Draggable._disabled = false; + } + }, this); } }); From bcde047f0991b922ea845d3786d9a887f0b02f7e Mon Sep 17 00:00:00 2001 From: Coen Mulders Date: Fri, 25 Sep 2015 00:19:32 +0200 Subject: [PATCH 1850/2207] Added zoom for the custom scale in L.CRS.Simple Fixes #3867 --- src/geo/crs/CRS.Simple.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/geo/crs/CRS.Simple.js b/src/geo/crs/CRS.Simple.js index 181c5a0fd09..ea89e5a83aa 100644 --- a/src/geo/crs/CRS.Simple.js +++ b/src/geo/crs/CRS.Simple.js @@ -10,6 +10,10 @@ L.CRS.Simple = L.extend({}, L.CRS, { return Math.pow(2, zoom); }, + zoom: function (scale) { + return Math.log(scale) / Math.LN2; + }, + distance: function (latlng1, latlng2) { var dx = latlng2.lng - latlng1.lng, dy = latlng2.lat - latlng1.lat; From 301473ad4d83ec14254464e2f598e9827a904927 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 25 Sep 2015 13:40:21 +0300 Subject: [PATCH 1851/2207] more strict eslinting --- .eslintrc | 46 ++++++++----------------------- package.json | 3 +- spec/.eslintrc | 18 ++++-------- spec/suites/geo/CRSSpec.js | 6 ++-- spec/suites/map/MapSpec.js | 2 +- src/control/Control.Layers.js | 2 +- src/control/Control.Zoom.js | 2 +- src/dom/DomEvent.DoubleTap.js | 2 +- src/dom/DomEvent.js | 2 +- src/dom/DomUtil.js | 5 +++- src/geo/LatLng.js | 2 +- src/geo/LatLngBounds.js | 4 +-- src/geo/crs/CRS.js | 2 +- src/layer/GeoJSON.js | 2 +- src/layer/ImageOverlay.js | 2 +- src/layer/Layer.js | 4 +-- src/layer/marker/Marker.js | 6 ++-- src/layer/tile/GridLayer.js | 34 +++++++++++------------ src/layer/vector/Canvas.js | 2 +- src/layer/vector/Polyline.js | 4 +-- src/layer/vector/SVG.js | 4 +-- src/map/Map.js | 6 ++-- src/map/anim/Map.ZoomAnimation.js | 4 +-- src/map/ext/Map.Geolocation.js | 2 +- 24 files changed, 69 insertions(+), 97 deletions(-) diff --git a/.eslintrc b/.eslintrc index 4dc01117940..35c4f288715 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,42 +1,18 @@ { - "rules": { - "eqeqeq": 2, - "consistent-return": 2, - "no-loop-func": 2, - "no-use-before-define": [2, "nofunc"], - "no-lonely-if": 2, - "no-else-return": 2, - "no-new": 2, - "no-throw-literal": 2, - "no-self-compare": 2, - "no-void": 2, - "no-eq-null": 2, - - "quotes": [2, "single"], - "camelcase": 2, - "comma-style": 2, - "comma-spacing": 2, - "new-cap": 2, - "no-empty": 2, - "brace-style": [2, "1tbs", {"allowSingleLine": true}], - "space-in-parens": 2, - "space-before-blocks": 2, - "space-after-keywords": 2, - "space-infix-ops": 2, - "space-unary-ops": 2, - "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}], - "array-bracket-spacing": 2, - "no-mixed-spaces-and-tabs": [2, "smart-tabs"], - - "no-constant-condition": 0 - }, "globals": { "L": true, - "module": false, - "define": false }, "env": { - "browser": true + "commonjs": true, + "amd": true, + "node": false }, - "extends": "eslint:recommended" + "extends": "mourner", + "rules": { + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "indent": [2, "tab", {"VariableDeclarator": 0}], + "strict": 0, + "wrap-iife": 0, + "key-spacing": 0 + } } diff --git a/package.json b/package.json index 839124a1d7b..fe03a47a9a6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.2.1", - "eslint": "^1.3.1", + "eslint": "^1.5.1", + "eslint-config-mourner": "^1.0.0", "happen": "~0.2.0", "jake": "~8.0.12", "karma": "~0.13.9", diff --git a/spec/.eslintrc b/spec/.eslintrc index ff48b0da137..a11c9278c04 100644 --- a/spec/.eslintrc +++ b/spec/.eslintrc @@ -4,21 +4,15 @@ "quotes": 0, "no-shadow": 0, "no-irregular-whitespace": 0, - "no-console": 0 + "no-console": 0, + "indent": 0 + }, + "env": { + "mocha": true }, "globals": { - "L": true, - "module": false, - "define": false, "expect": false, - "it": false, - "describe": false, "sinon": false, - "happen": false, - "beforeEach": false, - "afterEach": false - }, - "env": { - "browser": true + "happen": false } } diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js index 32b18289f7c..837e936f6c7 100644 --- a/spec/suites/geo/CRSSpec.js +++ b/spec/suites/geo/CRSSpec.js @@ -160,7 +160,7 @@ describe("CRS.Simple", function () { describe("CRS", function () { var crs = L.CRS; - + describe("#zoom && #scale", function () { it("convert zoom to scale and viceversa and return the same values", function () { var zoom = 2.5; @@ -188,7 +188,7 @@ describe("CRS.ZoomNotPowerOfTwo", function () { expect(crs.zoom(1.5 * scale)).to.eql(zoom + 1); }); }); - + describe("#zoom && #scale", function () { it("convert zoom to scale and viceversa and return the same values", function () { var zoom = 2; @@ -196,4 +196,4 @@ describe("CRS.ZoomNotPowerOfTwo", function () { expect(crs.zoom(scale)).to.eql(zoom); }); }); -}); \ No newline at end of file +}); diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index d0302ce870c..6482c25a4c0 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -746,7 +746,7 @@ describe("Map", function () { }); }); - + describe('#getScaleZoom && #getZoomScale', function () { it("convert zoom to scale and viceversa and return the same values", function () { var toZoom = 6.25; diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index 88556c2b16a..b107c51b9da 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -262,7 +262,7 @@ L.Control.Layers = L.Control.extend({ L.DomUtil.addClass(this._form, 'leaflet-control-layers-scrollbar'); this._form.style.height = acceptableHeight + 'px'; } else { - L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar'); + L.DomUtil.removeClass(this._form, 'leaflet-control-layers-scrollbar'); } this._checkDisabledLayers(); }, diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 978d25790b1..629f81dbcc6 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -72,7 +72,7 @@ L.Control.Zoom = L.Control.extend({ _updateDisabled: function () { var map = this._map, - className = 'leaflet-disabled'; + className = 'leaflet-disabled'; L.DomUtil.removeClass(this._zoomInButton, className); L.DomUtil.removeClass(this._zoomOutButton, className); diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index dcc6696923b..d3ec09ecb79 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -37,7 +37,7 @@ L.extend(L.DomEvent, { if (L.Browser.pointer) { // work around .type being readonly with MSPointer* events var newTouch = {}, - prop, i; + prop, i; for (i in touch) { prop = touch[i]; diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index 2a87a5e6d32..c23d2757ea5 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -230,7 +230,7 @@ L.DomEvent = { // this is a horrible workaround for a bug in Android where a single touch triggers two click events _filterClick: function (e, handler) { var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), - elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); + elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); // are they closer together than 500ms yet more than 100ms? // Android typically triggers them ~300ms apart while multiple listeners diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index 607af9f08f3..19896602a67 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -143,7 +143,10 @@ L.DomUtil = { var pos = offset || new L.Point(0, 0); el.style[L.DomUtil.TRANSFORM] = - (L.Browser.ie3d ? 'translate(' + pos.x + 'px,' + pos.y + 'px' + ')' : 'translate3d(' + pos.x + 'px,' + pos.y + 'px' + ',0)') + (scale ? ' scale(' + scale + ')' : ''); + (L.Browser.ie3d ? + 'translate(' + pos.x + 'px,' + pos.y + 'px)' : + 'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') + + (scale ? ' scale(' + scale + ')' : ''); }, setPosition: function (el, point) { // (HTMLElement, Point[, Boolean]) diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js index 83a44568cc1..8bfdf256349 100644 --- a/src/geo/LatLng.js +++ b/src/geo/LatLng.js @@ -44,7 +44,7 @@ L.LatLng.prototype = { toBounds: function (sizeInMeters) { var latAccuracy = 180 * sizeInMeters / 40075017, - lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); return L.latLngBounds( [this.lat - latAccuracy, this.lng - lngAccuracy], diff --git a/src/geo/LatLngBounds.js b/src/geo/LatLngBounds.js index af046d01b50..8b52c843fe7 100644 --- a/src/geo/LatLngBounds.js +++ b/src/geo/LatLngBounds.js @@ -17,8 +17,8 @@ L.LatLngBounds.prototype = { // extend the bounds to contain the given point or bounds extend: function (obj) { // (LatLng) or (LatLngBounds) var sw = this._southWest, - ne = this._northEast, - sw2, ne2; + ne = this._northEast, + sw2, ne2; if (obj instanceof L.LatLng) { sw2 = obj; diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js index 4a00f0491b4..a82e8f056a3 100644 --- a/src/geo/crs/CRS.js +++ b/src/geo/crs/CRS.js @@ -33,7 +33,7 @@ L.CRS = { scale: function (zoom) { return 256 * Math.pow(2, zoom); }, - + zoom: function (scale) { return Math.log(scale / 256) / Math.LN2; }, diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index cbee4d395e6..3951338a7df 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -250,7 +250,7 @@ L.LayerGroup.include({ } var isGeometryCollection = type === 'GeometryCollection', - jsons = []; + jsons = []; this.eachLayer(function (layer) { if (layer.toGeoJSON) { diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js index 246fd9431bd..09984df9e0e 100644 --- a/src/layer/ImageOverlay.js +++ b/src/layer/ImageOverlay.js @@ -138,7 +138,7 @@ L.ImageOverlay = L.Layer.extend({ _animateZoom: function (e) { var scale = this._map.getZoomScale(e.zoom), - offset = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center); + offset = this._map._latLngToNewLayerPoint(this._bounds.getNorthWest(), e.zoom, e.center); L.DomUtil.setTransform(this._image, offset, scale); }, diff --git a/src/layer/Layer.js b/src/layer/Layer.js index 5bdcea6ca65..a1c2a5270a3 100644 --- a/src/layer/Layer.js +++ b/src/layer/Layer.js @@ -144,8 +144,8 @@ L.Map.include({ _updateZoomLevels: function () { var minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); for (var i in this._zoomBoundLayers) { var options = this._zoomBoundLayers[i].options; diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index c758ba2d821..836c36be4e2 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -106,7 +106,7 @@ L.Marker = L.Layer.extend({ classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); var icon = options.icon.createIcon(this._icon), - addIcon = false; + addIcon = false; // if we're not reusing the icon, remove the old one and init new one if (icon !== this._icon) { @@ -139,7 +139,7 @@ L.Marker = L.Layer.extend({ } var newShadow = options.icon.createShadow(this._shadow), - addShadow = false; + addShadow = false; if (newShadow !== this._shadow) { this._removeShadow(); @@ -170,7 +170,7 @@ L.Marker = L.Layer.extend({ if (this.options.riseOnHover) { this.off({ mouseover: this._bringToFront, - mouseout: this._resetZIndex + mouseout: this._resetZIndex }); } diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index bba4ca7aedc..4ec44cbc5ff 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -165,8 +165,8 @@ L.GridLayer = L.Layer.extend({ L.DomUtil.setOpacity(this._container, this.options.opacity); var now = +new Date(), - nextFrame = false, - willPrune = false; + nextFrame = false, + willPrune = false; for (var key in this._tiles) { var tile = this._tiles[key]; @@ -207,7 +207,7 @@ L.GridLayer = L.Layer.extend({ _updateLevels: function () { var zoom = this._tileZoom, - maxZoom = this.options.maxZoom; + maxZoom = this.options.maxZoom; for (var z in this._levels) { if (this._levels[z].el.children.length || z === zoom) { @@ -289,11 +289,11 @@ L.GridLayer = L.Layer.extend({ _retainParent: function (x, y, z, minZoom) { var x2 = Math.floor(x / 2), - y2 = Math.floor(y / 2), - z2 = z - 1; + y2 = Math.floor(y / 2), + z2 = z - 1; var key = x2 + ':' + y2 + ':' + z2, - tile = this._tiles[key]; + tile = this._tiles[key]; if (tile && tile.active) { tile.retain = true; @@ -316,7 +316,7 @@ L.GridLayer = L.Layer.extend({ for (var j = 2 * y; j < 2 * y + 2; j++) { var key = i + ':' + j + ':' + (z + 1), - tile = this._tiles[key]; + tile = this._tiles[key]; if (tile && tile.active) { tile.retain = true; @@ -424,11 +424,10 @@ L.GridLayer = L.Layer.extend({ }, _getTiledPixelBounds: function (center, zoom, tileZoom) { - var map = this._map; - - var scale = map.getZoomScale(zoom, tileZoom), - pixelCenter = map.project(center, tileZoom).floor(), - halfSize = map.getSize().divideBy(scale * 2); + var map = this._map, + scale = map.getZoomScale(zoom, tileZoom), + pixelCenter = map.project(center, tileZoom).floor(), + halfSize = map.getSize().divideBy(scale * 2); return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); }, @@ -442,11 +441,10 @@ L.GridLayer = L.Layer.extend({ if (center === undefined) { center = map.getCenter(); } if (this._tileZoom === undefined) { return; } // if out of minzoom/maxzoom - var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom); - - var tileRange = this._pxBoundsToTileRange(pixelBounds), - tileCenter = tileRange.getCenter(), - queue = []; + var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom), + tileRange = this._pxBoundsToTileRange(pixelBounds), + tileCenter = tileRange.getCenter(), + queue = []; for (var key in this._tiles) { this._tiles[key].current = false; @@ -540,7 +538,7 @@ L.GridLayer = L.Layer.extend({ // converts tile cache key to coordinates _keyToTileCoords: function (key) { var k = key.split(':'), - coords = new L.Point(+k[0], +k[1]); + coords = new L.Point(+k[0], +k[1]); coords.z = +k[2]; return coords; }, diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index bfce28e7aaa..ec080d280d9 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -82,7 +82,7 @@ L.Canvas = L.Renderer.extend({ var padding = (layer.options.weight || 0) + 1; this._redrawBounds = this._redrawBounds || new L.Bounds(); - this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding])) + this._redrawBounds.extend(layer._pxBounds.min.subtract([padding, padding])); this._redrawBounds.extend(layer._pxBounds.max.add([padding, padding])); this._redrawRequest = this._redrawRequest || L.Util.requestAnimFrame(this._redraw, this); diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 7a0e387a48b..14afad2feb0 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -134,7 +134,7 @@ L.Polyline = L.Path.extend({ // project bounds as well to use later for Canvas hit detection/etc. var w = this._clickTolerance(), - p = new L.Point(w, -w); + p = new L.Point(w, -w); if (this._bounds.isValid()) { this._pxBounds = new L.Bounds( @@ -203,7 +203,7 @@ L.Polyline = L.Path.extend({ // simplify each clipped part of the polyline for performance _simplifyPoints: function () { var parts = this._parts, - tolerance = this.options.smoothFactor; + tolerance = this.options.smoothFactor; for (var i = 0, len = parts.length; i < len; i++) { parts[i] = L.LineUtil.simplify(parts[i], tolerance); diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index 0d69e551f28..eea40c78c60 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -68,7 +68,7 @@ L.SVG = L.Renderer.extend({ _updateStyle: function (layer) { var path = layer._path, - options = layer.options; + options = layer.options; if (!path) { return; } @@ -147,7 +147,7 @@ L.extend(L.SVG, { // generates SVG path string for multiple rings, with each ring turning into "M..L..L.." instructions pointsToPath: function (rings, closed) { var str = '', - i, j, len, len2, points, p; + i, j, len, len2, points, p; for (i = 0, len = rings.length; i < len; i++) { points = rings[i]; diff --git a/src/map/Map.js b/src/map/Map.js index 5139f0c7702..a578d8c1ebb 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -177,7 +177,7 @@ L.Map = L.Evented.extend({ panInsideBounds: function (bounds, options) { var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); + newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); if (center.equals(newCenter)) { return this; } @@ -709,8 +709,8 @@ L.Map = L.Evented.extend({ for (var i = 0; i < targets.length; i++) { targets[i].fire(type, data, true); - if (data.originalEvent._stopped - || (targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; } + if (data.originalEvent._stopped || + (targets[i].options.nonBubblingEvents && L.Util.indexOf(targets[i].options.nonBubblingEvents, type) !== -1)) { return; } } }, diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index b9285d0d960..8724658daac 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -35,7 +35,7 @@ L.Map.include(!zoomAnimated ? {} : { this.on('zoomanim', function (e) { var prop = L.DomUtil.TRANSFORM, - transform = proxy.style[prop]; + transform = proxy.style[prop]; L.DomUtil.setTransform(proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); @@ -47,7 +47,7 @@ L.Map.include(!zoomAnimated ? {} : { this.on('load moveend', function () { var c = this.getCenter(), - z = this.getZoom(); + z = this.getZoom(); L.DomUtil.setTransform(proxy, this.project(c, z), this.getZoomScale(z, 1)); }, this); }, diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index c1fcf98a200..02a604209bd 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -25,7 +25,7 @@ L.Map.include({ } var onResponse = L.bind(this._handleGeolocationResponse, this), - onError = L.bind(this._handleGeolocationError, this); + onError = L.bind(this._handleGeolocationError, this); if (options.watch) { this._locationWatchId = From cfdbd10431fa903783258c7b223ecdbedad96c69 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 25 Sep 2015 13:55:37 +0300 Subject: [PATCH 1852/2207] enforce indentation in specs --- spec/.eslintrc | 3 +- spec/suites/SpecHelper.js | 16 ++--- spec/suites/control/Control.LayersSpec.js | 16 ++--- spec/suites/core/ClassSpec.js | 8 +-- spec/suites/core/EventsSpec.js | 86 +++++++++++------------ spec/suites/core/UtilSpec.js | 20 +++--- spec/suites/dom/DomEventSpec.js | 6 +- spec/suites/geometry/PointSpec.js | 8 +-- spec/suites/layer/FeatureGroupSpec.js | 2 +- spec/suites/layer/GeoJSONSpec.js | 4 +- spec/suites/layer/LayerGroupSpec.js | 12 ++-- spec/suites/layer/PopupSpec.js | 9 +-- spec/suites/layer/marker/MarkerSpec.js | 8 +-- spec/suites/layer/tile/GridLayerSpec.js | 6 +- spec/suites/layer/vector/PolygonSpec.js | 20 ++---- spec/suites/map/MapSpec.js | 44 ++++++------ spec/suites/map/handler/Map.DragSpec.js | 30 ++++---- 17 files changed, 145 insertions(+), 153 deletions(-) diff --git a/spec/.eslintrc b/spec/.eslintrc index a11c9278c04..97bd9a1cb2e 100644 --- a/spec/.eslintrc +++ b/spec/.eslintrc @@ -4,8 +4,7 @@ "quotes": 0, "no-shadow": 0, "no-irregular-whitespace": 0, - "no-console": 0, - "indent": 0 + "no-console": 0 }, "env": { "mocha": true diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 13f736a4772..4c2c484bffc 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -43,14 +43,14 @@ expect.Assertion.prototype.nearLatLng = function (expected, delta) { happen.at = function (what, x, y, props) { this.once(document.elementFromPoint(x, y), L.Util.extend({ - type: what, - clientX: x, - clientY: y, - screenX: x, - screenY: y, - which: 1, - button: 0 - }, props || {})); + type: what, + clientX: x, + clientY: y, + screenX: x, + screenY: y, + which: 1, + button: 0 + }, props || {})); }; happen.drag = function (fromX, fromY, toX, toY, then, duration) { happen.at('mousemove', fromX, fromY); diff --git a/spec/suites/control/Control.LayersSpec.js b/spec/suites/control/Control.LayersSpec.js index f8268a816ce..04d745cc515 100644 --- a/spec/suites/control/Control.LayersSpec.js +++ b/spec/suites/control/Control.LayersSpec.js @@ -12,8 +12,8 @@ describe("Control.Layers", function () { it("is fired on input that changes the base layer", function () { var baseLayers = {"Layer 1": L.tileLayer(''), "Layer 2": L.tileLayer('')}, - layers = L.control.layers(baseLayers).addTo(map), - spy = sinon.spy(); + layers = L.control.layers(baseLayers).addTo(map), + spy = sinon.spy(); map.on('baselayerchange', spy); happen.click(layers._baseLayersList.getElementsByTagName("input")[0]); @@ -28,8 +28,8 @@ describe("Control.Layers", function () { it("is not fired on input that doesn't change the base layer", function () { var overlays = {"Marker 1": L.marker([0, 0]), "Marker 2": L.marker([0, 0])}, - layers = L.control.layers({}, overlays).addTo(map), - spy = sinon.spy(); + layers = L.control.layers({}, overlays).addTo(map), + spy = sinon.spy(); map.on('baselayerchange', spy); happen.click(layers._overlaysList.getElementsByTagName("input")[0]); @@ -45,8 +45,8 @@ describe("Control.Layers", function () { it("when an included layer is addded or removed", function () { var baseLayer = L.tileLayer(), - overlay = L.marker([0, 0]), - layers = L.control.layers({"Base": baseLayer}, {"Overlay": overlay}).addTo(map); + overlay = L.marker([0, 0]), + layers = L.control.layers({"Base": baseLayer}, {"Overlay": overlay}).addTo(map); var spy = sinon.spy(layers, '_update'); @@ -59,8 +59,8 @@ describe("Control.Layers", function () { it("not when a non-included layer is added or removed", function () { var baseLayer = L.tileLayer(), - overlay = L.marker([0, 0]), - layers = L.control.layers({"Base": baseLayer}).addTo(map); + overlay = L.marker([0, 0]), + layers = L.control.layers({"Base": baseLayer}).addTo(map); var spy = sinon.spy(layers, '_update'); diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js index 0d8cf81ea80..aa57297edd3 100644 --- a/spec/suites/core/ClassSpec.js +++ b/spec/suites/core/ClassSpec.js @@ -2,8 +2,8 @@ describe("Class", function () { describe("#extend", function () { var Klass, - constructor, - method; + constructor, + method; beforeEach(function () { constructor = sinon.spy(); @@ -131,7 +131,7 @@ describe("Class", function () { it("inherits constructor hooks", function () { var spy1 = sinon.spy(), - spy2 = sinon.spy(); + spy2 = sinon.spy(); var Klass2 = Klass.extend({}); @@ -146,7 +146,7 @@ describe("Class", function () { it("does not call child constructor hooks", function () { var spy1 = sinon.spy(), - spy2 = sinon.spy(); + spy2 = sinon.spy(); var Klass2 = Klass.extend({}); diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js index 2860ae534a3..819cb214d89 100644 --- a/spec/suites/core/EventsSpec.js +++ b/spec/suites/core/EventsSpec.js @@ -4,12 +4,12 @@ describe('Events', function () { it('fires all listeners added through #addEventListener', function () { var obj = new L.Evented(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(), - spy4 = sinon.spy(), - spy5 = sinon.spy(), - spy6 = sinon.spy(); + spy1 = sinon.spy(), + spy2 = sinon.spy(), + spy3 = sinon.spy(), + spy4 = sinon.spy(), + spy5 = sinon.spy(), + spy6 = sinon.spy(); obj.addEventListener('test', spy1); obj.addEventListener('test', spy2); @@ -37,10 +37,10 @@ describe('Events', function () { it('provides event object to listeners and executes them in the right context', function () { var obj = new L.Evented(), - obj2 = new L.Evented(), - obj3 = new L.Evented(), - obj4 = new L.Evented(), - foo = {}; + obj2 = new L.Evented(), + obj3 = new L.Evented(), + obj4 = new L.Evented(), + foo = {}; function listener1(e) { expect(e.type).to.eql('test'); @@ -83,11 +83,11 @@ describe('Events', function () { it('calls no listeners removed through #removeEventListener', function () { var obj = new L.Evented(), - spy = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(), - spy4 = sinon.spy(), - spy5 = sinon.spy(); + spy = sinon.spy(), + spy2 = sinon.spy(), + spy3 = sinon.spy(), + spy4 = sinon.spy(), + spy5 = sinon.spy(); obj.addEventListener('test', spy); obj.removeEventListener('test', spy); @@ -130,9 +130,9 @@ describe('Events', function () { // added due to context-sensitive removeListener optimization it('fires multiple listeners with the same context with id', function () { var obj = new L.Evented(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - foo = {}; + spy1 = sinon.spy(), + spy2 = sinon.spy(), + foo = {}; L.Util.stamp(foo); @@ -147,9 +147,9 @@ describe('Events', function () { it('removes listeners with stamped contexts', function () { var obj = new L.Evented(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - foo = {}; + spy1 = sinon.spy(), + spy2 = sinon.spy(), + foo = {}; L.Util.stamp(foo); @@ -166,9 +166,9 @@ describe('Events', function () { it('removes listeners with a stamp originally added without one', function () { var obj = new L.Evented(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - foo = {}; + spy1 = sinon.spy(), + spy2 = sinon.spy(), + foo = {}; obj.addEventListener('test', spy1, foo); L.Util.stamp(foo); @@ -185,10 +185,10 @@ describe('Events', function () { it('removes listeners with context == this and a stamp originally added without one', function () { var obj = new L.Evented(), - obj2 = new L.Evented(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(); + obj2 = new L.Evented(), + spy1 = sinon.spy(), + spy2 = sinon.spy(), + spy3 = sinon.spy(); obj.addEventListener('test', spy1, obj); L.Util.stamp(obj); @@ -265,7 +265,7 @@ describe('Events', function () { it('works like #addEventListener && #removeEventListener', function () { var obj = new L.Evented(), - spy = sinon.spy(); + spy = sinon.spy(); obj.on('test', spy); obj.fire('test'); @@ -280,8 +280,8 @@ describe('Events', function () { it('does not override existing methods with the same name', function () { var spy1 = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(); + spy2 = sinon.spy(), + spy3 = sinon.spy(); var Klass = L.Evented.extend({ on: spy1, @@ -305,8 +305,8 @@ describe('Events', function () { describe("#clearEventListeners", function () { it("clears all registered listeners on an object", function () { var spy = sinon.spy(), - obj = new L.Evented(), - otherObj = new L.Evented(); + obj = new L.Evented(), + otherObj = new L.Evented(); obj.on('test', spy, obj); obj.on('testTwo', spy); @@ -322,7 +322,7 @@ describe('Events', function () { describe('#once', function () { it('removes event listeners after first trigger', function () { var obj = new L.Evented(), - spy = sinon.spy(); + spy = sinon.spy(); obj.once('test', spy, obj); obj.fire('test'); @@ -336,8 +336,8 @@ describe('Events', function () { it('works with an object hash', function () { var obj = new L.Evented(), - spy = sinon.spy(), - otherSpy = sinon.spy(); + spy = sinon.spy(), + otherSpy = sinon.spy(); obj.once({ 'test': spy, @@ -359,7 +359,7 @@ describe('Events', function () { it("doesn't call listeners to events that have been removed", function () { var obj = new L.Evented(), - spy = sinon.spy(); + spy = sinon.spy(); obj.once('test', spy, obj); obj.off('test', spy, obj); @@ -371,8 +371,8 @@ describe('Events', function () { it('works if called from a context that doesnt implement #Events', function () { var obj = new L.Evented(), - spy = sinon.spy(), - foo = {}; + spy = sinon.spy(), + foo = {}; obj.once('test', spy, foo); @@ -385,10 +385,10 @@ describe('Events', function () { describe('addEventParent && removeEventParent', function () { it('makes the object propagate events with to the given one if fired with propagate=true', function () { var obj = new L.Evented(), - parent1 = new L.Evented(), - parent2 = new L.Evented(), - spy1 = sinon.spy(), - spy2 = sinon.spy(); + parent1 = new L.Evented(), + parent2 = new L.Evented(), + spy1 = sinon.spy(), + spy2 = sinon.spy(); parent1.on('test', spy1); parent2.on('test', spy2); diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index ddd2e82df4d..2554b99bf96 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -47,10 +47,10 @@ describe('Util', function () { it('passes additional arguments to the bound function', function () { var fn = sinon.spy(), - foo = {}, - a = {}, - b = {}, - c = {}; + foo = {}, + a = {}, + b = {}, + c = {}; var fn2 = L.Util.bind(fn, foo, a, b); @@ -63,13 +63,13 @@ describe('Util', function () { describe('#stamp', function () { it('sets a unique id on the given object and returns it', function () { var a = {}, - id = L.Util.stamp(a); + id = L.Util.stamp(a); expect(typeof id).to.eql('number'); expect(L.Util.stamp(a)).to.eql(id); var b = {}, - id2 = L.Util.stamp(b); + id2 = L.Util.stamp(b); expect(id2).not.to.eql(id); }); @@ -120,7 +120,7 @@ describe('Util', function () { describe('#requestAnimFrame', function () { it('calles a function on next frame, unless canceled', function (done) { var spy = sinon.spy(), - foo = {}; + foo = {}; L.Util.requestAnimFrame(spy); @@ -179,21 +179,21 @@ describe('Util', function () { it('creates a distinct options object', function () { var opts = {}, - o = L.Util.create({options: opts}); + o = L.Util.create({options: opts}); L.Util.setOptions(o, {}); expect(o.options).not.to.equal(opts); }); it("doesn't create a distinct options object if object already has own options", function () { var opts = {}, - o = {options: opts}; + o = {options: opts}; L.Util.setOptions(o, {}); expect(o.options).to.equal(opts); }); it('inherits options prototypally', function () { var opts = {}, - o = L.Util.create({options: opts}); + o = L.Util.create({options: opts}); L.Util.setOptions(o, {}); opts.foo = 'bar'; expect(o.options.foo).to.eql('bar'); diff --git a/spec/suites/dom/DomEventSpec.js b/spec/suites/dom/DomEventSpec.js index 97d586fe861..033dd8e76b8 100644 --- a/spec/suites/dom/DomEventSpec.js +++ b/spec/suites/dom/DomEventSpec.js @@ -26,7 +26,7 @@ describe('DomEvent', function () { describe('#addListener', function () { it('adds a listener and calls it on event', function () { var listener1 = sinon.spy(), - listener2 = sinon.spy(); + listener2 = sinon.spy(); L.DomEvent.addListener(el, 'click', listener1); L.DomEvent.addListener(el, 'click', listener2); @@ -39,7 +39,7 @@ describe('DomEvent', function () { it('binds "this" to the given context', function () { var obj = {foo: 'bar'}, - result; + result; L.DomEvent.addListener(el, 'click', function () { result = this; @@ -78,7 +78,7 @@ describe('DomEvent', function () { describe('#stopPropagation', function () { it('stops propagation of the given event', function () { var child = document.createElement('div'), - listener = sinon.spy(); + listener = sinon.spy(); el.appendChild(child); diff --git a/spec/suites/geometry/PointSpec.js b/spec/suites/geometry/PointSpec.js index f11180b1648..3a737f48cf2 100644 --- a/spec/suites/geometry/PointSpec.js +++ b/spec/suites/geometry/PointSpec.js @@ -18,7 +18,7 @@ describe("Point", function () { describe('#subtract', function () { it('subtracts the given point from this one', function () { var a = new L.Point(50, 30), - b = new L.Point(20, 10); + b = new L.Point(20, 10); expect(a.subtract(b)).to.eql(new L.Point(30, 20)); }); }); @@ -69,9 +69,9 @@ describe("Point", function () { describe('#contains', function () { it('returns true if the point is bigger in absolute dimensions than the passed one', function () { var p1 = new L.Point(50, 30), - p2 = new L.Point(-40, 20), - p3 = new L.Point(60, -20), - p4 = new L.Point(-40, -40); + p2 = new L.Point(-40, 20), + p3 = new L.Point(60, -20), + p4 = new L.Point(-40, -40); expect(p1.contains(p2)).to.be(true); expect(p1.contains(p3)).to.be(false); diff --git a/spec/suites/layer/FeatureGroupSpec.js b/spec/suites/layer/FeatureGroupSpec.js index 3c3af853b95..6ebdd51b029 100644 --- a/spec/suites/layer/FeatureGroupSpec.js +++ b/spec/suites/layer/FeatureGroupSpec.js @@ -18,7 +18,7 @@ fg2.addLayer(marker); var wasClicked1, - wasClicked2; + wasClicked2; fg2.on('click', function (e) { expect(e.layer).to.be(marker); diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 78b69e200a2..7544db9f173 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -247,8 +247,8 @@ describe("L.LayerGroup#toGeoJSON", function () { it("returns a 3D FeatureCollection object", function () { var marker = new L.Marker([10, 20, 30]), - polyline = new L.Polyline([[10, 20, 30], [2, 5, 10]]), - layerGroup = new L.LayerGroup([marker, polyline]); + polyline = new L.Polyline([[10, 20, 30], [2, 5, 10]]), + layerGroup = new L.LayerGroup([marker, polyline]); expect(layerGroup.toGeoJSON()).to.eql({ type: 'FeatureCollection', features: [marker.toGeoJSON(), polyline.toGeoJSON()] diff --git a/spec/suites/layer/LayerGroupSpec.js b/spec/suites/layer/LayerGroupSpec.js index d157fafc9d8..2c2335586d0 100644 --- a/spec/suites/layer/LayerGroupSpec.js +++ b/spec/suites/layer/LayerGroupSpec.js @@ -11,7 +11,7 @@ describe("#addLayer", function () { it('adds a layer', function () { var lg = L.layerGroup(), - marker = L.marker([0, 0]); + marker = L.marker([0, 0]); expect(lg.addLayer(marker)).to.eql(lg); @@ -22,7 +22,7 @@ describe("#removeLayer", function () { it('removes a layer', function () { var lg = L.layerGroup(), - marker = L.marker([0, 0]); + marker = L.marker([0, 0]); lg.addLayer(marker); expect(lg.removeLayer(marker)).to.eql(lg); @@ -34,7 +34,7 @@ describe("#clearLayers", function () { it('removes all layers', function () { var lg = L.layerGroup(), - marker = L.marker([0, 0]); + marker = L.marker([0, 0]); lg.addLayer(marker); expect(lg.clearLayers()).to.eql(lg); @@ -46,7 +46,7 @@ describe("#getLayers", function () { it('gets all layers', function () { var lg = L.layerGroup(), - marker = L.marker([0, 0]); + marker = L.marker([0, 0]); lg.addLayer(marker); @@ -57,8 +57,8 @@ describe("#eachLayer", function () { it('iterates over all layers', function () { var lg = L.layerGroup(), - marker = L.marker([0, 0]), - ctx = {foo: 'bar'}; + marker = L.marker([0, 0]), + ctx = {foo: 'bar'}; lg.addLayer(marker); diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index 0cd3f7823d0..b3688c6140c 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -200,10 +200,11 @@ describe('Popup', function () { L.Icon.Default.prototype.options.popupAnchor = [0, 0]; var latlng = new L.LatLng(55.8, 37.6), - offset = new L.Point(20, 30), - icon = new L.DivIcon({popupAnchor: offset}), - marker1 = new L.Marker(latlng), - marker2 = new L.Marker(latlng, {icon: icon}); + offset = new L.Point(20, 30), + icon = new L.DivIcon({popupAnchor: offset}), + marker1 = new L.Marker(latlng), + marker2 = new L.Marker(latlng, {icon: icon}); + marker1.bindPopup('Popup').addTo(map); marker1.openPopup(); var defaultLeft = parseInt(marker1._popup._container.style.left, 10); diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js index 245443d912c..d91ad0d57ae 100644 --- a/spec/suites/layer/marker/MarkerSpec.js +++ b/spec/suites/layer/marker/MarkerSpec.js @@ -1,9 +1,9 @@ describe("Marker", function () { var map, - spy, - div, - icon1, - icon2; + spy, + div, + icon1, + icon2; beforeEach(function () { div = document.createElement('div'); diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index de8b1c5fb5b..c67430bd2d3 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -51,7 +51,7 @@ describe('GridLayer', function () { for (var i = 0; i < tiles.length; i++) { var coords = tiles[i].coords, - pos = L.DomUtil.getPosition(tiles[i].tile); + pos = L.DomUtil.getPosition(tiles[i].tile); loaded[pos.x + ':' + pos.y] = [coords.x, coords.y]; } @@ -111,7 +111,7 @@ describe('GridLayer', function () { var layer = L.gridLayer().addTo(map); var onAdd = layer.onAdd, - onAddSpy = sinon.spy(); + onAddSpy = sinon.spy(); layer.onAdd = function () { onAdd.apply(this, arguments); onAddSpy(); @@ -129,7 +129,7 @@ describe('GridLayer', function () { describe("when a tilelayer is added to a map with no other layers", function () { it("has the same zoomlevels as the tilelayer", function () { var maxZoom = 10, - minZoom = 5; + minZoom = 5; map.setView([0, 0], 1); diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js index 016d0b16cdf..ddbbaf6b333 100644 --- a/spec/suites/layer/vector/PolygonSpec.js +++ b/spec/suites/layer/vector/PolygonSpec.js @@ -37,11 +37,8 @@ describe('Polygon', function () { it("can be initialized with holes", function () { var originalLatLngs = [ - [ //external ring - [0, 10], [10, 10], [10, 0] - ], [ //hole - [2, 3], [2, 4], [3, 4] - ] + [[0, 10], [10, 10], [10, 0]], // external ring + [[2, 3], [2, 4], [3, 4]] // hole ]; var polygon = new L.Polygon(originalLatLngs); @@ -116,11 +113,8 @@ describe('Polygon', function () { it("can be set external ring and holes", function () { var latLngs = [ - [ //external ring - [0, 10], [10, 10], [10, 0] - ], [ //hole - [2, 3], [2, 4], [3, 4] - ] + [[0, 10], [10, 10], [10, 0]], // external ring + [[2, 3], [2, 4], [3, 4]] // hole ]; var polygon = new L.Polygon([]); @@ -207,10 +201,8 @@ describe('Polygon', function () { it("should return first latlngs on a multipolygon with hole", function () { var latlngs = [ - [ - [L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], - [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])] - ], + [[L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])], + [L.latLng([2, 3]), L.latLng([2, 4]), L.latLng([3, 4])]], [[L.latLng([10, 20]), L.latLng([30, 40]), L.latLng([50, 60])]] ]; diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 6482c25a4c0..9c5dfb35fca 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -1,6 +1,6 @@ describe("Map", function () { var map, - spy; + spy; beforeEach(function () { map = L.map(document.createElement('div')); }); @@ -9,7 +9,7 @@ describe("Map", function () { it("fires an unload event if loaded", function () { var container = document.createElement('div'), map = new L.Map(container).setView([0, 0], 0), - spy = sinon.spy(); + spy = sinon.spy(); map.on('unload', spy); map.remove(); expect(spy.called).to.be.ok(); @@ -18,7 +18,7 @@ describe("Map", function () { it("fires no unload event if not loaded", function () { var container = document.createElement('div'), map = new L.Map(container), - spy = sinon.spy(); + spy = sinon.spy(); map.on('unload', spy); map.remove(); expect(spy.called).not.to.be.ok(); @@ -27,7 +27,7 @@ describe("Map", function () { describe("corner case checking", function () { it("throws an exception upon reinitialization", function () { var container = document.createElement('div'), - map = new L.Map(container); + map = new L.Map(container); expect(function () { L.map(container); }).to.throwException(function (e) { @@ -56,7 +56,7 @@ describe("Map", function () { it("unbinds events", function () { var container = document.createElement('div'), map = new L.Map(container).setView([0, 0], 1), - spy = sinon.spy(); + spy = sinon.spy(); map.on('click dblclick mousedown mouseup mousemove', spy); map.remove(); @@ -443,7 +443,7 @@ describe("Map", function () { it("fires a zoomlevelschange event", function () { map.whenReady(function () { var spy = sinon.spy(), - tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), + tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 15}).addTo(map); map.on("zoomlevelschange", spy); @@ -480,7 +480,7 @@ describe("Map", function () { it("calls the provided function for each layer", function () { var t1 = L.tileLayer("{z}{x}{y}").addTo(map), t2 = L.tileLayer("{z}{x}{y}").addTo(map), - spy = sinon.spy(); + spy = sinon.spy(); map.eachLayer(spy); @@ -491,7 +491,7 @@ describe("Map", function () { it("calls the provided function with the provided context", function () { var t1 = L.tileLayer("{z}{x}{y}").addTo(map), - spy = sinon.spy(); + spy = sinon.spy(); map.eachLayer(spy, map); @@ -502,7 +502,7 @@ describe("Map", function () { describe("#invalidateSize", function () { var container, origWidth = 100, - clock; + clock; beforeEach(function () { container = map.getContainer(); @@ -604,15 +604,15 @@ describe("Map", function () { it('move to requested center and zoom, and call zoomend once', function (done) { var spy = sinon.spy(), - newCenter = new L.LatLng(10, 11), - newZoom = 12, - callback = function () { - expect(map.getCenter()).to.eql(newCenter); - expect(map.getZoom()).to.eql(newZoom); - spy(); - expect(spy.calledOnce).to.be.ok(); - done(); - }; + newCenter = new L.LatLng(10, 11), + newZoom = 12; + var callback = function () { + expect(map.getCenter()).to.eql(newCenter); + expect(map.getZoom()).to.eql(newZoom); + spy(); + expect(spy.calledOnce).to.be.ok(); + done(); + }; map.setView([0, 0], 0); map.once('zoomend', callback).flyTo(newCenter, newZoom); }); @@ -695,8 +695,8 @@ describe("Map", function () { it("mouseout is only forwared if fired on the original target", function () { var mapSpy = sinon.spy(), - layerSpy = sinon.spy(), - otherSpy = sinon.spy(); + layerSpy = sinon.spy(), + otherSpy = sinon.spy(); var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); var other = new L.Polygon([[10, 20], [30, 40], [50, 60]]).addTo(map); map.on("mouseout", mapSpy); @@ -710,8 +710,8 @@ describe("Map", function () { it("mouseout is not forwared to layers if fired on the map", function () { var mapSpy = sinon.spy(), - layerSpy = sinon.spy(), - otherSpy = sinon.spy(); + layerSpy = sinon.spy(), + otherSpy = sinon.spy(); var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]]).addTo(map); var other = new L.Polygon([[10, 20], [30, 40], [50, 60]]).addTo(map); map.on("mouseout", mapSpy); diff --git a/spec/suites/map/handler/Map.DragSpec.js b/spec/suites/map/handler/Map.DragSpec.js index 189b9192f1f..38f9771996b 100644 --- a/spec/suites/map/handler/Map.DragSpec.js +++ b/spec/suites/map/handler/Map.DragSpec.js @@ -1,33 +1,33 @@ describe("Map.Drag", function () { describe("#addHook", function () { it("calls the map with dragging enabled", function () { - var container = document.createElement('div'), - map = new L.Map(container, { - dragging: true - }); + var container = document.createElement('div'); + var map = new L.Map(container, { + dragging: true + }); expect(map.dragging.enabled()).to.be(true); map.setView([0, 0], 0); expect(map.dragging.enabled()).to.be(true); }); it("calls the map with dragging and worldCopyJump enabled", function () { - var container = document.createElement('div'), - map = new L.Map(container, { - dragging: true, - worldCopyJump: true - }); + var container = document.createElement('div'); + var map = new L.Map(container, { + dragging: true, + worldCopyJump: true + }); expect(map.dragging.enabled()).to.be(true); map.setView([0, 0], 0); expect(map.dragging.enabled()).to.be(true); }); it("calls the map with dragging disabled and worldCopyJump enabled; " + - "enables dragging after setting center and zoom", function () { - var container = document.createElement('div'), - map = new L.Map(container, { - dragging: false, - worldCopyJump: true - }); + "enables dragging after setting center and zoom", function () { + var container = document.createElement('div'); + var map = new L.Map(container, { + dragging: false, + worldCopyJump: true + }); expect(map.dragging.enabled()).to.be(false); map.setView([0, 0], 0); From 8c8d0ac7ee40d73036e119045b284b248dec3e39 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Fri, 25 Sep 2015 15:37:07 +0300 Subject: [PATCH 1853/2207] fix whitespace in comments --- .eslintrc | 2 ++ spec/suites/SpecHelper.js | 3 +-- spec/suites/core/EventsSpec.js | 2 +- spec/suites/core/UtilSpec.js | 2 +- spec/suites/geo/ProjectionSpec.js | 4 ++-- spec/suites/geometry/PolyUtilSpec.js | 4 ++-- src/geo/LatLngBounds.js | 2 +- src/geometry/Bounds.js | 2 +- src/geometry/LineUtil.js | 2 +- src/map/anim/Map.PanAnimation.js | 2 +- src/map/ext/Map.Geolocation.js | 2 +- 11 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.eslintrc b/.eslintrc index 35c4f288715..396e53f74de 100644 --- a/.eslintrc +++ b/.eslintrc @@ -11,6 +11,8 @@ "rules": { "no-mixed-spaces-and-tabs": [2, "smart-tabs"], "indent": [2, "tab", {"VariableDeclarator": 0}], + "curly": 2, + "spaced-comment": 2, "strict": 0, "wrap-iife": 0, "key-spacing": 0 diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 4c2c484bffc..034e629303d 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -1,6 +1,5 @@ if (!Array.prototype.map) { - /*eslint no-extend-native:0*/ - Array.prototype.map = function (fun /*, thisp */) { + Array.prototype.map = function (fun) { "use strict"; if (this === undefined || this === null) { diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js index 819cb214d89..2c25301fe4e 100644 --- a/spec/suites/core/EventsSpec.js +++ b/spec/suites/core/EventsSpec.js @@ -242,7 +242,7 @@ describe('Events', function () { expect(obj.listens('test')).to.be(false); - //Add and remove a listener + // Add and remove a listener obj.addEventListener('test', spy, foo2); obj.removeEventListener('test', spy, foo2); diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js index 2554b99bf96..b4cd24426fc 100644 --- a/spec/suites/core/UtilSpec.js +++ b/spec/suites/core/UtilSpec.js @@ -230,7 +230,7 @@ describe('Util', function () { describe('#isArray', function () { expect(L.Util.isArray([1, 2, 3])).to.be(true); - /*eslint no-array-constructor:0*/ + /* eslint no-array-constructor: 0 */ expect(L.Util.isArray(new Array(1, 2, 3))).to.be(true); expect(L.Util.isArray('blabla')).to.be(false); expect(L.Util.isArray({0: 1, 1: 2})).to.be(false); diff --git a/spec/suites/geo/ProjectionSpec.js b/spec/suites/geo/ProjectionSpec.js index 5e919fed8f4..354608d3fa7 100644 --- a/spec/suites/geo/ProjectionSpec.js +++ b/spec/suites/geo/ProjectionSpec.js @@ -3,7 +3,7 @@ describe("Projection.Mercator", function () { describe("#project", function () { it("projects a center point", function () { - //edge cases + // edge cases expect(p.project(new L.LatLng(0, 0))).near(new L.Point(0, 0)); }); @@ -51,7 +51,7 @@ describe("Projection.SphericalMercator", function () { describe("#project", function () { it("projects a center point", function () { - //edge cases + // edge cases expect(p.project(new L.LatLng(0, 0))).near(new L.Point(0, 0)); }); diff --git a/spec/suites/geometry/PolyUtilSpec.js b/spec/suites/geometry/PolyUtilSpec.js index 6dcf7839c71..d4bc3590797 100644 --- a/spec/suites/geometry/PolyUtilSpec.js +++ b/spec/suites/geometry/PolyUtilSpec.js @@ -10,7 +10,7 @@ describe('PolyUtil', function () { new L.Point(10, 15) ]; - //check clip without rounding + // check clip without rounding var clipped = L.PolyUtil.clipPolygon(points, bounds); for (var i = 0, len = clipped.length; i < len; i++) { @@ -24,7 +24,7 @@ describe('PolyUtil', function () { new L.Point(10, 10) ]); - //check clip with rounding + // check clip with rounding var clippedRounded = L.PolyUtil.clipPolygon(points, bounds, true); for (i = 0, len = clippedRounded.length; i < len; i++) { diff --git a/src/geo/LatLngBounds.js b/src/geo/LatLngBounds.js index 8b52c843fe7..19b30ebb311 100644 --- a/src/geo/LatLngBounds.js +++ b/src/geo/LatLngBounds.js @@ -165,7 +165,7 @@ L.LatLngBounds.prototype = { } }; -//TODO International date line? +// TODO International date line? L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) if (!a || a instanceof L.LatLngBounds) { diff --git a/src/geometry/Bounds.js b/src/geometry/Bounds.js index 07bc5312bd0..884c7bf8eb4 100644 --- a/src/geometry/Bounds.js +++ b/src/geometry/Bounds.js @@ -2,7 +2,7 @@ * L.Bounds represents a rectangular area on the screen in pixel coordinates. */ -L.Bounds = function (a, b) { //(Point, Point) or Point[] +L.Bounds = function (a, b) { // (Point, Point) or Point[] if (!a) { return; } var points = b ? [a, b] : a; diff --git a/src/geometry/LineUtil.js b/src/geometry/LineUtil.js index e3abcffaf65..8c0897c8617 100644 --- a/src/geometry/LineUtil.js +++ b/src/geometry/LineUtil.js @@ -155,7 +155,7 @@ L.LineUtil = { return new L.Point(x, y, round); }, - _getBitCode: function (/*Point*/ p, bounds) { + _getBitCode: function (p, bounds) { var code = 0; if (p.x < bounds.min.x) { // left diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index ca3fcd8bcd3..37fc8b7b97e 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -44,7 +44,7 @@ L.Map.include({ if (!offset.x && !offset.y) { return this.fire('moveend'); } - //If we pan too far then chrome gets issues with tiles + // If we pan too far, Chrome gets issues with tiles // and makes them disappear or appear in the wrong place (slightly offset) #2602 if (options.animate !== true && !this.getSize().contains(offset)) { this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js index 02a604209bd..34834fb2a24 100644 --- a/src/map/ext/Map.Geolocation.js +++ b/src/map/ext/Map.Geolocation.js @@ -12,7 +12,7 @@ L.Map.include({ // enableHighAccuracy: false }, - locate: function (/*Object*/ options) { + locate: function (options) { options = this._locateOptions = L.extend({}, this._defaultLocateOptions, options); From a1d488a9aca944a6467f5fd1becef544f8303771 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 28 Sep 2015 16:28:07 +0200 Subject: [PATCH 1854/2207] Simulate mousemove on touchmove (fix #3825) --- src/map/handler/Map.Tap.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js index bc0b27e6e06..8fac893c663 100644 --- a/src/map/handler/Map.Tap.js +++ b/src/map/handler/Map.Tap.js @@ -90,6 +90,7 @@ L.Map.Tap = L.Handler.extend({ _onMove: function (e) { var first = e.touches[0]; this._newPos = new L.Point(first.clientX, first.clientY); + this._simulateEvent('mousemove', first); }, _simulateEvent: function (type, e) { From 3b7a6951ed45aedab988acbd25118cda7d399fad Mon Sep 17 00:00:00 2001 From: kumy Date: Mon, 28 Sep 2015 21:07:57 +0200 Subject: [PATCH 1855/2207] fix a typo --- PLUGIN-GUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index 742583d0063..82f2c62c366 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -134,7 +134,7 @@ NPM (Node Packaged Modules) is a package manager and code repository for JavaScr NPM has an excellent [developers guide](https://www.npmjs.org/doc/misc/npm-developers.html) to help you through the process. -When you publish your plugin you should add a depenency on `leaflet` to your `package.json` file. This will automatically install Leaflet when your package is installed. +When you publish your plugin you should add a dependency on `leaflet` to your `package.json` file. This will automatically install Leaflet when your package is installed. Here is an example of a `package.json` file for a Leaflet plugin. From f02b26f51c6ecace0401ba3cbac10b0321af2635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 29 Sep 2015 10:56:00 +0200 Subject: [PATCH 1856/2207] Add plugin Leaflet.singleclick (the 1.0.0-compatible version) --- plugins.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index a1ac91bcfc9..7d41bf8bc54 100644 --- a/plugins.md +++ b/plugins.md @@ -2077,12 +2077,23 @@ These plugins extend Leaflet event handling. singleclick + + + +
          PluginDescriptionMaintainer
          - Leaflet.MultiTileLayer + Leaflet.MultiTileLayer Allows to compose a TileLayer from several tile sources. Each source is active only on a defined set of zoomlevels. - Mattias Bengtsson + Mattias Bengtsson
          - Extend Map to fire a singleclick event (example). + Extend L.Map to fire a singleclick event (demo). Compatible with Leaflet 0.7.x only. Guillaume Lathoud
          + singleclick + + Extend L.Evented to fire a singleclick event (demo). Compatible with Leaflet 1.0.0-beta1 and greater only. + + Iván Sánchez Ortega, + MazeMap +
          From 8f189bce239edffdbbd15e3580c545da89fe9fbf Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 30 Sep 2015 12:11:26 +0200 Subject: [PATCH 1857/2207] Add flag not to run panInsideBounds when already panning (fix #3848) --- src/map/Map.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index a578d8c1ebb..83cf9c65416 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -176,12 +176,15 @@ L.Map = L.Evented.extend({ }, panInsideBounds: function (bounds, options) { + this._enforcingBounds = true; var center = this.getCenter(), newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); if (center.equals(newCenter)) { return this; } - return this.panTo(newCenter, options); + this.panTo(newCenter, options); + this._enforcingBounds = false; + return this; }, invalidateSize: function (options) { @@ -587,7 +590,9 @@ L.Map = L.Evented.extend({ }, _panInsideMaxBounds: function () { - this.panInsideBounds(this.options.maxBounds); + if (!this._enforcingBounds) { + this.panInsideBounds(this.options.maxBounds); + } }, _checkIfLoaded: function () { From fe82b17605d6fb45d2fb45d761b58acea6784aec Mon Sep 17 00:00:00 2001 From: Mike O'Toole Date: Thu, 1 Oct 2015 12:58:59 -0700 Subject: [PATCH 1858/2207] Add Leaflet.DoubleRightClickZoom to plugins.md --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 7d41bf8bc54..d29b6d50e45 100644 --- a/plugins.md +++ b/plugins.md @@ -1679,6 +1679,15 @@ Change the way the user can interactively move around the map. Ilya Zverev + + + Leaflet.DoubleRightClickZoom + + Interaction handler enabling zooming out with double right click. + + Mike O'Toole + + From a15e62c8169846ad6e26ae90d6dd1e57a5fc4923 Mon Sep 17 00:00:00 2001 From: Alexey Gusev Date: Fri, 2 Oct 2015 02:07:38 +0300 Subject: [PATCH 1859/2207] add Leaflet.Arc information --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 7d41bf8bc54..2316535f5b8 100644 --- a/plugins.md +++ b/plugins.md @@ -937,6 +937,15 @@ These plugins provide new markers or news ways of converting abstract data into elfalem + + + Leaflet.Arc + + This plugin adds L.Polyline.Arc function which wraps arc.js functionality for creation of Great Cirlce arcs. + + Alexey Gusev + + From bee95a0d3a86cd374cbe1070ed716e2b2b1c1602 Mon Sep 17 00:00:00 2001 From: mattesCZ Date: Mon, 5 Oct 2015 14:24:09 +0200 Subject: [PATCH 1860/2207] Added new plugin - Tiny Leaflet Directive --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 8917206fc98..24fab4dd3eb 100644 --- a/plugins.md +++ b/plugins.md @@ -2731,6 +2731,17 @@ Ease your development integrating Leaflet into a development framework or automa Prateek Saxena + + + Tiny Leaflet Directive + + + Tiny LeafletJS map directive for your AngularJS apps. + + + Martin Tesař + + From d374915f421ec6ec1dfc707e7efdfe4002ed61e8 Mon Sep 17 00:00:00 2001 From: mattesCZ Date: Mon, 5 Oct 2015 14:44:25 +0200 Subject: [PATCH 1861/2207] Moved next to Angular Leaflet directive. --- plugins.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins.md b/plugins.md index 24fab4dd3eb..89eb86ca483 100644 --- a/plugins.md +++ b/plugins.md @@ -2707,6 +2707,17 @@ Ease your development integrating Leaflet into a development framework or automa David Rubert + + + Tiny Leaflet Directive + + + Tiny LeafletJS map directive for your AngularJS apps. + + + Martin Tesař + + <leaflet-map> @@ -2731,17 +2742,6 @@ Ease your development integrating Leaflet into a development framework or automa Prateek Saxena - - - Tiny Leaflet Directive - - - Tiny LeafletJS map directive for your AngularJS apps. - - - Martin Tesař - - From c9532a8d927af989bbd5ee7bc95bda457ff5c932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 6 Oct 2015 10:12:11 +0200 Subject: [PATCH 1862/2207] Workaround for keyboard tabindex in MS Edge, fixes #3772 --- src/map/handler/Map.Keyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 38e39c2cbbe..8116807e5d2 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -30,7 +30,7 @@ L.Map.Keyboard = L.Handler.extend({ var container = this._map._container; // make the container focusable by tabbing - if (container.tabIndex === -1) { + if (container.tabIndex <= 0) { container.tabIndex = '0'; } From a2595bbfe8109dc9cd24a15d28e0e4e6048e2e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 6 Oct 2015 15:35:10 +0200 Subject: [PATCH 1863/2207] L.Renderer shall use center and not topleft as reference, fixes #3769 --- src/layer/vector/Renderer.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 1c0ac5cd64c..7c6d9d862eb 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -47,18 +47,22 @@ L.Renderer = L.Layer.extend({ _animateZoom: function (e) { var scale = this._map.getZoomScale(e.zoom, this._zoom), - offset = this._map._latLngToNewLayerPoint(this._topLeft, e.zoom, e.center); + position = L.DomUtil.getPosition(this._container), + viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding), + currentCenterPoint = this._map.project(this._map.getCenter(), e.zoom), + destCenterPoint = this._map.project(e.center, e.zoom), + centerOffset = destCenterPoint.subtract(currentCenterPoint), - L.DomUtil.setTransform(this._container, offset, scale); + topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset); + + L.DomUtil.setTransform(this._container, topLeftOffset, scale); }, _updateTransform: function () { var zoom = this._map.getZoom(), - center = this._map.getCenter(), - scale = this._map.getZoomScale(zoom, this._zoom), - offset = this._map._latLngToNewLayerPoint(this._topLeft, zoom, center); + scale = this._map.getZoomScale(zoom, this._zoom); - L.DomUtil.setTransform(this._container, offset, scale); + L.DomUtil.setTransform(this._container, this._map._getCenterOffset(this._center), scale); }, _reset: function () { @@ -74,7 +78,7 @@ L.Renderer = L.Layer.extend({ this._bounds = new L.Bounds(min, min.add(size.multiplyBy(1 + p * 2)).round()); - this._topLeft = this._map.layerPointToLatLng(min); + this._center = this._map.getCenter(); this._zoom = this._map.getZoom(); } }); From 4eb39d531255a6deaf3f3c56fb24933d44f5eccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 6 Oct 2015 16:09:33 +0200 Subject: [PATCH 1864/2207] Zoom anim fires 'transitionend' event handler on a timer, see #3689, #2693 Nothing but a port of a hack in stable, see https://github.com/Leaflet/Leaflet/commit/91477588faa44e2b266d86a5a44cb98490244d39 --- src/map/anim/Map.ZoomAnimation.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index 8724658daac..e04ef3750bd 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -104,9 +104,13 @@ L.Map.include(!zoomAnimated ? {} : { zoom: zoom, noUpdate: noUpdate }); + + // Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693 + setTimeout(L.bind(this._onZoomTransitionEnd, this), 250); }, _onZoomTransitionEnd: function () { + if (!this._animatingZoom) { return; } this._animatingZoom = false; From c101b836c7a871a67646f2c6457806e6a3f703dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 6 Oct 2015 16:38:30 +0200 Subject: [PATCH 1865/2207] GridLayers implement the 'noWrap' option (previously in 0.7.x TileLayers) --- src/layer/tile/GridLayer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 4ec44cbc5ff..39cfcf6cbc6 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -19,6 +19,7 @@ L.GridLayer = L.Layer.extend({ minZoom: 0 // maxZoom: + // noWrap: false }, initialize: function (options) { @@ -407,11 +408,11 @@ L.GridLayer = L.Layer.extend({ this._globalTileRange = this._pxBoundsToTileRange(bounds); } - this._wrapX = crs.wrapLng && [ + this._wrapX = crs.wrapLng && !this.options.noWrap && [ Math.floor(map.project([0, crs.wrapLng[0]], tileZoom).x / tileSize.x), Math.ceil(map.project([0, crs.wrapLng[1]], tileZoom).x / tileSize.y) ]; - this._wrapY = crs.wrapLat && [ + this._wrapY = crs.wrapLat && !this.options.noWrap && [ Math.floor(map.project([crs.wrapLat[0], 0], tileZoom).y / tileSize.x), Math.ceil(map.project([crs.wrapLat[1], 0], tileZoom).y / tileSize.y) ]; From 08c779367ff5513cbdd28fc9e99743d929598113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 7 Oct 2015 12:30:20 +0200 Subject: [PATCH 1866/2207] Removing unneeded L.Map._latLngToNewLayerPoint, see #3895 --- src/map/Map.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 83cf9c65416..fee441d6474 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -763,11 +763,6 @@ L.Map = L.Evented.extend({ return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); }, - _latLngToNewLayerPoint: function (latlng, zoom, center) { - var topLeft = this._getNewPixelOrigin(center, zoom); - return this.project(latlng, zoom)._subtract(topLeft); - }, - // layer point of the current center _getCenterLayerPoint: function () { return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); From 03d3bee8b14534c38529c5874a9396da5c0f8512 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 1 Oct 2015 09:20:54 +0200 Subject: [PATCH 1867/2207] Prevent Popup._adjustPan while already panning (fix #3744) --- src/layer/Popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index f0d0456074f..192402343bf 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -248,7 +248,7 @@ L.Popup = L.Layer.extend({ }, _adjustPan: function () { - if (!this.options.autoPan) { return; } + if (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; } var map = this._map, containerHeight = this._container.offsetHeight, From 23e1eafe5bc3f3e6970cc3978390e724edd2a165 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 7 Oct 2015 14:54:56 +0200 Subject: [PATCH 1868/2207] Add z-index to anchors (fix #3746) --- docs/css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/css/main.css b/docs/css/main.css index 63072faa19e..91fc338bf5b 100644 --- a/docs/css/main.css +++ b/docs/css/main.css @@ -806,6 +806,7 @@ tr:target { border-radius: 50%; cursor: pointer; position: absolute; + z-index: 1; } .api-page h2[id]:before { From e15097dc1acc9cb80cab72bdbdb7355c77f1a9d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 7 Oct 2015 16:20:20 +0200 Subject: [PATCH 1869/2207] Hack iOS tile loading race hack-fix from 3e200bed --- src/map/anim/Map.ZoomAnimation.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js index e04ef3750bd..e707eb72cf4 100644 --- a/src/map/anim/Map.ZoomAnimation.js +++ b/src/map/anim/Map.ZoomAnimation.js @@ -112,12 +112,15 @@ L.Map.include(!zoomAnimated ? {} : { _onZoomTransitionEnd: function () { if (!this._animatingZoom) { return; } - this._animatingZoom = false; - L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - this - ._move(this._animateToCenter, this._animateToZoom) - ._moveEnd(true); + // This anim frame should prevent an obscure iOS webkit tile loading race condition. + L.Util.requestAnimFrame(function () { + this._animatingZoom = false; + + this + ._move(this._animateToCenter, this._animateToZoom) + ._moveEnd(true); + }, this); } }); From 0964aa882ddf4e7d176fd6d5b9c962189836255c Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 8 Oct 2015 01:06:41 +0300 Subject: [PATCH 1870/2207] Revert "Removing unneeded L.Map._latLngToNewLayerPoint, see #3895" This reverts commit 08c779367ff5513cbdd28fc9e99743d929598113. --- src/map/Map.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/map/Map.js b/src/map/Map.js index fee441d6474..83cf9c65416 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -763,6 +763,11 @@ L.Map = L.Evented.extend({ return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); }, + _latLngToNewLayerPoint: function (latlng, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return this.project(latlng, zoom)._subtract(topLeft); + }, + // layer point of the current center _getCenterLayerPoint: function () { return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); From 8685e6a10659216cbcbf7f8cbb8e365819c48ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 8 Oct 2015 11:44:38 +0200 Subject: [PATCH 1871/2207] Do not reset a gridlayer during a zoom animation, fixes #3902 --- src/layer/tile/GridLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 39cfcf6cbc6..5668a742e3d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -419,7 +419,7 @@ L.GridLayer = L.Layer.extend({ }, _onMoveEnd: function () { - if (!this._map) { return; } + if (!this._map || this._map._animatingZoom) { return; } this._resetView(); }, From c77ca40ccb33b0344c716d730c9ce499c133ee15 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 8 Oct 2015 12:14:25 +0200 Subject: [PATCH 1872/2207] Use border-box sizing for scale control (fix #3668) Since https://github.com/Leaflet/Leaflet/commit/8a33e94c0e56634a749f378256905e9e23243483 we are not more removing the padding programatically. --- dist/leaflet.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/leaflet.css b/dist/leaflet.css index 346fab996cb..7cb3a32273d 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -384,8 +384,8 @@ font-size: 11px; white-space: nowrap; overflow: hidden; - -moz-box-sizing: content-box; - box-sizing: content-box; + -moz-box-sizing: border-box; + box-sizing: border-box; background: #fff; background: rgba(255, 255, 255, 0.5); From 7c2ac9f39d427de40c2dba1bc6591fd0a902e9d5 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 26 Aug 2015 17:40:53 +0200 Subject: [PATCH 1873/2207] Make sure mouse has an external relatedTarget on mouseout/over (fix #3797 #3708) --- spec/suites/map/MapSpec.js | 53 +++++++++++++++++++++++++++++++++++--- src/dom/DomEvent.js | 4 +-- src/map/Map.js | 32 +++++++++++------------ 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 9c5dfb35fca..1c2c12087f5 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -693,7 +693,7 @@ describe("Map", function () { expect(mapSpy.called).not.to.be.ok(); }); - it("mouseout is only forwared if fired on the original target", function () { + it("mouseout is forwarded if fired on the original target", function () { var mapSpy = sinon.spy(), layerSpy = sinon.spy(), otherSpy = sinon.spy(); @@ -702,13 +702,60 @@ describe("Map", function () { map.on("mouseout", mapSpy); layer.on("mouseout", layerSpy); other.on("mouseout", otherSpy); - happen.mouseout(layer._path); + happen.mouseout(layer._path, {relatedTarget: map._container}); expect(mapSpy.called).not.to.be.ok(); expect(otherSpy.called).not.to.be.ok(); expect(layerSpy.calledOnce).to.be.ok(); }); - it("mouseout is not forwared to layers if fired on the map", function () { + it("mouseout is forwarded when using a DivIcon", function () { + var icon = L.divIcon({ + html: "

          this is text in a child element

          ", + iconSize: [100, 100] + }); + var mapSpy = sinon.spy(), + layerSpy = sinon.spy(), + layer = L.marker([1, 2], {icon: icon}).addTo(map); + map.on("mouseout", mapSpy); + layer.on("mouseout", layerSpy); + happen.mouseout(layer._icon, {relatedTarget: map._container}); + expect(mapSpy.called).not.to.be.ok(); + expect(layerSpy.calledOnce).to.be.ok(); + }); + + it("mouseout is not forwarded if relatedTarget is a target's child", function () { + var icon = L.divIcon({ + html: "

          this is text in a child element

          ", + iconSize: [100, 100] + }); + var mapSpy = sinon.spy(), + layerSpy = sinon.spy(), + layer = L.marker([1, 2], {icon: icon}).addTo(map), + child = layer._icon.querySelector('p'); + map.on("mouseout", mapSpy); + layer.on("mouseout", layerSpy); + happen.mouseout(layer._icon, {relatedTarget: child}); + expect(mapSpy.called).not.to.be.ok(); + expect(layerSpy.calledOnce).not.to.be.ok(); + }); + + it("mouseout is not forwarded if fired on target's child", function () { + var icon = L.divIcon({ + html: "

          this is text in a child element

          ", + iconSize: [100, 100] + }); + var mapSpy = sinon.spy(), + layerSpy = sinon.spy(), + layer = L.marker([1, 2], {icon: icon}).addTo(map), + child = layer._icon.querySelector('p'); + map.on("mouseout", mapSpy); + layer.on("mouseout", layerSpy); + happen.mouseout(child, {relatedTarget: layer._icon}); + expect(mapSpy.called).not.to.be.ok(); + expect(layerSpy.calledOnce).not.to.be.ok(); + }); + + it("mouseout is not forwarded to layers if fired on the map", function () { var mapSpy = sinon.spy(), layerSpy = sinon.spy(), otherSpy = sinon.spy(); diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index c23d2757ea5..b68f503d43a 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -67,7 +67,7 @@ L.DomEvent = { } else if ((type === 'mouseenter') || (type === 'mouseleave')) { handler = function (e) { e = e || window.event; - if (L.DomEvent._checkMouse(obj, e)) { + if (L.DomEvent._isExternalTarget(obj, e)) { originalHandler(e); } }; @@ -211,7 +211,7 @@ L.DomEvent = { }, // check if element really left/entered the event target (for mouseenter/mouseleave) - _checkMouse: function (el, e) { + _isExternalTarget: function (el, e) { var related = e.relatedTarget; diff --git a/src/map/Map.js b/src/map/Map.js index 83cf9c65416..b18ff32aa9d 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -643,19 +643,25 @@ L.Map = L.Evented.extend({ } }, - _findEventTargets: function (src, type, bubble) { - var targets = [], target; + _findEventTargets: function (e, type) { + var targets = [], + target, + isHover = type === 'mouseout' || type === 'mouseover', + src = e.target || e.srcElement; + while (src) { target = this._targets[L.stamp(src)]; if (target && target.listens(type, true)) { + if (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; } targets.push(target); + if (isHover) { break; } } - if (!bubble) { break; } - if (src === this._container) { - break; - } + if (src === this._container) { break; } src = src.parentNode; } + if (!targets.length && !isHover && L.DomEvent._isExternalTarget(src, e)) { + targets = [this]; + } return targets; }, @@ -682,21 +688,15 @@ L.Map = L.Evented.extend({ _fireDOMEvent: function (e, type, targets) { - var isHover = type === 'mouseover' || type === 'mouseout'; - targets = (targets || []).concat(this._findEventTargets(e.target || e.srcElement, type, !isHover)); + targets = (targets || []).concat(this._findEventTargets(e, type)); - if (!targets.length) { - targets = [this]; + if (!targets.length) { return; } - // special case for map mouseover/mouseout events so that they're actually mouseenter/mouseleave - if (isHover && !L.DomEvent._checkMouse(this._container, e)) { return; } - } else if (type === 'contextmenu') { - // we only want to call preventDefault when targets listen to it. + var target = targets[0]; + if (type === 'contextmenu' && target.listens(type, true)) { L.DomEvent.preventDefault(e); } - var target = targets[0]; - // prevents firing click after you just dragged an object if ((e.type === 'click' || e.type === 'preclick') && !e._simulated && this._draggableMoved(target)) { return; } From 08d14a3ed0e315cb83bd41a604f66ef1777ec6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 8 Oct 2015 15:21:31 +0200 Subject: [PATCH 1874/2207] Draft for the 1.0.0-beta2 changelog --- CHANGELOG.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57c3de621f6..6da973353d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,61 @@ Leaflet Changelog An in-progress version being developed on the `master` branch. No changes since the last tagged release yet. +## 1.0-beta2 (date TBC) + +Beta 2 fixes over 50 bug that were reported by users trying out beta 1. The vast majority of changes are small fixes to problems that are triggered in very specific situations or conditions, a few API consolidation changes, and a few browser workarounds. + +* Fixed event propagation on double finger tap (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3532](https://github.com/Leaflet/Leaflet/issues/3532) +* Implemented canvas optimizations on mousehover interactions (by [@philippelatulippe](https://github.com/philippelatulippe)); [#3076](https://github.com/Leaflet/Leaflet/issues/3076) +* Fixed style changes on re-added layers (by [@wpf500](https://github.com/wpf500)) +* Fixed `preventOutline` exceptions [#3625](https://github.com/Leaflet/Leaflet/issues/3625) +* Improved drag behaviour by preventing a `preclick` event during drag (by [@yohanboniface](https://github.com/yohanboniface)) [#3632](https://github.com/Leaflet/Leaflet/issues/3632) +* Fixed a box zoom regression bug [#3633](https://github.com/Leaflet/Leaflet/issues/3633) +* Fixed `contextmenu` behaviour when there are no event listeners (by [@yohanboniface](https://github.com/yohanboniface)) [#3638](https://github.com/Leaflet/Leaflet/issues/3638) +* Fixed map controls not showing on top of map layers (by [@patrickarlt](https://github.com/patrickarlt)) +* Fixed display of marker images with `max-width` (by [@davidjb](https://github.com/davidjb)) +* Fixed `mouseout` and `mouseover` event bubbling (by [@yohanboniface](https://github.com/yohanboniface)) [#3648](https://github.com/Leaflet/Leaflet/issues/3648) [#3797](https://github.com/Leaflet/Leaflet/issues/3797) [#3708](https://github.com/Leaflet/Leaflet/issues/3708) +* Fixed a layer control bug when removing layers (by [@davidlukerice](https://github.com/davidlukerice)) +* Fixed pan and zoom animations interacting with each other [#3355](https://github.com/Leaflet/Leaflet/issues/3355) [#3655](https://github.com/Leaflet/Leaflet/issues/3655) +* Fixed a regression bug in canvas renderer when removing layers [#3661](https://github.com/Leaflet/Leaflet/issues/3661) +* Remove a workaround for legacy Android 2 browsers [#2282](https://github.com/Leaflet/Leaflet/issues/2282) +* Fixed VML vector rendering in IE8 when removing and re-adding layers (by [@fminuti](https://github.com/fminuti)) [#2809](https://github.com/Leaflet/Leaflet/issues/2809) +* Fixed `flyTo` animations when the map center doesn't change (by [@fminuti](https://github.com/fminuti)) +* Fixed fade animations for semitransparent tile layers (by [@w8r](https://github.com/w8r)) +* Fixed behaviour of the `baselayerchange` event (by [@yohanboniface](https://github.com/yohanboniface)) [#3677](https://github.com/Leaflet/Leaflet/issues/3677) +* Implemented `L.ImageOverlay.setBounds()` and fixed image overlay initialization (by [@fminuti](https://github.com/fminuti)) +* Implemented draggable items to fire `mousedown` events (by [@yohanboniface](https://github.com/yohanboniface)) +* Changed detection of browsers capable of `msPointer` events (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Fixed marker icon handling during a marker drag (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3687](https://github.com/Leaflet/Leaflet/issues/3687) +* Fixed a IE 11 map container visibility bug (by [@fminuti](https://github.com/fminuti)) [#2788](https://github.com/Leaflet/Leaflet/issues/2788) +* Prevented dragging interactions while a map zoom animation is running (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3692](https://github.com/Leaflet/Leaflet/issues/3692) +* Implement disabling layers in the layer control when they are unavailable at the current zoom level (by [@IvanSanchez](https://github.com/IvanSanchez)) [#252](https://github.com/Leaflet/Leaflet/issues/252) +* Refactored `L.Util.requestAnimFrame` definition (by [@fminuti](https://github.com/fminuti)) [#3703](https://github.com/Leaflet/Leaflet/issues/3703) +* Implemented latitude truncation for spherical mercator projection (by [@perliedman](https://github.com/perliedman)) [#3700](https://github.com/Leaflet/Leaflet/issues/3700) +* Armored against browsers not implementing `Geolocation.clearWatch()` [#3707](https://github.com/Leaflet/Leaflet/issues/3707) +* Fixed an edge case of `L.Circle.getBounds()` (by [@knabar](https://github.com/knabar)) +* Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Improved detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) +* Fixed `Rectangle.setBounds()` return value (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Fixed event firing order when opening a popup (by [@yohanboniface](https://github.com/yohanboniface)) [#3745](https://github.com/Leaflet/Leaflet/issues/3745) +* Fixed tile layer loading when dragging then immediately pinch-zooming the map (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3814](https://github.com/Leaflet/Leaflet/issues/3814) +* Work around browser limitations when panning the map too far away (by [@yohanboniface](https://github.com/yohanboniface) and [@IvanSanchez](https://github.com/IvanSanchez)) [#3608](https://github.com/Leaflet/Leaflet/issues/3608) +* Fixed popup text selection and touch events for IE 10 (by [@danzel](https://github.com/danzel)) [#3804](https://github.com/Leaflet/Leaflet/issues/3804) +* Fixed tile layer ordering when `maxZoom` is set (by [@patrickarlt](https://github.com/patrickarlt)) [#3721](https://github.com/Leaflet/Leaflet/issues/3721) +* Make `L.Circle` and `L.CircleMarker` radius options consistent (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Fixed scale behaviour on non-standard CRSs (by [@javimolla](https://github.com/patrickarlt), special thanks to [Your First PR](https://yourfirstpr.github.io/)) [#2990](https://github.com/Leaflet/Leaflet/issues/2990) +* Fixed rendering of off-screen vector layers (by [@yohanboniface](https://github.com/yohanboniface)) [#3836](https://github.com/Leaflet/Leaflet/issues/3836) +* Fixed rendering of intersecting vector layers (by [@yohanboniface](https://github.com/yohanboniface)) [#3583](https://github.com/Leaflet/Leaflet/issues/3583) +* Enforced stricter code linting +* Fixed disabled drag handlers not being able to be re-enabled (by [@yohanboniface](https://github.com/yohanboniface)) [#3825](https://github.com/Leaflet/Leaflet/issues/3825) +* Fixed panning outside the map bounds (by [@yohanboniface](https://github.com/yohanboniface)) [#3878](https://github.com/Leaflet/Leaflet/issues/3878) +* Worked around IE 11 not focusing the map using keyboard (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3772](https://github.com/Leaflet/Leaflet/issues/3772) +* Fixed vector layer positioning during a zoom animation in low zoom (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3769](https://github.com/Leaflet/Leaflet/issues/3769) +* Implemented `noWrap` option in `L.GridLayer` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3691](https://github.com/Leaflet/Leaflet/issues/3691) +* Fixed popups panning the map while running another pan animation (by [@yohanboniface](https://github.com/yohanboniface)) [#3744](https://github.com/Leaflet/Leaflet/issues/3744) +* Fixed uncorrect length of scale control due to CSS styles (by [@yohanboniface](https://github.com/yohanboniface)) [#3668](https://github.com/Leaflet/Leaflet/issues/3668) + + ## 1.0-beta1 (July 14, 2015) The first beta of the huge, long-awaited Leaflet 1.0 release. @@ -32,7 +87,7 @@ Leaflet vector layers rendering got a major rewrite, making it possible to switc * Fixed `GeoJSON` `resetStyle` to work properly in case `style` option wasn't set. * Fixed a bug where map fired `moveend` when updating Canvas layers. * Removed `Polyline` and `Polygon` `spliceLatLngs` method (just use `setLatLngs` instead). -* Changed `Polygon` `getLatLngs` to always return an array of rings (nested array) by [@yohanboniface](https://github.com/yohanboniface)). [#2618](https://github.com/Leaflet/Leaflet/issues/2618) [#3386](https://github.com/Leaflet/Leaflet/pull/3386) [Leaflet/Leaflet#3279](https://github.com/Leaflet/Leaflet/pull/3279) [#2648](https://github.com/Leaflet/Leaflet/issues/2648) +* Changed `Polygon` `getLatLngs` to always return an array of rings (nested array) (by [@yohanboniface](https://github.com/yohanboniface)). [#2618](https://github.com/Leaflet/Leaflet/issues/2618) [#3386](https://github.com/Leaflet/Leaflet/pull/3386) [Leaflet/Leaflet#3279](https://github.com/Leaflet/Leaflet/pull/3279) [#2648](https://github.com/Leaflet/Leaflet/issues/2648) * Added the ability to specify a custom pane for vector layers (making it possible to easily do stacks like vectors-tiles-vectors with proper z-index order) (by [@Jakobud](https://github.com/Jakobud)). [#3266](https://github.com/Leaflet/Leaflet/pull/3266) [#2786](https://github.com/Leaflet/Leaflet/pull/2786) * Added vector layers `fillRule` option (by [@bullgare](https://github.com/bullgare)). [#2834](https://github.com/Leaflet/Leaflet/pull/2834) * Removed `L_PREFER_CANVAS` global switch and added `Map` `preferCanvas` option instead (by [@yohanboniface](https://github.com/yohanboniface)). [#3623](https://github.com/Leaflet/Leaflet/pull/3623) From 792e91fd1675f8b605d8a9f16e1a5c845e77fe1d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Thu, 8 Oct 2015 15:41:40 +0200 Subject: [PATCH 1875/2207] Typo --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6da973353d1..99b08deafd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,10 @@ An in-progress version being developed on the `master` branch. No changes since ## 1.0-beta2 (date TBC) -Beta 2 fixes over 50 bug that were reported by users trying out beta 1. The vast majority of changes are small fixes to problems that are triggered in very specific situations or conditions, a few API consolidation changes, and a few browser workarounds. +Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vast majority of changes are small fixes to problems that are triggered in very specific situations or conditions, a few API consolidation changes, and a few browser workarounds. * Fixed event propagation on double finger tap (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3532](https://github.com/Leaflet/Leaflet/issues/3532) -* Implemented canvas optimizations on mousehover interactions (by [@philippelatulippe](https://github.com/philippelatulippe)); [#3076](https://github.com/Leaflet/Leaflet/issues/3076) +* Implemented canvas optimizations on mousehover interactions (by [@philippelatulippe](https://github.com/philippelatulippe)) [#3076](https://github.com/Leaflet/Leaflet/issues/3076) * Fixed style changes on re-added layers (by [@wpf500](https://github.com/wpf500)) * Fixed `preventOutline` exceptions [#3625](https://github.com/Leaflet/Leaflet/issues/3625) * Improved drag behaviour by preventing a `preclick` event during drag (by [@yohanboniface](https://github.com/yohanboniface)) [#3632](https://github.com/Leaflet/Leaflet/issues/3632) From 8f6d188088dce137ea8ebed1e2f80bc4d2e933da Mon Sep 17 00:00:00 2001 From: danzel Date: Fri, 9 Oct 2015 09:49:49 +1300 Subject: [PATCH 1876/2207] bringToFront / bringToBack for popups. Fixes #3813 --- src/layer/Popup.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 192402343bf..bfcbfe2e388 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -143,6 +143,20 @@ L.Popup = L.Layer.extend({ return !!this._map && this._map.hasLayer(this); }, + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._container); + } + return this; + }, + + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._container); + } + return this; + }, + _close: function () { if (this._map) { this._map.closePopup(this); From 72f4a4345734f6eb86e22c0158a71e4a18748b14 Mon Sep 17 00:00:00 2001 From: danzel Date: Fri, 9 Oct 2015 09:59:45 +1300 Subject: [PATCH 1877/2207] Document change in CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57c3de621f6..1658e0fe78b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Changed the default z-index of panes to be bigger, leaving more room for customization (by [@patrickarlt](https://github.com/patrickarlt)). [#3591](https://github.com/Leaflet/Leaflet/pull/3591) * Improved DOM event bubbling mechanism for layers (by [@yohanboniface](https://github.com/yohanboniface)). [Leaflet/Leaflet#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3450](https://github.com/Leaflet/Leaflet/pull/3450) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) * Added `nonBubblingEvents` option to layers (by [@yohanboniface](https://github.com/yohanboniface)). [#3605](https://github.com/Leaflet/Leaflet/pull/3605) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3604](https://github.com/Leaflet/Leaflet/issues/3604) +* Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) In addition, layer events implementation was rewritten to use **event delegation**, significantly improving add/remove performance and memory footprint. [#3032](https://github.com/Leaflet/Leaflet/pull/3032) [#46](https://github.com/Leaflet/Leaflet/issues/46) From 5c529f51759f20306708947090fd857e3e054b6a Mon Sep 17 00:00:00 2001 From: danzel Date: Fri, 9 Oct 2015 10:11:56 +1300 Subject: [PATCH 1878/2207] Fix a bunch of unbalanced tags --- reference.html | 56 ++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/reference.html b/reference.html index fae3b1974ef..aef5bee8afd 100644 --- a/reference.html +++ b/reference.html @@ -886,7 +886,7 @@

          Methods for Layers and Controls

          openPopup( - <String> html | <HTMLElement> el, + <String> html | <HTMLElement> el, <LatLng> latlng, <Popup options> options? ) @@ -917,6 +917,7 @@

          Methods for Layers and Controls

          this Removes the given control from the map. + getRenderer( <Layer> layer) @@ -1059,16 +1060,16 @@

          Other Methods

          createPane( - <String> name, <HTMLElement> contianer? + <String> name, <HTMLElement> container? ) - MapPane + MapPane Creates a pane with the given name. Created panes will be given a generated class based on the name like .leaflet-pane-name" getPane( - <String> name + <String> name ) - MapPane + MapPane Returns the HTML element representing the named map pane. @@ -1234,19 +1235,19 @@

          fitBounds options

          paddingTopLeft Point - [0, 0] + [0, 0] Sets the amount of padding in the top left corner of a map container that shouldn't be accounted for when setting the view to fit bounds. Useful if you have some control overlays on the map like a sidebar and you don't want them to obscure objects you're zooming to. paddingBottomRight Point - [0, 0] + [0, 0] The same for bottom right corner of the map. padding Point - [0, 0] + [0, 0] Equivalent of setting both top left and bottom right padding to the same value. @@ -1733,14 +1734,12 @@ autoPanPaddingTopLeft Point null - The margin between the popup and the top left corner of the map view after autopanning was performed. autoPanPaddingBottomRight Point null - The margin between the popup and the bottom right corner of the map view after autopanning was performed. @@ -2151,7 +2150,7 @@

          Creation

          L.tileLayer.wms( <String> baseUrl, <TileLayer.WMS options> options ) - + Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object. @@ -2837,7 +2836,7 @@

          Circle

          A class for drawing circle overlays on a map. Extends CircleMarker. Use Map#addLayer to add it to the map.

          -
          L.circle([50.5, 30.5], 200).addTo(map);
          +
          L.circle([50.5, 30.5], 200).addTo(map);

          Creation

          @@ -4314,31 +4313,31 @@

          Options

          position String - 'topleft' + 'topleft' The position of the control (one of the map corners). See control positions. zoomInText String - '+' + '+' The text set on the zoom in button. zoomOutText String - '-' + '-' The text set on the zoom out button. zoomInTitle String - 'Zoom in' + 'Zoom in' The title set on the zoom in button. zoomOutTitle String - 'Zoom out' + 'Zoom out' The title set on the zoom out button. @@ -4378,13 +4377,13 @@

          Options

          position String - 'bottomright' + 'bottomright' The position of the control (one of the map corners). See control positions. prefix String - 'Leaflet' + 'Leaflet' The HTML text shown before the attributions. Pass false to disable. @@ -4497,7 +4496,7 @@

          Options

          position String - 'topright' + 'topright' The position of the control (one of the map corners). See control positions. @@ -4593,7 +4592,7 @@

          Options

          position String - 'bottomleft' + 'bottomleft' The position of the control (one of the map corners). See control positions. @@ -4693,7 +4692,7 @@

          Methods

          this - Removes a set of type/listener pairs.
          + Removes a set of type/listener pairs. off() @@ -4737,7 +4736,7 @@

          Methods

          clearAllEventListeners() this - Alias to off().
          + Alias to off(). hasEventListeners( … ) @@ -4973,7 +4972,7 @@

          Methods

          Returns a function which executes function fn with the given scope obj (so that this keyword refers to obj inside the function code). The arguments received by the bound function will be any arguments passed when binding the function, followed by any arguments passed when invoking the bound function. Has an L.bind shortcut. Works exactly like Function.prototype.bind in modern browsers compliant with ECMAScript 5. - stamp( <Object> obj ) + stamp( <Object> obj ) String Applies a unique key to the object and returns that key. Has an L.stamp shortcut. @@ -5035,7 +5034,7 @@

          Methods

          String[] - Trims and splits the string on whitespace and returns the array of parts.
          + Trims and splits the string on whitespace and returns the array of parts. setOptions( @@ -5297,7 +5296,7 @@

          Methods

          this - Removes a set of type/listener pairs.
          + Removes a set of type/listener pairs. addListener( <HTMLElement> el, @@ -5338,8 +5337,7 @@

          Methods

          this - Prevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions.
          - + Prevents the default action of the event from happening (such as following a link in the href of the a element, or doing a POST request with page reload when form is submitted). Use it inside listener functions. stop( @@ -6180,7 +6178,7 @@

          Options

          position String - 'topright' + 'topright' The initial position of the control (one of the map corners). See control positions. From 4fa857a07cbaa7da1c68b74d6afd538e867ff23e Mon Sep 17 00:00:00 2001 From: danzel Date: Fri, 9 Oct 2015 10:14:06 +1300 Subject: [PATCH 1879/2207] Put changelog in the right place --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1658e0fe78b..e9f35208c80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,9 @@ Leaflet Changelog ## 1.0-dev (master) -An in-progress version being developed on the `master` branch. No changes since the last tagged release yet. +An in-progress version being developed on the `master` branch. + +* Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) ## 1.0-beta1 (July 14, 2015) @@ -63,7 +65,6 @@ All Leaflet layers (including markers, popups, tile and vector layers) have been * Changed the default z-index of panes to be bigger, leaving more room for customization (by [@patrickarlt](https://github.com/patrickarlt)). [#3591](https://github.com/Leaflet/Leaflet/pull/3591) * Improved DOM event bubbling mechanism for layers (by [@yohanboniface](https://github.com/yohanboniface)). [Leaflet/Leaflet#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3450](https://github.com/Leaflet/Leaflet/pull/3450) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) * Added `nonBubblingEvents` option to layers (by [@yohanboniface](https://github.com/yohanboniface)). [#3605](https://github.com/Leaflet/Leaflet/pull/3605) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3604](https://github.com/Leaflet/Leaflet/issues/3604) -* Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) In addition, layer events implementation was rewritten to use **event delegation**, significantly improving add/remove performance and memory footprint. [#3032](https://github.com/Leaflet/Leaflet/pull/3032) [#46](https://github.com/Leaflet/Leaflet/issues/46) From 0b0989f9f1b477665f1ac2782b058fcc65edf0cc Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 9 Oct 2015 18:25:59 +0200 Subject: [PATCH 1880/2207] Canvas events fixes (fix #3915) - fix fireEvent called for each layer containing event point - fix layer not removed from this._layer at remove - fix L.DomEvent.stop(e) not honoured for canvas because events are both listenned on canvas container and map container --- spec/index.html | 1 + spec/suites/layer/vector/CanvasSpec.js | 78 ++++++++++++++++++++++++++ spec/suites/map/MapSpec.js | 19 ------- src/layer/vector/Canvas.js | 18 +++--- src/map/Map.js | 2 + 5 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 spec/suites/layer/vector/CanvasSpec.js diff --git a/spec/index.html b/spec/index.html index 7e2387f640e..de4454e7c2f 100644 --- a/spec/index.html +++ b/spec/index.html @@ -77,6 +77,7 @@ + diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js new file mode 100644 index 00000000000..13627fac97f --- /dev/null +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -0,0 +1,78 @@ +describe('Canvas', function () { + + var c, map, p2ll, latLngs; + + before(function () { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + c.style.position = 'absolute'; + c.style.top = '0'; + c.style.left = '0'; + document.body.appendChild(c); + map = new L.Map(c, {preferCanvas: true, zoomControl: false}); + map.setView([0, 0], 6); + p2ll = function (x, y) { + return map.layerPointToLatLng([x, y]); + }; + latLngs = [p2ll(0, 0), p2ll(0, 100), p2ll(100, 100), p2ll(100, 0)]; + }); + + after(function () { + document.body.removeChild(c); + }); + + describe("#events", function () { + var layer; + + beforeEach(function () { + layer = L.polygon(latLngs).addTo(map); + }); + + afterEach(function () { + layer.remove(); + }); + + it("should fire event when layer contains mouse", function () { + var spy = sinon.spy(); + layer.on('click', spy); + happen.at('click', 50, 50); // Click on the layer. + expect(spy.callCount).to.eql(1); + happen.at('click', 150, 150); // Click outside layer. + expect(spy.callCount).to.eql(1); + layer.off("click", spy); + }); + + it("DOM events propagate from canvas polygon to map", function () { + var spy = sinon.spy(); + map.on("click", spy); + happen.at('click', 50, 50); + expect(spy.callCount).to.eql(1); + map.off("click", spy); + }); + + it("DOM events fired on canvas polygon can be cancelled before being caught by the map", function () { + var mapSpy = sinon.spy(); + var layerSpy = sinon.spy(); + map.on("click", mapSpy); + layer.on("click", L.DomEvent.stopPropagation).on("click", layerSpy); + happen.at('click', 50, 50); + expect(layerSpy.callCount).to.eql(1); + expect(mapSpy.callCount).to.eql(0); + map.off("click", mapSpy); + layer.off("click", L.DomEvent.stopPropagation).off("click", layerSpy); + }); + + it("DOM events fired on canvas polygon are propagated only once to the map even when two layers contains the event", function () { + var spy = sinon.spy(); + var layer2 = L.polygon(latLngs).addTo(map); + map.on("click", spy); + happen.at('click', 50, 50); + expect(spy.callCount).to.eql(1); + layer2.remove(); + map.off("click", spy); + }); + + }); + +}); diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 1c2c12087f5..c32b88ad707 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -644,14 +644,6 @@ describe("Map", function () { expect(spy.calledOnce).to.be.ok(); }); - it("DOM events propagate from canvas polygon to map", function () { - var spy = sinon.spy(); - map.on("mousemove", spy); - var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]], {rendered: L.canvas()}).addTo(map); - happen.mousemove(layer._path); - expect(spy.calledOnce).to.be.ok(); - }); - it("DOM events propagate from marker to map", function () { var spy = sinon.spy(); map.on("mousemove", spy); @@ -682,17 +674,6 @@ describe("Map", function () { expect(mapSpy.called).not.to.be.ok(); }); - it("DOM events fired on canvas polygon can be cancelled before being caught by the map", function () { - var mapSpy = sinon.spy(); - var layerSpy = sinon.spy(); - map.on("mousemove", mapSpy); - var layer = new L.Polygon([[1, 2], [3, 4], [5, 6]], {rendered: L.canvas()}).addTo(map); - layer.on("mousemove", L.DomEvent.stopPropagation).on("mousemove", layerSpy); - happen.mousemove(layer._path); - expect(layerSpy.calledOnce).to.be.ok(); - expect(mapSpy.called).not.to.be.ok(); - }); - it("mouseout is forwarded if fired on the original target", function () { var mapSpy = sinon.spy(), layerSpy = sinon.spy(), diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index ec080d280d9..d91c4443602 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -61,6 +61,7 @@ L.Canvas = L.Renderer.extend({ _removePath: function (layer) { layer._removed = true; + delete this._layers[L.stamp(layer)]; this._requestRedraw(layer); }, @@ -201,14 +202,17 @@ L.Canvas = L.Renderer.extend({ // so we emulate that by calculating what's under the mouse on mousemove/click manually _onClick: function (e) { - var point = this._map.mouseEventToLayerPoint(e); + var point = this._map.mouseEventToLayerPoint(e), layers = []; for (var id in this._layers) { if (this._layers[id]._containsPoint(point)) { L.DomEvent._fakeStop(e); - this._fireEvent(this._layers[id], e); + layers.push(this._layers[id]); } } + if (layers.length) { + this._fireEvent(layers, e); + } }, _onMouseMove: function (e) { @@ -225,7 +229,7 @@ L.Canvas = L.Renderer.extend({ if (layer && (e.type === 'mouseout' || !layer._containsPoint(point))) { // if we're leaving the layer, fire mouseout L.DomUtil.removeClass(this._container, 'leaflet-interactive'); - this._fireEvent(layer, e, 'mouseout'); + this._fireEvent([layer], e, 'mouseout'); this._hoveredLayer = null; } }, @@ -237,19 +241,19 @@ L.Canvas = L.Renderer.extend({ layer = this._drawnLayers[id]; if (layer.options.interactive && layer._containsPoint(point)) { L.DomUtil.addClass(this._container, 'leaflet-interactive'); // change cursor - this._fireEvent(layer, e, 'mouseover'); + this._fireEvent([layer], e, 'mouseover'); this._hoveredLayer = layer; break; } } } if (this._hoveredLayer) { - this._fireEvent(this._hoveredLayer, e); + this._fireEvent([this._hoveredLayer], e); } }, - _fireEvent: function (layer, e, type) { - this._map._fireDOMEvent(e, type || e.type, [layer]); + _fireEvent: function (layers, e, type) { + this._map._fireDOMEvent(e, type || e.type, layers); }, // TODO _bringToFront & _bringToBack, pretty tricky diff --git a/src/map/Map.js b/src/map/Map.js index b18ff32aa9d..6495ae1d819 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -688,6 +688,8 @@ L.Map = L.Evented.extend({ _fireDOMEvent: function (e, type, targets) { + if (e._stopped) { return; } + targets = (targets || []).concat(this._findEventTargets(e, type)); if (!targets.length) { return; } From 6c3b9e10b8c7d122b85b9ebf598e7c7ef7507f4f Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 9 Oct 2015 20:23:09 +0200 Subject: [PATCH 1881/2207] Fix L.Circle init without options.radius --- spec/suites/layer/vector/CircleSpec.js | 11 +++++++++++ src/layer/vector/Circle.js | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/vector/CircleSpec.js b/spec/suites/layer/vector/CircleSpec.js index 7efdb0d9e72..c269f81a547 100644 --- a/spec/suites/layer/vector/CircleSpec.js +++ b/spec/suites/layer/vector/CircleSpec.js @@ -1,4 +1,14 @@ describe('Circle', function () { + + describe('#init', function () { + + it('uses default radius if not given', function () { + var circle = L.circle([0, 0]); + expect(circle.getRadius()).to.eql(10); + }); + + }); + describe('#getBounds', function () { var map, circle; @@ -32,4 +42,5 @@ describe('Circle', function () { expect(bounds.getNorthEast()).nearLatLng(new L.LatLng(50.05646, 30.08789)); }); }); + }); diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index b4f7aebfdd3..eb46df84405 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -8,7 +8,7 @@ L.Circle = L.CircleMarker.extend({ initialize: function (latlng, options) { L.setOptions(this, options); this._latlng = L.latLng(latlng); - this._mRadius = options.radius; + this._mRadius = this.options.radius; }, setRadius: function (radius) { From 2f124f7e924f629bb0e26722d58f5e04b7e9c5d0 Mon Sep 17 00:00:00 2001 From: Lou Huang Date: Fri, 9 Oct 2015 18:04:00 -0400 Subject: [PATCH 1882/2207] Add Pelias/Mapzen Search Geocoder to plugins --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 89eb86ca483..c050799996e 100644 --- a/plugins.md +++ b/plugins.md @@ -2573,6 +2573,17 @@ External services that transform an address or the name of a place into latitude Brendan Ward + + + Mapzen Search (Pelias) Leaflet Geocoder + + + A geocoding control using Mapzen Search or any hosted service powered by the Pelias Geocoder API. Demo + + + Lou Huang + + From 6af0cfde5365a8b7eef87a3d57753a86ad5e0d3e Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 10 Oct 2015 18:03:05 +0200 Subject: [PATCH 1883/2207] multiply offset by 3 on keyboard pan when shift key is pressed --- src/map/handler/Map.Keyboard.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 8116807e5d2..7a4e7ccdac1 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -128,13 +128,19 @@ L.Map.Keyboard = L.Handler.extend({ if (e.altKey || e.ctrlKey || e.metaKey) { return; } var key = e.keyCode, - map = this._map; + map = this._map, + offset; if (key in this._panKeys) { if (map._panAnim && map._panAnim._inProgress) { return; } - map.panBy(this._panKeys[key]); + offset = this._panKeys[key]; + if (e.shiftKey) { + offset = L.point(offset).multiplyBy(3); + } + + map.panBy(offset); if (map.options.maxBounds) { map.panInsideBounds(map.options.maxBounds); From a41a70da49f9a089af57bbf7d37ca352f2c09451 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 10 Oct 2015 19:31:40 +0200 Subject: [PATCH 1884/2207] Group changes by category in beta2 changelog --- CHANGELOG.md | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad4a6b37d87..bf96699b0a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,17 +7,32 @@ Leaflet Changelog An in-progress version being developed on the `master` branch. -* Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) ## 1.0-beta2 (date TBC) Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vast majority of changes are small fixes to problems that are triggered in very specific situations or conditions, a few API consolidation changes, and a few browser workarounds. -* Fixed event propagation on double finger tap (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3532](https://github.com/Leaflet/Leaflet/issues/3532) +### API changes +* Make `L.Circle` and `L.CircleMarker` radius options consistent (by [@IvanSanchez](https://github.com/IvanSanchez)) + +### Improvements + * Implemented canvas optimizations on mousehover interactions (by [@philippelatulippe](https://github.com/philippelatulippe)) [#3076](https://github.com/Leaflet/Leaflet/issues/3076) +* Improved drag behaviour by preventing a `preclick` event during drag (by [@yohanboniface](https://github.com/yohanboniface)) [#3632](https://github.com/Leaflet/Leaflet/issues/3632) +* Implemented `L.ImageOverlay.setBounds()` and fixed image overlay initialization (by [@fminuti](https://github.com/fminuti)) +* Implemented draggable items to fire `mousedown` events (by [@yohanboniface](https://github.com/yohanboniface)) +* Changed detection of browsers capable of `msPointer` events (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Implemented latitude truncation for spherical mercator projection (by [@perliedman](https://github.com/perliedman)) [#3700](https://github.com/Leaflet/Leaflet/issues/3700) +* Armored against browsers not implementing `Geolocation.clearWatch()` [#3707](https://github.com/Leaflet/Leaflet/issues/3707) +* Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Improved detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) +* Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) + +### Bug fixes + +* Fixed event propagation on double finger tap (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3532](https://github.com/Leaflet/Leaflet/issues/3532) * Fixed style changes on re-added layers (by [@wpf500](https://github.com/wpf500)) * Fixed `preventOutline` exceptions [#3625](https://github.com/Leaflet/Leaflet/issues/3625) -* Improved drag behaviour by preventing a `preclick` event during drag (by [@yohanboniface](https://github.com/yohanboniface)) [#3632](https://github.com/Leaflet/Leaflet/issues/3632) * Fixed a box zoom regression bug [#3633](https://github.com/Leaflet/Leaflet/issues/3633) * Fixed `contextmenu` behaviour when there are no event listeners (by [@yohanboniface](https://github.com/yohanboniface)) [#3638](https://github.com/Leaflet/Leaflet/issues/3638) * Fixed map controls not showing on top of map layers (by [@patrickarlt](https://github.com/patrickarlt)) @@ -31,26 +46,18 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Fixed `flyTo` animations when the map center doesn't change (by [@fminuti](https://github.com/fminuti)) * Fixed fade animations for semitransparent tile layers (by [@w8r](https://github.com/w8r)) * Fixed behaviour of the `baselayerchange` event (by [@yohanboniface](https://github.com/yohanboniface)) [#3677](https://github.com/Leaflet/Leaflet/issues/3677) -* Implemented `L.ImageOverlay.setBounds()` and fixed image overlay initialization (by [@fminuti](https://github.com/fminuti)) -* Implemented draggable items to fire `mousedown` events (by [@yohanboniface](https://github.com/yohanboniface)) -* Changed detection of browsers capable of `msPointer` events (by [@IvanSanchez](https://github.com/IvanSanchez)) * Fixed marker icon handling during a marker drag (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3687](https://github.com/Leaflet/Leaflet/issues/3687) * Fixed a IE 11 map container visibility bug (by [@fminuti](https://github.com/fminuti)) [#2788](https://github.com/Leaflet/Leaflet/issues/2788) * Prevented dragging interactions while a map zoom animation is running (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3692](https://github.com/Leaflet/Leaflet/issues/3692) * Implement disabling layers in the layer control when they are unavailable at the current zoom level (by [@IvanSanchez](https://github.com/IvanSanchez)) [#252](https://github.com/Leaflet/Leaflet/issues/252) * Refactored `L.Util.requestAnimFrame` definition (by [@fminuti](https://github.com/fminuti)) [#3703](https://github.com/Leaflet/Leaflet/issues/3703) -* Implemented latitude truncation for spherical mercator projection (by [@perliedman](https://github.com/perliedman)) [#3700](https://github.com/Leaflet/Leaflet/issues/3700) -* Armored against browsers not implementing `Geolocation.clearWatch()` [#3707](https://github.com/Leaflet/Leaflet/issues/3707) * Fixed an edge case of `L.Circle.getBounds()` (by [@knabar](https://github.com/knabar)) -* Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) -* Improved detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) * Fixed `Rectangle.setBounds()` return value (by [@IvanSanchez](https://github.com/IvanSanchez)) * Fixed event firing order when opening a popup (by [@yohanboniface](https://github.com/yohanboniface)) [#3745](https://github.com/Leaflet/Leaflet/issues/3745) * Fixed tile layer loading when dragging then immediately pinch-zooming the map (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3814](https://github.com/Leaflet/Leaflet/issues/3814) * Work around browser limitations when panning the map too far away (by [@yohanboniface](https://github.com/yohanboniface) and [@IvanSanchez](https://github.com/IvanSanchez)) [#3608](https://github.com/Leaflet/Leaflet/issues/3608) * Fixed popup text selection and touch events for IE 10 (by [@danzel](https://github.com/danzel)) [#3804](https://github.com/Leaflet/Leaflet/issues/3804) * Fixed tile layer ordering when `maxZoom` is set (by [@patrickarlt](https://github.com/patrickarlt)) [#3721](https://github.com/Leaflet/Leaflet/issues/3721) -* Make `L.Circle` and `L.CircleMarker` radius options consistent (by [@IvanSanchez](https://github.com/IvanSanchez)) * Fixed scale behaviour on non-standard CRSs (by [@javimolla](https://github.com/patrickarlt), special thanks to [Your First PR](https://yourfirstpr.github.io/)) [#2990](https://github.com/Leaflet/Leaflet/issues/2990) * Fixed rendering of off-screen vector layers (by [@yohanboniface](https://github.com/yohanboniface)) [#3836](https://github.com/Leaflet/Leaflet/issues/3836) * Fixed rendering of intersecting vector layers (by [@yohanboniface](https://github.com/yohanboniface)) [#3583](https://github.com/Leaflet/Leaflet/issues/3583) @@ -64,6 +71,7 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Fixed uncorrect length of scale control due to CSS styles (by [@yohanboniface](https://github.com/yohanboniface)) [#3668](https://github.com/Leaflet/Leaflet/issues/3668) + ## 1.0-beta1 (July 14, 2015) The first beta of the huge, long-awaited Leaflet 1.0 release. From 108fee799c206fa16008e18ca6988e0856bbb3e1 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 10 Oct 2015 19:46:33 +0200 Subject: [PATCH 1885/2207] Add a bunch of missing PR references to beta2 changelog --- CHANGELOG.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf96699b0a1..64bcff4559f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,40 +19,39 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Implemented canvas optimizations on mousehover interactions (by [@philippelatulippe](https://github.com/philippelatulippe)) [#3076](https://github.com/Leaflet/Leaflet/issues/3076) * Improved drag behaviour by preventing a `preclick` event during drag (by [@yohanboniface](https://github.com/yohanboniface)) [#3632](https://github.com/Leaflet/Leaflet/issues/3632) -* Implemented `L.ImageOverlay.setBounds()` and fixed image overlay initialization (by [@fminuti](https://github.com/fminuti)) -* Implemented draggable items to fire `mousedown` events (by [@yohanboniface](https://github.com/yohanboniface)) -* Changed detection of browsers capable of `msPointer` events (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Implemented `L.ImageOverlay.setBounds()` and fixed image overlay initialization (by [@fminuti](https://github.com/fminuti)) [#3680](https://github.com/Leaflet/Leaflet/pull/3680) +* Implemented draggable items to fire `mousedown` events (by [@yohanboniface](https://github.com/yohanboniface)) [#3682](https://github.com/Leaflet/Leaflet/pull/3682) +* Changed detection of browsers capable of `msPointer` events (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3684](https://github.com/Leaflet/Leaflet/pull/3684) * Implemented latitude truncation for spherical mercator projection (by [@perliedman](https://github.com/perliedman)) [#3700](https://github.com/Leaflet/Leaflet/issues/3700) * Armored against browsers not implementing `Geolocation.clearWatch()` [#3707](https://github.com/Leaflet/Leaflet/issues/3707) -* Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) -* Improved detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) +* Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3723](https://github.com/Leaflet/Leaflet/pull/3723) * Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) ### Bug fixes * Fixed event propagation on double finger tap (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3532](https://github.com/Leaflet/Leaflet/issues/3532) -* Fixed style changes on re-added layers (by [@wpf500](https://github.com/wpf500)) +* Fixed style changes on re-added layers (by [@wpf500](https://github.com/wpf500)) [#3547](https://github.com/Leaflet/Leaflet/pull/3547) * Fixed `preventOutline` exceptions [#3625](https://github.com/Leaflet/Leaflet/issues/3625) * Fixed a box zoom regression bug [#3633](https://github.com/Leaflet/Leaflet/issues/3633) * Fixed `contextmenu` behaviour when there are no event listeners (by [@yohanboniface](https://github.com/yohanboniface)) [#3638](https://github.com/Leaflet/Leaflet/issues/3638) -* Fixed map controls not showing on top of map layers (by [@patrickarlt](https://github.com/patrickarlt)) -* Fixed display of marker images with `max-width` (by [@davidjb](https://github.com/davidjb)) +* Fixed map controls not showing on top of map layers (by [@patrickarlt](https://github.com/patrickarlt)) [#3644](https://github.com/Leaflet/Leaflet/pull/3644) +* Fixed display of marker images with `max-width` (by [@davidjb](https://github.com/davidjb)) [#3647](https://github.com/Leaflet/Leaflet/pull/3647) * Fixed `mouseout` and `mouseover` event bubbling (by [@yohanboniface](https://github.com/yohanboniface)) [#3648](https://github.com/Leaflet/Leaflet/issues/3648) [#3797](https://github.com/Leaflet/Leaflet/issues/3797) [#3708](https://github.com/Leaflet/Leaflet/issues/3708) -* Fixed a layer control bug when removing layers (by [@davidlukerice](https://github.com/davidlukerice)) +* Fixed a layer control bug when removing layers (by [@davidlukerice](https://github.com/davidlukerice)) [#3651](https://github.com/Leaflet/Leaflet/pull/3651) * Fixed pan and zoom animations interacting with each other [#3355](https://github.com/Leaflet/Leaflet/issues/3355) [#3655](https://github.com/Leaflet/Leaflet/issues/3655) * Fixed a regression bug in canvas renderer when removing layers [#3661](https://github.com/Leaflet/Leaflet/issues/3661) * Remove a workaround for legacy Android 2 browsers [#2282](https://github.com/Leaflet/Leaflet/issues/2282) * Fixed VML vector rendering in IE8 when removing and re-adding layers (by [@fminuti](https://github.com/fminuti)) [#2809](https://github.com/Leaflet/Leaflet/issues/2809) -* Fixed `flyTo` animations when the map center doesn't change (by [@fminuti](https://github.com/fminuti)) -* Fixed fade animations for semitransparent tile layers (by [@w8r](https://github.com/w8r)) +* Fixed `flyTo` animations when the map center doesn't change (by [@fminuti](https://github.com/fminuti)) [#3663](https://github.com/Leaflet/Leaflet/pull/3663) +* Fixed fade animations for semitransparent tile layers (by [@w8r](https://github.com/w8r)) [#3671](https://github.com/Leaflet/Leaflet/pull/3671) * Fixed behaviour of the `baselayerchange` event (by [@yohanboniface](https://github.com/yohanboniface)) [#3677](https://github.com/Leaflet/Leaflet/issues/3677) * Fixed marker icon handling during a marker drag (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3687](https://github.com/Leaflet/Leaflet/issues/3687) * Fixed a IE 11 map container visibility bug (by [@fminuti](https://github.com/fminuti)) [#2788](https://github.com/Leaflet/Leaflet/issues/2788) * Prevented dragging interactions while a map zoom animation is running (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3692](https://github.com/Leaflet/Leaflet/issues/3692) * Implement disabling layers in the layer control when they are unavailable at the current zoom level (by [@IvanSanchez](https://github.com/IvanSanchez)) [#252](https://github.com/Leaflet/Leaflet/issues/252) * Refactored `L.Util.requestAnimFrame` definition (by [@fminuti](https://github.com/fminuti)) [#3703](https://github.com/Leaflet/Leaflet/issues/3703) -* Fixed an edge case of `L.Circle.getBounds()` (by [@knabar](https://github.com/knabar)) -* Fixed `Rectangle.setBounds()` return value (by [@IvanSanchez](https://github.com/IvanSanchez)) +* Fixed an edge case of `L.Circle.getBounds()` (by [@knabar](https://github.com/knabar)) [#3776](https://github.com/Leaflet/Leaflet/pull/3776) +* Fixed `Rectangle.setBounds()` return value (by [@IvanSanchez](https://github.com/IvanSanchez)) https://github.com/Leaflet/Leaflet/commit/e698f641afadd4a0b412a6c9e065a6dbfbe16f44 * Fixed event firing order when opening a popup (by [@yohanboniface](https://github.com/yohanboniface)) [#3745](https://github.com/Leaflet/Leaflet/issues/3745) * Fixed tile layer loading when dragging then immediately pinch-zooming the map (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3814](https://github.com/Leaflet/Leaflet/issues/3814) * Work around browser limitations when panning the map too far away (by [@yohanboniface](https://github.com/yohanboniface) and [@IvanSanchez](https://github.com/IvanSanchez)) [#3608](https://github.com/Leaflet/Leaflet/issues/3608) @@ -69,6 +68,7 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Implemented `noWrap` option in `L.GridLayer` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3691](https://github.com/Leaflet/Leaflet/issues/3691) * Fixed popups panning the map while running another pan animation (by [@yohanboniface](https://github.com/yohanboniface)) [#3744](https://github.com/Leaflet/Leaflet/issues/3744) * Fixed uncorrect length of scale control due to CSS styles (by [@yohanboniface](https://github.com/yohanboniface)) [#3668](https://github.com/Leaflet/Leaflet/issues/3668) +* Fixed detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) [#3770](https://github.com/Leaflet/Leaflet/pull/3770) From 69e81472bec4d7c03f5847df18195db96ff77614 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 12 Oct 2015 12:55:09 +0200 Subject: [PATCH 1886/2207] Add last PRs in CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64bcff4559f..2fff015bc35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Armored against browsers not implementing `Geolocation.clearWatch()` [#3707](https://github.com/Leaflet/Leaflet/issues/3707) * Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3723](https://github.com/Leaflet/Leaflet/pull/3723) * Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) +* Multiply offset by 3 on keyboard pan when shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)) [#3921](https://github.com/Leaflet/Leaflet/pull/3921) ### Bug fixes @@ -69,7 +70,7 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Fixed popups panning the map while running another pan animation (by [@yohanboniface](https://github.com/yohanboniface)) [#3744](https://github.com/Leaflet/Leaflet/issues/3744) * Fixed uncorrect length of scale control due to CSS styles (by [@yohanboniface](https://github.com/yohanboniface)) [#3668](https://github.com/Leaflet/Leaflet/issues/3668) * Fixed detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) [#3770](https://github.com/Leaflet/Leaflet/pull/3770) - +* Various Canvas events fixes (by [@yohanboniface](https://github.com/yohanboniface)) [#3917](https://github.com/Leaflet/Leaflet/pull/3917) ## 1.0-beta1 (July 14, 2015) From d3198d8d392f3ba72a6aef3ac0f3b6ad9c97628d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 12 Oct 2015 14:02:30 +0200 Subject: [PATCH 1887/2207] Fix duration not passed through from setView to panBy (fix #3300) --- debug/map/zoompan.html | 2 +- spec/suites/map/MapSpec.js | 8 ++++++++ src/map/anim/Map.PanAnimation.js | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 1f277ca30d0..542fea8ada1 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -65,7 +65,7 @@ var nullIslandKitten = L.imageOverlay('http://placekitten.com/g/300/400', [[-0.2,-0.15], [0.2, 0.15]]).addTo(map); document.getElementById('dc').onclick = function () { map.flyTo(dc, 10); }; - document.getElementById('sf').onclick = function () { map.setView(sf, 10, {duration: 5}); }; + document.getElementById('sf').onclick = function () { map.setView(sf, 10, {duration: 5, animate: true}); }; document.getElementById('trd').onclick = function () { map.flyTo(trd, 10, {duration: 20}); }; document.getElementById('lnd').onclick = function () { map.flyTo(lnd, 9.25); }; document.getElementById('kyiv').onclick = function () { map.setView(kyiv, 9.25); }; diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index c32b88ad707..71db179d00f 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -142,6 +142,14 @@ describe("Map", function () { expect(map.setView([51.605, -0.11])).to.be(map); expect(map.getZoom()).to.be(13); }); + + it("passes duration option to panBy", function () { + map = L.map(document.createElement('div'), {zoom: 13, center: [0, 0]}); + map.panBy = sinon.spy(); + map.setView([51.605, -0.11], 13, {animate: true, duration: 13}); + expect(map.panBy.callCount).to.eql(1); + expect(map.panBy.args[0][1].duration).to.eql(13); + }); }); describe("#getBounds", function () { diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 37fc8b7b97e..411baf731e4 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -16,7 +16,7 @@ L.Map.include({ if (options.animate !== undefined) { options.zoom = L.extend({animate: options.animate}, options.zoom); - options.pan = L.extend({animate: options.animate}, options.pan); + options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan); } // try animating pan or zoom From 2191cfa8b035280215ab7dda0895e1abaa68e490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 12 Oct 2015 13:49:22 +0200 Subject: [PATCH 1888/2207] Better handling of Renderer positioning during pinch-zoom, fixes #3919 --- src/layer/vector/Renderer.js | 37 ++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 7c6d9d862eb..f5583b7cf62 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -36,21 +36,37 @@ L.Renderer = L.Layer.extend({ getEvents: function () { var events = { viewreset: this._reset, - zoom: this._updateTransform, + zoomstart: this._onZoomStart, + zoom: this._onZoom, moveend: this._update }; if (this._zoomAnimated) { - events.zoomanim = this._animateZoom; + events.zoomanim = this._onAnimZoom; } return events; }, - _animateZoom: function (e) { - var scale = this._map.getZoomScale(e.zoom, this._zoom), + _onAnimZoom: function (ev) { + this._updateTransform(ev.center, ev.zoom); + }, + + _onZoom: function () { + this._updateTransform(this._map.getCenter(), this._map.getZoom()); + }, + + _onZoomStart: function () { + // Drag-then-pinch interactions might mess up the center and zoom. + // In this case, the easiest way to prevent this is re-do the renderer + // bounds and padding when the zooming starts. + this._update(); + }, + + _updateTransform: function (center, zoom) { + var scale = this._map.getZoomScale(zoom, this._zoom), position = L.DomUtil.getPosition(this._container), viewHalf = this._map.getSize().multiplyBy(0.5 + this.options.padding), - currentCenterPoint = this._map.project(this._map.getCenter(), e.zoom), - destCenterPoint = this._map.project(e.center, e.zoom), + currentCenterPoint = this._map.project(this._center, zoom), + destCenterPoint = this._map.project(center, zoom), centerOffset = destCenterPoint.subtract(currentCenterPoint), topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset); @@ -58,16 +74,9 @@ L.Renderer = L.Layer.extend({ L.DomUtil.setTransform(this._container, topLeftOffset, scale); }, - _updateTransform: function () { - var zoom = this._map.getZoom(), - scale = this._map.getZoomScale(zoom, this._zoom); - - L.DomUtil.setTransform(this._container, this._map._getCenterOffset(this._center), scale); - }, - _reset: function () { this._update(); - this._updateTransform(); + this._updateTransform(this._center, this._zoom); }, _update: function () { From 9d10699bcd40bf2182d7a7455d5b32a864f5efc2 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 12 Oct 2015 14:33:32 +0200 Subject: [PATCH 1889/2207] Fix control layers scrolling on touch (fix #2882) --- src/control/Control.Layers.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index b107c51b9da..3d2ecb4ca9a 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -64,12 +64,9 @@ L.Control.Layers = L.Control.extend({ // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released container.setAttribute('aria-haspopup', true); + L.DomEvent.disableClickPropagation(container); if (!L.Browser.touch) { - L.DomEvent - .disableClickPropagation(container) - .disableScrollPropagation(container); - } else { - L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); + L.DomEvent.disableScrollPropagation(container); } var form = this._form = L.DomUtil.create('form', className + '-list'); From 514e27aa6f4d1c94926e57332369039cd801f878 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 12 Oct 2015 15:22:26 +0200 Subject: [PATCH 1890/2207] CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fff015bc35..b9454b3cad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,8 @@ Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vas * Fixed uncorrect length of scale control due to CSS styles (by [@yohanboniface](https://github.com/yohanboniface)) [#3668](https://github.com/Leaflet/Leaflet/issues/3668) * Fixed detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) [#3770](https://github.com/Leaflet/Leaflet/pull/3770) * Various Canvas events fixes (by [@yohanboniface](https://github.com/yohanboniface)) [#3917](https://github.com/Leaflet/Leaflet/pull/3917) +* Fix touch scroll in layers control (by [@yohanboniface](https://github.com/yohanboniface)) [#2882](https://github.com/Leaflet/Leaflet/issues/2882) +* Fix duration not passed through from setView to panBy (by [@yohanboniface](https://github.com/yohanboniface)) [#3300](https://github.com/Leaflet/Leaflet/issues/3300) ## 1.0-beta1 (July 14, 2015) From f75d80a626db4b178834dae210aea58e2b7a56e4 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 12 Oct 2015 17:11:50 +0200 Subject: [PATCH 1891/2207] Canvas: layer is removed later by this._draw (fix #3926) --- src/layer/vector/Canvas.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index d91c4443602..68014e860f7 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -61,7 +61,6 @@ L.Canvas = L.Renderer.extend({ _removePath: function (layer) { layer._removed = true; - delete this._layers[L.stamp(layer)]; this._requestRedraw(layer); }, From f793bea1aba66c1174dedf26883632183bcbed02 Mon Sep 17 00:00:00 2001 From: Dag Jomar Mersland Date: Tue, 13 Oct 2015 21:13:05 +0200 Subject: [PATCH 1892/2207] Add new plugin: VisualClick --- plugins.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/plugins.md b/plugins.md index c050799996e..b657d296582 100644 --- a/plugins.md +++ b/plugins.md @@ -2112,6 +2112,22 @@ These plugins extend Leaflet event handling. MazeMap + + + + Leaflet.VisualClick + + + Adds visual feedback when user clicks/taps the map (demo). + Useful when further action is delayed by server requests, or implmentation of Leaflet.singleclick. + Or just because it looks cool :) + Only tested withLeaflet 1.0.0-beta1. + + Dag Jomar Mersland, + Iván Sánchez Ortega, + MazeMap + + From fcd35e792146f673e535912a095a73ae7ba09297 Mon Sep 17 00:00:00 2001 From: Dave Leaver Date: Wed, 14 Oct 2015 10:25:08 +1300 Subject: [PATCH 1893/2207] Update plugins.md --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b657d296582..3e9e004e601 100644 --- a/plugins.md +++ b/plugins.md @@ -2121,7 +2121,7 @@ These plugins extend Leaflet event handling. Adds visual feedback when user clicks/taps the map (demo). Useful when further action is delayed by server requests, or implmentation of Leaflet.singleclick. Or just because it looks cool :) - Only tested withLeaflet 1.0.0-beta1. + Only tested with Leaflet 1.0.0-beta1. Dag Jomar Mersland, Iván Sánchez Ortega, From 2de112b8f861f98aad5733d377183d2f295434e4 Mon Sep 17 00:00:00 2001 From: Dave Leaver Date: Wed, 14 Oct 2015 10:25:25 +1300 Subject: [PATCH 1894/2207] Update plugins.md --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 3e9e004e601..5510fa89099 100644 --- a/plugins.md +++ b/plugins.md @@ -2119,7 +2119,7 @@ These plugins extend Leaflet event handling. Adds visual feedback when user clicks/taps the map (demo). - Useful when further action is delayed by server requests, or implmentation of Leaflet.singleclick. + Useful when further action is delayed by server requests, or implementation of Leaflet.singleclick. Or just because it looks cool :) Only tested with Leaflet 1.0.0-beta1. From 9ebd2f03a023ae8b965fac3ecd9d0886790fd1b9 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 16:32:27 +0300 Subject: [PATCH 1895/2207] update changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9454b3cad5..c196c162bcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,13 @@ Leaflet Changelog An in-progress version being developed on the `master` branch. -## 1.0-beta2 (date TBC) +## 1.0-beta2 (October 14, 2015) Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vast majority of changes are small fixes to problems that are triggered in very specific situations or conditions, a few API consolidation changes, and a few browser workarounds. ### API changes -* Make `L.Circle` and `L.CircleMarker` radius options consistent (by [@IvanSanchez](https://github.com/IvanSanchez)) + +* `L.circle` now accepts `radius` as an option (like `L.circleMarker`) rather than a second argument (by [@IvanSanchez](https://github.com/IvanSanchez)) ### Improvements From 80960fe9e79181c081e6c3b56f520e5364de0b4e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 16:44:21 +0300 Subject: [PATCH 1896/2207] add the now missing phantomjs dep --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index fe03a47a9a6..03dd900504c 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "karma-safari-launcher": "~0.1.1", "magic-string": "^0.7.0", "mocha": "~2.3.0", + "phantomjs": "^1.9.18", "tin": "^0.5.0", "uglify-js": "~2.4.23" }, From 213c602f4e0bd288c76c87036a0ed9e1c61ca7c4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 17:56:50 +0300 Subject: [PATCH 1897/2207] new Travis configuration with automatic releases --- .travis.yml | 24 +++++++++++++++++++++--- build/publish.sh | 32 ++++++-------------------------- package.json | 4 ++-- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/.travis.yml b/.travis.yml index 95d3e84fe3f..b53e3da675a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ addons: paths: - dist target_paths: - - content/build/${TRAVIS_BRANCH} + - content/leaflet/${NAME} env: global: - ARTIFACTS_BUCKET=leafletjs-cdn @@ -19,5 +19,23 @@ env: XW1hzORAtSpTgTKkQwel5gRMDy6SotzeSRsVV2jQCn46VIMx8G/J5nOI+ImL yeoH12PhCR0h39dM7mq8TYJo5DHwvbotI5nQhpMruSt8eMFbym8nGiqQh806 fSJXkxmQ4MAjUdNFDIirBHhdZme8q3PueFzJ+5odFMvPGn/aITQ= -after_success: > - cd dist && zip -x .DS_Store -r leaflet.zip . +after_success: + - npm run release + - NAME=$TRAVIS_BRANCH + - "[[ $TRAVIS_PULL_REQUEST != 'false' ]] && NAME=$TRAVIS_PULL_REQUEST" + - "[[ -n $TRAVIS_TAG ]] && NAME=$TRAVIS_TAG" +deploy: + provider: releases + api_key: + secure: JrqxB0Ed8TO2Aoy3Rcp7JS3O799b7qDKEYvdekEgCVmUyRa9Gd4/cSpDbUdlTSnlBS42pqIImar9V5tTT1A6ygcDZBKJnAdfUGCNxz5JDiVqd8HwHbqA2/m/jEUt34+i5yzVLZo4RR7Zvyiq0wPSBBvP9EvphBhrx6vHlb0M2Vg= + file: + - "dist/leaflet.js" + - "dist/leaflet-src.js" + - "bower.json" + - "component.json" + skip_cleanup: true + on: + tags: true + repo: Leaflet/Leaflet + after_deploy: + - npm publish diff --git a/build/publish.sh b/build/publish.sh index bbac38ab93c..b29c2f10044 100755 --- a/build/publish.sh +++ b/build/publish.sh @@ -1,31 +1,11 @@ #!/bin/bash -#make sure deps are up to date -rm -r node_modules -npm install +VERSION=$(node --eval "console.log(require('./package.json').version);") -# get current version - VERSION=$(node --eval "console.log(require('./package.json').version);") -# Build -git checkout -b build -npm test || exit 1 -npm run prepublish -git add dist/leaflet-src.js dist/leaflet.js -f +# # create build, zip, bower and component artifacts +npm run build -# create the bower and component files -copyfiles -u 1 build/*.json ./ -tin -v $VERSION -git add component.json bower.json -f - -git commit -m "build $VERSION" - -# Tag and push -echo git tag $VERSION -# git push --tags git@github.com:leaflet/leaflet.git $VERSION +cd dist && zip -x .DS_Store -r leaflet.zip . && cd .. -# # # Publish JS modules -# npm publish - -# # # Cleanup -# git checkout master -# git branch -D build \ No newline at end of file +# cp build/*.json ./ +tin -v $VERSION diff --git a/package.json b/package.json index 03dd900504c..3a30508947f 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "style": "dist/leaflet.css", "scripts": { "test": "jake test", - "prepublish": "jake build", - "publish": "./build/publish.sh" + "build": "jake build", + "release": "./build/publish.sh" }, "repository": { "type": "git", From d9917fa240eded905b19db8f34293444d17b8844 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 18:28:31 +0300 Subject: [PATCH 1898/2207] tag npm publish with beta --- .npmignore | 1 + .travis.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.npmignore b/.npmignore index 3626a32c3a5..2549faa6974 100644 --- a/.npmignore +++ b/.npmignore @@ -7,3 +7,4 @@ tmp/**/* *.sublime-* _site coverage/ +dist/leaflet.zip diff --git a/.travis.yml b/.travis.yml index b53e3da675a..8feeec887d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,4 +38,4 @@ deploy: tags: true repo: Leaflet/Leaflet after_deploy: - - npm publish + - npm publish --tag beta From 857848fbeeb0d23b5cccef6e38f3781505bbf811 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 18:29:48 +0300 Subject: [PATCH 1899/2207] come back to the old publishing approach with improvements --- .travis.yml | 22 ++++------------------ build/publish.sh | 23 +++++++++++++++++++---- package.json | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8feeec887d0..4c8336c380c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,22 +20,8 @@ env: yeoH12PhCR0h39dM7mq8TYJo5DHwvbotI5nQhpMruSt8eMFbym8nGiqQh806 fSJXkxmQ4MAjUdNFDIirBHhdZme8q3PueFzJ+5odFMvPGn/aITQ= after_success: - - npm run release + - npm run build + - cd dist && zip -x .DS_Store -r leaflet.zip . && cd .. - NAME=$TRAVIS_BRANCH - - "[[ $TRAVIS_PULL_REQUEST != 'false' ]] && NAME=$TRAVIS_PULL_REQUEST" - - "[[ -n $TRAVIS_TAG ]] && NAME=$TRAVIS_TAG" -deploy: - provider: releases - api_key: - secure: JrqxB0Ed8TO2Aoy3Rcp7JS3O799b7qDKEYvdekEgCVmUyRa9Gd4/cSpDbUdlTSnlBS42pqIImar9V5tTT1A6ygcDZBKJnAdfUGCNxz5JDiVqd8HwHbqA2/m/jEUt34+i5yzVLZo4RR7Zvyiq0wPSBBvP9EvphBhrx6vHlb0M2Vg= - file: - - "dist/leaflet.js" - - "dist/leaflet-src.js" - - "bower.json" - - "component.json" - skip_cleanup: true - on: - tags: true - repo: Leaflet/Leaflet - after_deploy: - - npm publish --tag beta + - '[[ $TRAVIS_PULL_REQUEST != ''false'' ]] && NAME=$TRAVIS_PULL_REQUEST' + - '[[ -n $TRAVIS_TAG ]] && NAME=$TRAVIS_TAG' diff --git a/build/publish.sh b/build/publish.sh index b29c2f10044..f91291c4a08 100755 --- a/build/publish.sh +++ b/build/publish.sh @@ -1,11 +1,26 @@ #!/bin/bash +npm update + VERSION=$(node --eval "console.log(require('./package.json').version);") -# # create build, zip, bower and component artifacts -npm run build +npm test || exit 1 -cd dist && zip -x .DS_Store -r leaflet.zip . && cd .. +git checkout -b build + +npm run build +git add dist/leaflet-src.js dist/leaflet.js dist/leaflet-src.map -f -# cp build/*.json ./ +copyfiles -u 1 build/*.json ./ tin -v $VERSION +git add component.json bower.json -f + +git commit -m "v$VERSION" + +git tag v$VERSION -f +git push --tags -f + +npm publish --tag beta + +git checkout master +git branch -D build diff --git a/package.json b/package.json index 3a30508947f..587a0735147 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet", - "version": "1.0.0-beta.2", + "version": "1.0.0-beta.2.rc.2", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.2.1", From 55fe46250828d54d95cac0b8ca8b7a21dd97dbeb Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 19:17:05 +0300 Subject: [PATCH 1900/2207] v1.0.0-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 587a0735147..3a30508947f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet", - "version": "1.0.0-beta.2.rc.2", + "version": "1.0.0-beta.2", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { "copyfiles": "0.2.1", From ad1593058239ca66e1af758e38bceb7f36a21f71 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 14 Oct 2015 18:35:21 +0200 Subject: [PATCH 1901/2207] Change beta links in download page --- download.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/download.md b/download.md index 542895e0cf3..4acaa7b26a0 100644 --- a/download.md +++ b/download.md @@ -16,8 +16,8 @@ bodyclass: download-page Stable version, released on November 18, 2013 and last updated on Sep 2, 2015. - Leaflet 1.0 beta 1 - Last 1.0 beta, released on July 14, 2015. + Leaflet 1.0 beta 2 + Last 1.0 beta, released on October 14, 2015. Leaflet 1.0-dev From acc0ad8d05499deb21d7c0d359a3b59fe43941c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 14 Oct 2015 19:28:48 +0200 Subject: [PATCH 1902/2207] Beta2 release blog post draft. --- .../2015-10-14-leaflet-1.0-beta2-released.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 _posts/2015-10-14-leaflet-1.0-beta2-released.md diff --git a/_posts/2015-10-14-leaflet-1.0-beta2-released.md b/_posts/2015-10-14-leaflet-1.0-beta2-released.md new file mode 100644 index 00000000000..b1a7c0c4eff --- /dev/null +++ b/_posts/2015-10-14-leaflet-1.0-beta2-released.md @@ -0,0 +1,37 @@ +--- +layout: post +title: Announcing Leaflet 1.0 beta 2 +description: Leaflet 1.0 beta 2 released, fixing over 50 bugs over the previous beta. +author: Iván Sánchez +authorsite: http://ivan.sanchezortega.es +--- + +Since the 1.0.0-beta1 release a couple months ago, the Leaflet team has been busy fixing bugs reported by users of beta1, plus a few small changes to the API that were overlooked previously. You can find the complete list of fixes and changes in the [1.0.0-beta2 changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md#10-beta2-october-14-2015) + + +### Get the new release + +As with previous releases, you can use our CDN: + + + + +The release is also available through NPM, Bower, and [GitHub download](https://github.com/Leaflet/Leaflet/archive/v1.0.0-beta.2.zip). + +The API reference for 1.0 is still temporarily [available here](http://mourner.github.io/Leaflet/reference.html) + +### The future + +Work is not yet done, though. There will probably be a beta3, sporting bugfixes in the tile loading algorithm, API methods for fractional zoom and documentation improvements, among other pending items. + +We hope to have fixed the most problematic bugs in the previous beta, but maybe there is a bug that we are not aware of. We encourage users of 1.0.0-beta1 to upgrade to beta2 and keep reporting problems. + +Help us help you by taking a minute to learn [how to write a good bug report](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html), and check if a [similar issue](https://github.com/Leaflet/Leaflet/issues) has already been reported. Or better even, dive into the Leaflet code if you can! + + +Last but not least, huge thanks to everybody using Leaflet. Keep creating great maps! + + +Best, + +Iván & Vladimir & Yohan. From 3f782fa73d7bd48378694c2f385ca148ffd6d2fd Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Wed, 14 Oct 2015 14:33:24 -0300 Subject: [PATCH 1903/2207] Add Leaflet.GlobeMiniMap to plugins page --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 5510fa89099..d18998789dd 100644 --- a/plugins.md +++ b/plugins.md @@ -1894,6 +1894,15 @@ Display two maps at once. One of them might be a different size and zoom level, Jieter + + + Leaflet.GlobeMiniMap + + Simple minimap control that places a 3D Globe in the corner of your map, centered on the same location as the main map. + + Chris Whong + + From 1897108ebddf3c65280b61c3c878c0b2fe17271e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 21:24:56 +0300 Subject: [PATCH 1904/2207] add a note to plugin developers --- _posts/2015-10-14-leaflet-1.0-beta2-released.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/_posts/2015-10-14-leaflet-1.0-beta2-released.md b/_posts/2015-10-14-leaflet-1.0-beta2-released.md index b1a7c0c4eff..8225aa027c1 100644 --- a/_posts/2015-10-14-leaflet-1.0-beta2-released.md +++ b/_posts/2015-10-14-leaflet-1.0-beta2-released.md @@ -6,8 +6,7 @@ author: Iván Sánchez authorsite: http://ivan.sanchezortega.es --- -Since the 1.0.0-beta1 release a couple months ago, the Leaflet team has been busy fixing bugs reported by users of beta1, plus a few small changes to the API that were overlooked previously. You can find the complete list of fixes and changes in the [1.0.0-beta2 changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md#10-beta2-october-14-2015) - +Since the 1.0.0-beta1 release a couple months ago, the Leaflet team has been busy fixing bugs reported by users of beta1, plus a few small changes to the API that were overlooked previously. You can find the complete list of fixes and changes in the [1.0.0-beta2 changelog](https://github.com/Leaflet/Leaflet/blob/master/CHANGELOG.md#10-beta2-october-14-2015). ### Get the new release @@ -18,7 +17,7 @@ As with previous releases, you can use our CDN: The release is also available through NPM, Bower, and [GitHub download](https://github.com/Leaflet/Leaflet/archive/v1.0.0-beta.2.zip). -The API reference for 1.0 is still temporarily [available here](http://mourner.github.io/Leaflet/reference.html) +The API reference for 1.0 is still temporarily [available here](http://mourner.github.io/Leaflet/reference.html). ### The future @@ -28,10 +27,9 @@ We hope to have fixed the most problematic bugs in the previous beta, but maybe Help us help you by taking a minute to learn [how to write a good bug report](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html), and check if a [similar issue](https://github.com/Leaflet/Leaflet/issues) has already been reported. Or better even, dive into the Leaflet code if you can! - Last but not least, huge thanks to everybody using Leaflet. Keep creating great maps! +**Note to plugin developers**: we encourage you to upgrade your plugins to be compatible with the latest beta release. The 1.0 API is pretty stable at this point and many users are starting to use the beta version in production. Additionally, as 1.0 final release approaches, we want to get more serious about the quality of plugins that get [on the official list](http://leafletjs.com/plugins.html), making sure they're maintained and compatible with recent Leaflet releases. Best, - Iván & Vladimir & Yohan. From 0e3403baf2b63f792ad2913e92563a23429c853a Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 14 Oct 2015 21:58:44 +0300 Subject: [PATCH 1905/2207] add a note about npm command to install beta --- _posts/2015-10-14-leaflet-1.0-beta2-released.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2015-10-14-leaflet-1.0-beta2-released.md b/_posts/2015-10-14-leaflet-1.0-beta2-released.md index 8225aa027c1..a492d395b8e 100644 --- a/_posts/2015-10-14-leaflet-1.0-beta2-released.md +++ b/_posts/2015-10-14-leaflet-1.0-beta2-released.md @@ -15,7 +15,7 @@ As with previous releases, you can use our CDN: -The release is also available through NPM, Bower, and [GitHub download](https://github.com/Leaflet/Leaflet/archive/v1.0.0-beta.2.zip). +The release is also available through NPM (`npm install leaflet@beta`), Bower, and [GitHub download](https://github.com/Leaflet/Leaflet/archive/v1.0.0-beta.2.zip). The API reference for 1.0 is still temporarily [available here](http://mourner.github.io/Leaflet/reference.html). From ace08c17ca5b0859a892e239b551d842d24e1f57 Mon Sep 17 00:00:00 2001 From: Jonas Coch Date: Thu, 15 Oct 2015 17:21:22 +0200 Subject: [PATCH 1906/2207] Only check for moving draggable in canvas renderer when map is draggable --- src/layer/vector/Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 68014e860f7..b4cc9f3d280 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -215,7 +215,7 @@ L.Canvas = L.Renderer.extend({ }, _onMouseMove: function (e) { - if (!this._map || this._map.dragging._draggable._moving || this._map._animatingZoom) { return; } + if (!this._map || (this._map.dragging._enabled && this._map.dragging._draggable._moving) || this._map._animatingZoom) { return; } var point = this._map.mouseEventToLayerPoint(e); this._handleMouseOut(e, point); From b0d5c12b50816dbbe94643a329094772d2426d96 Mon Sep 17 00:00:00 2001 From: Jonas Coch Date: Thu, 15 Oct 2015 20:44:17 +0200 Subject: [PATCH 1907/2207] Add moving() method to MapDrag handler --- src/map/handler/Map.Drag.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 73c0f768436..44cf40ea2b0 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -49,6 +49,10 @@ L.Map.Drag = L.Handler.extend({ return this._draggable && this._draggable._moved; }, + moving: function () { + return this._draggable && this._draggable._moving; + }, + _onDown: function () { this._map.stop(); }, From 0df4d57f911a38e1e5ed9fec828c8cc3b419f7b1 Mon Sep 17 00:00:00 2001 From: Jonas Coch Date: Thu, 15 Oct 2015 20:45:23 +0200 Subject: [PATCH 1908/2207] Use moving() method to simplify check in canvas renderer --- src/layer/vector/Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index b4cc9f3d280..3831388568b 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -215,7 +215,7 @@ L.Canvas = L.Renderer.extend({ }, _onMouseMove: function (e) { - if (!this._map || (this._map.dragging._enabled && this._map.dragging._draggable._moving) || this._map._animatingZoom) { return; } + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; } var point = this._map.mouseEventToLayerPoint(e); this._handleMouseOut(e, point); From e6e165869f82507769a5f6a67542825758b9855f Mon Sep 17 00:00:00 2001 From: Jonas Coch Date: Fri, 16 Oct 2015 13:27:53 +0200 Subject: [PATCH 1909/2207] Disable `_onZoomStart` in canvas renderer This fixes disappearing paths when starting an animated zoom. --- src/layer/vector/Canvas.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 3831388568b..91103dac769 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -25,6 +25,8 @@ L.Canvas = L.Renderer.extend({ this._ctx = container.getContext('2d'); }, + _onZoomStart: L.Util.falseFn, + _update: function () { if (this._map._animatingZoom && this._bounds) { return; } From 3e0067fab7d593c18c4cf14630099049e3175db2 Mon Sep 17 00:00:00 2001 From: Jonas Coch Date: Fri, 16 Oct 2015 20:32:44 +0200 Subject: [PATCH 1910/2207] Split renderer events and use `zoomstart` only in SVG renderer --- src/layer/vector/Canvas.js | 2 -- src/layer/vector/Renderer.js | 8 -------- src/layer/vector/SVG.js | 13 +++++++++++++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 91103dac769..3831388568b 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -25,8 +25,6 @@ L.Canvas = L.Renderer.extend({ this._ctx = container.getContext('2d'); }, - _onZoomStart: L.Util.falseFn, - _update: function () { if (this._map._animatingZoom && this._bounds) { return; } diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index f5583b7cf62..11495cbe2ea 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -36,7 +36,6 @@ L.Renderer = L.Layer.extend({ getEvents: function () { var events = { viewreset: this._reset, - zoomstart: this._onZoomStart, zoom: this._onZoom, moveend: this._update }; @@ -54,13 +53,6 @@ L.Renderer = L.Layer.extend({ this._updateTransform(this._map.getCenter(), this._map.getZoom()); }, - _onZoomStart: function () { - // Drag-then-pinch interactions might mess up the center and zoom. - // In this case, the easiest way to prevent this is re-do the renderer - // bounds and padding when the zooming starts. - this._update(); - }, - _updateTransform: function (center, zoom) { var scale = this._map.getZoomScale(zoom, this._zoom), position = L.DomUtil.getPosition(this._container), diff --git a/src/layer/vector/SVG.js b/src/layer/vector/SVG.js index eea40c78c60..3adcb665100 100644 --- a/src/layer/vector/SVG.js +++ b/src/layer/vector/SVG.js @@ -4,6 +4,12 @@ L.SVG = L.Renderer.extend({ + getEvents: function () { + var events = L.Renderer.prototype.getEvents.call(this); + events.zoomstart = this._onZoomStart; + return events; + }, + _initContainer: function () { this._container = L.SVG.create('svg'); @@ -14,6 +20,13 @@ L.SVG = L.Renderer.extend({ this._container.appendChild(this._rootGroup); }, + _onZoomStart: function () { + // Drag-then-pinch interactions might mess up the center and zoom. + // In this case, the easiest way to prevent this is re-do the renderer + // bounds and padding when the zooming starts. + this._update(); + }, + _update: function () { if (this._map._animatingZoom && this._bounds) { return; } From d7b721877cf42fd37fa03e08398ec0b5cee579c8 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 17 Oct 2015 22:42:17 +0200 Subject: [PATCH 1911/2207] First naive L.Label version --- .gitignore | 3 +- build/deps.js | 11 ++ debug/map/label.html | 52 +++++++++ dist/leaflet.css | 58 ++++++++++ src/layer/Label.js | 114 ++++++++++++++++++++ src/layer/Layer.Label.js | 164 ++++++++++++++++++++++++++++ src/layer/Popup.js | 179 +++++-------------------------- src/layer/PopupBase.js | 166 ++++++++++++++++++++++++++++ src/layer/marker/Icon.Default.js | 1 + src/layer/marker/Marker.Label.js | 9 ++ src/map/Map.js | 1 + 11 files changed, 605 insertions(+), 153 deletions(-) create mode 100644 debug/map/label.html create mode 100644 src/layer/Label.js create mode 100644 src/layer/Layer.Label.js create mode 100644 src/layer/PopupBase.js create mode 100644 src/layer/marker/Marker.Label.js diff --git a/.gitignore b/.gitignore index 3e1080a7c14..f36b2c008c0 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ coverage/ index.html .mailmap bower.json -component.json \ No newline at end of file +component.json +debug/local/ diff --git a/build/deps.js b/build/deps.js index b493e7dd8f1..f266cd00ec0 100644 --- a/build/deps.js +++ b/build/deps.js @@ -69,6 +69,7 @@ var deps = { Popup: { src: [ + 'layer/PopupBase.js', 'layer/Popup.js', 'layer/Layer.Popup.js', 'layer/marker/Marker.Popup.js' @@ -77,6 +78,16 @@ var deps = { desc: 'Used to display the map popup (used mostly for binding HTML data to markers and paths on click).' }, + Label: { + src: [ + 'layer/Label.js', + 'layer/Layer.Label.js', + 'layer/marker/Marker.Label.js' + ], + deps: ['Popup', 'Marker'], + desc: 'Used to display the map popup (used mostly for binding HTML data to markers and paths on click).' + }, + LayerGroup: { src: ['layer/LayerGroup.js'], desc: 'Allows grouping several layers to handle them as one.' diff --git a/debug/map/label.html b/debug/map/label.html new file mode 100644 index 00000000000..d3a7707606e --- /dev/null +++ b/debug/map/label.html @@ -0,0 +1,52 @@ + + + + Leaflet debug page + + + + + + + + + + + +
          + + + + + diff --git a/dist/leaflet.css b/dist/leaflet.css index 7cb3a32273d..1dd36d38ef1 100644 --- a/dist/leaflet.css +++ b/dist/leaflet.css @@ -74,6 +74,7 @@ .leaflet-overlay-pane { z-index: 400; } .leaflet-shadow-pane { z-index: 500; } .leaflet-marker-pane { z-index: 600; } +.leaflet-label-pane { z-index: 650; } .leaflet-popup-pane { z-index: 700; } .leaflet-map-pane canvas { z-index: 100; } @@ -507,3 +508,60 @@ background: #fff; border: 1px solid #666; } + + +/* Label */ +.leaflet-label { + background: rgb(235, 235, 235); + background: rgba(235, 235, 235, 0.81); + background-clip: padding-box; + border-color: #777; + border-color: rgba(0,0,0,0.25); + border-radius: 4px; + border-style: solid; + border-width: 4px; + color: #111; + display: block; + font: 12px/20px "Helvetica Neue", Arial, Helvetica, sans-serif; + font-weight: bold; + padding: 1px 6px; + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + white-space: nowrap; + z-index: 6; +} + +.leaflet-label.leaflet-clickable { + cursor: pointer; + pointer-events: auto; +} + +.leaflet-label:before, +.leaflet-label:after { + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + content: none; + position: absolute; + top: 5px; +} + +.leaflet-label:before { + border-right: 6px solid black; + border-right-color: inherit; + left: -10px; +} + +.leaflet-label:after { + border-left: 6px solid black; + border-left-color: inherit; + right: -10px; +} + +.leaflet-label-right:before, +.leaflet-label-left:after { + content: ""; +} diff --git a/src/layer/Label.js b/src/layer/Label.js new file mode 100644 index 00000000000..572ef823b9b --- /dev/null +++ b/src/layer/Label.js @@ -0,0 +1,114 @@ +/* + * L.Label is used for displaying small texts on the map. + */ + +L.Label = L.PopupBase.extend({ + + options: { + pane: 'labelPane', + offset: [12, -15], + direction: 'right', + static: false, // Reserved word, use "permanent" instead? + followMouse: false, + clickable: false, + // className: '', + zoomAnimation: true + }, + + openOn: function (map) { + map.openLabel(this); + return this; + }, + + _close: function () { + if (this._map) { + this._map.closeLabel(this); + } + }, + + _initLayout: function () { + var prefix = 'leaflet-label', + className = prefix + ' ' + (this.options.className || '') + ' leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + this._contentNode = this._container = L.DomUtil.create('div', className); + }, + + _updateLayout: function () {}, + + _adjustPan: function () {}, + + _updatePosition: function () { + var map = this._map, + pos = map.latLngToLayerPoint(this._latlng), + container = this._container, + centerPoint = map.latLngToContainerPoint(map.getCenter()), + labelPoint = map.layerPointToContainerPoint(pos), + direction = this.options.direction, + labelWidth = container.offsetWidth, + offset = L.point(this.options.offset); + + // position to the right (right or auto & needs to) + if (direction === 'right' || direction === 'auto' && labelPoint.x < centerPoint.x) { + L.DomUtil.addClass(container, 'leaflet-label-right'); + L.DomUtil.removeClass(container, 'leaflet-label-left'); + + // if (!this._zoomAnimated) { pos = pos.add(offset); } + pos = pos.add(offset); + } else { // position to the left + L.DomUtil.addClass(container, 'leaflet-label-left'); + L.DomUtil.removeClass(container, 'leaflet-label-right'); + + pos = pos.add(L.point(-offset.x - labelWidth, offset.y)); + } + + L.DomUtil.setPosition(container, pos); + }, + + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._container) { + L.DomUtil.setOpacity(this._container, opacity); + } + }, + + _animateZoom: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center), offset; + if (this.options.offset) { + offset = L.point(this.options.offset); + pos = pos.add(offset); + } + L.DomUtil.setPosition(this._container, pos); + } + +}); + +L.label = function (options, source) { + return new L.Label(options, source); +}; + + +L.Map.include({ + openLabel: function (label, latlng, options) { + if (!(label instanceof L.Label)) { + label = new L.Label(options).setContent(label); + } + + if (latlng) { + label.setLatLng(latlng); + } + + if (this.hasLayer(label)) { + return this; + } + + return this.addLayer(label); + }, + + closeLabel: function (label) { + if (label) { + this.removeLayer(label); + } + return this; + } +}); diff --git a/src/layer/Layer.Label.js b/src/layer/Layer.Label.js new file mode 100644 index 00000000000..89ba379fab9 --- /dev/null +++ b/src/layer/Layer.Label.js @@ -0,0 +1,164 @@ +/* + * Adds label-related methods to all layers. + */ + +L.Layer.include({ + + bindLabel: function (content, options) { + + if (content instanceof L.Label) { + L.setOptions(content, options); + this._label = content; + content._source = this; + } else { + if (!this._label || options) { + this._label = L.label(options, this); + } + this._label.setContent(content); + } + + this._initLabelInteractions(); + + if (this._label.options.static) { this.openLabel(); } + + // save the originally passed offset + this._originalLabelOffset = this._label.options.offset; + + return this; + }, + + unbindLabel: function () { + if (this._label) { + this._initLabelInteractions(true); + this._label = null; + } + return this; + }, + + _initLabelInteractions: function (remove) { + if (!remove && this._labelHandlersAdded) { return; } + var onOff = remove ? 'off' : 'on', + events = { + remove: this.closeLabel, + move: this._moveLabel + }; + if (!this._label.options.static) { + events.mouseover = this._openLabel; + events.mouseout = this.closeLabel; + if (this._label.options.followMouse) { + events.mousemove = this._moveLabel; + } + if (L.Browser.touch) { + events.click = this._openLabel; + } + } + this[onOff](events); + this._labelHandlersAdded = !remove; + }, + + openLabel: function (layer, latlng) { + if (!(layer instanceof L.Layer)) { + latlng = layer; + layer = this; + } + + if (layer instanceof L.FeatureGroup) { + for (var id in this._layers) { + layer = this._layers[id]; + break; + } + } + + if (!latlng) { + latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); + } + + if (this._label && this._map) { + // set the label offset for this layer + this._label.options.offset = this._labelAnchor(layer); + + // set label source to this layer + this._label._source = layer; + + // update the label (content, layout, ect...) + this._label.update(); + + // open the label on the map + this._map.openLabel(this._label, latlng); + + if (this._label.options.clickable) { + L.DomUtil.addClass(this._label._container, 'leaflet-clickable'); + this.addInteractiveTarget(this._label._container); + } + } + + return this; + }, + + closeLabel: function () { + if (this._label) { + this._label._close(); + if (this._label.options.clickable) { + L.DomUtil.removeClass(this._label._container, 'leaflet-clickable'); + this.removeInteractiveTarget(this._label._container); + } + } + return this; + }, + + toggleLabel: function (target) { + if (this._label) { + if (this._label._map) { + this.closeLabel(); + } else { + this.openLabel(target); + } + } + return this; + }, + + isLabelOpen: function () { + return this._label.isOpen(); + }, + + setLabelContent: function (content) { + if (this._label) { + this._label.setContent(content); + } + return this; + }, + + getLabel: function () { + return this._label; + }, + + _openLabel: function (e) { + var layer = e.layer || e.target; + + if (!this._label || !this._map) { + return; + } + this.openLabel(layer, this._label.options.followMouse ? e.latlng : undefined); + }, + + _labelAnchor: function (layer) { + // where shold we anchor the label on this layer? + var anchor = layer._getLabelAnchor && !this._label.options.followMouse ? layer._getLabelAnchor() : [0, 0]; + + // add the users passed offset to that + var offsetToAdd = this._originalLabelOffset || L.Label.prototype.options.offset; + + // return the final point to anchor the label + return L.point(anchor).add(offsetToAdd); + }, + + _moveLabel: function (e) { + var latlng = e.latlng, containerPoint, layerPoint; + if (this._label.options.followMouse && e.originalEvent) { + containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent); + layerPoint = this._map.containerPointToLayerPoint(containerPoint); + latlng = this._map.layerPointToLatLng(layerPoint); + } + this._label.setLatLng(latlng); + } +}); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index bfcbfe2e388..3c31f00e7bd 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -6,7 +6,7 @@ L.Map.mergeOptions({ closePopupOnClick: true }); -L.Popup = L.Layer.extend({ +L.Popup = L.PopupBase.extend({ options: { pane: 'popupPane', @@ -28,132 +28,22 @@ L.Popup = L.Layer.extend({ zoomAnimation: true }, - initialize: function (options, source) { - L.setOptions(this, options); - - this._source = source; - }, - - onAdd: function (map) { - this._zoomAnimated = this._zoomAnimated && this.options.zoomAnimation; - - if (!this._container) { - this._initLayout(); - } - - if (map._fadeAnimated) { - L.DomUtil.setOpacity(this._container, 0); - } - - clearTimeout(this._removeTimeout); - this.getPane().appendChild(this._container); - this.update(); - - if (map._fadeAnimated) { - L.DomUtil.setOpacity(this._container, 1); - } - - map.fire('popupopen', {popup: this}); - - if (this._source) { - this._source.fire('popupopen', {popup: this}, true); - } - }, - - openOn: function (map) { - map.openPopup(this); - return this; - }, - - onRemove: function (map) { - if (map._fadeAnimated) { - L.DomUtil.setOpacity(this._container, 0); - this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200); - } else { - L.DomUtil.remove(this._container); - } - - map.fire('popupclose', {popup: this}); - - if (this._source) { - this._source.fire('popupclose', {popup: this}, true); - } - }, - - getLatLng: function () { - return this._latlng; - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - if (this._map) { - this._updatePosition(); - this._adjustPan(); - } - return this; - }, - - getContent: function () { - return this._content; - }, - - setContent: function (content) { - this._content = content; - this.update(); - return this; - }, - - getElement: function () { - return this._container; - }, - - update: function () { - if (!this._map) { return; } - - this._container.style.visibility = 'hidden'; - - this._updateContent(); - this._updateLayout(); - this._updatePosition(); - - this._container.style.visibility = ''; - - this._adjustPan(); - }, - getEvents: function () { - var events = { - zoom: this._updatePosition, - viewreset: this._updatePosition - }; + var events = L.PopupBase.prototype.getEvents.call(this); - if (this._zoomAnimated) { - events.zoomanim = this._animateZoom; - } if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { events.preclick = this._close; } + if (this.options.keepInView) { events.moveend = this._adjustPan; } - return events; - }, - - isOpen: function () { - return !!this._map && this._map.hasLayer(this); - }, - bringToFront: function () { - if (this._map) { - L.DomUtil.toFront(this._container); - } - return this; + return events; }, - bringToBack: function () { - if (this._map) { - L.DomUtil.toBack(this._container); - } + openOn: function (map) { + map.openPopup(this); return this; }, @@ -189,21 +79,24 @@ L.Popup = L.Layer.extend({ this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); }, - _updateContent: function () { - if (!this._content) { return; } + _updatePosition: function () { + if (!this._map) { return; } - var node = this._contentNode; - var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content; + var pos = this._map.latLngToLayerPoint(this._latlng), + offset = L.point(this.options.offset); - if (typeof content === 'string') { - node.innerHTML = content; + if (this._zoomAnimated) { + L.DomUtil.setPosition(this._container, pos); } else { - while (node.hasChildNodes()) { - node.removeChild(node.firstChild); - } - node.appendChild(content); + offset = offset.add(pos); } - this.fire('contentupdate'); + + var bottom = this._containerBottom = -offset.y, + left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; + + // bottom position the popup in case the height of the popup changes (images loading etc) + this._container.style.bottom = bottom + 'px'; + this._container.style.left = left + 'px'; }, _updateLayout: function () { @@ -236,31 +129,6 @@ L.Popup = L.Layer.extend({ this._containerWidth = this._container.offsetWidth; }, - _updatePosition: function () { - if (!this._map) { return; } - - var pos = this._map.latLngToLayerPoint(this._latlng), - offset = L.point(this.options.offset); - - if (this._zoomAnimated) { - L.DomUtil.setPosition(this._container, pos); - } else { - offset = offset.add(pos); - } - - var bottom = this._containerBottom = -offset.y, - left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; - - // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = bottom + 'px'; - this._container.style.left = left + 'px'; - }, - - _animateZoom: function (e) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center); - L.DomUtil.setPosition(this._container, pos); - }, - _adjustPan: function () { if (!this.options.autoPan || (this._map._panAnim && this._map._panAnim._inProgress)) { return; } @@ -304,7 +172,14 @@ L.Popup = L.Layer.extend({ _onCloseButtonClick: function (e) { this._close(); L.DomEvent.stop(e); + }, + + + _animateZoom: function (e) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, e.zoom, e.center); + L.DomUtil.setPosition(this._container, pos); } + }); L.popup = function (options, source) { diff --git a/src/layer/PopupBase.js b/src/layer/PopupBase.js new file mode 100644 index 00000000000..26fa3eb30ee --- /dev/null +++ b/src/layer/PopupBase.js @@ -0,0 +1,166 @@ +/* + * L.Popup is used for displaying popups on the map. + */ + +L.Map.mergeOptions({ + closePopupOnClick: true +}); + +L.PopupBase = L.Layer.extend({ + + options: { + minWidth: 50, + maxWidth: 300, + // maxHeight: , + offset: [0, 7], + + autoPan: true, + autoPanPadding: [5, 5], + // autoPanPaddingTopLeft: , + // autoPanPaddingBottomRight: , + + closeButton: true, + autoClose: true, + // keepInView: false, + // className: '', + zoomAnimation: true + }, + + initialize: function (options, source) { + L.setOptions(this, options); + + this._source = source; + }, + + onAdd: function (map) { + this._zoomAnimated = this._zoomAnimated && this.options.zoomAnimation; + + if (!this._container) { + this._initLayout(); + } + + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 0); + } + + clearTimeout(this._removeTimeout); + this.getPane().appendChild(this._container); + this.update(); + + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 1); + } + + this.bringToFront(); + + map.fire('popupopen', {popup: this}); + + if (this._source) { + this._source.fire('popupopen', {popup: this}, true); + } + }, + + onRemove: function (map) { + if (map._fadeAnimated) { + L.DomUtil.setOpacity(this._container, 0); + this._removeTimeout = setTimeout(L.bind(L.DomUtil.remove, L.DomUtil, this._container), 200); + } else { + L.DomUtil.remove(this._container); + } + + map.fire('popupclose', {popup: this}); + + if (this._source) { + this._source.fire('popupclose', {popup: this}, true); + } + }, + + getLatLng: function () { + return this._latlng; + }, + + setLatLng: function (latlng) { + this._latlng = L.latLng(latlng); + if (this._map) { + this._updatePosition(); + this._adjustPan(); + } + return this; + }, + + getContent: function () { + return this._content; + }, + + setContent: function (content) { + this._content = content; + this.update(); + return this; + }, + + getElement: function () { + return this._container; + }, + + update: function () { + if (!this._map) { return; } + + this._container.style.visibility = 'hidden'; + + this._updateContent(); + this._updateLayout(); + this._updatePosition(); + + this._container.style.visibility = ''; + + this._adjustPan(); + }, + + getEvents: function () { + var events = { + zoom: this._updatePosition, + viewreset: this._updatePosition + }; + + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + return events; + }, + + isOpen: function () { + return !!this._map && this._map.hasLayer(this); + }, + + bringToFront: function () { + if (this._map) { + L.DomUtil.toFront(this._container); + } + return this; + }, + + bringToBack: function () { + if (this._map) { + L.DomUtil.toBack(this._container); + } + return this; + }, + + _updateContent: function () { + if (!this._content) { return; } + + var node = this._contentNode; + var content = (typeof this._content === 'function') ? this._content(this._source || this) : this._content; + + if (typeof content === 'string') { + node.innerHTML = content; + } else { + while (node.hasChildNodes()) { + node.removeChild(node.firstChild); + } + node.appendChild(content); + } + this.fire('contentupdate'); + } + +}); diff --git a/src/layer/marker/Icon.Default.js b/src/layer/marker/Icon.Default.js index 6eeca7bdcca..90c401f4596 100644 --- a/src/layer/marker/Icon.Default.js +++ b/src/layer/marker/Icon.Default.js @@ -8,6 +8,7 @@ L.Icon.Default = L.Icon.extend({ iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], + labelAnchor: [9, -20], shadowSize: [41, 41] }, diff --git a/src/layer/marker/Marker.Label.js b/src/layer/marker/Marker.Label.js new file mode 100644 index 00000000000..368ed8297bd --- /dev/null +++ b/src/layer/marker/Marker.Label.js @@ -0,0 +1,9 @@ +/* + * Label extension to L.Marker, adding label-related methods. + */ + +L.Marker.include({ + _getLabelAnchor: function () { + return this.options.icon.options.labelAnchor || [0, 0]; + } +}); diff --git a/src/map/Map.js b/src/map/Map.js index 6495ae1d819..b074ff99399 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -519,6 +519,7 @@ L.Map = L.Evented.extend({ this.createPane('shadowPane'); this.createPane('overlayPane'); this.createPane('markerPane'); + this.createPane('labelPane'); this.createPane('popupPane'); if (!this.options.markerZoomAnimation) { From b685d22eee7436380cf245506885adbcd32832d8 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 18 Oct 2015 09:43:04 +0200 Subject: [PATCH 1912/2207] Add popup in label debug page --- debug/map/label.html | 2 +- src/layer/Popup.js | 1 - src/layer/PopupBase.js | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debug/map/label.html b/debug/map/label.html index d3a7707606e..1c999c94869 100644 --- a/debug/map/label.html +++ b/debug/map/label.html @@ -34,7 +34,7 @@ L.polygon([[41.20, 9.41], [41.20, 9.39], [41.21, 9.40]]).addTo(map).bindLabel('Polygon label following mouse', {followMouse: true}); L.polygon([[41.18, 9.42], [41.17, 9.40], [41.19, 9.38]]).addTo(map).bindLabel('Permanent polygon label', {static: true}); L.marker([41.20, 9.4307]).addTo(map).bindLabel('label on the left', {direction: 'left'}); - L.marker([41.206, 9.44]).addTo(map).bindLabel('permanent label', {static: true}); + L.marker([41.206, 9.44]).addTo(map).bindLabel('click me, I have a popup', {static: true, clickable: true}).bindPopup('See?'); L.circleMarker([41.206, 9.48], {color: "Chocolate", radius: 12}).bindLabel( "Hello Left World", {direction: 'left'}).addTo(map); var icon = L.divIcon({ className: 'my-div-icon', diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 3c31f00e7bd..2a8320f020e 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -9,7 +9,6 @@ L.Map.mergeOptions({ L.Popup = L.PopupBase.extend({ options: { - pane: 'popupPane', minWidth: 50, maxWidth: 300, diff --git a/src/layer/PopupBase.js b/src/layer/PopupBase.js index 26fa3eb30ee..89dc28877ad 100644 --- a/src/layer/PopupBase.js +++ b/src/layer/PopupBase.js @@ -9,6 +9,8 @@ L.Map.mergeOptions({ L.PopupBase = L.Layer.extend({ options: { + pane: 'popupPane', + minWidth: 50, maxWidth: 300, // maxHeight: , From 015534b1827d624f356fc61f43907d79fef4156e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D4=B1=D5=AC=D5=A5=D6=84=D5=BD=D5=A1=D5=B6=D5=A4=D6=80=20?= =?UTF-8?q?=D4=B1=D5=BC=D5=A1=D6=84=D5=A5=D5=AC=D5=B5=D5=A1=D5=B6?= Date: Sun, 18 Oct 2015 19:29:49 +0300 Subject: [PATCH 1913/2207] leaflet-layer-tree-plugin: Leaflet plugin allows to switch layers on and off, display then in a tree-like way --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index d18998789dd..b224ec39fba 100644 --- a/plugins.md +++ b/plugins.md @@ -1604,6 +1604,15 @@ The following plugins enhance or extend `L.Control.Layers`. Alexander Zverev + + + Leafet.LayerTreePlugin + + Leaflet control allows to switch layers on and off, display them in a tree-like way (demo). + + Alexander Arakelyan + + From d901a5fc072882b76fefa6edd1456a229b2471ca Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Mon, 19 Oct 2015 21:39:04 +0200 Subject: [PATCH 1914/2207] Fix interactive=false not taken into account for canvas (fix #3946) --- spec/suites/layer/vector/CanvasSpec.js | 23 +++++++++++++++++++++++ src/layer/vector/Canvas.js | 7 ++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/spec/suites/layer/vector/CanvasSpec.js b/spec/suites/layer/vector/CanvasSpec.js index 13627fac97f..39c45e9b6ea 100644 --- a/spec/suites/layer/vector/CanvasSpec.js +++ b/spec/suites/layer/vector/CanvasSpec.js @@ -75,4 +75,27 @@ describe('Canvas', function () { }); + describe("#events(interactive=false)", function () { + var layer; + + beforeEach(function () { + layer = L.polygon(latLngs, {interactive: false}).addTo(map); + }); + + afterEach(function () { + layer.remove(); + }); + + it("should not fire click when not interactive", function () { + var spy = sinon.spy(); + layer.on('click', spy); + happen.at('click', 50, 50); // Click on the layer. + expect(spy.callCount).to.eql(0); + happen.at('click', 150, 150); // Click outside layer. + expect(spy.callCount).to.eql(0); + layer.off("click", spy); + }); + + }); + }); diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index 3831388568b..db190fb7406 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -201,12 +201,13 @@ L.Canvas = L.Renderer.extend({ // so we emulate that by calculating what's under the mouse on mousemove/click manually _onClick: function (e) { - var point = this._map.mouseEventToLayerPoint(e), layers = []; + var point = this._map.mouseEventToLayerPoint(e), layers = [], layer; for (var id in this._layers) { - if (this._layers[id]._containsPoint(point)) { + layer = this._layers[id]; + if (layer.options.interactive && layer._containsPoint(point)) { L.DomEvent._fakeStop(e); - layers.push(this._layers[id]); + layers.push(layer); } } if (layers.length) { From a969d204766a1275ac362f76e64358d5e920194b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 20 Oct 2015 10:24:33 +0200 Subject: [PATCH 1915/2207] DomEvent.getWheelDelta() now aware of WheelEvent.deltaMode --- src/dom/DomEvent.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js index bfba206b617..5ac369fb49b 100644 --- a/src/dom/DomEvent.js +++ b/src/dom/DomEvent.js @@ -182,9 +182,13 @@ L.DomEvent = { }, getWheelDelta: function (e) { - return e.deltaY ? -e.deltaY : - e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 40 : - e.detail ? -e.detail : 0; + return (e.deltaY && e.deltaMode === 0) ? -e.deltaY : // Pixels + (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 18 : // Lines + (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 52 : // Pages + e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels + (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 18 : // Legacy Moz lines + e.detail ? e.detail / -32765 * 52 : // Legacy Moz pages + 0; }, _skipEvents: {}, From c117fab709355adc7898172af5a728baee511c29 Mon Sep 17 00:00:00 2001 From: Martin Delille Date: Wed, 21 Oct 2015 19:12:55 +0200 Subject: [PATCH 1916/2207] fix typing error --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 67cd41b76f1..1073296b5dd 100644 --- a/reference.html +++ b/reference.html @@ -5458,7 +5458,7 @@

          Methods

          LineUtil

          -

          Various utility functions for polyine points processing, used by Leaflet internally to make polylines lightning-fast.

          +

          Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast.

          Methods

          From 82ab24c7f87f8aec0be144735e365c155efeee2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 23 Oct 2015 13:48:10 +0200 Subject: [PATCH 1917/2207] Add plugin Leaflet.Polyline.SnakeAnim --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index b224ec39fba..a7f1eb33137 100644 --- a/plugins.md +++ b/plugins.md @@ -1001,6 +1001,16 @@ These plugins animate markers or some geometries. See also [geometries with time Brian Reavis + + + Leaflet.Polyline.SnakeAnim + + Animates (poly)lines into existence, as if they were being slowly drawn from start to end. + + Iván Sánchez Ortega, + MazeMap + + From b397293dfdb77cec1c0008260faa37d7825dfa26 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 25 Oct 2015 10:06:34 -0500 Subject: [PATCH 1918/2207] Remove unused/obsolete CloudMade globals --- _layouts/v2.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/_layouts/v2.html b/_layouts/v2.html index c93b718f407..152c8e5f33b 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -41,10 +41,6 @@ + + {% if page.css %}{% endif %} diff --git a/examples/choropleth-example.html b/examples/choropleth-example.html index 8bd916a424b..002364c2db9 100644 --- a/examples/choropleth-example.html +++ b/examples/choropleth-example.html @@ -6,7 +6,7 @@ - + - - -
          -

          Leaflet Build Helper

          - -

          - Select All | - Deselect All -

          - -
            - -

            Building using Node and UglifyJS

            -
              -
            1. Download and install Node
            2. -
            3. Run this in the command line:
              -
              npm install -g jake
              -npm install
            4. -
            5. Run this command inside the Leaflet directory:
              -
            -
            - - - - diff --git a/build/build.js b/build/build.js deleted file mode 100644 index ad364fc002b..00000000000 --- a/build/build.js +++ /dev/null @@ -1,188 +0,0 @@ -var fs = require('fs'), - jshint = require('jshint'), - UglifyJS = require('uglify-js'), - zlib = require('zlib'), - - deps = require('./deps.js').deps; - -function getFiles(compsBase32) { - var memo = {}, - comps; - - if (compsBase32) { - comps = parseInt(compsBase32, 32).toString(2).split(''); - console.log('Managing dependencies...'); - } - - function addFiles(srcs) { - for (var j = 0, len = srcs.length; j < len; j++) { - memo[srcs[j]] = true; - } - } - - for (var i in deps) { - if (comps) { - if (parseInt(comps.pop(), 2) === 1) { - console.log(' * ' + i); - addFiles(deps[i].src); - } else { - console.log(' ' + i); - } - } else { - addFiles(deps[i].src); - } - } - - console.log(''); - - var files = []; - - for (var src in memo) { - files.push('src/' + src); - } - - return files; -} - -exports.getFiles = getFiles; - -function getSizeDelta(newContent, oldContent, fixCRLF) { - if (!oldContent) { - return ' (new)'; - } - if (newContent === oldContent) { - return ' (unchanged)'; - } - if (fixCRLF) { - newContent = newContent.replace(/\r\n?/g, '\n'); - oldContent = oldContent.replace(/\r\n?/g, '\n'); - } - var delta = newContent.length - oldContent.length; - - return delta === 0 ? '' : ' (' + (delta > 0 ? '+' : '') + delta + ' bytes)'; -} - -function loadSilently(path) { - try { - return fs.readFileSync(path, 'utf8'); - } catch (e) { - return null; - } -} - -function combineFiles(files) { - var content = ''; - for (var i = 0, len = files.length; i < len; i++) { - content += fs.readFileSync(files[i], 'utf8') + '\n\n'; - } - return content; -} - -function bytesToKB(bytes) { - return (bytes / 1024).toFixed(2) + ' KB'; -}; - -exports.build = function (callback, compsBase32, buildName) { - - var files = getFiles(compsBase32); - - console.log('Concatenating and compressing ' + files.length + ' files...'); - - var copy = fs.readFileSync('src/copyright.js', 'utf8'), - intro = '(function (window, document, undefined) {', - outro = '}(window, document));', - newSrc = copy + intro + combineFiles(files) + outro, - - pathPart = 'dist/leaflet' + (buildName ? '-' + buildName : ''), - srcPath = pathPart + '-src.js', - - oldSrc = loadSilently(srcPath), - srcDelta = getSizeDelta(newSrc, oldSrc, true); - - console.log('\tUncompressed: ' + bytesToKB(newSrc.length) + srcDelta); - - if (newSrc !== oldSrc) { - fs.writeFileSync(srcPath, newSrc); - console.log('\tSaved to ' + srcPath); - } - - var path = pathPart + '.js', - oldCompressed = loadSilently(path), - newCompressed = copy + UglifyJS.minify(newSrc, { - warnings: true, - fromString: true - }).code, - delta = getSizeDelta(newCompressed, oldCompressed); - - console.log('\tCompressed: ' + bytesToKB(newCompressed.length) + delta); - - var newGzipped, - gzippedDelta = ''; - - function done() { - if (newCompressed !== oldCompressed) { - fs.writeFileSync(path, newCompressed); - console.log('\tSaved to ' + path); - } - console.log('\tGzipped: ' + bytesToKB(newGzipped.length) + gzippedDelta); - callback(); - } - - zlib.gzip(newCompressed, function (err, gzipped) { - if (err) { return; } - newGzipped = gzipped; - if (oldCompressed && (oldCompressed !== newCompressed)) { - zlib.gzip(oldCompressed, function (err, oldGzipped) { - if (err) { return; } - gzippedDelta = getSizeDelta(gzipped, oldGzipped); - done(); - }); - } else { - done(); - } - }); -}; - -exports.test = function(callback) { - var karma = require('karma'), - testConfig = {configFile : __dirname + '/../spec/karma.conf.js'}; - - testConfig.browsers = ['PhantomJS']; - - function isArgv(optName) { - return process.argv.indexOf(optName) !== -1; - } - - if (isArgv('--chrome')) { - testConfig.browsers.push('Chrome'); - } - if (isArgv('--safari')) { - testConfig.browsers.push('Safari'); - } - if (isArgv('--ff')) { - testConfig.browsers.push('Firefox'); - } - if (isArgv('--ie')) { - testConfig.browsers.push('IE'); - } - - if (isArgv('--cov')) { - testConfig.preprocessors = { - '../src/**/*.js': 'coverage' - }; - testConfig.coverageReporter = { - type : 'html', - dir : 'coverage/' - }; - testConfig.reporters = ['coverage']; - } - - console.log('Running tests...'); - - karma.server.start(testConfig, function(exitCode) { - if (!exitCode) { - console.log('\tTests ran successfully.\n'); - } - callback(); - }); -}; diff --git a/build/deps.js b/build/deps.js deleted file mode 100644 index 5e37e0e21d4..00000000000 --- a/build/deps.js +++ /dev/null @@ -1,259 +0,0 @@ -var deps = { - Core: { - src: ['Leaflet.js', - 'core/Util.js', - 'core/Class.js', - 'core/Events.js', - 'core/Browser.js', - 'geometry/Point.js', - 'geometry/Bounds.js', - 'geometry/Transformation.js', - 'dom/DomUtil.js', - 'geo/LatLng.js', - 'geo/LatLngBounds.js', - 'geo/projection/Projection.js', - 'geo/projection/Projection.SphericalMercator.js', - 'geo/projection/Projection.LonLat.js', - 'geo/crs/CRS.js', - 'geo/crs/CRS.Simple.js', - 'geo/crs/CRS.EPSG3857.js', - 'geo/crs/CRS.EPSG4326.js', - 'map/Map.js'], - desc: 'The core of the library, including OOP, events, DOM facilities, basic units, projections (EPSG:3857 and EPSG:4326) and the base Map class.' - }, - - EPSG3395: { - src: ['geo/projection/Projection.Mercator.js', - 'geo/crs/CRS.EPSG3395.js'], - desc: 'EPSG:3395 projection (used by some map providers).', - heading: 'Additional projections' - }, - - TileLayer: { - src: ['layer/tile/TileLayer.js'], - desc: 'The base class for displaying tile layers on the map.', - heading: 'Layers' - }, - - TileLayerWMS: { - src: ['layer/tile/TileLayer.WMS.js'], - desc: 'WMS tile layer.', - deps: ['TileLayer'] - }, - - TileLayerCanvas: { - src: ['layer/tile/TileLayer.Canvas.js'], - desc: 'Tile layer made from canvases (for custom drawing purposes).', - deps: ['TileLayer'] - }, - - ImageOverlay: { - src: ['layer/ImageOverlay.js'], - desc: 'Used to display an image over a particular rectangular area of the map.' - }, - - Marker: { - src: ['layer/marker/Icon.js', - 'layer/marker/Icon.Default.js', - 'layer/marker/Marker.js'], - desc: 'Markers to put on the map.' - }, - - DivIcon: { - src: ['layer/marker/DivIcon.js'], - deps: ['Marker'], - desc: 'Lightweight div-based icon for markers.' - }, - - Popup: { - src: ['layer/Popup.js', - 'layer/marker/Marker.Popup.js'], - deps: ['Marker'], - desc: 'Used to display the map popup (used mostly for binding HTML data to markers and paths on click).' - }, - - LayerGroup: { - src: ['layer/LayerGroup.js'], - desc: 'Allows grouping several layers to handle them as one.' - }, - - FeatureGroup: { - src: ['layer/FeatureGroup.js'], - deps: ['LayerGroup', 'Popup'], - desc: 'Extends LayerGroup with mouse events and bindPopup method shared between layers.' - }, - - Path: { - src: ['layer/vector/Path.js', - 'layer/vector/Path.SVG.js', - 'layer/vector/Path.Popup.js'], - desc: 'Vector rendering core (SVG-powered), enables overlaying the map with SVG paths.', - heading: 'Vector layers' - }, - - PathVML: { - src: ['layer/vector/Path.VML.js'], - desc: 'VML fallback for vector rendering core (IE 6-8).' - }, - - PathCanvas: { - src: ['layer/vector/canvas/Path.Canvas.js'], - deps: ['Path', 'Polyline', 'Polygon', 'Circle'], - desc: 'Canvas fallback for vector rendering core (makes it work on Android 2+).' - }, - - Polyline: { - src: ['geometry/LineUtil.js', - 'layer/vector/Polyline.js'], - deps: ['Path'], - desc: 'Polyline overlays.' - }, - - Polygon: { - src: ['geometry/PolyUtil.js', - 'layer/vector/Polygon.js'], - deps: ['Polyline'], - desc: 'Polygon overlays.' - }, - - MultiPoly: { - src: ['layer/vector/MultiPoly.js'], - deps: ['FeatureGroup', 'Polyline', 'Polygon'], - desc: 'MultiPolygon and MultyPolyline layers.' - }, - - Rectangle: { - src: ['layer/vector/Rectangle.js'], - deps: ['Polygon'], - desc: ['Rectangle overlays.'] - }, - - Circle: { - src: ['layer/vector/Circle.js'], - deps: ['Path'], - desc: 'Circle overlays (with radius in meters).' - }, - - CircleMarker: { - src: ['layer/vector/CircleMarker.js'], - deps: ['Circle'], - desc: 'Circle overlays with a constant pixel radius.' - }, - - VectorsCanvas: { - src: ['layer/vector/canvas/Polyline.Canvas.js', - 'layer/vector/canvas/Polygon.Canvas.js', - 'layer/vector/canvas/Circle.Canvas.js', - 'layer/vector/canvas/CircleMarker.Canvas.js'], - deps: ['PathCanvas', 'Polyline', 'Polygon', 'Circle', 'CircleMarker'], - desc: 'Canvas fallback for vector layers (polygons, polylines, circles, circlemarkers)' - }, - - GeoJSON: { - src: ['layer/GeoJSON.js'], - deps: ['CircleMarker', 'Marker', 'MultiPoly', 'FeatureGroup'], - desc: 'GeoJSON layer, parses the data and adds corresponding layers above.' - }, - - - MapDrag: { - src: ['dom/DomEvent.js', - 'dom/Draggable.js', - 'core/Handler.js', - 'map/handler/Map.Drag.js'], - desc: 'Makes the map draggable (by mouse or touch).', - heading: 'Interaction' - }, - - MouseZoom: { - src: ['dom/DomEvent.js', - 'core/Handler.js', - 'map/handler/Map.DoubleClickZoom.js', - 'map/handler/Map.ScrollWheelZoom.js'], - desc: 'Scroll wheel zoom and double click zoom on the map.' - }, - - TouchZoom: { - src: ['dom/DomEvent.js', - 'dom/DomEvent.DoubleTap.js', - 'dom/DomEvent.Pointer.js', - 'core/Handler.js', - 'map/handler/Map.TouchZoom.js', - 'map/handler/Map.Tap.js'], - deps: ['AnimationZoom'], - desc: 'Enables smooth touch zoom / tap / longhold / doubletap on iOS, IE10, Android.' - }, - - BoxZoom: { - src: ['map/handler/Map.BoxZoom.js'], - desc: 'Enables zooming to bounding box by shift-dragging the map.' - }, - - Keyboard: { - src: ['map/handler/Map.Keyboard.js'], - desc: 'Enables keyboard pan/zoom when the map is focused.' - }, - - MarkerDrag: { - src: ['layer/marker/Marker.Drag.js'], - deps: ['Marker'], - desc: 'Makes markers draggable (by mouse or touch).' - }, - - ControlZoom: { - src: ['control/Control.js', - 'control/Control.Zoom.js'], - heading: 'Controls', - desc: 'Basic zoom control with two buttons (zoom in / zoom out).' - }, - - ControlAttrib: { - src: ['control/Control.js', - 'control/Control.Attribution.js'], - desc: 'Attribution control.' - }, - - ControlScale: { - src: ['control/Control.js', - 'control/Control.Scale.js'], - desc: 'Scale control.' - }, - - ControlLayers: { - src: ['control/Control.js', - 'control/Control.Layers.js'], - desc: 'Layer Switcher control.' - }, - - AnimationPan: { - src: [ - 'dom/DomEvent.js', - 'dom/PosAnimation.js', - 'map/anim/Map.PanAnimation.js' - ], - heading: 'Animation', - desc: 'Core panning animation support.' - }, - - AnimationTimer: { - src: ['dom/PosAnimation.Timer.js'], - deps: ['AnimationPan'], - desc: 'Timer-based pan animation fallback for browsers that don\'t support CSS3 transitions.' - }, - - AnimationZoom: { - src: ['map/anim/Map.ZoomAnimation.js', 'layer/tile/TileLayer.Anim.js'], - deps: ['AnimationPan'], - desc: 'Smooth zooming animation. Works only on browsers that support CSS3 Transitions.' - }, - - Geolocation: { - src: ['map/ext/Map.Geolocation.js'], - desc: 'Adds Map#locate method and related events to make geolocation easier.', - heading: 'Misc' - } -}; - -if (typeof exports !== 'undefined') { - exports.deps = deps; -} diff --git a/build/hintrc.js b/build/hintrc.js deleted file mode 100644 index 851591ad2d4..00000000000 --- a/build/hintrc.js +++ /dev/null @@ -1,39 +0,0 @@ -{ - // environment - "browser": true, - "node": true, - "globals": { - "L": true, - "define": true - }, - "strict": false, - - // code style - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "forin": false, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "undef": true, - "unused": true, - "quotmark": "single", - - // whitespace - "indent": 4, - "trailing": true, - "white": true, - "smarttabs": true, - "maxlen": 120 - - // code simplicity - not enforced but nice to check from time to time - // "maxstatements": 20, - // "maxcomplexity": 5 - // "maxparams": 4, - // "maxdepth": 4 -} diff --git a/debug/css/mobile.css b/debug/css/mobile.css deleted file mode 100644 index d8f46f32e7d..00000000000 --- a/debug/css/mobile.css +++ /dev/null @@ -1,6 +0,0 @@ -html, body, #map { - margin: 0; - padding: 0; - width: 100%; - height: 100%; -} \ No newline at end of file diff --git a/debug/css/screen.css b/debug/css/screen.css deleted file mode 100644 index f988698707e..00000000000 --- a/debug/css/screen.css +++ /dev/null @@ -1,5 +0,0 @@ -#map { - width: 800px; - height: 600px; - border: 1px solid #ccc; - } \ No newline at end of file diff --git a/debug/hacks/jitter.html b/debug/hacks/jitter.html deleted file mode 100644 index 1ec35a057a6..00000000000 --- a/debug/hacks/jitter.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - -
            -
            -
            Click in field then scroll map (in up/left direction) to see shift of map tiles. -
            : - -
            -
            - Bug tested to occur on: Safari on Mac (Tested in 5.1.7), iPad/iPhone 5.1.1., Android 4 Browser. Hack is in L.Browser.chrome and TileLayer._addTile - -
            - - - diff --git a/debug/leaflet-include.js b/debug/leaflet-include.js deleted file mode 100644 index ab06b3cd5bf..00000000000 --- a/debug/leaflet-include.js +++ /dev/null @@ -1,59 +0,0 @@ -(function() { - function getFiles() { - var memo = {}, - files = [], - i, src; - - function addFiles(srcs) { - for (var j = 0, len = srcs.length; j < len; j++) { - memo[srcs[j]] = true; - } - } - - for (i in deps) { - addFiles(deps[i].src); - } - - for (src in memo) { - files.push(src); - } - - return files; - } - var scripts = getFiles(); - - function getSrcUrl() { - var scripts = document.getElementsByTagName('script'); - for (var i = 0; i < scripts.length; i++) { - var src = scripts[i].src; - if (src) { - var res = src.match(/^(.*)leaflet-include\.js$/); - if (res) { - return res[1] + '../src/'; - } - } - } - } - - var path = getSrcUrl(); - for (var i = 0; i < scripts.length; i++) { - document.writeln(""); - } - document.writeln(''); -})(); - -function getRandomLatLng(map) { - var bounds = map.getBounds(), - southWest = bounds.getSouthWest(), - northEast = bounds.getNorthEast(), - lngSpan = northEast.lng - southWest.lng, - latSpan = northEast.lat - southWest.lat; - - return new L.LatLng( - southWest.lat + latSpan * Math.random(), - southWest.lng + lngSpan * Math.random()); -} - -function logEvent(e) { - console.log(e.type); -} diff --git a/debug/map/canvas.html b/debug/map/canvas.html deleted file mode 100644 index 1dad9f39a78..00000000000 --- a/debug/map/canvas.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - diff --git a/debug/map/controls.html b/debug/map/controls.html deleted file mode 100644 index b84adb62819..00000000000 --- a/debug/map/controls.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - diff --git a/debug/map/geolocation.html b/debug/map/geolocation.html deleted file mode 100644 index 7cc7d93f5fc..00000000000 --- a/debug/map/geolocation.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - Leaflet geolocation debug page - - - - - - - - - - - -
            - - - - diff --git a/debug/map/iframe.html b/debug/map/iframe.html deleted file mode 100644 index b1035aab62a..00000000000 --- a/debug/map/iframe.html +++ /dev/null @@ -1,11 +0,0 @@ - - \ No newline at end of file diff --git a/debug/map/image-overlay.html b/debug/map/image-overlay.html deleted file mode 100644 index 43790175d14..00000000000 --- a/debug/map/image-overlay.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - - diff --git a/debug/map/map-mobile.html b/debug/map/map-mobile.html deleted file mode 100644 index e9829c1c33d..00000000000 --- a/debug/map/map-mobile.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - diff --git a/debug/map/map.html b/debug/map/map.html deleted file mode 100644 index 6941ffd2a11..00000000000 --- a/debug/map/map.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - - diff --git a/debug/map/max-bounds.html b/debug/map/max-bounds.html deleted file mode 100644 index 7de4eac76f6..00000000000 --- a/debug/map/max-bounds.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - diff --git a/debug/map/opacity.html b/debug/map/opacity.html deleted file mode 100644 index 64dd5ec8d53..00000000000 --- a/debug/map/opacity.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -

            These should all render identically.

            -
            - CASE 1: no opacity set on any layers -
            -
            -
            -
            - CASE 2: opacity set to .99 on overlays but not on basemap -
            -
            -
            -
            - CASE 3: opacity set on overlays but not on basemap, zIndex option set to 0 on basemap -
            -
            -
            -
            - CASE 4: opacity set to .99 on overlays but set to 1 on basemap -
            -
            -
            -
            - CASE 5: opacity set to .99 on all layers -
            -
            -
            -
            - CASE 6: opacity set to .99 on 1st and 3rd layers and 1 on middle layer -
            -
            -
            - - - - diff --git a/debug/map/scroll.html b/debug/map/scroll.html deleted file mode 100644 index 5fcb7e2a69b..00000000000 --- a/debug/map/scroll.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            -
            -
            -
            -
            -
            -
            - - - - diff --git a/debug/map/simple-proj.html b/debug/map/simple-proj.html deleted file mode 100644 index e7e532aeaac..00000000000 --- a/debug/map/simple-proj.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - diff --git a/debug/map/wms-marble.html b/debug/map/wms-marble.html deleted file mode 100644 index 41703bc235e..00000000000 --- a/debug/map/wms-marble.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - diff --git a/debug/map/wms.html b/debug/map/wms.html deleted file mode 100644 index 278a2d1fa12..00000000000 --- a/debug/map/wms.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - diff --git a/debug/map/zoomlevels.html b/debug/map/zoomlevels.html deleted file mode 100644 index 87203bfba07..00000000000 --- a/debug/map/zoomlevels.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - diff --git a/debug/tests/add_remove_layers.html b/debug/tests/add_remove_layers.html deleted file mode 100644 index f89e5f9eae4..00000000000 --- a/debug/tests/add_remove_layers.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - - -
            -
            - - -
            - - diff --git a/debug/tests/bringtoback.html b/debug/tests/bringtoback.html deleted file mode 100644 index 1cca85c0f15..00000000000 --- a/debug/tests/bringtoback.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - - diff --git a/debug/tests/canvasloop.html b/debug/tests/canvasloop.html deleted file mode 100644 index d8a2ed41dec..00000000000 --- a/debug/tests/canvasloop.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - -
            - - - - - - - - - diff --git a/debug/tests/click_on_canvas.html b/debug/tests/click_on_canvas.html deleted file mode 100644 index db7c0375d2b..00000000000 --- a/debug/tests/click_on_canvas.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - - - - -
            - - diff --git a/debug/tests/click_on_canvas_broken.html b/debug/tests/click_on_canvas_broken.html deleted file mode 100644 index dbce2bed783..00000000000 --- a/debug/tests/click_on_canvas_broken.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - diff --git a/debug/tests/dragging_and_copyworldjump.html b/debug/tests/dragging_and_copyworldjump.html deleted file mode 100644 index d7ede358676..00000000000 --- a/debug/tests/dragging_and_copyworldjump.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Leaflet debug page - - - - - - - - - - - -

            - On the left Map dragging and worldCopyJump are enabled during initialisation.
            - On the right Map worldCopyJump is enabled. Dragging is enabled by clicking the button. -

            -
            -
            -
            -
            - - - - - diff --git a/debug/tests/opacity.html b/debug/tests/opacity.html deleted file mode 100644 index 940a6f3714d..00000000000 --- a/debug/tests/opacity.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - diff --git a/debug/tests/popupcontextmenuclicks.html b/debug/tests/popupcontextmenuclicks.html deleted file mode 100644 index 63698526efe..00000000000 --- a/debug/tests/popupcontextmenuclicks.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - - diff --git a/debug/tests/remove_while_dragging.html b/debug/tests/remove_while_dragging.html deleted file mode 100644 index 29911571510..00000000000 --- a/debug/tests/remove_while_dragging.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - diff --git a/debug/tests/removetilewhilepan.html b/debug/tests/removetilewhilepan.html deleted file mode 100644 index 97072c868c9..00000000000 --- a/debug/tests/removetilewhilepan.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - diff --git a/debug/tests/reuse_popups.html b/debug/tests/reuse_popups.html deleted file mode 100644 index d5a65ad7e7f..00000000000 --- a/debug/tests/reuse_popups.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - Leaflet debug page - - - - - - - - -
            - - - - diff --git a/debug/tests/rtl.html b/debug/tests/rtl.html deleted file mode 100644 index 6998652ba46..00000000000 --- a/debug/tests/rtl.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - - -

            Click the map to place a popup at the mouse location

            -
            - - - - diff --git a/debug/tests/rtl2.html b/debug/tests/rtl2.html deleted file mode 100644 index eaa4f635a0b..00000000000 --- a/debug/tests/rtl2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - -
            - - - diff --git a/debug/tests/set_icon_reuse_dom.html b/debug/tests/set_icon_reuse_dom.html deleted file mode 100644 index e8ee1cfb38f..00000000000 --- a/debug/tests/set_icon_reuse_dom.html +++ /dev/null @@ -1,43 +0,0 @@ - - -Test for preservation of Icon DOM element - - - - - - - - -
            - - - - diff --git a/debug/tests/svg_clicks.html b/debug/tests/svg_clicks.html deleted file mode 100644 index 11be258ecfd..00000000000 --- a/debug/tests/svg_clicks.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - diff --git a/debug/vector/bounds-extend.html b/debug/vector/bounds-extend.html deleted file mode 100644 index c0c2d105e78..00000000000 --- a/debug/vector/bounds-extend.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - -
            - - - - - - diff --git a/debug/vector/feature-group-bounds.html b/debug/vector/feature-group-bounds.html deleted file mode 100644 index 173e9c8fd65..00000000000 --- a/debug/vector/feature-group-bounds.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - - - - diff --git a/debug/vector/geojson-sample.js b/debug/vector/geojson-sample.js deleted file mode 100644 index 811bfbd953e..00000000000 --- a/debug/vector/geojson-sample.js +++ /dev/null @@ -1,53 +0,0 @@ -var geojsonSample = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [102.0, 0.5] - }, - "properties": { - "prop0": "value0", - "color": "blue" - } - }, - - { - "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]] - }, - "properties": { - "color": "red", - "prop1": 0.0 - } - }, - - { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]] - }, - "properties": { - "color": "green", - "prop1": { - "this": "that" - } - } - }, - - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [[[[100.0, 1.5], [100.5, 1.5], [100.5, 2.0], [100.0, 2.0], [100.0, 1.5]]], [[[100.5, 2.0], [100.5, 2.5], [101.0, 2.5], [101.0, 2.0], [100.5, 2.0]]]] - }, - "properties": { - "color": "#ff7800" - } - } - ] -}; \ No newline at end of file diff --git a/debug/vector/geojson.html b/debug/vector/geojson.html deleted file mode 100644 index c3f72e3629a..00000000000 --- a/debug/vector/geojson.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - - -
            - - - - - diff --git a/debug/vector/rectangle.html b/debug/vector/rectangle.html deleted file mode 100644 index c9179eb99d3..00000000000 --- a/debug/vector/rectangle.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - - diff --git a/debug/vector/route.js b/debug/vector/route.js deleted file mode 100644 index fa847e31d06..00000000000 --- a/debug/vector/route.js +++ /dev/null @@ -1 +0,0 @@ -var route = [[51.452339,-0.26291],[51.452011,-0.26479],[51.451839,-0.26624],[51.45187,-0.26706],[51.451881,-0.26733],[51.452049,-0.26734],[51.453098,-0.26734],[51.453838,-0.26717],[51.454849,-0.267],[51.45575,-0.26704],[51.45631,-0.26723],[51.456402,-0.26729],[51.456669,-0.26745],[51.45689,-0.26755],[51.457001,-0.26758],[51.45797,-0.26776],[51.458359,-0.26786],[51.459019,-0.26783],[51.459629,-0.26785],[51.459888,-0.26809],[51.460178,-0.26845],[51.46077,-0.26841],[51.461102,-0.26838],[51.461479,-0.2685],[51.46159,-0.26848],[51.462479,-0.26776],[51.462921,-0.26766],[51.463291,-0.26754],[51.463558,-0.26736],[51.46373,-0.26728],[51.464291,-0.26676],[51.464432,-0.26675],[51.464722,-0.26671],[51.464821,-0.2657],[51.46484,-0.2655],[51.464851,-0.26504],[51.46489,-0.26456],[51.464951,-0.26397],[51.464981,-0.26357],[51.46497,-0.26344],[51.465031,-0.26294],[51.46508,-0.26224],[51.465111,-0.26179],[51.46513,-0.26157],[51.465149,-0.261],[51.465149,-0.26077],[51.465149,-0.26051],[51.465149,-0.26011],[51.46513,-0.25982],[51.46513,-0.25955],[51.46513,-0.25929],[51.465111,-0.25872],[51.46513,-0.2583],[51.46513,-0.25771],[51.465141,-0.25753],[51.46516,-0.25675],[51.46516,-0.25658],[51.46516,-0.25647],[51.465179,-0.25574],[51.465191,-0.25525],[51.465199,-0.25486],[51.46521,-0.25455],[51.46521,-0.25413],[51.46524,-0.25293],[51.465229,-0.25186],[51.465191,-0.25085],[51.46513,-0.25001],[51.46508,-0.24926],[51.465069,-0.24862],[51.465111,-0.24775],[51.465149,-0.2472],[51.465172,-0.24675],[51.46524,-0.24571],[51.465279,-0.24482],[51.465321,-0.24423],[51.465229,-0.24372],[51.465149,-0.24266],[51.465118,-0.24208],[51.465069,-0.24147],[51.464939,-0.24028],[51.464821,-0.2395],[51.46476,-0.2389],[51.464729,-0.23852],[51.464642,-0.23755],[51.464569,-0.23693],[51.464481,-0.2365],[51.464371,-0.23557],[51.464211,-0.23437],[51.46418,-0.23421],[51.464001,-0.23334],[51.463959,-0.23316],[51.463829,-0.23253],[51.463779,-0.23235],[51.463699,-0.23189],[51.463661,-0.2317],[51.463589,-0.23136],[51.463539,-0.23106],[51.463402,-0.23025],[51.463341,-0.2299],[51.463249,-0.22924],[51.463139,-0.22838],[51.46312,-0.22823],[51.463001,-0.22726],[51.462959,-0.22698],[51.462891,-0.22645],[51.462769,-0.22551],[51.462761,-0.22516],[51.462681,-0.22436],[51.46262,-0.224],[51.462521,-0.22297],[51.462421,-0.22247],[51.462181,-0.22183],[51.462009,-0.22149],[51.461731,-0.22074],[51.461399,-0.2196],[51.461361,-0.21948],[51.46122,-0.21878],[51.461109,-0.21824],[51.460979,-0.2175],[51.460789,-0.21715],[51.46069,-0.21685],[51.460522,-0.21596],[51.4604,-0.21533],[51.460361,-0.21511],[51.460251,-0.21458],[51.46022,-0.2144],[51.460159,-0.21411],[51.460121,-0.21389],[51.46011,-0.2138],[51.459961,-0.21308],[51.459942,-0.21294],[51.459702,-0.21186],[51.459702,-0.21184],[51.45948,-0.21112],[51.459259,-0.21038],[51.459011,-0.20963],[51.45892,-0.2094],[51.458809,-0.2091],[51.458759,-0.20898],[51.45858,-0.20853],[51.458328,-0.20795],[51.458179,-0.2076],[51.458141,-0.20751],[51.458099,-0.20743],[51.457981,-0.2072],[51.45771,-0.20668],[51.4575,-0.20638],[51.457321,-0.20614],[51.45718,-0.20596],[51.457088,-0.20584],[51.456921,-0.20558],[51.456829,-0.20541],[51.456772,-0.20522],[51.45676,-0.20518],[51.456749,-0.20509],[51.45673,-0.20469],[51.456718,-0.20466],[51.456699,-0.20425],[51.456692,-0.20391],[51.456692,-0.20371],[51.456661,-0.20284],[51.456661,-0.20272],[51.456661,-0.20254],[51.456669,-0.20231],[51.456692,-0.20178],[51.456699,-0.20148],[51.45673,-0.20116],[51.45676,-0.20077],[51.45686,-0.19978],[51.45697,-0.19857],[51.457001,-0.19826],[51.457039,-0.19806],[51.45705,-0.19793],[51.457142,-0.19781],[51.457211,-0.19776],[51.45742,-0.19785],[51.45763,-0.19794],[51.45776,-0.19795],[51.457829,-0.19791],[51.45789,-0.19784],[51.458,-0.19751],[51.458172,-0.19697],[51.458271,-0.19654],[51.458439,-0.19585],[51.458599,-0.19507],[51.45863,-0.1949],[51.458729,-0.19437],[51.458809,-0.19394],[51.45892,-0.19318],[51.45892,-0.1926],[51.458839,-0.19206],[51.458858,-0.19189],[51.45887,-0.1917],[51.459049,-0.19117],[51.45916,-0.19078],[51.459148,-0.19065],[51.45908,-0.19055],[51.458679,-0.19041],[51.458511,-0.19034],[51.458271,-0.19026],[51.457939,-0.19013],[51.457329,-0.1899],[51.457199,-0.18985],[51.456829,-0.18972],[51.457069,-0.18858],[51.457142,-0.18824],[51.457211,-0.18785],[51.45731,-0.18732],[51.457581,-0.1857],[51.457649,-0.18525],[51.457878,-0.18476],[51.45797,-0.18457],[51.45829,-0.18387],[51.45866,-0.18305],[51.458771,-0.18276],[51.458801,-0.18269],[51.4589,-0.18243],[51.458981,-0.18222],[51.45911,-0.1819],[51.459229,-0.1815],[51.459358,-0.18094],[51.459431,-0.18064],[51.45956,-0.18014],[51.459518,-0.18],[51.459469,-0.17984],[51.45882,-0.1796],[51.458431,-0.17945],[51.458351,-0.17935],[51.458279,-0.17924],[51.458309,-0.17861],[51.458401,-0.17714],[51.458511,-0.17525],[51.45853,-0.17515],[51.45858,-0.17493],[51.458912,-0.17401],[51.459,-0.17374],[51.459179,-0.1732],[51.45929,-0.17292],[51.459461,-0.17245],[51.459579,-0.1721],[51.459919,-0.17123],[51.460232,-0.17037],[51.4604,-0.16967],[51.46048,-0.16947],[51.460579,-0.16882],[51.460751,-0.16781],[51.460838,-0.16703],[51.460781,-0.16653],[51.460819,-0.16599],[51.460831,-0.1658],[51.460869,-0.16534],[51.46088,-0.16485],[51.460899,-0.16431],[51.460979,-0.16321],[51.460999,-0.16296],[51.461021,-0.16268],[51.461021,-0.1625],[51.46104,-0.16213],[51.46106,-0.16186],[51.461151,-0.16126],[51.46122,-0.1602],[51.4613,-0.15897],[51.461319,-0.15819],[51.461281,-0.15716],[51.4613,-0.15642],[51.460049,-0.15658],[51.45993,-0.15658],[51.459759,-0.15659],[51.45969,-0.15658],[51.458931,-0.15604],[51.458172,-0.15538],[51.457878,-0.1551],[51.45742,-0.15465],[51.456821,-0.15379],[51.455681,-0.15134],[51.455528,-0.15098],[51.45475,-0.14926],[51.453999,-0.14742],[51.45401,-0.14732],[51.454159,-0.14628],[51.453369,-0.14419],[51.452862,-0.14297],[51.452332,-0.14222],[51.451832,-0.14213],[51.45174,-0.14214],[51.451328,-0.14212],[51.451099,-0.14197],[51.451012,-0.14191],[51.450729,-0.14134],[51.450691,-0.14118],[51.450489,-0.1404],[51.449871,-0.13813],[51.449799,-0.13787],[51.449539,-0.13695],[51.449261,-0.13612],[51.44915,-0.13577],[51.448811,-0.13476],[51.448502,-0.13383],[51.448391,-0.13351],[51.44833,-0.13332],[51.44812,-0.13277],[51.447861,-0.13189],[51.447609,-0.13092],[51.447552,-0.13067],[51.44735,-0.12992],[51.44717,-0.12935],[51.447071,-0.12885],[51.446991,-0.12862],[51.446972,-0.12857],[51.44685,-0.1282],[51.445992,-0.12606],[51.44511,-0.12436],[51.44492,-0.12368],[51.44487,-0.12353],[51.444752,-0.12276],[51.444721,-0.12266],[51.444641,-0.12243],[51.44453,-0.12213],[51.444389,-0.12187],[51.44434,-0.12167],[51.444118,-0.12058],[51.444012,-0.12013],[51.44371,-0.11895],[51.443531,-0.1182],[51.443489,-0.11803],[51.443451,-0.11786],[51.443371,-0.11758],[51.4431,-0.11661],[51.44276,-0.1158],[51.44212,-0.11491],[51.441689,-0.11427],[51.44138,-0.11364],[51.441151,-0.11289],[51.441101,-0.11274],[51.441059,-0.11257],[51.440651,-0.11082],[51.440578,-0.11025],[51.440392,-0.10871],[51.441078,-0.10854],[51.441441,-0.10829],[51.44109,-0.10701],[51.44101,-0.10662],[51.440941,-0.10626],[51.440929,-0.10578],[51.440891,-0.1052],[51.440762,-0.10446],[51.44051,-0.10355],[51.440441,-0.10333],[51.440189,-0.10274],[51.43964,-0.10179],[51.439461,-0.10091],[51.439339,-0.10016],[51.43935,-0.10003],[51.439339,-0.09909],[51.4394,-0.09832],[51.439548,-0.0979],[51.43969,-0.09752],[51.43985,-0.09727],[51.440189,-0.09671],[51.44043,-0.09609],[51.44046,-0.09599],[51.44072,-0.09489],[51.440948,-0.09397],[51.441071,-0.09291],[51.441101,-0.09183],[51.441109,-0.09137],[51.441109,-0.091],[51.441101,-0.09],[51.44104,-0.0892],[51.440861,-0.08854],[51.440891,-0.08813],[51.440979,-0.08768],[51.44173,-0.08473],[51.44183,-0.08436],[51.441891,-0.08413],[51.44191,-0.08401],[51.44199,-0.08292],[51.442089,-0.08137],[51.4422,-0.08036],[51.442242,-0.08006],[51.44228,-0.07963],[51.44231,-0.07934],[51.442451,-0.07843],[51.442551,-0.07765],[51.442669,-0.07675],[51.442982,-0.07507],[51.443298,-0.07406],[51.443489,-0.07357],[51.443562,-0.07321],[51.443569,-0.0728],[51.443489,-0.07209],[51.443359,-0.07099],[51.443119,-0.0694],[51.4431,-0.06915],[51.443089,-0.06894],[51.443138,-0.06811],[51.44318,-0.06783],[51.443199,-0.06772],[51.443291,-0.06757],[51.443069,-0.06722],[51.442532,-0.06649],[51.442421,-0.06637],[51.4422,-0.06613],[51.442059,-0.06597],[51.44186,-0.06575],[51.44178,-0.06567],[51.441761,-0.06555],[51.441269,-0.06498],[51.44112,-0.06465],[51.44104,-0.06435],[51.441021,-0.06425],[51.440948,-0.06408],[51.440609,-0.06253],[51.440601,-0.0622],[51.440559,-0.06188],[51.440552,-0.06152],[51.44054,-0.0609],[51.440529,-0.06047],[51.44051,-0.06015],[51.44051,-0.05982],[51.44054,-0.05915],[51.44054,-0.05889],[51.440552,-0.0586],[51.440552,-0.0584],[51.440472,-0.05796],[51.440361,-0.05765],[51.440239,-0.05739],[51.440109,-0.05707],[51.43969,-0.05579],[51.43924,-0.05458],[51.43911,-0.05418],[51.439049,-0.054],[51.439289,-0.05379],[51.439751,-0.0538],[51.440102,-0.05379],[51.440201,-0.05371],[51.440239,-0.05359],[51.440269,-0.05332],[51.4403,-0.05295],[51.440281,-0.05266],[51.440231,-0.05243],[51.440022,-0.05139],[51.43998,-0.05115],[51.440071,-0.0507],[51.440479,-0.04968],[51.440762,-0.04884],[51.44138,-0.04734],[51.442162,-0.04733],[51.442181,-0.04733],[51.442268,-0.04725],[51.442329,-0.04588],[51.442329,-0.04563],[51.44228,-0.04412],[51.442242,-0.04251],[51.44215,-0.04132],[51.44202,-0.03995],[51.442051,-0.03951],[51.442089,-0.03879],[51.442211,-0.03746],[51.442299,-0.03678],[51.442329,-0.03654],[51.442341,-0.03618],[51.442341,-0.03586],[51.442322,-0.03489],[51.442291,-0.03441],[51.442081,-0.03347],[51.441929,-0.03274],[51.441898,-0.03239],[51.441959,-0.03208],[51.442131,-0.03124],[51.442322,-0.03081],[51.442692,-0.02992],[51.4431,-0.02868],[51.443138,-0.028],[51.443169,-0.0276],[51.44323,-0.02698],[51.443352,-0.02683],[51.443741,-0.02636],[51.443851,-0.02623],[51.443932,-0.02613],[51.444221,-0.02538],[51.44455,-0.02409],[51.444618,-0.02361],[51.444691,-0.02308],[51.44479,-0.02226],[51.444801,-0.02197],[51.444809,-0.02115],[51.44487,-0.02082],[51.444939,-0.02056],[51.445019,-0.02034],[51.445122,-0.02013],[51.445229,-0.01994],[51.445431,-0.01983],[51.445969,-0.01957],[51.446129,-0.01946],[51.446072,-0.01873],[51.44595,-0.01764],[51.4459,-0.01725],[51.445709,-0.01584],[51.445511,-0.0145],[51.445339,-0.01315],[51.445068,-0.01105],[51.445068,-0.00916],[51.445068,-0.00897],[51.445099,-0.00713],[51.44511,-0.00561],[51.445099,-0.00474],[51.44508,-0.00345],[51.445122,-0.00221],[51.44516,-0.00109],[51.445171,0.00011],[51.44519,0.00135],[51.445202,0.00247],[51.445221,0.00356],[51.445278,0.00442],[51.445301,0.00467],[51.445389,0.00518],[51.44556,0.00565],[51.44558,0.00603],[51.44556,0.00663],[51.445572,0.00772],[51.445641,0.00859],[51.445679,0.00959],[51.445721,0.01089],[51.445801,0.0115],[51.445889,0.0127],[51.446159,0.01386],[51.446381,0.01466],[51.446609,0.0156],[51.447708,0.02026],[51.44775,0.02043],[51.448189,0.02234],[51.44825,0.02255],[51.448292,0.0227],[51.448441,0.0232],[51.448669,0.02399],[51.448879,0.02476],[51.44902,0.02536],[51.449089,0.02561],[51.44978,0.02794],[51.450119,0.02896],[51.450191,0.02912],[51.450249,0.02914],[51.450279,0.02917],[51.450298,0.0292],[51.450329,0.02924],[51.450352,0.02933],[51.450359,0.02943],[51.45034,0.02953],[51.450279,0.02964],[51.45023,0.02969],[51.450161,0.0297],[51.4501,0.02967],[51.450039,0.02965],[51.44997,0.02965],[51.44978,0.02972],[51.4492,0.02993],[51.44857,0.03013],[51.448021,0.03033],[51.44772,0.03043],[51.44696,0.03077],[51.446739,0.03084],[51.446419,0.03088],[51.44614,0.0309],[51.44577,0.03095],[51.445438,0.03104],[51.445148,0.03122],[51.444939,0.03145],[51.444721,0.03171],[51.444561,0.03193],[51.444401,0.03219],[51.444241,0.0325],[51.443958,0.03315],[51.443501,0.03425],[51.4431,0.03519],[51.442791,0.03597],[51.442471,0.03678],[51.44228,0.03729],[51.442131,0.0378],[51.441811,0.03879],[51.441368,0.04027],[51.441231,0.04084],[51.44101,0.04174],[51.440479,0.04412],[51.43972,0.04768],[51.439651,0.04802],[51.4394,0.04924],[51.439369,0.04944],[51.439178,0.05038],[51.43911,0.05061],[51.438999,0.05081],[51.438789,0.05132],[51.438568,0.05182],[51.438358,0.05242],[51.438179,0.05313],[51.43795,0.05417],[51.437191,0.05753],[51.436932,0.05848],[51.436871,0.05864],[51.43679,0.05888],[51.436581,0.0594],[51.435188,0.0627],[51.434921,0.0634],[51.43483,0.06364],[51.434711,0.06398],[51.43462,0.06424],[51.434502,0.06462],[51.43433,0.06534],[51.43401,0.06693],[51.43359,0.06872],[51.433361,0.0698],[51.43288,0.07194],[51.432598,0.07332],[51.432369,0.07429],[51.43206,0.07563],[51.431351,0.07868],[51.431042,0.07999],[51.430489,0.08221],[51.430351,0.08261],[51.430119,0.08312],[51.429951,0.08344],[51.429798,0.08367],[51.429409,0.08413],[51.42889,0.08458],[51.427738,0.08559],[51.426731,0.08656],[51.4259,0.08747],[51.424511,0.08901],[51.422531,0.09173],[51.421539,0.09321],[51.420368,0.09517],[51.418839,0.09795],[51.417141,0.10123],[51.416222,0.10311],[51.415829,0.10403],[51.415371,0.10513],[51.415119,0.10581],[51.41444,0.10769],[51.414009,0.10905],[51.413521,0.11098],[51.41264,0.11505],[51.412041,0.11826],[51.41124,0.12231],[51.410992,0.12349],[51.410671,0.12522],[51.410599,0.12554],[51.41003,0.12827],[51.409771,0.12976],[51.409649,0.13078],[51.409561,0.13171],[51.409512,0.13284],[51.4095,0.13436],[51.409489,0.13994],[51.409489,0.1408],[51.4095,0.14117],[51.409489,0.1419],[51.40947,0.14288],[51.409389,0.14418],[51.40921,0.14569],[51.409069,0.14648],[51.408932,0.14716],[51.408749,0.14788],[51.40852,0.14863],[51.408131,0.14982],[51.407532,0.15119],[51.40696,0.15228],[51.40654,0.15293],[51.406269,0.15334],[51.405628,0.15413],[51.4049,0.15499],[51.404308,0.15556],[51.404129,0.15573],[51.403271,0.15645],[51.402302,0.15709],[51.401112,0.15767],[51.399971,0.15804],[51.399109,0.15828],[51.398079,0.15855],[51.397049,0.15889],[51.396179,0.15931],[51.39547,0.1598],[51.39452,0.16056],[51.393681,0.1614],[51.392921,0.16234],[51.392551,0.16289],[51.39212,0.16354],[51.391571,0.16447],[51.39085,0.166],[51.390228,0.1678],[51.38979,0.16935],[51.389469,0.17106],[51.389259,0.1728],[51.389172,0.17438],[51.38916,0.17585],[51.389221,0.17702],[51.389542,0.18034],[51.38969,0.18225],[51.38974,0.18407],[51.38974,0.18552],[51.389679,0.18714],[51.38942,0.18934],[51.389172,0.19115],[51.38876,0.19339],[51.388161,0.196],[51.38747,0.19845],[51.38702,0.19998],[51.38678,0.20088],[51.38625,0.20298],[51.385509,0.20598],[51.38522,0.20735],[51.385052,0.20821],[51.38467,0.21019],[51.38448,0.21191],[51.384418,0.21259],[51.384392,0.21318],[51.38435,0.21409],[51.3843,0.21612],[51.384171,0.22142],[51.384029,0.22337],[51.383831,0.22515],[51.38345,0.22739],[51.383411,0.22763],[51.383362,0.22786],[51.382919,0.22983],[51.382351,0.23176],[51.38184,0.23328],[51.381142,0.23508],[51.380901,0.23562],[51.38076,0.23596],[51.38039,0.23683],[51.37867,0.24056],[51.377449,0.24298],[51.37598,0.2457],[51.375271,0.24696],[51.373531,0.24988],[51.37122,0.25339],[51.3703,0.2548],[51.36866,0.25733],[51.366501,0.26056],[51.365349,0.26232],[51.364361,0.26381],[51.3634,0.26522],[51.362431,0.26644],[51.361179,0.26788],[51.360851,0.26818],[51.360149,0.26885],[51.359001,0.26981],[51.357712,0.27082],[51.355461,0.27233],[51.3531,0.27363],[51.351528,0.27437],[51.349098,0.27529],[51.347988,0.27563],[51.346981,0.27589],[51.34605,0.27605],[51.3451,0.27615],[51.344181,0.27614],[51.343079,0.27607],[51.340969,0.27571],[51.340099,0.27544],[51.33886,0.27496],[51.336941,0.27424],[51.336651,0.27417],[51.335949,0.274],[51.334801,0.27373],[51.33308,0.27351],[51.33073,0.27348],[51.329079,0.27365],[51.327808,0.27388],[51.326462,0.2743],[51.32526,0.27495],[51.323929,0.27599],[51.322701,0.27727],[51.321671,0.27865],[51.32098,0.27987],[51.32074,0.28029],[51.319931,0.28203],[51.319359,0.28364],[51.318668,0.28581],[51.318241,0.28741],[51.317829,0.28888],[51.31641,0.29444],[51.315529,0.29828],[51.315029,0.30069],[51.314289,0.30436],[51.313911,0.30597],[51.31348,0.30744],[51.312672,0.30974],[51.311611,0.31285],[51.311081,0.31464],[51.31041,0.31727],[51.309399,0.32178],[51.308849,0.32467],[51.308479,0.32698],[51.308041,0.32987],[51.307991,0.33014],[51.307961,0.33033],[51.30772,0.33232],[51.307419,0.3351],[51.30714,0.33829],[51.306919,0.34202],[51.306789,0.34573],[51.30677,0.34766],[51.30682,0.35044],[51.306919,0.35324],[51.307178,0.35651],[51.307468,0.35934],[51.30772,0.36124],[51.308189,0.36418],[51.308651,0.36814],[51.308708,0.36896],[51.30883,0.37218],[51.30891,0.3746],[51.30888,0.37754],[51.30901,0.38345],[51.309071,0.38842],[51.309261,0.39099],[51.309601,0.39395],[51.309959,0.39628],[51.31065,0.40007],[51.310909,0.40133],[51.311081,0.40247],[51.311211,0.40348],[51.311432,0.40537],[51.311531,0.4067],[51.3116,0.40831],[51.311611,0.40987],[51.311581,0.41178],[51.311569,0.41225],[51.311539,0.41272],[51.311481,0.41354],[51.311359,0.41489],[51.311192,0.41651],[51.310768,0.41924],[51.310379,0.42111],[51.310101,0.42242],[51.309231,0.42526],[51.308262,0.42798],[51.30727,0.43082],[51.306931,0.43183],[51.30674,0.43252],[51.306149,0.4349],[51.305901,0.43603],[51.305679,0.43715],[51.305038,0.44058],[51.30397,0.44616],[51.303379,0.44947],[51.303249,0.45038],[51.303162,0.45112],[51.30302,0.45268],[51.302769,0.45542],[51.302471,0.45849],[51.30238,0.45939],[51.302231,0.46031],[51.30196,0.46153],[51.30164,0.46285],[51.300961,0.4654],[51.300701,0.46637],[51.300461,0.46734],[51.300289,0.46822],[51.300121,0.46922],[51.300011,0.47011],[51.299931,0.47089],[51.299831,0.47189],[51.29977,0.47257],[51.29966,0.47387],[51.299591,0.47437],[51.299549,0.47468],[51.299541,0.47477],[51.29948,0.47513],[51.299438,0.47536],[51.299339,0.47598],[51.29911,0.47691],[51.298889,0.47756],[51.298691,0.47816],[51.298359,0.47894],[51.298241,0.47919],[51.297661,0.48044],[51.296921,0.48235],[51.296581,0.48351],[51.296398,0.48429],[51.29623,0.48525],[51.29612,0.48602],[51.29599,0.48772],[51.295959,0.49028],[51.295971,0.49123],[51.296001,0.49224],[51.29607,0.4932],[51.296188,0.4943],[51.29636,0.49533],[51.296558,0.49635],[51.29673,0.49698],[51.297211,0.49875],[51.297371,0.49922],[51.297459,0.49954],[51.297871,0.50098],[51.29808,0.50212],[51.298248,0.50355],[51.298351,0.50497],[51.298569,0.50858],[51.29879,0.51282],[51.298901,0.51441],[51.298969,0.51558],[51.29903,0.51657],[51.29908,0.51737],[51.29911,0.51794],[51.29911,0.51862],[51.299091,0.51915],[51.299,0.51987],[51.298908,0.52049],[51.298809,0.52116],[51.29863,0.52195],[51.298359,0.52297],[51.298168,0.52345],[51.297852,0.52421],[51.297489,0.52491],[51.29665,0.52623],[51.29557,0.52804],[51.29483,0.52931],[51.29427,0.53038],[51.292782,0.53339],[51.292221,0.53459],[51.291859,0.53532],[51.291599,0.53592],[51.291191,0.53707],[51.291019,0.53768],[51.290722,0.53911],[51.29047,0.54019],[51.290291,0.54093],[51.290131,0.54148],[51.28989,0.54226],[51.28923,0.544],[51.288582,0.54589],[51.288429,0.54636],[51.28828,0.54689],[51.288181,0.54746],[51.28804,0.54834],[51.287949,0.54936],[51.28791,0.55003],[51.287922,0.55088],[51.287971,0.55186],[51.288029,0.55306],[51.2882,0.55569],[51.28828,0.55696],[51.2883,0.55782],[51.288212,0.56001],[51.288101,0.56193],[51.28796,0.56383],[51.287762,0.56577],[51.287579,0.56706],[51.287361,0.56836],[51.286812,0.57094],[51.28624,0.57306],[51.285789,0.57454],[51.285332,0.57591],[51.284599,0.57786],[51.284061,0.57915],[51.283489,0.58035],[51.282799,0.58177],[51.28257,0.58224],[51.282299,0.58279],[51.280529,0.58595],[51.278931,0.58872],[51.277351,0.5914],[51.276951,0.59208],[51.275421,0.59477],[51.273571,0.59799],[51.271709,0.60145],[51.270592,0.60341],[51.270481,0.6036],[51.269989,0.60445],[51.269489,0.60531],[51.26915,0.60589],[51.268242,0.60747],[51.266701,0.60995],[51.26535,0.61188],[51.264179,0.61357],[51.263302,0.61501],[51.262489,0.6163],[51.261459,0.61795],[51.261311,0.61822],[51.261169,0.6185],[51.261051,0.61878],[51.260929,0.61903],[51.26062,0.61976],[51.260448,0.62018],[51.260201,0.6208],[51.259079,0.62382],[51.258289,0.62644],[51.25795,0.62747],[51.257641,0.62829],[51.256618,0.63055],[51.25634,0.63115],[51.256031,0.63176],[51.255371,0.63291],[51.255032,0.63346],[51.254688,0.63397],[51.252941,0.63631],[51.25243,0.63704],[51.252289,0.63724],[51.251289,0.63867],[51.250961,0.63918],[51.250599,0.63978],[51.249569,0.64159],[51.249271,0.64217],[51.24876,0.64322],[51.248112,0.64466],[51.24781,0.64535],[51.247509,0.64616],[51.247162,0.64707],[51.246861,0.64794],[51.246681,0.64849],[51.246471,0.64916],[51.246281,0.64979],[51.245949,0.65084],[51.245899,0.65104],[51.245171,0.65347],[51.244541,0.65575],[51.24361,0.65901],[51.242668,0.66237],[51.241711,0.66557],[51.241371,0.66662],[51.24102,0.66764],[51.240028,0.6704],[51.239609,0.67148],[51.23914,0.6726],[51.237942,0.67524],[51.237469,0.67616],[51.237041,0.67698],[51.236649,0.67772],[51.23645,0.6781],[51.23595,0.67909],[51.23518,0.68037],[51.234089,0.68227],[51.23365,0.68299],[51.233101,0.68384],[51.232632,0.68449],[51.232208,0.68509],[51.23159,0.68585],[51.231098,0.68638],[51.230659,0.68688],[51.229839,0.6878],[51.229019,0.6888],[51.228279,0.68988],[51.22797,0.69037],[51.227661,0.69092],[51.227211,0.6918],[51.2267,0.69285],[51.226509,0.69331],[51.226261,0.69388],[51.225819,0.69502],[51.225578,0.69575],[51.225281,0.69674],[51.22506,0.69754],[51.224869,0.69836],[51.224701,0.69918],[51.224548,0.69999],[51.224419,0.70091],[51.224339,0.70158],[51.224232,0.70277],[51.22414,0.70386],[51.22414,0.70392],[51.223942,0.70706],[51.223801,0.70842],[51.223709,0.70911],[51.223591,0.70976],[51.223358,0.71097],[51.223049,0.71225],[51.222851,0.71295],[51.22263,0.71364],[51.22224,0.71477],[51.221802,0.71586],[51.221561,0.71644],[51.221291,0.71697],[51.220409,0.71862],[51.220058,0.71922],[51.21965,0.71985],[51.21843,0.72149],[51.2178,0.72229],[51.217461,0.72274],[51.217072,0.72331],[51.21653,0.72418],[51.216202,0.72477],[51.215851,0.72538],[51.215481,0.72616],[51.215069,0.72716],[51.21442,0.72904],[51.21418,0.72975],[51.213928,0.73048],[51.21331,0.73252],[51.212719,0.7343],[51.212502,0.73491],[51.212261,0.73557],[51.21175,0.73686],[51.210781,0.73941],[51.210411,0.74033],[51.210091,0.74111],[51.208961,0.74368],[51.207371,0.7471],[51.205879,0.7505],[51.20435,0.75444],[51.20369,0.7563],[51.2029,0.75831],[51.202068,0.76009],[51.201199,0.76191],[51.199879,0.76458],[51.198879,0.76694],[51.198349,0.76836],[51.196941,0.77223],[51.195881,0.77579],[51.19482,0.77989],[51.19363,0.78381],[51.193481,0.78425],[51.192371,0.78747],[51.19109,0.79133],[51.190819,0.79238],[51.190521,0.79363],[51.190319,0.79462],[51.190182,0.79558],[51.18988,0.79784],[51.189522,0.80175],[51.189091,0.80706],[51.188862,0.8117],[51.188721,0.81612],[51.188599,0.82169],[51.18837,0.8241],[51.188251,0.82496],[51.188099,0.82587],[51.187962,0.82665],[51.187752,0.82763],[51.187569,0.82836],[51.187119,0.82975],[51.186378,0.83164],[51.185749,0.83293],[51.18531,0.83368],[51.184811,0.83448],[51.184299,0.83517],[51.183121,0.83649],[51.182381,0.83722],[51.18198,0.83761],[51.181862,0.83773],[51.179722,0.83981],[51.177509,0.84225],[51.17527,0.84496],[51.17326,0.84778],[51.171341,0.85072],[51.169498,0.85395],[51.167709,0.85684],[51.167049,0.85787],[51.166241,0.8591],[51.16478,0.86123],[51.163509,0.86324],[51.16193,0.86581],[51.1614,0.8668],[51.161079,0.86742],[51.160549,0.8685],[51.160221,0.86923],[51.15966,0.87046],[51.15884,0.87253],[51.157841,0.87482],[51.156559,0.87788],[51.15509,0.88152],[51.1548,0.88219],[51.15337,0.88568],[51.151508,0.89005],[51.15062,0.89223],[51.150249,0.89302],[51.150169,0.8932],[51.149899,0.8938],[51.149632,0.89439],[51.149109,0.89545],[51.148479,0.8966],[51.147461,0.89819],[51.146549,0.89942],[51.14473,0.90196],[51.142151,0.90519],[51.141788,0.90564],[51.140621,0.90699],[51.139591,0.90816],[51.138611,0.90931],[51.13802,0.91008],[51.137371,0.91099],[51.13644,0.91254],[51.135948,0.91346],[51.135071,0.91531],[51.13448,0.91676],[51.133438,0.91969],[51.13208,0.92321],[51.13131,0.92488],[51.13047,0.92637],[51.12999,0.92714],[51.129501,0.92789],[51.12772,0.93053],[51.127171,0.93141],[51.126259,0.93304],[51.125408,0.9346],[51.12484,0.93569],[51.123291,0.93894],[51.122822,0.93991],[51.121529,0.94233],[51.12104,0.94323],[51.119839,0.9451],[51.117802,0.94831],[51.11721,0.94936],[51.11676,0.95022],[51.116459,0.95082],[51.116219,0.95133],[51.115978,0.95189],[51.115761,0.95245],[51.11544,0.9533],[51.114738,0.95539],[51.113811,0.95882],[51.11272,0.96273],[51.111561,0.96647],[51.110279,0.97016],[51.108822,0.97406],[51.10833,0.97522],[51.107491,0.97725],[51.107121,0.97813],[51.106419,0.97979],[51.105999,0.98086],[51.105621,0.98185],[51.105209,0.98297],[51.104858,0.98403],[51.10453,0.98504],[51.10405,0.9866],[51.103519,0.98858],[51.103161,0.98998],[51.102631,0.99251],[51.10183,0.99697],[51.101261,1.00094],[51.100498,1.00727],[51.100441,1.00801],[51.100101,1.01554],[51.099789,1.02085],[51.09943,1.02433],[51.09914,1.02641],[51.098629,1.02937],[51.09795,1.03334],[51.097301,1.03712],[51.096981,1.03903],[51.096691,1.04113],[51.096191,1.04478],[51.09565,1.04961],[51.09523,1.05352],[51.095001,1.05578],[51.094818,1.05718],[51.094551,1.05899],[51.094002,1.0625],[51.093811,1.06352],[51.093479,1.06512],[51.09296,1.06772],[51.09272,1.06914],[51.092541,1.07024],[51.092381,1.07156],[51.09222,1.07294],[51.092091,1.07427],[51.091991,1.07574],[51.091911,1.07683],[51.09185,1.07825],[51.091801,1.08103],[51.09182,1.08295],[51.091881,1.08497],[51.091999,1.08669],[51.09206,1.08743],[51.092178,1.0886],[51.092339,1.09011],[51.092628,1.09246],[51.09293,1.09531],[51.093651,1.09994],[51.093788,1.10123],[51.093811,1.10192],[51.093849,1.10356],[51.0937,1.10681],[51.093472,1.10861],[51.09317,1.1104],[51.092239,1.11382],[51.091209,1.11814],[51.090988,1.12],[51.090889,1.12149],[51.090839,1.12251],[51.090839,1.12344],[51.090988,1.1267],[51.091251,1.12838],[51.091549,1.12994],[51.09219,1.13217],[51.09248,1.13289],[51.092812,1.13363],[51.093449,1.13509],[51.09383,1.13608],[51.09417,1.13718],[51.094791,1.14033],[51.09528,1.14437],[51.095539,1.14675],[51.09565,1.14905],[51.095638,1.15199],[51.0956,1.1539],[51.09557,1.15553],[51.0956,1.15691],[51.09565,1.15785],[51.095711,1.15863],[51.095791,1.15935],[51.095909,1.16004],[51.096081,1.16075],[51.096378,1.16185],[51.096771,1.16293],[51.097149,1.16373],[51.097439,1.16425],[51.09853,1.16572],[51.099621,1.16672],[51.099831,1.16689],[51.10281,1.16969],[51.104382,1.17116],[51.105709,1.17244],[51.106781,1.17389],[51.107849,1.17564],[51.108719,1.17739],[51.109619,1.17987],[51.110512,1.18248],[51.111488,1.18548],[51.112228,1.18863],[51.112499,1.19082],[51.112549,1.19196],[51.112549,1.19278],[51.112518,1.19351],[51.112469,1.19398],[51.11235,1.19533],[51.112228,1.19671],[51.112171,1.19839],[51.11219,1.19926],[51.112209,1.20014],[51.112331,1.20197],[51.112438,1.20275],[51.112541,1.20346],[51.112839,1.20577],[51.11301,1.20811],[51.113022,1.21006],[51.11293,1.2119],[51.11264,1.21474],[51.112301,1.21747],[51.111851,1.22028],[51.111382,1.22301],[51.110882,1.22546],[51.110329,1.22787],[51.10997,1.22901],[51.10955,1.23013],[51.108589,1.23208],[51.106739,1.23498],[51.105942,1.23623],[51.10466,1.23946],[51.104389,1.24029],[51.10429,1.24069],[51.104172,1.24137],[51.10397,1.24288],[51.103889,1.24393],[51.103859,1.24491],[51.10387,1.24596],[51.103958,1.24726],[51.10405,1.24807],[51.104221,1.24973],[51.104488,1.25164],[51.104809,1.25353],[51.10564,1.2573],[51.107071,1.26226],[51.107208,1.26301],[51.107529,1.26477],[51.107689,1.26757],[51.107849,1.27028],[51.108292,1.27241],[51.109692,1.27641],[51.11018,1.27878],[51.110298,1.28074],[51.110031,1.285],[51.110329,1.28792],[51.11063,1.28913],[51.111111,1.29063],[51.112011,1.29313],[51.11293,1.29586],[51.11335,1.29733],[51.113689,1.29877],[51.114029,1.30058],[51.114239,1.30197],[51.114311,1.3025],[51.11441,1.30284],[51.114471,1.30292],[51.11454,1.30295],[51.114601,1.30302],[51.114639,1.30313],[51.114651,1.30328],[51.114639,1.30338],[51.11459,1.30349],[51.114552,1.30354],[51.114559,1.30386],[51.114571,1.30415],[51.114658,1.30462],[51.114731,1.30493],[51.11491,1.30535],[51.11507,1.30566],[51.11525,1.30597],[51.115429,1.3062],[51.115829,1.30659],[51.11618,1.30687],[51.116539,1.30705],[51.11694,1.30718],[51.1171,1.3072],[51.117249,1.30716],[51.117298,1.30712],[51.11739,1.30709],[51.11747,1.30711],[51.11755,1.3072],[51.11771,1.30735],[51.117859,1.30746],[51.118038,1.30755],[51.118301,1.30769],[51.11861,1.30787],[51.118938,1.30809],[51.119362,1.30841],[51.119888,1.30906],[51.11993,1.30902],[51.11998,1.30901],[51.12001,1.30901],[51.12006,1.30904],[51.120098,1.30911],[51.120121,1.30918],[51.120121,1.30924],[51.120609,1.3098],[51.12125,1.31049],[51.122311,1.3116],[51.122829,1.31228],[51.123299,1.31321],[51.12336,1.31319],[51.12344,1.31321],[51.123489,1.31326],[51.123531,1.31334],[51.12355,1.31343],[51.12355,1.31351],[51.123531,1.3136],[51.123501,1.31366],[51.12384,1.31478],[51.123871,1.31488],[51.12392,1.31503],[51.1241,1.31553],[51.12455,1.3167],[51.125172,1.31831],[51.125408,1.31906],[51.125462,1.3194],[51.125481,1.31952],[51.1255,1.3205],[51.12537,1.3222],[51.12534,1.32278],[51.125351,1.32315],[51.12537,1.32341],[51.125389,1.32368],[51.1255,1.3245],[51.12595,1.32607],[51.126171,1.32679],[51.126251,1.32687],[51.126301,1.32687],[51.12635,1.32691],[51.126381,1.32697],[51.1264,1.32701],[51.126411,1.32709],[51.126411,1.32714],[51.12661,1.3272],[51.12674,1.32733],[51.127281,1.32823],[51.127659,1.32897],[51.12793,1.3295],[51.128151,1.33004],[51.128342,1.33049],[51.128391,1.33063],[51.128429,1.33076],[51.128479,1.331],[51.128502,1.33119],[51.128632,1.33167],[51.128719,1.33201],[51.12878,1.33245],[51.128799,1.3326],[51.12886,1.33275],[51.129009,1.33327],[51.12907,1.33347],[51.12907,1.33365],[51.12907,1.33392],[51.129421,1.33511],[51.12965,1.33549],[51.129799,1.33605],[51.12986,1.33621],[51.129921,1.33647],[51.12994,1.33681],[51.1301,1.33749],[51.130089,1.33783],[51.129978,1.33815],[51.129921,1.33843],[51.12991,1.33859],[51.12989,1.33884],[51.12989,1.33906],[51.129921,1.33965],[51.130001,1.34022],[51.130131,1.34103],[51.130161,1.34122],[51.13018,1.3414],[51.130169,1.34149],[51.13015,1.34158],[51.130112,1.34162],[51.130058,1.34167],[51.12999,1.34169],[51.129921,1.34164],[51.129879,1.34158],[51.129848,1.34154],[51.12981,1.34135],[51.12981,1.34135],[51.129761,1.34097],[51.1297,1.3406],[51.129681,1.34054],[51.129601,1.34023],[51.129601,1.3402],[51.129551,1.33999],[51.129539,1.3399],[51.12952,1.33983],[51.129509,1.33976],[51.12949,1.33967],[51.129478,1.33961],[51.129459,1.33953],[51.12944,1.33945],[51.129349,1.33897],[51.129341,1.3389],[51.129292,1.33865],[51.12928,1.33857],[51.129269,1.33852],[51.12925,1.33846],[51.1292,1.3382],[51.12899,1.33747],[51.128502,1.33599],[51.127621,1.33327],[51.127369,1.33316],[51.126629,1.33378],[51.126621,1.33374],[51.126621,1.33364],[51.12664,1.33357],[51.12669,1.33347],[51.124249,1.33631],[51.12339,1.33681],[51.122921,1.33723],[51.122219,1.33852],[51.121521,1.34088],[51.1213,1.34214],[51.120991,1.34396],[51.121029,1.34623],[51.12122,1.34811],[51.121658,1.3505],[51.122429,1.35514],[51.122669,1.35707],[51.12252,1.35925],[51.117809,1.37432],[51.113098,1.38939],[51.108391,1.40446],[51.10368,1.41953],[51.098961,1.4346],[51.09425,1.44967],[51.089539,1.46474],[51.084831,1.47981],[51.080109,1.49488],[51.068069,1.51962],[51.053921,1.56329],[51.04071,1.59852],[51.025211,1.63092],[51.001999,1.66988],[50.982979,1.702],[50.971821,1.73021],[50.965912,1.75008],[50.965778,1.7616],[50.967621,1.78272],[50.970249,1.81447],[50.9734,1.83058],[50.971569,1.84148],[50.970322,1.84528],[50.96946,1.84855],[50.968941,1.85085],[50.967468,1.851],[50.9664,1.85395],[50.965809,1.85499],[50.965721,1.85539],[50.965389,1.85658],[50.965279,1.857],[50.965061,1.85736],[50.964859,1.85768],[50.964828,1.85799],[50.964859,1.85852],[50.96513,1.86018],[50.965439,1.86224],[50.96553,1.86291],[50.965591,1.86335],[50.965679,1.86408],[50.965759,1.86463],[50.965801,1.86492],[50.96571,1.86559],[50.966,1.86722],[50.966209,1.86859],[50.9664,1.86985],[50.966579,1.87094],[50.966721,1.87124],[50.966881,1.87146],[50.967152,1.87174],[50.967251,1.87199],[50.967319,1.87213],[50.967339,1.8723],[50.967319,1.87242],[50.967258,1.87253],[50.967171,1.87264],[50.967049,1.87269],[50.966961,1.87267],[50.9669,1.87264],[50.966782,1.87256],[50.966679,1.87258],[50.966621,1.87266],[50.966579,1.87277],[50.966572,1.87295],[50.966591,1.87306],[50.966709,1.87319],[50.966831,1.87318],[50.9669,1.87312],[50.966942,1.87316],[50.967289,1.87339],[50.9678,1.87385],[50.968369,1.87442],[50.968632,1.87467],[50.968922,1.87501],[50.968971,1.87539],[50.969151,1.87581],[50.96944,1.87606],[50.969521,1.87685],[50.969688,1.87737],[50.97023,1.87846],[50.970631,1.88081],[50.971611,1.88645],[50.97216,1.88977],[50.972839,1.89413],[50.973099,1.89619],[50.973129,1.89712],[50.97298,1.89819],[50.972778,1.8989],[50.972679,1.89918],[50.972198,1.90005],[50.971581,1.90064],[50.97086,1.90113],[50.970188,1.9014],[50.969372,1.90176],[50.96859,1.90212],[50.967812,1.90248],[50.964081,1.90407],[50.961891,1.9049],[50.96096,1.9052],[50.959148,1.90522],[50.95834,1.90519],[50.95726,1.90522],[50.956211,1.90542],[50.955238,1.90564],[50.9543,1.90587],[50.95359,1.90598],[50.95314,1.90604],[50.951931,1.90612],[50.950241,1.90554],[50.948601,1.90488],[50.94746,1.90462],[50.946918,1.90463],[50.946239,1.90463],[50.94558,1.90469],[50.94376,1.90518],[50.941341,1.90606],[50.93996,1.90648],[50.938591,1.90685],[50.938332,1.90688],[50.93803,1.90684],[50.937759,1.90675],[50.93718,1.90661],[50.936871,1.90664],[50.936359,1.90679],[50.936211,1.90684],[50.935741,1.907],[50.93536,1.90711],[50.93515,1.90722],[50.93494,1.90754],[50.934849,1.90806],[50.93491,1.90848],[50.935089,1.90874],[50.935341,1.909],[50.93557,1.90922],[50.935749,1.90945],[50.935871,1.90982],[50.935982,1.91027],[50.9361,1.91173],[50.93652,1.91885],[50.936661,1.92109],[50.93705,1.9273],[50.937328,1.93228],[50.93745,1.93517],[50.937481,1.93688],[50.937592,1.94222],[50.93758,1.94278],[50.937469,1.94724],[50.937031,1.954],[50.936668,1.95871],[50.936298,1.96403],[50.936111,1.96788],[50.936081,1.96839],[50.936081,1.96851],[50.93605,1.96892],[50.935841,1.97239],[50.935669,1.97436],[50.935249,1.97886],[50.934761,1.98359],[50.93433,1.98798],[50.933788,1.99334],[50.933262,1.99872],[50.93314,1.99992],[50.93272,2.00394],[50.932549,2.00585],[50.932232,2.00935],[50.931931,2.01479],[50.931839,2.0177],[50.931839,2.02036],[50.931911,2.0256],[50.932259,2.03095],[50.932838,2.0366],[50.93351,2.04213],[50.93404,2.04668],[50.934681,2.0518],[50.934731,2.05231],[50.93486,2.05341],[50.935459,2.05849],[50.93618,2.06459],[50.936821,2.06931],[50.937,2.07046],[50.93721,2.07157],[50.938049,2.07576],[50.939331,2.08131],[50.940979,2.08698],[50.943771,2.09651],[50.944969,2.10024],[50.945171,2.10083],[50.945358,2.10132],[50.94603,2.103],[50.947449,2.10617],[50.948669,2.10898],[50.94949,2.11112],[50.95013,2.11311],[50.950569,2.11476],[50.95084,2.11595],[50.951061,2.11703],[50.951229,2.11799],[50.95134,2.11879],[50.95142,2.11946],[50.951481,2.12005],[50.951561,2.12091],[50.951611,2.12154],[50.95163,2.12226],[50.95166,2.12399],[50.95163,2.12719],[50.95166,2.12849],[50.951679,2.12922],[50.95174,2.12994],[50.951801,2.13068],[50.952049,2.13256],[50.95219,2.13337],[50.952339,2.13407],[50.95245,2.13468],[50.952751,2.13587],[50.95314,2.13722],[50.95356,2.1384],[50.955509,2.14382],[50.95594,2.14511],[50.956402,2.14664],[50.956619,2.14741],[50.957272,2.15017],[50.957581,2.15165],[50.95792,2.15362],[50.958241,2.1558],[50.958389,2.15706],[50.958488,2.15826],[50.958569,2.15916],[50.958691,2.16131],[50.958729,2.16278],[50.958759,2.16826],[50.958771,2.17093],[50.958771,2.1724],[50.958778,2.17312],[50.958771,2.17719],[50.958809,2.18107],[50.958809,2.18387],[50.958832,2.18546],[50.95887,2.18725],[50.958931,2.1886],[50.959,2.18962],[50.959042,2.19044],[50.959202,2.1941],[50.95929,2.19583],[50.959358,2.19713],[50.959431,2.19857],[50.95977,2.2044],[50.959888,2.20581],[50.959999,2.20656],[50.960129,2.20742],[50.9603,2.2083],[50.960491,2.20918],[50.96106,2.21099],[50.961369,2.21185],[50.96188,2.21307],[50.962372,2.2141],[50.963051,2.2153],[50.9636,2.21608],[50.964081,2.21676],[50.964951,2.21779],[50.966351,2.21906],[50.967548,2.21984],[50.968819,2.2204],[50.969082,2.22051],[50.96999,2.22091],[50.971722,2.22168],[50.973011,2.22223],[50.975269,2.22326],[50.977989,2.22447],[50.979801,2.22537],[50.981491,2.22651],[50.98312,2.22801],[50.98465,2.22979],[50.985142,2.23047],[50.98571,2.23135],[50.98613,2.23207],[50.987309,2.23417],[50.98785,2.23533],[50.988258,2.23622],[50.988621,2.2371],[50.988838,2.23776],[50.988979,2.23815],[50.98951,2.23991],[50.98983,2.24111],[50.990131,2.24249],[50.990311,2.24335],[50.990471,2.24433],[50.990582,2.2451],[50.990631,2.24546],[50.990749,2.24652],[50.990849,2.24767],[50.991001,2.24997],[50.991089,2.25132],[50.991219,2.25285],[50.991371,2.25542],[50.991428,2.25736],[50.99139,2.25824],[50.99131,2.25904],[50.991131,2.26062],[50.990978,2.26203],[50.990929,2.2628],[50.990929,2.26349],[50.990959,2.26412],[50.991089,2.26534],[50.991329,2.26651],[50.991539,2.26752],[50.99189,2.26896],[50.992081,2.26975],[50.992519,2.27123],[50.99271,2.27176],[50.992908,2.27231],[50.993698,2.27429],[50.993881,2.27475],[50.994141,2.27543],[50.994438,2.27647],[50.994991,2.27878],[50.9953,2.2799],[50.99596,2.28193],[50.99688,2.28418],[50.997162,2.2849],[50.997421,2.28563],[50.998192,2.2878],[50.99921,2.29085],[50.999458,2.29158],[51.000069,2.29328],[51.00098,2.29593],[51.002178,2.29964],[51.002411,2.30036],[51.002861,2.30196],[51.003071,2.3028],[51.003368,2.30435],[51.003601,2.30583],[51.004189,2.3101],[51.00425,2.31055],[51.00428,2.31072],[51.004551,2.31257],[51.00457,2.31275],[51.004662,2.3134],[51.005409,2.31722],[51.006069,2.31984],[51.00629,2.32056],[51.007221,2.32332],[51.00766,2.32452],[51.008259,2.32605],[51.008968,2.32791],[51.00951,2.32936],[51.00988,2.33063],[51.01022,2.3319],[51.010448,2.3329],[51.01078,2.33461],[51.01096,2.33604],[51.011009,2.33643],[51.011589,2.34118],[51.01228,2.34741],[51.012379,2.34865],[51.012421,2.34995],[51.012428,2.35025],[51.01247,2.35212],[51.012482,2.35917],[51.01247,2.36228],[51.01247,2.36496],[51.012508,2.36668],[51.012539,2.36733],[51.012569,2.36826],[51.01263,2.36958],[51.012718,2.37139],[51.01276,2.37266],[51.01281,2.37337],[51.012859,2.37427],[51.012989,2.37692],[51.013031,2.37775],[51.0131,2.37894],[51.013119,2.37918],[51.013168,2.37968],[51.013229,2.38015],[51.01339,2.38113],[51.01387,2.38398],[51.013981,2.38455],[51.014462,2.38727],[51.015091,2.39079],[51.01532,2.39201],[51.015518,2.39305],[51.01577,2.39428],[51.016029,2.39543],[51.016209,2.39619],[51.016369,2.39682],[51.01656,2.39753],[51.017361,2.40001],[51.01757,2.40063],[51.018608,2.40362],[51.018929,2.40452],[51.020679,2.40955],[51.02113,2.41077],[51.02158,2.41194],[51.022331,2.41373],[51.02293,2.41513],[51.02372,2.41692],[51.024632,2.41896],[51.026299,2.42273],[51.02718,2.42467],[51.028221,2.42699],[51.030571,2.43217],[51.031361,2.43401],[51.033642,2.43905],[51.035229,2.44255],[51.036591,2.44564],[51.03743,2.4476],[51.037861,2.44877],[51.03817,2.44976],[51.03846,2.45073],[51.038769,2.45191],[51.039108,2.45333],[51.039459,2.45497],[51.040298,2.45914],[51.04211,2.46828],[51.042839,2.47194],[51.043209,2.47404],[51.043419,2.47535],[51.043671,2.47711],[51.043831,2.47876],[51.04398,2.48044],[51.044079,2.4824],[51.04414,2.48386],[51.04417,2.48536],[51.04414,2.48689],[51.044071,2.48871],[51.044022,2.48969],[51.043941,2.49072],[51.043228,2.49809],[51.042229,2.50844],[51.042099,2.51063],[51.042042,2.51265],[51.04208,2.51446],[51.04216,2.51609],[51.042301,2.5175],[51.042431,2.51842],[51.042789,2.52042],[51.043201,2.52211],[51.043598,2.52368],[51.044231,2.52565],[51.04472,2.5272],[51.044941,2.52797],[51.045132,2.52855],[51.04546,2.52966],[51.04578,2.53064],[51.045891,2.53098],[51.046169,2.5318],[51.04644,2.5325],[51.046551,2.5328],[51.047539,2.53531],[51.048191,2.53675],[51.048828,2.53811],[51.051281,2.54349],[51.052811,2.54681],[51.053501,2.5486],[51.054089,2.5503],[51.054699,2.55229],[51.055302,2.55448],[51.055779,2.55651],[51.056301,2.55905],[51.056591,2.56043],[51.057049,2.56247],[51.057251,2.5634],[51.058319,2.56843],[51.058601,2.56969],[51.05888,2.57087],[51.059212,2.57214],[51.05962,2.57351],[51.060001,2.57471],[51.060371,2.57579],[51.060902,2.57714],[51.061588,2.57888],[51.062038,2.58001],[51.063679,2.58404],[51.064041,2.58492],[51.0644,2.58588],[51.064911,2.58728],[51.065319,2.58853],[51.065651,2.58961],[51.066101,2.59122],[51.066479,2.59272],[51.06683,2.59427],[51.067131,2.59571],[51.06741,2.59735],[51.06752,2.59797],[51.067711,2.59921],[51.06786,2.6003],[51.068031,2.60169],[51.068169,2.60318],[51.06831,2.60502],[51.06839,2.60678],[51.068409,2.6073],[51.068439,2.60869],[51.068439,2.6096],[51.068409,2.61156],[51.068352,2.61305],[51.068291,2.61409],[51.068241,2.61486],[51.068169,2.61588],[51.06805,2.61712],[51.067928,2.61827],[51.067799,2.61933],[51.067631,2.62045],[51.06739,2.62205],[51.067131,2.62364],[51.066879,2.62531],[51.066589,2.62707],[51.066341,2.62856],[51.06609,2.63003],[51.065769,2.63167],[51.065529,2.63282],[51.065239,2.63404],[51.064911,2.63527],[51.064499,2.63671],[51.064251,2.63747],[51.064041,2.63811],[51.063499,2.63943],[51.06292,2.64086],[51.06221,2.64252],[51.061131,2.64454],[51.06012,2.64638],[51.059299,2.64799],[51.05862,2.6494],[51.058022,2.65077],[51.057529,2.6522],[51.05703,2.65394],[51.056808,2.65493],[51.056419,2.65689],[51.05621,2.65862],[51.056099,2.65998],[51.056091,2.66042],[51.056019,2.66226],[51.056011,2.66247],[51.05621,2.66523],[51.056252,2.66562],[51.05637,2.66661],[51.056469,2.66746],[51.05687,2.67003],[51.057079,2.67121],[51.057301,2.67227],[51.057659,2.67373],[51.058041,2.67517],[51.0583,2.676],[51.058529,2.67676],[51.059441,2.67934],[51.059929,2.68044],[51.060501,2.68175],[51.061081,2.68296],[51.061581,2.68396],[51.062191,2.68504],[51.06329,2.68672],[51.066238,2.69064],[51.069191,2.6946],[51.06953,2.69505],[51.07011,2.69584],[51.071651,2.69795],[51.072418,2.69904],[51.072762,2.69952],[51.07328,2.70028],[51.073631,2.70076],[51.075062,2.70318],[51.075989,2.70478],[51.076469,2.7056],[51.07737,2.70742],[51.078041,2.70881],[51.080669,2.71368],[51.082119,2.71651],[51.08403,2.72024],[51.08596,2.72395],[51.08749,2.72654],[51.08762,2.72676],[51.088009,2.72735],[51.08828,2.72776],[51.089901,2.72983],[51.090542,2.73054],[51.092491,2.73254],[51.097069,2.73603],[51.100849,2.7394],[51.10141,2.73993],[51.102261,2.74083],[51.104359,2.74302],[51.10585,2.74498],[51.106361,2.74564],[51.10854,2.7486],[51.109261,2.74981],[51.11198,2.75436],[51.11467,2.76005],[51.114891,2.76061],[51.115601,2.7626],[51.115761,2.76306],[51.116161,2.76409],[51.116589,2.76529],[51.117771,2.76841],[51.12117,2.77827],[51.12418,2.78692],[51.124359,2.78746],[51.124859,2.78887],[51.12764,2.7969],[51.127831,2.79746],[51.12862,2.79973],[51.129101,2.80112],[51.129269,2.80159],[51.132858,2.81214],[51.133221,2.81331],[51.133461,2.8141],[51.133888,2.81561],[51.134201,2.81676],[51.134811,2.8192],[51.135349,2.82163],[51.13567,2.82325],[51.135899,2.82449],[51.136089,2.82548],[51.136349,2.82713],[51.1371,2.83239],[51.13726,2.83359],[51.137409,2.83465],[51.138371,2.8417],[51.139099,2.84658],[51.140308,2.85454],[51.141491,2.86184],[51.14164,2.86276],[51.1422,2.86733],[51.142479,2.86962],[51.14296,2.87444],[51.144299,2.8852],[51.145679,2.89336],[51.146931,2.89956],[51.147221,2.90083],[51.147518,2.90218],[51.149181,2.9089],[51.150909,2.91532],[51.15292,2.92111],[51.153099,2.92162],[51.15398,2.92417],[51.154831,2.92664],[51.157249,2.93277],[51.158779,2.9367],[51.161579,2.94386],[51.162491,2.94619],[51.163288,2.94829],[51.16412,2.95068],[51.16468,2.95227],[51.16494,2.95305],[51.165619,2.95527],[51.166962,2.96013],[51.16769,2.96342],[51.168159,2.96567],[51.16877,2.96918],[51.16906,2.97102],[51.169399,2.97327],[51.171879,2.99036],[51.17207,2.99165],[51.172211,2.99269],[51.172989,2.99807],[51.17305,2.99851],[51.17329,3.00016],[51.173649,3.00226],[51.17411,3.0044],[51.17445,3.0058],[51.174931,3.00759],[51.175331,3.00901],[51.17564,3.00987],[51.17952,3.01954],[51.179989,3.02066],[51.18058,3.02217],[51.18092,3.02299],[51.18111,3.02352],[51.181301,3.02409],[51.18166,3.02515],[51.182072,3.02648],[51.182388,3.02762],[51.18367,3.03306],[51.185581,3.04182],[51.189091,3.05743],[51.18932,3.0583],[51.18961,3.05942],[51.190521,3.06289],[51.191109,3.06485],[51.19252,3.06975],[51.19273,3.07071],[51.192909,3.07177],[51.193031,3.0727],[51.19313,3.07392],[51.193161,3.07501],[51.19313,3.07626],[51.193081,3.07739],[51.193001,3.07852],[51.19286,3.07972],[51.192612,3.08154],[51.191601,3.0869],[51.191349,3.08837],[51.189911,3.09536],[51.189129,3.0984],[51.1884,3.10066],[51.18821,3.10126],[51.186199,3.10705],[51.184799,3.11107],[51.18198,3.11918],[51.18063,3.1231],[51.177151,3.13324],[51.172661,3.14639],[51.170872,3.15257],[51.17012,3.15582],[51.168468,3.16401],[51.166939,3.17116],[51.163761,3.18813],[51.163589,3.18902],[51.163559,3.18919],[51.162868,3.19267],[51.162819,3.19292],[51.162769,3.19321],[51.16209,3.19636],[51.161621,3.19818],[51.16148,3.19868],[51.16127,3.19942],[51.160938,3.20048],[51.160412,3.20206],[51.160301,3.20234],[51.159901,3.20339],[51.159859,3.2035],[51.159431,3.20455],[51.158451,3.20644],[51.1577,3.20792],[51.15741,3.2085],[51.157162,3.209],[51.156761,3.20971],[51.155579,3.21174],[51.1549,3.21289],[51.153931,3.2146],[51.15324,3.21591],[51.15237,3.2175],[51.152191,3.21782],[51.15126,3.21969],[51.151169,3.21993],[51.15036,3.22156],[51.14901,3.22481],[51.14785,3.22818],[51.146881,3.23154],[51.146709,3.23211],[51.14645,3.23302],[51.144199,3.24088],[51.141628,3.25038],[51.141071,3.25233],[51.14082,3.25322],[51.140671,3.25373],[51.13924,3.25883],[51.136539,3.26866],[51.13134,3.28713],[51.128139,3.29863],[51.123081,3.3166],[51.12204,3.32055],[51.120621,3.32559],[51.118851,3.33186],[51.115269,3.34479],[51.112011,3.35628],[51.111431,3.35809],[51.110771,3.35983],[51.104359,3.37599],[51.1012,3.38387],[51.099739,3.38761],[51.095131,3.39893],[51.094082,3.40177],[51.09256,3.40559],[51.09137,3.40854],[51.089691,3.41275],[51.087132,3.41912],[51.085651,3.42274],[51.084728,3.42507],[51.083801,3.42739],[51.082878,3.42956],[51.081799,3.43221],[51.077339,3.4436],[51.076519,3.44591],[51.07608,3.44729],[51.075981,3.44763],[51.07539,3.44979],[51.07523,3.45041],[51.074879,3.4518],[51.074501,3.45334],[51.07251,3.46253],[51.07196,3.46512],[51.066978,3.48751],[51.06411,3.50061],[51.06105,3.51623],[51.05904,3.5268],[51.058491,3.52974],[51.05685,3.53852],[51.052608,3.55965],[51.05125,3.56586],[51.050892,3.56749],[51.050529,3.56911],[51.050449,3.56951],[51.048389,3.5789],[51.043869,3.59986],[51.03994,3.61792],[51.03949,3.61953],[51.03775,3.62573],[51.034882,3.63601],[51.03474,3.63647],[51.0336,3.64051],[51.033539,3.6407],[51.032398,3.64472],[51.031979,3.64616],[51.030102,3.65281],[51.024891,3.67076],[51.02475,3.67125],[51.023972,3.67402],[51.023472,3.67574],[51.022491,3.67923],[51.022339,3.67977],[51.021801,3.68161],[51.021339,3.68336],[51.02124,3.68376],[51.020981,3.68476],[51.020741,3.68568],[51.020451,3.68685],[51.019531,3.69031],[51.019001,3.69241],[51.018669,3.69363],[51.017109,3.70012],[51.014702,3.71009],[51.014622,3.71042],[51.014179,3.71226],[51.012611,3.71878],[51.01199,3.72128],[51.011631,3.72217],[51.011311,3.72284],[51.010921,3.72339],[51.010578,3.72382],[51.010239,3.72423],[51.009869,3.72483],[51.00975,3.72508],[51.00951,3.72588],[51.00948,3.72621],[51.009491,3.72647],[51.009541,3.72679],[51.009609,3.72702],[51.00983,3.72759],[51.01009,3.72808],[51.010429,3.72839],[51.01075,3.7285],[51.010948,3.72849],[51.01115,3.7284],[51.01136,3.72827],[51.011532,3.72811],[51.011829,3.72787],[51.012039,3.72778],[51.012211,3.72778],[51.012581,3.72798],[51.01424,3.72894],[51.014629,3.72916],[51.014919,3.72937],[51.01688,3.73074],[51.018459,3.73179],[51.020302,3.73307],[51.021832,3.73444],[51.02388,3.7366],[51.025539,3.73839],[51.026699,3.74038],[51.026909,3.74077],[51.028519,3.74369],[51.028671,3.744],[51.028851,3.74435],[51.02964,3.74592],[51.031132,3.74879],[51.03175,3.74997],[51.033428,3.75321],[51.03426,3.75482],[51.03434,3.755],[51.034649,3.75563],[51.03513,3.75661],[51.03561,3.75785],[51.035999,3.75894],[51.036079,3.75915],[51.036282,3.75982],[51.03661,3.76089],[51.037029,3.76254],[51.037769,3.76571],[51.039028,3.771],[51.040112,3.77556],[51.040489,3.77719],[51.04076,3.77847],[51.042011,3.7838],[51.043049,3.78806],[51.043869,3.79144],[51.044189,3.7928],[51.044739,3.79514],[51.044922,3.79591],[51.046181,3.80122],[51.047771,3.80846],[51.04842,3.81174],[51.051239,3.82769],[51.052109,3.8319],[51.053669,3.83831],[51.055191,3.84386],[51.061069,3.8642],[51.064442,3.87572],[51.06472,3.87678],[51.066898,3.88445],[51.06712,3.88559],[51.06768,3.88811],[51.067719,3.88837],[51.068501,3.89206],[51.06926,3.89805],[51.06974,3.90363],[51.070461,3.91495],[51.070679,3.91877],[51.07111,3.92565],[51.073029,3.95806],[51.07357,3.96646],[51.07431,3.97915],[51.075008,3.98714],[51.0751,3.98797],[51.075199,3.98883],[51.07579,3.99259],[51.07642,3.99564],[51.077061,3.99842],[51.0779,4.00133],[51.07872,4.00399],[51.079762,4.00683],[51.0811,4.01003],[51.08247,4.01287],[51.083832,4.0154],[51.084141,4.01594],[51.084549,4.01667],[51.086521,4.02014],[51.087921,4.02232],[51.08857,4.02339],[51.089588,4.02513],[51.09214,4.02944],[51.094528,4.03348],[51.095089,4.03443],[51.095211,4.03463],[51.100471,4.04349],[51.103989,4.049],[51.1068,4.05277],[51.11087,4.05734],[51.11171,4.05818],[51.112061,4.05854],[51.114491,4.06102],[51.116741,4.06331],[51.119381,4.0661],[51.120918,4.06809],[51.122429,4.07029],[51.123482,4.07216],[51.12402,4.07318],[51.124882,4.07494],[51.125778,4.07704],[51.126629,4.07964],[51.1269,4.08055],[51.127289,4.08194],[51.127541,4.08293],[51.12801,4.08511],[51.128479,4.08777],[51.128948,4.09103],[51.129021,4.09139],[51.13044,4.10455],[51.131821,4.1169],[51.132099,4.1194],[51.132549,4.12348],[51.13287,4.12635],[51.13327,4.12978],[51.133492,4.1312],[51.133839,4.13343],[51.134129,4.13519],[51.13456,4.13755],[51.13567,4.14353],[51.13641,4.14755],[51.137051,4.15104],[51.137211,4.15195],[51.13842,4.15828],[51.13921,4.16272],[51.1399,4.16663],[51.140591,4.17049],[51.141171,4.17362],[51.141891,4.17733],[51.142601,4.181],[51.142792,4.1819],[51.14307,4.18315],[51.143871,4.18615],[51.144581,4.18849],[51.145512,4.1912],[51.146679,4.19441],[51.147179,4.19574],[51.148769,4.20004],[51.149929,4.2034],[51.151112,4.20707],[51.152241,4.21068],[51.15329,4.21422],[51.154541,4.21836],[51.15575,4.22231],[51.157169,4.22699],[51.15839,4.23061],[51.159031,4.23227],[51.15947,4.23338],[51.160358,4.23531],[51.16151,4.23769],[51.16222,4.23907],[51.163422,4.24145],[51.16465,4.24383],[51.166279,4.24703],[51.166729,4.24793],[51.16856,4.25151],[51.170139,4.25456],[51.171581,4.25746],[51.172611,4.25952],[51.173389,4.26121],[51.174561,4.26389],[51.175739,4.26696],[51.176899,4.26997],[51.17799,4.27286],[51.1791,4.27582],[51.180599,4.2799],[51.181931,4.2834],[51.182461,4.28477],[51.183208,4.28673],[51.184212,4.28934],[51.18536,4.29224],[51.18586,4.29331],[51.18729,4.29642],[51.188278,4.29836],[51.18964,4.30093],[51.191269,4.30374],[51.192951,4.30655],[51.19482,4.30962],[51.19622,4.31194],[51.19809,4.3151],[51.200298,4.31877],[51.20142,4.32063],[51.201969,4.32153],[51.202431,4.32237],[51.202721,4.32293],[51.203899,4.32522],[51.204651,4.32687],[51.205391,4.32855],[51.206261,4.33073],[51.208328,4.33607],[51.208649,4.33695],[51.210098,4.34071],[51.211281,4.34388],[51.21146,4.34438],[51.211811,4.3453],[51.21233,4.34667],[51.212791,4.348],[51.213051,4.34876],[51.21312,4.34901],[51.213211,4.34932],[51.21349,4.35058],[51.21365,4.3516],[51.213749,4.35238],[51.21384,4.35324],[51.21389,4.35429],[51.213909,4.35537],[51.21386,4.35653],[51.21368,4.35807],[51.21347,4.35916],[51.213249,4.36017],[51.212978,4.36114],[51.21265,4.3621],[51.212238,4.36311],[51.211731,4.36418],[51.21101,4.36534],[51.210381,4.3662],[51.208759,4.36794],[51.208309,4.36843],[51.20274,4.37432],[51.20155,4.3756],[51.20089,4.37635],[51.2006,4.37673],[51.200272,4.37721],[51.19981,4.37797],[51.199322,4.37899],[51.199009,4.37978],[51.19873,4.38062],[51.198471,4.38164],[51.198238,4.38273],[51.19799,4.38423],[51.197701,4.38573],[51.19759,4.38626],[51.197311,4.38756],[51.19706,4.3886],[51.19685,4.38936],[51.19664,4.39006],[51.196251,4.39129],[51.195099,4.39424],[51.194302,4.39627],[51.193001,4.39983],[51.192059,4.40279],[51.191349,4.40556],[51.190941,4.40767],[51.190632,4.40985],[51.190472,4.41161],[51.19038,4.41322],[51.19035,4.41513],[51.19038,4.41674],[51.190498,4.4188],[51.190659,4.42035],[51.190891,4.42221],[51.191311,4.42416],[51.191719,4.42575],[51.192131,4.42716],[51.192619,4.42862],[51.193001,4.42966],[51.193321,4.43038],[51.193649,4.43107],[51.19397,4.43165],[51.194241,4.4321],[51.194618,4.43266],[51.194981,4.43311],[51.195259,4.43343],[51.19561,4.43381],[51.19595,4.43416],[51.196289,4.43445],[51.196659,4.43472],[51.197411,4.43528],[51.198662,4.43609],[51.201191,4.43746],[51.202412,4.43821],[51.203381,4.43891],[51.20462,4.43994],[51.206181,4.44129],[51.206921,4.44199],[51.207901,4.44294],[51.20924,4.44419],[51.210659,4.44546],[51.21167,4.44639],[51.21254,4.44721],[51.213921,4.44847],[51.214569,4.44921],[51.21471,4.4494],[51.214809,4.44956],[51.214951,4.4498],[51.215069,4.45005],[51.215179,4.45031],[51.215279,4.45061],[51.21553,4.45146],[51.215752,4.45216],[51.215969,4.45301],[51.216179,4.45406],[51.21629,4.45504],[51.21624,4.4558],[51.216091,4.45644],[51.21587,4.45707],[51.215561,4.4577],[51.21513,4.45828],[51.214211,4.45917],[51.214001,4.45936],[51.213348,4.45995],[51.212799,4.46049],[51.212372,4.46099],[51.21188,4.46168],[51.211639,4.46209],[51.211399,4.4626],[51.21117,4.46318],[51.210999,4.46376],[51.21085,4.46433],[51.21072,4.46503],[51.21064,4.46571],[51.21059,4.46636],[51.21059,4.46705],[51.21064,4.46793],[51.21069,4.46847],[51.210751,4.4691],[51.210831,4.4697],[51.210949,4.47055],[51.211071,4.47136],[51.211208,4.47228],[51.21133,4.47315],[51.211391,4.47381],[51.21143,4.47447],[51.211441,4.47509],[51.211418,4.4757],[51.211369,4.4763],[51.211288,4.47694],[51.211151,4.47781],[51.21104,4.47848],[51.210621,4.48085],[51.210522,4.48162],[51.210468,4.48231],[51.210442,4.48312],[51.210449,4.48395],[51.210522,4.485],[51.21067,4.48653],[51.2108,4.4878],[51.211021,4.49018],[51.211121,4.49141],[51.211189,4.49236],[51.211281,4.49391],[51.211311,4.49473],[51.211399,4.49656],[51.211411,4.49859],[51.21143,4.49937],[51.211521,4.50276],[51.211601,4.50624],[51.211712,4.51037],[51.211819,4.51426],[51.211979,4.51977],[51.212101,4.52414],[51.212139,4.52645],[51.212139,4.5272],[51.212139,4.52783],[51.212101,4.52956],[51.212009,4.53141],[51.211868,4.53313],[51.21167,4.53514],[51.211361,4.53743],[51.211048,4.5392],[51.210789,4.54045],[51.210499,4.54188],[51.210258,4.54291],[51.20974,4.54486],[51.20895,4.54791],[51.207958,4.55163],[51.207031,4.55523],[51.206242,4.55827],[51.205238,4.56186],[51.204288,4.56546],[51.203209,4.5695],[51.202259,4.57309],[51.201279,4.57603],[51.200741,4.57732],[51.200111,4.57852],[51.199451,4.57959],[51.198872,4.58057],[51.19838,4.58161],[51.19804,4.58262],[51.1978,4.5836],[51.197651,4.58463],[51.197559,4.58614],[51.197651,4.5877],[51.197849,4.58903],[51.198071,4.58982],[51.19841,4.59072],[51.198761,4.59151],[51.199219,4.59231],[51.19952,4.59268],[51.199821,4.59306],[51.2006,4.59405],[51.201351,4.59523],[51.202019,4.59651],[51.202499,4.5977],[51.20274,4.59835],[51.203411,4.60025],[51.2048,4.60414],[51.205589,4.60638],[51.20805,4.61359],[51.20908,4.61659],[51.209782,4.61862],[51.2118,4.62442],[51.211979,4.62497],[51.21299,4.62775],[51.21402,4.63045],[51.215729,4.63444],[51.217651,4.63834],[51.220181,4.64284],[51.22282,4.64712],[51.231232,4.66047],[51.233978,4.66484],[51.236111,4.66835],[51.237961,4.67215],[51.238979,4.67465],[51.239761,4.67689],[51.240608,4.67974],[51.241291,4.68251],[51.241741,4.68479],[51.24213,4.68706],[51.242741,4.6915],[51.243031,4.69416],[51.243351,4.69842],[51.243519,4.70165],[51.24366,4.70643],[51.243729,4.71221],[51.24371,4.71458],[51.243629,4.72741],[51.24353,4.74118],[51.243649,4.75037],[51.243801,4.7541],[51.244019,4.75768],[51.244381,4.76209],[51.24469,4.765],[51.245781,4.77292],[51.24646,4.77688],[51.24728,4.78085],[51.248569,4.7859],[51.250038,4.79077],[51.250561,4.79228],[51.252048,4.79611],[51.254349,4.80124],[51.25631,4.80483],[51.257271,4.80658],[51.259121,4.80975],[51.260399,4.81183],[51.266781,4.82263],[51.279442,4.84386],[51.282082,4.84837],[51.284592,4.85299],[51.285591,4.85501],[51.286049,4.85596],[51.287418,4.85902],[51.288658,4.862],[51.28981,4.86514],[51.290352,4.86664],[51.291531,4.87026],[51.29224,4.87277],[51.292912,4.87527],[51.29356,4.87801],[51.29409,4.88039],[51.294601,4.88287],[51.295071,4.88551],[51.29549,4.88814],[51.29586,4.89084],[51.29615,4.89339],[51.29641,4.89605],[51.296761,4.90148],[51.29689,4.90434],[51.297009,4.90816],[51.297138,4.91369],[51.29726,4.91806],[51.297291,4.91929],[51.297428,4.92479],[51.297451,4.92556],[51.29755,4.92814],[51.29763,4.93275],[51.29784,4.94177],[51.297951,4.94568],[51.298038,4.94993],[51.298092,4.95214],[51.298229,4.95715],[51.298328,4.96224],[51.298389,4.96824],[51.298351,4.97133],[51.298229,4.97483],[51.298038,4.97831],[51.297821,4.98128],[51.297489,4.98522],[51.297081,4.9888],[51.296631,4.99216],[51.295898,4.9968],[51.29517,5.00171],[51.294781,5.00454],[51.294411,5.00746],[51.294209,5.00934],[51.29406,5.01122],[51.293911,5.01361],[51.293781,5.01604],[51.29372,5.01984],[51.293751,5.02273],[51.293812,5.02471],[51.293911,5.02694],[51.294369,5.03214],[51.29475,5.03562],[51.29538,5.04046],[51.296322,5.04725],[51.296661,5.05005],[51.296989,5.05315],[51.29726,5.05621],[51.297401,5.05818],[51.297489,5.06011],[51.297539,5.0623],[51.29755,5.06443],[51.297489,5.06721],[51.29734,5.07002],[51.297009,5.07402],[51.296612,5.07796],[51.295879,5.08397],[51.29549,5.08691],[51.295132,5.09009],[51.294731,5.09394],[51.29464,5.09467],[51.294441,5.09768],[51.294319,5.10016],[51.29425,5.10457],[51.294312,5.10802],[51.294498,5.11234],[51.294731,5.11532],[51.29509,5.11857],[51.295509,5.12156],[51.29599,5.12459],[51.296761,5.12847],[51.298199,5.13422],[51.300072,5.14081],[51.300591,5.14276],[51.301399,5.1459],[51.301991,5.14842],[51.30265,5.15159],[51.303249,5.15458],[51.303871,5.15814],[51.30452,5.16165],[51.305229,5.16517],[51.30595,5.16817],[51.306999,5.17226],[51.30851,5.17732],[51.310181,5.18249],[51.31218,5.18855],[51.312382,5.1892],[51.314838,5.19669],[51.318821,5.20905],[51.32016,5.21303],[51.320591,5.21436],[51.321072,5.21581],[51.321671,5.21766],[51.322681,5.22073],[51.323341,5.22275],[51.324051,5.22488],[51.32439,5.22589],[51.325031,5.22768],[51.325691,5.2294],[51.326279,5.23089],[51.327061,5.23264],[51.327991,5.23451],[51.32906,5.23651],[51.33009,5.23831],[51.331451,5.24065],[51.337521,5.25108],[51.344028,5.26264],[51.349178,5.27182],[51.351452,5.27587],[51.352482,5.27774],[51.353378,5.27947],[51.353821,5.28036],[51.35434,5.28142],[51.35508,5.28302],[51.355801,5.28465],[51.356491,5.28625],[51.36055,5.29579],[51.360729,5.29619],[51.363239,5.30209],[51.36348,5.30268],[51.364941,5.30605],[51.365059,5.30632],[51.36898,5.31556],[51.370361,5.31878],[51.37159,5.32166],[51.374432,5.32837],[51.375191,5.33016],[51.376862,5.33405],[51.382038,5.34624],[51.38332,5.34934],[51.384441,5.35214],[51.385429,5.35471],[51.387878,5.3613],[51.388371,5.36264],[51.389221,5.36492],[51.390381,5.36807],[51.39267,5.37428],[51.393459,5.37644],[51.39439,5.379],[51.394581,5.37961],[51.394798,5.3803],[51.394989,5.38097],[51.395168,5.38164],[51.395432,5.38274],[51.39555,5.38332],[51.395679,5.38394],[51.395851,5.38488],[51.395931,5.38535],[51.396049,5.38617],[51.396118,5.38674],[51.396259,5.38787],[51.396339,5.38878],[51.39642,5.38967],[51.39653,5.39132],[51.396641,5.393],[51.39674,5.39426],[51.396851,5.39539],[51.396912,5.39591],[51.397099,5.39728],[51.397221,5.39805],[51.397369,5.39886],[51.397449,5.39924],[51.397629,5.40014],[51.39777,5.40073],[51.397919,5.40135],[51.398209,5.40239],[51.40057,5.41075],[51.400631,5.41097],[51.402519,5.41765],[51.40287,5.41891],[51.403229,5.42027],[51.403629,5.422],[51.403839,5.42325],[51.403992,5.42403],[51.404099,5.42481],[51.40416,5.4252],[51.404202,5.42569],[51.404209,5.42611],[51.404221,5.42679],[51.404221,5.42789],[51.404209,5.42864],[51.404202,5.42919],[51.40419,5.42974],[51.404209,5.4303],[51.404209,5.43096],[51.404228,5.43145],[51.404259,5.43249],[51.404289,5.43305],[51.40435,5.43362],[51.404461,5.43508],[51.40453,5.43605],[51.404621,5.43689],[51.40485,5.43825],[51.404949,5.43928],[51.405041,5.44026],[51.405121,5.44118],[51.405201,5.44248],[51.405251,5.44356],[51.405369,5.44983],[51.405399,5.45333],[51.405449,5.45596],[51.405491,5.4582],[51.405571,5.46179],[51.40559,5.46252],[51.405609,5.4658],[51.405609,5.46911],[51.405521,5.47301],[51.40551,5.47352],[51.405399,5.47652],[51.40538,5.47713],[51.40527,5.48024],[51.405239,5.48126],[51.404968,5.48955],[51.404942,5.49025],[51.404911,5.49086],[51.404839,5.49202],[51.404781,5.49246],[51.404701,5.49293],[51.40461,5.49339],[51.40453,5.49377],[51.404469,5.4942],[51.404419,5.49469],[51.404388,5.495],[51.404388,5.49536],[51.404388,5.49565],[51.40443,5.49614],[51.404449,5.49643],[51.40448,5.4969],[51.404541,5.49732],[51.404621,5.49771],[51.404709,5.49809],[51.4048,5.49852],[51.404861,5.49884],[51.4049,5.49925],[51.404919,5.49962],[51.40493,5.49999],[51.404919,5.50091],[51.404919,5.50125],[51.4049,5.50403],[51.4049,5.50435],[51.40493,5.51077],[51.40493,5.51908],[51.404911,5.53358],[51.4049,5.53708],[51.4049,5.54587],[51.404911,5.54781],[51.404961,5.54935],[51.405041,5.5509],[51.40517,5.55247],[51.405239,5.55322],[51.40538,5.55445],[51.405571,5.55591],[51.405788,5.55737],[51.40588,5.55797],[51.40617,5.55947],[51.40646,5.56091],[51.40659,5.56148],[51.40731,5.56419],[51.407681,5.56548],[51.408421,5.56768],[51.408791,5.56875],[51.408951,5.56924],[51.41061,5.57402],[51.411709,5.57722],[51.413349,5.582],[51.416458,5.5911],[51.41695,5.59265],[51.417591,5.59477],[51.417992,5.59638],[51.418369,5.59811],[51.41872,5.59991],[51.418949,5.60137],[51.419189,5.60318],[51.419449,5.60551],[51.420132,5.61227],[51.421539,5.62703],[51.421829,5.63011],[51.42268,5.63891],[51.423019,5.64245],[51.423439,5.64695],[51.423569,5.64864],[51.423649,5.6499],[51.423691,5.6508],[51.423698,5.65328],[51.423672,5.65704],[51.423641,5.6593],[51.42358,5.66349],[51.4235,5.66887],[51.423439,5.67272],[51.423409,5.676],[51.423359,5.67842],[51.423241,5.68237],[51.423222,5.68285],[51.42308,5.68647],[51.422939,5.6889],[51.422791,5.69085],[51.422359,5.69652],[51.422218,5.69818],[51.42205,5.70026],[51.421551,5.7066],[51.4212,5.7111],[51.42083,5.7156],[51.42057,5.71879],[51.420441,5.72116],[51.420319,5.723],[51.42025,5.72475],[51.420109,5.72959],[51.42012,5.73225],[51.42017,5.73484],[51.420212,5.73755],[51.420219,5.73999],[51.42017,5.74142],[51.42009,5.74328],[51.419949,5.74522],[51.419701,5.74773],[51.419529,5.74925],[51.419449,5.74987],[51.419128,5.75225],[51.418869,5.75407],[51.41861,5.75592],[51.418388,5.75762],[51.418079,5.75985],[51.41795,5.76072],[51.417461,5.76412],[51.417301,5.76526],[51.41711,5.76661],[51.41692,5.76774],[51.416599,5.76945],[51.41618,5.77184],[51.41555,5.77506],[51.415131,5.77699],[51.41449,5.7797],[51.414021,5.78159],[51.41349,5.7837],[51.412601,5.7868],[51.411781,5.78951],[51.410831,5.79252],[51.4072,5.80385],[51.407001,5.80447],[51.40556,5.80905],[51.404072,5.81369],[51.403431,5.81581],[51.402599,5.81868],[51.401981,5.82092],[51.3988,5.83371],[51.397251,5.83991],[51.396141,5.84441],[51.39502,5.8489],[51.393501,5.85508],[51.39146,5.86325],[51.39127,5.864],[51.390388,5.86731],[51.389561,5.87036],[51.387989,5.87586],[51.3848,5.88699],[51.382519,5.89479],[51.380829,5.90075],[51.380119,5.90336],[51.37936,5.90683],[51.37886,5.90941],[51.378521,5.91146],[51.378189,5.91406],[51.377979,5.9158],[51.377789,5.91788],[51.377682,5.91923],[51.377468,5.92297],[51.377441,5.92369],[51.377411,5.92498],[51.377399,5.92758],[51.377499,5.93505],[51.377659,5.94228],[51.377918,5.95907],[51.37801,5.96417],[51.378029,5.96599],[51.37801,5.96775],[51.377918,5.97046],[51.377781,5.97305],[51.377548,5.97627],[51.377331,5.98114],[51.37735,5.9839],[51.37735,5.98477],[51.37759,5.99092],[51.37812,5.99769],[51.37854,6.00253],[51.378769,6.00521],[51.378971,6.00723],[51.37949,6.01193],[51.380131,6.01689],[51.380531,6.01951],[51.381161,6.02336],[51.381538,6.02554],[51.38237,6.02959],[51.382751,6.03147],[51.383732,6.03571],[51.387409,6.05021],[51.389172,6.05713],[51.393082,6.07238],[51.393429,6.07391],[51.393791,6.0758],[51.393978,6.077],[51.394131,6.07807],[51.394249,6.07917],[51.394329,6.0803],[51.394421,6.08177],[51.394451,6.08392],[51.394199,6.09123],[51.394039,6.09627],[51.393539,6.10898],[51.393478,6.1104],[51.39336,6.11481],[51.39333,6.11742],[51.393471,6.1237],[51.393688,6.12859],[51.394279,6.13838],[51.39436,6.13939],[51.394451,6.14064],[51.394501,6.14145],[51.39518,6.15196],[51.39534,6.15451],[51.395611,6.15861],[51.395901,6.16434],[51.39592,6.16507],[51.39595,6.16609],[51.395969,6.1688],[51.395931,6.17027],[51.395851,6.17172],[51.395809,6.17254],[51.395741,6.17316],[51.39547,6.17562],[51.39521,6.17761],[51.39481,6.17986],[51.394588,6.18087],[51.39426,6.18234],[51.393848,6.18393],[51.393051,6.18666],[51.391201,6.19293],[51.389439,6.19895],[51.387581,6.20492],[51.387119,6.20635],[51.386139,6.20954],[51.384048,6.21632],[51.382431,6.22147],[51.382191,6.2223],[51.38166,6.22413],[51.381069,6.2267],[51.380482,6.23024],[51.380211,6.23265],[51.380039,6.23456],[51.379971,6.23568],[51.379929,6.23745],[51.379971,6.23919],[51.38002,6.24017],[51.380169,6.24235],[51.380199,6.24288],[51.380268,6.24355],[51.380409,6.24457],[51.38081,6.24762],[51.381229,6.24972],[51.381771,6.25191],[51.381851,6.25218],[51.3825,6.25446],[51.382992,6.25592],[51.384571,6.25981],[51.38628,6.26362],[51.38763,6.26717],[51.387741,6.26748],[51.388821,6.27117],[51.388981,6.27186],[51.389351,6.27366],[51.389759,6.27584],[51.38987,6.27655],[51.389969,6.27729],[51.390339,6.28112],[51.390339,6.28241],[51.390339,6.28301],[51.39035,6.28613],[51.390091,6.29202],[51.389912,6.29597],[51.38982,6.29785],[51.389729,6.30039],[51.389488,6.30467],[51.389172,6.31284],[51.388729,6.32214],[51.38855,6.329],[51.388599,6.33371],[51.388821,6.33742],[51.38884,6.33765],[51.38884,6.33775],[51.389149,6.34048],[51.389622,6.34365],[51.39024,6.3467],[51.390331,6.34707],[51.390652,6.34839],[51.391491,6.35144],[51.392441,6.35452],[51.393871,6.3589],[51.394058,6.35941],[51.394421,6.3605],[51.394821,6.36159],[51.39584,6.36458],[51.39621,6.36582],[51.39698,6.36793],[51.399311,6.3749],[51.400372,6.37825],[51.400539,6.37881],[51.401581,6.38237],[51.403149,6.38824],[51.403801,6.39103],[51.404282,6.39306],[51.404369,6.39346],[51.40443,6.39371],[51.40451,6.39412],[51.405708,6.40013],[51.406979,6.40767],[51.40802,6.41569],[51.40815,6.41689],[51.40823,6.41773],[51.408329,6.41866],[51.40844,6.41988],[51.408619,6.42204],[51.408718,6.42343],[51.408958,6.42648],[51.409351,6.43376],[51.410229,6.44922],[51.410912,6.46069],[51.411388,6.46954],[51.41164,6.47208],[51.411819,6.47329],[51.41193,6.47387],[51.412102,6.47472],[51.412529,6.47644],[51.41304,6.47806],[51.413429,6.47915],[51.41362,6.47958],[51.41433,6.48118],[51.416302,6.4848],[51.418781,6.48943],[51.419121,6.4901],[51.419258,6.49035],[51.419521,6.49084],[51.419819,6.49143],[51.420101,6.49197],[51.42136,6.49432],[51.423061,6.49833],[51.42363,6.49987],[51.42461,6.50291],[51.425228,6.50535],[51.426071,6.50966],[51.426102,6.50984],[51.426151,6.51011],[51.426491,6.51252],[51.426498,6.51262],[51.42659,6.51358],[51.426762,6.51535],[51.427052,6.52207],[51.427231,6.53069],[51.427238,6.53088],[51.427368,6.53329],[51.427521,6.53609],[51.42799,6.54291],[51.42828,6.54714],[51.428631,6.55212],[51.428928,6.55589],[51.429508,6.56421],[51.43005,6.56866],[51.43092,6.57325],[51.431541,6.57603],[51.432091,6.57825],[51.432789,6.58093],[51.433418,6.58378],[51.434471,6.58956],[51.435162,6.59419],[51.435532,6.59735],[51.435841,6.60087],[51.435982,6.60295],[51.436031,6.60391],[51.436089,6.60506],[51.436169,6.60728],[51.436211,6.60933],[51.43623,6.61085],[51.436218,6.61229],[51.436211,6.61338],[51.43618,6.61485],[51.436161,6.61573],[51.436119,6.61677],[51.436001,6.61847],[51.435909,6.62006],[51.43589,6.62054],[51.435791,6.62232],[51.435719,6.6238],[51.435619,6.6272],[51.435631,6.63186],[51.435719,6.63537],[51.435928,6.63872],[51.436218,6.64277],[51.43652,6.64744],[51.43663,6.64967],[51.43671,6.65219],[51.436729,6.65546],[51.43679,6.65711],[51.43697,6.66175],[51.437,6.66234],[51.437019,6.66297],[51.437279,6.67126],[51.437321,6.67279],[51.437359,6.67531],[51.43742,6.68066],[51.437401,6.68155],[51.43737,6.68277],[51.437271,6.68504],[51.437111,6.68668],[51.43681,6.6887],[51.43618,6.69207],[51.435699,6.69477],[51.435581,6.69569],[51.435509,6.69632],[51.43541,6.69751],[51.435349,6.69886],[51.435329,6.70035],[51.435379,6.70175],[51.435509,6.70337],[51.435692,6.70467],[51.436069,6.7069],[51.43811,6.71953],[51.438358,6.72115],[51.438541,6.7228],[51.438629,6.72482],[51.438511,6.72655],[51.438271,6.72848],[51.437729,6.73069],[51.436901,6.7328],[51.436451,6.73392],[51.436169,6.73462],[51.43568,6.73624],[51.435421,6.73745],[51.435291,6.73821],[51.435051,6.73985],[51.43491,6.74152],[51.43486,6.74321],[51.434849,6.74462],[51.434929,6.74645],[51.435169,6.74879],[51.435349,6.7499],[51.435471,6.75059],[51.43568,6.75184],[51.43605,6.75345],[51.436588,6.75525],[51.437061,6.75633],[51.43734,6.75687],[51.438301,6.7584],[51.439831,6.76023],[51.44173,6.76266],[51.44257,6.76421],[51.443211,6.76552],[51.443981,6.76754],[51.444592,6.7697],[51.445171,6.77222],[51.44598,6.77676],[51.44632,6.77867],[51.446621,6.78057],[51.447021,6.78296],[51.447361,6.78519],[51.44762,6.78704],[51.4478,6.78876],[51.44783,6.79036],[51.4478,6.79163],[51.447601,6.79349],[51.447311,6.79505],[51.44696,6.79636],[51.446671,6.79732],[51.44632,6.79822],[51.446072,6.79865],[51.445259,6.80026],[51.444401,6.80188],[51.44429,6.80213],[51.443951,6.80283],[51.443432,6.80394],[51.44305,6.80456],[51.44294,6.80471],[51.442791,6.80487],[51.44265,6.80495],[51.442459,6.80499],[51.442329,6.80496],[51.442181,6.80488],[51.442081,6.80479],[51.44194,6.80458],[51.44186,6.8043],[51.441811,6.8041],[51.441792,6.8038],[51.441792,6.80368],[51.441811,6.80346],[51.441879,6.80322],[51.441959,6.80295],[51.442089,6.80256],[51.442211,6.80226],[51.442429,6.80195],[51.442871,6.80134],[51.44342,6.8007],[51.444061,6.80015],[51.444431,6.79987],[51.444641,6.79971],[51.444809,6.7996],[51.44566,6.79921],[51.446529,6.799],[51.447182,6.79889],[51.447929,6.79884],[51.449249,6.79886],[51.450062,6.79895],[51.451248,6.7991],[51.45211,6.79927],[51.45311,6.79947],[51.454029,6.79984],[51.454899,6.80039],[51.45573,6.80101],[51.45639,6.80168],[51.456959,6.80235],[51.457588,6.80329],[51.458141,6.80427],[51.45866,6.80531],[51.459122,6.80651],[51.459789,6.80861],[51.460159,6.8097],[51.460659,6.81081],[51.46172,6.81251],[51.461948,6.81283],[51.462391,6.81341],[51.462681,6.81371],[51.463501,6.81453],[51.46389,6.81483],[51.464821,6.81552],[51.465771,6.8159],[51.466869,6.81625],[51.468349,6.81658],[51.470051,6.81669],[51.471851,6.8165],[51.473011,6.81621],[51.47398,6.81587],[51.474541,6.8157],[51.47541,6.81537],[51.47633,6.81497],[51.477489,6.81446],[51.478821,6.81388],[51.47916,6.81377],[51.480099,6.81351],[51.48127,6.81332],[51.48185,6.8133],[51.483139,6.81333],[51.483341,6.81342],[51.483582,6.81349],[51.484051,6.8136],[51.484409,6.8137],[51.4851,6.814],[51.4855,6.81421],[51.485771,6.8144],[51.486031,6.8146],[51.486149,6.81473],[51.48632,6.81496],[51.486488,6.81527],[51.48661,6.81557],[51.48674,6.81603],[51.486801,6.81641],[51.48682,6.81667],[51.486832,6.81699],[51.486809,6.81731],[51.486252,6.82101],[51.486198,6.82155],[51.486191,6.82224],[51.48613,6.82305],[51.486099,6.82352],[51.486069,6.82462],[51.486118,6.82628],[51.48629,6.82779],[51.48674,6.83007],[51.4874,6.83218],[51.488831,6.836],[51.489079,6.83642],[51.48975,6.83737],[51.490349,6.83822],[51.490829,6.83886],[51.49268,6.84133],[51.492962,6.84171],[51.493629,6.84264],[51.49432,6.84385],[51.4949,6.84507],[51.495281,6.84597],[51.49572,6.84735],[51.496052,6.8486],[51.496349,6.85008],[51.496571,6.85205],[51.496651,6.85463],[51.49654,6.85815],[51.496441,6.86022],[51.496342,6.86164],[51.49622,6.8647],[51.496101,6.86872],[51.496132,6.87109],[51.496342,6.88355],[51.496422,6.88532],[51.496639,6.8891],[51.496681,6.88994],[51.496769,6.89124],[51.49688,6.89292],[51.49704,6.89456],[51.49754,6.90146],[51.49781,6.91115],[51.49823,6.9167],[51.498699,6.92018],[51.499279,6.92279],[51.49995,6.9251],[51.500381,6.92628],[51.502979,6.93204],[51.503391,6.93294],[51.50415,6.93473],[51.50428,6.93505],[51.504478,6.93559],[51.50473,6.93621],[51.505058,6.93707],[51.50531,6.93774],[51.50568,6.93884],[51.505909,6.93961],[51.506149,6.94042],[51.50634,6.94113],[51.506481,6.94171],[51.50668,6.94259],[51.506882,6.94349],[51.507061,6.94441],[51.507309,6.94577],[51.507511,6.94717],[51.507629,6.94811],[51.507679,6.9483],[51.507751,6.94906],[51.507851,6.95002],[51.507919,6.95101],[51.50798,6.95199],[51.508011,6.95296],[51.508049,6.95394],[51.508049,6.95491],[51.50803,6.95637],[51.508011,6.95741],[51.507969,6.95846],[51.5079,6.95952],[51.507809,6.96061],[51.50771,6.96166],[51.50761,6.96267],[51.507511,6.96364],[51.507401,6.96457],[51.507301,6.96548],[51.50721,6.96642],[51.507099,6.96736],[51.507011,6.96826],[51.506908,6.96914],[51.506802,6.97007],[51.506618,6.97107],[51.506481,6.97167],[51.506088,6.97303],[51.50581,6.97399],[51.50378,6.97994],[51.50354,6.9808],[51.503361,6.98158],[51.50322,6.98288],[51.503109,6.98417],[51.503059,6.98502],[51.503059,6.98587],[51.503132,6.98712],[51.503201,6.98794],[51.50338,6.98916],[51.503559,6.98996],[51.50386,6.99122],[51.50407,6.99203],[51.504471,6.99341],[51.504799,6.99441],[51.505051,6.99517],[51.50531,6.99594],[51.505661,6.99694],[51.505951,6.99787],[51.50618,6.99864],[51.50639,6.99936],[51.506611,7.0001],[51.50679,7.00076],[51.50692,7.00141],[51.50713,7.00247],[51.507252,7.0032],[51.507309,7.00377],[51.507389,7.00478],[51.507469,7.00601],[51.507511,7.00706],[51.507568,7.00815],[51.507622,7.0094],[51.50771,7.01091],[51.507778,7.01189],[51.5079,7.01303],[51.50798,7.01356],[51.50808,7.01418],[51.50853,7.01628],[51.508598,7.01657],[51.50882,7.01736],[51.508911,7.01776],[51.508991,7.01802],[51.509449,7.01924],[51.509651,7.01977],[51.51001,7.02061],[51.510441,7.0216],[51.51067,7.02212],[51.510971,7.02282],[51.511318,7.02362],[51.511749,7.02466],[51.51218,7.02575],[51.512489,7.02662],[51.51302,7.02839],[51.51318,7.02901],[51.513241,7.02923],[51.513378,7.02978],[51.5135,7.03033],[51.51379,7.03182],[51.51405,7.03356],[51.514198,7.03489],[51.514351,7.03674],[51.51437,7.03743],[51.514381,7.03811],[51.5144,7.03938],[51.51442,7.04053],[51.514431,7.04131],[51.514469,7.04353],[51.514469,7.04414],[51.514488,7.04472],[51.514542,7.04728],[51.51458,7.04906],[51.514709,7.0513],[51.514931,7.05337],[51.515228,7.05491],[51.51569,7.05666],[51.51609,7.0581],[51.51664,7.05958],[51.51804,7.06284],[51.519421,7.06611],[51.51976,7.06685],[51.520069,7.0676],[51.520451,7.06844],[51.521461,7.07034],[51.522091,7.07128],[51.522469,7.07174],[51.522919,7.07226],[51.523548,7.07292],[51.523918,7.07324],[51.524281,7.07349],[51.52504,7.07395],[51.525612,7.07422],[51.526218,7.0745],[51.52739,7.07508],[51.528431,7.07578],[51.529202,7.07652],[51.529968,7.07744],[51.530621,7.07847],[51.531349,7.07998],[51.531639,7.08085],[51.53178,7.08126],[51.532188,7.08277],[51.532478,7.08456],[51.532539,7.08514],[51.532681,7.0868],[51.532902,7.08914],[51.533161,7.09096],[51.533421,7.09249],[51.533749,7.09376],[51.534119,7.09503],[51.534389,7.09584],[51.534439,7.09597],[51.534561,7.09629],[51.53529,7.09819],[51.535419,7.09858],[51.535782,7.09977],[51.536011,7.10056],[51.536228,7.10172],[51.536419,7.10277],[51.536591,7.10419],[51.53746,7.11268],[51.537781,7.11582],[51.537899,7.117],[51.53796,7.11818],[51.537991,7.11909],[51.537979,7.12019],[51.53783,7.12271],[51.53772,7.12502],[51.537651,7.12646],[51.537651,7.12701],[51.53764,7.1282],[51.53764,7.12896],[51.537651,7.12917],[51.53764,7.12952],[51.53801,7.135],[51.538422,7.1388],[51.538589,7.1399],[51.538929,7.14149],[51.53949,7.14344],[51.540791,7.14728],[51.540798,7.14734],[51.541142,7.14849],[51.541241,7.14885],[51.541569,7.15025],[51.54187,7.15221],[51.542019,7.15344],[51.54203,7.15516],[51.541931,7.15783],[51.541889,7.15901],[51.541821,7.16064],[51.541889,7.16227],[51.541931,7.16295],[51.54224,7.16765],[51.542301,7.16893],[51.542358,7.17118],[51.542389,7.17196],[51.5424,7.17221],[51.54258,7.17451],[51.54261,7.17482],[51.54285,7.17645],[51.542992,7.17739],[51.543129,7.17809],[51.543251,7.17887],[51.543362,7.17973],[51.543541,7.18114],[51.54364,7.18225],[51.54372,7.18371],[51.54377,7.18551],[51.543739,7.18735],[51.543751,7.18831],[51.543739,7.1901],[51.54377,7.19114],[51.54377,7.19203],[51.5438,7.19345],[51.5439,7.19547],[51.54401,7.197],[51.54406,7.19781],[51.544159,7.19858],[51.544319,7.19959],[51.544491,7.20032],[51.544949,7.20227],[51.545071,7.20274],[51.545212,7.20327],[51.5453,7.20364],[51.545719,7.20504],[51.547321,7.20951],[51.548038,7.2115],[51.54821,7.21198],[51.548439,7.2125],[51.549198,7.21465],[51.5495,7.21541],[51.555611,7.23041],[51.555901,7.23109],[51.55603,7.23137],[51.556141,7.23164],[51.556469,7.23245],[51.556751,7.2331],[51.557121,7.2339],[51.557549,7.23481],[51.557961,7.23604],[51.55835,7.23732],[51.558632,7.23866],[51.55888,7.24011],[51.559021,7.24148],[51.559101,7.2429],[51.559132,7.24386],[51.55899,7.24571],[51.558868,7.24714],[51.558651,7.24856],[51.5583,7.25041],[51.55806,7.25159],[51.557812,7.25266],[51.557541,7.25399],[51.55732,7.25532],[51.557159,7.25671],[51.55706,7.25809],[51.556992,7.25947],[51.557011,7.26144],[51.55706,7.26255],[51.557159,7.26354],[51.55751,7.26621],[51.557701,7.26752],[51.557861,7.26839],[51.557949,7.26905],[51.558071,7.26972],[51.55827,7.27111],[51.558392,7.27207],[51.558529,7.27356],[51.558609,7.27506],[51.55862,7.27656],[51.55859,7.27804],[51.558529,7.27895],[51.558529,7.27951],[51.558418,7.28097],[51.558361,7.28194],[51.558289,7.28291],[51.558239,7.28386],[51.558189,7.28481],[51.558159,7.28624],[51.558189,7.28766],[51.55827,7.28906],[51.558411,7.29047],[51.558571,7.29187],[51.558601,7.29208],[51.55867,7.29261],[51.55883,7.29417],[51.558949,7.29507],[51.559071,7.29598],[51.559189,7.29688],[51.559299,7.29778],[51.559422,7.29868],[51.559528,7.29958],[51.559639,7.30045],[51.559731,7.30127],[51.55983,7.30207],[51.559929,7.30283],[51.560032,7.30362],[51.56012,7.30442],[51.560211,7.3052],[51.56031,7.30583],[51.560349,7.30618],[51.560471,7.30717],[51.560551,7.30793],[51.560669,7.30902],[51.56078,7.30999],[51.56105,7.31307],[51.561241,7.3154],[51.56147,7.31788],[51.561569,7.31974],[51.561611,7.32072],[51.56171,7.32205],[51.561779,7.32318],[51.56184,7.32389],[51.562012,7.32659],[51.562149,7.33011],[51.56229,7.3331],[51.562389,7.33599],[51.562469,7.33965],[51.562519,7.34197],[51.562519,7.34284],[51.562519,7.34333],[51.562531,7.34573],[51.562469,7.3485],[51.562328,7.35043],[51.562069,7.35259],[51.562031,7.35289],[51.561779,7.35495],[51.561531,7.35659],[51.561291,7.35808],[51.561291,7.35811],[51.561199,7.35845],[51.561008,7.35929],[51.560909,7.3595],[51.56078,7.35966],[51.560692,7.35974],[51.560589,7.35978],[51.56049,7.35978],[51.560291,7.3597],[51.5602,7.3596],[51.56007,7.35931],[51.560032,7.35916],[51.560032,7.35899],[51.560059,7.35869],[51.560101,7.35858],[51.560181,7.35841],[51.560299,7.35828],[51.560379,7.35823],[51.560551,7.3582],[51.561131,7.35833],[51.561661,7.35851],[51.561779,7.35856],[51.561939,7.35859],[51.562241,7.3587],[51.562809,7.35894],[51.563351,7.35919],[51.563709,7.35935],[51.564259,7.35961],[51.564602,7.35978],[51.564892,7.35988],[51.56517,7.35999],[51.565578,7.36019],[51.566071,7.36044],[51.56638,7.3606],[51.566589,7.36071],[51.566719,7.36077],[51.56686,7.36084],[51.566952,7.36086],[51.567051,7.36085],[51.56723,7.36094],[51.567402,7.36103],[51.567589,7.36112],[51.568249,7.36145],[51.568581,7.36161],[51.568901,7.36176],[51.569561,7.36207],[51.569901,7.36223],[51.570229,7.36237],[51.571281,7.36284],[51.571812,7.36307],[51.572319,7.36329],[51.57275,7.36346],[51.573139,7.36362],[51.573471,7.36376],[51.573818,7.3639],[51.574638,7.36421],[51.575439,7.36451],[51.576359,7.36484],[51.576591,7.36492],[51.576988,7.36506],[51.5774,7.36519],[51.57777,7.36532],[51.578259,7.36548],[51.579189,7.36578],[51.579529,7.36596],[51.579689,7.36601],[51.580959,7.36641],[51.581139,7.36647],[51.582199,7.36688],[51.58263,7.36702],[51.58305,7.36722],[51.58326,7.36734],[51.583469,7.36749],[51.583649,7.36767],[51.583839,7.36786],[51.58403,7.36812],[51.58419,7.36836],[51.584339,7.36861],[51.58448,7.36891],[51.584629,7.36921],[51.58482,7.36963],[51.584969,7.36999],[51.585041,7.37021],[51.585091,7.37044],[51.585121,7.37069],[51.585152,7.37097],[51.585159,7.37122],[51.585159,7.37148],[51.585121,7.37199],[51.584991,7.37375],[51.584991,7.374],[51.584671,7.37836],[51.584621,7.37916],[51.58432,7.38337],[51.584221,7.3848],[51.584122,7.38621],[51.584019,7.38768],[51.583721,7.39179],[51.583691,7.39218],[51.583611,7.39328],[51.583569,7.39381],[51.583542,7.39437],[51.583488,7.39536],[51.58345,7.39625],[51.583389,7.39708],[51.58334,7.39788],[51.58329,7.3991],[51.583279,7.40034],[51.58329,7.40065],[51.583309,7.40171],[51.583382,7.40315],[51.583439,7.4039],[51.5835,7.40464],[51.583519,7.40483],[51.583591,7.40521],[51.583672,7.40557],[51.583721,7.40612],[51.58382,7.40704],[51.58392,7.40807],[51.58403,7.40904],[51.584202,7.41055],[51.58432,7.41158],[51.584431,7.41267],[51.584499,7.41334],[51.584549,7.41403],[51.584579,7.4145],[51.58461,7.4151],[51.584641,7.4157],[51.58466,7.41627],[51.584671,7.41685],[51.584671,7.41771],[51.584648,7.41847],[51.584629,7.41912],[51.584599,7.41974],[51.584549,7.42059],[51.584492,7.42138],[51.584431,7.42199],[51.584351,7.42266],[51.584221,7.42369],[51.58408,7.42462],[51.583832,7.42597],[51.583691,7.42671],[51.58353,7.42746],[51.58337,7.4282],[51.58321,7.42895],[51.582531,7.43192],[51.58099,7.43861],[51.577789,7.45246],[51.576969,7.45601],[51.57658,7.45769],[51.576351,7.4587],[51.57613,7.45966],[51.575909,7.46067],[51.57571,7.46165],[51.57552,7.46265],[51.575329,7.4637],[51.57518,7.46471],[51.575039,7.46575],[51.574928,7.4668],[51.574829,7.46786],[51.57476,7.46891],[51.574718,7.47],[51.574692,7.47104],[51.57468,7.47212],[51.574699,7.47319],[51.574749,7.47434],[51.57481,7.47533],[51.57489,7.4764],[51.57494,7.47691],[51.574989,7.47742],[51.575119,7.47844],[51.57523,7.47924],[51.57539,7.48021],[51.57555,7.48119],[51.57576,7.48235],[51.57608,7.48387],[51.576271,7.48479],[51.576309,7.485],[51.576771,7.48709],[51.577591,7.49089],[51.578011,7.49299],[51.578152,7.49385],[51.57827,7.4947],[51.5784,7.49571],[51.57851,7.49673],[51.57859,7.49762],[51.578651,7.49843],[51.578701,7.49912],[51.578739,7.4999],[51.578751,7.50038],[51.57877,7.50084],[51.578781,7.50189],[51.578781,7.50282],[51.578758,7.50375],[51.578739,7.5045],[51.578701,7.5054],[51.57869,7.50576],[51.578621,7.50705],[51.57859,7.50803],[51.578571,7.50862],[51.578529,7.50941],[51.578499,7.51038],[51.57848,7.5108],[51.57843,7.51217],[51.578381,7.51321],[51.578339,7.51423],[51.5783,7.51529],[51.578281,7.51577],[51.578259,7.51615],[51.578209,7.51752],[51.578171,7.51851],[51.578129,7.5196],[51.578091,7.5207],[51.578091,7.5218],[51.57811,7.52288],[51.578152,7.52394],[51.578201,7.52478],[51.57827,7.52559],[51.578331,7.52628],[51.578369,7.5266],[51.57843,7.52711],[51.578499,7.52769],[51.57864,7.52868],[51.57877,7.5294],[51.578899,7.53008],[51.578991,7.53053],[51.579079,7.53098],[51.579281,7.53187],[51.579441,7.53249],[51.579609,7.53312],[51.57983,7.53392],[51.58007,7.53472],[51.58046,7.53605],[51.580769,7.53709],[51.58123,7.53863],[51.581451,7.53938],[51.581871,7.54081],[51.582241,7.54203],[51.583309,7.54564],[51.58363,7.54673],[51.584259,7.54883],[51.584648,7.55012],[51.584831,7.55076],[51.585011,7.5514],[51.585159,7.55197],[51.585289,7.55252],[51.585411,7.55302],[51.585529,7.55354],[51.585651,7.55411],[51.58577,7.55468],[51.585869,7.55518],[51.58596,7.55569],[51.58606,7.5563],[51.586159,7.55691],[51.5863,7.55789],[51.586411,7.55872],[51.586491,7.55944],[51.586571,7.56016],[51.586861,7.56301],[51.58717,7.56606],[51.587811,7.57225],[51.588902,7.58372],[51.58952,7.5933],[51.59026,7.6039],[51.590408,7.60583],[51.590462,7.60636],[51.590549,7.60696],[51.59111,7.61037],[51.59132,7.61134],[51.591709,7.61331],[51.59182,7.614],[51.592159,7.61592],[51.592571,7.61796],[51.592892,7.61959],[51.59317,7.62098],[51.593712,7.62371],[51.594002,7.62533],[51.594719,7.62911],[51.59486,7.62982],[51.59499,7.63051],[51.597221,7.64195],[51.59819,7.64671],[51.598789,7.6504],[51.59893,7.65125],[51.599091,7.65217],[51.599911,7.65679],[51.60001,7.65743],[51.60043,7.65993],[51.600689,7.66178],[51.600769,7.66243],[51.60088,7.66422],[51.60091,7.66476],[51.60096,7.66599],[51.600948,7.66965],[51.60091,7.67532],[51.600891,7.67944],[51.600899,7.68501],[51.600891,7.6879],[51.60088,7.69047],[51.600891,7.69413],[51.600861,7.69814],[51.600868,7.70294],[51.600868,7.70605],[51.600941,7.70745],[51.60104,7.7089],[51.601219,7.71043],[51.601521,7.71234],[51.601768,7.71369],[51.60215,7.71536],[51.602661,7.71758],[51.603401,7.72063],[51.605679,7.73041],[51.606239,7.73281],[51.60643,7.73365],[51.607349,7.73746],[51.607731,7.73907],[51.60902,7.74463],[51.609558,7.74701],[51.609879,7.74839],[51.610779,7.75216],[51.61095,7.75295],[51.61179,7.75657],[51.612148,7.75829],[51.61359,7.7652],[51.613682,7.76564],[51.614151,7.76791],[51.6143,7.76865],[51.615742,7.77577],[51.616322,7.77862],[51.617611,7.78492],[51.618111,7.78763],[51.618752,7.79107],[51.619671,7.79649],[51.62072,7.8026],[51.621819,7.80895],[51.62244,7.81259],[51.623089,7.81769],[51.623421,7.82074],[51.6236,7.82378],[51.624069,7.83272],[51.624149,7.83382],[51.624611,7.84164],[51.624901,7.8468],[51.62495,7.84767],[51.625149,7.85185],[51.625198,7.85266],[51.625301,7.85381],[51.62553,7.85567],[51.625759,7.8571],[51.62603,7.85854],[51.626621,7.86089],[51.626999,7.86221],[51.627499,7.8637],[51.628529,7.86656],[51.63028,7.87145],[51.632408,7.87746],[51.63369,7.88111],[51.634609,7.88375],[51.635479,7.88627],[51.636829,7.89005],[51.638069,7.89329],[51.63982,7.89801],[51.643669,7.90798],[51.64444,7.90994],[51.64513,7.91146],[51.645748,7.91261],[51.646309,7.91357],[51.647079,7.91479],[51.64782,7.91587],[51.649281,7.91756],[51.650162,7.9185],[51.652962,7.92068],[51.65921,7.92535],[51.66478,7.92948],[51.666481,7.93092],[51.667461,7.93197],[51.668388,7.93306],[51.669121,7.93402],[51.669701,7.93487],[51.670361,7.93596],[51.67128,7.93766],[51.67181,7.9387],[51.672089,7.93925],[51.675251,7.94549],[51.675961,7.9468],[51.676571,7.94784],[51.677509,7.94919],[51.67844,7.9504],[51.679081,7.95118],[51.68021,7.95252],[51.681889,7.95451],[51.68465,7.9577],[51.68486,7.95795],[51.688831,7.96253],[51.68943,7.96323],[51.691681,7.96587],[51.694801,7.96948],[51.694969,7.96969],[51.696449,7.97137],[51.698071,7.97327],[51.699009,7.97433],[51.69981,7.97509],[51.700691,7.97584],[51.70166,7.97653],[51.70285,7.97724],[51.703911,7.97781],[51.704929,7.97819],[51.706108,7.97849],[51.70723,7.97867],[51.709469,7.97887],[51.712429,7.97905],[51.72028,7.97964],[51.72121,7.97971],[51.721931,7.9798],[51.722488,7.97991],[51.723068,7.98007],[51.724079,7.98043],[51.725029,7.98082],[51.725941,7.98132],[51.72683,7.98186],[51.730968,7.98433],[51.735161,7.98683],[51.73597,7.98732],[51.757,7.99996],[51.75713,8.00004],[51.761951,8.00292],[51.76778,8.00644],[51.76865,8.00706],[51.769272,8.00759],[51.769791,8.00808],[51.77037,8.00867],[51.771149,8.00953],[51.771778,8.01032],[51.772381,8.01117],[51.772739,8.01171],[51.773022,8.01213],[51.77364,8.01325],[51.774139,8.01421],[51.7747,8.01539],[51.77486,8.01581],[51.775139,8.01646],[51.775558,8.01758],[51.77586,8.01844],[51.77607,8.01915],[51.776249,8.01978],[51.776482,8.0207],[51.777779,8.02621],[51.779148,8.03231],[51.77919,8.0325],[51.77935,8.03314],[51.78109,8.04068],[51.78199,8.04458],[51.782379,8.04621],[51.782761,8.04768],[51.783119,8.0489],[51.78363,8.0505],[51.785709,8.05654],[51.7859,8.05711],[51.788849,8.0656],[51.790531,8.07057],[51.790661,8.07092],[51.79266,8.07673],[51.79438,8.08179],[51.796059,8.08666],[51.79829,8.09329],[51.798752,8.09476],[51.7994,8.09704],[51.800251,8.10029],[51.801769,8.10654],[51.802818,8.11106],[51.803341,8.11329],[51.803589,8.11438],[51.804901,8.12144],[51.806179,8.12817],[51.806469,8.1297],[51.806881,8.13148],[51.807301,8.133],[51.807522,8.13369],[51.80777,8.13451],[51.8083,8.13594],[51.80957,8.13884],[51.81089,8.14193],[51.81139,8.1432],[51.81179,8.14429],[51.812328,8.14601],[51.812851,8.14795],[51.813831,8.15192],[51.815701,8.15951],[51.819611,8.17346],[51.821659,8.18062],[51.823521,8.1873],[51.824162,8.1898],[51.824612,8.19176],[51.825001,8.19363],[51.825298,8.19525],[51.825661,8.19734],[51.826599,8.20373],[51.828011,8.21375],[51.828949,8.22073],[51.8321,8.2427],[51.833431,8.25189],[51.834709,8.26084],[51.83506,8.26298],[51.835461,8.26496],[51.836048,8.26736],[51.837231,8.27094],[51.840221,8.27917],[51.842819,8.28644],[51.843109,8.28733],[51.843418,8.28839],[51.844082,8.29078],[51.84436,8.29183],[51.8452,8.29493],[51.84552,8.29616],[51.84684,8.30111],[51.847271,8.30268],[51.848518,8.30731],[51.849789,8.31204],[51.850498,8.31436],[51.85062,8.31468],[51.851238,8.31633],[51.851891,8.31787],[51.853531,8.32144],[51.854641,8.32379],[51.855209,8.32498],[51.85619,8.32714],[51.857101,8.32945],[51.857349,8.33024],[51.857601,8.33111],[51.85788,8.33211],[51.85804,8.33269],[51.858318,8.33384],[51.85857,8.33501],[51.85894,8.33723],[51.859798,8.34333],[51.860321,8.34674],[51.860401,8.34727],[51.861069,8.35194],[51.86124,8.35297],[51.86142,8.35408],[51.861752,8.35569],[51.862141,8.35716],[51.862942,8.36004],[51.86388,8.36343],[51.86396,8.36376],[51.864109,8.36425],[51.865002,8.36734],[51.866741,8.37381],[51.867729,8.37732],[51.868149,8.37884],[51.868641,8.38072],[51.869041,8.38247],[51.86937,8.38443],[51.869659,8.38654],[51.871109,8.39815],[51.871651,8.40257],[51.871948,8.40499],[51.872162,8.40643],[51.872631,8.40925],[51.872952,8.41071],[51.873329,8.41213],[51.873749,8.4135],[51.874168,8.41477],[51.874729,8.41609],[51.875431,8.41777],[51.879452,8.42606],[51.88131,8.4298],[51.88176,8.43074],[51.88216,8.43158],[51.882431,8.43212],[51.88261,8.43246],[51.883171,8.43365],[51.88406,8.43552],[51.88525,8.438],[51.886379,8.44002],[51.887032,8.44107],[51.888119,8.4428],[51.889061,8.44421],[51.889858,8.44547],[51.890759,8.44697],[51.891472,8.44826],[51.89222,8.44966],[51.892891,8.45104],[51.893501,8.45238],[51.894169,8.45389],[51.894829,8.45555],[51.89537,8.45697],[51.895889,8.45831],[51.896221,8.45935],[51.896488,8.46014],[51.89698,8.4617],[51.897369,8.46326],[51.897789,8.46489],[51.89819,8.46655],[51.89856,8.46816],[51.898918,8.47006],[51.899799,8.47499],[51.900379,8.47826],[51.901348,8.48375],[51.90192,8.48683],[51.902241,8.48842],[51.903591,8.49471],[51.903889,8.49611],[51.903938,8.49633],[51.90406,8.49683],[51.90443,8.49858],[51.90485,8.50032],[51.90535,8.50198],[51.905899,8.50358],[51.90662,8.50537],[51.907452,8.50714],[51.90823,8.50857],[51.909039,8.50989],[51.909969,8.5112],[51.911041,8.51252],[51.912109,8.5137],[51.913021,8.51467],[51.91333,8.51497],[51.91526,8.51712],[51.916302,8.51825],[51.91737,8.51944],[51.918381,8.5205],[51.91951,8.52178],[51.92281,8.52542],[51.924339,8.52709],[51.92609,8.52888],[51.926949,8.5297],[51.927811,8.53037],[51.92894,8.53128],[51.92989,8.53191],[51.931068,8.53263],[51.93187,8.53305],[51.93512,8.53467],[51.935982,8.53512],[51.93679,8.53563],[51.937489,8.53612],[51.93824,8.5367],[51.93858,8.53698],[51.93906,8.53741],[51.939301,8.53765],[51.939751,8.53815],[51.940151,8.5386],[51.940842,8.53947],[51.941341,8.54009],[51.942139,8.54127],[51.94286,8.54242],[51.94323,8.54305],[51.943459,8.5435],[51.943748,8.54411],[51.944279,8.54521],[51.944771,8.54638],[51.945148,8.54732],[51.945351,8.54789],[51.94632,8.55056],[51.94648,8.55101],[51.946869,8.55216],[51.94733,8.55343],[51.94743,8.55374],[51.950321,8.56168],[51.95089,8.56321],[51.951962,8.56566],[51.95256,8.56682],[51.953461,8.56841],[51.954559,8.57018],[51.954639,8.5703],[51.955059,8.57101],[51.95639,8.57315],[51.957119,8.57434],[51.95779,8.57562],[51.958481,8.57689],[51.959141,8.57828],[51.959751,8.57966],[51.960361,8.58111],[51.96093,8.58259],[51.961929,8.58578],[51.962639,8.58817],[51.964272,8.59382],[51.96476,8.59554],[51.965649,8.59864],[51.966709,8.60208],[51.96719,8.60341],[51.967461,8.60407],[51.969151,8.60787],[51.970402,8.61055],[51.970772,8.6113],[51.971081,8.61183],[51.97139,8.61236],[51.971828,8.6129],[51.972309,8.61345],[51.97282,8.61393],[51.973431,8.61437],[51.973961,8.61469],[51.974499,8.61493],[51.975441,8.61518],[51.97644,8.61538],[51.977409,8.61549],[51.978371,8.61561],[51.979061,8.6157],[51.979389,8.61575],[51.980129,8.61587],[51.980331,8.61591],[51.98135,8.61604],[51.982288,8.61597],[51.98317,8.61576],[51.9841,8.61553],[51.984982,8.6153],[51.985439,8.6152],[51.985882,8.61516],[51.98682,8.6152],[51.98735,8.61529],[51.987831,8.61541],[51.988739,8.61577],[51.9897,8.61619],[51.98988,8.61626],[51.99004,8.61632],[51.9907,8.6166],[51.99086,8.61666],[51.99165,8.61701],[51.992439,8.61736],[51.992611,8.61745],[51.993599,8.61787],[51.994911,8.61845],[51.995369,8.61865],[51.9958,8.61883],[51.997459,8.61953],[51.997799,8.61967],[51.99855,8.61999],[51.999088,8.62024],[51.999481,8.6204],[51.999889,8.62059],[52.00095,8.62121],[52.00148,8.62154],[52.002121,8.62197],[52.002831,8.62255],[52.003342,8.623],[52.003979,8.62353],[52.004601,8.62405],[52.005199,8.62456],[52.00592,8.62518],[52.006649,8.62579],[52.006809,8.62593],[52.007721,8.62671],[52.00893,8.62773],[52.010181,8.62879],[52.011429,8.62977],[52.012291,8.63042],[52.01255,8.63061],[52.013939,8.63147],[52.014462,8.63181],[52.0159,8.63256],[52.01722,8.63319],[52.01857,8.63373],[52.019871,8.63422],[52.021141,8.63468],[52.02203,8.63501],[52.022339,8.63513],[52.023869,8.63568],[52.024651,8.63597],[52.024811,8.63603],[52.025478,8.63629],[52.027969,8.6372],[52.02935,8.63771],[52.030788,8.63828],[52.031471,8.63861],[52.032108,8.63895],[52.032879,8.63944],[52.032982,8.63951],[52.03352,8.63991],[52.034409,8.64064],[52.03516,8.64128],[52.035961,8.64212],[52.036591,8.64282],[52.037182,8.64357],[52.03833,8.64516],[52.039349,8.64674],[52.04047,8.64829],[52.041012,8.64892],[52.041649,8.64968],[52.042881,8.6509],[52.04414,8.65191],[52.04549,8.65281],[52.04697,8.65372],[52.047981,8.65432],[52.048161,8.65444],[52.04858,8.65471],[52.050201,8.65569],[52.052029,8.65683],[52.053902,8.65782],[52.055759,8.65866],[52.056389,8.65888],[52.05896,8.65966],[52.06068,8.66016],[52.063389,8.66092],[52.0644,8.66127],[52.06546,8.66172],[52.06646,8.66223],[52.06741,8.66276],[52.06839,8.6634],[52.06934,8.66409],[52.070309,8.66492],[52.07122,8.66574],[52.072128,8.66665],[52.073071,8.66769],[52.073898,8.6687],[52.074791,8.66986],[52.075588,8.67106],[52.076389,8.67232],[52.07716,8.67369],[52.077351,8.67404],[52.077431,8.67419],[52.077881,8.67505],[52.07856,8.67651],[52.07914,8.67787],[52.079689,8.67926],[52.080231,8.68064],[52.080742,8.68195],[52.081032,8.68267],[52.081261,8.68324],[52.081749,8.68446],[52.082199,8.68568],[52.08271,8.68697],[52.083191,8.68823],[52.083801,8.68973],[52.084461,8.69108],[52.085018,8.69204],[52.08551,8.69285],[52.085701,8.69313],[52.086071,8.69366],[52.086941,8.69476],[52.087109,8.69495],[52.088348,8.69625],[52.08963,8.69755],[52.08987,8.69779],[52.091042,8.69914],[52.091331,8.69947],[52.091862,8.70014],[52.092861,8.70151],[52.093109,8.70187],[52.093811,8.70295],[52.094212,8.70363],[52.094769,8.70458],[52.095451,8.70579],[52.09568,8.70625],[52.09721,8.70946],[52.097439,8.70994],[52.099529,8.71434],[52.101131,8.71777],[52.101261,8.71805],[52.101479,8.71853],[52.102081,8.7198],[52.102921,8.72151],[52.103481,8.72259],[52.10397,8.72343],[52.104481,8.72428],[52.104969,8.72507],[52.105549,8.72595],[52.108551,8.73051],[52.10973,8.73234],[52.110168,8.73303],[52.110771,8.7339],[52.111389,8.73469],[52.111851,8.73522],[52.112289,8.73566],[52.11285,8.73615],[52.11338,8.73657],[52.11377,8.73683],[52.114021,8.73698],[52.11462,8.73728],[52.115231,8.73755],[52.115681,8.73768],[52.116249,8.73781],[52.116859,8.73788],[52.117432,8.7379],[52.118141,8.73783],[52.118759,8.7377],[52.119438,8.73752],[52.120628,8.73726],[52.124889,8.73636],[52.12582,8.73621],[52.126659,8.73614],[52.127281,8.73615],[52.12785,8.73619],[52.128529,8.73633],[52.12936,8.73659],[52.129959,8.73687],[52.130539,8.73717],[52.131649,8.73792],[52.132839,8.739],[52.133789,8.74002],[52.13435,8.74077],[52.13456,8.74107],[52.135368,8.74246],[52.135929,8.74357],[52.136349,8.74463],[52.136742,8.74578],[52.137001,8.74657],[52.13744,8.74827],[52.137718,8.74973],[52.138359,8.75359],[52.13842,8.75398],[52.13879,8.75656],[52.13903,8.75876],[52.139229,8.76081],[52.139389,8.76305],[52.139408,8.76347],[52.13969,8.76717],[52.139919,8.76944],[52.140049,8.77036],[52.14016,8.77109],[52.14027,8.77176],[52.140659,8.77359],[52.1409,8.77464],[52.141029,8.77515],[52.1413,8.77632],[52.14188,8.77859],[52.141918,8.77874],[52.142818,8.7822],[52.143681,8.78554],[52.14452,8.78879],[52.14492,8.79018],[52.145649,8.79237],[52.146839,8.79541],[52.147991,8.7985],[52.148628,8.80016],[52.149361,8.80197],[52.14946,8.80217],[52.149792,8.80289],[52.150139,8.80355],[52.150181,8.80361],[52.150688,8.8044],[52.151588,8.80559],[52.152279,8.80629],[52.15361,8.80748],[52.155849,8.80938],[52.157341,8.81068],[52.15818,8.81133],[52.158909,8.81174],[52.159672,8.81207],[52.160351,8.81231],[52.164749,8.8136],[52.164989,8.81368],[52.16539,8.81381],[52.168892,8.8148],[52.170528,8.81523],[52.171021,8.81539],[52.17152,8.81563],[52.172192,8.816],[52.173,8.81661],[52.178951,8.82136],[52.179169,8.82156],[52.181911,8.82381],[52.18261,8.82431],[52.183281,8.82466],[52.18404,8.82497],[52.184589,8.82513],[52.18552,8.82528],[52.18766,8.82536],[52.18837,8.82545],[52.18885,8.8255],[52.189201,8.82555],[52.189449,8.82561],[52.190498,8.82589],[52.191158,8.82615],[52.191971,8.82656],[52.192581,8.8269],[52.193588,8.82747],[52.195042,8.82846],[52.195419,8.82872],[52.198071,8.83052],[52.198551,8.83085],[52.19976,8.83166],[52.200359,8.83217],[52.201069,8.83284],[52.20174,8.83362],[52.202339,8.83453],[52.202961,8.83556],[52.203571,8.83691],[52.204048,8.83833],[52.20438,8.83961],[52.204609,8.8406],[52.20483,8.84169],[52.20512,8.84355],[52.205269,8.84427],[52.20536,8.84474],[52.205509,8.84547],[52.205669,8.84615],[52.205929,8.84722],[52.20607,8.84783],[52.206478,8.84943],[52.206982,8.85093],[52.2075,8.8524],[52.208408,8.85498],[52.208771,8.85602],[52.209572,8.85826],[52.209862,8.85908],[52.21014,8.85993],[52.210258,8.86032],[52.210461,8.86108],[52.210659,8.86194],[52.210812,8.86277],[52.21093,8.86365],[52.210999,8.8642],[52.211048,8.86475],[52.211102,8.86559],[52.211151,8.86791],[52.21125,8.87073],[52.21125,8.87193],[52.211231,8.87273],[52.211189,8.87377],[52.211128,8.87522],[52.210911,8.88039],[52.210892,8.88137],[52.210911,8.88202],[52.21101,8.88493],[52.211239,8.89031],[52.211189,8.89171],[52.211079,8.89306],[52.210781,8.89507],[52.210609,8.8961],[52.210159,8.89882],[52.209759,8.90154],[52.209518,8.90427],[52.209461,8.90684],[52.209499,8.91353],[52.209549,8.91769],[52.209549,8.9181],[52.20956,8.92176],[52.20961,8.92312],[52.209671,8.92455],[52.209728,8.92545],[52.20982,8.92636],[52.209881,8.92682],[52.210041,8.92827],[52.210369,8.93009],[52.21067,8.93149],[52.2113,8.93413],[52.211449,8.93478],[52.211849,8.93633],[52.212269,8.9384],[52.212502,8.9396],[52.212711,8.94083],[52.212879,8.94212],[52.213051,8.94348],[52.21323,8.94536],[52.213539,8.94827],[52.21368,8.94928],[52.213951,8.9507],[52.214329,8.95231],[52.214691,8.95385],[52.21526,8.95603],[52.215549,8.95712],[52.21579,8.95823],[52.216141,8.96002],[52.21645,8.96171],[52.21664,8.96307],[52.21677,8.96447],[52.216881,8.96608],[52.21693,8.96771],[52.21693,8.96872],[52.21693,8.96993],[52.216831,8.97907],[52.216808,8.98151],[52.216759,8.9851],[52.21674,8.98697],[52.216728,8.98927],[52.21674,8.98993],[52.216789,8.99054],[52.21682,8.9912],[52.2169,8.99186],[52.21706,8.99292],[52.21714,8.99333],[52.217258,8.994],[52.2174,8.99456],[52.2178,8.99593],[52.21825,8.9975],[52.218712,8.99906],[52.218948,9.00004],[52.21912,9.00089],[52.219189,9.00138],[52.219311,9.00233],[52.21941,9.00328],[52.219521,9.00466],[52.219589,9.00562],[52.219669,9.00663],[52.21978,9.00785],[52.219929,9.00907],[52.2201,9.01008],[52.220291,9.01108],[52.220409,9.01157],[52.220791,9.01314],[52.221321,9.01521],[52.22142,9.01562],[52.221661,9.01673],[52.22184,9.01791],[52.22197,9.01901],[52.22205,9.02011],[52.222061,9.02136],[52.222,9.02263],[52.221901,9.02388],[52.221291,9.03157],[52.221218,9.0324],[52.22113,9.03318],[52.22102,9.03388],[52.220772,9.03518],[52.220249,9.03779],[52.220051,9.03881],[52.218788,9.04554],[52.218609,9.04663],[52.218441,9.04758],[52.218288,9.04868],[52.21817,9.04986],[52.218128,9.05084],[52.218151,9.0517],[52.218262,9.05309],[52.218342,9.05377],[52.218441,9.05453],[52.218689,9.056],[52.218891,9.05675],[52.2192,9.05781],[52.219662,9.05924],[52.22028,9.06112],[52.220879,9.06312],[52.221062,9.0639],[52.22123,9.0648],[52.221329,9.06549],[52.221409,9.06617],[52.221458,9.0669],[52.2215,9.06774],[52.2215,9.06863],[52.22147,9.06938],[52.221409,9.07029],[52.221149,9.07354],[52.22068,9.07999],[52.22049,9.08252],[52.220291,9.08523],[52.2202,9.08661],[52.22015,9.08735],[52.220131,9.08799],[52.2201,9.08931],[52.220139,9.09049],[52.220242,9.09183],[52.22039,9.09328],[52.22102,9.09803],[52.221352,9.10071],[52.221519,9.10211],[52.221649,9.10343],[52.221699,9.10437],[52.22171,9.10532],[52.221729,9.10629],[52.221691,9.1071],[52.221649,9.10781],[52.22155,9.10848],[52.221439,9.10903],[52.22131,9.10977],[52.22086,9.11192],[52.220482,9.11371],[52.22023,9.11495],[52.22002,9.11628],[52.21994,9.11706],[52.219879,9.11793],[52.21983,9.11944],[52.21991,9.12097],[52.219971,9.12181],[52.22007,9.12263],[52.22028,9.12413],[52.22049,9.12557],[52.220619,9.12718],[52.22065,9.12849],[52.220619,9.12928],[52.220581,9.13004],[52.22047,9.13138],[52.220119,9.13498],[52.21981,9.13805],[52.21973,9.13917],[52.219669,9.14079],[52.219551,9.14517],[52.219551,9.1457],[52.219479,9.14736],[52.219379,9.14908],[52.21817,9.15879],[52.218029,9.15981],[52.21785,9.16074],[52.217449,9.16232],[52.21669,9.16492],[52.216209,9.16663],[52.216,9.16779],[52.215839,9.16909],[52.215771,9.17014],[52.215752,9.17206],[52.215698,9.17478],[52.21563,9.17699],[52.215611,9.17739],[52.21545,9.18024],[52.215431,9.18139],[52.215511,9.18293],[52.215641,9.18409],[52.215759,9.1848],[52.2159,9.18562],[52.216171,9.18673],[52.216579,9.1883],[52.217991,9.19375],[52.218449,9.19555],[52.219471,9.19907],[52.21983,9.20038],[52.220951,9.20474],[52.221272,9.20601],[52.22147,9.20691],[52.221619,9.20768],[52.221802,9.20891],[52.221901,9.20997],[52.221958,9.21096],[52.22197,9.21188],[52.22187,9.21513],[52.22184,9.21685],[52.221901,9.21811],[52.22197,9.21912],[52.222031,9.21982],[52.222252,9.22108],[52.222549,9.22248],[52.222809,9.22344],[52.223091,9.22428],[52.223412,9.22504],[52.223789,9.2259],[52.224602,9.22741],[52.225891,9.22959],[52.22863,9.23392],[52.228882,9.23433],[52.23019,9.23661],[52.230541,9.23736],[52.230862,9.23816],[52.231152,9.23898],[52.231621,9.24076],[52.232052,9.24308],[52.232349,9.2454],[52.232571,9.24712],[52.23275,9.24839],[52.232841,9.24905],[52.23315,9.25142],[52.233521,9.25422],[52.233898,9.2571],[52.234241,9.25995],[52.234612,9.26276],[52.234951,9.26555],[52.235222,9.26732],[52.23531,9.26785],[52.235649,9.26968],[52.236031,9.27126],[52.236721,9.27361],[52.237251,9.27518],[52.23777,9.2765],[52.23822,9.27756],[52.23859,9.27833],[52.239071,9.27929],[52.23954,9.2801],[52.240299,9.28136],[52.241081,9.2825],[52.24173,9.2833],[52.24263,9.28436],[52.24453,9.28641],[52.24649,9.28847],[52.247452,9.28956],[52.24828,9.29058],[52.248501,9.29089],[52.249249,9.29197],[52.249989,9.29312],[52.250622,9.29429],[52.25116,9.2954],[52.254822,9.30336],[52.256031,9.30584],[52.256618,9.30694],[52.257198,9.3079],[52.25774,9.30869],[52.258369,9.30952],[52.259209,9.31058],[52.26017,9.31164],[52.261101,9.31259],[52.26149,9.31296],[52.26339,9.31468],[52.26498,9.31612],[52.26535,9.31651],[52.26646,9.31788],[52.267059,9.31869],[52.267681,9.31962],[52.268299,9.32062],[52.268822,9.32155],[52.269459,9.32285],[52.273449,9.33127],[52.274132,9.33276],[52.274872,9.3343],[52.275391,9.33547],[52.278141,9.34138],[52.278709,9.34251],[52.279369,9.34372],[52.280022,9.34479],[52.28017,9.34507],[52.28112,9.34654],[52.28614,9.3543],[52.287659,9.35666],[52.288509,9.35787],[52.289421,9.35901],[52.289719,9.35935],[52.291088,9.36072],[52.292488,9.36198],[52.292671,9.36213],[52.302601,9.37094],[52.319118,9.38574],[52.321159,9.38775],[52.322319,9.38908],[52.32336,9.39044],[52.324322,9.39183],[52.325069,9.39299],[52.32523,9.39327],[52.325859,9.39436],[52.326618,9.39575],[52.327579,9.39764],[52.328411,9.39929],[52.32859,9.39964],[52.329109,9.4006],[52.329769,9.40172],[52.330891,9.40352],[52.332241,9.40555],[52.333649,9.4077],[52.333889,9.40806],[52.33432,9.40873],[52.335529,9.41062],[52.335838,9.41112],[52.336159,9.41163],[52.337959,9.41435],[52.338539,9.41519],[52.339409,9.41632],[52.340111,9.41712],[52.34082,9.41784],[52.34166,9.4186],[52.342659,9.41942],[52.343609,9.42004],[52.344292,9.42046],[52.347092,9.42214],[52.34774,9.42256],[52.348728,9.4233],[52.349461,9.42388],[52.350231,9.42454],[52.351101,9.42534],[52.353039,9.42715],[52.357361,9.43114],[52.35881,9.43264],[52.359692,9.43366],[52.367809,9.44407],[52.369389,9.4463],[52.37072,9.44836],[52.370861,9.44859],[52.37278,9.45184],[52.37532,9.45624],[52.377548,9.4601],[52.38052,9.46524],[52.38113,9.46629],[52.381649,9.46712],[52.382561,9.46848],[52.383499,9.4698],[52.388901,9.4772],[52.39045,9.47932],[52.396099,9.48702],[52.39711,9.48859],[52.398029,9.49015],[52.401131,9.49559],[52.406521,9.50506],[52.407982,9.50763],[52.409161,9.50972],[52.410191,9.51151],[52.41164,9.51406],[52.413311,9.51703],[52.41428,9.51884],[52.415138,9.52054],[52.41576,9.52185],[52.416382,9.52326],[52.416969,9.52472],[52.417488,9.52615],[52.41803,9.52775],[52.41877,9.53015],[52.419331,9.53233],[52.419689,9.53391],[52.419991,9.53553],[52.420319,9.53729],[52.42057,9.53902],[52.42078,9.54093],[52.420971,9.54285],[52.421131,9.54533],[52.42131,9.54945],[52.421459,9.55652],[52.421551,9.55856],[52.42165,9.56019],[52.421909,9.56349],[52.422329,9.56859],[52.42276,9.57334],[52.42281,9.57401],[52.423309,9.58008],[52.423458,9.58243],[52.423489,9.58307],[52.423561,9.58555],[52.423592,9.5876],[52.42358,9.58984],[52.423519,9.59303],[52.423229,9.59739],[52.421131,9.61986],[52.42091,9.62265],[52.420811,9.62446],[52.420792,9.62634],[52.420811,9.62772],[52.420872,9.6294],[52.421051,9.63173],[52.421242,9.63346],[52.421619,9.63605],[52.422058,9.6385],[52.424,9.64852],[52.42527,9.6551],[52.42683,9.66314],[52.427429,9.66629],[52.4282,9.67028],[52.428421,9.67169],[52.428612,9.67311],[52.428921,9.67626],[52.429321,9.68156],[52.429611,9.68496],[52.430241,9.69297],[52.430389,9.69674],[52.43042,9.69946],[52.430401,9.70035],[52.430248,9.70318],[52.43,9.70612],[52.42923,9.71208],[52.429001,9.71376],[52.42823,9.72024],[52.427898,9.72294],[52.427872,9.72335],[52.427551,9.72654],[52.427441,9.72852],[52.427441,9.72884],[52.427391,9.73166],[52.427391,9.73378],[52.42738,9.74271],[52.42725,9.74974],[52.427189,9.75209],[52.427189,9.75226],[52.427071,9.75852],[52.427059,9.75878],[52.426979,9.76416],[52.426979,9.76718],[52.42709,9.7718],[52.427219,9.77332],[52.427471,9.77608],[52.42757,9.77697],[52.42802,9.78012],[52.42849,9.78298],[52.42894,9.78534],[52.4296,9.78852],[52.43013,9.7913],[52.430309,9.79236],[52.43084,9.79586],[52.431061,9.79878],[52.43108,9.80093],[52.43108,9.80136],[52.431061,9.80156],[52.431011,9.80331],[52.430851,9.80506],[52.43058,9.80699],[52.429859,9.81081],[52.42926,9.81314],[52.427879,9.81772],[52.42767,9.81826],[52.427589,9.81848],[52.42622,9.82272],[52.42561,9.82427],[52.425179,9.8253],[52.4244,9.82718],[52.42313,9.82991],[52.421791,9.83242],[52.421059,9.83371],[52.420341,9.83493],[52.419991,9.83549],[52.41695,9.84032],[52.41547,9.84266],[52.414028,9.84502],[52.41272,9.84724],[52.412521,9.84753],[52.412201,9.84809],[52.411758,9.84889],[52.410969,9.85049],[52.40963,9.8534],[52.40897,9.85474],[52.4067,9.85982],[52.406231,9.8608],[52.404419,9.8647],[52.402882,9.86814],[52.4021,9.87012],[52.40136,9.87221],[52.40065,9.87454],[52.40015,9.87635],[52.399601,9.87873],[52.39933,9.88],[52.399101,9.8813],[52.398849,9.88279],[52.39864,9.88436],[52.398048,9.88966],[52.39793,9.89076],[52.397449,9.89538],[52.39716,9.89822],[52.396938,9.90041],[52.39613,9.90822],[52.39547,9.91468],[52.39489,9.91989],[52.394291,9.92539],[52.392899,9.93625],[52.392502,9.93943],[52.391991,9.94348],[52.391129,9.95032],[52.390652,9.95501],[52.390388,9.95814],[52.389771,9.96834],[52.38966,9.97063],[52.38961,9.97158],[52.389488,9.97431],[52.38945,9.97521],[52.389271,9.97919],[52.389179,9.98179],[52.388851,9.98807],[52.388741,9.98972],[52.38866,9.99068],[52.38855,9.99183],[52.388371,9.99334],[52.38826,9.9942],[52.388031,9.99557],[52.38776,9.99715],[52.387428,9.99872],[52.38665,10.00213],[52.386589,10.00236],[52.384411,10.01166],[52.384232,10.01243],[52.383591,10.01513],[52.38287,10.01818],[52.38216,10.02108],[52.381931,10.02194],[52.380798,10.02608],[52.37854,10.03394],[52.37793,10.03613],[52.375851,10.0434],[52.36834,10.06986],[52.367668,10.07246],[52.367241,10.07433],[52.366859,10.07654],[52.366489,10.079],[52.366112,10.08264],[52.364349,10.10102],[52.363918,10.10537],[52.363731,10.10793],[52.363621,10.11056],[52.363522,10.11825],[52.363491,10.12034],[52.363461,10.12095],[52.3634,10.12439],[52.36322,10.12821],[52.362869,10.13312],[52.362389,10.13806],[52.361851,10.14326],[52.361752,10.14428],[52.36092,10.15225],[52.36026,10.15861],[52.3587,10.17429],[52.358459,10.17639],[52.35775,10.18056],[52.357601,10.18136],[52.35696,10.18402],[52.356331,10.18616],[52.355492,10.18883],[52.35437,10.19165],[52.34618,10.20908],[52.342449,10.21785],[52.341831,10.21931],[52.340672,10.22211],[52.340179,10.22335],[52.33963,10.2249],[52.339489,10.22534],[52.33881,10.22759],[52.33831,10.2295],[52.337898,10.23125],[52.33733,10.23424],[52.336891,10.23742],[52.336781,10.23822],[52.33654,10.24093],[52.336449,10.2429],[52.336418,10.24385],[52.336399,10.24622],[52.33654,10.25446],[52.33659,10.25766],[52.336559,10.2601],[52.33646,10.2636],[52.336189,10.26843],[52.335072,10.28774],[52.334919,10.29107],[52.334919,10.29154],[52.335011,10.29579],[52.33514,10.29783],[52.33543,10.30059],[52.33551,10.30138],[52.338169,10.32413],[52.339352,10.33431],[52.339642,10.33706],[52.339771,10.33882],[52.339809,10.33951],[52.339931,10.3423],[52.339939,10.34619],[52.339771,10.35151],[52.339378,10.36378],[52.339321,10.36578],[52.339298,10.36685],[52.339039,10.3733],[52.33876,10.37846],[52.338699,10.37918],[52.33749,10.39397],[52.33744,10.39459],[52.337231,10.39709],[52.337078,10.39883],[52.33704,10.39933],[52.33699,10.39991],[52.336658,10.40373],[52.336601,10.40446],[52.335541,10.41656],[52.33511,10.41984],[52.33482,10.42191],[52.33448,10.42399],[52.33408,10.42626],[52.333401,10.43028],[52.331501,10.44129],[52.330391,10.44793],[52.32967,10.4525],[52.32896,10.45634],[52.326759,10.46555],[52.32547,10.47095],[52.324322,10.4756],[52.321678,10.48679],[52.320992,10.48957],[52.320641,10.49099],[52.316238,10.50933],[52.315941,10.51061],[52.314949,10.51487],[52.314602,10.51663],[52.314301,10.51826],[52.31406,10.51997],[52.313622,10.52316],[52.31337,10.52554],[52.313339,10.5259],[52.313229,10.52723],[52.31316,10.52956],[52.313171,10.53276],[52.31321,10.53498],[52.313221,10.53566],[52.313061,10.55503],[52.313049,10.55618],[52.31303,10.55924],[52.31303,10.56007],[52.313,10.56157],[52.312969,10.5638],[52.31292,10.56636],[52.312801,10.57008],[52.312691,10.57225],[52.31237,10.57724],[52.312019,10.58152],[52.310211,10.60278],[52.310032,10.60504],[52.309978,10.60568],[52.309872,10.60751],[52.30978,10.60984],[52.3097,10.61282],[52.309689,10.61409],[52.3097,10.61489],[52.309761,10.61923],[52.309769,10.62277],[52.309761,10.62736],[52.30975,10.62812],[52.30975,10.62927],[52.3097,10.63306],[52.309689,10.63377],[52.309689,10.63433],[52.309471,10.65566],[52.30938,10.66094],[52.308651,10.68318],[52.308578,10.6847],[52.308189,10.6965],[52.30817,10.69703],[52.30814,10.6977],[52.307961,10.70307],[52.307949,10.70368],[52.307869,10.70846],[52.30788,10.7108],[52.307961,10.71448],[52.307968,10.71477],[52.30806,10.71921],[52.30817,10.7233],[52.3083,10.72591],[52.308521,10.72918],[52.309261,10.736],[52.31052,10.74826],[52.31287,10.76876],[52.313519,10.77534],[52.313702,10.77924],[52.313702,10.7817],[52.313629,10.78393],[52.312489,10.79746],[52.312439,10.79808],[52.312309,10.79964],[52.311661,10.80753],[52.31155,10.80886],[52.311489,10.80955],[52.311218,10.81283],[52.310982,10.81575],[52.310928,10.81642],[52.310619,10.82023],[52.310299,10.82408],[52.31007,10.82577],[52.309681,10.82813],[52.30938,10.82972],[52.308922,10.83178],[52.308781,10.8324],[52.308571,10.83322],[52.307831,10.83578],[52.30703,10.83832],[52.306911,10.83871],[52.30648,10.84012],[52.30463,10.84596],[52.29977,10.86152],[52.299469,10.8625],[52.29797,10.86634],[52.29623,10.87042],[52.29607,10.8708],[52.290569,10.88392],[52.290298,10.88454],[52.289761,10.88581],[52.287991,10.89006],[52.286442,10.89384],[52.28561,10.89616],[52.284981,10.89818],[52.28405,10.90174],[52.283741,10.90314],[52.283581,10.90391],[52.283199,10.90601],[52.283039,10.90711],[52.282848,10.90841],[52.2827,10.9098],[52.28249,10.91186],[52.282211,10.91447],[52.28194,10.91689],[52.281818,10.91823],[52.281689,10.91955],[52.281521,10.92115],[52.281342,10.92276],[52.281239,10.92347],[52.281101,10.92451],[52.280941,10.92543],[52.28067,10.92687],[52.280579,10.92729],[52.280411,10.92808],[52.280281,10.92867],[52.27998,10.92985],[52.279621,10.93119],[52.278999,10.93321],[52.278809,10.93376],[52.27845,10.93479],[52.27808,10.93571],[52.277599,10.93683],[52.274021,10.94491],[52.272881,10.94751],[52.272579,10.94815],[52.272388,10.94866],[52.271629,10.95055],[52.271149,10.95184],[52.270691,10.9532],[52.270409,10.95412],[52.269989,10.9559],[52.269711,10.95711],[52.269402,10.95878],[52.269051,10.96101],[52.26873,10.96379],[52.268589,10.96511],[52.268459,10.96648],[52.26825,10.96781],[52.268051,10.96897],[52.267792,10.97028],[52.26746,10.97173],[52.267109,10.97311],[52.266541,10.97495],[52.2659,10.97686],[52.26535,10.97857],[52.264729,10.98044],[52.264431,10.98125],[52.264069,10.98226],[52.263611,10.98342],[52.26334,10.98406],[52.26302,10.9848],[52.26265,10.98559],[52.262428,10.98599],[52.261951,10.98683],[52.261559,10.98751],[52.260738,10.98882],[52.26009,10.98974],[52.25935,10.99068],[52.258259,10.99194],[52.258091,10.99214],[52.25774,10.99256],[52.25737,10.99298],[52.256519,10.99397],[52.25563,10.99497],[52.254391,10.99625],[52.25322,10.99741],[52.25264,10.99793],[52.25235,10.99823],[52.251209,10.99934],[52.250229,11.00027],[52.250031,11.00046],[52.24955,11.00092],[52.247181,11.0032],[52.246609,11.00382],[52.246151,11.00434],[52.245621,11.00498],[52.24514,11.0056],[52.244751,11.00613],[52.244381,11.00663],[52.24419,11.0069],[52.243999,11.00721],[52.24379,11.00755],[52.24321,11.00858],[52.242661,11.00965],[52.242088,11.01079],[52.241951,11.01111],[52.24165,11.01174],[52.240669,11.01376],[52.24049,11.01413],[52.24007,11.01488],[52.239738,11.01546],[52.23951,11.01586],[52.239281,11.01623],[52.238449,11.01743],[52.237862,11.01826],[52.237492,11.01872],[52.23708,11.01926],[52.236061,11.02047],[52.235901,11.02068],[52.235519,11.02112],[52.23484,11.02197],[52.23436,11.02264],[52.233879,11.0233],[52.232819,11.02502],[52.23238,11.02578],[52.232151,11.02621],[52.2318,11.02692],[52.231319,11.02796],[52.23064,11.02948],[52.22974,11.03148],[52.226608,11.03863],[52.224251,11.04442],[52.222542,11.04881],[52.22213,11.04988],[52.221722,11.0509],[52.21994,11.05556],[52.219559,11.05661],[52.219021,11.05819],[52.218639,11.05949],[52.218262,11.06097],[52.217609,11.06406],[52.217312,11.06595],[52.21701,11.06904],[52.216759,11.07434],[52.216389,11.08081],[52.21616,11.08396],[52.21582,11.08679],[52.215549,11.08848],[52.215321,11.08966],[52.215,11.091],[52.21471,11.09206],[52.21439,11.09308],[52.214119,11.09393],[52.213581,11.09541],[52.213032,11.097],[52.212528,11.09842],[52.2122,11.09948],[52.211971,11.10029],[52.211639,11.10148],[52.21032,11.10647],[52.209942,11.10794],[52.209572,11.10945],[52.209259,11.11086],[52.209019,11.11196],[52.208809,11.11301],[52.20853,11.11437],[52.20821,11.11676],[52.208031,11.11851],[52.20726,11.1314],[52.207218,11.13201],[52.20718,11.1333],[52.20715,11.13446],[52.207142,11.13474],[52.207142,11.13663],[52.20723,11.13807],[52.207298,11.1391],[52.208012,11.14741],[52.20826,11.1505],[52.208382,11.15266],[52.208431,11.15428],[52.208389,11.15683],[52.20826,11.15952],[52.20808,11.16168],[52.207748,11.16434],[52.207439,11.16667],[52.207272,11.16756],[52.204609,11.17897],[52.204288,11.18041],[52.20369,11.18307],[52.20295,11.18697],[52.202518,11.19054],[52.202309,11.19309],[52.201889,11.20136],[52.201839,11.20206],[52.200691,11.22617],[52.200531,11.23064],[52.20031,11.23465],[52.20018,11.23625],[52.19997,11.23853],[52.199551,11.24218],[52.199379,11.24359],[52.198601,11.24932],[52.198441,11.2506],[52.196831,11.26289],[52.196758,11.26343],[52.19664,11.26425],[52.19611,11.2682],[52.195919,11.26956],[52.195831,11.27021],[52.192509,11.29526],[52.192451,11.29572],[52.191921,11.2998],[52.191681,11.30193],[52.191631,11.30242],[52.19038,11.31644],[52.188,11.34272],[52.18729,11.35063],[52.18716,11.35227],[52.187069,11.35391],[52.187012,11.35556],[52.186981,11.35735],[52.186951,11.35924],[52.186958,11.36334],[52.187,11.36713],[52.18713,11.38555],[52.18718,11.38968],[52.18718,11.38998],[52.187191,11.39058],[52.187191,11.39091],[52.18721,11.39275],[52.18779,11.41141],[52.187809,11.41185],[52.187962,11.41739],[52.18808,11.42094],[52.188099,11.42154],[52.18819,11.425],[52.18829,11.42803],[52.188339,11.43127],[52.18832,11.43313],[52.18821,11.43495],[52.188049,11.43668],[52.187771,11.43853],[52.18734,11.44089],[52.186981,11.44246],[52.186001,11.44599],[52.185928,11.44622],[52.185829,11.44653],[52.183041,11.45638],[52.181412,11.46197],[52.17691,11.47781],[52.176159,11.4802],[52.175781,11.48138],[52.175251,11.48278],[52.174389,11.48491],[52.173431,11.48724],[52.17202,11.49069],[52.168011,11.50037],[52.16666,11.50414],[52.166458,11.50475],[52.16629,11.50537],[52.16589,11.50676],[52.165611,11.50802],[52.165359,11.50931],[52.165161,11.51038],[52.16502,11.51134],[52.164791,11.51371],[52.1647,11.51587],[52.16468,11.5163],[52.16465,11.51743],[52.164669,11.5184],[52.164742,11.51996],[52.16489,11.52163],[52.165058,11.52326],[52.165119,11.52365],[52.165421,11.52569],[52.166439,11.53267],[52.166611,11.53392],[52.167339,11.53867],[52.167439,11.53937],[52.169441,11.55281],[52.16991,11.55575],[52.170231,11.55711],[52.170559,11.55839],[52.171291,11.56133],[52.17382,11.57087],[52.175751,11.57812],[52.178219,11.58746],[52.182308,11.603],[52.183929,11.60919],[52.185032,11.61315],[52.185822,11.61628],[52.186619,11.61919],[52.187531,11.62238],[52.188011,11.62375],[52.18858,11.62524],[52.18866,11.62546],[52.18959,11.62733],[52.190868,11.62959],[52.192478,11.63237],[52.199959,11.6454],[52.200359,11.64613],[52.20084,11.64695],[52.201038,11.64729],[52.20842,11.66016],[52.208679,11.66065],[52.209332,11.66179],[52.21109,11.66484],[52.21154,11.66565],[52.211788,11.66607],[52.213799,11.66959],[52.215851,11.67339],[52.216461,11.67478],[52.217049,11.67633],[52.217369,11.67731],[52.217579,11.67796],[52.217838,11.67877],[52.218311,11.68052],[52.21854,11.68151],[52.21909,11.6844],[52.219452,11.68751],[52.219749,11.69092],[52.220051,11.69427],[52.221161,11.70682],[52.22168,11.71211],[52.222061,11.71632],[52.223511,11.73166],[52.223629,11.73272],[52.223759,11.73362],[52.225361,11.74258],[52.22699,11.75169],[52.22805,11.75741],[52.228409,11.75924],[52.228741,11.76117],[52.229019,11.76374],[52.229149,11.76571],[52.229179,11.76778],[52.22897,11.77192],[52.227791,11.7904],[52.22768,11.79214],[52.2276,11.79329],[52.227291,11.79804],[52.226688,11.80733],[52.22665,11.80793],[52.226009,11.81791],[52.225689,11.82334],[52.225529,11.82563],[52.22541,11.82819],[52.22543,11.83002],[52.225471,11.83125],[52.225559,11.83267],[52.225651,11.83379],[52.227291,11.84773],[52.232201,11.88916],[52.23251,11.89181],[52.232639,11.89276],[52.232731,11.89358],[52.233051,11.89658],[52.23336,11.89995],[52.233601,11.90274],[52.233768,11.90531],[52.233879,11.90798],[52.234348,11.92429],[52.234779,11.94053],[52.235249,11.95714],[52.235409,11.96376],[52.2356,11.97119],[52.235748,11.97729],[52.23579,11.97894],[52.235771,11.98051],[52.235699,11.98249],[52.235432,11.98812],[52.235081,11.99699],[52.234341,12.01401],[52.233761,12.02773],[52.233421,12.03474],[52.233101,12.04213],[52.232632,12.05301],[52.232609,12.0542],[52.23262,12.05541],[52.23267,12.05675],[52.232841,12.0587],[52.23296,12.06002],[52.233101,12.06113],[52.233459,12.06384],[52.233681,12.06548],[52.233768,12.0661],[52.24308,12.13948],[52.2439,12.14593],[52.249649,12.19065],[52.252121,12.21038],[52.25235,12.21264],[52.252441,12.2143],[52.252491,12.21691],[52.252319,12.2199],[52.249069,12.25665],[52.248631,12.26174],[52.24828,12.2661],[52.24699,12.28226],[52.24678,12.28543],[52.246658,12.2885],[52.24675,12.29159],[52.246891,12.29349],[52.247169,12.29568],[52.24765,12.29831],[52.24847,12.30145],[52.248791,12.30246],[52.249241,12.30368],[52.2495,12.30437],[52.249821,12.30523],[52.253349,12.31351],[52.253639,12.31419],[52.26292,12.33628],[52.263882,12.33891],[52.264481,12.34107],[52.26495,12.34305],[52.265339,12.34523],[52.267719,12.36252],[52.277241,12.4319],[52.27755,12.43401],[52.278061,12.43658],[52.278561,12.43851],[52.279259,12.4407],[52.2799,12.44244],[52.280529,12.44386],[52.281189,12.44522],[52.281849,12.4464],[52.28727,12.45523],[52.289341,12.45825],[52.290829,12.46031],[52.292488,12.46235],[52.295609,12.46595],[52.299759,12.47067],[52.304459,12.47609],[52.30703,12.47905],[52.30975,12.48217],[52.312519,12.48525],[52.314991,12.48782],[52.318409,12.49088],[52.323139,12.49511],[52.326832,12.49837],[52.33028,12.50148],[52.333721,12.50458],[52.335201,12.50586],[52.335838,12.50645],[52.336571,12.50723],[52.337528,12.5084],[52.33836,12.50953],[52.339062,12.51066],[52.340118,12.51264],[52.340401,12.51326],[52.340809,12.51413],[52.341591,12.51603],[52.342892,12.51968],[52.344269,12.52359],[52.347919,12.53389],[52.348782,12.53666],[52.349419,12.53922],[52.349751,12.54055],[52.349819,12.5409],[52.350552,12.54517],[52.35088,12.54797],[52.351059,12.55027],[52.351181,12.55295],[52.351189,12.55519],[52.351158,12.55847],[52.35107,12.56422],[52.350922,12.57661],[52.350681,12.59304],[52.350632,12.59599],[52.35059,12.59717],[52.350498,12.5986],[52.35041,12.59981],[52.350182,12.60171],[52.349911,12.60367],[52.349659,12.60507],[52.34938,12.60644],[52.348999,12.60803],[52.348122,12.61133],[52.344818,12.62296],[52.34457,12.62384],[52.344391,12.62446],[52.34346,12.62779],[52.342911,12.62973],[52.34272,12.63038],[52.33942,12.64209],[52.339191,12.64297],[52.338009,12.64715],[52.33754,12.64889],[52.33662,12.65224],[52.33625,12.6537],[52.335899,12.65536],[52.33567,12.65673],[52.335419,12.65854],[52.3353,12.65974],[52.335209,12.66093],[52.335152,12.66218],[52.335121,12.66309],[52.335129,12.66403],[52.335171,12.6655],[52.33527,12.66721],[52.335411,12.66883],[52.336739,12.68137],[52.336811,12.68207],[52.33744,12.68802],[52.337521,12.68873],[52.338161,12.69472],[52.33852,12.6982],[52.338631,12.69936],[52.338799,12.70087],[52.339081,12.70356],[52.339729,12.70973],[52.339951,12.71174],[52.340092,12.71322],[52.34016,12.7143],[52.34021,12.71555],[52.340221,12.71697],[52.340179,12.71834],[52.340111,12.71968],[52.34005,12.72069],[52.34,12.72143],[52.339859,12.72375],[52.33979,12.72533],[52.339771,12.72611],[52.339729,12.72804],[52.339642,12.73175],[52.339588,12.73409],[52.339611,12.73499],[52.339661,12.73628],[52.339729,12.73744],[52.340691,12.75166],[52.341099,12.7577],[52.341141,12.75848],[52.341209,12.75966],[52.34127,12.76134],[52.341259,12.76291],[52.341171,12.76464],[52.341049,12.76608],[52.340149,12.7758],[52.339111,12.78689],[52.338871,12.78991],[52.338409,12.79716],[52.338299,12.79892],[52.338009,12.80411],[52.33791,12.80584],[52.33783,12.80681],[52.337711,12.80768],[52.337509,12.80871],[52.33728,12.8097],[52.33696,12.8107],[52.33646,12.81194],[52.336109,12.81268],[52.33569,12.81338],[52.33519,12.81405],[52.33503,12.81426],[52.334839,12.81447],[52.334141,12.81513],[52.333599,12.81561],[52.332981,12.81612],[52.332359,12.81673],[52.331921,12.81723],[52.331402,12.81794],[52.330929,12.81869],[52.330479,12.81961],[52.33017,12.8204],[52.32988,12.82124],[52.328949,12.82439],[52.327759,12.82837],[52.324871,12.83843],[52.322739,12.84587],[52.320759,12.85271],[52.320202,12.85459],[52.319859,12.85564],[52.31958,12.85649],[52.31926,12.85738],[52.318802,12.85852],[52.318409,12.85941],[52.317501,12.8613],[52.31609,12.86413],[52.313278,12.86984],[52.31123,12.874],[52.31044,12.87558],[52.310322,12.87582],[52.309509,12.87753],[52.306961,12.8826],[52.305679,12.88513],[52.298168,12.90026],[52.297329,12.90199],[52.29649,12.90364],[52.295471,12.90573],[52.292488,12.9117],[52.291592,12.91353],[52.291409,12.91394],[52.291069,12.91483],[52.29092,12.9154],[52.290779,12.91593],[52.29063,12.91674],[52.29052,12.91769],[52.290482,12.91831],[52.290451,12.91879],[52.290451,12.91924],[52.290482,12.91992],[52.290581,12.92099],[52.290749,12.92183],[52.29097,12.92274],[52.291271,12.92371],[52.291809,12.92508],[52.29211,12.92599],[52.292511,12.92743],[52.292961,12.92949],[52.298199,12.95228],[52.299309,12.95707],[52.301849,12.96836],[52.30249,12.97116],[52.302849,12.97277],[52.30302,12.97345],[52.303169,12.9741],[52.303341,12.97503],[52.303471,12.97595],[52.303539,12.97658],[52.3036,12.97733],[52.303638,12.97817],[52.303379,13.00804],[52.303349,13.00964],[52.303322,13.01115],[52.303261,13.01224],[52.303169,13.01321],[52.30304,13.01414],[52.302879,13.01503],[52.30267,13.01593],[52.30154,13.01991],[52.30014,13.02485],[52.299999,13.02532],[52.299839,13.02589],[52.29945,13.0273],[52.299179,13.02828],[52.298981,13.029],[52.298851,13.02948],[52.298691,13.03007],[52.298599,13.03051],[52.298489,13.031],[52.298409,13.0315],[52.298351,13.03191],[52.298302,13.03235],[52.29826,13.03275],[52.298229,13.03316],[52.298222,13.03357],[52.29821,13.03402],[52.29821,13.03448],[52.29821,13.03477],[52.298229,13.03535],[52.298248,13.03579],[52.298309,13.03639],[52.29837,13.03689],[52.29847,13.0375],[52.29858,13.03805],[52.298691,13.0386],[52.298889,13.0393],[52.299019,13.03977],[52.29924,13.04038],[52.30006,13.04263],[52.300331,13.04338],[52.30048,13.04386],[52.300621,13.04441],[52.300739,13.04491],[52.300819,13.04535],[52.300911,13.04586],[52.30098,13.04634],[52.301041,13.04686],[52.30109,13.04735],[52.301121,13.04784],[52.30114,13.04834],[52.30114,13.04896],[52.300999,13.05311],[52.300701,13.06163],[52.300671,13.06223],[52.300499,13.06709],[52.300159,13.07772],[52.30011,13.07952],[52.300049,13.08123],[52.30003,13.08219],[52.30006,13.08293],[52.300091,13.08362],[52.300129,13.08421],[52.300179,13.08472],[52.300228,13.0852],[52.300331,13.08582],[52.300541,13.08696],[52.30196,13.09434],[52.302139,13.09526],[52.302261,13.09585],[52.302559,13.09734],[52.30267,13.09799],[52.30275,13.09857],[52.30283,13.09933],[52.30286,13.09979],[52.302898,13.10039],[52.302921,13.10091],[52.302929,13.10139],[52.302921,13.10196],[52.302879,13.10399],[52.302631,13.11285],[52.30257,13.11635],[52.30254,13.11712],[52.302391,13.12387],[52.302311,13.12553],[52.301029,13.14169],[52.300968,13.14249],[52.30085,13.14398],[52.300831,13.14447],[52.300812,13.14488],[52.300812,13.14539],[52.3008,13.14592],[52.30085,13.15346],[52.300819,13.15558],[52.3008,13.15612],[52.300781,13.15662],[52.300739,13.15714],[52.300209,13.16418],[52.299351,13.17524],[52.298931,13.18064],[52.29892,13.18097],[52.298908,13.18142],[52.298908,13.1821],[52.29892,13.18257],[52.298931,13.18301],[52.298962,13.18349],[52.299,13.18391],[52.299042,13.18431],[52.299091,13.18475],[52.299149,13.18519],[52.299221,13.18569],[52.299301,13.18608],[52.29937,13.18646],[52.299431,13.18678],[52.299561,13.18732],[52.30003,13.18925],[52.30019,13.18995],[52.30151,13.1953],[52.301579,13.19566],[52.30167,13.19612],[52.301731,13.19652],[52.3018,13.19693],[52.301849,13.1973],[52.301899,13.19773],[52.301929,13.19806],[52.30196,13.19841],[52.301979,13.19887],[52.30201,13.19935],[52.302021,13.19977],[52.302021,13.20011],[52.30201,13.20053],[52.30201,13.20089],[52.301998,13.20135],[52.301891,13.20437],[52.301739,13.20819],[52.30159,13.21251],[52.30143,13.21658],[52.301399,13.21761],[52.30101,13.22814],[52.300629,13.23876],[52.300362,13.24577],[52.300339,13.24618],[52.300331,13.24667],[52.30032,13.24713],[52.30032,13.24761],[52.30032,13.24802],[52.300331,13.24849],[52.30035,13.24896],[52.300369,13.24944],[52.300419,13.24996],[52.300461,13.25048],[52.300529,13.25102],[52.300598,13.25154],[52.300701,13.25207],[52.300812,13.25259],[52.300919,13.25312],[52.301041,13.2536],[52.30117,13.25409],[52.301331,13.25467],[52.302052,13.25682],[52.303631,13.26149],[52.306171,13.26909],[52.306549,13.27018],[52.307129,13.27192],[52.307289,13.27238],[52.30743,13.27285],[52.307571,13.27335],[52.307701,13.27383],[52.307819,13.2743],[52.307941,13.27481],[52.308048,13.27532],[52.30814,13.27581],[52.308239,13.27632],[52.308319,13.2768],[52.308392,13.27732],[52.308449,13.27784],[52.30851,13.27835],[52.308559,13.27889],[52.30859,13.27942],[52.308601,13.27994],[52.308609,13.28048],[52.30862,13.281],[52.308601,13.28153],[52.308571,13.28206],[52.308552,13.28255],[52.308498,13.28311],[52.30801,13.28764],[52.30764,13.2907],[52.307468,13.2923],[52.30743,13.29283],[52.307388,13.29332],[52.307369,13.29385],[52.30735,13.29491],[52.307259,13.2995],[52.307259,13.29988],[52.30722,13.30167],[52.307178,13.30244],[52.306789,13.30749],[52.30616,13.31553],[52.30563,13.32229],[52.305561,13.32336],[52.305519,13.32442],[52.3055,13.32547],[52.3055,13.32656],[52.305531,13.3276],[52.30558,13.32869],[52.30566,13.32976],[52.305771,13.33087],[52.305901,13.33203],[52.305969,13.33278],[52.306438,13.33712],[52.30653,13.33803],[52.307461,13.3466],[52.307571,13.34768],[52.307659,13.34873],[52.307709,13.34979],[52.307739,13.35073],[52.307751,13.35086],[52.307758,13.35191],[52.30769,13.36154],[52.30769,13.36237],[52.30761,13.37333],[52.30759,13.37434],[52.307549,13.37523],[52.307499,13.37612],[52.30743,13.37713],[52.306961,13.38394],[52.3069,13.38485],[52.306709,13.38766],[52.306549,13.38997],[52.30653,13.39038],[52.306259,13.39469],[52.30616,13.39737],[52.30603,13.40509],[52.305882,13.4151],[52.305882,13.41575],[52.305851,13.41721],[52.30584,13.41831],[52.305801,13.42242],[52.305828,13.42609],[52.305851,13.42757],[52.305931,13.43275],[52.30603,13.43915],[52.30608,13.44054],[52.306141,13.44131],[52.30616,13.4416],[52.306229,13.44238],[52.30629,13.4429],[52.306641,13.44551],[52.306839,13.4466],[52.307899,13.45187],[52.308128,13.45298],[52.30838,13.45421],[52.308769,13.45611],[52.30912,13.45786],[52.309681,13.46055],[52.309719,13.46078],[52.310341,13.4639],[52.310459,13.4645],[52.311951,13.47177],[52.312611,13.47496],[52.312679,13.47535],[52.314789,13.48567],[52.315231,13.48783],[52.316971,13.49645],[52.317291,13.49799],[52.317951,13.50123],[52.3186,13.50442],[52.31881,13.50564],[52.318932,13.50642],[52.319031,13.50718],[52.319141,13.50822],[52.31921,13.50916],[52.31926,13.51001],[52.319302,13.51074],[52.319309,13.51155],[52.319321,13.51231],[52.319309,13.51293],[52.31929,13.51368],[52.319229,13.51505],[52.318851,13.52142],[52.318569,13.52585],[52.318359,13.52936],[52.31831,13.53107],[52.318279,13.53268],[52.31834,13.53601],[52.318371,13.53704],[52.318588,13.54471],[52.318771,13.55087],[52.31889,13.55457],[52.31889,13.55478],[52.318951,13.55658],[52.31897,13.55785],[52.319111,13.56125],[52.319141,13.56241],[52.319351,13.56982],[52.319481,13.57375],[52.319611,13.57905],[52.319679,13.58139],[52.319679,13.58179],[52.319672,13.58228],[52.319649,13.58274],[52.31963,13.58324],[52.319592,13.58371],[52.31953,13.58429],[52.319469,13.58477],[52.319401,13.5853],[52.319302,13.58579],[52.319199,13.5863],[52.319111,13.58674],[52.318981,13.58716],[52.318878,13.58758],[52.318771,13.588],[52.3186,13.58854],[52.318409,13.58908],[52.314541,13.59834],[52.313011,13.60187],[52.312778,13.60244],[52.31237,13.60355],[52.312092,13.60442],[52.311699,13.60583],[52.311562,13.60662],[52.31144,13.60741],[52.31134,13.60828],[52.311218,13.60965],[52.311131,13.61102],[52.310959,13.61394],[52.310749,13.61685],[52.310581,13.61942],[52.31041,13.62219],[52.310219,13.62503],[52.310089,13.62699],[52.31007,13.6275],[52.31007,13.62845],[52.31007,13.62939],[52.310169,13.63121],[52.310249,13.63253],[52.31028,13.63349],[52.310299,13.63427],[52.31039,13.63698],[52.31065,13.64389],[52.310699,13.64603],[52.310829,13.64817],[52.31089,13.64904],[52.311039,13.65133],[52.311359,13.65437],[52.311451,13.65497],[52.311939,13.65849],[52.312649,13.66256],[52.312679,13.6627],[52.312778,13.66331],[52.31284,13.66363],[52.313709,13.66821],[52.31422,13.67078],[52.316711,13.68074],[52.318481,13.68853],[52.32093,13.69869],[52.323811,13.71061],[52.324039,13.71157],[52.324181,13.71243],[52.324329,13.71357],[52.324421,13.7144],[52.324478,13.71538],[52.324501,13.7164],[52.32439,13.72013],[52.32423,13.72539],[52.324211,13.72651],[52.324032,13.73115],[52.323959,13.73364],[52.323719,13.73806],[52.323471,13.74205],[52.32333,13.74668],[52.32317,13.75164],[52.323151,13.75306],[52.323158,13.7541],[52.3232,13.75505],[52.323231,13.75592],[52.323261,13.7567],[52.32328,13.75751],[52.32328,13.75826],[52.323261,13.75934],[52.323231,13.76009],[52.32309,13.76171],[52.323009,13.76277],[52.32291,13.76362],[52.322769,13.76464],[52.322479,13.76632],[52.321991,13.76899],[52.321259,13.77266],[52.320969,13.7741],[52.319851,13.77939],[52.31921,13.78262],[52.318939,13.78396],[52.318501,13.78613],[52.317551,13.79078],[52.317509,13.79102],[52.317341,13.79181],[52.317108,13.7929],[52.31657,13.79519],[52.315449,13.79977],[52.315079,13.80129],[52.313332,13.80844],[52.31131,13.81651],[52.310841,13.81912],[52.310638,13.82042],[52.31049,13.8217],[52.310379,13.82292],[52.310299,13.8241],[52.310242,13.82523],[52.310211,13.82659],[52.310211,13.82763],[52.31028,13.82919],[52.31039,13.83102],[52.310612,13.83456],[52.310829,13.83808],[52.311031,13.84117],[52.312199,13.85973],[52.312481,13.86492],[52.31292,13.8716],[52.313129,13.87394],[52.3134,13.87599],[52.31377,13.87848],[52.315659,13.8905],[52.316002,13.89283],[52.316109,13.89382],[52.316139,13.89395],[52.316231,13.89513],[52.316341,13.89711],[52.31636,13.89782],[52.316368,13.89843],[52.316368,13.89941],[52.316368,13.89974],[52.316319,13.9008],[52.316299,13.90126],[52.31628,13.90146],[52.316231,13.90217],[52.3162,13.90265],[52.31612,13.9035],[52.316051,13.90423],[52.315929,13.90506],[52.315769,13.90622],[52.31554,13.90753],[52.315449,13.90808],[52.31525,13.90935],[52.314678,13.91243],[52.313839,13.91717],[52.313591,13.91856],[52.313251,13.9206],[52.313,13.92272],[52.312859,13.92457],[52.312672,13.92828],[52.312469,13.93198],[52.31221,13.93685],[52.31189,13.94362],[52.311821,13.94501],[52.311699,13.94711],[52.3116,13.94925],[52.311531,13.95186],[52.311501,13.95388],[52.31152,13.95569],[52.31155,13.95647],[52.31155,13.95723],[52.31155,13.95759],[52.3116,13.95848],[52.311649,13.95939],[52.31171,13.96051],[52.31189,13.9633],[52.311958,13.96403],[52.312031,13.96476],[52.312111,13.96553],[52.312309,13.9676],[52.312679,13.97042],[52.313519,13.97695],[52.31419,13.98221],[52.315079,13.98901],[52.31559,13.99114],[52.316631,13.99535],[52.320641,14.01003],[52.321388,14.01278],[52.32254,14.01699],[52.327091,14.03302],[52.327888,14.03549],[52.32877,14.03817],[52.329361,14.03994],[52.329639,14.04085],[52.329868,14.04185],[52.330509,14.0449],[52.331181,14.04833],[52.332371,14.05431],[52.333389,14.0594],[52.33419,14.0635],[52.334278,14.06416],[52.334389,14.06499],[52.33445,14.06608],[52.33448,14.06779],[52.334492,14.06882],[52.334499,14.06961],[52.33453,14.0718],[52.33461,14.07611],[52.334621,14.07673],[52.334629,14.07948],[52.334641,14.0799],[52.33469,14.08319],[52.334709,14.08396],[52.33493,14.09404],[52.335129,14.10164],[52.335171,14.10379],[52.3353,14.10977],[52.33532,14.11047],[52.335442,14.1153],[52.335579,14.12059],[52.335781,14.12908],[52.335941,14.13594],[52.336109,14.14278],[52.336159,14.14419],[52.336269,14.14563],[52.336399,14.14698],[52.33659,14.14847],[52.336849,14.15005],[52.33704,14.15106],[52.337559,14.15323],[52.33905,14.15899],[52.33989,14.16224],[52.340832,14.16591],[52.342758,14.17332],[52.343319,14.17564],[52.343731,14.17809],[52.34388,14.18072],[52.343811,14.18341],[52.34338,14.18688],[52.342838,14.18988],[52.341709,14.19427],[52.340618,14.19713],[52.338531,14.20352],[52.337429,14.20914],[52.337021,14.2144],[52.336578,14.22596],[52.335991,14.24164],[52.33585,14.24464],[52.335499,14.24766],[52.334919,14.2509],[52.334171,14.25369],[52.333778,14.25489],[52.333649,14.25527],[52.332611,14.25821],[52.330059,14.2653],[52.328659,14.26944],[52.328289,14.27081],[52.32753,14.27394],[52.327179,14.27573],[52.326401,14.27954],[52.325371,14.28448],[52.324718,14.2877],[52.324291,14.29105],[52.32399,14.29796],[52.323471,14.31189],[52.32296,14.32586],[52.322208,14.34336],[52.322159,14.3474],[52.322029,14.35058],[52.321739,14.359],[52.321239,14.37253],[52.32095,14.37974],[52.320938,14.38024],[52.320881,14.38183],[52.32056,14.39143],[52.32029,14.39804],[52.32019,14.40253],[52.320221,14.41164],[52.32032,14.42128],[52.3204,14.43098],[52.320591,14.44889],[52.32069,14.45717],[52.320679,14.46126],[52.320641,14.46375],[52.320591,14.46598],[52.32053,14.46934],[52.320431,14.47422],[52.320419,14.475],[52.320358,14.47841],[52.32019,14.48646],[52.320011,14.49741],[52.31992,14.50324],[52.319832,14.50629],[52.319721,14.50929],[52.319519,14.51284],[52.319302,14.51651],[52.319069,14.51992],[52.318989,14.5207],[52.31889,14.52167],[52.318729,14.52265],[52.318451,14.52381],[52.318111,14.52488],[52.317699,14.52601],[52.316898,14.52836],[52.316601,14.52915],[52.316311,14.52992],[52.31617,14.53036],[52.315948,14.53115],[52.315681,14.53209],[52.315552,14.53266],[52.315231,14.53412],[52.314899,14.53588],[52.31472,14.53705],[52.314548,14.53846],[52.314442,14.53961],[52.31435,14.54102],[52.314289,14.54354],[52.31432,14.54571],[52.314381,14.54728],[52.314388,14.54786],[52.31451,14.55143],[52.314579,14.55382],[52.31461,14.55563],[52.314621,14.55709],[52.31459,14.56008],[52.314548,14.56303],[52.314499,14.56659],[52.314579,14.56822],[52.314789,14.57063],[52.314919,14.57244],[52.315189,14.57603],[52.31538,14.57823],[52.31575,14.582],[52.316051,14.5845],[52.316212,14.58597],[52.316299,14.58661],[52.316368,14.58724],[52.316441,14.58844],[52.316521,14.58954],[52.316681,14.59023],[52.316879,14.59181],[52.31699,14.59264],[52.31889,14.59981],[52.320629,14.60601],[52.322411,14.61267],[52.323078,14.6152],[52.32394,14.61827],[52.32452,14.62057],[52.324692,14.62123],[52.325001,14.62245],[52.325611,14.62534],[52.32589,14.6274],[52.326092,14.6291],[52.326199,14.63064],[52.326248,14.63312],[52.32616,14.63536],[52.325989,14.63746],[52.325851,14.63898],[52.325691,14.64077],[52.325489,14.64297],[52.325272,14.64536],[52.324631,14.65187],[52.324131,14.65751],[52.323959,14.66148],[52.32394,14.66456],[52.324268,14.66852],[52.324959,14.67386],[52.325951,14.68193],[52.32679,14.68798],[52.32782,14.69577],[52.328308,14.69948],[52.3284,14.69984],[52.3288,14.70276],[52.32935,14.70716],[52.329762,14.71018],[52.33012,14.71311],[52.33057,14.71611],[52.330719,14.71743],[52.33099,14.71987],[52.331348,14.72298],[52.331509,14.72419],[52.332329,14.73033],[52.33297,14.7351],[52.333672,14.73998],[52.334278,14.74597],[52.334839,14.74961],[52.335121,14.75285],[52.33532,14.75599],[52.335251,14.76015],[52.335251,14.76259],[52.335251,14.76802],[52.335281,14.77738],[52.335312,14.78783],[52.335312,14.79524],[52.335312,14.8001],[52.335121,14.80287],[52.33474,14.80595],[52.334,14.80992],[52.3326,14.81719],[52.331188,14.82469],[52.33181,14.82495],[52.332211,14.82512],[52.336479,14.82671],[52.33667,14.82695],[52.3367,14.82708],[52.336899,14.82746],[52.337959,14.83174],[52.33971,14.84149],[52.339722,14.8423],[52.339249,14.84258],[52.337952,14.84265],[52.33688,14.84286],[52.33585,14.8435],[52.334579,14.84484],[52.332611,14.84689],[52.33099,14.84875],[52.329708,14.84906],[52.329891,14.85048],[52.32983,14.85069],[52.329731,14.85084],[52.329269,14.85094],[52.32988,14.85503],[52.331451,14.8649],[52.332531,14.87174],[52.333229,14.87593],[52.333488,14.87793],[52.333511,14.87955],[52.333382,14.88108],[52.33308,14.8827],[52.33213,14.88645],[52.329849,14.89468],[52.327461,14.90341],[52.32626,14.90796],[52.325859,14.90951],[52.324551,14.91448],[52.323891,14.91709],[52.32333,14.92519],[52.322842,14.93262],[52.32272,14.93431],[52.32272,14.93545],[52.322701,14.93746],[52.322601,14.94129],[52.322571,14.94231],[52.322529,14.94388],[52.322491,14.94485],[52.3223,14.94668],[52.322048,14.94901],[52.322102,14.95146],[52.32214,14.95324],[52.323261,14.96119],[52.323551,14.96432],[52.32428,14.96949],[52.324532,14.97133],[52.325459,14.97816],[52.325851,14.98161],[52.326069,14.98478],[52.326172,14.9859],[52.326431,14.99044],[52.32671,14.9952],[52.327068,15.00165],[52.327141,15.00297],[52.32748,15.00926],[52.327492,15.01057],[52.3274,15.01196],[52.327202,15.0133],[52.326889,15.01427],[52.32626,15.01541],[52.326038,15.01612],[52.325581,15.01866],[52.325211,15.01991],[52.323639,15.02362],[52.321442,15.02881],[52.319618,15.03303],[52.31826,15.03632],[52.317959,15.03744],[52.317749,15.03856],[52.317539,15.03964],[52.317451,15.04015],[52.317299,15.04102],[52.3172,15.04158],[52.31712,15.04197],[52.31575,15.05026],[52.314671,15.05675],[52.31459,15.05757],[52.314362,15.0613],[52.314308,15.06239],[52.314129,15.06768],[52.314129,15.06804],[52.314018,15.07221],[52.314011,15.07287],[52.314011,15.07321],[52.31406,15.07634],[52.31406,15.07645],[52.31403,15.07699],[52.313969,15.07741],[52.313759,15.07815],[52.31358,15.07869],[52.313381,15.07915],[52.313061,15.07986],[52.31271,15.08079],[52.312401,15.08214],[52.312351,15.08315],[52.312359,15.0838],[52.3125,15.0857],[52.312778,15.08879],[52.313099,15.09145],[52.313129,15.09244],[52.313122,15.09307],[52.312889,15.09459],[52.312592,15.09667],[52.31163,15.10237],[52.311291,15.10456],[52.311131,15.10562],[52.3102,15.11167],[52.309429,15.1158],[52.309212,15.11783],[52.307449,15.12917],[52.305851,15.13853],[52.305531,15.14046],[52.305679,15.1434],[52.30682,15.15571],[52.307621,15.16481],[52.30814,15.16976],[52.308449,15.17354],[52.308491,15.17476],[52.30835,15.17634],[52.307598,15.18076],[52.30743,15.18192],[52.30706,15.18441],[52.306221,15.19006],[52.305679,15.19367],[52.305141,15.19727],[52.304531,15.20115],[52.304321,15.20249],[52.30415,15.20363],[52.304161,15.20518],[52.304138,15.2125],[52.304081,15.21744],[52.30415,15.22173],[52.304062,15.22459],[52.30323,15.22903],[52.302021,15.23598],[52.300991,15.24142],[52.300159,15.24576],[52.299431,15.24963],[52.299141,15.25119],[52.298908,15.25245],[52.298779,15.25318],[52.297981,15.25758],[52.296871,15.26387],[52.296539,15.26546],[52.296162,15.26735],[52.29599,15.26859],[52.296009,15.27042],[52.296291,15.27157],[52.296638,15.27262],[52.297279,15.27445],[52.29789,15.27607],[52.29921,15.27976],[52.299759,15.28133],[52.300079,15.28318],[52.300201,15.28427],[52.300282,15.28585],[52.30032,15.28881],[52.30032,15.29367],[52.300098,15.30026],[52.29995,15.30136],[52.29969,15.30273],[52.29908,15.30553],[52.296902,15.31165],[52.29541,15.31585],[52.293541,15.32154],[52.29134,15.32788],[52.290749,15.32981],[52.290359,15.33222],[52.290199,15.33807],[52.28923,15.34195],[52.286598,15.34702],[52.282909,15.35303],[52.28138,15.35526],[52.28064,15.35622],[52.279541,15.35927],[52.278992,15.36026],[52.278389,15.36093],[52.277431,15.36179],[52.276669,15.36254],[52.276081,15.36362],[52.274551,15.36875],[52.272739,15.37466],[52.2714,15.37907],[52.270931,15.38053],[52.270679,15.38137],[52.269402,15.38597],[52.268921,15.38743],[52.26889,15.38753],[52.268349,15.38872],[52.267929,15.38954],[52.266949,15.39075],[52.265129,15.39281],[52.263699,15.39487],[52.262249,15.39781],[52.26144,15.39949],[52.260139,15.4022],[52.258701,15.40485],[52.257919,15.40721],[52.257301,15.41013],[52.257069,15.41427],[52.25671,15.41949],[52.256142,15.42734],[52.255051,15.44218],[52.254669,15.44881],[52.253799,15.45979],[52.253811,15.46035],[52.253769,15.4612],[52.25412,15.46642],[52.254219,15.46799],[52.254169,15.469],[52.254028,15.47212],[52.25436,15.47424],[52.254292,15.47588],[52.25423,15.47617],[52.253578,15.47933],[52.25301,15.48252],[52.25317,15.4857],[52.253681,15.488],[52.255531,15.49359],[52.256592,15.49689],[52.25745,15.49939],[52.258282,15.50201],[52.25943,15.50561],[52.259819,15.50713],[52.260269,15.51073],[52.26046,15.51246],[52.26078,15.51575],[52.26115,15.5193],[52.261292,15.52025],[52.261452,15.52155],[52.262089,15.5273],[52.262291,15.52977],[52.262249,15.53163],[52.26223,15.53312],[52.26202,15.5332],[52.261929,15.53345],[52.261971,15.53376],[52.26215,15.53395],[52.261848,15.5347],[52.260761,15.53751],[52.260719,15.53759],[52.260151,15.53888],[52.256161,15.5487],[52.255932,15.54923],[52.255569,15.5501],[52.252998,15.55644],[52.252178,15.55843],[52.251789,15.56074],[52.2519,15.56195],[52.25211,15.56461],[52.253609,15.57056],[52.2556,15.57819],[52.256821,15.58265],[52.256802,15.5835],[52.257481,15.5857],[52.25787,15.58713],[52.25988,15.59026],[52.26302,15.5945],[52.266281,15.5992],[52.268742,15.60275],[52.271172,15.6061],[52.272129,15.60787],[52.272579,15.60917],[52.273281,15.61221],[52.274811,15.61984],[52.275711,15.62407],[52.277569,15.63269],[52.278252,15.63792],[52.27877,15.64118],[52.279442,15.64462],[52.280972,15.64746],[52.283218,15.64905],[52.285912,15.65071],[52.287239,15.65119],[52.289459,15.6513],[52.293442,15.6511],[52.295109,15.65142],[52.297279,15.65219],[52.299271,15.65359],[52.30196,15.65767],[52.303341,15.65965],[52.305401,15.66148],[52.308849,15.66356],[52.31028,15.66424],[52.311329,15.66496],[52.312618,15.66619],[52.31633,15.66969],[52.31855,15.67166],[52.319462,15.67272],[52.320271,15.67374],[52.320709,15.67491],[52.321201,15.67633],[52.32132,15.67753],[52.321419,15.67846],[52.321331,15.68024],[52.32106,15.68229],[52.32103,15.68387],[52.321301,15.68584],[52.321831,15.68795],[52.322472,15.69054],[52.322781,15.69181],[52.32394,15.69626],[52.3269,15.70543],[52.32933,15.71288],[52.33041,15.71597],[52.33242,15.72132],[52.332859,15.72245],[52.332901,15.72256],[52.332939,15.72267],[52.333858,15.72466],[52.33744,15.73182],[52.33881,15.73474],[52.33939,15.73652],[52.339828,15.73898],[52.341141,15.74844],[52.341801,15.75126],[52.342041,15.75225],[52.342319,15.75323],[52.342739,15.75468],[52.34322,15.75633],[52.34446,15.76096],[52.344971,15.76281],[52.345161,15.7647],[52.34523,15.76731],[52.344761,15.77811],[52.344379,15.78276],[52.34428,15.78559],[52.344429,15.78784],[52.344711,15.78962],[52.3451,15.79201],[52.345829,15.7957],[52.346882,15.7995],[52.347641,15.8022],[52.3503,15.81156],[52.3531,15.82158],[52.353291,15.82229],[52.353619,15.82347],[52.356079,15.83324],[52.35796,15.84103],[52.358109,15.84228],[52.35828,15.84537],[52.358429,15.84972],[52.35873,15.85273],[52.358829,15.85334],[52.358891,15.85361],[52.359669,15.85557],[52.36055,15.85676],[52.36179,15.85789],[52.36377,15.8595],[52.36541,15.86088],[52.366211,15.86172],[52.36718,15.86298],[52.36763,15.86378],[52.36797,15.86447],[52.368431,15.86563],[52.368519,15.86592],[52.36887,15.86689],[52.370312,15.87259],[52.37077,15.87381],[52.37096,15.87428],[52.37191,15.87661],[52.372532,15.87872],[52.372829,15.88037],[52.37294,15.88168],[52.372929,15.88325],[52.372398,15.88678],[52.37236,15.88699],[52.371841,15.89046],[52.371609,15.89246],[52.371269,15.89542],[52.371078,15.89704],[52.371719,15.903],[52.37233,15.9084],[52.372551,15.90929],[52.373058,15.91025],[52.373959,15.91201],[52.37439,15.9134],[52.37508,15.91632],[52.375851,15.91963],[52.376381,15.92256],[52.377209,15.92803],[52.37722,15.92961],[52.376469,15.93341],[52.37648,15.93775],[52.3764,15.93848],[52.375511,15.94449],[52.375252,15.94754],[52.375278,15.94982],[52.375629,15.95385],[52.375751,15.95709],[52.375839,15.95888],[52.375851,15.9591],[52.375912,15.96079],[52.37608,15.96312],[52.37645,15.96516],[52.377838,15.97023],[52.379761,15.97643],[52.379902,15.97828],[52.37991,15.97955],[52.379452,15.98388],[52.380009,15.99173],[52.380421,15.99552],[52.380459,15.99832],[52.38055,16.001459],[52.380169,16.00466],[52.379589,16.007641],[52.378349,16.01523],[52.376911,16.02301],[52.376369,16.02775],[52.376301,16.02907],[52.376301,16.03022],[52.376331,16.032221],[52.376431,16.035379],[52.376789,16.04607],[52.377239,16.057249],[52.377392,16.06572],[52.377522,16.07852],[52.37772,16.09374],[52.37756,16.09358],[52.377369,16.093679],[52.377289,16.09392],[52.3773,16.09408],[52.375912,16.09433],[52.374691,16.094549],[52.3713,16.09503],[52.37112,16.09507],[52.366039,16.096029],[52.36264,16.096661],[52.36253,16.097219],[52.362289,16.09865],[52.36216,16.099291],[52.361931,16.099661],[52.36129,16.09997],[52.360569,16.100269],[52.360031,16.10107],[52.359779,16.102039],[52.359699,16.10269],[52.3596,16.103861],[52.359631,16.104851],[52.36039,16.10857],[52.36195,16.117229],[52.362999,16.123461],[52.36385,16.130489],[52.364521,16.136801],[52.365608,16.147249],[52.367062,16.161501],[52.367298,16.16527],[52.36742,16.168301],[52.367451,16.172119],[52.367611,16.185591],[52.36763,16.187149],[52.367821,16.19273],[52.368038,16.19655],[52.368622,16.20146],[52.36945,16.20701],[52.372471,16.222179],[52.375481,16.238211],[52.375839,16.24123],[52.376221,16.244749],[52.376629,16.249599],[52.37714,16.26313],[52.37738,16.270679],[52.377781,16.279659],[52.37822,16.288481],[52.379379,16.309139],[52.380039,16.32155],[52.38118,16.34289],[52.381981,16.356291],[52.38266,16.36916],[52.38324,16.37723],[52.383869,16.383631],[52.38559,16.396589],[52.38728,16.408449],[52.388142,16.41563],[52.388851,16.42271],[52.389351,16.428341],[52.38969,16.434139],[52.39006,16.44529],[52.390018,16.448879],[52.389881,16.453251],[52.389729,16.45645],[52.3895,16.459141],[52.38924,16.46138],[52.388569,16.46607],[52.387341,16.47382],[52.38707,16.47554],[52.386841,16.477989],[52.386749,16.479481],[52.3867,16.48031],[52.386551,16.483351],[52.386478,16.486731],[52.38657,16.491039],[52.386761,16.494961],[52.387081,16.49999],[52.387459,16.50783],[52.387501,16.511551],[52.387451,16.514919],[52.387249,16.520399],[52.3867,16.52607],[52.38604,16.531031],[52.385269,16.5352],[52.384708,16.53763],[52.383999,16.540649],[52.38084,16.55183],[52.37812,16.56093],[52.3773,16.563681],[52.376591,16.56605],[52.373539,16.575661],[52.370152,16.584909],[52.3647,16.59923],[52.360741,16.60952],[52.357101,16.61961],[52.35582,16.62454],[52.355042,16.628139],[52.353432,16.638],[52.35215,16.64694],[52.350979,16.654249],[52.35059,16.656679],[52.349979,16.660419],[52.349369,16.664169],[52.34903,16.66687],[52.348579,16.67141],[52.348389,16.67975],[52.34893,16.691719],[52.349468,16.70499],[52.349819,16.713869],[52.349899,16.715731],[52.35001,16.718731],[52.350319,16.726601],[52.350422,16.729759],[52.350491,16.73181],[52.350491,16.73185],[52.350491,16.731979],[52.350491,16.736811],[52.350491,16.74202],[52.350479,16.75079],[52.350521,16.761419],[52.350479,16.77059],[52.35043,16.778931],[52.35046,16.795071],[52.35033,16.81012],[52.3503,16.826269],[52.350319,16.83869],[52.35041,16.841261],[52.350609,16.84532],[52.350651,16.846121],[52.35088,16.849079],[52.35112,16.85165],[52.35257,16.863581],[52.354179,16.876539],[52.3545,16.879709],[52.354691,16.88483],[52.354698,16.88644],[52.354641,16.888269],[52.354519,16.89225],[52.354389,16.89537],[52.354179,16.897949],[52.35379,16.901699],[52.353741,16.90243],[52.353352,16.90744],[52.35313,16.91028],[52.35281,16.914261],[52.352631,16.916651],[52.352428,16.91897],[52.3521,16.923109],[52.350979,16.937201],[52.349918,16.94964],[52.3494,16.956039],[52.348999,16.961029],[52.348652,16.9655],[52.348,16.973419],[52.347019,16.98617],[52.346531,16.99177],[52.345741,17.0009],[52.345322,17.004881],[52.345009,17.007601],[52.344269,17.01376],[52.34333,17.0207],[52.342529,17.0254],[52.34095,17.034031],[52.337791,17.049919],[52.334721,17.0646],[52.331821,17.078711],[52.329639,17.087839],[52.32906,17.090099],[52.32856,17.09207],[52.327869,17.094801],[52.326542,17.099489],[52.324188,17.107441],[52.32201,17.114479],[52.318722,17.12499],[52.31752,17.12882],[52.31514,17.136431],[52.312561,17.144501],[52.311531,17.1478],[52.311031,17.14967],[52.310692,17.150949],[52.310612,17.1513],[52.310101,17.15361],[52.309872,17.15439],[52.309158,17.157721],[52.308281,17.163059],[52.307789,17.166821],[52.307411,17.170919],[52.307159,17.17539],[52.307072,17.179951],[52.307159,17.18524],[52.30761,17.190941],[52.307919,17.19392],[52.30904,17.201851],[52.309639,17.20735],[52.310059,17.212879],[52.310219,17.223009],[52.310131,17.24172],[52.310131,17.25379],[52.310059,17.265499],[52.310009,17.2722],[52.31004,17.278469],[52.310001,17.296169],[52.309929,17.305731],[52.309929,17.32172],[52.309841,17.34235],[52.309818,17.35442],[52.30991,17.357189],[52.310108,17.362419],[52.311218,17.376181],[52.311531,17.37855],[52.312019,17.38233],[52.312881,17.38825],[52.314861,17.399639],[52.317001,17.41197],[52.317711,17.417191],[52.318211,17.421301],[52.318691,17.42766],[52.31892,17.4317],[52.319038,17.436029],[52.31905,17.440769],[52.318821,17.454201],[52.31863,17.468769],[52.318409,17.48267],[52.31818,17.49605],[52.317921,17.50906],[52.317699,17.51322],[52.316971,17.521919],[52.316311,17.526711],[52.31567,17.530861],[52.315208,17.53367],[52.31498,17.53483],[52.314461,17.53759],[52.31406,17.539631],[52.313801,17.540899],[52.31295,17.54521],[52.312279,17.548889],[52.31216,17.549549],[52.311619,17.55254],[52.31144,17.553499],[52.310799,17.55788],[52.31052,17.56024],[52.3102,17.563971],[52.30999,17.56748],[52.30975,17.57126],[52.30954,17.574511],[52.30933,17.57836],[52.309101,17.58201],[52.30883,17.58531],[52.308441,17.588831],[52.307899,17.592569],[52.30722,17.596371],[52.306309,17.600479],[52.305389,17.6045],[52.304482,17.60854],[52.303532,17.612631],[52.302601,17.61665],[52.301689,17.620621],[52.300812,17.624559],[52.299938,17.628269],[52.299042,17.63216],[52.298119,17.6362],[52.297241,17.639971],[52.29636,17.64382],[52.295509,17.64756],[52.294621,17.65148],[52.293709,17.65538],[52.29277,17.659121],[52.29174,17.662821],[52.290619,17.666571],[52.289539,17.66995],[52.288361,17.673321],[52.287079,17.67683],[52.285419,17.68096],[52.284302,17.683741],[52.282619,17.687811],[52.281368,17.690929],[52.279861,17.694639],[52.27853,17.697969],[52.27705,17.70166],[52.275711,17.70507],[52.274361,17.70862],[52.272991,17.712521],[52.271801,17.716221],[52.270828,17.719391],[52.26992,17.72262],[52.269112,17.72566],[52.268009,17.73033],[52.267029,17.73484],[52.266171,17.739389],[52.26545,17.74361],[52.264851,17.74773],[52.264339,17.75156],[52.26395,17.755159],[52.263531,17.75952],[52.2631,17.764071],[52.262661,17.76853],[52.262291,17.77253],[52.261848,17.776291],[52.261261,17.780161],[52.260521,17.78458],[52.259731,17.78904],[52.25893,17.7936],[52.258129,17.79822],[52.25724,17.80298],[52.256351,17.80759],[52.25547,17.81222],[52.254551,17.81682],[52.25354,17.82229],[52.25312,17.824261],[52.252941,17.82514],[52.25259,17.82683],[52.252419,17.827629],[52.251381,17.83252],[52.2509,17.83478],[52.249779,17.83993],[52.248749,17.84458],[52.247639,17.84947],[52.246498,17.85438],[52.245319,17.8594],[52.24419,17.86404],[52.24305,17.868641],[52.24176,17.8738],[52.240639,17.87789],[52.239029,17.88295],[52.23682,17.889059],[52.235039,17.894119],[52.23349,17.898911],[52.23222,17.903549],[52.23119,17.90774],[52.23016,17.91255],[52.229259,17.91707],[52.228359,17.921789],[52.22744,17.92672],[52.226559,17.931179],[52.225601,17.935749],[52.224491,17.940611],[52.223751,17.943661],[52.22287,17.946989],[52.222279,17.949011],[52.221851,17.95014],[52.221439,17.951441],[52.221069,17.953329],[52.22031,17.956221],[52.218899,17.96109],[52.2174,17.966471],[52.216011,17.97163],[52.21492,17.97599],[52.21381,17.980471],[52.212631,17.98546],[52.21167,17.98987],[52.210781,17.99387],[52.20961,17.99971],[52.20866,18.004471],[52.20779,18.008881],[52.206749,18.013941],[52.20602,18.017241],[52.205151,18.02088],[52.204651,18.02261],[52.204361,18.023609],[52.203629,18.026171],[52.20158,18.032551],[52.199871,18.03726],[52.198181,18.04203],[52.196732,18.046591],[52.19548,18.051359],[52.19442,18.056259],[52.19352,18.06118],[52.19257,18.06632],[52.19146,18.07118],[52.190239,18.075649],[52.18866,18.080429],[52.187099,18.085381],[52.18586,18.09009],[52.1847,18.094481],[52.183529,18.099291],[52.182571,18.10388],[52.181751,18.108379],[52.180939,18.11359],[52.180149,18.11895],[52.17931,18.124451],[52.178391,18.12904],[52.177391,18.133511],[52.176289,18.13798],[52.175289,18.142071],[52.174252,18.146379],[52.173119,18.15097],[52.172169,18.15522],[52.171021,18.160151],[52.17004,18.164909],[52.169079,18.1696],[52.168129,18.17441],[52.16724,18.179291],[52.166359,18.18424],[52.165501,18.18927],[52.164799,18.193991],[52.164261,18.19729],[52.163601,18.201611],[52.163479,18.202221],[52.163288,18.203501],[52.162941,18.205879],[52.162628,18.20842],[52.162441,18.210489],[52.162209,18.212669],[52.162029,18.21505],[52.161758,18.218439],[52.161381,18.223881],[52.161018,18.229349],[52.160629,18.234871],[52.160221,18.24069],[52.15979,18.24567],[52.15921,18.250759],[52.158298,18.256281],[52.157089,18.26198],[52.15686,18.262859],[52.156521,18.264111],[52.156021,18.26605],[52.155621,18.26754],[52.155529,18.267851],[52.153629,18.273861],[52.151821,18.279779],[52.151131,18.28227],[52.150261,18.28594],[52.149189,18.29163],[52.14827,18.299],[52.147739,18.303749],[52.147419,18.307131],[52.146671,18.31233],[52.145721,18.31716],[52.14344,18.32645],[52.1422,18.33209],[52.141201,18.3377],[52.14061,18.342541],[52.140171,18.348499],[52.14003,18.353571],[52.140141,18.359501],[52.140388,18.36388],[52.14098,18.369869],[52.141541,18.37516],[52.141998,18.381081],[52.142281,18.386061],[52.142429,18.390619],[52.142551,18.39543],[52.142719,18.40027],[52.14312,18.40498],[52.143608,18.409361],[52.144421,18.414459],[52.145329,18.419029],[52.1464,18.42411],[52.14727,18.42831],[52.148239,18.432989],[52.14922,18.437771],[52.15012,18.4422],[52.150902,18.446541],[52.151581,18.450729],[52.1521,18.4548],[52.152512,18.46007],[52.152641,18.46566],[52.152561,18.470949],[52.152241,18.476339],[52.15163,18.48201],[52.150822,18.487101],[52.149769,18.492439],[52.148651,18.497259],[52.147419,18.502279],[52.1464,18.50639],[52.145149,18.511869],[52.144218,18.516371],[52.14336,18.521139],[52.142601,18.526649],[52.14204,18.531811],[52.14164,18.5376],[52.141411,18.54336],[52.141399,18.54904],[52.141472,18.55442],[52.141609,18.55991],[52.141731,18.565041],[52.141842,18.569691],[52.141979,18.57476],[52.142101,18.57938],[52.14212,18.584629],[52.14204,18.589439],[52.141811,18.594589],[52.141441,18.59964],[52.141029,18.603769],[52.140869,18.60504],[52.140541,18.607731],[52.140091,18.610941],[52.140011,18.61146],[52.139519,18.614491],[52.138969,18.617519],[52.13818,18.62149],[52.13723,18.62561],[52.135731,18.631559],[52.135681,18.63175],[52.134151,18.63732],[52.13364,18.63928],[52.13271,18.64283],[52.13187,18.6465],[52.13039,18.654449],[52.129341,18.660379],[52.128231,18.66544],[52.127201,18.669399],[52.12553,18.674879],[52.123859,18.680531],[52.12262,18.685539],[52.121559,18.691231],[52.121071,18.694349],[52.120071,18.702909],[52.1194,18.708441],[52.118649,18.71439],[52.118198,18.71767],[52.1171,18.723419],[52.116119,18.727289],[52.115021,18.731091],[52.114159,18.733749],[52.112358,18.73856],[52.110241,18.74337],[52.10701,18.74958],[52.104431,18.75449],[52.102268,18.75923],[52.1003,18.76413],[52.09827,18.769489],[52.096371,18.7742],[52.09589,18.775391],[52.094379,18.77862],[52.093109,18.781071],[52.091259,18.78434],[52.089241,18.7875],[52.08601,18.791849],[52.082939,18.79541],[52.080631,18.79825],[52.077099,18.80315],[52.07399,18.80831],[52.072338,18.811621],[52.071739,18.81282],[52.070518,18.81525],[52.0704,18.8155],[52.068199,18.82025],[52.06596,18.82456],[52.063099,18.82938],[52.0588,18.835791],[52.055489,18.840611],[52.052441,18.845091],[52.049061,18.850071],[52.045551,18.85527],[52.042881,18.859631],[52.04081,18.8634],[52.03949,18.8661],[52.038158,18.86907],[52.03714,18.8715],[52.035439,18.8759],[52.034222,18.879629],[52.033932,18.880529],[52.0327,18.88485],[52.031189,18.89113],[52.029381,18.899929],[52.02813,18.906179],[52.026958,18.911909],[52.025688,18.916809],[52.024479,18.92082],[52.02261,18.926399],[52.019821,18.93458],[52.017609,18.941151],[52.015862,18.94672],[52.014771,18.950951],[52.013149,18.95867],[52.011902,18.96446],[52.01046,18.969851],[52.008881,18.974689],[52.006538,18.98114],[52.00449,18.987221],[52.003071,18.991859],[52.001549,18.997669],[52.00045,19.002541],[51.999458,19.00773],[51.998039,19.01741],[51.99765,19.02055],[51.997459,19.02207],[51.99728,19.02351],[51.996399,19.0298],[51.995399,19.035801],[51.995022,19.03763],[51.994659,19.039221],[51.994148,19.04134],[51.99337,19.04438],[51.992531,19.047159],[51.991379,19.050579],[51.989731,19.054779],[51.98848,19.05761],[51.987129,19.0604],[51.985611,19.06324],[51.984531,19.06517],[51.97858,19.075291],[51.975769,19.08061],[51.973869,19.08461],[51.971889,19.08955],[51.970181,19.0944],[51.96793,19.10198],[51.966339,19.10762],[51.964859,19.112471],[51.96376,19.11552],[51.96101,19.12225],[51.95937,19.12607],[51.957458,19.13121],[51.95565,19.137289],[51.954498,19.142019],[51.952572,19.151661],[51.951248,19.15736],[51.94973,19.162621],[51.946812,19.171141],[51.94466,19.177509],[51.94305,19.183149],[51.941799,19.188761],[51.94101,19.193199],[51.940472,19.19698],[51.939911,19.20273],[51.93969,19.20854],[51.93964,19.214411],[51.93972,19.222719],[51.93969,19.22901],[51.93951,19.23262],[51.939289,19.235571],[51.93895,19.239189],[51.938301,19.244301],[51.937191,19.25193],[51.93644,19.25717],[51.935619,19.262699],[51.935001,19.266729],[51.934132,19.271299],[51.932522,19.278561],[51.931179,19.284679],[51.930161,19.289539],[51.92918,19.29582],[51.928619,19.301411],[51.928188,19.309851],[51.92783,19.31459],[51.927368,19.31875],[51.92696,19.321699],[51.92617,19.32612],[51.925098,19.33124],[51.924011,19.336901],[51.92337,19.34087],[51.922699,19.345881],[51.922249,19.349649],[51.922031,19.351789],[51.922001,19.35211],[51.921799,19.354139],[51.9217,19.35556],[51.921539,19.35808],[51.921391,19.360901],[51.921329,19.36195],[51.9212,19.36455],[51.921082,19.37055],[51.921101,19.375401],[51.921139,19.383471],[51.921082,19.38681],[51.920979,19.390619],[51.92075,19.393961],[51.920269,19.39966],[51.91922,19.40678],[51.918449,19.4112],[51.917461,19.41625],[51.91684,19.41865],[51.916069,19.42169],[51.912361,19.432541],[51.910278,19.43788],[51.90992,19.438749],[51.909222,19.44047],[51.90802,19.44343],[51.905972,19.44853],[51.90398,19.45363],[51.902161,19.45896],[51.901321,19.46212],[51.90086,19.464001],[51.900398,19.46608],[51.899971,19.46797],[51.89933,19.4711],[51.898151,19.47998],[51.89793,19.483231],[51.897812,19.48616],[51.89777,19.49305],[51.898151,19.51585],[51.898129,19.516371],[51.898041,19.5182],[51.897861,19.522011],[51.896622,19.536489],[51.889702,19.57382],[51.888969,19.57979],[51.88868,19.58357],[51.888618,19.585079],[51.888519,19.58819],[51.88858,19.591181],[51.888599,19.591881],[51.888729,19.594959],[51.888889,19.598301],[51.889099,19.601311],[51.88942,19.60549],[51.889549,19.60721],[51.88998,19.612881],[51.890079,19.614189],[51.890732,19.623899],[51.89077,19.62446],[51.891209,19.626949],[51.891251,19.627399],[51.891319,19.627939],[51.891418,19.62862],[51.891602,19.62936],[51.89183,19.630011],[51.89201,19.63035],[51.892159,19.63055],[51.892429,19.63093],[51.892792,19.63135],[51.893051,19.631559],[51.893471,19.6318],[51.89389,19.631929],[51.894218,19.631941],[51.894482,19.63191],[51.894711,19.63187],[51.894878,19.631781],[51.895161,19.631651],[51.89534,19.631531],[51.89547,19.631451],[51.895649,19.6313],[51.896198,19.630911],[51.89645,19.63073],[51.896679,19.63059],[51.896992,19.630381],[51.89743,19.630079],[51.898602,19.629339],[51.899212,19.628929],[51.900139,19.628349],[51.901081,19.62775],[51.90221,19.627171],[51.904461,19.62602],[51.90659,19.625019],[51.90855,19.624161],[51.910789,19.62328],[51.911888,19.62302],[51.912621,19.62285],[51.912819,19.62285],[51.913059,19.623051],[51.914322,19.625601],[51.914452,19.62591],[51.914661,19.626341],[51.9161,19.628691],[51.925201,19.644131],[51.925949,19.64506],[51.92897,19.647631],[51.93063,19.64908],[51.931019,19.649509],[51.931149,19.6497],[51.932259,19.652],[51.932751,19.65308],[51.943272,19.676041],[51.94331,19.676121],[51.94688,19.68264],[51.949989,19.68832],[51.95681,19.700911],[51.958549,19.704069],[51.9589,19.70484],[51.959049,19.705549],[51.95969,19.71069],[51.960819,19.723619],[51.96109,19.726681],[51.961231,19.728161],[51.961239,19.728291],[51.961361,19.7293],[51.961571,19.7299],[51.961811,19.7304],[51.962719,19.731529],[51.96312,19.732019],[51.963539,19.73242],[51.964809,19.733271],[51.965191,19.733509],[51.965439,19.73369],[51.965641,19.7339],[51.96574,19.73403],[51.9664,19.735121],[51.970589,19.742229],[51.973179,19.74663],[51.979118,19.75663],[51.993279,19.7805],[51.99371,19.781219],[52.001862,19.79495],[52.002369,19.79583],[52.0056,19.80126],[52.005829,19.8018],[52.006008,19.802219],[52.006229,19.802891],[52.006248,19.802971],[52.006939,19.8053],[52.00761,19.8076],[52.008629,19.811211],[52.008709,19.811489],[52.008808,19.811819],[52.0089,19.812111],[52.00927,19.81325],[52.009628,19.81402],[52.01593,19.82633],[52.023281,19.84086],[52.02507,19.84432],[52.026192,19.846519],[52.039162,19.87204],[52.039261,19.87224],[52.040749,19.87517],[52.041199,19.87606],[52.041538,19.87673],[52.042561,19.878771],[52.042839,19.87924],[52.044312,19.88221],[52.048222,19.88994],[52.04845,19.890381],[52.048969,19.89139],[52.04916,19.891769],[52.049259,19.89193],[52.04937,19.89213],[52.049419,19.892179],[52.04969,19.89249],[52.050049,19.892771],[52.050961,19.893471],[52.05225,19.89448],[52.05455,19.89625],[52.05455,19.896259],[52.059502,19.900061],[52.060539,19.90085],[52.06316,19.90287],[52.068199,19.90674],[52.068508,19.906981],[52.069099,19.907419],[52.07645,19.91301],[52.076649,19.91317],[52.0769,19.91337],[52.076969,19.913429],[52.077579,19.9139],[52.07782,19.91408],[52.07843,19.91453],[52.079029,19.91498],[52.080231,19.915899],[52.08263,19.917749],[52.083,19.91802],[52.08308,19.918079],[52.084671,19.919279],[52.08535,19.9198],[52.085579,19.919941],[52.085819,19.920059],[52.08609,19.920179],[52.086391,19.92024],[52.086731,19.920271],[52.087021,19.920231],[52.087231,19.920231],[52.087421,19.920259],[52.087471,19.920349],[52.087521,19.920389],[52.087582,19.920401],[52.08765,19.92037],[52.087688,19.920309],[52.08773,19.920231],[52.08786,19.92013],[52.088089,19.920059],[52.088181,19.92005],[52.09103,19.91968],[52.091709,19.91959],[52.092682,19.91946],[52.094219,19.919241],[52.095741,19.919029],[52.096741,19.9189],[52.09774,19.91877],[52.09972,19.918501],[52.10078,19.91835],[52.101028,19.91835],[52.101631,19.918409],[52.10215,19.91857],[52.1026,19.918779],[52.10284,19.91894],[52.103149,19.919161],[52.103401,19.91938],[52.103729,19.919701],[52.10397,19.919991],[52.104198,19.92029],[52.10445,19.920679],[52.104691,19.921129],[52.104961,19.92174],[52.105209,19.92234],[52.105961,19.924509],[52.106411,19.92577],[52.107052,19.92757],[52.107109,19.927719],[52.107231,19.928011],[52.107349,19.928221],[52.10754,19.928579],[52.107731,19.92885],[52.107929,19.929119],[52.108089,19.929279],[52.108452,19.929609],[52.10873,19.929819],[52.109039,19.929991],[52.109371,19.93012],[52.109699,19.930189],[52.111229,19.93025],[52.111641,19.930269],[52.11277,19.930321],[52.112801,19.930321],[52.114609,19.930401],[52.116451,19.93051],[52.116501,19.930519],[52.117069,19.93054],[52.11721,19.930559],[52.117699,19.930639],[52.117962,19.93071],[52.118198,19.93082],[52.118259,19.930849],[52.118629,19.931061],[52.1189,19.93124],[52.119511,19.93181],[52.119598,19.93195],[52.11964,19.93211],[52.119652,19.93228],[52.11964,19.932501],[52.11948,19.93355],[52.1194,19.934561],[52.11937,19.934799],[52.119209,19.9359],[52.11879,19.938721],[52.11866,19.939581],[52.118591,19.94043],[52.118462,19.943199],[52.11832,19.94618],[52.118279,19.947439],[52.118191,19.94982],[52.118069,19.952339],[52.118,19.95396],[52.117882,19.95689],[52.11755,19.96439],[52.117512,19.965401],[52.117512,19.96545],[52.117512,19.9655],[52.117458,19.966459],[52.11742,19.967331],[52.117371,19.968451],[52.117241,19.971201],[52.11721,19.97176],[52.11705,19.974291],[52.11705,19.974951],[52.117062,19.97537],[52.117069,19.97596],[52.11718,19.976419],[52.118179,19.980631],[52.12101,19.99221],[52.12315,20.00086],[52.124432,20.006109],[52.125622,20.010969],[52.125771,20.0116],[52.128719,20.02354],[52.13121,20.03376],[52.137619,20.05954],[52.137859,20.06052],[52.140442,20.07085],[52.14724,20.097931],[52.14912,20.105459],[52.150661,20.111549],[52.151909,20.11652],[52.15295,20.120399],[52.153191,20.12104],[52.153542,20.121799],[52.154518,20.12351],[52.155048,20.12418],[52.15556,20.12472],[52.156071,20.125191],[52.163651,20.130739],[52.16431,20.131229],[52.169559,20.13509],[52.17205,20.136921],[52.18475,20.14629],[52.185478,20.146959],[52.18557,20.147079],[52.186081,20.147791],[52.190811,20.155861],[52.195271,20.163349],[52.199051,20.169781],[52.20237,20.17544],[52.203159,20.176781],[52.21146,20.19092],[52.215248,20.197371],[52.217178,20.20079],[52.2178,20.20186],[52.218819,20.203791],[52.21891,20.204121],[52.218868,20.20435],[52.218529,20.2052],[52.21241,20.216709],[52.21188,20.21773],[52.211472,20.218559],[52.211281,20.21888],[52.210812,20.2201],[52.210548,20.22089],[52.210312,20.221519],[52.20911,20.22497],[52.20903,20.22521],[52.207981,20.228109],[52.206749,20.23156],[52.20615,20.23431],[52.206039,20.235769],[52.20602,20.237249],[52.206169,20.23875],[52.206409,20.240061],[52.20697,20.2428],[52.207569,20.24559],[52.207909,20.246861],[52.20834,20.248211],[52.20892,20.249411],[52.209549,20.250441],[52.20974,20.250799],[52.209721,20.250919],[52.20974,20.25104],[52.209789,20.251129],[52.209862,20.251181],[52.20993,20.251181],[52.209969,20.25116],[52.21006,20.2512],[52.210258,20.25141],[52.210758,20.251921],[52.210999,20.252069],[52.212631,20.253281],[52.214298,20.254391],[52.223068,20.26042],[52.22393,20.26133],[52.224411,20.26195],[52.224731,20.26248],[52.225361,20.2637],[52.22538,20.263929],[52.225479,20.264299],[52.225689,20.26482],[52.226009,20.265989],[52.226021,20.26605],[52.226261,20.267429],[52.226398,20.267891],[52.226471,20.26993],[52.226421,20.270821],[52.225651,20.27956],[52.22266,20.312559],[52.220852,20.33256],[52.220421,20.33741],[52.220032,20.34166],[52.219318,20.349609],[52.218319,20.36063],[52.217331,20.371441],[52.21656,20.37977],[52.215939,20.38644],[52.21373,20.41028],[52.2132,20.416161],[52.21209,20.42832],[52.211891,20.430229],[52.2117,20.432301],[52.209419,20.45714],[52.208721,20.46471],[52.206589,20.488091],[52.205059,20.50466],[52.20435,20.512369],[52.204269,20.51329],[52.202881,20.52837],[52.201641,20.54178],[52.201469,20.54582],[52.20039,20.571939],[52.199059,20.60359],[52.19899,20.60586],[52.19899,20.605989],[52.198978,20.60627],[52.198841,20.60903],[52.198799,20.610081],[52.198711,20.612419],[52.198582,20.61577],[52.198528,20.616989],[52.198528,20.61718],[52.198502,20.6178],[52.199001,20.61994],[52.19936,20.62149],[52.19968,20.62286],[52.199902,20.62373],[52.199982,20.62405],[52.200249,20.62512],[52.20163,20.6308],[52.20644,20.650591],[52.207199,20.653879],[52.207699,20.656031],[52.207859,20.656719],[52.208321,20.659109],[52.208889,20.66353],[52.208988,20.66445],[52.21006,20.673531],[52.2113,20.68404],[52.21133,20.684271],[52.211842,20.688919],[52.212139,20.691401],[52.21273,20.69622],[52.212811,20.701071],[52.2118,20.74048],[52.21143,20.75633],[52.211239,20.7649],[52.211151,20.76845],[52.211121,20.769911],[52.21088,20.778219],[52.210678,20.78578],[52.210579,20.788231],[52.21056,20.788971],[52.21051,20.791401],[52.210468,20.793091],[52.210419,20.794769],[52.210381,20.79623],[52.210331,20.797279],[52.210232,20.801121],[52.21014,20.804319],[52.210041,20.80776],[52.209999,20.809271],[52.209999,20.80971],[52.21003,20.81019],[52.210091,20.81061],[52.210178,20.81123],[52.211182,20.817699],[52.21244,20.82584],[52.212551,20.826891],[52.2131,20.83094],[52.213821,20.835529],[52.214272,20.83843],[52.214321,20.838869],[52.214359,20.839069],[52.214451,20.83972],[52.214741,20.841749],[52.21489,20.843809],[52.21524,20.84981],[52.215832,20.859699],[52.215839,20.85993],[52.2159,20.861],[52.215961,20.861971],[52.216,20.8626],[52.216141,20.86487],[52.216148,20.86503],[52.21632,20.86783],[52.216351,20.86927],[52.21637,20.871429],[52.216381,20.873899],[52.216389,20.874929],[52.216381,20.877769],[52.216381,20.880011],[52.21637,20.88043],[52.216381,20.885969],[52.216389,20.8887],[52.216381,20.89061],[52.216358,20.89253],[52.21637,20.89607],[52.216389,20.896629],[52.216431,20.89715],[52.21648,20.89769],[52.216572,20.89847],[52.21677,20.90044],[52.216808,20.90089],[52.216869,20.90147],[52.21693,20.90193],[52.217159,20.904011],[52.217209,20.90428],[52.217579,20.906019],[52.218021,20.90799],[52.218342,20.90933],[52.218399,20.90958],[52.218559,20.910271],[52.219501,20.914419],[52.219879,20.91584],[52.219921,20.91605],[52.219971,20.91625],[52.220039,20.91663],[52.220539,20.91868],[52.221008,20.92062],[52.221161,20.921289],[52.22171,20.92355],[52.221939,20.92453],[52.22208,20.925131],[52.2225,20.926991],[52.222778,20.9282],[52.22319,20.929831],[52.22324,20.930031],[52.223289,20.93021],[52.223671,20.93152],[52.223881,20.93219],[52.224041,20.932739],[52.224998,20.93623],[52.22514,20.93675],[52.225189,20.93696],[52.22562,20.93853],[52.225719,20.939369],[52.225761,20.939659],[52.225788,20.940701],[52.225868,20.941589],[52.22588,20.94166],[52.225929,20.94198],[52.226311,20.94463],[52.226921,20.948071],[52.22739,20.951281],[52.227451,20.95166],[52.227482,20.95199],[52.227638,20.95425],[52.22773,20.95582],[52.22773,20.956141],[52.227692,20.956659],[52.227692,20.95694],[52.227539,20.95694],[52.226009,20.95731],[52.225349,20.957581],[52.2243,20.957781],[52.22422,20.957821],[52.22353,20.957991],[52.22324,20.95809],[52.22245,20.95833],[52.222252,20.95842],[52.222012,20.95859],[52.22086,20.95952],[52.220581,20.95965],[52.22002,20.95978],[52.21814,20.959909],[52.217659,20.95998],[52.216461,20.9606],[52.216331,20.96073],[52.21619,20.96109],[52.216179,20.961399],[52.216221,20.96166],[52.216572,20.962601],[52.21703,20.963711],[52.21759,20.96524],[52.219391,20.970369],[52.219479,20.97084],[52.219479,20.971251],[52.219471,20.971371],[52.21946,20.97147],[52.218948,20.972969],[52.218861,20.973249],[52.21875,20.973551],[52.217621,20.976971],[52.217541,20.977221],[52.217461,20.977461],[52.2164,20.980619],[52.216301,20.980909],[52.21624,20.98107],[52.216228,20.9811],[52.216179,20.981239],[52.21611,20.981449],[52.216042,20.981649],[52.215981,20.981911],[52.215961,20.982149],[52.215969,20.98246],[52.215981,20.982679],[52.216042,20.983801],[52.216061,20.9842],[52.216091,20.98497],[52.216221,20.987],[52.216228,20.98728],[52.216221,20.987591],[52.216209,20.98782],[52.21619,20.98806],[52.216179,20.98838],[52.216179,20.98884],[52.216259,20.989929],[52.21627,20.990259],[52.21632,20.99095],[52.216511,20.99444],[52.216801,20.999901],[52.21682,21.000429],[52.217121,21.004539],[52.21719,21.00563],[52.21727,21.00716],[52.217281,21.00845],[52.217209,21.01022],[52.217159,21.01169],[52.216999,21.01438],[52.216999,21.0149],[52.21703,21.015421],[52.217079,21.01594],[52.217171,21.01647],[52.217449,21.0177],[52.21759,21.01844],[52.21767,21.018801],[52.217861,21.019581],[52.21793,21.01984],[52.218399,21.021761],[52.219059,21.024469],[52.219372,21.02578],[52.219742,21.027309],[52.21994,21.0282],[52.220669,21.03112],[52.221458,21.034109],[52.222229,21.037251],[52.22266,21.03857],[52.223,21.03944],[52.223148,21.039841],[52.223301,21.040211],[52.223511,21.040739],[52.223701,21.04143],[52.223789,21.04184],[52.22403,21.0431],[52.22443,21.045059],[52.225712,21.05121],[52.22612,21.053249],[52.226509,21.055201],[52.22686,21.056789],[52.2271,21.057699],[52.228149,21.061621],[52.228378,21.06255],[52.228901,21.06455],[52.229111,21.065319],[52.229401,21.0665],[52.229889,21.06831],[52.23035,21.07052],[52.230652,21.07151],[52.230831,21.07196],[52.23233,21.074381],[52.233021,21.07556],[52.235081,21.078911],[52.235271,21.079479],[52.235401,21.0802],[52.23547,21.080629],[52.235531,21.081091],[52.235661,21.08217],[52.235889,21.08399],[52.236061,21.08552],[52.236099,21.08663],[52.236099,21.08683],[52.236038,21.087641],[52.235958,21.088421],[52.235771,21.089439],[52.2351,21.093491],[52.234951,21.09482],[52.234871,21.095501],[52.23468,21.097151],[52.234661,21.09741],[52.234631,21.097679],[52.23444,21.099489],[52.23436,21.10021],[52.2342,21.101629],[52.233971,21.10355],[52.23386,21.10463],[52.233768,21.10532],[52.233459,21.10816],[52.233349,21.109051],[52.233059,21.111691],[52.232899,21.113239],[52.232861,21.11352],[52.232681,21.115021],[52.232571,21.116529],[52.232521,21.118191],[52.232521,21.11837],[52.23251,21.118799],[52.232571,21.12027],[52.23259,21.121389],[52.232601,21.12254],[52.23262,21.12421],[52.232639,21.125429],[52.232639,21.126711],[52.232658,21.12788],[52.232651,21.12854],[52.232639,21.129089],[52.232559,21.12974],[52.23243,21.130461],[52.23225,21.131069],[52.23201,21.13171],[52.231602,21.13269],[52.230782,21.134729],[52.23003,21.136499],[52.22971,21.137251],[52.22934,21.138109],[52.22908,21.138691],[52.228691,21.13958],[52.2286,21.139799],[52.228352,21.140369],[52.228039,21.14101],[52.22784,21.14147],[52.227188,21.142929],[52.226871,21.143669],[52.226669,21.14419],[52.226551,21.144661],[52.22644,21.145149],[52.226372,21.14566],[52.226341,21.146231],[52.22628,21.148359],[52.22628,21.14887],[52.226231,21.14978],[52.226181,21.15131],[52.226158,21.152491],[52.22612,21.15346],[52.226101,21.153851],[52.226059,21.15535],[52.225922,21.158939],[52.225891,21.15937],[52.225819,21.161421],[52.225689,21.165609],[52.22551,21.17029],[52.225189,21.17864],[52.224819,21.18928],[52.224529,21.196859],[52.224491,21.198009],[52.22427,21.20554],[52.224072,21.21101],[52.223911,21.21578],[52.223782,21.219891],[52.22369,21.22279],[52.223679,21.22303],[52.223671,21.223289],[52.223629,21.22451],[52.223469,21.229271],[52.223381,21.230721],[52.223301,21.23295],[52.223259,21.23402],[52.22324,21.235041],[52.223179,21.23679],[52.22316,21.237249],[52.223049,21.23951],[52.22303,21.240021],[52.22295,21.243151],[52.222832,21.24703],[52.22274,21.24946],[52.22271,21.24983],[52.222691,21.249929],[52.222679,21.25062],[52.222511,21.255859],[52.222351,21.26104],[52.222309,21.26218],[52.22221,21.26466],[52.222179,21.26539],[52.222149,21.266211],[52.22208,21.267851],[52.22205,21.26918],[52.222038,21.26963],[52.222031,21.26977],[52.222,21.27087],[52.221771,21.277281],[52.2215,21.284731],[52.221481,21.28517],[52.221371,21.287571],[52.221321,21.288719],[52.22113,21.2906],[52.220459,21.293631],[52.219471,21.298019],[52.218601,21.301941],[52.21851,21.302389],[52.21767,21.306379],[52.216961,21.30962],[52.216648,21.311029],[52.215851,21.314739],[52.215611,21.315929],[52.215149,21.3183],[52.213772,21.32457],[52.21249,21.33049],[52.21233,21.331261],[52.211109,21.337],[52.210251,21.34096],[52.209511,21.34437],[52.207809,21.35216],[52.206211,21.35932],[52.20467,21.366529],[52.203072,21.374001],[52.202629,21.377239],[52.202209,21.380011],[52.202202,21.380091],[52.201889,21.38555],[52.201691,21.389219],[52.201439,21.3937],[52.201118,21.401541],[52.200611,21.410839],[52.200291,21.41663],[52.200119,21.42065],[52.199989,21.42417],[52.19978,21.427259],[52.199459,21.43342],[52.19923,21.43766],[52.199169,21.439381],[52.1992,21.44058],[52.1992,21.44236],[52.19923,21.443769],[52.199299,21.446381],[52.199429,21.44973],[52.199451,21.450439],[52.19952,21.452971],[52.19965,21.45809],[52.199871,21.46624],[52.20023,21.475121],[52.20052,21.484421],[52.20063,21.48831],[52.200581,21.490219],[52.200359,21.492001],[52.19994,21.49367],[52.198551,21.49864],[52.19664,21.505899],[52.194981,21.51228],[52.193371,21.51828],[52.192188,21.522989],[52.19175,21.52454],[52.190979,21.527349],[52.190819,21.527321],[52.190689,21.52746],[52.19062,21.527731],[52.19067,21.527941],[52.1908,21.528099],[52.190659,21.52861],[52.190048,21.530781],[52.18895,21.534809],[52.188709,21.53578],[52.188171,21.537849],[52.187778,21.539431],[52.18734,21.540939],[52.187061,21.54196],[52.18692,21.54249],[52.186329,21.544649],[52.18631,21.54475],[52.185612,21.54744],[52.185341,21.54867],[52.18454,21.55163],[52.184219,21.55286],[52.18388,21.55415],[52.183281,21.556311],[52.182911,21.55773],[52.182652,21.55871],[52.18248,21.55938],[52.181751,21.56234],[52.181149,21.564791],[52.18074,21.566441],[52.180698,21.56658],[52.180592,21.566999],[52.18029,21.568159],[52.179909,21.5697],[52.179588,21.571011],[52.179539,21.571159],[52.179329,21.57198],[52.179031,21.57312],[52.17873,21.574301],[52.178398,21.575541],[52.178059,21.57678],[52.178082,21.577339],[52.178169,21.580919],[52.178242,21.58276],[52.178291,21.58411],[52.178299,21.58423],[52.178421,21.589001],[52.178619,21.59437],[52.178791,21.59881],[52.17915,21.609301],[52.17923,21.611561],[52.179581,21.62187],[52.17976,21.626841],[52.18013,21.629681],[52.180229,21.630461],[52.182049,21.644159],[52.183769,21.64847],[52.184509,21.65386],[52.188019,21.68083],[52.192032,21.710409],[52.192532,21.723101],[52.195358,21.743959],[52.20295,21.80003],[52.203152,21.80052],[52.20396,21.802349],[52.206169,21.80718],[52.206692,21.808411],[52.208061,21.81164],[52.208801,21.813181],[52.209278,21.81419],[52.209461,21.81456],[52.210251,21.816771],[52.2104,21.81769],[52.210442,21.820499],[52.210419,21.82181],[52.210251,21.832239],[52.209831,21.861191],[52.209389,21.886351],[52.20929,21.89757],[52.208271,21.907749],[52.20443,21.94763],[52.203869,21.953699],[52.20055,21.98842],[52.197842,22.01725],[52.196651,22.0296],[52.196602,22.0301],[52.195881,22.03702],[52.19558,22.04031],[52.195709,22.042641],[52.197639,22.05447],[52.197762,22.055639],[52.197701,22.05674],[52.197571,22.057659],[52.196949,22.06188],[52.196949,22.061899],[52.19656,22.06428],[52.195641,22.069839],[52.19046,22.100559],[52.18803,22.11499],[52.187031,22.12093],[52.186642,22.123289],[52.184971,22.13299],[52.183868,22.140181],[52.18354,22.14233],[52.18045,22.16251],[52.18042,22.16272],[52.179218,22.170521],[52.178082,22.17807],[52.177551,22.18157],[52.17654,22.188499],[52.176029,22.191971],[52.175301,22.19693],[52.1745,22.202379],[52.173512,22.20912],[52.173241,22.21105],[52.172321,22.217211],[52.172031,22.21862],[52.171841,22.219561],[52.171371,22.221001],[52.171101,22.221569],[52.1707,22.2222],[52.170269,22.222759],[52.169971,22.223061],[52.169651,22.22337],[52.168919,22.223761],[52.16806,22.22397],[52.157452,22.223801],[52.149818,22.223669],[52.149181,22.223841],[52.148411,22.22414],[52.14703,22.225031],[52.145828,22.22603],[52.145191,22.226721],[52.14463,22.22753],[52.14407,22.228821],[52.143768,22.22994],[52.143559,22.23114],[52.143471,22.232981],[52.14365,22.236931],[52.14365,22.24024],[52.14352,22.242979],[52.143341,22.245081],[52.1427,22.24972],[52.14188,22.254181],[52.14146,22.256161],[52.141121,22.25769],[52.1409,22.25869],[52.14072,22.259331],[52.140381,22.26058],[52.13974,22.26259],[52.138321,22.266199],[52.137569,22.26819],[52.137032,22.26984],[52.136089,22.273109],[52.13562,22.275169],[52.13472,22.28014],[52.1339,22.284821],[52.133598,22.28676],[52.132912,22.29147],[52.13261,22.29401],[52.132191,22.29804],[52.131882,22.302031],[52.13163,22.307911],[52.13158,22.309839],[52.13158,22.315981],[52.131672,22.318979],[52.131882,22.323021],[52.132011,22.325979],[52.132011,22.327101],[52.131931,22.328251],[52.131882,22.328659],[52.131802,22.329201],[52.131672,22.32984],[52.131241,22.331301],[52.130268,22.33366],[52.1297,22.335079],[52.128479,22.338051],[52.1273,22.34091],[52.12524,22.34581],[52.124432,22.34767],[52.122318,22.35253],[52.122181,22.352859],[52.120171,22.35787],[52.11734,22.364731],[52.114368,22.371731],[52.112019,22.377439],[52.108501,22.385799],[52.105831,22.3922],[52.103809,22.39706],[52.102531,22.400141],[52.09618,22.415409],[52.0909,22.42794],[52.090092,22.43022],[52.08979,22.432711],[52.089741,22.43593],[52.089531,22.43782],[52.08934,22.4384],[52.08786,22.44297],[52.086208,22.45097],[52.08498,22.457041],[52.08387,22.46246],[52.083172,22.466141],[52.08202,22.476231],[52.081631,22.479191],[52.08065,22.482149],[52.0779,22.48863],[52.076649,22.49193],[52.074421,22.5],[52.072891,22.505619],[52.071678,22.51009],[52.06942,22.51827],[52.069012,22.51996],[52.06884,22.5236],[52.068878,22.526569],[52.068501,22.5291],[52.066872,22.534929],[52.06464,22.5427],[52.06356,22.54652],[52.063011,22.550079],[52.062531,22.55407],[52.061378,22.563471],[52.059921,22.57184],[52.059441,22.574579],[52.057259,22.58708],[52.057041,22.589569],[52.056999,22.591801],[52.057301,22.59729],[52.057678,22.608959],[52.05785,22.614059],[52.057991,22.618019],[52.058109,22.622311],[52.05743,22.62789],[52.055672,22.63789],[52.053139,22.652349],[52.050991,22.664709],[52.050049,22.67042],[52.049622,22.67214],[52.048592,22.67454],[52.045151,22.68055],[52.039101,22.691231],[52.03442,22.699511],[52.029881,22.707371],[52.02383,22.71763],[52.019051,22.72547],[52.015331,22.73226],[52.007431,22.74612],[52.0047,22.75083],[52.00449,22.75119],[52.004169,22.75172],[52.003368,22.753139],[52.002972,22.75382],[52.00243,22.75474],[52.001228,22.756901],[52.00069,22.75861],[52.000469,22.759689],[52.000408,22.76021],[52.000332,22.76083],[52.000301,22.763399],[52.00029,22.764009],[52.00029,22.76417],[52.00029,22.76475],[52.000259,22.766911],[52.000271,22.767811],[52.00029,22.7693],[52.000271,22.77309],[52.000092,22.78389],[51.999699,22.81146],[51.999771,22.813219],[51.999809,22.813709],[51.999969,22.814501],[52.000389,22.815821],[52.001049,22.817221],[52.002491,22.819941],[52.019131,22.850771],[52.02018,22.85272],[52.026829,22.86499],[52.027561,22.86714],[52.027748,22.86878],[52.02803,22.87328],[52.02816,22.876579],[52.028591,22.880751],[52.034531,22.91885],[52.036671,22.9328],[52.038502,22.94478],[52.038651,22.94701],[52.03661,22.99505],[52.034679,23.03936],[52.034382,23.04616],[52.033852,23.060539],[52.033821,23.06105],[52.033779,23.061331],[52.033741,23.06406],[52.033779,23.06502],[52.033932,23.066481],[52.03397,23.06702],[52.034039,23.06745],[52.03413,23.068199],[52.034382,23.069441],[52.034851,23.07103],[52.035332,23.072411],[52.035728,23.073481],[52.035858,23.07374],[52.035912,23.07374],[52.037621,23.077749],[52.038502,23.07987],[52.042339,23.08906],[52.045219,23.09586],[52.047531,23.10133],[52.049171,23.10528],[52.049759,23.107201],[52.05061,23.10993],[52.05101,23.11146],[52.05143,23.1134],[52.051769,23.115351],[52.052139,23.118019],[52.05233,23.120081],[52.052441,23.12163],[52.05254,23.1243],[52.05249,23.126431],[52.05241,23.128111],[52.05225,23.13044],[52.052052,23.132139],[52.051689,23.134399],[52.05138,23.136129],[52.051079,23.137541],[52.05014,23.14085],[52.049431,23.14304],[52.046921,23.149401],[52.046329,23.150881],[52.046249,23.151091],[52.041649,23.16205],[52.04108,23.16349],[52.040989,23.163771],[52.040878,23.16407],[52.040722,23.16494],[52.040668,23.165991],[52.040699,23.166901],[52.040852,23.16884],[52.04092,23.17067],[52.040909,23.170799],[52.040352,23.17984],[52.040001,23.184799],[52.039848,23.18705],[52.03894,23.19945],[52.038151,23.211281],[52.037041,23.226919],[52.036201,23.23984],[52.035629,23.247259],[52.035198,23.254669],[52.034111,23.268709],[52.034019,23.270809],[52.0341,23.278021],[52.034279,23.285179],[52.03437,23.289591],[52.034679,23.30765],[52.03487,23.319969],[52.03503,23.33103],[52.035431,23.352261],[52.035568,23.36269],[52.035751,23.37554],[52.036121,23.39966],[52.03648,23.423731],[52.03669,23.44198],[52.037102,23.471069],[52.056198,23.47821],[52.057281,23.479031],[52.062019,23.48612],[52.06966,23.497549],[52.07505,23.50531],[52.074341,23.506451],[52.074478,23.507071],[52.075321,23.508471],[52.076199,23.51207],[52.077019,23.517269],[52.078541,23.523121],[52.079208,23.52372],[52.080021,23.527479],[52.080372,23.52845],[52.080971,23.52993],[52.08247,23.531771],[52.097488,23.550831],[52.100391,23.55324],[52.115749,23.565399],[52.116249,23.565861],[52.116879,23.566429],[52.119869,23.56897],[52.12009,23.569189],[52.121159,23.570431],[52.1236,23.573311],[52.123859,23.57374],[52.124371,23.57469],[52.124889,23.57572],[52.125641,23.577629],[52.12632,23.580099],[52.128811,23.59057],[52.135269,23.61853],[52.136452,23.62384],[52.137909,23.62999],[52.139091,23.63512],[52.140079,23.63932],[52.143768,23.6551],[52.148842,23.67742],[52.150139,23.68292],[52.15052,23.68453],[52.15115,23.687281],[52.151402,23.68865],[52.151531,23.68964],[52.151569,23.69029],[52.151539,23.6905],[52.151482,23.69071],[52.151371,23.69096],[52.151291,23.69117],[52.151199,23.691401],[52.15115,23.69166],[52.15118,23.69203],[52.15126,23.69227],[52.151371,23.69243],[52.15147,23.69253],[52.151539,23.69256],[52.151619,23.692869],[52.151661,23.69306],[52.151661,23.693319],[52.151409,23.69803],[52.15023,23.716619],[52.149399,23.72999],[52.149052,23.73517],[52.148842,23.736971],[52.148689,23.73807],[52.14843,23.739651],[52.147911,23.741989],[52.14674,23.74641],[52.145618,23.750441],[52.14502,23.75275],[52.143379,23.758739],[52.140732,23.768591],[52.13792,23.778919],[52.134338,23.792219],[52.133091,23.796761],[52.13205,23.80051],[52.131889,23.80109],[52.131039,23.803761],[52.13002,23.807489],[52.12822,23.81422],[52.127369,23.81785],[52.125999,23.823071],[52.125622,23.824289],[52.125111,23.82625],[52.124451,23.82873],[52.123501,23.83223],[52.122688,23.83518],[52.119701,23.846319],[52.119282,23.84778],[52.11903,23.84841],[52.118832,23.848749],[52.11869,23.84897],[52.118542,23.84914],[52.117519,23.849951],[52.115879,23.85117],[52.1157,23.85137],[52.11554,23.85165],[52.115459,23.85203],[52.11549,23.852341],[52.11557,23.852631],[52.115791,23.85289],[52.116161,23.85309],[52.11647,23.85318],[52.116699,23.85335],[52.116909,23.853609],[52.11705,23.85391],[52.117249,23.85433],[52.117489,23.85548],[52.118221,23.859249],[52.119019,23.863449],[52.120411,23.870689],[52.122372,23.880699],[52.123039,23.88419],[52.12328,23.88542],[52.123749,23.887831],[52.124321,23.89076],[52.124779,23.893221],[52.125229,23.895611],[52.125561,23.897301],[52.126678,23.902849],[52.127029,23.904711],[52.128262,23.91103],[52.129269,23.91626],[52.132622,23.933611],[52.13448,23.94289],[52.136089,23.951241],[52.136509,23.953409],[52.142052,23.98245],[52.146332,24.00466],[52.150719,24.02721],[52.15287,24.038589],[52.153019,24.03994],[52.153469,24.04154],[52.156288,24.056391],[52.156681,24.058439],[52.161079,24.08123],[52.162399,24.089331],[52.174301,24.15033],[52.17466,24.152189],[52.174889,24.153469],[52.175442,24.15617],[52.18956,24.230101],[52.196079,24.264339],[52.199089,24.28031],[52.19923,24.281],[52.19944,24.282619],[52.199551,24.28367],[52.199581,24.284281],[52.199612,24.284599],[52.19965,24.28643],[52.199619,24.288059],[52.19957,24.28903],[52.199471,24.290131],[52.19928,24.291771],[52.199009,24.293159],[52.198792,24.29434],[52.198509,24.29549],[52.197891,24.297371],[52.197289,24.29891],[52.196892,24.29986],[52.196411,24.300791],[52.195591,24.302271],[52.188881,24.313999],[52.183769,24.323021],[52.183262,24.324051],[52.182659,24.32563],[52.181591,24.328341],[52.181141,24.32947],[52.179619,24.33334],[52.178951,24.33515],[52.178391,24.337999],[52.178268,24.339239],[52.17823,24.340731],[52.17831,24.34374],[52.179089,24.34906],[52.183552,24.378071],[52.183861,24.38007],[52.18441,24.38382],[52.18655,24.39747],[52.186989,24.399099],[52.187328,24.400299],[52.187931,24.40176],[52.18853,24.40288],[52.189732,24.40468],[52.20063,24.41729],[52.20261,24.4191],[52.204411,24.42038],[52.206039,24.42116],[52.211021,24.422621],[52.212681,24.42293],[52.214001,24.42318],[52.215591,24.42333],[52.217979,24.423161],[52.2192,24.42297],[52.22105,24.422831],[52.222321,24.42293],[52.22385,24.423321],[52.225868,24.42404],[52.228271,24.425619],[52.230419,24.427509],[52.231529,24.428801],[52.232738,24.430429],[52.233681,24.43189],[52.235142,24.434719],[52.23634,24.437719],[52.241661,24.452061],[52.242008,24.453091],[52.253422,24.4839],[52.26458,24.51351],[52.268871,24.525961],[52.269901,24.529051],[52.271702,24.53377],[52.28355,24.560369],[52.285519,24.564409],[52.287491,24.567841],[52.292042,24.574789],[52.306461,24.59617],[52.30748,24.59763],[52.30904,24.599939],[52.319759,24.616079],[52.32431,24.622601],[52.330669,24.632299],[52.33255,24.635481],[52.335209,24.64028],[52.337109,24.64397],[52.342079,24.654699],[52.343632,24.65839],[52.345772,24.66363],[52.349812,24.673929],[52.350559,24.676041],[52.35154,24.67881],[52.353062,24.68375],[52.354408,24.688789],[52.357021,24.69972],[52.35873,24.707319],[52.362679,24.72423],[52.363628,24.72757],[52.364658,24.730659],[52.367229,24.736759],[52.368778,24.739759],[52.373501,24.74791],[52.38131,24.761391],[52.383621,24.765249],[52.388451,24.773621],[52.38855,24.77379],[52.39101,24.77809],[52.393539,24.78227],[52.3965,24.78685],[52.41954,24.822229],[52.422569,24.827021],[52.424461,24.830351],[52.426479,24.834499],[52.427849,24.83754],[52.429131,24.840481],[52.430511,24.84441],[52.4314,24.8477],[52.441212,24.883829],[52.44294,24.88942],[52.443958,24.89241],[52.445389,24.896049],[52.44688,24.89949],[52.448021,24.90184],[52.449162,24.904119],[52.451,24.907551],[52.453011,24.910851],[52.455921,24.9151],[52.461411,24.922119],[52.467789,24.93049],[52.470421,24.934071],[52.473919,24.93903],[52.476212,24.942381],[52.479328,24.947491],[52.482948,24.95442],[52.48391,24.956329],[52.48698,24.96279],[52.48798,24.964991],[52.48925,24.967751],[52.490189,24.96986],[52.492401,24.97484],[52.492649,24.975401],[52.49403,24.978621],[52.49469,24.980169],[52.496922,24.98489],[52.498718,24.988501],[52.519588,25.0278],[52.520592,25.02973],[52.521301,25.031099],[52.52507,25.03837],[52.527649,25.04274],[52.52961,25.0455],[52.53075,25.046949],[52.53273,25.04933],[52.534431,25.051411],[52.5364,25.053301],[52.539749,25.056129],[52.541809,25.05759],[52.545658,25.059971],[52.547218,25.06094],[52.54744,25.061069],[52.549191,25.062229],[52.55151,25.064199],[52.551819,25.064489],[52.553219,25.06583],[52.553829,25.066351],[52.555779,25.068609],[52.558262,25.0716],[52.560169,25.07407],[52.561642,25.076389],[52.563782,25.07999],[52.56601,25.084459],[52.567131,25.08695],[52.568508,25.090639],[52.572731,25.10277],[52.57513,25.109541],[52.57803,25.11776],[52.579449,25.12146],[52.580349,25.1236],[52.582748,25.128571],[52.585499,25.1339],[52.587391,25.13707],[52.603531,25.16132],[52.60696,25.16728],[52.619831,25.19175],[52.62933,25.20981],[52.638729,25.2279],[52.642921,25.235781],[52.646118,25.24214],[52.648548,25.247339],[52.650021,25.250879],[52.65147,25.254431],[52.655708,25.26573],[52.657131,25.26956],[52.663799,25.28743],[52.670471,25.305389],[52.67519,25.317829],[52.676392,25.32058],[52.677589,25.323071],[52.678539,25.324949],[52.685322,25.33684],[52.686031,25.338091],[52.686932,25.33967],[52.690979,25.34693],[52.694809,25.35368],[52.696079,25.356079],[52.69733,25.35858],[52.698761,25.36157],[52.6996,25.363581],[52.701019,25.366541],[52.701279,25.3671],[52.705292,25.375839],[52.7066,25.37879],[52.70787,25.38176],[52.708672,25.383801],[52.709251,25.385441],[52.709419,25.38592],[52.709709,25.38682],[52.710079,25.388],[52.711231,25.392071],[52.716991,25.4137],[52.7183,25.418739],[52.720131,25.42551],[52.721111,25.428499],[52.739941,25.479],[52.741951,25.48362],[52.744061,25.487761],[52.746841,25.49316],[52.751289,25.501659],[52.755569,25.509899],[52.759911,25.518129],[52.764179,25.526369],[52.766369,25.530569],[52.768459,25.534611],[52.771091,25.53908],[52.77211,25.540621],[52.774021,25.54327],[52.775429,25.545059],[52.776859,25.546721],[52.779099,25.549101],[52.782619,25.552271],[52.783932,25.5534],[52.792992,25.56155],[52.80965,25.57682],[52.814861,25.581841],[52.819981,25.586889],[52.82056,25.58742],[52.823421,25.59034],[52.82497,25.59215],[52.82642,25.59403],[52.827709,25.59584],[52.829689,25.59893],[52.831699,25.6026],[52.848228,25.63558],[52.84856,25.636141],[52.851398,25.64073],[52.85294,25.64296],[52.854359,25.64463],[52.85601,25.64657],[52.856602,25.647209],[52.85952,25.65036],[52.862049,25.652399],[52.86385,25.65369],[52.87775,25.66201],[52.87981,25.66321],[52.909302,25.680429],[52.915451,25.684071],[52.91869,25.686131],[52.92049,25.68742],[52.922901,25.68939],[52.924961,25.69128],[52.942982,25.70956],[52.96899,25.73591],[52.97192,25.73875],[52.972931,25.73988],[52.974899,25.741449],[52.977322,25.743719],[52.979759,25.74596],[52.99173,25.756599],[52.995258,25.760201],[53.016541,25.78355],[53.019798,25.787149],[53.022121,25.7899],[53.023918,25.792471],[53.025719,25.795219],[53.027699,25.798651],[53.0289,25.80097],[53.03817,25.820801],[53.04126,25.827749],[53.04269,25.8312],[53.046341,25.83993],[53.048012,25.843889],[53.050179,25.84898],[53.05201,25.85334],[53.052311,25.85404],[53.05312,25.85597],[53.053879,25.857531],[53.05418,25.85813],[53.05508,25.85981],[53.055511,25.86055],[53.055969,25.861361],[53.057049,25.86311],[53.05798,25.8645],[53.058998,25.865959],[53.062111,25.870159],[53.065109,25.8743],[53.066399,25.87586],[53.067471,25.877171],[53.068508,25.878229],[53.07008,25.87978],[53.071529,25.88101],[53.072281,25.88184],[53.073898,25.88307],[53.075279,25.88385],[53.077129,25.88483],[53.079182,25.88578],[53.080479,25.8862],[53.083389,25.88695],[53.085979,25.8874],[53.087601,25.88747],[53.089241,25.8874],[53.09404,25.886721],[53.0961,25.886629],[53.096451,25.886629],[53.09988,25.88706],[53.102112,25.887569],[53.103748,25.88818],[53.105808,25.88912],[53.108028,25.89032],[53.112411,25.89315],[53.115761,25.895639],[53.119362,25.898821],[53.121681,25.90131],[53.123829,25.903879],[53.126228,25.907141],[53.132069,25.916241],[53.13332,25.918301],[53.13414,25.91993],[53.134918,25.92161],[53.135571,25.92318],[53.1362,25.92485],[53.13686,25.926741],[53.137531,25.92907],[53.13768,25.929621],[53.138199,25.93149],[53.143181,25.94968],[53.14468,25.955219],[53.145969,25.959669],[53.147171,25.96319],[53.148121,25.96542],[53.149151,25.967569],[53.150089,25.96937],[53.151649,25.971849],[53.15337,25.974279],[53.155159,25.97641],[53.157219,25.97847],[53.15992,25.981119],[53.1605,25.98172],[53.161949,25.983271],[53.162571,25.983999],[53.163448,25.985069],[53.16431,25.986231],[53.164928,25.98716],[53.165539,25.988171],[53.166439,25.989811],[53.167469,25.99184],[53.168159,25.993349],[53.169361,25.996111],[53.170769,25.99935],[53.172871,26.004181],[53.17337,26.005409],[53.17395,26.006849],[53.17477,26.00901],[53.175369,26.010719],[53.176022,26.012739],[53.177299,26.01713],[53.178398,26.020969],[53.17889,26.022751],[53.17992,26.02721],[53.18042,26.03027],[53.180641,26.031981],[53.180962,26.03536],[53.18111,26.03808],[53.18124,26.04175],[53.181339,26.044069],[53.181412,26.045179],[53.181511,26.04649],[53.181641,26.047819],[53.181862,26.049601],[53.182152,26.0516],[53.18261,26.05405],[53.183041,26.056061],[53.183689,26.05863],[53.184799,26.06218],[53.185841,26.06506],[53.186329,26.06621],[53.18679,26.067221],[53.18766,26.06904],[53.190399,26.073931],[53.191769,26.076349],[53.19278,26.078159],[53.193851,26.08016],[53.194691,26.08189],[53.195339,26.08326],[53.199032,26.09133],[53.202541,26.098961],[53.205929,26.106091],[53.20739,26.10952],[53.208809,26.113569],[53.2094,26.115471],[53.210152,26.118019],[53.21088,26.120831],[53.211411,26.12294],[53.214512,26.135269],[53.21537,26.138359],[53.216911,26.14283],[53.218201,26.146351],[53.220181,26.150721],[53.221458,26.15321],[53.222752,26.155701],[53.225071,26.159559],[53.231251,26.16943],[53.233479,26.17347],[53.235538,26.177759],[53.238289,26.184879],[53.25219,26.22514],[53.252789,26.2272],[53.254162,26.231581],[53.256481,26.24033],[53.265919,26.283159],[53.266911,26.28706],[53.26712,26.28784],[53.267841,26.290371],[53.268761,26.293369],[53.26973,26.29624],[53.270748,26.29887],[53.271671,26.301069],[53.27219,26.302299],[53.284641,26.32745],[53.286011,26.33037],[53.287338,26.33342],[53.289612,26.33955],[53.298111,26.368389],[53.2994,26.37191],[53.300369,26.374399],[53.301029,26.37586],[53.303261,26.380489],[53.304722,26.38315],[53.306862,26.386669],[53.32317,26.41036],[53.327122,26.41663],[53.333561,26.42787],[53.34557,26.44907],[53.353561,26.46315],[53.36377,26.481091],[53.38026,26.5079],[53.382992,26.512329],[53.384769,26.51553],[53.385658,26.51713],[53.388828,26.52306],[53.403172,26.549919],[53.410461,26.5634],[53.41235,26.56649],[53.413979,26.56889],[53.416801,26.57254],[53.419128,26.575069],[53.421341,26.57732],[53.42445,26.57979],[53.444881,26.594299],[53.445061,26.594469],[53.448471,26.597139],[53.450371,26.598591],[53.454659,26.60228],[53.47768,26.625601],[53.478031,26.62594],[53.478981,26.626881],[53.485222,26.633181],[53.488049,26.63652],[53.489861,26.63876],[53.492352,26.642191],[53.494888,26.646099],[53.508911,26.67008],[53.509418,26.67103],[53.511311,26.674629],[53.512939,26.678129],[53.514229,26.68124],[53.515598,26.68502],[53.51675,26.68894],[53.52256,26.710939],[53.525829,26.724689],[53.52702,26.72982],[53.528221,26.73597],[53.52869,26.738371],[53.529221,26.74115],[53.529961,26.745029],[53.530151,26.745899],[53.532902,26.76289],[53.533401,26.76598],[53.535519,26.779091],[53.536121,26.78458],[53.536461,26.789391],[53.53664,26.79497],[53.53664,26.7978],[53.536251,26.805441],[53.53595,26.80879],[53.535339,26.813669],[53.534401,26.819],[53.534229,26.819771],[53.530708,26.83737],[53.530209,26.83996],[53.52985,26.8426],[53.52951,26.84527],[53.529251,26.849039],[53.529171,26.852131],[53.529289,26.856291],[53.529591,26.86054],[53.530048,26.86355],[53.530369,26.86561],[53.53059,26.86692],[53.531738,26.872299],[53.536381,26.8929],[53.538391,26.90213],[53.543839,26.9268],[53.551048,26.95891],[53.551739,26.961479],[53.552341,26.963369],[53.55397,26.96689],[53.556889,26.9729],[53.569759,26.99976],[53.584961,27.03109],[53.588219,27.037609],[53.58942,27.03907],[53.590111,27.039761],[53.59095,27.040529],[53.592159,27.04105],[53.595341,27.04215],[53.595509,27.04221],[53.598179,27.043249],[53.60865,27.047779],[53.61459,27.050211],[53.619888,27.05237],[53.625561,27.05632],[53.642429,27.06823],[53.649181,27.073],[53.650631,27.074301],[53.651821,27.07575],[53.652611,27.076799],[53.654018,27.0788],[53.655418,27.08147],[53.656712,27.08456],[53.65757,27.087391],[53.65834,27.090401],[53.659031,27.095289],[53.659199,27.097521],[53.65937,27.11211],[53.659458,27.11709],[53.65971,27.12756],[53.660141,27.132629],[53.661091,27.137951],[53.661598,27.14044],[53.663151,27.14567],[53.666531,27.155149],[53.674389,27.17734],[53.675251,27.1798],[53.675869,27.182501],[53.676491,27.18531],[53.67712,27.189251],[53.677551,27.19454],[53.67757,27.19717],[53.677399,27.20146],[53.676708,27.20841],[53.676109,27.216311],[53.675758,27.223089],[53.675591,27.230471],[53.675758,27.243179],[53.676022,27.247549],[53.676449,27.25416],[53.676971,27.26008],[53.678001,27.267981],[53.679451,27.277531],[53.685551,27.31776],[53.686409,27.32394],[53.688721,27.340521],[53.691151,27.358589],[53.691441,27.36087],[53.694908,27.38806],[53.697571,27.409691],[53.698601,27.415951],[53.699711,27.42239],[53.701248,27.42951],[53.702412,27.434111],[53.703892,27.439819],[53.709179,27.45775],[53.709728,27.459539],[53.710258,27.461411],[53.723,27.503969],[53.723629,27.506109],[53.72496,27.51058],[53.72691,27.517099],[53.727348,27.51852],[53.72789,27.520281],[53.729149,27.52442],[53.729729,27.526529],[53.730129,27.528099],[53.73082,27.53133],[53.731548,27.534981],[53.73214,27.53829],[53.732651,27.54188],[53.733139,27.54612],[53.734119,27.55578],[53.736309,27.57708],[53.73687,27.58239],[53.737789,27.5914],[53.738548,27.59878],[53.739639,27.609711],[53.740021,27.61257],[53.740139,27.613449],[53.740749,27.61706],[53.741371,27.620041],[53.742371,27.62392],[53.743832,27.628731],[53.745338,27.632971],[53.746071,27.634689],[53.746868,27.6364],[53.747452,27.637609],[53.748058,27.63879],[53.749298,27.641029],[53.751671,27.64571],[53.752972,27.64875],[53.754261,27.65201],[53.75613,27.657351],[53.75626,27.657721],[53.756908,27.659731],[53.757381,27.6609],[53.7579,27.66235],[53.75832,27.663469],[53.759029,27.665319],[53.759819,27.66711],[53.7607,27.669029],[53.76162,27.67108],[53.762192,27.67214],[53.762901,27.673441],[53.78426,27.712919],[53.786491,27.71736],[53.78846,27.721979],[53.790089,27.726471],[53.79097,27.72916],[53.791382,27.73045],[53.79229,27.733801],[53.793221,27.73777],[53.793499,27.73922],[53.793591,27.739651],[53.793678,27.740191],[53.797211,27.759199],[53.797871,27.76277],[53.79966,27.77269],[53.799881,27.773951],[53.80064,27.778521],[53.802368,27.786659],[53.803139,27.78932],[53.804249,27.793011],[53.80431,27.79318],[53.804878,27.794809],[53.805222,27.795771],[53.80621,27.798479],[53.807301,27.801189],[53.807899,27.80257],[53.80859,27.80405],[53.809689,27.806351],[53.811291,27.80949],[53.813919,27.81415],[53.814121,27.81451],[53.81707,27.81988],[53.81773,27.82114],[53.825401,27.835051],[53.829479,27.842819],[53.833488,27.85062],[53.84153,27.866261],[53.84193,27.86705],[53.843239,27.86961],[53.843891,27.87084],[53.84454,27.872101],[53.845829,27.87459],[53.848412,27.879601],[53.849861,27.882389],[53.85133,27.885229],[53.854252,27.89086],[53.8601,27.902121],[53.861439,27.90472],[53.861599,27.90501],[53.861832,27.90547],[53.863529,27.90876],[53.867081,27.915569],[53.868511,27.91836],[53.86998,27.92103],[53.871288,27.923189],[53.87262,27.925261],[53.874321,27.92758],[53.87606,27.929779],[53.87867,27.93269],[53.878841,27.93284],[53.879501,27.933479],[53.88142,27.93531],[53.88348,27.936951],[53.885021,27.938061],[53.88905,27.94046],[53.891708,27.941771],[53.900379,27.94578],[53.90905,27.949909],[53.92561,27.957621],[53.929649,27.95952],[53.93251,27.960819],[53.935322,27.962351],[53.9361,27.96287],[53.93803,27.96422],[53.939861,27.96578],[53.943039,27.96896],[53.945961,27.972651],[53.946449,27.9734],[53.948139,27.976049],[53.948669,27.97698],[53.949188,27.97789],[53.949478,27.978399],[53.951279,27.98192],[53.952648,27.98527],[53.954319,27.98984],[53.955662,27.99394],[53.963131,28.020201],[53.967251,28.03454],[53.97094,28.047319],[53.973339,28.05479],[53.979519,28.07144],[53.98209,28.078051],[53.98476,28.08552],[53.986301,28.09041],[53.9869,28.09239],[53.98888,28.09968],[53.989651,28.103109],[53.992908,28.116159],[53.995659,28.12775],[53.99601,28.129181],[53.997028,28.13341],[53.998138,28.137791],[54.000198,28.144911],[54.001411,28.148689],[54.003471,28.154779],[54.005531,28.16062],[54.007931,28.167139],[54.009392,28.17161],[54.01128,28.17779],[54.011459,28.178431],[54.012642,28.18281],[54.013149,28.18469],[54.01342,28.18568],[54.014881,28.19212],[54.015739,28.19615],[54.01757,28.206301],[54.01849,28.21307],[54.019348,28.22019],[54.020149,28.22949],[54.020199,28.23004],[54.02026,28.230841],[54.025688,28.30113],[54.02647,28.30962],[54.026981,28.313141],[54.02906,28.32885],[54.03334,28.357349],[54.033852,28.36507],[54.035309,28.373911],[54.035309,28.374081],[54.037109,28.38241],[54.039768,28.39279],[54.041309,28.398251],[54.045609,28.413481],[54.04776,28.420601],[54.049469,28.425579],[54.050381,28.427641],[54.052132,28.431589],[54.054089,28.435329],[54.058441,28.443689],[54.062519,28.4515],[54.06673,28.458969],[54.068951,28.46274],[54.07069,28.465349],[54.07119,28.466089],[54.075909,28.47262],[54.08123,28.47879],[54.083618,28.481319],[54.090328,28.488411],[54.119419,28.518909],[54.120449,28.519991],[54.123631,28.523769],[54.132729,28.535789],[54.137619,28.54188],[54.141651,28.546431],[54.14526,28.550119],[54.148689,28.553471],[54.153591,28.55793],[54.157619,28.56119],[54.166599,28.56822],[54.172371,28.572741],[54.174809,28.574551],[54.177021,28.576191],[54.179588,28.5781],[54.183971,28.581619],[54.18663,28.58419],[54.194271,28.59235],[54.194778,28.592859],[54.207661,28.60651],[54.209042,28.60816],[54.211609,28.611231],[54.213921,28.614321],[54.217701,28.61964],[54.225941,28.632429],[54.237782,28.650801],[54.239159,28.652691],[54.242161,28.65612],[54.245602,28.65913],[54.24791,28.660931],[54.250912,28.662531],[54.251759,28.662979],[54.257092,28.665819],[54.258808,28.666759],[54.25959,28.66728],[54.260441,28.668051],[54.261471,28.669081],[54.262852,28.670799],[54.264141,28.672859],[54.265079,28.67457],[54.266201,28.677059],[54.266911,28.679251],[54.267231,28.680241],[54.268341,28.685101],[54.269032,28.688141],[54.26947,28.691031],[54.269539,28.691481],[54.269588,28.691971],[54.270061,28.69663],[54.270061,28.7071],[54.270111,28.708799],[54.27026,28.710541],[54.270401,28.711769],[54.270569,28.712681],[54.270908,28.71414],[54.271351,28.715691],[54.27232,28.718201],[54.272541,28.718781],[54.282761,28.738779],[54.28997,28.752939],[54.291,28.755939],[54.291599,28.758169],[54.291859,28.761259],[54.291931,28.763109],[54.29155,28.77039],[54.29108,28.780661],[54.29015,28.800529],[54.289959,28.804581],[54.289879,28.806379],[54.289688,28.810459],[54.289631,28.811729],[54.28904,28.8241],[54.288971,28.826241],[54.288971,28.82822],[54.289219,28.83215],[54.290699,28.85079],[54.291061,28.86319],[54.291309,28.87359],[54.29155,28.876591],[54.292801,28.884689],[54.295979,28.904261],[54.297779,28.916269],[54.29821,28.919451],[54.29855,28.923229],[54.300251,28.947069],[54.30027,28.948721],[54.300468,28.950411],[54.301041,28.95756],[54.301842,28.969],[54.301991,28.97043],[54.30262,28.97678],[54.30302,28.979361],[54.30756,29.00271],[54.308418,29.007339],[54.30928,29.01326],[54.31057,29.022791],[54.3116,29.029831],[54.31271,29.036091],[54.31366,29.04081],[54.31572,29.04871],[54.318378,29.056259],[54.331249,29.092911],[54.334259,29.099689],[54.3358,29.10261],[54.336319,29.10347],[54.339409,29.10836],[54.345329,29.11635],[54.347988,29.120119],[54.349541,29.12261],[54.35194,29.127251],[54.35434,29.13282],[54.355801,29.1366],[54.362148,29.155661],[54.362839,29.15814],[54.364391,29.16415],[54.364811,29.166031],[54.36499,29.167061],[54.36573,29.171209],[54.366531,29.17643],[54.370911,29.20389],[54.371681,29.209299],[54.3722,29.21393],[54.37244,29.217501],[54.372532,29.220209],[54.37252,29.22753],[54.371471,29.281111],[54.371391,29.285179],[54.371319,29.28879],[54.37125,29.291611],[54.37133,29.29336],[54.371422,29.295219],[54.37159,29.297819],[54.371891,29.300289],[54.37254,29.304399],[54.37331,29.30826],[54.374168,29.3111],[54.374729,29.312901],[54.375938,29.316811],[54.377258,29.321051],[54.377522,29.32234],[54.378811,29.3274],[54.379921,29.332979],[54.380428,29.336161],[54.380871,29.338989],[54.384121,29.36319],[54.38438,29.36491],[54.385578,29.37075],[54.39082,29.39521],[54.395538,29.417101],[54.396999,29.42594],[54.397598,29.42997],[54.400002,29.45031],[54.400139,29.4513],[54.401031,29.457689],[54.401981,29.46336],[54.403011,29.46817],[54.406269,29.48439],[54.40765,29.49065],[54.408932,29.49555],[54.409962,29.49881],[54.412708,29.506189],[54.419231,29.52121],[54.419899,29.523069],[54.421791,29.52866],[54.42292,29.532749],[54.424809,29.541121],[54.4291,29.5606],[54.430389,29.56739],[54.431252,29.57262],[54.43219,29.579491],[54.433311,29.588181],[54.433491,29.589689],[54.434528,29.596939],[54.435322,29.60264],[54.435619,29.60507],[54.436909,29.61408],[54.43708,29.615191],[54.437241,29.616381],[54.437531,29.618191],[54.438141,29.621481],[54.43848,29.623091],[54.43895,29.62516],[54.439571,29.627609],[54.439899,29.62882],[54.4403,29.63028],[54.44136,29.63376],[54.442451,29.63719],[54.444641,29.644039],[54.447151,29.652069],[54.447788,29.654169],[54.448349,29.655951],[54.449291,29.65892],[54.450218,29.66189],[54.451248,29.665831],[54.456188,29.687019],[54.45718,29.69128],[54.457722,29.693911],[54.458038,29.695749],[54.458679,29.69985],[54.45927,29.704639],[54.459541,29.70756],[54.460072,29.71306],[54.460258,29.715099],[54.461971,29.735531],[54.462318,29.738621],[54.46262,29.74155],[54.463428,29.746429],[54.46386,29.74917],[54.464981,29.754169],[54.46627,29.759899],[54.474419,29.79578],[54.47678,29.806629],[54.477001,29.807631],[54.477772,29.81303],[54.478512,29.819361],[54.479141,29.824711],[54.479389,29.829189],[54.479401,29.832861],[54.479401,29.835779],[54.479221,29.838869],[54.47897,29.84136],[54.478539,29.84436],[54.4776,29.84943],[54.476601,29.85458],[54.47485,29.86367],[54.474331,29.86685],[54.47393,29.870871],[54.47348,29.876631],[54.473301,29.882641],[54.473301,29.88702],[54.473549,29.892269],[54.473911,29.89637],[54.474331,29.90015],[54.475101,29.905821],[54.47588,29.911261],[54.476009,29.91217],[54.476131,29.912979],[54.477509,29.921949],[54.481918,29.952721],[54.482849,29.95892],[54.484451,29.969681],[54.485748,29.978769],[54.491371,30.01828],[54.492378,30.02508],[54.492661,30.02648],[54.493229,30.02866],[54.4939,30.03088],[54.498699,30.047119],[54.49884,30.047621],[54.49926,30.049259],[54.499592,30.051069],[54.49976,30.052429],[54.500011,30.055189],[54.500301,30.060289],[54.501331,30.07649],[54.501949,30.08609],[54.50198,30.087179],[54.502239,30.089689],[54.502361,30.090799],[54.50425,30.10475],[54.504608,30.107281],[54.506271,30.11908],[54.50687,30.12211],[54.50737,30.12393],[54.507919,30.125839],[54.508739,30.128019],[54.51511,30.1404],[54.518089,30.14632],[54.52309,30.15601],[54.538921,30.187611],[54.542049,30.193951],[54.542679,30.195641],[54.543171,30.19755],[54.543339,30.19824],[54.543598,30.19936],[54.546089,30.2173],[54.54718,30.225519],[54.547581,30.228439],[54.547989,30.23138],[54.548382,30.23432],[54.549858,30.244499],[54.553299,30.269739],[54.553471,30.27051],[54.55373,30.271799],[54.554161,30.273689],[54.55484,30.27557],[54.555531,30.277031],[54.56171,30.28862],[54.56274,30.29068],[54.563511,30.29283],[54.564201,30.29463],[54.570549,30.314199],[54.57132,30.31609],[54.572262,30.31806],[54.575699,30.32493],[54.576469,30.32621],[54.577251,30.32733],[54.590641,30.34347],[54.5914,30.344391],[54.59483,30.34856],[54.599911,30.35471],[54.600761,30.355829],[54.60162,30.357109],[54.602482,30.35874],[54.603939,30.36286],[54.6096,30.379601],[54.618641,30.405649],[54.619301,30.407579],[54.619732,30.40913],[54.620029,30.41082],[54.620369,30.41293],[54.62162,30.424231],[54.62302,30.435459],[54.623508,30.438999],[54.623852,30.44174],[54.624538,30.446289],[54.62994,30.48938],[54.632351,30.508261],[54.635349,30.53229],[54.638962,30.56225],[54.641529,30.583191],[54.642479,30.591089],[54.64325,30.59547],[54.652691,30.63521],[54.656288,30.650311],[54.65913,30.66264],[54.669769,30.70816],[54.672771,30.720779],[54.675861,30.738199],[54.683159,30.780769],[54.683159,30.78112],[54.68359,30.785839],[54.685989,30.830641],[54.686119,30.8328],[54.68737,30.854071],[54.689079,30.883511],[54.689362,30.889811],[54.68943,30.891411],[54.689861,30.926941],[54.68993,30.93252],[54.690369,30.968229],[54.690708,30.981791],[54.690842,30.992599],[54.69091,30.99811],[54.690929,30.999861],[54.69099,31.000401],[54.69099,31.000641],[54.690948,31.00079],[54.690971,31.001591],[54.691109,31.014879],[54.69112,31.0201],[54.689701,31.05283],[54.689949,31.06406],[54.69099,31.07468],[54.70348,31.20154],[54.709801,31.244169],[54.710098,31.24548],[54.72105,31.283421],[54.722359,31.28828],[54.72567,31.30747],[54.729439,31.33021],[54.730431,31.336189],[54.735111,31.35618],[54.738861,31.372881],[54.742531,31.41223],[54.744179,31.42782],[54.749039,31.478109],[54.74955,31.48155],[54.751961,31.488119],[54.771992,31.53681],[54.786671,31.57107],[54.791,31.578859],[54.792702,31.58213],[54.794479,31.58531],[54.795181,31.58655],[54.79652,31.589029],[54.802349,31.599859],[54.80621,31.60693],[54.80685,31.60828],[54.807449,31.610001],[54.80798,31.612209],[54.810699,31.62418],[54.81295,31.63438],[54.81358,31.63641],[54.814232,31.63796],[54.81496,31.639339],[54.815788,31.640591],[54.83802,31.663321],[54.841209,31.666731],[54.842098,31.66818],[54.842949,31.67001],[54.843651,31.6724],[54.84396,31.67371],[54.844181,31.675091],[54.844349,31.677031],[54.84444,31.679331],[54.84465,31.68441],[54.846569,31.740999],[54.849239,31.8048],[54.850559,31.838461],[54.850788,31.844669],[54.851139,31.852501],[54.851139,31.854111],[54.8512,31.85553],[54.851311,31.857031],[54.85144,31.85841],[54.85149,31.85882],[54.851688,31.860241],[54.852032,31.861959],[54.859341,31.893641],[54.859699,31.89522],[54.860031,31.896851],[54.860298,31.89867],[54.860409,31.900021],[54.860729,31.907431],[54.863209,31.965019],[54.863461,31.97064],[54.86396,31.97884],[54.864151,31.98205],[54.865582,32.003571],[54.865761,32.00528],[54.86586,32.00592],[54.86607,32.007],[54.86644,32.00843],[54.870831,32.024979],[54.87233,32.030609],[54.878571,32.05394],[54.882,32.067009],[54.882839,32.070171],[54.883598,32.073101],[54.883839,32.074139],[54.88406,32.075291],[54.884701,32.07951],[54.88501,32.081261],[54.889851,32.10043],[54.89156,32.105839],[54.893639,32.111629],[54.894569,32.113979],[54.895279,32.115372],[54.896961,32.11755],[54.89856,32.11887],[54.908989,32.124649],[54.91114,32.12619],[54.912048,32.127312],[54.914181,32.130299],[54.92564,32.14669],[54.92709,32.14933],[54.93465,32.165771],[54.941029,32.179642],[54.942371,32.18211],[54.951599,32.195801],[54.955898,32.20388],[54.957008,32.205929],[54.984772,32.2495],[55.009338,32.288151],[55.014061,32.29557],[55.01635,32.299301],[55.017502,32.302029],[55.02364,32.323231],[55.028831,32.340839],[55.029331,32.342609],[55.029751,32.344479],[55.02998,32.34597],[55.030151,32.347591],[55.032341,32.372421],[55.033009,32.38018],[55.033112,32.381931],[55.033699,32.402451],[55.03381,32.404652],[55.033901,32.405529],[55.034019,32.4063],[55.03429,32.407921],[55.055199,32.499489],[55.055729,32.501888],[55.056099,32.504452],[55.056629,32.51738],[55.05714,32.530281],[55.05822,32.55682],[55.059029,32.576729],[55.059422,32.586262],[55.059818,32.595951],[55.059959,32.597309],[55.060169,32.598701],[55.060711,32.601089],[55.066109,32.62178],[55.072861,32.647812],[55.073879,32.65197],[55.076351,32.664532],[55.077229,32.66922],[55.078171,32.674419],[55.07835,32.676239],[55.078659,32.678799],[55.078911,32.681412],[55.079029,32.684189],[55.079021,32.687019],[55.07896,32.69241],[55.07901,32.69603],[55.07906,32.696899],[55.079109,32.697769],[55.07943,32.70303],[55.079578,32.70578],[55.07967,32.708408],[55.07967,32.7094],[55.079659,32.710388],[55.079651,32.712261],[55.079632,32.716011],[55.079201,32.743149],[55.079231,32.7444],[55.079319,32.745689],[55.080929,32.757801],[55.081959,32.764309],[55.085812,32.792412],[55.09552,32.86187],[55.100609,32.89822],[55.101082,32.90139],[55.103889,32.921909],[55.105289,32.931881],[55.107571,32.952911],[55.11404,33.01384],[55.11478,33.020802],[55.116661,33.038502],[55.118839,33.05909],[55.11903,33.06097],[55.120232,33.07328],[55.12038,33.074821],[55.122749,33.097221],[55.12476,33.11731],[55.127258,33.141972],[55.12812,33.150501],[55.128658,33.155849],[55.12941,33.164082],[55.129551,33.167191],[55.130001,33.171902],[55.130329,33.174858],[55.13203,33.194359],[55.132179,33.19561],[55.132408,33.196869],[55.13242,33.196911],[55.133831,33.202961],[55.134621,33.206329],[55.13612,33.212269],[55.136971,33.21603],[55.138378,33.226891],[55.13974,33.23716],[55.140041,33.239479],[55.140072,33.239712],[55.140381,33.242279],[55.141708,33.25333],[55.142391,33.260139],[55.142422,33.26049],[55.14365,33.273491],[55.14463,33.283451],[55.144981,33.286999],[55.145432,33.290569],[55.145931,33.294651],[55.1493,33.320049],[55.15123,33.334499],[55.152111,33.340832],[55.15263,33.344742],[55.15284,33.346119],[55.15303,33.347069],[55.153801,33.350552],[55.157761,33.367619],[55.162682,33.38887],[55.16927,33.417389],[55.174042,33.43829],[55.17432,33.439339],[55.177589,33.450409],[55.178169,33.452431],[55.178768,33.454479],[55.17944,33.456749],[55.181782,33.46479],[55.182529,33.467381],[55.18285,33.468639],[55.183102,33.469921],[55.183289,33.471249],[55.183418,33.472778],[55.18343,33.474361],[55.183338,33.481991],[55.183201,33.492451],[55.182751,33.514259],[55.18269,33.517471],[55.182621,33.521042],[55.18235,33.535782],[55.181499,33.586811],[55.181259,33.603691],[55.181171,33.605801],[55.18055,33.617359],[55.180248,33.624809],[55.179798,33.634941],[55.179279,33.646099],[55.17955,33.6507],[55.180851,33.665352],[55.181721,33.67519],[55.185951,33.722252],[55.186932,33.733372],[55.188869,33.755901],[55.19022,33.769772],[55.19437,33.816299],[55.197609,33.853371],[55.198872,33.86784],[55.19912,33.874069],[55.199169,33.87693],[55.199551,33.897419],[55.19949,33.902531],[55.19912,33.9081],[55.197571,33.918049],[55.19138,33.95414],[55.190868,33.95586],[55.190411,33.975052],[55.18998,33.992599],[55.18977,34.000889],[55.189209,34.021259],[55.188301,34.037731],[55.18737,34.057541],[55.187382,34.059479],[55.187531,34.061371],[55.203011,34.140369],[55.20351,34.14296],[55.203991,34.144909],[55.20462,34.14682],[55.20575,34.149281],[55.205898,34.14962],[55.210041,34.158669],[55.2104,34.159451],[55.21236,34.171219],[55.220131,34.21777],[55.22076,34.222012],[55.22147,34.232059],[55.221619,34.234131],[55.22179,34.235569],[55.22208,34.237122],[55.222641,34.239288],[55.227921,34.257561],[55.228619,34.259899],[55.231991,34.271622],[55.24136,34.306641],[55.241661,34.307739],[55.24202,34.309109],[55.242371,34.310398],[55.243389,34.314209],[55.2435,34.314339],[55.245979,34.323818],[55.249329,34.336559],[55.249599,34.337589],[55.260361,34.372532],[55.261391,34.375931],[55.2654,34.389042],[55.266911,34.393532],[55.269669,34.401371],[55.288132,34.453289],[55.294189,34.472851],[55.315491,34.531731],[55.32428,34.562809],[55.356602,34.639191],[55.362381,34.65646],[55.36401,34.661339],[55.366451,34.668381],[55.370159,34.677132],[55.37426,34.68692],[55.383419,34.70425],[55.389469,34.713871],[55.41082,34.76725],[55.418419,34.78442],[55.425541,34.80146],[55.433361,34.82016],[55.43346,34.8204],[55.446468,34.851879],[55.448391,34.856579],[55.45153,34.864239],[55.470219,34.909729],[55.487339,34.948181],[55.49308,34.976509],[55.496552,35.007629],[55.496891,35.010681],[55.497028,35.011959],[55.49752,35.01646],[55.49955,35.036381],[55.499592,35.036758],[55.503189,35.101479],[55.505718,35.117962],[55.505718,35.120701],[55.503521,35.144611],[55.499298,35.190571],[55.499981,35.215981],[55.49902,35.240929],[55.498859,35.24894],[55.491619,35.31348],[55.491409,35.35181],[55.491329,35.367901],[55.491421,35.397419],[55.49123,35.400509],[55.487518,35.416309],[55.48074,35.444111],[55.48024,35.446171],[55.474239,35.491421],[55.471531,35.511909],[55.470581,35.519581],[55.47044,35.52206],[55.470119,35.529282],[55.468689,35.557758],[55.466881,35.593349],[55.46558,35.618931],[55.464211,35.645908],[55.46402,35.649601],[55.462921,35.676449],[55.461948,35.701061],[55.465279,35.759811],[55.46529,35.761002],[55.465351,35.769691],[55.465382,35.77354],[55.464821,35.826988],[55.464802,35.828949],[55.464779,35.83086],[55.464771,35.8321],[55.464691,35.839359],[55.4646,35.847698],[55.46542,35.903252],[55.46558,35.913269],[55.465382,35.917561],[55.46402,35.94331],[55.45993,36.022961],[55.459179,36.03561],[55.457581,36.060638],[55.457581,36.06271],[55.457821,36.064789],[55.458118,36.066799],[55.458641,36.068619],[55.474209,36.110161],[55.474339,36.11058],[55.49065,36.16309],[55.494148,36.174358],[55.50119,36.207119],[55.50909,36.243801],[55.51041,36.24992],[55.510818,36.251862],[55.51379,36.26569],[55.522362,36.31168],[55.525181,36.326809],[55.525589,36.32901],[55.531239,36.359341],[55.535961,36.384621],[55.536018,36.384899],[55.536072,36.385201],[55.536709,36.388729],[55.538609,36.39875],[55.53883,36.39996],[55.539341,36.40274],[55.53973,36.404888],[55.540291,36.407959],[55.54216,36.417648],[55.54895,36.455029],[55.551121,36.483101],[55.55114,36.483269],[55.551151,36.483429],[55.55167,36.490059],[55.55621,36.54797],[55.556221,36.548161],[55.55801,36.571011],[55.55822,36.573589],[55.55896,36.582569],[55.564362,36.632759],[55.565071,36.639389],[55.56826,36.669849],[55.571011,36.695881],[55.571018,36.69603],[55.571079,36.69664],[55.571091,36.696739],[55.572319,36.708599],[55.572392,36.70932],[55.572491,36.710251],[55.573101,36.716228],[55.573471,36.719952],[55.575031,36.73521],[55.575729,36.74213],[55.576229,36.747021],[55.57666,36.751289],[55.578522,36.76976],[55.57893,36.773891],[55.581409,36.798882],[55.584068,36.824989],[55.587349,36.85857],[55.58794,36.864269],[55.588421,36.869068],[55.58881,36.872978],[55.589039,36.875259],[55.59066,36.891609],[55.591808,36.90316],[55.594059,36.925831],[55.595589,36.93972],[55.595779,36.941292],[55.59602,36.94323],[55.596539,36.94767],[55.59848,36.964432],[55.598991,36.96875],[55.60051,36.981628],[55.60228,36.996632],[55.602638,36.99966],[55.603119,37.004261],[55.603149,37.004681],[55.603199,37.0051],[55.603249,37.005459],[55.60331,37.005859],[55.603821,37.01012],[55.604,37.011539],[55.604519,37.015621],[55.60535,37.02277],[55.605911,37.02747],[55.609039,37.05463],[55.60976,37.061089],[55.610279,37.06546],[55.610531,37.06673],[55.611149,37.069778],[55.61121,37.070091],[55.612518,37.076752],[55.61248,37.077709],[55.613091,37.081009],[55.613289,37.081989],[55.61565,37.093441],[55.616119,37.09626],[55.616531,37.09869],[55.616909,37.101959],[55.62027,37.126701],[55.62133,37.13377],[55.622608,37.142799],[55.62299,37.14724],[55.623268,37.151451],[55.623901,37.161259],[55.624741,37.174],[55.625259,37.181801],[55.625439,37.184681],[55.62553,37.185589],[55.625839,37.188622],[55.626049,37.191921],[55.62619,37.19376],[55.626339,37.195271],[55.62648,37.196281],[55.626652,37.197441],[55.626869,37.198662],[55.627129,37.19978],[55.627392,37.200779],[55.627831,37.202209],[55.628361,37.203701],[55.628811,37.20483],[55.629269,37.205891],[55.629539,37.20652],[55.631119,37.209999],[55.63187,37.211639],[55.632359,37.212799],[55.633801,37.216019],[55.634998,37.21875],[55.635479,37.219841],[55.635929,37.22084],[55.636299,37.22168],[55.637501,37.2244],[55.63868,37.227039],[55.639858,37.229698],[55.64106,37.23241],[55.642269,37.23513],[55.64267,37.236141],[55.643509,37.238441],[55.64431,37.240719],[55.645939,37.245239],[55.646641,37.247131],[55.64769,37.250061],[55.648029,37.251019],[55.648281,37.251839],[55.648548,37.252762],[55.648689,37.253342],[55.649071,37.255032],[55.649429,37.25684],[55.650082,37.260521],[55.65052,37.262779],[55.651131,37.266102],[55.651451,37.26786],[55.652248,37.272171],[55.65284,37.275341],[55.653412,37.278389],[55.654259,37.28299],[55.655399,37.28931],[55.655602,37.29039],[55.655788,37.291409],[55.656269,37.293739],[55.656448,37.29435],[55.656658,37.295059],[55.657089,37.29631],[55.657379,37.296982],[55.657879,37.298019],[55.658489,37.299019],[55.65905,37.29977],[55.659611,37.300468],[55.66087,37.301861],[55.66206,37.303169],[55.662281,37.30341],[55.663811,37.30505],[55.664719,37.306],[55.665619,37.307011],[55.666908,37.308472],[55.66782,37.309441],[55.66853,37.310169],[55.669109,37.31081],[55.66951,37.311241],[55.670639,37.3125],[55.671421,37.31332],[55.67263,37.31464],[55.672989,37.315029],[55.67794,37.320431],[55.67857,37.321129],[55.679428,37.322071],[55.67984,37.322559],[55.680038,37.3228],[55.680191,37.322941],[55.683571,37.326599],[55.683819,37.32687],[55.685791,37.328991],[55.690022,37.333519],[55.693169,37.336971],[55.694759,37.338631],[55.69556,37.339531],[55.69595,37.34],[55.696331,37.340481],[55.696732,37.341011],[55.697109,37.341579],[55.697842,37.3428],[55.698311,37.34359],[55.698471,37.343861],[55.698639,37.344151],[55.698738,37.34433],[55.69949,37.34568],[55.69978,37.34621],[55.700371,37.34729],[55.701241,37.348869],[55.702839,37.351891],[55.703732,37.35355],[55.703949,37.353958],[55.704472,37.354939],[55.705002,37.3559],[55.705441,37.356682],[55.706081,37.357891],[55.706638,37.358891],[55.70705,37.35965],[55.70755,37.360569],[55.707878,37.36121],[55.708172,37.361801],[55.708382,37.36227],[55.70882,37.363319],[55.70911,37.36401],[55.709499,37.36504],[55.709728,37.36573],[55.70998,37.366482],[55.710281,37.367481],[55.710541,37.368431],[55.710812,37.36953],[55.71104,37.37059],[55.711269,37.3717],[55.711849,37.375118],[55.71209,37.376629],[55.71262,37.38015],[55.71286,37.381729],[55.712818,37.382339],[55.712799,37.382561],[55.712742,37.382771],[55.71244,37.38372],[55.712261,37.384258],[55.71199,37.38509],[55.711929,37.385281],[55.71167,37.386082],[55.71138,37.386688],[55.710949,37.387459],[55.710098,37.38821],[55.70993,37.388371],[55.709641,37.38863],[55.70837,37.39016],[55.707981,37.390572],[55.70681,37.392139],[55.70639,37.392712],[55.705299,37.394119],[55.704361,37.395302],[55.70406,37.39571],[55.702068,37.398418],[55.701469,37.399239],[55.700809,37.40015],[55.700291,37.400841],[55.699841,37.401459],[55.699261,37.40226],[55.698799,37.402901],[55.69754,37.404541],[55.693779,37.40976],[55.69265,37.41103],[55.692039,37.411659],[55.691422,37.412251],[55.690071,37.41328],[55.689751,37.413502],[55.689011,37.413952],[55.688309,37.41433],[55.687618,37.41465],[55.686611,37.41502],[55.686401,37.4151],[55.685848,37.41526],[55.685699,37.415272],[55.685081,37.415489],[55.684391,37.415779],[55.684059,37.415932],[55.683659,37.41613],[55.683281,37.41634],[55.68285,37.416599],[55.68243,37.41687],[55.68206,37.41713],[55.680611,37.418221],[55.67614,37.421558],[55.670879,37.425499],[55.669231,37.426739],[55.668152,37.427551],[55.66732,37.428162],[55.666191,37.429008],[55.66576,37.42934],[55.664509,37.430271],[55.664131,37.43058],[55.663528,37.431091],[55.66267,37.43187],[55.661491,37.432999],[55.66053,37.433929],[55.66013,37.434341],[55.659729,37.43478],[55.659309,37.435249],[55.659088,37.43549],[55.658169,37.436569],[55.656479,37.438549],[55.65451,37.440849],[55.65411,37.441319],[55.653751,37.44178],[55.652359,37.4436],[55.652111,37.44389],[55.65086,37.445358],[55.645191,37.451988],[55.643459,37.454021],[55.641281,37.45657],[55.639191,37.459019],[55.6385,37.459839],[55.637131,37.461441],[55.6366,37.462059],[55.635941,37.462818],[55.632431,37.466919],[55.631828,37.467621],[55.63158,37.467899],[55.630939,37.468651],[55.628601,37.471371],[55.627361,37.47282],[55.625629,37.474838],[55.620949,37.48032],[55.617222,37.48468],[55.6157,37.48645],[55.614529,37.48782],[55.61364,37.48885],[55.613361,37.489182],[55.611931,37.490841],[55.611519,37.491322],[55.610699,37.492279],[55.609539,37.493629],[55.608521,37.49482],[55.607571,37.49593],[55.60601,37.497749],[55.6035,37.500671],[55.60091,37.503681],[55.600288,37.504429],[55.599682,37.505211],[55.599121,37.505989],[55.59874,37.506592],[55.598339,37.507221],[55.59782,37.508129],[55.59745,37.508789],[55.597092,37.50948],[55.596691,37.510311],[55.596321,37.51115],[55.59586,37.512249],[55.595428,37.513359],[55.595081,37.51437],[55.594688,37.515591],[55.594349,37.516731],[55.59404,37.517948],[55.593811,37.518921],[55.592319,37.525131],[55.591541,37.528412],[55.59132,37.529339],[55.590912,37.53101],[55.59005,37.534599],[55.587421,37.545601],[55.587139,37.54678],[55.586491,37.549469],[55.584969,37.55584],[55.58287,37.564602],[55.582199,37.567421],[55.581779,37.56916],[55.580719,37.57357],[55.580261,37.57552],[55.579342,37.579361],[55.577278,37.58794],[55.577141,37.588551],[55.577,37.58918],[55.57687,37.589771],[55.576759,37.590408],[55.576641,37.591091],[55.576439,37.59227],[55.57634,37.592911],[55.576241,37.593521],[55.57616,37.594131],[55.576092,37.594742],[55.576019,37.59539],[55.57597,37.596008],[55.575932,37.59655],[55.57589,37.597099],[55.575809,37.598301],[55.575741,37.599659],[55.575611,37.601822],[55.575329,37.606709],[55.575241,37.608158],[55.574982,37.612598],[55.574921,37.613659],[55.574581,37.61935],[55.574409,37.62228],[55.573818,37.632408],[55.573681,37.63475],[55.573589,37.636292],[55.573471,37.638309],[55.57336,37.640308],[55.57325,37.64204],[55.57304,37.645771],[55.572929,37.647671],[55.57283,37.6492],[55.572639,37.652538],[55.572609,37.653061],[55.57254,37.654121],[55.572491,37.655071],[55.571991,37.6633],[55.57196,37.66394],[55.57193,37.664619],[55.571892,37.665298],[55.571869,37.665932],[55.571838,37.666599],[55.571831,37.667271],[55.571819,37.66795],[55.571819,37.66864],[55.571831,37.669312],[55.571861,37.669998],[55.57188,37.67067],[55.571918,37.671349],[55.571972,37.67202],[55.572029,37.672691],[55.57209,37.673359],[55.57217,37.67403],[55.57225,37.674702],[55.57233,37.675362],[55.572418,37.67601],[55.572529,37.67667],[55.57275,37.677952],[55.572861,37.678589],[55.573002,37.679241],[55.573139,37.679871],[55.573299,37.680489],[55.57346,37.68108],[55.573608,37.68166],[55.57375,37.68219],[55.573929,37.682758],[55.5741,37.683331],[55.57428,37.683868],[55.574459,37.68441],[55.574631,37.684891],[55.575432,37.687099],[55.575649,37.687721],[55.576092,37.688889],[55.577709,37.69323],[55.579571,37.698189],[55.581402,37.703121],[55.581951,37.704578],[55.582272,37.705448],[55.582729,37.70668],[55.584511,37.711472],[55.585201,37.71331],[55.585819,37.714989],[55.586071,37.715672],[55.58654,37.716949],[55.587009,37.71822],[55.58749,37.719452],[55.587688,37.719952],[55.588299,37.72142],[55.588951,37.723],[55.589619,37.724548],[55.59016,37.725842],[55.591499,37.729031],[55.591949,37.73011],[55.593449,37.733688],[55.59478,37.736851],[55.594959,37.737309],[55.5952,37.737869],[55.595829,37.739429],[55.599812,37.748901],[55.600319,37.750092],[55.600761,37.751122],[55.601151,37.752041],[55.60165,37.753132],[55.602089,37.75404],[55.602669,37.755161],[55.603168,37.756088],[55.6063,37.761768],[55.60696,37.762981],[55.612579,37.77314],[55.616131,37.779572],[55.616459,37.78017],[55.616638,37.780491],[55.617081,37.7813],[55.617619,37.78228],[55.618858,37.784519],[55.619438,37.785568],[55.619869,37.786461],[55.620838,37.788631],[55.621399,37.789799],[55.621929,37.790821],[55.622391,37.791649],[55.624439,37.795361],[55.62495,37.796268],[55.625351,37.796909],[55.62574,37.797508],[55.626129,37.7981],[55.62619,37.798199],[55.626411,37.79847],[55.62669,37.798851],[55.62711,37.79945],[55.627621,37.800201],[55.62772,37.800331],[55.63179,37.806599],[55.638611,37.817032],[55.63908,37.817719],[55.640419,37.819771],[55.640659,37.820141],[55.643909,37.825119],[55.645351,37.827309],[55.647419,37.83049],[55.648521,37.83213],[55.648972,37.832802],[55.649021,37.83287],[55.649658,37.833721],[55.650372,37.834641],[55.65123,37.835602],[55.65181,37.83617],[55.652519,37.8368],[55.653511,37.837551],[55.654282,37.838051],[55.65493,37.838428],[55.655941,37.83894],[55.656559,37.839191],[55.657131,37.83939],[55.65794,37.839581],[55.65889,37.839771],[55.65974,37.839859],[55.660549,37.839901],[55.661308,37.839901],[55.662201,37.839809],[55.662971,37.839668],[55.663738,37.83947],[55.664799,37.839111],[55.670181,37.837132],[55.679001,37.83392],[55.682739,37.832371],[55.68362,37.832031],[55.68544,37.83136],[55.687061,37.830761],[55.6875,37.830589],[55.687778,37.830502],[55.68898,37.83012],[55.690079,37.829849],[55.691051,37.829689],[55.692001,37.829571],[55.692879,37.829521],[55.693741,37.829529],[55.694759,37.82959],[55.69569,37.829708],[55.696659,37.82988],[55.697041,37.82999],[55.697418,37.83009],[55.697479,37.830109],[55.69804,37.830269],[55.698479,37.830421],[55.69883,37.83054],[55.69899,37.830608],[55.6996,37.830849],[55.70039,37.831211],[55.701149,37.831589],[55.704849,37.833591],[55.705349,37.833851],[55.707619,37.83506],[55.708229,37.835381],[55.709419,37.83601],[55.709961,37.8363],[55.71011,37.83638],[55.712391,37.837589],[55.71328,37.838032],[55.71402,37.838322],[55.714729,37.838558],[55.715511,37.838741],[55.71656,37.838909],[55.72023,37.839359],[55.72298,37.839691],[55.728729,37.840382],[55.731949,37.840771],[55.732861,37.84087],[55.734409,37.841068],[55.736671,37.841351],[55.74012,37.841801],[55.740929,37.841881],[55.74213,37.84201],[55.74361,37.842098],[55.745289,37.842159],[55.747231,37.842251],[55.748741,37.8423],[55.74939,37.842319],[55.749931,37.842361],[55.75071,37.842419],[55.752129,37.84251],[55.753551,37.84259],[55.75523,37.84272],[55.755501,37.842739],[55.757359,37.84288],[55.757561,37.84288],[55.757641,37.84288],[55.758911,37.842892],[55.759331,37.842899],[55.760319,37.84296],[55.760971,37.842991],[55.762878,37.843102],[55.76572,37.843239],[55.766689,37.843288],[55.76738,37.843319],[55.767891,37.843349],[55.768021,37.843361],[55.768501,37.843391],[55.770119,37.843491],[55.770489,37.843491],[55.77145,37.843491],[55.772919,37.843342],[55.774342,37.843208],[55.77499,37.84338],[55.775249,37.843491],[55.775452,37.843689],[55.776039,37.844742],[55.77623,37.844978],[55.77705,37.845612],[55.777222,37.845779],[55.777351,37.84594],[55.777531,37.846272],[55.777889,37.847328],[55.778801,37.85104],[55.779202,37.852638],[55.779339,37.853279],[55.779732,37.85498],[55.782631,37.867538],[55.782661,37.867661],[55.783169,37.869801],[55.783279,37.870251],[55.78421,37.874069],[55.784538,37.875488],[55.78471,37.87619],[55.784889,37.876949],[55.78561,37.880032],[55.786098,37.882141],[55.78651,37.883801],[55.786739,37.884609],[55.78746,37.88699],[55.788448,37.890148],[55.78949,37.893379],[55.789871,37.894581],[55.790169,37.89555],[55.790199,37.895641],[55.791199,37.8988],[55.792561,37.903049],[55.793041,37.904652],[55.793282,37.905579],[55.793419,37.906479],[55.793461,37.90691],[55.793468,37.907089],[55.79348,37.907341],[55.793499,37.907871],[55.793499,37.908539],[55.79351,37.916191],[55.793522,37.91724],[55.79353,37.918259],[55.793549,37.921631],[55.79361,37.92384],[55.793732,37.927231],[55.793892,37.931759],[55.79398,37.934212],[55.793991,37.934639],[55.794022,37.935371],[55.794041,37.936089],[55.794109,37.937531],[55.794331,37.942131],[55.794441,37.944149],[55.794559,37.946301],[55.794571,37.946381],[55.794628,37.947529],[55.794731,37.948898],[55.794922,37.950771],[55.79525,37.95372],[55.795479,37.955669],[55.795589,37.95673],[55.795792,37.958351],[55.79586,37.9589],[55.79657,37.965309],[55.79681,37.96735],[55.796989,37.96891],[55.79707,37.969711],[55.797421,37.972721],[55.798012,37.97784],[55.798828,37.984989],[55.798981,37.98632],[55.799068,37.987122],[55.799309,37.989269],[55.799389,37.989929],[55.79995,37.99477],[55.800179,37.996861],[55.800678,38.001228],[55.80167,38.009972],[55.802582,38.017769],[55.802711,38.018841],[55.80275,38.019249],[55.804459,38.034031],[55.804798,38.036968],[55.805111,38.03968],[55.806099,38.048382],[55.80703,38.056568],[55.807659,38.062111],[55.807812,38.0634],[55.80801,38.065159],[55.808071,38.065659],[55.8083,38.067612],[55.808739,38.071411],[55.80938,38.07703],[55.809841,38.081131],[55.809959,38.082241],[55.81068,38.088501],[55.810719,38.08881],[55.81139,38.094582],[55.812359,38.10323],[55.81303,38.1092],[55.813881,38.116638],[55.81868,38.15852],[55.819,38.161419],[55.820221,38.172131],[55.820431,38.17411],[55.82132,38.181702],[55.821442,38.182949],[55.821461,38.183102],[55.821499,38.18354],[55.82225,38.190128],[55.822361,38.191101],[55.823551,38.20171],[55.824329,38.208481],[55.824909,38.213718],[55.8251,38.215611],[55.825329,38.218121],[55.82571,38.223591],[55.82608,38.228828],[55.826542,38.23563],[55.826778,38.239231],[55.827629,38.25211],[55.82795,38.25732],[55.828331,38.263401],[55.828781,38.2701],[55.829109,38.275379],[55.829342,38.280701],[55.829639,38.28738],[55.829659,38.287949],[55.82967,38.288231],[55.830051,38.29707],[55.830502,38.30489],[55.83194,38.33017],[55.83239,38.338009],[55.83342,38.35574],[55.833599,38.358952],[55.83403,38.366322],[55.834381,38.372669],[55.834702,38.377949],[55.83482,38.380878],[55.834839,38.382549],[55.83477,38.383881],[55.834599,38.385471],[55.833721,38.390701],[55.832951,38.395111],[55.832809,38.395908],[55.831779,38.401699],[55.8312,38.40456],[55.83094,38.405682],[55.830631,38.406898],[55.82999,38.408829],[55.82972,38.409592],[55.829151,38.41106],[55.828331,38.412979],[55.826809,38.416618],[55.826031,38.418549],[55.825748,38.419392],[55.825581,38.419949],[55.825089,38.42218],[55.824982,38.42305],[55.824871,38.42392],[55.82478,38.425251],[55.82473,38.426109],[55.82473,38.427311],[55.82476,38.428051],[55.824749,38.428509],[55.82481,38.429169],[55.824989,38.430969],[55.825199,38.432529],[55.825371,38.433399],[55.825699,38.434738],[55.826401,38.43708],[55.828979,38.44458],[55.83062,38.449169],[55.83115,38.45071],[55.832279,38.453861],[55.832829,38.455311],[55.833351,38.456581],[55.835171,38.46122],[55.83836,38.47044],[55.83844,38.47068],[55.839958,38.474972],[55.84132,38.47831],[55.842251,38.480808],[55.843899,38.484718],[55.849442,38.496941],[55.850368,38.499081],[55.851299,38.501099],[55.852501,38.50391],[55.853249,38.505562],[55.853828,38.507092],[55.854752,38.510052],[55.855492,38.5131],[55.85606,38.516289],[55.856522,38.519611],[55.85675,38.522591],[55.85672,38.52573],[55.8564,38.533169],[55.855999,38.541279],[55.85569,38.548031],[55.855461,38.55389],[55.855381,38.556011],[55.85527,38.558819],[55.855179,38.56089],[55.855011,38.565231],[55.854752,38.572048],[55.854591,38.575989],[55.854359,38.580959],[55.854198,38.58392],[55.853821,38.590309],[55.85355,38.594608],[55.853199,38.600342],[55.852901,38.605492],[55.852631,38.609772],[55.852612,38.610142],[55.85257,38.611061],[55.852402,38.613701],[55.85223,38.6166],[55.8522,38.617729],[55.85215,38.62241],[55.8521,38.625439],[55.852089,38.627972],[55.85202,38.63319],[55.851978,38.6376],[55.851929,38.641621],[55.851929,38.641899],[55.851871,38.646179],[55.85181,38.651909],[55.851761,38.656639],[55.851719,38.657131],[55.851452,38.658691],[55.850929,38.660412],[55.849529,38.664989],[55.848789,38.667549],[55.84853,38.668701],[55.84827,38.670448],[55.848209,38.671341],[55.848202,38.672771],[55.848221,38.674671],[55.84837,38.681469],[55.848541,38.689041],[55.848701,38.69688],[55.848831,38.70393],[55.84893,38.708691],[55.849152,38.718632],[55.849251,38.72348],[55.849361,38.728699],[55.849468,38.73336],[55.849529,38.736099],[55.849739,38.747841],[55.84996,38.75782],[55.85006,38.762772],[55.850109,38.76535],[55.85014,38.766449],[55.85014,38.76672],[55.850151,38.767639],[55.850201,38.77037],[55.850281,38.774529],[55.850449,38.782619],[55.85054,38.787449],[55.850739,38.797169],[55.85083,38.801781],[55.850929,38.806992],[55.851028,38.811989],[55.851151,38.817791],[55.851349,38.826908],[55.851452,38.83194],[55.851559,38.836769],[55.851669,38.84137],[55.85183,38.850101],[55.851959,38.854939],[55.852131,38.85675],[55.85244,38.859402],[55.852741,38.861851],[55.85297,38.86401],[55.853298,38.86705],[55.853371,38.86755],[55.853649,38.86882],[55.853851,38.869652],[55.854881,38.8736],[55.855572,38.876369],[55.856621,38.880428],[55.857498,38.883888],[55.857632,38.884441],[55.857899,38.885509],[55.858608,38.888271],[55.858761,38.888851],[55.859509,38.89172],[55.859638,38.892189],[55.86071,38.89637],[55.861301,38.898579],[55.86179,38.900471],[55.862309,38.90255],[55.866249,38.917938],[55.867081,38.921101],[55.869419,38.930328],[55.872372,38.945221],[55.873741,38.952301],[55.875,38.958649],[55.876041,38.962421],[55.876839,38.965401],[55.877029,38.96616],[55.878761,38.97385],[55.880711,38.982849],[55.88147,38.986351],[55.883362,38.9953],[55.88361,38.99654],[55.884048,38.998951],[55.884491,39.00079],[55.885399,39.004181],[55.886238,39.007469],[55.88715,39.010571],[55.88763,39.0121],[55.88805,39.013111],[55.896252,39.043819],[55.897362,39.047932],[55.897861,39.049789],[55.898151,39.051102],[55.898708,39.054008],[55.899109,39.05714],[55.899559,39.061008],[55.899792,39.063019],[55.899811,39.0634],[55.89986,39.063911],[55.899899,39.064449],[55.900002,39.065868],[55.900299,39.071079],[55.900551,39.0737],[55.90118,39.077179],[55.901691,39.079651],[55.901829,39.080311],[55.90213,39.081772],[55.905811,39.098789],[55.90694,39.10458],[55.91214,39.137428],[55.913052,39.14325],[55.913601,39.14687],[55.914108,39.150108],[55.91431,39.151501],[55.914421,39.152279],[55.914471,39.152599],[55.914822,39.154758],[55.915722,39.160469],[55.917042,39.168201],[55.9174,39.171108],[55.917789,39.17503],[55.918152,39.178669],[55.918442,39.181862],[55.91853,39.18288],[55.918919,39.186878],[55.919079,39.188759],[55.91988,39.199379],[55.920479,39.208561],[55.921219,39.21978],[55.921299,39.220951],[55.921619,39.22559],[55.92292,39.244621],[55.923351,39.250851],[55.926182,39.29248],[55.92696,39.3041],[55.927559,39.313049],[55.927952,39.318871],[55.928181,39.322529],[55.92836,39.325321],[55.92836,39.325371],[55.928421,39.326351],[55.928478,39.327202],[55.931431,39.37112],[55.93227,39.38385],[55.932812,39.391972],[55.933029,39.39529],[55.933151,39.397049],[55.934731,39.42107],[55.93491,39.423988],[55.936069,39.441189],[55.93721,39.45771],[55.93779,39.467388],[55.938061,39.46907],[55.93853,39.471161],[55.93972,39.475498],[55.941811,39.483219],[55.943611,39.499222],[55.943939,39.502159],[55.944931,39.511028],[55.94593,39.519939],[55.945969,39.520309],[55.952301,39.577099],[55.953369,39.586811],[55.955349,39.60461],[55.955799,39.60836],[55.956348,39.613419],[55.957291,39.622089],[55.957088,39.626629],[55.95681,39.632778],[55.95673,39.634609],[55.956711,39.635139],[55.956791,39.638279],[55.957359,39.64682],[55.958721,39.66798],[55.960369,39.69347],[55.960659,39.697731],[55.96085,39.700539],[55.96191,39.716789],[55.9622,39.72086],[55.96225,39.721691],[55.964409,39.75536],[55.964851,39.762169],[55.96489,39.762718],[55.96524,39.768108],[55.965439,39.774719],[55.965809,39.777882],[55.96764,39.784889],[55.98246,39.840961],[56.000141,39.908619],[56.000488,39.909969],[56.001431,39.913559],[56.001511,39.91383],[56.001701,39.91441],[56.002071,39.915791],[56.002529,39.917],[56.005741,39.92347],[56.007729,39.92849],[56.008629,39.931511],[56.008701,39.931782],[56.010071,39.936958],[56.011211,39.941299],[56.012619,39.94664],[56.013988,39.95166],[56.014,39.951679],[56.014729,39.95438],[56.017101,39.963089],[56.019081,39.970409],[56.019932,39.973541],[56.020969,39.97736],[56.021751,39.98024],[56.022251,39.982071],[56.022449,39.9828],[56.024139,39.989029],[56.024891,39.991821],[56.029888,40.01022],[56.033798,40.024639],[56.034512,40.027241],[56.036812,40.035728],[56.04406,40.06221],[56.04781,40.075932],[56.048531,40.07859],[56.050949,40.087429],[56.051281,40.08868],[56.05249,40.093159],[56.05315,40.095581],[56.060669,40.123489],[56.060928,40.1245],[56.06554,40.141541],[56.072929,40.169151],[56.073399,40.170849],[56.073719,40.172039],[56.076439,40.182251],[56.076839,40.1838],[56.0769,40.184021],[56.077229,40.185268],[56.078369,40.1894],[56.0798,40.195129],[56.08007,40.196331],[56.080158,40.196941],[56.080238,40.197891],[56.08025,40.19841],[56.080231,40.199059],[56.080151,40.19973],[56.080009,40.200539],[56.078861,40.20388],[56.078739,40.20433],[56.077461,40.207958],[56.075371,40.213879],[56.07259,40.221809],[56.07198,40.224579],[56.071739,40.22599],[56.071541,40.22797],[56.07151,40.231892],[56.071579,40.239571],[56.071621,40.242199],[56.071671,40.247181],[56.07172,40.251339],[56.071819,40.25576],[56.071899,40.264408],[56.072021,40.275421],[56.07201,40.277401],[56.071911,40.279362],[56.071751,40.281521],[56.071301,40.284851],[56.070419,40.289349],[56.070091,40.29105],[56.066311,40.311272],[56.065369,40.317341],[56.06509,40.320469],[56.064861,40.32436],[56.064812,40.32885],[56.06509,40.357712],[56.065109,40.36055],[56.064899,40.362999],[56.064381,40.365318],[56.063999,40.36647],[56.06348,40.368031],[56.062969,40.36956],[56.060211,40.37785],[56.058392,40.385189],[56.05584,40.401508],[56.05529,40.40506],[56.05397,40.413551],[56.053379,40.41769],[56.053059,40.422169],[56.053268,40.426491],[56.053631,40.429062],[56.054138,40.431789],[56.054539,40.433529],[56.055012,40.435131],[56.056149,40.438919],[56.057251,40.442509],[56.059212,40.448811],[56.059971,40.450859],[56.060799,40.45266],[56.061741,40.45451],[56.062462,40.455631],[56.063801,40.4575],[56.064159,40.457951],[56.06485,40.45874],[56.068939,40.462528],[56.07304,40.466202],[56.075062,40.468109],[56.076439,40.469688],[56.078892,40.473],[56.080009,40.47448],[56.080471,40.47506],[56.081928,40.476929],[56.082432,40.4776],[56.083141,40.478611],[56.0839,40.47998],[56.08466,40.481571],[56.085461,40.483891],[56.08606,40.486351],[56.089851,40.509869],[56.090389,40.513908],[56.092449,40.530998],[56.094212,40.545502],[56.095581,40.557201],[56.096889,40.568321],[56.097149,40.570969],[56.097328,40.57296],[56.09763,40.57518],[56.09798,40.577381],[56.098412,40.580799],[56.098591,40.58226],[56.099152,40.587151],[56.099369,40.589512],[56.099529,40.591148],[56.099812,40.593361],[56.100121,40.59547],[56.10041,40.597481],[56.102051,40.611118],[56.103661,40.624569],[56.103882,40.62677],[56.10405,40.629089],[56.10413,40.633461],[56.104019,40.641369],[56.103821,40.64497],[56.103828,40.648499],[56.10384,40.65242],[56.10363,40.661339],[56.103519,40.66444],[56.103489,40.667622],[56.103519,40.67067],[56.10334,40.683609],[56.103329,40.68642],[56.102959,40.711189],[56.102249,40.763199],[56.102329,40.76741],[56.102589,40.771111],[56.102612,40.771339],[56.102779,40.773022],[56.102951,40.774342],[56.103111,40.7756],[56.104851,40.787209],[56.10527,40.79002],[56.108238,40.809799],[56.111141,40.828381],[56.11182,40.83308],[56.112591,40.83646],[56.113392,40.839539],[56.114681,40.843609],[56.11602,40.84687],[56.118992,40.85318],[56.129902,40.876259],[56.13113,40.879059],[56.132191,40.881241],[56.132561,40.881989],[56.13348,40.88377],[56.134041,40.884899],[56.134701,40.88633],[56.137161,40.891621],[56.138111,40.893848],[56.139389,40.89642],[56.14061,40.898788],[56.146461,40.911152],[56.14753,40.91304],[56.14859,40.914761],[56.149818,40.91655],[56.151058,40.918201],[56.154869,40.922371],[56.158642,40.926521],[56.16753,40.93631],[56.173779,40.94326],[56.175091,40.94445],[56.176392,40.945431],[56.177738,40.946201],[56.1791,40.946781],[56.19043,40.950539],[56.190891,40.950729],[56.192089,40.95116],[56.192841,40.951611],[56.193321,40.95216],[56.193722,40.952839],[56.193989,40.95359],[56.19418,40.954418],[56.194321,40.955502],[56.19463,40.9617],[56.194931,40.968739],[56.195351,40.9744],[56.196018,40.986382],[56.196251,40.99144],[56.196758,41.00251],[56.197819,41.02309],[56.20219,41.11478],[56.20306,41.133041],[56.20385,41.149139],[56.2043,41.158642],[56.204361,41.15974],[56.206051,41.196301],[56.206631,41.206532],[56.207371,41.222488],[56.20882,41.251839],[56.211048,41.30019],[56.211201,41.303452],[56.212311,41.326351],[56.212448,41.33046],[56.216839,41.43071],[56.21756,41.447971],[56.218842,41.474659],[56.223141,41.56255],[56.225788,41.630322],[56.226082,41.63707],[56.226181,41.639389],[56.227459,41.669319],[56.22855,41.694981],[56.228828,41.701469],[56.228859,41.702179],[56.229172,41.709389],[56.230148,41.732349],[56.230259,41.73505],[56.230331,41.736679],[56.232471,41.786751],[56.232738,41.794498],[56.23291,41.79882],[56.23296,41.79998],[56.23317,41.805161],[56.233189,41.805889],[56.233589,41.817379],[56.234089,41.838871],[56.234402,41.85252],[56.23465,41.866039],[56.2351,41.8848],[56.23513,41.885979],[56.235168,41.887909],[56.2355,41.903431],[56.235889,41.921749],[56.236118,41.931831],[56.23632,41.94083],[56.23634,41.941792],[56.236351,41.94276],[56.23637,41.94421],[56.236561,41.952782],[56.23658,41.954411],[56.236591,41.95488],[56.236629,41.956581],[56.236629,41.956711],[56.236881,41.966068],[56.236931,41.97105],[56.236969,41.973549],[56.237,41.974812],[56.237041,41.976479],[56.237049,41.97715],[56.237061,41.97784],[56.23724,41.98439],[56.237301,41.98632],[56.23732,41.98719],[56.23737,41.98933],[56.237419,41.992352],[56.23745,41.993832],[56.237461,41.994499],[56.237541,41.99876],[56.237549,41.99931],[56.237621,42.00243],[56.237652,42.004131],[56.237789,42.009571],[56.23793,42.017139],[56.237999,42.02042],[56.238091,42.02457],[56.238201,42.02961],[56.238239,42.030991],[56.238331,42.034069],[56.238392,42.036381],[56.238419,42.037552],[56.238468,42.039661],[56.23851,42.041389],[56.238541,42.042309],[56.238659,42.047852],[56.238789,42.053452],[56.238899,42.058681],[56.238918,42.059441],[56.238991,42.062641],[56.239029,42.06456],[56.239059,42.066071],[56.239079,42.066719],[56.23912,42.068748],[56.23912,42.069061],[56.239128,42.069359],[56.239159,42.070831],[56.239262,42.075661],[56.239281,42.0765],[56.239319,42.07877],[56.23938,42.081821],[56.239422,42.083851],[56.23946,42.086319],[56.239498,42.088009],[56.239571,42.090832],[56.239658,42.09568],[56.2397,42.097988],[56.239719,42.099369],[56.239738,42.101269],[56.23975,42.101719],[56.239712,42.102219],[56.2397,42.102371],[56.239609,42.10305],[56.239429,42.10384],[56.239231,42.104568],[56.23909,42.105],[56.238941,42.105389],[56.238762,42.10577],[56.238419,42.106441],[56.238049,42.10704],[56.23793,42.10722],[56.23737,42.10807],[56.236279,42.109791],[56.235409,42.11121],[56.234341,42.112789],[56.23365,42.113869],[56.232689,42.115391],[56.231682,42.117001],[56.230629,42.11869],[56.22974,42.120159],[56.22879,42.121719],[56.22765,42.12347],[56.226768,42.124859],[56.22617,42.125839],[56.225601,42.126751],[56.225189,42.127468],[56.224949,42.127869],[56.224731,42.12825],[56.224499,42.128681],[56.22414,42.129459],[56.223801,42.130241],[56.22337,42.131451],[56.222969,42.132702],[56.222679,42.13369],[56.22237,42.13488],[56.222351,42.134972],[56.222271,42.13533],[56.222191,42.13578],[56.221951,42.136971],[56.221802,42.137798],[56.22171,42.138329],[56.22163,42.13887],[56.221539,42.139568],[56.22147,42.140251],[56.221359,42.141621],[56.22126,42.14344],[56.22121,42.144508],[56.221111,42.1465],[56.221081,42.147301],[56.221039,42.147991],[56.220989,42.149342],[56.220951,42.150242],[56.22086,42.151829],[56.220829,42.152328],[56.22076,42.153728],[56.220661,42.156261],[56.22057,42.158321],[56.220482,42.16037],[56.22044,42.16106],[56.220379,42.162239],[56.220242,42.1651],[56.220131,42.167999],[56.22007,42.169552],[56.220032,42.17033],[56.21991,42.172489],[56.219849,42.17411],[56.21983,42.17485],[56.219749,42.17614],[56.219639,42.17831],[56.219559,42.180012],[56.219509,42.181019],[56.21946,42.182041],[56.219452,42.182171],[56.219391,42.183201],[56.219341,42.18401],[56.219269,42.185101],[56.219189,42.18644],[56.219109,42.187599],[56.218929,42.190868],[56.218849,42.192341],[56.218769,42.193939],[56.218719,42.19487],[56.218681,42.195591],[56.218639,42.196548],[56.218578,42.19772],[56.218491,42.199581],[56.21841,42.201229],[56.21833,42.202839],[56.218288,42.203579],[56.218239,42.204659],[56.218159,42.206322],[56.218151,42.206532],[56.218102,42.207401],[56.218021,42.209061],[56.217918,42.211029],[56.21785,42.212399],[56.217781,42.213848],[56.217659,42.216492],[56.217541,42.218849],[56.217419,42.221321],[56.21735,42.222679],[56.217281,42.22393],[56.217239,42.22472],[56.21714,42.226871],[56.217079,42.228149],[56.21703,42.229679],[56.216999,42.230999],[56.216961,42.2323],[56.216888,42.233879],[56.216831,42.235279],[56.216728,42.237122],[56.21664,42.238911],[56.21656,42.24078],[56.216412,42.243759],[56.216209,42.245811],[56.215931,42.247929],[56.215611,42.24984],[56.215359,42.251202],[56.215031,42.25272],[56.21471,42.254009],[56.214241,42.255501],[56.213951,42.25647],[56.21389,42.25666],[56.2136,42.25761],[56.213039,42.259548],[56.212559,42.261139],[56.211979,42.263111],[56.21138,42.26503],[56.210609,42.267651],[56.209949,42.269829],[56.209171,42.272491],[56.208221,42.275631],[56.207611,42.277748],[56.20694,42.27998],[56.206249,42.282349],[56.205791,42.283871],[56.205238,42.28566],[56.20525,42.28627],[56.20401,42.290192],[56.203461,42.2924],[56.20311,42.31216],[56.202709,42.350479],[56.202141,42.353569],[56.20055,42.358742],[56.19643,42.370819],[56.192322,42.383091],[56.187889,42.39357],[56.180851,42.4077],[56.174171,42.41687],[56.173489,42.41782],[56.17289,42.41898],[56.172581,42.42009],[56.172379,42.421188],[56.170639,42.432362],[56.169659,42.43837],[56.16935,42.441959],[56.165829,42.482651],[56.164501,42.491241],[56.159721,42.51355],[56.15876,42.520081],[56.159119,42.531361],[56.15947,42.544979],[56.160858,42.594921],[56.161251,42.60453],[56.16552,42.619999],[56.172901,42.646759],[56.173481,42.649509],[56.178452,42.65913],[56.191662,42.686031],[56.19186,42.686432],[56.193371,42.689461],[56.196049,42.695148],[56.196758,42.698891],[56.197948,42.70261],[56.218712,42.76685],[56.220501,42.772598],[56.221661,42.77668],[56.223629,42.782749],[56.224579,42.78558],[56.226028,42.789421],[56.226971,42.792339],[56.22842,42.79681],[56.229061,42.798882],[56.23,42.802238],[56.230999,42.805901],[56.24231,42.84774],[56.242371,42.84795],[56.249691,42.874859],[56.256721,42.90099],[56.260399,42.91436],[56.26405,42.927792],[56.27478,42.967529],[56.275219,42.969231],[56.27552,42.970509],[56.275791,42.971901],[56.275982,42.973129],[56.27615,42.97443],[56.27631,42.976299],[56.276451,42.978531],[56.276951,42.98867],[56.277401,42.998749],[56.278488,43.02235],[56.280121,43.058609],[56.2817,43.09417],[56.28487,43.16291],[56.285,43.165661],[56.28511,43.16753],[56.286179,43.19146],[56.28981,43.27335],[56.293308,43.355141],[56.293659,43.3633],[56.298222,43.473461],[56.298351,43.476559],[56.298439,43.478661],[56.30085,43.538639],[56.300961,43.541592],[56.301022,43.542969],[56.30117,43.54668],[56.301609,43.557201],[56.301689,43.559189],[56.301788,43.56168],[56.302059,43.56789],[56.302711,43.58334],[56.30302,43.590809],[56.303028,43.59116],[56.303051,43.591572],[56.303471,43.601101],[56.304211,43.618938],[56.304508,43.625919],[56.304779,43.63308],[56.30534,43.648609],[56.305931,43.66502],[56.3064,43.678478],[56.306499,43.681099],[56.306599,43.684059],[56.30685,43.690491],[56.306889,43.691631],[56.30698,43.693989],[56.307541,43.709881],[56.308159,43.726921],[56.308701,43.742699],[56.308842,43.746109],[56.308861,43.74688],[56.309269,43.759121],[56.309689,43.770309],[56.309891,43.77544],[56.31036,43.788029],[56.31041,43.78923],[56.31052,43.79203],[56.31076,43.798061],[56.310822,43.799671],[56.310879,43.800941],[56.31118,43.808899],[56.311352,43.81353],[56.311588,43.819901],[56.31181,43.825691],[56.311871,43.826111],[56.311878,43.82626],[56.311951,43.828098],[56.312481,43.84042],[56.312481,43.84058],[56.3125,43.84108],[56.312569,43.84277],[56.312729,43.846748],[56.312771,43.847858],[56.312908,43.851131],[56.313179,43.858212],[56.313381,43.86322],[56.313339,43.86388],[56.31329,43.864182],[56.31319,43.864399],[56.31303,43.864601],[56.312889,43.864811],[56.312809,43.86499],[56.312752,43.865238],[56.312729,43.86554],[56.31271,43.865829],[56.312649,43.866119],[56.312569,43.866451],[56.312401,43.86694],[56.31234,43.867142],[56.31226,43.867359],[56.312019,43.868],[56.31189,43.868252],[56.311749,43.868431],[56.311569,43.86861],[56.311371,43.868721],[56.31123,43.86879],[56.311039,43.868851],[56.310219,43.869301],[56.309959,43.869438],[56.308971,43.86998],[56.30854,43.870209],[56.307701,43.87067],[56.30727,43.870861],[56.306358,43.871262],[56.30381,43.872391],[56.30378,43.87241],[56.302429,43.873341],[56.301121,43.874241],[56.300819,43.874489],[56.300529,43.874741],[56.30027,43.87495],[56.299419,43.875721],[56.298512,43.876701],[56.296959,43.878609],[56.29636,43.87933],[56.296249,43.879471],[56.295639,43.880219],[56.292381,43.884319],[56.29105,43.88586],[56.290588,43.886318],[56.290161,43.886688],[56.289589,43.887131],[56.288311,43.88802],[56.285702,43.889679],[56.28524,43.890011],[56.284592,43.890591],[56.284111,43.89122],[56.283798,43.891769],[56.283489,43.89238],[56.283249,43.89304],[56.282909,43.894009],[56.28241,43.895481],[56.28233,43.895679],[56.282242,43.895889],[56.282108,43.896191],[56.281689,43.896961],[56.281368,43.897442],[56.280849,43.898109],[56.279018,43.900459],[56.277939,43.90184],[56.275742,43.904671],[56.275139,43.905418],[56.273869,43.907001],[56.271389,43.910061],[56.27079,43.910809],[56.27037,43.91135],[56.26947,43.912491],[56.268799,43.913399],[56.267921,43.914761],[56.26685,43.916649],[56.265621,43.918991],[56.26532,43.919529],[56.265091,43.919971],[56.26498,43.92017],[56.264561,43.92083],[56.26289,43.923988],[56.259861,43.9296],[56.258461,43.93219],[56.257511,43.93396],[56.25581,43.937119],[56.255291,43.93811],[56.25526,43.93816],[56.254051,43.940411],[56.253658,43.94112],[56.25359,43.94136],[56.247311,43.952999],[56.24699,43.953442],[56.246658,43.954079],[56.246319,43.954781],[56.2458,43.956051],[56.245468,43.956982],[56.245251,43.957668],[56.244961,43.95874],[56.244759,43.959629],[56.244659,43.96011],[56.24461,43.960312],[56.244431,43.96151],[56.244259,43.9632],[56.24329,43.969559],[56.242779,43.972801],[56.242569,43.974159],[56.241779,43.979431],[56.24115,43.98365],[56.240299,43.989269],[56.240002,43.991211],[56.239479,43.994652],[56.239391,43.995251],[56.239059,43.997501],[56.238861,43.998791],[56.23848,44.001282],[56.237991,44.00481],[56.237598,44.007809],[56.236511,44.016102],[56.23597,44.020561],[56.235611,44.023499],[56.23531,44.025822],[56.235142,44.027859],[56.234989,44.029701],[56.234871,44.031559],[56.234852,44.033421],[56.234821,44.035389],[56.234798,44.037701],[56.234859,44.039421],[56.23494,44.041561],[56.234959,44.042831],[56.23494,44.04459],[56.234901,44.046188],[56.234798,44.04805],[56.234711,44.04911],[56.234631,44.050011],[56.234371,44.052341],[56.234089,44.054321],[56.23373,44.056801],[56.233471,44.058552],[56.233158,44.060539],[56.232841,44.062511],[56.232368,44.064899],[56.23204,44.066311],[56.231579,44.067959],[56.230968,44.06966],[56.230179,44.071381],[56.22961,44.07238],[56.229092,44.07309],[56.228531,44.073719],[56.22784,44.074341],[56.227322,44.07473],[56.22718,44.074841],[56.226452,44.07531],[56.225849,44.07563],[56.225422,44.07584],[56.224709,44.076099],[56.224461,44.07616],[56.224079,44.076279],[56.222832,44.076618],[56.222149,44.076801],[56.221401,44.077],[56.221279,44.07703],[56.221031,44.077099],[56.219299,44.077549],[56.218559,44.077789],[56.218239,44.0779],[56.21714,44.078289],[56.216202,44.07869],[56.214901,44.07935],[56.213631,44.080139],[56.212791,44.080719],[56.2122,44.0812],[56.21196,44.081409],[56.210991,44.08226],[56.209549,44.084049],[56.208542,44.085522],[56.20752,44.087189],[56.206581,44.088951],[56.20557,44.091019],[56.204281,44.093899],[56.202381,44.098438],[56.200378,44.103588],[56.1991,44.10717],[56.19838,44.109509],[56.197811,44.111912],[56.197239,44.11475],[56.196892,44.116421],[56.19648,44.11845],[56.1959,44.120911],[56.195431,44.122639],[56.19519,44.12355],[56.194889,44.124451],[56.194031,44.126621],[56.19368,44.127392],[56.192139,44.130371],[56.184631,44.1441],[56.18375,44.145748],[56.183289,44.14687],[56.18206,44.149559],[56.181019,44.151909],[56.18055,44.152851],[56.180149,44.153339],[56.179749,44.153751],[56.179279,44.154121],[56.178768,44.15432],[56.17852,44.1544],[56.17807,44.154442],[56.17754,44.154362],[56.1758,44.153782],[56.17519,44.15361],[56.174358,44.1534],[56.172741,44.153111],[56.171921,44.153011],[56.170971,44.153091],[56.1702,44.153309],[56.169479,44.15358],[56.167912,44.154518],[56.167179,44.154819],[56.166439,44.155022],[56.165722,44.15506],[56.164558,44.154861],[56.162151,44.154259],[56.16098,44.154011],[56.16011,44.153992],[56.15934,44.154072],[56.159271,44.154091],[56.158569,44.154289],[56.157799,44.154652],[56.15654,44.155418],[56.154202,44.156952],[56.152458,44.158081],[56.152191,44.15826],[56.151131,44.158859],[56.150391,44.15918],[56.149712,44.15934],[56.148991,44.159351],[56.14843,44.159248],[56.147739,44.159031],[56.146961,44.15876],[56.14455,44.15778],[56.142811,44.157021],[56.14106,44.156429],[56.139969,44.156181],[56.13829,44.15604],[56.13681,44.15617],[56.13583,44.156361],[56.134491,44.156769],[56.132931,44.157539],[56.131821,44.158249],[56.130699,44.159069],[56.128441,44.161259],[56.12693,44.162819],[56.126362,44.163399],[56.12606,44.163509],[56.12534,44.163601],[56.125229,44.163601],[56.12508,44.163631],[56.124931,44.163719],[56.12479,44.163849],[56.12468,44.16404],[56.124569,44.164322],[56.124561,44.164581],[56.12447,44.165009],[56.124352,44.16531],[56.124161,44.165581],[56.11639,44.172829],[56.114761,44.175751],[56.114281,44.18227],[56.113708,44.20322],[56.118099,44.20797],[56.120731,44.212132],[56.122238,44.217312],[56.123001,44.221142],[56.124619,44.233261],[56.124748,44.236141],[56.124519,44.23875],[56.123379,44.245941],[56.123192,44.248219],[56.123291,44.25174],[56.123562,44.253281],[56.123821,44.254478],[56.124229,44.25581],[56.124779,44.257179],[56.125118,44.257881],[56.125809,44.259491],[56.126011,44.260029],[56.126171,44.260712],[56.126259,44.261318],[56.126282,44.26189],[56.12627,44.26244],[56.12616,44.263191],[56.125919,44.264118],[56.125099,44.265911],[56.124939,44.2663],[56.124069,44.267879],[56.123779,44.26833],[56.12331,44.26902],[56.122421,44.270199],[56.12162,44.271191],[56.119259,44.273941],[56.118172,44.275181],[56.116798,44.276749],[56.116131,44.277519],[56.116051,44.277611],[56.110699,44.283699],[56.110271,44.284191],[56.109791,44.284729],[56.109711,44.28484],[56.10701,44.287941],[56.106419,44.288818],[56.105862,44.289761],[56.105419,44.290649],[56.105,44.29166],[56.10062,44.3041],[56.100159,44.305382],[56.099739,44.306492],[56.099602,44.306808],[56.099461,44.307152],[56.099281,44.307499],[56.09911,44.3078],[56.09856,44.308731],[56.098141,44.309391],[56.097229,44.31078],[56.096748,44.311501],[56.096439,44.311989],[56.096069,44.312691],[56.095699,44.313511],[56.09544,44.314381],[56.095169,44.315392],[56.09502,44.316132],[56.094589,44.31863],[56.094391,44.319469],[56.094189,44.32019],[56.093269,44.323238],[56.092361,44.326302],[56.092079,44.327221],[56.091511,44.32906],[56.09087,44.33099],[56.089882,44.33382],[56.08746,44.34079],[56.085609,44.346218],[56.08498,44.348091],[56.078499,44.367161],[56.07822,44.367901],[56.0779,44.368568],[56.077641,44.369019],[56.077221,44.369598],[56.076939,44.36993],[56.07653,44.370312],[56.076092,44.37064],[56.075611,44.37093],[56.07449,44.37151],[56.072449,44.37249],[56.07077,44.37331],[56.070179,44.3736],[56.06971,44.373821],[56.06889,44.374222],[56.06757,44.374809],[56.06712,44.37505],[56.066761,44.375278],[56.06636,44.37561],[56.066021,44.375938],[56.06572,44.376289],[56.065331,44.376808],[56.06496,44.37743],[56.064522,44.378269],[56.06411,44.37928],[56.06295,44.382271],[56.061211,44.386551],[56.06065,44.38792],[56.060341,44.388691],[56.059681,44.390308],[56.058399,44.393452],[56.05621,44.3988],[56.048389,44.418091],[56.046501,44.422661],[56.046261,44.423382],[56.04607,44.42403],[56.045879,44.42485],[56.0457,44.425869],[56.045631,44.426609],[56.045601,44.427601],[56.04567,44.43103],[56.045658,44.43306],[56.045601,44.433769],[56.045422,44.43491],[56.045189,44.43594],[56.044868,44.43692],[56.04438,44.438099],[56.043289,44.44075],[56.042999,44.441589],[56.042721,44.442501],[56.042519,44.443401],[56.04229,44.444969],[56.04158,44.452389],[56.040192,44.46664],[56.03883,44.480659],[56.038719,44.481689],[56.03862,44.48259],[56.038479,44.483471],[56.0383,44.48428],[56.03804,44.485199],[56.032162,44.502251],[56.031761,44.503448],[56.03149,44.50462],[56.031231,44.505871],[56.031078,44.50705],[56.030899,44.510342],[56.029461,44.545521],[56.028801,44.55407],[56.028011,44.56155],[56.02747,44.568169],[56.027908,44.584888],[56.027229,44.601978],[56.027962,44.60656],[56.02803,44.60738],[56.028179,44.608879],[56.027988,44.613171],[56.02737,44.620541],[56.026791,44.622929],[56.025871,44.624432],[56.025089,44.624889],[56.023769,44.625179],[56.01659,44.625172],[56.015221,44.62529],[56.014061,44.625511],[56.01297,44.625832],[56.011951,44.626362],[56.007408,44.628609],[56.006721,44.629009],[56.0061,44.62944],[56.005871,44.629589],[56.005348,44.630001],[56.004879,44.63052],[56.004238,44.631302],[56.003769,44.631981],[56.002949,44.633129],[56.001518,44.635151],[55.99966,44.63776],[55.998241,44.63979],[55.99741,44.640949],[55.99712,44.641411],[55.996738,44.642159],[55.996521,44.642689],[55.996262,44.643299],[55.996029,44.64399],[55.99559,44.645599],[55.995281,44.647511],[55.995129,44.649059],[55.994919,44.652161],[55.994518,44.658161],[55.99395,44.666309],[55.993889,44.667858],[55.9939,44.66943],[55.998219,44.71011],[55.998539,44.712761],[55.998741,44.713772],[55.999039,44.71479],[55.99942,44.715759],[56,44.71698],[56.00106,44.719109],[56.00182,44.720669],[56.002209,44.721561],[56.00251,44.722279],[56.002708,44.7229],[56.002911,44.72369],[56.003139,44.72504],[56.00322,44.72617],[56.003151,44.72768],[56.002838,44.730659],[56.00259,44.734131],[56.001751,44.74255],[56.00153,44.744381],[56.00132,44.74527],[56.00106,44.745949],[56.00074,44.74662],[55.999279,44.748779],[55.992989,44.757961],[55.990791,44.761318],[55.99033,44.762321],[55.990009,44.76318],[55.989819,44.764069],[55.989719,44.76498],[55.9897,44.765968],[55.99073,44.773331],[55.992962,44.788288],[55.997372,44.81881],[55.997601,44.820049],[55.99781,44.82066],[55.999069,44.823261],[56.004459,44.834709],[56.005829,44.837769],[56.006161,44.83881],[56.006748,44.841309],[56.011189,44.860889],[56.011292,44.861591],[56.011341,44.862282],[56.011372,44.863121],[56.011292,44.86404],[56.01112,44.864929],[56.01088,44.865551],[56.009129,44.869228],[56.008862,44.870022],[56.008659,44.87093],[56.008221,44.873871],[56.005791,44.88974],[56.005718,44.890362],[56.005669,44.890942],[56.005661,44.891472],[56.00568,44.89201],[56.005779,44.89299],[56.007172,44.900478],[56.010979,44.920929],[56.011169,44.922211],[56.011269,44.923309],[56.01128,44.924629],[56.011219,44.925812],[56.01107,44.92696],[56.01088,44.928028],[56.01038,44.92984],[56.009178,44.934361],[56.00882,44.936081],[56.00861,44.93779],[56.008499,44.939602],[56.00845,44.941158],[56.008499,44.94244],[56.008629,44.943741],[56.016418,44.996269],[56.016571,44.997238],[56.016651,44.998199],[56.016651,44.999229],[56.016579,45.000408],[56.01646,45.001598],[56.015572,45.008961],[56.014961,45.014542],[56.01482,45.015701],[56.01453,45.018242],[56.013649,45.026249],[56.013618,45.02721],[56.013519,45.03426],[56.013458,45.039619],[56.0135,45.04118],[56.013618,45.042728],[56.013851,45.044189],[56.01667,45.059238],[56.016972,45.061581],[56.017262,45.06358],[56.017792,45.06654],[56.01825,45.068859],[56.01857,45.069988],[56.019001,45.071701],[56.019669,45.07513],[56.021061,45.082458],[56.021461,45.084579],[56.022079,45.087971],[56.022369,45.089191],[56.023079,45.09153],[56.032928,45.121109],[56.033489,45.122829],[56.03371,45.1236],[56.03389,45.12447],[56.033981,45.125229],[56.034012,45.125919],[56.033951,45.140442],[56.033981,45.141682],[56.03405,45.142712],[56.034149,45.143501],[56.034302,45.14452],[56.03447,45.14547],[56.036381,45.15469],[56.037941,45.162331],[56.03825,45.163601],[56.038639,45.164841],[56.04472,45.18079],[56.0452,45.182331],[56.045761,45.18428],[56.046219,45.18568],[56.05463,45.209648],[56.055241,45.21146],[56.056541,45.215519],[56.05685,45.216721],[56.05695,45.21751],[56.056931,45.218281],[56.056839,45.219101],[56.055882,45.224049],[56.055679,45.224819],[56.05537,45.225571],[56.055038,45.226059],[56.054619,45.226501],[56.052269,45.22813],[56.05188,45.228588],[56.051609,45.228958],[56.051338,45.229519],[56.051128,45.230221],[56.050152,45.234531],[56.050018,45.235241],[56.04998,45.235939],[56.049992,45.236629],[56.050049,45.237339],[56.050549,45.241348],[56.050812,45.24242],[56.05117,45.243542],[56.054352,45.252941],[56.054729,45.254261],[56.057491,45.26442],[56.057732,45.265572],[56.057899,45.266819],[56.06147,45.302731],[56.06155,45.30365],[56.061569,45.3046],[56.06155,45.305679],[56.059879,45.333832],[56.059811,45.334759],[56.05975,45.335331],[56.05962,45.335831],[56.059311,45.336651],[56.05505,45.3456],[56.054668,45.346481],[56.054428,45.347198],[56.054138,45.348209],[56.053459,45.350941],[56.048328,45.371361],[56.045738,45.383511],[56.045441,45.385231],[56.045231,45.386841],[56.045151,45.388439],[56.045139,45.390099],[56.045349,45.412231],[56.04546,45.416229],[56.045818,45.427399],[56.04599,45.433071],[56.046089,45.43544],[56.046261,45.43782],[56.048069,45.462238],[56.048229,45.464199],[56.048649,45.4678],[56.04969,45.476719],[56.049881,45.478939],[56.050049,45.481541],[56.05159,45.50951],[56.05167,45.511181],[56.051689,45.512569],[56.051651,45.513699],[56.051338,45.521839],[56.051022,45.52972],[56.05093,45.531212],[56.050331,45.5387],[56.050159,45.542641],[56.04998,45.547421],[56.049931,45.549541],[56.049801,45.556591],[56.04974,45.558392],[56.049622,45.559582],[56.04945,45.560902],[56.042751,45.60685],[56.042622,45.608101],[56.042542,45.609371],[56.0425,45.610531],[56.042519,45.611721],[56.043781,45.639339],[56.043911,45.642521],[56.043968,45.64629],[56.043991,45.648689],[56.044109,45.65126],[56.044941,45.669449],[56.046001,45.69286],[56.047169,45.718689],[56.047298,45.721008],[56.047428,45.72295],[56.04747,45.723801],[56.047531,45.72514],[56.047611,45.72768],[56.047642,45.729301],[56.047729,45.73056],[56.047878,45.732529],[56.0481,45.73505],[56.049339,45.76276],[56.05212,45.825199],[56.052471,45.833271],[56.052521,45.834949],[56.052521,45.83625],[56.052479,45.837379],[56.052319,45.83881],[56.05183,45.8419],[56.05162,45.843281],[56.051498,45.844559],[56.05138,45.84687],[56.05125,45.8498],[56.051159,45.851379],[56.050831,45.854912],[56.050701,45.856312],[56.049992,45.862358],[56.049831,45.864239],[56.049709,45.86623],[56.049679,45.86813],[56.049728,45.876091],[56.049679,45.88908],[56.04977,45.914181],[56.04974,45.917419],[56.049679,45.918701],[56.049541,45.919899],[56.04932,45.921299],[56.049019,45.9226],[56.04644,45.932362],[56.043549,45.943329],[56.040409,45.955261],[56.038261,45.96336],[56.03299,45.983471],[56.031689,45.988319],[56.03056,45.99202],[56.029942,45.994209],[56.029259,45.997021],[56.02877,45.999298],[56.02837,46.0009],[56.027851,46.002811],[56.027481,46.00399],[56.027149,46.005001],[56.024632,46.011688],[56.0242,46.01265],[56.023731,46.01347],[56.023338,46.013981],[56.022781,46.014511],[56.013191,46.021309],[56.01276,46.021709],[56.01244,46.02203],[56.012001,46.022621],[56.010399,46.025391],[56.000919,46.041672],[56.000729,46.042179],[56.000549,46.042931],[56.0005,46.043468],[56.000519,46.044189],[56.001808,46.052929],[56.00206,46.05484],[56.002281,46.057281],[56.002369,46.059891],[56.002361,46.062141],[56.0023,46.06382],[56.00206,46.06641],[56.001732,46.06881],[56.00156,46.07061],[56.001492,46.071232],[56.001389,46.07185],[56.001308,46.072269],[56.001221,46.072941],[56.00119,46.07328],[56.00116,46.07373],[56.001141,46.073952],[56.001122,46.074341],[56.001099,46.074928],[56.001091,46.075539],[56.00108,46.076149],[56.001049,46.076752],[56.00053,46.083248],[55.999199,46.09798],[55.99498,46.14637],[55.994808,46.148331],[55.99472,46.149422],[55.994701,46.149609],[55.99176,46.183311],[55.991692,46.18539],[55.991638,46.186008],[55.991428,46.188259],[55.991402,46.19009],[55.991539,46.191662],[55.991871,46.193192],[55.99226,46.19455],[55.99284,46.195869],[55.993382,46.196812],[55.99437,46.198441],[55.995071,46.199669],[55.999889,46.20805],[56.00531,46.217491],[56.023251,46.24873],[56.02623,46.251999],[56.0299,46.251999],[56.03352,46.251999],[56.035919,46.251999],[56.037731,46.254398],[56.038311,46.25835],[56.039459,46.27895],[56.041672,46.29525],[56.046558,46.307789],[56.048191,46.31345],[56.048672,46.31723],[56.04723,46.332329],[56.04541,46.343491],[56.041759,46.352589],[56.041859,46.360661],[56.043789,46.388691],[56.043659,46.392811],[56.043491,46.39859],[56.043449,46.401878],[56.043591,46.405979],[56.04475,46.41238],[56.046619,46.41885],[56.053459,46.44117],[56.05431,46.446171],[56.054729,46.451389],[56.054611,46.45636],[56.05423,46.461418],[56.05331,46.47226],[56.053188,46.473629],[56.053181,46.474159],[56.053089,46.481258],[56.052898,46.485489],[56.052528,46.489059],[56.052441,46.49054],[56.05159,46.49752],[56.0509,46.50153],[56.049671,46.506149],[56.04829,46.509941],[56.046009,46.515419],[56.04472,46.51873],[56.044022,46.521999],[56.043678,46.529739],[56.04335,46.53318],[56.042351,46.53688],[56.035011,46.55698],[56.033741,46.56041],[56.032841,46.563221],[56.032211,46.565639],[56.031391,46.57016],[56.029469,46.585281],[56.028889,46.595551],[56.028278,46.6063],[56.027569,46.619801],[56.027309,46.626148],[56.027309,46.627911],[56.027512,46.629749],[56.027939,46.632141],[56.02964,46.639069],[56.031391,46.645939],[56.033852,46.656311],[56.034889,46.660709],[56.035099,46.66254],[56.036781,46.69265],[56.037251,46.697632],[56.0387,46.703979],[56.0387,46.707932],[56.037731,46.721489],[56.039558,46.728699],[56.042339,46.737801],[56.04314,46.746071],[56.04319,46.748631],[56.042961,46.750309],[56.041538,46.754669],[56.040661,46.758701],[56.040581,46.759079],[56.040421,46.759769],[56.03957,46.765049],[56.03772,46.77631],[56.036991,46.780369],[56.0368,46.78244],[56.036869,46.786209],[56.0392,46.803761],[56.039871,46.80917],[56.039822,46.810558],[56.038109,46.81823],[56.036789,46.824089],[56.036869,46.82579],[56.03714,46.826839],[56.038311,46.831009],[56.03957,46.835312],[56.041149,46.839378],[56.04311,46.844231],[56.043839,46.846352],[56.04438,46.848721],[56.045879,46.855339],[56.04665,46.8587],[56.047611,46.86174],[56.047932,46.86235],[56.049171,46.864792],[56.050739,46.868031],[56.05175,46.870609],[56.055851,46.88237],[56.05761,46.887409],[56.062759,46.901951],[56.064739,46.907742],[56.065029,46.90863],[56.06554,46.910461],[56.066238,46.912868],[56.066681,46.91515],[56.067039,46.91732],[56.067291,46.920391],[56.067451,46.923191],[56.067589,46.927719],[56.067719,46.931561],[56.068031,46.935589],[56.068279,46.938339],[56.068352,46.942348],[56.068211,46.946701],[56.068069,46.948849],[56.067928,46.951],[56.067291,46.957489],[56.06702,46.962231],[56.06741,46.966591],[56.070992,46.979061],[56.072788,46.985001],[56.07473,46.98983],[56.076599,46.994331],[56.078522,46.998268],[56.08009,46.9995],[56.08173,47.000271],[56.086712,47.000271],[56.09016,47.000099],[56.093441,47.00481],[56.09473,47.007542],[56.095901,47.010571],[56.097309,47.017738],[56.098011,47.021351],[56.099701,47.029541],[56.100319,47.031738],[56.10128,47.034081],[56.103828,47.039719],[56.105461,47.043171],[56.105839,47.043861],[56.106319,47.045059],[56.10738,47.05011],[56.107681,47.0527],[56.1077,47.055019],[56.107552,47.0574],[56.10709,47.06049],[56.1063,47.063309],[56.105301,47.065731],[56.101891,47.073051],[56.09856,47.08017],[56.097729,47.08242],[56.096951,47.085232],[56.095699,47.090679],[56.095421,47.092789],[56.095249,47.096661],[56.095261,47.102612],[56.095139,47.104542],[56.09481,47.107121],[56.094398,47.109299],[56.09375,47.11121],[56.093029,47.11285],[56.091702,47.11507],[56.091091,47.116089],[56.091,47.116241],[56.089619,47.118511],[56.085571,47.125172],[56.08503,47.125961],[56.084919,47.12611],[56.084301,47.126968],[56.082741,47.12915],[56.082001,47.130772],[56.081478,47.132332],[56.08107,47.13361],[56.08086,47.134651],[56.080711,47.135799],[56.080631,47.136902],[56.08065,47.137569],[56.0807,47.13879],[56.080799,47.140129],[56.080929,47.142139],[56.081001,47.145439],[56.080872,47.14772],[56.08075,47.149818],[56.079498,47.161301],[56.07925,47.163631],[56.07827,47.1726],[56.07814,47.17382],[56.07724,47.18169],[56.07579,47.192719],[56.07357,47.20916],[56.073471,47.20993],[56.073029,47.213341],[56.07275,47.215809],[56.072189,47.223049],[56.071972,47.22517],[56.071758,47.226429],[56.071571,47.227032],[56.071289,47.227921],[56.070801,47.228939],[56.070629,47.229309],[56.069908,47.23064],[56.068779,47.23275],[56.067348,47.235401],[56.06498,47.239841],[56.064011,47.242249],[56.063122,47.244579],[56.062851,47.245441],[56.062271,47.247372],[56.06118,47.251011],[56.056301,47.26749],[56.054482,47.273621],[56.053581,47.27618],[56.05265,47.278511],[56.05154,47.280701],[56.050781,47.282139],[56.05019,47.283138],[56.04969,47.283932],[56.048931,47.285118],[56.048679,47.285511],[56.04755,47.287201],[56.047009,47.287998],[56.04649,47.288818],[56.045841,47.289921],[56.044739,47.291401],[56.04414,47.291889],[56.042969,47.292278],[56.04179,47.292721],[56.039879,47.29364],[56.038231,47.294399],[56.037552,47.294621],[56.037109,47.294861],[56.03508,47.29686],[56.034489,47.29744],[56.03326,47.298691],[56.031361,47.300598],[56.030918,47.30106],[56.028469,47.303589],[56.027229,47.30484],[56.026321,47.305721],[56.025711,47.306198],[56.025188,47.306469],[56.023659,47.306641],[56.022579,47.306549],[56.02203,47.306499],[56.020481,47.306591],[56.019878,47.306801],[56.015999,47.308731],[56.01519,47.30917],[56.014252,47.309811],[56.01292,47.311291],[56.012001,47.31255],[56.006481,47.320141],[56.001209,47.327278],[55.999889,47.329128],[55.99604,47.335972],[55.995331,47.337238],[55.993549,47.340099],[55.991451,47.342548],[55.98999,47.34383],[55.988159,47.345169],[55.986809,47.346241],[55.981941,47.349789],[55.980881,47.35088],[55.979839,47.352501],[55.97887,47.3545],[55.977589,47.357769],[55.976109,47.361542],[55.975159,47.363609],[55.974258,47.36512],[55.973839,47.365681],[55.973351,47.36636],[55.972488,47.367199],[55.971161,47.368111],[55.967972,47.369289],[55.955429,47.373619],[55.954979,47.373798],[55.953979,47.37418],[55.952679,47.374729],[55.94875,47.376019],[55.946899,47.376781],[55.945938,47.377571],[55.943161,47.380451],[55.940948,47.38271],[55.939751,47.384411],[55.936741,47.389381],[55.935101,47.391281],[55.933262,47.392971],[55.93121,47.394451],[55.929211,47.395889],[55.927551,47.39724],[55.926399,47.398449],[55.9226,47.403091],[55.921741,47.404148],[55.920528,47.405579],[55.918819,47.40807],[55.91716,47.41069],[55.916698,47.411671],[55.916309,47.412498],[55.914101,47.418381],[55.913441,47.41946],[55.912418,47.420738],[55.908581,47.424839],[55.90633,47.426651],[55.901878,47.42955],[55.901161,47.430031],[55.895618,47.433651],[55.894421,47.434689],[55.892799,47.43697],[55.88855,47.443161],[55.888069,47.443851],[55.887871,47.44413],[55.88583,47.446899],[55.883289,47.45002],[55.88179,47.4515],[55.880421,47.452499],[55.879139,47.45322],[55.875099,47.455521],[55.873589,47.456379],[55.87035,47.45821],[55.867191,47.460121],[55.865879,47.460709],[55.864021,47.461391],[55.862419,47.46183],[55.86158,47.462151],[55.861351,47.462231],[55.859638,47.46286],[55.859451,47.462879],[55.859299,47.46291],[55.859112,47.462898],[55.85899,47.46286],[55.858898,47.46283],[55.858799,47.46283],[55.858669,47.462811],[55.858521,47.46286],[55.858379,47.462978],[55.85828,47.463181],[55.858189,47.463459],[55.85804,47.463772],[55.857811,47.46413],[55.856998,47.46505],[55.856281,47.466],[55.855221,47.467789],[55.854542,47.46933],[55.853779,47.471619],[55.853168,47.474701],[55.852329,47.47958],[55.851681,47.483719],[55.851299,47.48711],[55.851219,47.49049],[55.85128,47.498058],[55.851151,47.502029],[55.845791,47.519192],[55.838692,47.54253],[55.83746,47.545639],[55.83424,47.549709],[55.822781,47.554779],[55.822071,47.555401],[55.8214,47.55621],[55.82056,47.557529],[55.819908,47.55875],[55.819012,47.560822],[55.815189,47.571041],[55.81255,47.578011],[55.812,47.579971],[55.81171,47.581741],[55.81152,47.583],[55.811409,47.584469],[55.811451,47.59251],[55.811501,47.600479],[55.81134,47.603279],[55.81094,47.605721],[55.809799,47.61113],[55.809341,47.612709],[55.808788,47.614182],[55.807251,47.617229],[55.805641,47.62014],[55.804741,47.622139],[55.804001,47.624081],[55.796421,47.655689],[55.790298,47.67799],[55.790199,47.687599],[55.78907,47.721489],[55.788929,47.727829],[55.788792,47.732651],[55.788681,47.737221],[55.788841,47.739471],[55.788872,47.739948],[55.789661,47.75219],[55.791161,47.77618],[55.79425,47.819092],[55.796959,47.839352],[55.798401,47.845871],[55.799179,47.85342],[55.803902,47.910759],[55.809399,47.984749],[55.811138,48.006031],[55.809589,48.024609],[55.808731,48.035042],[55.808239,48.037788],[55.805061,48.045681],[55.796379,48.063881],[55.795891,48.068169],[55.79628,48.075378],[55.796959,48.099411],[55.797729,48.12001],[55.79744,48.122929],[55.79174,48.140961],[55.79081,48.14307],[55.787991,48.147861],[55.786129,48.151039],[55.785351,48.153011],[55.784908,48.154751],[55.784889,48.157612],[55.783482,48.167641],[55.783218,48.17033],[55.782959,48.17271],[55.78307,48.175579],[55.783562,48.181591],[55.7841,48.18906],[55.78397,48.1908],[55.7836,48.191669],[55.78286,48.19384],[55.78233,48.19453],[55.781609,48.194939],[55.77676,48.197281],[55.775921,48.197571],[55.774609,48.197338],[55.769562,48.195862],[55.767288,48.19524],[55.767208,48.195221],[55.766178,48.195019],[55.764969,48.195171],[55.763771,48.195541],[55.762272,48.19659],[55.76128,48.197472],[55.75486,48.20602],[55.754292,48.206829],[55.753349,48.20816],[55.751961,48.21014],[55.750992,48.212811],[55.748829,48.221031],[55.74847,48.222401],[55.74749,48.226292],[55.746792,48.228279],[55.745819,48.230492],[55.740162,48.241928],[55.736431,48.249859],[55.735241,48.252369],[55.734249,48.255829],[55.734001,48.25742],[55.73391,48.258011],[55.733479,48.260769],[55.733292,48.263561],[55.73196,48.28344],[55.729641,48.31657],[55.728531,48.33514],[55.726929,48.358971],[55.726551,48.365829],[55.727131,48.378361],[55.727901,48.391411],[55.728291,48.399479],[55.726261,48.420422],[55.72374,48.442909],[55.723259,48.449261],[55.72435,48.473381],[55.724442,48.475319],[55.724609,48.479351],[55.724628,48.479721],[55.724689,48.481239],[55.72472,48.481918],[55.724812,48.4837],[55.725609,48.501598],[55.726059,48.513119],[55.725769,48.521702],[55.723808,48.537479],[55.72298,48.544708],[55.722809,48.546188],[55.722778,48.546421],[55.722511,48.548721],[55.72242,48.549431],[55.72216,48.551521],[55.720852,48.56385],[55.71925,48.587608],[55.718788,48.594051],[55.71841,48.600231],[55.718651,48.60326],[55.71933,48.60606],[55.720329,48.608978],[55.721291,48.6115],[55.721859,48.61425],[55.722092,48.617691],[55.721741,48.621189],[55.720551,48.624641],[55.71751,48.632191],[55.71529,48.637199],[55.71262,48.64547],[55.710941,48.65123],[55.709511,48.659721],[55.709011,48.666119],[55.709049,48.672401],[55.70961,48.679729],[55.713921,48.70715],[55.71434,48.709961],[55.717049,48.726921],[55.720501,48.741638],[55.7239,48.750832],[55.726299,48.75732],[55.72715,48.759762],[55.73185,48.77322],[55.736031,48.781219],[55.73642,48.781841],[55.737579,48.783642],[55.738392,48.784809],[55.739342,48.786091],[55.740749,48.788021],[55.745781,48.794651],[55.75082,48.8013],[55.751629,48.80241],[55.752258,48.80331],[55.7528,48.804081],[55.756809,48.809929],[55.75943,48.813789],[55.76038,48.815289],[55.761608,48.817402],[55.76215,48.818352],[55.76366,48.821548],[55.76429,48.822929],[55.767189,48.830311],[55.767399,48.830799],[55.76833,48.832699],[55.769058,48.833981],[55.769821,48.835091],[55.770969,48.836609],[55.77169,48.837471],[55.77243,48.838051],[55.773232,48.838661],[55.774052,48.839119],[55.775669,48.839828],[55.776451,48.840069],[55.77763,48.84024],[55.77924,48.840401],[55.780281,48.84042],[55.78125,48.840401],[55.78252,48.84037],[55.79047,48.840889],[55.79126,48.840981],[55.79628,48.84124],[55.810371,48.842041],[55.81245,48.842159],[55.81451,48.842449],[55.817261,48.843128],[55.81889,48.843719],[55.82074,48.84462],[55.82346,48.8461],[55.824162,48.846531],[55.825279,48.84721],[55.826191,48.847801],[55.82811,48.848751],[55.82967,48.849312],[55.831299,48.849709],[55.842369,48.85191],[55.85397,48.854259],[55.857552,48.854969],[55.858131,48.855091],[55.858681,48.855209],[55.86179,48.85582],[55.862728,48.85601],[55.86491,48.85643],[55.866829,48.856758],[55.867088,48.856812],[55.86832,48.857052],[55.87402,48.85825],[55.874458,48.858341],[55.875801,48.85862],[55.87849,48.859192],[55.879089,48.859379],[55.879398,48.859482],[55.88028,48.859791],[55.881779,48.86042],[55.88269,48.86084],[55.883381,48.86121],[55.883549,48.861309],[55.884319,48.861851],[55.885052,48.86253],[55.885811,48.863361],[55.886429,48.86414],[55.886959,48.86504],[55.887611,48.866402],[55.889069,48.86982],[55.894341,48.882118],[55.89912,48.893269],[55.899479,48.89418],[55.899811,48.895111],[55.899948,48.895519],[55.900108,48.896061],[55.900341,48.896919],[55.900639,48.898281],[55.900841,48.899288],[55.90115,48.901321],[55.901241,48.90221],[55.90131,48.903439],[55.901371,48.908951],[55.901489,48.934219],[55.901569,48.94532],[55.901619,48.94698],[55.901718,48.94865],[55.901871,48.950539],[55.90263,48.958179],[55.903069,48.962841],[55.9035,48.96714],[55.903839,48.96991],[55.904228,48.972649],[55.904598,48.975201],[55.904678,48.975761],[55.904968,48.977859],[55.905239,48.98037],[55.905411,48.98254],[55.90551,48.984798],[55.90564,48.996738],[55.905651,48.997532],[55.905701,49.000679],[55.905739,49.002041],[55.905849,49.004139],[55.90646,49.01107],[55.90659,49.01252],[55.906952,49.016472],[55.907299,49.021412],[55.907688,49.028358],[55.90789,49.031841],[55.908131,49.03532],[55.909142,49.048611],[55.91011,49.061829],[55.91058,49.0681],[55.91304,49.10125],[55.913399,49.105782],[55.91375,49.108921],[55.914108,49.111359],[55.915451,49.11953],[55.917259,49.13028],[55.917542,49.13213],[55.917751,49.13401],[55.917919,49.136051],[55.918011,49.138062],[55.918079,49.140659],[55.918079,49.140942],[55.918079,49.141891],[55.91806,49.14267],[55.918011,49.143711],[55.91785,49.14669],[55.91774,49.14798],[55.917671,49.148739],[55.91758,49.149448],[55.9175,49.15007],[55.91737,49.150928],[55.917122,49.15247],[55.91684,49.153858],[55.916649,49.1548],[55.916538,49.155289],[55.916382,49.15575],[55.91571,49.157372],[55.91449,49.15987],[55.914261,49.160358],[55.913288,49.162361],[55.913029,49.16288],[55.91275,49.163441],[55.911339,49.166302],[55.909439,49.17012],[55.90852,49.171951],[55.907379,49.17429],[55.90675,49.175739],[55.9063,49.177059],[55.906059,49.177879],[55.903801,49.187191],[55.90324,49.189468],[55.902882,49.19091],[55.90094,49.197899],[55.899979,49.20108],[55.897701,49.208038],[55.89743,49.20879],[55.896938,49.210251],[55.896599,49.211151],[55.896229,49.212002],[55.895828,49.212769],[55.895222,49.21386],[55.891121,49.220089],[55.88998,49.22205],[55.889542,49.22287],[55.88913,49.223881],[55.887421,49.229141],[55.887131,49.230061],[55.88678,49.231129],[55.885368,49.235481],[55.883381,49.241539],[55.88155,49.247051],[55.880661,49.249741],[55.880192,49.25145],[55.879341,49.255569],[55.87923,49.256111],[55.879009,49.257191],[55.87899,49.25724],[55.878139,49.261341],[55.877831,49.262829],[55.875278,49.275089],[55.874748,49.277889],[55.874599,49.279041],[55.87447,49.280949],[55.874432,49.281898],[55.874409,49.282921],[55.874451,49.286308],[55.874409,49.287281],[55.874321,49.288139],[55.874249,49.288631],[55.874149,49.289082],[55.873909,49.28989],[55.87376,49.290329],[55.873589,49.290722],[55.87318,49.291531],[55.872768,49.292179],[55.868851,49.297501],[55.864491,49.303478],[55.864029,49.304119],[55.863571,49.304741],[55.8629,49.305691],[55.862179,49.306919],[55.8615,49.30843],[55.861099,49.30941],[55.86034,49.311329],[55.856941,49.320042],[55.855289,49.3242],[55.85498,49.32497],[55.854019,49.327141],[55.852772,49.329521],[55.8521,49.330669],[55.85125,49.33194],[55.849388,49.334419],[55.84597,49.33873],[55.845089,49.339859],[55.842171,49.343578],[55.841888,49.343948],[55.839329,49.347221],[55.83844,49.348289],[55.837448,49.349178],[55.83709,49.349449],[55.83672,49.34967],[55.835918,49.350029],[55.835232,49.350281],[55.8344,49.350449],[55.833851,49.350479],[55.833279,49.35046],[55.827381,49.349319],[55.82436,49.348759],[55.820412,49.347988],[55.817551,49.347408],[55.814449,49.34679],[55.80788,49.345421],[55.806519,49.34499],[55.805069,49.34449],[55.80228,49.34269],[55.801941,49.342461],[55.801262,49.341991],[55.800152,49.34124],[55.79987,49.34111],[55.79977,49.341061],[55.798828,49.34063],[55.79855,49.34053],[55.797771,49.340229],[55.796341,49.33971],[55.795601,49.339581],[55.79493,49.33939],[55.794128,49.339191],[55.79306,49.338909],[55.790668,49.338329],[55.78896,49.338009],[55.787819,49.337959],[55.786671,49.338039],[55.7854,49.33828],[55.784168,49.338711],[55.7826,49.339481],[55.781071,49.340549],[55.77916,49.342152],[55.777271,49.34399],[55.775661,49.345612],[55.770809,49.350368],[55.768848,49.352299],[55.766171,49.354881],[55.764488,49.356651],[55.76366,49.35759],[55.762871,49.35865],[55.761959,49.360008],[55.761108,49.361549],[55.760429,49.363079],[55.75985,49.36475],[55.759171,49.367229],[55.75901,49.367901],[55.75864,49.369801],[55.758389,49.371201],[55.75779,49.375252],[55.757118,49.379761],[55.756821,49.38129],[55.7565,49.382751],[55.7561,49.384159],[55.755611,49.38562],[55.755081,49.386921],[55.75423,49.388512],[55.75375,49.389259],[55.753201,49.38998],[55.75185,49.391521],[55.750408,49.392879],[55.74662,49.396191],[55.74567,49.396999],[55.74464,49.397919],[55.742962,49.399429],[55.73914,49.402771],[55.737881,49.4039],[55.736629,49.405258],[55.735451,49.406811],[55.734341,49.40852],[55.733452,49.410141],[55.732689,49.41172],[55.731949,49.41349],[55.73106,49.416012],[55.72821,49.42469],[55.72747,49.426868],[55.72681,49.429169],[55.726109,49.432178],[55.72559,49.435211],[55.723309,49.454868],[55.721859,49.467388],[55.721828,49.468811],[55.721088,49.475471],[55.72084,49.47847],[55.72049,49.48299],[55.720322,49.48457],[55.71999,49.486889],[55.719212,49.491779],[55.71891,49.494171],[55.717731,49.504021],[55.715759,49.51825],[55.715542,49.520241],[55.715351,49.522381],[55.71505,49.526329],[55.714691,49.529739],[55.714272,49.53249],[55.713779,49.535],[55.712921,49.539001],[55.71228,49.543491],[55.711769,49.546242],[55.711349,49.548149],[55.710831,49.550201],[55.710312,49.55209],[55.70977,49.553822],[55.709358,49.55508],[55.708321,49.557899],[55.707878,49.559269],[55.70607,49.565182],[55.704769,49.56871],[55.703491,49.57159],[55.70248,49.57373],[55.700901,49.577671],[55.698959,49.58271],[55.698479,49.58408],[55.698391,49.584381],[55.697769,49.58646],[55.697399,49.588139],[55.697121,49.589901],[55.696781,49.593609],[55.69672,49.596779],[55.696941,49.60041],[55.69894,49.620121],[55.699268,49.623772],[55.699329,49.626282],[55.699429,49.63052],[55.699188,49.635651],[55.699131,49.636211],[55.698631,49.6409],[55.697899,49.645988],[55.697361,49.6493],[55.696671,49.652451],[55.695919,49.655079],[55.694691,49.658611],[55.6931,49.662861],[55.692421,49.66433],[55.686729,49.673569],[55.68568,49.675289],[55.682789,49.680199],[55.681389,49.682941],[55.680019,49.68642],[55.677219,49.69487],[55.676929,49.695751],[55.67514,49.701241],[55.674641,49.702789],[55.673882,49.70512],[55.67276,49.708469],[55.671028,49.713631],[55.670712,49.714882],[55.670368,49.716511],[55.670109,49.718151],[55.66991,49.719311],[55.669762,49.721729],[55.669689,49.725491],[55.66991,49.728981],[55.670898,49.735821],[55.67218,49.744549],[55.676151,49.77142],[55.677071,49.778099],[55.677879,49.78434],[55.679729,49.806068],[55.680698,49.81786],[55.68087,49.821381],[55.680851,49.824558],[55.680698,49.82822],[55.680328,49.832458],[55.67968,49.837151],[55.678848,49.840969],[55.67778,49.84499],[55.675209,49.852699],[55.669899,49.868599],[55.66441,49.884682],[55.662361,49.890949],[55.661579,49.89394],[55.661129,49.896309],[55.66074,49.898891],[55.6605,49.901852],[55.66032,49.90493],[55.66037,49.908569],[55.66069,49.91169],[55.6618,49.924728],[55.661781,49.929359],[55.661308,49.934101],[55.66082,49.93692],[55.660252,49.939541],[55.65942,49.942471],[55.652618,49.964859],[55.650421,49.9725],[55.650299,49.972931],[55.646881,49.98391],[55.64555,49.98941],[55.644489,49.996422],[55.644161,50.000069],[55.644138,50.000751],[55.644032,50.004379],[55.644161,50.009281],[55.64423,50.010761],[55.645821,50.02383],[55.649719,50.05447],[55.653332,50.083469],[55.65374,50.08638],[55.654129,50.088669],[55.654652,50.091179],[55.655239,50.093651],[55.656609,50.098728],[55.657021,50.100281],[55.65707,50.100449],[55.661041,50.11528],[55.663261,50.123562],[55.664349,50.12772],[55.665371,50.13192],[55.668301,50.14389],[55.669769,50.149879],[55.670509,50.15292],[55.67086,50.15456],[55.67112,50.15593],[55.67136,50.157249],[55.671612,50.159081],[55.672039,50.162979],[55.672371,50.166901],[55.67392,50.186131],[55.6749,50.19799],[55.67572,50.20845],[55.67588,50.20982],[55.676208,50.212551],[55.676651,50.215321],[55.676979,50.217072],[55.67733,50.218658],[55.678268,50.22224],[55.681259,50.23251],[55.684158,50.24255],[55.687481,50.253929],[55.690571,50.264641],[55.691029,50.266361],[55.691422,50.268101],[55.691738,50.269581],[55.692032,50.271111],[55.692532,50.274361],[55.696041,50.307381],[55.696362,50.31065],[55.696678,50.313869],[55.69672,50.31422],[55.697319,50.32008],[55.697498,50.322521],[55.697578,50.324661],[55.697609,50.32692],[55.697601,50.328941],[55.697521,50.330891],[55.697411,50.33284],[55.697239,50.334782],[55.69635,50.344231],[55.695911,50.348961],[55.695419,50.354191],[55.69521,50.356339],[55.690521,50.406368],[55.688931,50.423382],[55.68734,50.440971],[55.686909,50.447571],[55.686771,50.45068],[55.686459,50.468208],[55.686249,50.480068],[55.68605,50.492432],[55.685509,50.524719],[55.685299,50.53756],[55.685349,50.540649],[55.685429,50.54372],[55.68549,50.54525],[55.685581,50.54636],[55.686039,50.549801],[55.686821,50.554131],[55.687618,50.558208],[55.688141,50.561829],[55.68832,50.563541],[55.688499,50.566299],[55.68853,50.568859],[55.688549,50.570358],[55.688499,50.572529],[55.688351,50.57476],[55.68792,50.579449],[55.68745,50.583328],[55.68634,50.59124],[55.685959,50.593609],[55.685711,50.594891],[55.685169,50.596901],[55.684582,50.598881],[55.68396,50.60078],[55.683239,50.602749],[55.682251,50.605331],[55.681309,50.607971],[55.680618,50.610081],[55.68,50.61237],[55.679581,50.614182],[55.67915,50.616341],[55.678841,50.618198],[55.678539,50.620289],[55.67601,50.641548],[55.675159,50.648911],[55.675049,50.650261],[55.6749,50.652691],[55.674831,50.654949],[55.67482,50.657501],[55.67487,50.65955],[55.674999,50.662289],[55.67524,50.66497],[55.675529,50.667419],[55.675892,50.669891],[55.676929,50.675911],[55.677311,50.67804],[55.677631,50.679859],[55.678249,50.683979],[55.678711,50.687851],[55.678951,50.690338],[55.679119,50.692928],[55.679279,50.696079],[55.679291,50.699471],[55.677898,50.740601],[55.677589,50.748569],[55.677399,50.75116],[55.67709,50.753811],[55.676601,50.757061],[55.675961,50.760399],[55.675301,50.763119],[55.674541,50.7659],[55.6731,50.77002],[55.67226,50.77206],[55.670979,50.774719],[55.657162,50.800831],[55.653919,50.80698],[55.652611,50.80941],[55.651291,50.812],[55.65049,50.813931],[55.64954,50.81675],[55.648701,50.82],[55.64806,50.823479],[55.64769,50.826519],[55.64753,50.82851],[55.647369,50.83252],[55.646912,50.845772],[55.64653,50.855751],[55.645721,50.876942],[55.645618,50.87822],[55.64547,50.879902],[55.645351,50.88089],[55.64489,50.883621],[55.64452,50.88567],[55.644138,50.887661],[55.64341,50.89093],[55.641479,50.897221],[55.640289,50.90099],[55.63921,50.90485],[55.638802,50.906441],[55.638439,50.90807],[55.63805,50.910309],[55.637718,50.912609],[55.63747,50.91502],[55.637211,50.918209],[55.63657,50.928921],[55.636181,50.935612],[55.63575,50.943008],[55.635681,50.94548],[55.6357,50.948002],[55.63588,50.951729],[55.636238,50.955761],[55.636669,50.958931],[55.64035,50.980049],[55.642658,50.9935],[55.64296,50.995331],[55.643372,50.99828],[55.643719,51.00169],[55.64389,51.00452],[55.643951,51.007172],[55.643959,51.00975],[55.643959,51.012459],[55.644058,51.045509],[55.644169,51.047729],[55.64426,51.049591],[55.64455,51.051651],[55.64481,51.052929],[55.645081,51.054119],[55.645432,51.055191],[55.645721,51.055988],[55.646141,51.056919],[55.64666,51.057919],[55.647259,51.05896],[55.648029,51.060108],[55.64978,51.062431],[55.651482,51.064861],[55.652489,51.066429],[55.65332,51.068008],[55.654209,51.07019],[55.654709,51.07193],[55.655071,51.073841],[55.65519,51.07539],[55.655231,51.076809],[55.655201,51.07851],[55.654999,51.08028],[55.654659,51.082531],[55.65414,51.085091],[55.653461,51.08786],[55.652431,51.091888],[55.652142,51.093651],[55.651909,51.095669],[55.651859,51.09763],[55.651951,51.098869],[55.652279,51.100891],[55.652721,51.102619],[55.65324,51.104309],[55.655621,51.110699],[55.656132,51.112202],[55.656609,51.11422],[55.65707,51.11644],[55.65733,51.118481],[55.65736,51.119492],[55.657299,51.123192],[55.6572,51.124001],[55.656769,51.127159],[55.656479,51.128868],[55.655319,51.134979],[55.65453,51.139481],[55.65419,51.14172],[55.653759,51.145229],[55.653679,51.14616],[55.65345,51.149071],[55.653511,51.152081],[55.65374,51.15472],[55.654388,51.158871],[55.65506,51.16201],[55.65617,51.16552],[55.660042,51.17598],[55.661221,51.179111],[55.66349,51.186131],[55.665001,51.19173],[55.665798,51.195229],[55.66663,51.19968],[55.667809,51.207119],[55.66964,51.221359],[55.671249,51.234001],[55.671398,51.235371],[55.6717,51.2383],[55.67186,51.240551],[55.671921,51.242199],[55.671921,51.243191],[55.671909,51.244572],[55.67178,51.24646],[55.671631,51.247921],[55.671429,51.249191],[55.671162,51.250542],[55.670811,51.251888],[55.670368,51.2533],[55.6693,51.25629],[55.66856,51.258011],[55.665871,51.263908],[55.665352,51.265091],[55.66431,51.2677],[55.66396,51.268631],[55.663422,51.270229],[55.663052,51.271381],[55.662579,51.273159],[55.66235,51.27433],[55.662182,51.275089],[55.6619,51.27692],[55.66177,51.277821],[55.661591,51.279369],[55.661449,51.281639],[55.661331,51.284241],[55.66127,51.286369],[55.661259,51.287922],[55.661282,51.293129],[55.661301,51.295361],[55.661388,51.30225],[55.66135,51.304352],[55.661129,51.308788],[55.660969,51.311001],[55.660889,51.31181],[55.66048,51.314831],[55.660172,51.316669],[55.656269,51.33997],[55.65115,51.370121],[55.650101,51.376541],[55.64996,51.37743],[55.64954,51.37999],[55.64949,51.38031],[55.64912,51.38258],[55.648979,51.383911],[55.64893,51.384609],[55.648899,51.386002],[55.64896,51.387772],[55.649071,51.389061],[55.64941,51.39122],[55.649799,51.393108],[55.650059,51.39418],[55.650391,51.39518],[55.65134,51.396999],[55.65202,51.398102],[55.652679,51.398991],[55.653431,51.399872],[55.656631,51.402611],[55.657398,51.403191],[55.658329,51.403831],[55.661049,51.405479],[55.66185,51.406189],[55.66246,51.406811],[55.66296,51.407379],[55.66349,51.40807],[55.663818,51.40855],[55.66394,51.40873],[55.664612,51.40992],[55.665001,51.41077],[55.66539,51.4118],[55.66584,51.41317],[55.666321,51.414791],[55.66888,51.423191],[55.66972,51.4259],[55.67144,51.43161],[55.671909,51.433189],[55.672352,51.43462],[55.677689,51.452171],[55.67905,51.45612],[55.680439,51.459789],[55.68087,51.4608],[55.682091,51.463509],[55.6828,51.465],[55.68573,51.470791],[55.688469,51.476189],[55.689339,51.477989],[55.690701,51.481079],[55.690971,51.481758],[55.69199,51.48439],[55.693562,51.48893],[55.695011,51.493679],[55.695518,51.495628],[55.695889,51.497108],[55.70332,51.531422],[55.706501,51.5462],[55.706989,51.548721],[55.7075,51.55143],[55.708221,51.555592],[55.70882,51.559441],[55.709221,51.562199],[55.709591,51.565022],[55.7099,51.567551],[55.710339,51.571621],[55.711189,51.58115],[55.71254,51.596439],[55.712711,51.599602],[55.712811,51.60178],[55.712841,51.60294],[55.712849,51.60466],[55.712799,51.607578],[55.7122,51.624611],[55.712151,51.62603],[55.712101,51.627251],[55.711441,51.644531],[55.711319,51.64764],[55.711281,51.650318],[55.711288,51.652691],[55.711349,51.655529],[55.711559,51.659061],[55.7117,51.66074],[55.71188,51.662609],[55.712219,51.665421],[55.71246,51.66711],[55.71402,51.676769],[55.71463,51.679581],[55.715221,51.681911],[55.71693,51.687439],[55.718941,51.69244],[55.719601,51.694069],[55.720299,51.695671],[55.721561,51.698292],[55.721901,51.69891],[55.722099,51.699261],[55.72261,51.700039],[55.723381,51.701118],[55.72575,51.70401],[55.726799,51.705551],[55.727711,51.70739],[55.73074,51.71487],[55.731682,51.717339],[55.732731,51.72094],[55.73333,51.723331],[55.733871,51.725269],[55.734291,51.726639],[55.735668,51.730011],[55.736431,51.731579],[55.737579,51.733879],[55.738319,51.735439],[55.738831,51.736679],[55.739491,51.73859],[55.739899,51.739891],[55.74033,51.741421],[55.742481,51.75071],[55.743118,51.753731],[55.746429,51.768318],[55.748341,51.776112],[55.752659,51.790218],[55.759251,51.811508],[55.7607,51.815601],[55.762489,51.819321],[55.764339,51.822701],[55.766369,51.82571],[55.772129,51.832142],[55.77663,51.837151],[55.778831,51.839802],[55.780842,51.842659],[55.782471,51.84565],[55.78384,51.848549],[55.785179,51.851929],[55.786469,51.855801],[55.787449,51.859379],[55.788342,51.86385],[55.79689,51.908421],[55.797081,51.909882],[55.797611,51.916401],[55.79763,51.918541],[55.79763,51.9207],[55.7976,51.92284],[55.797409,51.927021],[55.797329,51.928532],[55.79726,51.930019],[55.797081,51.93383],[55.7971,51.934799],[55.79718,51.936218],[55.797249,51.937019],[55.797352,51.937721],[55.797501,51.938511],[55.79768,51.939339],[55.79784,51.93996],[55.797989,51.940491],[55.798161,51.941002],[55.798321,51.941448],[55.79866,51.942322],[55.79887,51.942741],[55.799332,51.9436],[55.799671,51.944172],[55.807259,51.956848],[55.807739,51.957722],[55.808239,51.95879],[55.808701,51.959949],[55.808979,51.96093],[55.813591,51.980122],[55.813961,51.981949],[55.814171,51.983379],[55.81432,51.985371],[55.814339,51.98695],[55.814251,51.998631],[55.814232,52.000389],[55.813709,52.06361],[55.81366,52.069031],[55.813648,52.070789],[55.81361,52.075951],[55.813301,52.108681],[55.81324,52.11496],[55.81319,52.1203],[55.813122,52.121632],[55.812851,52.123539],[55.812431,52.125431],[55.811821,52.12714],[55.811001,52.128849],[55.80444,52.139221],[55.803692,52.140442],[55.783829,52.171841],[55.783279,52.17284],[55.782768,52.174129],[55.782219,52.176041],[55.781929,52.17728],[55.781521,52.179192],[55.781361,52.18087],[55.781311,52.182621],[55.781311,52.183571],[55.781399,52.185379],[55.781429,52.186661],[55.781429,52.188091],[55.781399,52.188881],[55.78133,52.189789],[55.78125,52.190899],[55.781189,52.191502],[55.781132,52.192032],[55.78101,52.19265],[55.780819,52.193741],[55.780529,52.194908],[55.780361,52.195518],[55.78014,52.19622],[55.779881,52.196972],[55.779598,52.19767],[55.77927,52.19833],[55.778961,52.198971],[55.778599,52.199551],[55.77718,52.202],[55.77422,52.207008],[55.771309,52.211922],[55.76897,52.215889],[55.76841,52.216808],[55.766151,52.2206],[55.765202,52.222229],[55.759621,52.23164],[55.75816,52.234112],[55.757721,52.234821],[55.756699,52.236328],[55.75634,52.236832],[55.755852,52.2374],[55.755569,52.237671],[55.755348,52.237869],[55.75518,52.237999],[55.754238,52.238701],[55.75383,52.23904],[55.753559,52.239319],[55.7533,52.239639],[55.752312,52.240871],[55.751579,52.241791],[55.75127,52.242111],[55.75106,52.24229],[55.750519,52.242691],[55.749741,52.24321],[55.73579,52.251579],[55.727631,52.256451],[55.725208,52.2579],[55.72377,52.258781],[55.7234,52.25906],[55.722851,52.25956],[55.720501,52.262089],[55.720291,52.262321],[55.717449,52.265339],[55.71051,52.273041],[55.709721,52.273708],[55.709179,52.274078],[55.708549,52.274391],[55.703751,52.276489],[55.69817,52.278881],[55.69619,52.27977],[55.695301,52.280201],[55.693359,52.281471],[55.692009,52.282261],[55.69125,52.282619],[55.690701,52.282829],[55.690102,52.28297],[55.689499,52.283031],[55.689041,52.283051],[55.68858,52.28299],[55.68829,52.282959],[55.687962,52.282848],[55.68729,52.2826],[55.686741,52.282341],[55.68317,52.279949],[55.682301,52.279339],[55.682011,52.279148],[55.681671,52.278999],[55.681419,52.27898],[55.681149,52.27903],[55.68087,52.27919],[55.68074,52.279301],[55.680401,52.279739],[55.680061,52.280331],[55.679749,52.28075],[55.679111,52.281368],[55.67849,52.28191],[55.677841,52.282661],[55.677471,52.283279],[55.675369,52.28727],[55.674358,52.289181],[55.673279,52.29121],[55.673019,52.291721],[55.672562,52.292591],[55.672119,52.29343],[55.670609,52.296329],[55.67033,52.29686],[55.668861,52.299648],[55.66848,52.300381],[55.668339,52.30064],[55.667721,52.301811],[55.667461,52.30241],[55.667068,52.303429],[55.66674,52.304699],[55.666561,52.30563],[55.666439,52.30658],[55.66637,52.30748],[55.66637,52.308411],[55.666401,52.309368],[55.66655,52.310638],[55.666729,52.311661],[55.6674,52.314411],[55.668072,52.317181],[55.6684,52.318241],[55.668812,52.319221],[55.67284,52.32666],[55.675659,52.33189],[55.67635,52.33313],[55.676819,52.333981],[55.677719,52.335609],[55.677879,52.335911],[55.68063,52.340981],[55.68615,52.351101],[55.690151,52.35844],[55.69622,52.369579],[55.69659,52.370281],[55.696629,52.370338],[55.699631,52.375858],[55.69989,52.376339],[55.700821,52.37804],[55.70174,52.379749],[55.701801,52.379841],[55.702808,52.38171],[55.7033,52.382549],[55.703899,52.383709],[55.704239,52.384331],[55.704979,52.385731],[55.705872,52.387321],[55.707142,52.389622],[55.707169,52.389671],[55.707378,52.39027],[55.70742,52.39061],[55.707409,52.39093],[55.707371,52.39156],[55.707409,52.392189],[55.707409,52.39275],[55.707321,52.39315],[55.707191,52.393452],[55.706982,52.39381],[55.706039,52.39542],[55.705978,52.395531],[55.70512,52.396999],[55.704239,52.398479],[55.70282,52.400879],[55.701019,52.403938],[55.70005,52.405579],[55.69923,52.406952],[55.697472,52.40995],[55.696301,52.411949],[55.69445,52.415131],[55.68821,52.4258],[55.68763,52.42662],[55.68729,52.426929],[55.686039,52.427731],[55.685669,52.428059],[55.68531,52.428501],[55.68504,52.428982],[55.68483,52.429401],[55.684631,52.430019],[55.684139,52.43232],[55.68396,52.432941],[55.683769,52.433361],[55.68354,52.43383],[55.682079,52.436249],[55.67815,52.44297],[55.67725,52.444481],[55.676971,52.44495],[55.67622,52.446251],[55.675152,52.448051],[55.674011,52.45002],[55.670921,52.455299],[55.67057,52.455898],[55.670471,52.456181],[55.670429,52.45647],[55.67049,52.456779],[55.670609,52.457119],[55.67086,52.4576],[55.678631,52.471859],[55.682621,52.479179],[55.685921,52.485222],[55.685619,52.485741],[55.685261,52.486542],[55.685101,52.486881],[55.684761,52.487549],[55.682831,52.49123],[55.679352,52.497681],[55.677639,52.50095],[55.67712,52.50198],[55.67664,52.503071],[55.676079,52.504501],[55.675571,52.505939],[55.675209,52.50713],[55.67466,52.509109],[55.673908,52.511829],[55.673679,52.512699],[55.673489,52.513561],[55.67337,52.51432],[55.673328,52.514912],[55.673271,52.516418],[55.673241,52.517658],[55.67305,52.523499],[55.67292,52.528938],[55.67281,52.532299],[55.672661,52.537601],[55.6726,52.538269],[55.672451,52.539371],[55.672199,52.54076],[55.671501,52.543941],[55.670971,52.545891],[55.669621,52.54969],[55.667969,52.554371],[55.66539,52.563148],[55.66473,52.564739],[55.66301,52.56778],[55.662319,52.569321],[55.66164,52.571339],[55.658588,52.58429],[55.65654,52.593121],[55.655369,52.597691],[55.654362,52.601082],[55.65126,52.60873],[55.64576,52.622341],[55.643822,52.62743],[55.643391,52.628719],[55.643169,52.630539],[55.643108,52.63242],[55.64323,52.634209],[55.64381,52.641621],[55.645309,52.66272],[55.645321,52.665001],[55.645222,52.667549],[55.64325,52.682449],[55.642529,52.68782],[55.639309,52.712391],[55.637852,52.722641],[55.63607,52.733749],[55.635971,52.73761],[55.636169,52.743118],[55.636471,52.751598],[55.63649,52.754292],[55.636131,52.761169],[55.636269,52.7631],[55.63707,52.766842],[55.637798,52.77449],[55.63829,52.77763],[55.642929,52.80006],[55.643501,52.805939],[55.644241,52.815681],[55.644779,52.822552],[55.645939,52.83707],[55.646069,52.838692],[55.64642,52.84306],[55.64658,52.846931],[55.64695,52.849682],[55.64827,52.855042],[55.648991,52.85799],[55.65287,52.873421],[55.653889,52.876011],[55.65781,52.884899],[55.660789,52.892078],[55.661629,52.894821],[55.670052,52.921558],[55.674309,52.934212],[55.67485,52.935478],[55.682678,52.952129],[55.68465,52.958199],[55.691521,52.978222],[55.692421,52.981289],[55.69302,52.983971],[55.693562,52.987148],[55.694321,52.993038],[55.697681,53.011028],[55.69928,53.01918],[55.704781,53.040829],[55.70789,53.052311],[55.710011,53.059601],[55.710178,53.060631],[55.71014,53.061729],[55.709648,53.064369],[55.70866,53.068539],[55.70723,53.072842],[55.704472,53.079929],[55.702789,53.08424],[55.699131,53.093811],[55.694149,53.106819],[55.692871,53.110142],[55.676922,53.151619],[55.668449,53.173512],[55.660149,53.195129],[55.65966,53.196121],[55.650101,53.21085],[55.637341,53.230019],[55.628769,53.23912],[55.62315,53.245098],[55.619541,53.248459],[55.61657,53.250809],[55.613331,53.253071],[55.61142,53.255001],[55.60989,53.256939],[55.608349,53.259449],[55.60717,53.261848],[55.604401,53.268929],[55.598129,53.284931],[55.594898,53.292999],[55.581131,53.328781],[55.564869,53.370869],[55.550812,53.406952],[55.550091,53.40863],[55.548779,53.41198],[55.547771,53.415569],[55.547058,53.419151],[55.546749,53.420689],[55.546619,53.422409],[55.54705,53.434429],[55.548222,53.464298],[55.548389,53.46764],[55.54985,53.48539],[55.549969,53.487419],[55.5499,53.488548],[55.549671,53.489529],[55.548119,53.49712],[55.546909,53.503609],[55.542259,53.530602],[55.542068,53.531681],[55.541752,53.53487],[55.5392,53.56073],[55.53825,53.570389],[55.537701,53.575939],[55.537392,53.57917],[55.537182,53.580139],[55.536591,53.582211],[55.53326,53.59341],[55.53297,53.594631],[55.530918,53.608089],[55.530819,53.609329],[55.53083,53.610641],[55.531311,53.619499],[55.531189,53.622349],[55.52932,53.64687],[55.526699,53.66592],[55.524429,53.682209],[55.52264,53.694988],[55.52021,53.711361],[55.516571,53.739811],[55.514339,53.75666],[55.513729,53.76046],[55.51334,53.76226],[55.512871,53.763851],[55.51223,53.765751],[55.509541,53.773739],[55.508492,53.777111],[55.502892,53.803589],[55.50111,53.811771],[55.494579,53.834061],[55.490639,53.84745],[55.490189,53.849079],[55.489601,53.852291],[55.489239,53.856819],[55.48904,53.864101],[55.488972,53.867031],[55.488731,53.870461],[55.48848,53.87254],[55.488159,53.875191],[55.48772,53.878819],[55.48727,53.880661],[55.48658,53.882549],[55.484219,53.88773],[55.48243,53.892479],[55.481289,53.895081],[55.47945,53.898918],[55.477989,53.901131],[55.474831,53.90564],[55.47131,53.911831],[55.467682,53.918968],[55.46714,53.92078],[55.466629,53.923649],[55.466049,53.92635],[55.465599,53.927929],[55.46487,53.929932],[55.462429,53.936199],[55.461441,53.938709],[55.460609,53.941231],[55.460091,53.95723],[55.459911,53.962921],[55.45985,53.964741],[55.46014,53.965679],[55.47105,53.991089],[55.471519,53.992229],[55.47184,53.99353],[55.475712,54.01577],[55.477589,54.025909],[55.47768,54.02668],[55.477581,54.027409],[55.476978,54.029301],[55.47562,54.033089],[55.472099,54.042679],[55.46788,54.054298],[55.467541,54.055519],[55.466969,54.062222],[55.466251,54.07093],[55.46756,54.08437],[55.468208,54.091629],[55.469379,54.104031],[55.46936,54.105049],[55.4678,54.12318],[55.466782,54.134659],[55.466579,54.13686],[55.466011,54.138771],[55.465939,54.14032],[55.465542,54.151291],[55.465172,54.16132],[55.464439,54.181629],[55.464352,54.183262],[55.464069,54.18449],[55.46048,54.194721],[55.459839,54.19688],[55.458569,54.201759],[55.45583,54.212189],[55.45314,54.222198],[55.452351,54.22514],[55.450249,54.235771],[55.44936,54.240509],[55.448101,54.2467],[55.445122,54.260769],[55.443291,54.26936],[55.441669,54.277119],[55.440521,54.28236],[55.439941,54.285179],[55.43869,54.291149],[55.43848,54.292141],[55.437771,54.29549],[55.437672,54.29628],[55.437771,54.297291],[55.439812,54.306301],[55.440399,54.30888],[55.440369,54.309509],[55.44022,54.31002],[55.439949,54.31076],[55.438702,54.314041],[55.438412,54.315071],[55.438278,54.31609],[55.43832,54.317341],[55.438801,54.32312],[55.43996,54.328449],[55.440269,54.330811],[55.440929,54.33857],[55.441071,54.341572],[55.44125,54.354111],[55.44125,54.35651],[55.441471,54.37236],[55.441689,54.39426],[55.441898,54.396351],[55.443249,54.399651],[55.44857,54.412609],[55.453491,54.424721],[55.457619,54.434971],[55.459049,54.438339],[55.464409,54.449371],[55.472149,54.465191],[55.472691,54.466339],[55.473259,54.46796],[55.479778,54.48851],[55.48167,54.494282],[55.482269,54.4963],[55.482269,54.49688],[55.482208,54.497639],[55.480141,54.523861],[55.480061,54.52449],[55.479851,54.52504],[55.47739,54.529381],[55.477249,54.529961],[55.477139,54.531151],[55.476219,54.541729],[55.474201,54.56496],[55.472179,54.588112],[55.470009,54.602631],[55.46994,54.603722],[55.470009,54.60487],[55.47002,54.606098],[55.4697,54.607128],[55.466881,54.614262],[55.466309,54.615631],[55.465858,54.61721],[55.46109,54.641659],[55.45863,54.65427],[55.450989,54.692638],[55.448528,54.705078],[55.44825,54.706329],[55.447842,54.707321],[55.443432,54.714001],[55.44199,54.716171],[55.441441,54.717289],[55.44091,54.71899],[55.437439,54.732639],[55.436798,54.736691],[55.433289,54.762531],[55.429932,54.788712],[55.42807,54.804649],[55.42786,54.8064],[55.42186,54.808319],[55.415779,54.813831],[55.40538,54.82312],[55.403271,54.82542],[55.40086,54.828671],[55.397289,54.834862],[55.386391,54.854118],[55.380249,54.864861],[55.369701,54.8834],[55.358471,54.902908],[55.35318,54.912109],[55.351509,54.91544],[55.349781,54.919559],[55.342049,54.93811],[55.3386,54.946571],[55.336929,54.950459],[55.336231,54.951691],[55.334591,54.954632],[55.3298,54.96291],[55.312511,54.993309],[55.311871,54.994419],[55.308102,55.000999],[55.30405,55.008072],[55.3022,55.010731],[55.28294,55.035019],[55.279598,55.03928],[55.268822,55.05315],[55.267792,55.054459],[55.26683,55.05555],[55.265709,55.05661],[55.252621,55.067379],[55.25045,55.069149],[55.243279,55.07502],[55.224491,55.089691],[55.207741,55.103001],[55.199909,55.10997],[55.1982,55.111778],[55.19545,55.11475],[55.191879,55.118969],[55.19067,55.1203],[55.18932,55.12162],[55.186298,55.12389],[55.183521,55.125851],[55.181499,55.127331],[55.18042,55.128021],[55.179428,55.12838],[55.177521,55.12801],[55.16737,55.125011],[55.165501,55.124741],[55.164558,55.124889],[55.16367,55.125469],[55.16188,55.12706],[55.161518,55.127361],[55.160049,55.12886],[55.158371,55.131279],[55.155941,55.135269],[55.153461,55.1399],[55.15033,55.145969],[55.150051,55.146511],[55.149441,55.14777],[55.14867,55.149139],[55.14415,55.1558],[55.143341,55.15712],[55.142609,55.158779],[55.139751,55.16539],[55.138371,55.168598],[55.137951,55.169781],[55.1376,55.17123],[55.137371,55.173859],[55.1362,55.20266],[55.1362,55.205269],[55.13681,55.21809],[55.13707,55.223808],[55.137791,55.240391],[55.138359,55.25322],[55.138321,55.255421],[55.137699,55.262341],[55.136608,55.274231],[55.135632,55.28524],[55.135288,55.288342],[55.134731,55.2915],[55.133968,55.29459],[55.133099,55.297482],[55.132069,55.30043],[55.13176,55.301201],[55.131229,55.302311],[55.130878,55.30302],[55.12941,55.305309],[55.12796,55.307301],[55.126549,55.30899],[55.12381,55.311699],[55.11132,55.323582],[55.110668,55.324211],[55.108189,55.3265],[55.10717,55.327438],[55.105671,55.328819],[55.10144,55.332741],[55.09919,55.334999],[55.097191,55.336868],[55.09584,55.338089],[55.09359,55.34045],[55.092049,55.342411],[55.090729,55.344521],[55.089588,55.346729],[55.087269,55.35218],[55.08271,55.362839],[55.082249,55.36393],[55.081749,55.365261],[55.080891,55.36813],[55.080441,55.369781],[55.079609,55.37392],[55.07925,55.376831],[55.079079,55.37896],[55.079021,55.381001],[55.07909,55.384651],[55.079231,55.388241],[55.079262,55.388969],[55.079369,55.391682],[55.07935,55.394051],[55.07914,55.395279],[55.07906,55.395779],[55.078541,55.397449],[55.071011,55.4119],[55.0662,55.418678],[55.058552,55.429279],[55.056671,55.431881],[55.055168,55.433979],[55.054169,55.435371],[55.047668,55.444351],[55.043839,55.448471],[55.039921,55.452671],[55.036121,55.45673],[55.031078,55.462132],[55.02993,55.463169],[55.025261,55.46817],[55.022678,55.47121],[55.015419,55.479031],[55.011471,55.48325],[55.00721,55.487881],[55.005341,55.489841],[55.004292,55.490971],[55.00346,55.49194],[54.99976,55.498241],[54.998421,55.50032],[54.99715,55.502731],[54.995659,55.505291],[54.994041,55.508141],[54.992279,55.511211],[54.990582,55.51408],[54.990299,55.514549],[54.98629,55.521851],[54.985031,55.524109],[54.98386,55.526711],[54.982948,55.52956],[54.982239,55.53286],[54.981892,55.534679],[54.981621,55.536919],[54.9813,55.544868],[54.980869,55.552792],[54.980659,55.555901],[54.980492,55.557461],[54.980221,55.559052],[54.979321,55.562901],[54.97818,55.566582],[54.976959,55.569439],[54.975311,55.57222],[54.974522,55.573341],[54.973621,55.574402],[54.971722,55.576469],[54.971329,55.576859],[54.96925,55.57906],[54.96706,55.58123],[54.96434,55.583359],[54.963219,55.584129],[54.9617,55.584751],[54.960991,55.58493],[54.960312,55.585121],[54.95866,55.585331],[54.95718,55.585369],[54.955688,55.58519],[54.954731,55.58482],[54.95295,55.584179],[54.95126,55.583809],[54.94902,55.583092],[54.936508,55.579128],[54.929699,55.576931],[54.928501,55.576672],[54.927219,55.576641],[54.925781,55.57695],[54.924301,55.57769],[54.92363,55.578098],[54.922749,55.578892],[54.921341,55.580318],[54.920849,55.581131],[54.917332,55.586761],[54.912281,55.594929],[54.91058,55.598148],[54.909321,55.601109],[54.90807,55.604259],[54.907341,55.60648],[54.907028,55.607632],[54.906559,55.60955],[54.906288,55.611069],[54.904819,55.617901],[54.904518,55.619251],[54.904251,55.620491],[54.903919,55.623051],[54.90332,55.625488],[54.90237,55.628021],[54.89941,55.632771],[54.897282,55.636261],[54.895359,55.639481],[54.89484,55.640339],[54.893181,55.64394],[54.892159,55.646889],[54.891472,55.649391],[54.890732,55.652821],[54.88763,55.66811],[54.884869,55.681709],[54.88084,55.701359],[54.8797,55.707031],[54.879181,55.708351],[54.878559,55.709251],[54.877338,55.710411],[54.876289,55.710949],[54.875462,55.710911],[54.87104,55.70813],[54.868149,55.70644],[54.865608,55.705261],[54.86319,55.704411],[54.860741,55.703659],[54.859039,55.70335],[54.85738,55.70327],[54.85548,55.703381],[54.853649,55.703701],[54.851921,55.704239],[54.850761,55.704659],[54.849751,55.70525],[54.848782,55.70591],[54.84721,55.70734],[54.845921,55.708721],[54.844639,55.710331],[54.84071,55.715698],[54.836929,55.72089],[54.8363,55.72171],[54.834869,55.72319],[54.833141,55.72448],[54.83075,55.725441],[54.825741,55.726768],[54.824032,55.72728],[54.82127,55.728668],[54.819839,55.729481],[54.817902,55.73098],[54.81694,55.731861],[54.81477,55.734138],[54.812309,55.73679],[54.802979,55.746792],[54.800652,55.749561],[54.799351,55.751381],[54.79845,55.752991],[54.796921,55.75589],[54.795879,55.758228],[54.794369,55.761349],[54.79351,55.763039],[54.79216,55.76535],[54.79192,55.765701],[54.79015,55.768139],[54.787418,55.77142],[54.78384,55.775379],[54.782242,55.777538],[54.78157,55.77866],[54.780529,55.780682],[54.77985,55.782009],[54.77916,55.783081],[54.778511,55.783878],[54.777679,55.78474],[54.776909,55.78529],[54.775822,55.785759],[54.773682,55.785789],[54.767872,55.784031],[54.767189,55.783829],[54.763988,55.78289],[54.759991,55.781792],[54.75808,55.781342],[54.756199,55.781139],[54.754761,55.781101],[54.752392,55.781139],[54.750481,55.781422],[54.745941,55.782139],[54.742882,55.7826],[54.74194,55.782761],[54.737862,55.783428],[54.73595,55.783138],[54.73439,55.78228],[54.73304,55.78133],[54.727871,55.777618],[54.726528,55.777081],[54.72509,55.776852],[54.722149,55.776829],[54.716301,55.776749],[54.71484,55.776451],[54.713188,55.77586],[54.702301,55.769932],[54.701519,55.769451],[54.699902,55.768169],[54.698761,55.76675],[54.69836,55.76622],[54.697201,55.763741],[54.696548,55.762081],[54.694908,55.75774],[54.692669,55.752022],[54.692101,55.750641],[54.690891,55.748219],[54.689869,55.746479],[54.686829,55.74213],[54.682739,55.736439],[54.68071,55.733608],[54.67926,55.731918],[54.678429,55.73122],[54.677441,55.730518],[54.675678,55.72998],[54.67395,55.73003],[54.672249,55.730549],[54.667721,55.733021],[54.66748,55.733139],[54.665081,55.734409],[54.6642,55.734871],[54.66375,55.734989],[54.663479,55.73489],[54.663288,55.73465],[54.663139,55.734032],[54.66317,55.733631],[54.663349,55.733261],[54.66354,55.73307],[54.663929,55.73312],[54.664181,55.733551],[54.664421,55.734371],[54.664551,55.735081],[54.664921,55.737061],[54.66534,55.73914],[54.666069,55.743031],[54.67001,55.764301],[54.672119,55.77565],[54.673309,55.782028],[54.674702,55.79158],[54.67527,55.79491],[54.67614,55.799492],[54.676418,55.80175],[54.67643,55.802879],[54.67638,55.804379],[54.676319,55.80537],[54.676239,55.806561],[54.67598,55.809849],[54.675838,55.811871],[54.67556,55.81443],[54.67535,55.81543],[54.674171,55.820782],[54.672138,55.82967],[54.669331,55.841999],[54.66674,55.853401],[54.665531,55.858742],[54.6642,55.864491],[54.66288,55.870319],[54.66124,55.87759],[54.659679,55.8843],[54.65884,55.887218],[54.65807,55.88958],[54.657139,55.89201],[54.656559,55.893372],[54.655449,55.89584],[54.65424,55.89856],[54.65205,55.903351],[54.650982,55.905739],[54.649849,55.90834],[54.649391,55.90958],[54.648708,55.911469],[54.648022,55.913471],[54.647282,55.916161],[54.646801,55.918159],[54.6465,55.919479],[54.645939,55.922279],[54.645641,55.924271],[54.64521,55.926781],[54.6451,55.927639],[54.644539,55.930771],[54.64452,55.93137],[54.644321,55.932629],[54.644161,55.933701],[54.643681,55.937119],[54.643181,55.94035],[54.64291,55.942261],[54.642731,55.943569],[54.642559,55.94508],[54.642441,55.946609],[54.642399,55.947449],[54.642368,55.94833],[54.642349,55.949909],[54.64238,55.951591],[54.64246,55.95335],[54.64257,55.955132],[54.643391,55.967979],[54.643871,55.974979],[54.644112,55.9758],[54.645401,55.995911],[54.645649,55.999821],[54.64595,56.004421],[54.646801,56.017712],[54.64777,56.032749],[54.648731,56.047531],[54.649361,56.057251],[54.649399,56.057941],[54.650101,56.068951],[54.65044,56.074249],[54.650661,56.07782],[54.650669,56.078011],[54.650871,56.080952],[54.65089,56.081348],[54.65107,56.08419],[54.651089,56.08453],[54.651299,56.087551],[54.651409,56.08976],[54.652229,56.102268],[54.65279,56.10857],[54.653149,56.11108],[54.654079,56.115681],[54.654282,56.116501],[54.654678,56.118099],[54.655411,56.120739],[54.65723,56.127541],[54.659191,56.134892],[54.660511,56.139309],[54.662338,56.144741],[54.665249,56.153381],[54.66642,56.15691],[54.668629,56.16354],[54.672539,56.17519],[54.67445,56.180859],[54.675129,56.182831],[54.6763,56.185509],[54.677559,56.18787],[54.678829,56.18977],[54.681629,56.19302],[54.685379,56.1973],[54.687679,56.199921],[54.69323,56.206329],[54.69767,56.211479],[54.700779,56.21513],[54.70499,56.220051],[54.70713,56.222591],[54.70863,56.224312],[54.719292,56.236759],[54.72155,56.239792],[54.722988,56.242111],[54.724621,56.244949],[54.72646,56.248669],[54.728119,56.25267],[54.729301,56.255981],[54.730671,56.26046],[54.732208,56.266048],[54.73465,56.274929],[54.737309,56.284599],[54.740238,56.29528],[54.741459,56.299759],[54.742451,56.30331],[54.74308,56.305641],[54.743328,56.306549],[54.744011,56.309292],[54.744431,56.310799],[54.745178,56.313339],[54.746929,56.319698],[54.74913,56.327782],[54.75127,56.335579],[54.751911,56.337952],[54.752621,56.34087],[54.753189,56.343601],[54.75383,56.347221],[54.754681,56.352612],[54.755508,56.357979],[54.757141,56.368118],[54.758308,56.375591],[54.759369,56.38224],[54.760269,56.387981],[54.761181,56.393742],[54.76202,56.399109],[54.763481,56.408401],[54.764179,56.412868],[54.764912,56.417439],[54.766361,56.426579],[54.767849,56.436069],[54.769329,56.44548],[54.77029,56.451439],[54.77095,56.455681],[54.771599,56.459869],[54.772919,56.467838],[54.773529,56.471001],[54.77557,56.48167],[54.779339,56.501308],[54.782982,56.520302],[54.784142,56.526348],[54.78595,56.535759],[54.786251,56.537338],[54.786739,56.539989],[54.788971,56.551559],[54.791481,56.564621],[54.793541,56.575432],[54.7953,56.584549],[54.796471,56.590401],[54.802078,56.612301],[54.80304,56.616119],[54.80336,56.617279],[54.804211,56.620689],[54.80545,56.625519],[54.806412,56.629318],[54.807411,56.63324],[54.80817,56.636829],[54.808491,56.63871],[54.80912,56.643742],[54.809792,56.649261],[54.810619,56.656109],[54.811432,56.662949],[54.812271,56.66996],[54.813332,56.67894],[54.813869,56.683289],[54.81422,56.686359],[54.814671,56.69001],[54.815281,56.69503],[54.81559,56.697639],[54.81612,56.702271],[54.81625,56.703381],[54.816319,56.70443],[54.816441,56.706532],[54.816559,56.709141],[54.816639,56.714771],[54.816681,56.722599],[54.816738,56.729401],[54.81675,56.730419],[54.816799,56.73798],[54.81686,56.749969],[54.816921,56.757],[54.816921,56.757542],[54.81715,56.793861],[54.817181,56.799141],[54.817402,56.839279],[54.81752,56.863491],[54.817558,56.866192],[54.817768,56.868931],[54.818138,56.871922],[54.818588,56.874352],[54.81926,56.877159],[54.820061,56.87973],[54.82132,56.88287],[54.825951,56.893631],[54.826462,56.894989],[54.82671,56.896278],[54.8269,56.89827],[54.826988,56.900848],[54.827091,56.903469],[54.827251,56.90778],[54.827751,56.91758],[54.828339,56.922459],[54.82917,56.927349],[54.82991,56.93148],[54.830528,56.935371],[54.83102,56.939499],[54.831219,56.942089],[54.83136,56.944679],[54.83186,56.96133],[54.832298,56.976261],[54.832489,56.981819],[54.832611,56.98418],[54.832748,56.98595],[54.832909,56.987659],[54.841751,57.05891],[54.842751,57.066971],[54.845871,57.092319],[54.846611,57.098259],[54.847,57.1012],[54.847179,57.10244],[54.847271,57.103039],[54.847351,57.1035],[54.847511,57.104221],[54.847729,57.105179],[54.850578,57.11689],[54.85368,57.12962],[54.853931,57.13068],[54.856098,57.13966],[54.857651,57.146091],[54.859219,57.152538],[54.860199,57.156212],[54.86039,57.156841],[54.860592,57.157551],[54.86079,57.158089],[54.860989,57.15863],[54.861271,57.15929],[54.86327,57.164169],[54.865829,57.170479],[54.870941,57.183079],[54.873699,57.189919],[54.874222,57.191341],[54.874599,57.192589],[54.87492,57.193729],[54.875172,57.19487],[54.875389,57.19598],[54.87561,57.197201],[54.875809,57.198551],[54.87598,57.199921],[54.876228,57.20211],[54.879848,57.23526],[54.883839,57.271709],[54.88488,57.281361],[54.885391,57.286228],[54.885761,57.289349],[54.886009,57.291],[54.88623,57.29237],[54.88662,57.29438],[54.88707,57.296478],[54.887661,57.298771],[54.888168,57.30069],[54.888451,57.30154],[54.88868,57.30225],[54.88908,57.30341],[54.889408,57.304249],[54.889931,57.305592],[54.890362,57.306591],[54.89061,57.307152],[54.891491,57.309158],[54.893631,57.313969],[54.8983,57.324348],[54.90033,57.328899],[54.902451,57.333641],[54.902882,57.334629],[54.903229,57.33551],[54.903599,57.336491],[54.904221,57.338348],[54.904751,57.340061],[54.90514,57.341339],[54.905849,57.343498],[54.905949,57.344791],[54.907589,57.352791],[54.90855,57.35762],[54.909931,57.364521],[54.910099,57.365318],[54.911282,57.370911],[54.911678,57.372929],[54.911949,57.37447],[54.91214,57.375969],[54.912251,57.37751],[54.912239,57.379021],[54.91217,57.380489],[54.912048,57.382011],[54.911758,57.385181],[54.911671,57.386372],[54.911621,57.38739],[54.91164,57.388378],[54.911709,57.389439],[54.9118,57.390491],[54.911961,57.391682],[54.912128,57.392632],[54.912338,57.393501],[54.912579,57.394428],[54.913738,57.398151],[54.915539,57.40395],[54.915821,57.404789],[54.916302,57.406052],[54.916759,57.40707],[54.91745,57.40836],[54.918049,57.409409],[54.91856,57.410229],[54.91906,57.410919],[54.919621,57.41161],[54.920891,57.412979],[54.92168,57.41362],[54.922581,57.41423],[54.922661,57.41428],[54.923611,57.414799],[54.92411,57.415031],[54.924591,57.415218],[54.92514,57.41539],[54.925991,57.41552],[54.927502,57.41568],[54.928959,57.415852],[54.930241,57.41597],[54.931141,57.416088],[54.931541,57.41621],[54.93187,57.41637],[54.932251,57.416611],[54.932732,57.416939],[54.93317,57.417301],[54.933681,57.417839],[54.934261,57.418579],[54.934978,57.419701],[54.936569,57.422218],[54.9384,57.425159],[54.93906,57.42614],[54.93964,57.426949],[54.940189,57.42765],[54.940929,57.42841],[54.941841,57.429161],[54.942799,57.429859],[54.943611,57.430462],[54.944111,57.430882],[54.944618,57.431351],[54.945148,57.431881],[54.945789,57.432579],[54.946369,57.433239],[54.946819,57.4338],[54.94735,57.434559],[54.947849,57.43528],[54.948238,57.435871],[54.948559,57.43642],[54.94891,57.437119],[54.94923,57.438049],[54.949471,57.43898],[54.94981,57.44046],[54.951229,57.4473],[54.952629,57.454121],[54.953041,57.456089],[54.953308,57.45726],[54.953541,57.458179],[54.953732,57.458931],[54.953999,57.459751],[54.9543,57.46064],[54.954609,57.46146],[54.95499,57.46244],[54.955421,57.463322],[54.95623,57.46487],[54.956848,57.465889],[54.95752,57.466869],[54.959419,57.469212],[54.961609,57.471859],[54.964561,57.476082],[54.966679,57.479179],[54.96748,57.480358],[54.967831,57.480942],[54.968151,57.48151],[54.96851,57.482231],[54.969051,57.48349],[54.969601,57.484901],[54.969872,57.48568],[54.970131,57.48679],[54.970421,57.488289],[54.971851,57.496109],[54.973801,57.507069],[54.9743,57.509739],[54.974812,57.51218],[54.976761,57.520279],[54.97905,57.529819],[54.980228,57.53471],[54.980942,57.537682],[54.981831,57.541401],[54.982738,57.5452],[54.983238,57.547199],[54.983589,57.54863],[54.98391,57.54998],[54.984211,57.551189],[54.984638,57.553089],[54.985069,57.555191],[54.98534,57.556782],[54.986221,57.562389],[54.987881,57.573261],[54.989071,57.58107],[54.990009,57.587139],[54.990292,57.588848],[54.99073,57.59108],[54.991402,57.594082],[54.991611,57.594971],[54.991829,57.595711],[54.9921,57.596432],[54.992481,57.597321],[54.993031,57.598309],[54.99374,57.599461],[54.99625,57.603321],[54.996559,57.603901],[54.99678,57.604401],[54.997028,57.605068],[54.997261,57.60582],[54.997509,57.606812],[54.997761,57.60796],[54.99929,57.614929],[54.999401,57.615528],[54.999569,57.616638],[54.99963,57.617451],[54.999649,57.61824],[54.999619,57.619141],[54.999561,57.62038],[54.999458,57.621529],[54.999352,57.622421],[54.999161,57.62368],[54.998989,57.625019],[54.99894,57.62561],[54.998909,57.626289],[54.998932,57.626961],[54.999008,57.627781],[54.999111,57.628422],[54.999241,57.628922],[55.00016,57.631901],[55.000332,57.632721],[55.000439,57.63356],[55.000511,57.63483],[55.00053,57.636471],[55.00045,57.640511],[55.00042,57.641621],[55.000351,57.64259],[55.00021,57.643822],[55.00005,57.64492],[54.999748,57.646561],[54.999561,57.647572],[54.99942,57.648769],[54.999329,57.649891],[54.999298,57.6511],[54.999359,57.652069],[54.999569,57.65411],[54.99979,57.655891],[55.00016,57.658321],[55.000462,57.65979],[55.00074,57.660851],[55.00108,57.66193],[55.002369,57.66563],[55.00433,57.671101],[55.00518,57.67347],[55.005989,57.675831],[55.006229,57.676601],[55.00647,57.677422],[55.006779,57.678558],[55.00705,57.679668],[55.00732,57.68092],[55.007439,57.681728],[55.0075,57.682461],[55.007542,57.683418],[55.007561,57.684841],[55.007568,57.686138],[55.007542,57.687408],[55.007469,57.688499],[55.007381,57.689579],[55.007271,57.690868],[55.006889,57.69455],[55.006748,57.69582],[55.006229,57.701149],[55.006039,57.703571],[55.005871,57.70657],[55.005852,57.70681],[55.00584,57.70705],[55.0056,57.711048],[55.005508,57.711979],[55.005371,57.712799],[55.004532,57.716129],[55.004219,57.716888],[55.003811,57.71769],[55.003349,57.718189],[55.002869,57.718571],[55.002399,57.7188],[55.00169,57.718868],[55.001129,57.71875],[55.000629,57.718449],[55.00013,57.71801],[54.99934,57.71719],[54.998329,57.71587],[54.99786,57.715302],[54.99728,57.71468],[54.996689,57.71402],[54.996109,57.713409],[54.995838,57.713181],[54.99559,57.713032],[54.99535,57.712971],[54.995129,57.712978],[54.994869,57.713051],[54.994678,57.713169],[54.994511,57.713322],[54.994339,57.713558],[54.994171,57.71394],[54.994041,57.71434],[54.993969,57.71484],[54.993961,57.71534],[54.99408,57.71619],[54.994362,57.71743],[54.994888,57.719109],[54.995029,57.71981],[54.995121,57.720612],[54.99514,57.721199],[54.995071,57.721741],[54.99469,57.723579],[54.992451,57.73497],[54.99155,57.739571],[54.99041,57.745319],[54.986382,57.765751],[54.98336,57.777149],[54.982868,57.77919],[54.9827,57.780079],[54.982578,57.781471],[54.982521,57.7831],[54.982521,57.784019],[54.9827,57.78746],[54.982929,57.791069],[54.983139,57.794201],[54.983219,57.79554],[54.983261,57.79657],[54.98328,57.79734],[54.983231,57.798279],[54.98299,57.79966],[54.982281,57.802799],[54.981541,57.806122],[54.980991,57.80854],[54.980259,57.811661],[54.980068,57.812382],[54.97966,57.813519],[54.979259,57.81432],[54.978779,57.815109],[54.978222,57.815849],[54.977699,57.816441],[54.977139,57.81702],[54.975739,57.81852],[54.974232,57.82011],[54.97271,57.821732],[54.971359,57.823158],[54.970249,57.824379],[54.969761,57.82505],[54.96928,57.825802],[54.96904,57.826241],[54.96875,57.82695],[54.968449,57.827839],[54.968182,57.828892],[54.967529,57.832352],[54.965641,57.842831],[54.965321,57.846352],[54.965778,57.850979],[54.9683,57.866692],[54.96925,57.87114],[54.97163,57.87743],[54.97298,57.884399],[54.97345,57.88818],[54.973621,57.891861],[54.973221,57.896992],[54.971889,57.90617],[54.971489,57.90847],[54.971142,57.910809],[54.971001,57.911911],[54.970871,57.913189],[54.97076,57.914551],[54.97068,57.915878],[54.970631,57.917332],[54.970612,57.918831],[54.970772,57.925819],[54.970879,57.931122],[54.971111,57.93475],[54.970661,57.93922],[54.968941,57.954922],[54.968201,57.96059],[54.967072,57.96685],[54.966282,57.97089],[54.962391,57.982052],[54.959461,57.98822],[54.95628,57.993069],[54.947769,58.001431],[54.94186,58.00684],[54.93618,58.012051],[54.929489,58.01952],[54.922199,58.028999],[54.920761,58.031719],[54.919991,58.035351],[54.918999,58.04007],[54.91861,58.044579],[54.919621,58.05241],[54.919849,58.055222],[54.919689,58.057919],[54.918949,58.061138],[54.91687,58.066639],[54.914459,58.072941],[54.914261,58.07449],[54.914009,58.07719],[54.914108,58.080021],[54.91412,58.083241],[54.913422,58.08646],[54.910488,58.09568],[54.909309,58.099461],[54.90794,58.10371],[54.907349,58.105831],[54.90641,58.109039],[54.905319,58.111012],[54.904041,58.113071],[54.90316,58.115429],[54.90276,58.118912],[54.902111,58.122169],[54.901131,58.125],[54.89925,58.12878],[54.897621,58.13118],[54.896839,58.133331],[54.896439,58.137531],[54.896599,58.142029],[54.89621,58.14418],[54.896099,58.144779],[54.894371,58.152939],[54.8923,58.160568],[54.88839,58.16972],[54.877441,58.192841],[54.87616,58.19817],[54.87537,58.20314],[54.875019,58.205891],[54.872601,58.227779],[54.86969,58.252331],[54.86937,58.25486],[54.868851,58.257912],[54.86615,58.263439],[54.859852,58.274681],[54.85759,58.27953],[54.8568,58.282619],[54.855759,58.28717],[54.855221,58.2901],[54.855209,58.293781],[54.85516,58.296181],[54.854931,58.297989],[54.85429,58.300251],[54.85218,58.303909],[54.851109,58.30648],[54.85067,58.31023],[54.851349,58.315891],[54.852242,58.322498],[54.853432,58.328251],[54.855499,58.334511],[54.857578,58.339748],[54.860001,58.346272],[54.86356,58.359058],[54.864639,58.361889],[54.865711,58.363682],[54.866711,58.365101],[54.868511,58.367081],[54.870312,58.368992],[54.871632,58.370708],[54.87188,58.37104],[54.87233,58.371769],[54.87291,58.372799],[54.873981,58.375439],[54.875271,58.37883],[54.875259,58.378799],[54.87561,58.37991],[54.875881,58.381222],[54.876209,58.38335],[54.876369,58.38538],[54.876419,58.38731],[54.876549,58.388569],[54.876701,58.38958],[54.876888,58.39056],[54.87957,58.398319],[54.88208,58.405579],[54.88253,58.406719],[54.88303,58.407761],[54.883709,58.408772],[54.88446,58.409649],[54.884811,58.410118],[54.885071,58.410519],[54.885342,58.41114],[54.885609,58.41198],[54.88562,58.41209],[54.88588,58.413651],[54.885891,58.413731],[54.885941,58.414082],[54.886341,58.416908],[54.886429,58.4179],[54.886471,58.41938],[54.886478,58.420269],[54.88649,58.420891],[54.88662,58.423191],[54.88681,58.425011],[54.887581,58.43187],[54.88773,58.433399],[54.887829,58.434341],[54.887871,58.434719],[54.887932,58.435169],[54.88805,58.43618],[54.888119,58.43681],[54.888599,58.440239],[54.88921,58.444561],[54.88932,58.44585],[54.88929,58.447071],[54.889229,58.44799],[54.889091,58.44886],[54.888939,58.449711],[54.888691,58.450562],[54.888458,58.451302],[54.88821,58.451981],[54.88789,58.45269],[54.887508,58.453259],[54.886829,58.454208],[54.88588,58.45509],[54.884529,58.456032],[54.882469,58.457481],[54.881641,58.458061],[54.88073,58.458912],[54.88039,58.45937],[54.880058,58.459999],[54.876789,58.467121],[54.87598,58.469059],[54.87574,58.470112],[54.87542,58.47274],[54.875141,58.474892],[54.87492,58.475681],[54.874619,58.47641],[54.87336,58.47868],[54.871059,58.481972],[54.87067,58.482498],[54.869678,58.48386],[54.868858,58.485409],[54.868279,58.48671],[54.867729,58.488331],[54.867222,58.490761],[54.86694,58.492859],[54.866859,58.49493],[54.866859,58.4967],[54.867031,58.498428],[54.867279,58.500332],[54.868,58.505741],[54.86858,58.510281],[54.868698,58.512032],[54.86861,58.513531],[54.868351,58.51495],[54.867569,58.517971],[54.867329,58.519619],[54.867149,58.521931],[54.867031,58.524361],[54.86684,58.526409],[54.86652,58.528271],[54.865879,58.53072],[54.865391,58.532169],[54.864849,58.533569],[54.864231,58.534939],[54.86356,58.536221],[54.862251,58.53828],[54.860821,58.540161],[54.860008,58.54134],[54.859348,58.54269],[54.858711,58.544571],[54.85836,58.545929],[54.858109,58.547569],[54.857948,58.549541],[54.857922,58.558102],[54.858021,58.59304],[54.85812,58.601959],[54.858089,58.603661],[54.858028,58.607029],[54.857792,58.612381],[54.856152,58.65015],[54.856312,58.65461],[54.857529,58.67363],[54.8578,58.677269],[54.858101,58.67989],[54.85878,58.68224],[54.862438,58.69508],[54.86359,58.69994],[54.864601,58.708519],[54.865471,58.714401],[54.86536,58.716499],[54.864891,58.71854],[54.862438,58.724091],[54.8615,58.726311],[54.861301,58.726791],[54.861118,58.727341],[54.86076,58.72858],[54.86063,58.729568],[54.86055,58.730579],[54.860531,58.731232],[54.86055,58.73188],[54.860729,58.733189],[54.860821,58.733551],[54.861,58.734329],[54.861229,58.73505],[54.8615,58.735748],[54.861801,58.736431],[54.8633,58.739399],[54.864861,58.7425],[54.86726,58.747711],[54.86792,58.749409],[54.868431,58.75082],[54.86969,58.754509],[54.87112,58.75959],[54.872021,58.763599],[54.872471,58.766411],[54.873249,58.77142],[54.873669,58.77515],[54.874531,58.78252],[54.87529,58.78838],[54.875992,58.794739],[54.877651,58.804951],[54.87949,58.812359],[54.880798,58.817051],[54.881649,58.820202],[54.88184,58.8209],[54.882408,58.823139],[54.88818,58.84444],[54.889549,58.849411],[54.891258,58.85582],[54.89296,58.862019],[54.894009,58.865898],[54.895599,58.87178],[54.896351,58.874321],[54.897129,58.87656],[54.897869,58.87851],[54.898602,58.88028],[54.900181,58.883518],[54.90126,58.885422],[54.902088,58.886688],[54.90332,58.888519],[54.904209,58.88969],[54.905102,58.890732],[54.906528,58.892269],[54.90789,58.893501],[54.90921,58.894581],[54.916771,58.89999],[54.919979,58.902191],[54.921471,58.903381],[54.922241,58.904099],[54.922901,58.9048],[54.92342,58.905418],[54.923889,58.90612],[54.924431,58.906921],[54.92514,58.908249],[54.925701,58.909481],[54.926109,58.910461],[54.92659,58.911919],[54.926949,58.913349],[54.92717,58.914471],[54.927391,58.91584],[54.92757,58.91724],[54.927689,58.918709],[54.9277,58.92009],[54.927662,58.922642],[54.927521,58.92664],[54.927521,58.928459],[54.92762,58.930641],[54.92783,58.932461],[54.928108,58.93409],[54.928509,58.935711],[54.929001,58.937309],[54.929451,58.938568],[54.92981,58.939369],[54.930222,58.940151],[54.930569,58.94088],[54.93317,58.945461],[54.933681,58.946121],[54.9342,58.946751],[54.93483,58.947361],[54.935421,58.94783],[54.936131,58.948261],[54.93689,58.948669],[54.937778,58.948921],[54.938148,58.949032],[54.939041,58.949299],[54.941181,58.949848],[54.94286,58.950291],[54.948559,58.951759],[54.95015,58.952301],[54.951408,58.95293],[54.952469,58.953609],[54.953579,58.954441],[54.955879,58.95702],[54.956718,58.95816],[54.957458,58.959309],[54.95826,58.96077],[54.958961,58.962231],[54.960209,58.96526],[54.964561,58.97612],[54.966148,58.979691],[54.96846,58.98386],[54.971909,58.99012],[54.980068,59.004581],[54.98201,59.00872],[54.98317,59.011841],[54.984291,59.01524],[54.988029,59.02697],[54.988899,59.02961],[54.989639,59.031521],[54.990528,59.033482],[54.991428,59.03516],[54.992359,59.036671],[54.993172,59.037769],[54.995762,59.04158],[54.996811,59.043549],[54.997601,59.04528],[54.998409,59.047291],[54.998871,59.048698],[54.99931,59.050179],[54.999981,59.053009],[55.000969,59.05806],[55.001591,59.06147],[55.001881,59.063049],[55.002171,59.064411],[55.002541,59.0658],[55.002892,59.066929],[55.00325,59.067959],[55.003639,59.069],[55.004219,59.07024],[55.004688,59.071232],[55.00515,59.072071],[55.005798,59.073101],[55.00671,59.074471],[55.007648,59.075871],[55.009418,59.078602],[55.009991,59.07967],[55.010441,59.080662],[55.010929,59.081841],[55.012039,59.085289],[55.012371,59.08654],[55.012691,59.087978],[55.012901,59.089668],[55.013199,59.092682],[55.013451,59.095551],[55.013618,59.097679],[55.014332,59.106461],[55.014641,59.108871],[55.01498,59.110481],[55.01545,59.112091],[55.015831,59.11319],[55.016281,59.114239],[55.01688,59.115341],[55.017479,59.116329],[55.018269,59.11747],[55.019199,59.11871],[55.02042,59.120419],[55.020988,59.12122],[55.022541,59.123219],[55.02383,59.124649],[55.024811,59.125702],[55.025921,59.12674],[55.027531,59.128071],[55.032501,59.13216],[55.03307,59.132671],[55.034271,59.133629],[55.034901,59.134151],[55.038521,59.137138],[55.04015,59.138451],[55.04047,59.138741],[55.0415,59.139599],[55.04211,59.140049],[55.042591,59.140411],[55.044239,59.141479],[55.048489,59.144131],[55.050339,59.145309],[55.0509,59.145729],[55.0513,59.14603],[55.051731,59.14637],[55.05204,59.146629],[55.052319,59.14687],[55.05254,59.147079],[55.05278,59.147301],[55.053009,59.14753],[55.05452,59.149109],[55.059559,59.15451],[55.059799,59.154812],[55.059978,59.155022],[55.0602,59.155281],[55.06039,59.155529],[55.060558,59.15575],[55.060749,59.15601],[55.060982,59.156349],[55.061241,59.156769],[55.061508,59.157219],[55.062092,59.15831],[55.062199,59.158562],[55.06229,59.158798],[55.062382,59.159039],[55.062721,59.160069],[55.062908,59.16066],[55.06308,59.161221],[55.06321,59.161732],[55.063381,59.16238],[55.063568,59.163151],[55.063931,59.16457],[55.064159,59.16555],[55.064491,59.166882],[55.064751,59.167938],[55.065479,59.17107],[55.066669,59.17609],[55.068981,59.18594],[55.069931,59.18998],[55.07061,59.193001],[55.071239,59.19614],[55.071812,59.19902],[55.07225,59.2015],[55.073051,59.206139],[55.074249,59.21299],[55.07515,59.2183],[55.07552,59.220089],[55.076321,59.223579],[55.077019,59.226261],[55.07766,59.228409],[55.078308,59.230431],[55.078972,59.232281],[55.081261,59.238392],[55.08535,59.249168],[55.087631,59.255032],[55.0886,59.25729],[55.089062,59.258221],[55.089828,59.259731],[55.090889,59.26157],[55.09185,59.262989],[55.09269,59.264252],[55.093651,59.265469],[55.095951,59.26833],[55.096569,59.26907],[55.097462,59.27026],[55.098019,59.27116],[55.098541,59.272079],[55.099072,59.273102],[55.099758,59.27475],[55.100288,59.276279],[55.10078,59.277931],[55.10117,59.279331],[55.101639,59.281368],[55.1022,59.283661],[55.10268,59.285751],[55.102859,59.28648],[55.103088,59.287189],[55.103279,59.287701],[55.103519,59.28817],[55.103828,59.288639],[55.105659,59.29092],[55.105881,59.291321],[55.106079,59.29174],[55.106312,59.292301],[55.107021,59.29454],[55.10857,59.299801],[55.108898,59.30117],[55.10918,59.30238],[55.109459,59.303768],[55.109989,59.307079],[55.110519,59.310341],[55.110611,59.31094],[55.11068,59.311699],[55.110729,59.31263],[55.110748,59.31324],[55.110771,59.31432],[55.110649,59.319199],[55.110519,59.32346],[55.11042,59.326061],[55.110359,59.32769],[55.110298,59.330109],[55.110298,59.331009],[55.110321,59.33194],[55.110359,59.332951],[55.110401,59.333839],[55.110489,59.334721],[55.1106,59.335812],[55.110729,59.33691],[55.110939,59.33815],[55.11116,59.339218],[55.111439,59.34045],[55.111809,59.34206],[55.115021,59.35487],[55.115238,59.355801],[55.11562,59.357689],[55.11581,59.35886],[55.115959,59.360001],[55.116051,59.361031],[55.116119,59.361969],[55.11618,59.36314],[55.116192,59.364391],[55.11618,59.3657],[55.11615,59.36681],[55.116112,59.36787],[55.115879,59.372749],[55.11573,59.37569],[55.115589,59.378368],[55.115589,59.379139],[55.115589,59.379799],[55.11562,59.380531],[55.115688,59.381241],[55.115761,59.381802],[55.115879,59.38242],[55.116951,59.387329],[55.11702,59.38776],[55.117081,59.388271],[55.117142,59.388809],[55.11718,59.389301],[55.11721,59.389919],[55.117161,59.392971],[55.11702,59.396809],[55.11697,59.397652],[55.116909,59.398319],[55.116859,59.398869],[55.11676,59.399422],[55.11652,59.40028],[55.11618,59.401199],[55.11586,59.401741],[55.115501,59.402359],[55.115372,59.402531],[55.11528,59.402649],[55.114738,59.403351],[55.113369,59.40509],[55.113029,59.40559],[55.112659,59.4062],[55.112339,59.40704],[55.112171,59.407681],[55.11203,59.408379],[55.1119,59.409279],[55.111889,59.410118],[55.111919,59.41098],[55.112122,59.413879],[55.112259,59.415508],[55.112492,59.417099],[55.11264,59.417912],[55.112801,59.41848],[55.112968,59.418949],[55.113232,59.419601],[55.11351,59.420078],[55.113861,59.420631],[55.114769,59.421959],[55.11721,59.425442],[55.119701,59.428822],[55.12006,59.429211],[55.120548,59.429661],[55.123482,59.432072],[55.123798,59.432362],[55.124062,59.43261],[55.124298,59.432892],[55.124489,59.43317],[55.12468,59.433472],[55.12487,59.433842],[55.125092,59.43438],[55.125721,59.43589],[55.12719,59.440029],[55.127319,59.44051],[55.127441,59.440941],[55.127571,59.441521],[55.127651,59.442081],[55.127708,59.44273],[55.12772,59.44334],[55.12772,59.443851],[55.12767,59.44434],[55.127609,59.444851],[55.127529,59.445351],[55.127369,59.446049],[55.127171,59.446621],[55.12693,59.447201],[55.126621,59.447781],[55.126202,59.448399],[55.125,59.449959],[55.124748,59.45034],[55.124531,59.45076],[55.12431,59.451248],[55.12331,59.454609],[55.122761,59.456589],[55.12199,59.459351],[55.121761,59.46022],[55.121529,59.46106],[55.12133,59.46196],[55.121208,59.462841],[55.120991,59.46529],[55.12093,59.46587],[55.12085,59.466599],[55.120781,59.467098],[55.120689,59.467541],[55.12056,59.468079],[55.120338,59.468811],[55.120121,59.46944],[55.119888,59.47002],[55.11961,59.470581],[55.117699,59.47393],[55.117489,59.47438],[55.117229,59.47504],[55.117031,59.475651],[55.116879,59.476311],[55.116711,59.477131],[55.11657,59.477951],[55.116161,59.48074],[55.115761,59.483471],[55.11483,59.49308],[55.114189,59.501492],[55.112179,59.51009],[55.110081,59.516941],[55.10947,59.519161],[55.109039,59.52121],[55.10873,59.523621],[55.10865,59.525982],[55.10873,59.528],[55.108952,59.529942],[55.109409,59.532139],[55.10984,59.53363],[55.110432,59.535252],[55.111099,59.53677],[55.113239,59.541359],[55.113789,59.542641],[55.11425,59.543861],[55.114868,59.545769],[55.115292,59.547199],[55.115841,59.549469],[55.11694,59.554329],[55.11747,59.556259],[55.118118,59.558281],[55.11927,59.561562],[55.11972,59.562962],[55.12011,59.56435],[55.12056,59.565922],[55.121151,59.567581],[55.122509,59.571259],[55.122978,59.572731],[55.123299,59.574089],[55.123619,59.575611],[55.123989,59.577789],[55.124439,59.58099],[55.124989,59.584999],[55.12516,59.586498],[55.12524,59.58778],[55.12524,59.588848],[55.125092,59.590099],[55.124939,59.590851],[55.124748,59.591572],[55.124481,59.592289],[55.12418,59.59288],[55.123409,59.59404],[55.123329,59.594139],[55.122601,59.59499],[55.11953,59.59798],[55.117321,59.600151],[55.116501,59.600948],[55.115921,59.601379],[55.115299,59.60165],[55.114639,59.601711],[55.11412,59.601608],[55.11351,59.601299],[55.11026,59.599369],[55.109241,59.59885],[55.108608,59.59866],[55.107189,59.598419],[55.10659,59.598202],[55.105968,59.59779],[55.10545,59.597221],[55.10495,59.59642],[55.103981,59.59449],[55.103279,59.59317],[55.102772,59.592411],[55.102291,59.591862],[55.101688,59.591351],[55.10051,59.590549],[55.09898,59.589611],[55.09766,59.588779],[55.096279,59.58794],[55.094761,59.587158],[55.09462,59.58709],[55.093159,59.586491],[55.09169,59.586109],[55.090179,59.585899],[55.087391,59.585678],[55.08651,59.585609],[55.085659,59.58543],[55.084679,59.585098],[55.083912,59.584839],[55.083149,59.58469],[55.082291,59.584641],[55.07872,59.58461],[55.076729,59.58466],[55.075802,59.584759],[55.075039,59.585018],[55.074181,59.58556],[55.073639,59.586201],[55.072979,59.587341],[55.072472,59.588779],[55.072281,59.589512],[55.07201,59.590611],[55.068249,59.610561],[55.06686,59.617882],[55.066792,59.61824],[55.064869,59.628311],[55.064369,59.630939],[55.063782,59.63372],[55.063171,59.636219],[55.062881,59.63715],[55.062511,59.63834],[55.061649,59.640789],[55.06097,59.6423],[55.060009,59.64397],[55.059361,59.64513],[55.05859,59.646542],[55.05806,59.647812],[55.057621,59.649422],[55.057251,59.651299],[55.05698,59.653542],[55.056862,59.655731],[55.05669,59.6618],[55.05632,59.673031],[55.055679,59.696388],[55.055641,59.697941],[55.05545,59.70269],[55.055229,59.706039],[55.05479,59.70961],[55.054371,59.711731],[55.05373,59.714111],[55.052979,59.71627],[55.052181,59.71796],[55.05088,59.720058],[55.049549,59.721661],[55.048141,59.72298],[55.046951,59.723701],[55.045479,59.724319],[55.044159,59.724628],[55.04253,59.724789],[55.04084,59.724709],[55.039009,59.72438],[55.034672,59.723301],[55.032082,59.72263],[55.031349,59.722511],[55.030609,59.722439],[55.029442,59.722469],[55.02808,59.72274],[55.026699,59.72327],[55.025501,59.723991],[55.024311,59.724892],[55.022549,59.726681],[55.021229,59.72855],[55.019981,59.730789],[55.019112,59.7328],[55.01836,59.734989],[55.017818,59.73703],[55.017281,59.739811],[55.016949,59.742611],[55.016781,59.744831],[55.016548,59.752708],[55.016479,59.758751],[55.016541,59.760941],[55.01675,59.763359],[55.01712,59.765491],[55.01791,59.7687],[55.018188,59.77018],[55.018391,59.771759],[55.018471,59.77317],[55.01844,59.774551],[55.018261,59.776371],[55.017941,59.7784],[55.017021,59.782459],[55.01545,59.78944],[55.014591,59.792622],[55.013741,59.795219],[55.012909,59.797359],[55.011108,59.801861],[55.009972,59.80434],[55.00528,59.814522],[55.001629,59.82243],[54.998661,59.828949],[54.998161,59.83004],[54.99617,59.833672],[54.994751,59.83762],[54.993271,59.845428],[54.990711,59.852638],[54.988449,59.857792],[54.984798,59.864231],[54.983311,59.8666],[54.9762,59.877918],[54.975151,59.879589],[54.972931,59.882938],[54.971111,59.88689],[54.96899,59.892891],[54.966721,59.904572],[54.964111,59.922588],[54.963081,59.928169],[54.961498,59.93375],[54.958889,59.93924],[54.95475,59.948601],[54.953461,59.951599],[54.950409,59.955978],[54.948441,59.959332],[54.946911,59.96328],[54.946072,59.966621],[54.945499,59.96957],[54.945301,59.97123],[54.945251,59.972099],[54.94519,59.972939],[54.945091,59.974689],[54.945049,59.97646],[54.944969,59.983688],[54.944931,59.98642],[54.944809,59.995998],[54.944618,60.010189],[54.944569,60.012428],[54.944439,60.014481],[54.944302,60.017578],[54.94421,60.019371],[54.943981,60.023159],[54.943939,60.024429],[54.94384,60.027279],[54.94389,60.03072],[54.94389,60.031479],[54.944149,60.050861],[54.944229,60.054852],[54.94426,60.057011],[54.944279,60.05846],[54.944649,60.08567],[54.944889,60.102211],[54.944839,60.10564],[54.94466,60.10783],[54.94437,60.109631],[54.94392,60.111649],[54.94326,60.11367],[54.94249,60.11581],[54.941429,60.118179],[54.937809,60.126369],[54.93663,60.12925],[54.93581,60.131908],[54.934238,60.138969],[54.934101,60.13953],[54.932701,60.1455],[54.931992,60.14938],[54.931629,60.151779],[54.931301,60.155849],[54.93108,60.15937],[54.93087,60.165771],[54.930271,60.178749],[54.929359,60.198689],[54.929211,60.19973],[54.926651,60.217232],[54.924358,60.232849],[54.92395,60.235291],[54.923698,60.23925],[54.923599,60.242512],[54.92342,60.259071],[54.92326,60.27956],[54.923092,60.284538],[54.920158,60.315289],[54.92004,60.316509],[54.919449,60.322781],[54.919201,60.325329],[54.9189,60.32843],[54.918819,60.3293],[54.918621,60.33147],[54.916981,60.34874],[54.91441,60.374008],[54.911572,60.402851],[54.91098,60.409698],[54.91048,60.41692],[54.910339,60.42078],[54.910252,60.426491],[54.910351,60.434891],[54.910801,60.455132],[54.911251,60.486462],[54.911621,60.51305],[54.912979,60.534969],[54.91325,60.538929],[54.913342,60.54007],[54.913952,60.54858],[54.916229,60.584351],[54.919479,60.633011],[54.919842,60.638851],[54.920479,60.64851],[54.921619,60.675339],[54.92107,60.67408],[54.921509,60.69199],[54.921612,60.69524],[54.921799,60.69796],[54.922371,60.70192],[54.924622,60.71656],[54.925159,60.7192],[54.927841,60.729431],[54.9282,60.730999],[54.928398,60.73328],[54.92902,60.73719],[54.930241,60.74353],[54.930801,60.745392],[54.932491,60.752548],[54.932629,60.753159],[54.936001,60.767448],[54.936451,60.769508],[54.937248,60.773232],[54.93771,60.775459],[54.938122,60.77766],[54.93803,60.779171],[54.938332,60.78286],[54.939419,60.785549],[54.940842,60.794399],[54.94128,60.7971],[54.941471,60.798279],[54.942089,60.801979],[54.942909,60.807018],[54.94331,60.809681],[54.944839,60.818668],[54.94495,60.819389],[54.945629,60.824699],[54.94928,60.852829],[54.95261,60.882751],[54.954609,60.901951],[54.954708,60.904129],[54.95509,60.906891],[54.955589,60.909828],[54.956261,60.912861],[54.9576,60.917679],[54.958611,60.921341],[54.964859,60.94379],[54.96888,60.958241],[54.969551,60.961021],[54.97187,60.971321],[54.972969,60.976131],[54.977161,60.99435],[54.98082,61.010262],[54.982491,61.017448],[54.983349,61.021061],[54.986229,61.033569],[54.987339,61.038368],[54.988258,61.042351],[54.989109,61.046051],[54.989288,61.046822],[54.989632,61.048321],[54.98996,61.0499],[54.990189,61.05109],[54.990421,61.052479],[54.99057,61.05357],[54.9907,61.054642],[54.99081,61.055851],[54.990898,61.057018],[54.991009,61.058819],[54.991089,61.060139],[54.99128,61.063751],[54.99176,61.071911],[54.992748,61.08934],[54.993912,61.10981],[54.993931,61.110161],[54.99408,61.112862],[54.994148,61.11396],[54.994549,61.121311],[54.99472,61.123779],[54.994831,61.125111],[54.994862,61.125519],[54.994999,61.126659],[54.99522,61.12833],[54.99548,61.12981],[54.995819,61.1315],[54.99609,61.132759],[54.996498,61.134472],[54.996761,61.135448],[54.997131,61.136761],[54.997581,61.138161],[54.998871,61.142101],[54.999329,61.143509],[55.000858,61.148209],[55.001511,61.150211],[55.001968,61.151829],[55.002369,61.153412],[55.00272,61.1548],[55.002941,61.155941],[55.002979,61.156281],[55.002991,61.156651],[55.002991,61.156971],[55.002911,61.15749],[55.002781,61.158169],[55.002171,61.160671],[55.001949,61.161549],[55.00172,61.162239],[55.00148,61.16283],[55.001259,61.16333],[55.0009,61.163971],[55.000141,61.165058],[54.996979,61.168869],[54.993469,61.1731],[54.992802,61.173901],[54.99239,61.174412],[54.991531,61.175449],[54.990662,61.176491],[54.9874,61.180519],[54.98365,61.185501],[54.9804,61.19133],[54.977051,61.19854],[54.974892,61.20438],[54.97282,61.211929],[54.97171,61.217461],[54.971439,61.2188],[54.97065,61.224979],[54.96986,61.23476],[54.969269,61.249008],[54.968681,61.262569],[54.96751,61.29174],[54.967461,61.29483],[54.967461,61.299309],[54.967628,61.32032],[54.967682,61.326801],[54.967682,61.329762],[54.967461,61.33461],[54.967361,61.33614],[54.967041,61.341091],[54.96685,61.345928],[54.966789,61.34951],[54.966759,61.35709],[54.96685,61.360802],[54.96703,61.365589],[54.9673,61.37249],[54.96756,61.37883],[54.9678,61.383862],[54.967819,61.384609],[54.967812,61.385429],[54.96777,61.38623],[54.967701,61.386978],[54.967602,61.387669],[54.967529,61.3881],[54.96735,61.389259],[54.967232,61.38987],[54.967041,61.391029],[54.966961,61.391479],[54.966942,61.39185],[54.966949,61.39222],[54.967018,61.39257],[54.96711,61.39283],[54.967239,61.393101],[54.9674,61.393311],[54.967579,61.39344],[54.96777,61.393509],[54.967979,61.39352],[54.968208,61.393478],[54.968811,61.39325],[54.969051,61.3932],[54.969299,61.3932],[54.969582,61.393242],[54.96981,61.393341],[54.969978,61.393471],[54.970119,61.393631],[54.97057,61.394379],[54.972691,61.39875],[54.973919,61.40144],[54.97477,61.403461],[54.9786,61.413589],[54.97929,61.415291],[54.980492,61.418209],[54.980968,61.419491],[54.9814,61.42099],[54.981701,61.422161],[54.98204,61.42374],[54.982349,61.425129],[54.98278,61.426861],[54.983089,61.42791],[54.983528,61.4291],[54.983879,61.430061],[54.984329,61.431099],[54.988491,61.440079],[54.98954,61.442242],[54.990509,61.443989],[54.991692,61.445782],[54.99292,61.44733],[54.99382,61.448318],[54.994579,61.449471],[54.99509,61.450371],[54.995461,61.451359],[54.995789,61.452339],[54.996151,61.453629],[54.996479,61.454491],[54.997021,61.455688],[54.99786,61.45694],[54.998058,61.457169],[54.99876,61.457989],[54.999859,61.459122],[55.00042,61.459549],[55.00108,61.46006],[55.001888,61.460609],[55.002708,61.461159],[55.00367,61.46183],[55.004639,61.4627],[55.005379,61.46357],[55.00602,61.46452],[55.00666,61.465801],[55.00713,61.466999],[55.007519,61.46833],[55.007858,61.46986],[55.008099,61.471519],[55.008171,61.472672],[55.00824,61.487968],[55.008251,61.4897],[55.00827,61.491631],[55.008282,61.492649],[55.008331,61.495178],[55.00843,61.496571],[55.008659,61.498852],[55.008991,61.501289],[55.009682,61.504978],[55.01041,61.507641],[55.011532,61.511021],[55.012581,61.51416],[55.013309,61.516312],[55.01548,61.522869],[55.016811,61.527439],[55.017639,61.531071],[55.018478,61.53603],[55.019588,61.543861],[55.021111,61.554241],[55.023998,61.57375],[55.024578,61.578789],[55.024818,61.582489],[55.024849,61.58744],[55.02467,61.59557],[55.02454,61.601311],[55.024609,61.60276],[55.024769,61.605431],[55.025021,61.6078],[55.025421,61.61084],[55.026749,61.619942],[55.029579,61.638821],[55.031319,61.65118],[55.034569,61.680481],[55.035259,61.688889],[55.035259,61.69593],[55.034569,61.703819],[55.03339,61.71249],[55.032059,61.723049],[55.032009,61.72665],[55.03231,61.729401],[55.032799,61.731548],[55.03344,61.733521],[55.04266,61.757488],[55.043159,61.758759],[55.04372,61.759941],[55.04438,61.761181],[55.045071,61.762299],[55.04578,61.763302],[55.04644,61.764141],[55.04697,61.764709],[55.047508,61.76524],[55.048679,61.766232],[55.0494,61.766689],[55.050129,61.76709],[55.05154,61.76767],[55.054871,61.768799],[55.06678,61.77285],[55.078411,61.77684],[55.079399,61.7771],[55.080681,61.777309],[55.08197,61.777409],[55.08297,61.77739],[55.084461,61.77729],[55.085041,61.777222],[55.08564,61.777119],[55.087132,61.77673],[55.08857,61.776218],[55.089409,61.77586],[55.09024,61.775459],[55.102551,61.768341],[55.106609,61.765961],[55.107342,61.76545],[55.11039,61.763729],[55.13361,61.750259],[55.137341,61.748631],[55.14967,61.745499],[55.15696,61.743649],[55.163601,61.742901],[55.165352,61.742981],[55.167831,61.743301],[55.170029,61.743801],[55.17173,61.744308],[55.171921,61.744381],[55.17342,61.74498],[55.175461,61.745899],[55.182289,61.74913],[55.186352,61.75108],[55.18853,61.751949],[55.190708,61.75256],[55.198181,61.75436],[55.20409,61.75584],[55.20697,61.756569],[55.208,61.756641],[55.208752,61.756569],[55.20924,61.756451],[55.210201,61.7561],[55.21088,61.75573],[55.211529,61.755268],[55.212528,61.75436],[55.213451,61.75325],[55.21397,61.75246],[55.21537,61.75016],[55.218601,61.7449],[55.221039,61.740891],[55.22345,61.736889],[55.22403,61.73605],[55.224651,61.735291],[55.224831,61.735111],[55.225269,61.734669],[55.22604,61.734032],[55.226971,61.73336],[55.228149,61.732979],[55.228642,61.733219],[55.23011,61.73447],[55.23177,61.73605],[55.232601,61.736912],[55.232922,61.737339],[55.234909,61.743431],[55.236519,61.74818],[55.237141,61.75024],[55.237549,61.751659],[55.240261,61.762218],[55.242809,61.772251],[55.245392,61.782318],[55.2486,61.79491],[55.249069,61.796661],[55.24947,61.798],[55.25161,61.804279],[55.252178,61.805759],[55.252621,61.806992],[55.2551,61.813889],[55.256981,61.819141],[55.257702,61.82119],[55.261089,61.830421],[55.264759,61.840389],[55.26614,61.843891],[55.266972,61.846279],[55.26722,61.847141],[55.267529,61.848389],[55.26783,61.85033],[55.268002,61.853001],[55.26807,61.85487],[55.268059,61.857052],[55.267948,61.858978],[55.267818,61.86047],[55.26495,61.88015],[55.263599,61.888641],[55.26321,61.891022],[55.262878,61.89325],[55.261162,61.904709],[55.260529,61.908791],[55.25972,61.914051],[55.25898,61.91872],[55.25766,61.927021],[55.247292,61.971561],[55.23119,62.039539],[55.230511,62.044521],[55.230061,62.050442],[55.230049,62.055191],[55.230019,62.066662],[55.22987,62.07954],[55.229542,62.082401],[55.229229,62.08503],[55.221161,62.120651],[55.219151,62.130779],[55.218861,62.134121],[55.218761,62.149231],[55.219051,62.221668],[55.219009,62.249611],[55.219002,62.25959],[55.218861,62.359859],[55.21719,62.386688],[55.216511,62.397709],[55.212669,62.458649],[55.212589,62.460918],[55.212551,62.462688],[55.212608,62.466721],[55.21273,62.470371],[55.21286,62.47298],[55.212978,62.474522],[55.213112,62.47604],[55.21339,62.47887],[55.21376,62.48177],[55.214149,62.484749],[55.21566,62.49527],[55.216599,62.501961],[55.219742,62.524139],[55.223789,62.552738],[55.22406,62.555309],[55.22427,62.557701],[55.22443,62.55999],[55.22456,62.56229],[55.224659,62.565819],[55.22467,62.569351],[55.22464,62.572048],[55.224529,62.574848],[55.224239,62.580269],[55.222969,62.603519],[55.222839,62.605961],[55.222801,62.60849],[55.222431,62.62851],[55.22234,62.634449],[55.222141,62.646141],[55.22184,62.6637],[55.221802,62.665722],[55.221828,62.667389],[55.22197,62.669109],[55.222191,62.67083],[55.222462,62.672588],[55.222809,62.6744],[55.22324,62.676208],[55.223721,62.67812],[55.224659,62.68137],[55.225441,62.684299],[55.226212,62.687679],[55.227039,62.691471],[55.227581,62.693821],[55.228748,62.698212],[55.230701,62.705421],[55.231861,62.709789],[55.234619,62.71941],[55.235989,62.72533],[55.236671,62.731159],[55.23682,62.736401],[55.235512,62.767021],[55.23497,62.78035],[55.234951,62.781029],[55.234859,62.783001],[55.234791,62.78511],[55.234329,62.799831],[55.234081,62.829102],[55.234001,62.852989],[55.233929,62.871929],[55.233681,62.929691],[55.233479,62.976898],[55.233459,62.986481],[55.233471,62.988838],[55.233551,62.99118],[55.235119,63.02404],[55.23579,63.037411],[55.23819,63.08873],[55.24054,63.138859],[55.24284,63.165291],[55.244209,63.180828],[55.245461,63.191582],[55.248169,63.214821],[55.253731,63.247841],[55.254421,63.251881],[55.25444,63.252239],[55.254379,63.25293],[55.254311,63.25317],[55.254292,63.253479],[55.254318,63.253819],[55.254391,63.254139],[55.254532,63.25423],[55.25478,63.254688],[55.255001,63.255291],[55.25552,63.258629],[55.25597,63.261429],[55.257401,63.269409],[55.257729,63.270859],[55.258121,63.272518],[55.25856,63.274281],[55.25898,63.27586],[55.259392,63.277309],[55.26033,63.280411],[55.261299,63.28331],[55.26223,63.28582],[55.26289,63.28751],[55.263641,63.28928],[55.26524,63.29282],[55.269779,63.30257],[55.272469,63.308239],[55.289742,63.344082],[55.312511,63.391201],[55.334339,63.437031],[55.33736,63.445621],[55.339611,63.453171],[55.352982,63.506691],[55.361198,63.53952],[55.361931,63.543209],[55.36245,63.547668],[55.36264,63.551231],[55.362099,63.560669],[55.35981,63.590931],[55.357052,63.626511],[55.354858,63.6544],[55.354111,63.664101],[55.352779,63.681179],[55.35252,63.687321],[55.352711,63.724781],[55.352829,63.747829],[55.352982,63.775299],[55.354881,63.7995],[55.35918,63.850399],[55.360851,63.8708],[55.360981,63.872459],[55.361229,63.880951],[55.361519,63.89983],[55.36158,63.900051],[55.361858,63.91151],[55.362202,63.918461],[55.363369,63.92704],[55.36974,63.973782],[55.375999,64.019569],[55.379372,64.044548],[55.379829,64.049911],[55.379879,64.055313],[55.379761,64.058708],[55.379318,64.063507],[55.376541,64.081451],[55.37191,64.109947],[55.37093,64.116043],[55.37001,64.123421],[55.369659,64.128487],[55.369469,64.134583],[55.36961,64.140419],[55.371361,64.170288],[55.37162,64.175087],[55.37418,64.221138],[55.37513,64.237747],[55.37561,64.253632],[55.376541,64.287361],[55.377541,64.322197],[55.377998,64.327454],[55.378731,64.333282],[55.38308,64.359459],[55.387169,64.384857],[55.38763,64.388939],[55.389191,64.41568],[55.38924,64.416542],[55.390659,64.441994],[55.391781,64.46209],[55.392021,64.466301],[55.392231,64.469879],[55.394241,64.505539],[55.395802,64.532097],[55.397911,64.568993],[55.399921,64.603783],[55.401649,64.634758],[55.40313,64.661453],[55.404289,64.682663],[55.404331,64.683434],[55.40469,64.686127],[55.407791,64.702011],[55.415829,64.744667],[55.417759,64.754837],[55.420971,64.771858],[55.42157,64.775002],[55.424469,64.790497],[55.427631,64.807411],[55.428741,64.813278],[55.429642,64.818176],[55.430649,64.823486],[55.43095,64.825287],[55.431149,64.826813],[55.431431,64.829514],[55.431728,64.833153],[55.43198,64.836067],[55.432388,64.840958],[55.432781,64.845383],[55.433781,64.857193],[55.4375,64.902077],[55.441929,64.950661],[55.446789,65.001953],[55.44928,65.028252],[55.45269,65.089447],[55.453121,65.094482],[55.453541,65.098083],[55.453979,65.100883],[55.454521,65.103813],[55.45499,65.105957],[55.455479,65.108009],[55.4561,65.110352],[55.45676,65.112663],[55.45739,65.114647],[55.458172,65.116867],[55.464298,65.13385],[55.472229,65.155891],[55.474258,65.161232],[55.475731,65.165649],[55.476761,65.168533],[55.477951,65.172058],[55.478729,65.174263],[55.47884,65.174583],[55.479229,65.175957],[55.480709,65.180946],[55.481098,65.182266],[55.48172,65.184776],[55.483768,65.191566],[55.484459,65.194237],[55.486099,65.199707],[55.486172,65.199951],[55.486328,65.200493],[55.48645,65.200882],[55.48711,65.20311],[55.489799,65.212097],[55.493038,65.223244],[55.493221,65.223869],[55.493568,65.225082],[55.496841,65.23587],[55.501091,65.24958],[55.50132,65.250618],[55.501362,65.25132],[55.50132,65.251556],[55.50132,65.251862],[55.501381,65.252136],[55.501492,65.252357],[55.501572,65.252441],[55.501701,65.252533],[55.502048,65.253029],[55.50243,65.253777],[55.508209,65.272163],[55.51358,65.289261],[55.513599,65.289337],[55.51458,65.292801],[55.51572,65.29776],[55.51659,65.303421],[55.516941,65.308128],[55.516979,65.31089],[55.51701,65.312027],[55.516911,65.316544],[55.516769,65.31958],[55.516659,65.320442],[55.515739,65.328087],[55.51572,65.328232],[55.51038,65.346527],[55.506351,65.360077],[55.504719,65.36557],[55.503799,65.368629],[55.503262,65.370483],[55.501572,65.376152],[55.500092,65.381126],[55.499531,65.383018],[55.49836,65.386993],[55.497669,65.388397],[55.49757,65.388428],[55.497429,65.38855],[55.497341,65.388687],[55.497269,65.388947],[55.497261,65.389183],[55.49728,65.38942],[55.497318,65.389572],[55.49707,65.390923],[55.495461,65.395638],[55.494221,65.3992],[55.493561,65.401131],[55.493019,65.403038],[55.492779,65.404213],[55.492599,65.40538],[55.492359,65.407806],[55.492359,65.409523],[55.492439,65.411186],[55.492779,65.41362],[55.493252,65.415863],[55.49398,65.4179],[55.49477,65.419724],[55.496449,65.422722],[55.497082,65.424553],[55.49754,65.426537],[55.4977,65.428101],[55.497669,65.429817],[55.497311,65.432121],[55.496719,65.434174],[55.495869,65.435898],[55.495258,65.436653],[55.494282,65.437592],[55.493229,65.438118],[55.4921,65.438217],[55.491268,65.438026],[55.4902,65.437492],[55.489349,65.436729],[55.488659,65.43602],[55.488022,65.435287],[55.487789,65.435051],[55.487331,65.434776],[55.487068,65.434753],[55.48687,65.434776],[55.486629,65.434929],[55.480099,65.443237],[55.477669,65.447357],[55.474899,65.455009],[55.473259,65.459709],[55.468029,65.474663],[55.467461,65.476288],[55.459759,65.498352],[55.4585,65.503067],[55.45787,65.507019],[55.457432,65.512604],[55.455971,65.537918],[55.454269,65.564079],[55.453831,65.573692],[55.453732,65.576553],[55.45319,65.580566],[55.452759,65.583],[55.44976,65.59417],[55.445061,65.611649],[55.44495,65.612061],[55.429741,65.669823],[55.419739,65.707779],[55.394691,65.801437],[55.39352,65.805794],[55.38797,65.828491],[55.387482,65.830513],[55.386089,65.838669],[55.383629,65.853172],[55.382309,65.861343],[55.38002,65.87558],[55.37661,65.896263],[55.374458,65.911629],[55.3708,65.938843],[55.370121,65.945618],[55.369831,65.951973],[55.369781,65.961411],[55.370701,65.972397],[55.377041,66.022263],[55.382309,66.062943],[55.38818,66.089546],[55.389969,66.097618],[55.39669,66.128433],[55.397812,66.136932],[55.40147,66.178818],[55.4062,66.234261],[55.40659,66.248772],[55.40567,66.270103],[55.405609,66.271431],[55.404301,66.3013],[55.402439,66.343353],[55.39996,66.401802],[55.39893,66.433823],[55.39645,66.473557],[55.395969,66.481934],[55.39489,66.500603],[55.391869,66.54969],[55.38982,66.584198],[55.388779,66.599937],[55.38855,66.60041],[55.388321,66.601143],[55.388229,66.601692],[55.388309,66.602173],[55.388512,66.602852],[55.388649,66.603073],[55.388489,66.605331],[55.38826,66.609299],[55.387779,66.616966],[55.387039,66.629768],[55.384701,66.669167],[55.381729,66.717056],[55.381451,66.721474],[55.381241,66.724518],[55.380951,66.727364],[55.38055,66.73053],[55.380138,66.733421],[55.3797,66.73613],[55.379211,66.738777],[55.37851,66.742157],[55.377899,66.744591],[55.376991,66.747993],[55.370651,66.769859],[55.368019,66.778954],[55.360748,66.804863],[55.35627,66.820229],[55.355,66.824783],[55.352791,66.831543],[55.351139,66.835831],[55.34845,66.841583],[55.337379,66.865288],[55.324001,66.894043],[55.310959,66.922279],[55.307251,66.931549],[55.30529,66.939789],[55.303539,66.951118],[55.29982,66.992661],[55.29871,67.004959],[55.29689,67.025284],[55.292389,67.079521],[55.290241,67.089478],[55.28183,67.117592],[55.269909,67.157463],[55.266579,67.169472],[55.25782,67.219833],[55.25647,67.225433],[55.24807,67.253098],[55.244831,67.263847],[55.24469,67.263779],[55.244511,67.263779],[55.244339,67.263893],[55.244202,67.264091],[55.24411,67.264374],[55.24408,67.264687],[55.244122,67.264992],[55.244209,67.265259],[55.24435,67.265457],[55.240101,67.278992],[55.227638,67.317841],[55.214691,67.355843],[55.211689,67.365967],[55.204689,67.397057],[55.196541,67.432419],[55.195518,67.436813],[55.18961,67.463318],[55.188999,67.476341],[55.187962,67.50354],[55.188782,67.511383],[55.192871,67.533623],[55.194649,67.546417],[55.194962,67.553429],[55.19413,67.565613],[55.192741,67.580162],[55.192039,67.602631],[55.191132,67.621902],[55.189522,67.629898],[55.178429,67.668518],[55.174301,67.684967],[55.172569,67.693893],[55.164768,67.734177],[55.163471,67.737984],[55.149719,67.768517],[55.131649,67.807831],[55.12394,67.824364],[55.10191,67.865738],[55.09697,67.875008],[55.094269,67.883163],[55.092571,67.894051],[55.092621,67.918877],[55.092621,67.924637],[55.092609,67.925743],[55.092831,67.976692],[55.093311,67.983856],[55.097321,68.026131],[55.099781,68.05143],[55.104031,68.095139],[55.104511,68.104431],[55.10429,68.114708],[55.103031,68.132607],[55.099152,68.18882],[55.096649,68.203423],[55.092152,68.227898],[55.09082,68.240196],[55.091709,68.253601],[55.0938,68.267563],[55.094559,68.277641],[55.093231,68.286392],[55.087719,68.30201],[55.079151,68.324707],[55.068371,68.35363],[55.054989,68.390182],[55.046741,68.41256],[55.027309,68.466507],[55.014111,68.500633],[54.9939,68.554237],[54.99123,68.560219],[54.98875,68.562553],[54.973499,68.573959],[54.95079,68.59079],[54.924641,68.610069],[54.92448,68.610443],[54.924301,68.611618],[54.923611,68.616402],[54.923111,68.61998],[54.922451,68.624489],[54.92197,68.627922],[54.9212,68.633369],[54.920101,68.640846],[54.919559,68.644333],[54.91917,68.648529],[54.919128,68.653183],[54.919319,68.663483],[54.919361,68.672462],[54.919449,68.681358],[54.91954,68.690643],[54.919628,68.698692],[54.91967,68.706421],[54.919788,68.71479],[54.9198,68.718513],[54.919849,68.724922],[54.919941,68.735184],[54.92001,68.746468],[54.92009,68.758133],[54.920219,68.774109],[54.920429,68.799072],[54.920792,68.843628],[54.920818,68.854874],[54.919331,68.878441],[54.917,68.91478],[54.91502,68.944328],[54.912788,68.978416],[54.910358,69.015228],[54.909859,69.021294],[54.90905,69.034103],[54.908852,69.037292],[54.908489,69.042999],[54.90765,69.055283],[54.90731,69.05954],[54.90712,69.062553],[54.906719,69.065102],[54.906189,69.067772],[54.90509,69.07119],[54.905769,69.073486],[54.905869,69.073723],[54.907501,69.07753],[54.910469,69.085258],[54.911518,69.088371],[54.912521,69.091713],[54.913689,69.094673],[54.914989,69.097481],[54.91534,69.099037],[54.915409,69.100037],[54.915379,69.10125],[54.91354,69.114662],[54.91309,69.117012],[54.912762,69.118294],[54.912628,69.118797],[54.91246,69.119926],[54.912411,69.121162],[54.91267,69.125023],[54.912819,69.127327],[54.912109,69.127617],[54.911671,69.127953],[54.911308,69.128349],[54.911041,69.12896],[54.910751,69.129601],[54.910431,69.130463],[54.910229,69.131439],[54.910198,69.131683],[54.910179,69.131866],[54.910172,69.132111],[54.91016,69.132294],[54.910141,69.132477],[54.910141,69.132881],[54.91016,69.133003],[54.910221,69.133171],[54.9104,69.133217],[54.91058,69.133087],[54.91066,69.132919],[54.910721,69.132637],[54.910801,69.132362],[54.910881,69.132042],[54.910961,69.131866],[54.91153,69.131157],[54.91222,69.130302],[54.912338,69.13015],[54.912861,69.129601],[54.914219,69.128349],[54.915661,69.127457],[54.91748,69.12674],[54.919159,69.126549],[54.92194,69.126427],[54.92292,69.126663],[54.92358,69.12719],[54.924122,69.127861],[54.924679,69.128799],[54.92506,69.129837],[54.926399,69.13607],[54.926281,69.136269],[54.926189,69.136574],[54.926231,69.136848],[54.9263,69.137016],[54.926411,69.137169],[54.926559,69.137253],[54.926628,69.137207],[54.926579,69.137527],[54.924191,69.148048],[54.91798,69.17437],[54.917919,69.174316],[54.917728,69.174271],[54.917542,69.174347],[54.917469,69.174622],[54.91748,69.175148],[54.917549,69.175613],[54.917622,69.175697],[54.91769,69.175789],[54.917992,69.175819],[54.918091,69.175751],[54.91811,69.175591],[54.918251,69.176224],[54.93475,69.219063],[54.93576,69.220993],[54.937019,69.222343],[54.93795,69.222893],[54.945759,69.225929],[54.946678,69.226593],[54.94788,69.228241],[54.948399,69.229248],[54.954651,69.248573],[54.95512,69.250549],[54.955231,69.253548],[54.95219,69.281349],[54.951382,69.285461],[54.914391,69.430771],[54.913651,69.435097],[54.913269,69.439484],[54.913391,69.454674],[54.913952,69.525223],[54.914669,69.599983],[54.914902,69.623459],[54.91605,69.798088],[54.909809,69.909576],[54.90976,69.912453],[54.91502,70.140343],[54.915451,70.190514],[54.917278,70.354233],[54.918461,70.369408],[54.918449,70.374023],[54.918018,70.381271],[54.919399,70.435493],[54.92009,70.462624],[54.919998,70.466408],[54.91975,70.469276],[54.91795,70.480713],[54.91774,70.483856],[54.91927,70.528839],[54.930779,70.631973],[54.940411,70.762863],[54.94083,70.776108],[54.940651,70.779343],[54.93998,70.7827],[54.939251,70.784447],[54.937462,70.787086],[54.921299,70.801826],[54.91959,70.80442],[54.91851,70.807426],[54.91806,70.810226],[54.91798,70.81279],[54.919258,70.882713],[54.921379,70.984528],[54.921398,70.985802],[54.921959,71.016243],[54.92207,71.022346],[54.922741,71.059174],[54.923,71.080643],[54.921589,71.136688],[54.921612,71.140411],[54.922001,71.146027],[54.923069,71.153809],[54.923981,71.157944],[54.92514,71.161377],[54.925671,71.162971],[54.927711,71.167511],[54.929909,71.171478],[54.931171,71.174133],[54.93224,71.176979],[54.937721,71.19474],[54.947842,71.227577],[54.949181,71.232407],[54.950802,71.239929],[54.951969,71.247871],[54.952911,71.25663],[54.955811,71.283669],[54.95607,71.286148],[54.956211,71.287483],[54.973251,71.448219],[54.97401,71.453117],[54.974918,71.457787],[54.976719,71.465149],[54.978142,71.469757],[54.9804,71.476341],[54.981201,71.479446],[54.98233,71.483841],[54.98402,71.492989],[54.99025,71.540962],[54.990749,71.546097],[54.991131,71.555542],[54.987789,71.697289],[54.983429,71.778908],[54.983311,71.78492],[54.983589,71.79248],[54.99284,71.913406],[54.9963,71.958504],[54.996449,71.962212],[54.996399,71.966888],[54.996078,71.97171],[54.978851,72.105797],[54.978149,72.112457],[54.977421,72.122673],[54.972771,72.248459],[54.9659,72.335892],[54.965721,72.33828],[54.965549,72.341904],[54.965488,72.345627],[54.965611,72.34996],[54.96624,72.372711],[54.96669,72.391632],[54.966759,72.395111],[54.966591,72.398827],[54.966301,72.403053],[54.964802,72.419296],[54.963531,72.434708],[54.963501,72.436478],[54.963921,72.454826],[54.964569,72.483093],[54.966141,72.539192],[54.9664,72.543533],[54.96698,72.54879],[54.967319,72.551041],[54.96767,72.552994],[54.968491,72.557251],[54.984421,72.617264],[54.985882,72.625191],[54.98658,72.631699],[54.986809,72.635223],[54.990509,72.690758],[54.990501,72.820793],[54.990311,72.82589],[54.9897,72.831818],[54.98793,72.842369],[54.987728,72.843071],[54.985649,72.850288],[54.976269,72.875366],[54.97007,72.891907],[54.96825,72.896843],[54.96804,72.897087],[54.96788,72.897186],[54.96653,72.897278],[54.965801,72.897331],[54.961491,72.897469],[54.958618,72.897636],[54.956902,72.898079],[54.950729,72.900253],[54.940731,72.903793],[54.935379,72.905693],[54.930721,72.907242],[54.928219,72.908211],[54.92672,72.909103],[54.924301,72.911133],[54.922729,72.912666],[54.913921,72.925461],[54.913521,72.926041],[54.906811,72.935799],[54.904121,72.940048],[54.9016,72.944641],[54.895439,72.955879],[54.887291,72.970757],[54.885941,72.974823],[54.88472,72.978493],[54.883831,72.983292],[54.883438,72.987579],[54.883591,72.994751],[54.883598,72.995728],[54.883911,73.017487],[54.883961,73.024017],[54.88361,73.030411],[54.883308,73.033073],[54.88126,73.045387],[54.877781,73.066292],[54.875408,73.080193],[54.87376,73.090279],[54.87175,73.102318],[54.86882,73.119629],[54.866821,73.131432],[54.866501,73.133957],[54.866371,73.135094],[54.866341,73.135803],[54.866371,73.136703],[54.866741,73.139847],[54.86747,73.146378],[54.867661,73.148499],[54.86784,73.151398],[54.86797,73.156677],[54.867882,73.173286],[54.867519,73.213791],[54.86726,73.237701],[54.867352,73.241989],[54.869431,73.262611],[54.869598,73.264427],[54.869781,73.266312],[54.86998,73.268311],[54.870171,73.270348],[54.870232,73.27092],[54.870258,73.271248],[54.87048,73.273521],[54.870739,73.276932],[54.870739,73.277641],[54.870708,73.278999],[54.87059,73.280632],[54.87038,73.282341],[54.869789,73.285683],[54.86961,73.286743],[54.869431,73.287987],[54.86932,73.288872],[54.86924,73.289886],[54.86916,73.2911],[54.86916,73.292717],[54.869209,73.295464],[54.869141,73.296242],[54.869061,73.296532],[54.868969,73.296753],[54.868969,73.296951],[54.869011,73.29718],[54.869148,73.297836],[54.869148,73.299477],[54.869221,73.300499],[54.869221,73.30645],[54.869251,73.316261],[54.86927,73.321907],[54.869289,73.322884],[54.869301,73.323563],[54.86935,73.324303],[54.869438,73.325089],[54.86953,73.325798],[54.86969,73.326767],[54.869949,73.328011],[54.870258,73.329247],[54.87059,73.330307],[54.87093,73.331169],[54.87138,73.332222],[54.872211,73.33371],[54.873138,73.335159],[54.874279,73.336884],[54.875111,73.338219],[54.875809,73.339592],[54.87616,73.340462],[54.876678,73.342049],[54.87764,73.345131],[54.877991,73.346313],[54.878899,73.349327],[54.880051,73.353203],[54.879929,73.353333],[54.879822,73.353561],[54.879768,73.353767],[54.879749,73.353928],[54.879749,73.354073],[54.879768,73.354309],[54.879829,73.354507],[54.879959,73.354736],[54.880119,73.354889],[54.88031,73.354919],[54.880482,73.354843],[54.880611,73.355293],[54.88126,73.357567],[54.88139,73.358124],[54.881481,73.358727],[54.881741,73.36132],[54.881889,73.363533],[54.88192,73.365334],[54.881729,73.371681],[54.881451,73.379997],[54.881481,73.382294],[54.881592,73.384979],[54.881802,73.388153],[54.88195,73.389641],[54.882149,73.391228],[54.882778,73.395287],[54.883202,73.397476],[54.883801,73.400017],[54.884659,73.403008],[54.887199,73.410408],[54.887531,73.411636],[54.887829,73.412773],[54.887951,73.413879],[54.88802,73.414963],[54.888062,73.420387],[54.888081,73.420929],[54.888142,73.421219],[54.88821,73.421471],[54.88829,73.421638],[54.88842,73.421829],[54.888569,73.421951],[54.888809,73.422203],[54.889042,73.422394],[54.888618,73.423233],[54.88821,73.424088],[54.88789,73.424751],[54.887329,73.425941],[54.88715,73.426353],[54.88644,73.427856],[54.884941,73.431084],[54.882381,73.436417],[54.880909,73.439507],[54.880482,73.440399],[54.868172,73.466171],[54.86668,73.469353],[54.866322,73.470123],[54.866039,73.47081],[54.865761,73.471573],[54.86517,73.473412],[54.85984,73.490753],[54.85368,73.510521],[54.85284,73.512589],[54.8466,73.526047],[54.83498,73.548721],[54.83453,73.549553],[54.834049,73.550377],[54.833618,73.55098],[54.83321,73.551537],[54.832729,73.552147],[54.830601,73.55468],[54.827888,73.557899],[54.822762,73.564011],[54.820751,73.566383],[54.819462,73.567703],[54.817711,73.569542],[54.814739,73.572647],[54.81332,73.574203],[54.811901,73.57592],[54.808929,73.579613],[54.80759,73.581291],[54.80563,73.583649],[54.804951,73.584381],[54.802879,73.586372],[54.801941,73.587173],[54.800018,73.588654],[54.797569,73.590477],[54.792831,73.594032],[54.790249,73.595993],[54.785229,73.599648],[54.783138,73.601173],[54.7789,73.604309],[54.777069,73.605827],[54.775532,73.607147],[54.773121,73.609169],[54.770748,73.611153],[54.769341,73.612419],[54.768372,73.613197],[54.767658,73.613731],[54.766941,73.614067],[54.765961,73.614388],[54.765011,73.614693],[54.762569,73.615463],[54.761711,73.615753],[54.756569,73.617012],[54.754822,73.617607],[54.75317,73.61837],[54.75164,73.61927],[54.74894,73.621391],[54.745152,73.625214],[54.74316,73.62812],[54.741089,73.63163],[54.73513,73.641647],[54.730511,73.64946],[54.728809,73.652367],[54.721882,73.664207],[54.718559,73.669907],[54.71759,73.671562],[54.71666,73.673203],[54.715672,73.674896],[54.71521,73.67569],[54.71471,73.676537],[54.714008,73.677742],[54.713322,73.678917],[54.712662,73.680054],[54.712009,73.68116],[54.71133,73.68232],[54.710011,73.684593],[54.709129,73.686089],[54.708408,73.687332],[54.70797,73.688103],[54.706661,73.690353],[54.705219,73.692848],[54.704529,73.694031],[54.70319,73.69635],[54.697128,73.706757],[54.689751,73.717232],[54.689121,73.718262],[54.688412,73.719704],[54.685791,73.725609],[54.682621,73.732887],[54.681629,73.735649],[54.678638,73.74453],[54.676231,73.752121],[54.675499,73.754539],[54.67506,73.756592],[54.67461,73.759506],[54.669811,73.787872],[54.669552,73.789726],[54.66946,73.790932],[54.66943,73.793213],[54.669441,73.796127],[54.669491,73.80822],[54.669498,73.813004],[54.66938,73.815773],[54.669189,73.818489],[54.66906,73.819817],[54.66888,73.821373],[54.66692,73.835472],[54.664951,73.849541],[54.66441,73.853378],[54.664131,73.856163],[54.66404,73.859467],[54.664108,73.868423],[54.664131,73.870811],[54.664131,73.872337],[54.664139,73.874138],[54.664139,73.875427],[54.664082,73.876633],[54.66396,73.877777],[54.66383,73.878563],[54.663601,73.879478],[54.661869,73.884644],[54.661739,73.884933],[54.661201,73.886253],[54.66032,73.887688],[54.658298,73.890327],[54.657089,73.891907],[54.653198,73.896843],[54.65168,73.8992],[54.650318,73.901703],[54.648449,73.905403],[54.64526,73.911743],[54.637871,73.926323],[54.63044,73.941048],[54.626869,73.948608],[54.625771,73.951218],[54.624969,73.953522],[54.624229,73.956398],[54.623772,73.958412],[54.623428,73.960419],[54.623169,73.962578],[54.622849,73.966873],[54.621651,73.982079],[54.621319,73.984642],[54.62075,73.987991],[54.619888,73.991478],[54.61832,73.99633],[54.6152,74.003807],[54.614269,74.005737],[54.613159,74.007507],[54.61132,74.009789],[54.610828,74.010269],[54.609489,74.011414],[54.607498,74.012581],[54.604549,74.013771],[54.60173,74.014954],[54.5989,74.016251],[54.597881,74.01693],[54.597019,74.017609],[54.595379,74.019257],[54.59425,74.020737],[54.59322,74.022461],[54.59129,74.02655],[54.588409,74.032707],[54.587582,74.034554],[54.587109,74.035896],[54.586449,74.038002],[54.56488,74.108017],[54.564659,74.109169],[54.564449,74.110786],[54.564301,74.112923],[54.56377,74.130463],[54.563648,74.134773],[54.563492,74.136871],[54.563049,74.14006],[54.561069,74.153923],[54.560181,74.160744],[54.560211,74.16169],[54.560322,74.162651],[54.560509,74.163544],[54.567749,74.19046],[54.56805,74.191902],[54.568218,74.193542],[54.568199,74.194687],[54.567101,74.211533],[54.566978,74.212936],[54.5667,74.214546],[54.566319,74.215927],[54.562851,74.228378],[54.559299,74.240852],[54.552349,74.265221],[54.548969,74.276917],[54.54813,74.279793],[54.547531,74.281807],[54.546871,74.283401],[54.546299,74.28463],[54.545761,74.285744],[54.544842,74.287163],[54.54385,74.288544],[54.541809,74.290909],[54.538528,74.294937],[54.536869,74.297394],[54.536251,74.298447],[54.508018,74.353081],[54.506748,74.355583],[54.505489,74.358482],[54.504688,74.360657],[54.501949,74.369324],[54.496738,74.385857],[54.495602,74.389122],[54.494999,74.39032],[54.493629,74.392097],[54.493038,74.392776],[54.492298,74.393509],[54.491581,74.394119],[54.490971,74.394417],[54.49036,74.394653],[54.482731,74.396332],[54.481281,74.396652],[54.47961,74.397217],[54.47773,74.398064],[54.47562,74.399193],[54.474232,74.400238],[54.472851,74.401466],[54.471191,74.403214],[54.465809,74.409119],[54.45887,74.417],[54.445148,74.432838],[54.443569,74.434883],[54.44215,74.43718],[54.438179,74.444542],[54.43362,74.453758],[54.431332,74.458389],[54.429119,74.462929],[54.428329,74.464737],[54.42783,74.46611],[54.427052,74.468918],[54.413139,74.523643],[54.408821,74.545128],[54.4081,74.548126],[54.407089,74.55146],[54.405781,74.555069],[54.404621,74.557716],[54.40308,74.560806],[54.397282,74.571693],[54.395721,74.574806],[54.394821,74.577019],[54.393589,74.580391],[54.390739,74.589546],[54.386841,74.602287],[54.384472,74.608887],[54.381611,74.616341],[54.380341,74.619423],[54.378719,74.622581],[54.377731,74.624138],[54.373112,74.630463],[54.372139,74.631493],[54.370991,74.632347],[54.368649,74.633347],[54.364368,74.634827],[54.361431,74.635269],[54.357738,74.635162],[54.354401,74.635063],[54.350929,74.635101],[54.35017,74.635292],[54.34927,74.635674],[54.347839,74.636597],[54.346142,74.638138],[54.343109,74.641037],[54.340832,74.643372],[54.338032,74.646744],[54.332062,74.654007],[54.330589,74.655312],[54.329369,74.655983],[54.32576,74.657303],[54.32243,74.658546],[54.31868,74.659607],[54.29874,74.664368],[54.28014,74.66861],[54.278061,74.669518],[54.277,74.670227],[54.27573,74.671837],[54.27396,74.674751],[54.270531,74.681053],[54.266659,74.687439],[54.265072,74.68988],[54.26413,74.69091],[54.263069,74.69165],[54.26123,74.69252],[54.258911,74.692818],[54.256908,74.692574],[54.252628,74.692329],[54.243259,74.69162],[54.242008,74.691994],[54.24091,74.692574],[54.23978,74.693321],[54.23801,74.695251],[54.232651,74.700867],[54.230331,74.703293],[54.228249,74.705643],[54.226002,74.708588],[54.217861,74.718651],[54.209229,74.729713],[54.208382,74.731133],[54.205688,74.735611],[54.204262,74.737709],[54.20097,74.741524],[54.1954,74.747887],[54.190639,74.753242],[54.1852,74.759453],[54.17564,74.770332],[54.17469,74.771637],[54.173908,74.773117],[54.173279,74.774544],[54.172661,74.776466],[54.17202,74.77993],[54.17197,74.781616],[54.171879,74.783997],[54.17141,74.797913],[54.1712,74.802879],[54.170959,74.805511],[54.170601,74.80851],[54.170292,74.810463],[54.169842,74.812538],[54.16922,74.815399],[54.16898,74.816101],[54.168621,74.817009],[54.168159,74.818069],[54.167782,74.81871],[54.167339,74.819366],[54.166931,74.819893],[54.166618,74.820236],[54.16618,74.820663],[54.164379,74.822258],[54.163761,74.8228],[54.16143,74.824837],[54.157959,74.828072],[54.15588,74.830551],[54.15414,74.833023],[54.14859,74.841667],[54.145859,74.846199],[54.143539,74.850693],[54.126171,74.884651],[54.124008,74.888924],[54.12291,74.891113],[54.121391,74.893867],[54.119881,74.896347],[54.118961,74.897758],[54.11771,74.89959],[54.114922,74.90313],[54.112419,74.906281],[54.107731,74.912079],[54.095638,74.927193],[54.082512,74.94352],[54.079971,74.946693],[54.07436,74.953697],[54.071671,74.957077],[54.07008,74.958763],[54.06942,74.959419],[54.06868,74.960037],[54.06826,74.960327],[54.0672,74.961037],[54.06625,74.96151],[54.065159,74.961899],[54.06414,74.962181],[54.06308,74.96244],[54.062809,74.962463],[54.06152,74.962547],[54.052841,74.96302],[54.042881,74.963631],[54.03878,74.963852],[54.036629,74.963966],[54.034752,74.964188],[54.032211,74.964867],[54.029732,74.965874],[54.029461,74.966057],[54.02747,74.967407],[54.025749,74.96875],[54.018269,74.976044],[54.003441,74.990593],[53.999821,74.994102],[53.99894,74.995117],[53.998291,74.99604],[53.997601,74.997261],[53.996941,74.998703],[53.984928,75.026604],[53.981758,75.034012],[53.978291,75.04216],[53.970989,75.059402],[53.969181,75.063629],[53.966042,75.071037],[53.96199,75.080719],[53.961559,75.081619],[53.961201,75.082138],[53.96077,75.082573],[53.9603,75.082916],[53.959782,75.083122],[53.958988,75.083282],[53.952808,75.083763],[53.9506,75.083946],[53.93763,75.085129],[53.922729,75.086388],[53.92065,75.086517],[53.919949,75.086433],[53.91959,75.086357],[53.919189,75.08625],[53.918758,75.086113],[53.917461,75.085457],[53.91608,75.084793],[53.89254,75.073143],[53.886509,75.070107],[53.885971,75.069847],[53.885059,75.069397],[53.85207,75.053047],[53.845581,75.049728],[53.84314,75.048271],[53.841831,75.047333],[53.84074,75.046448],[53.840061,75.04612],[53.83939,75.045952],[53.834179,75.045486],[53.827469,75.045013],[53.822979,75.044693],[53.816269,75.044777],[53.814781,75.044838],[53.81382,75.044991],[53.809139,75.046387],[53.80328,75.048576],[53.797321,75.051277],[53.79525,75.052208],[53.790722,75.054222],[53.789162,75.054916],[53.788269,75.055367],[53.78756,75.055847],[53.786701,75.056519],[53.78455,75.058311],[53.778759,75.063278],[53.770481,75.070412],[53.757198,75.081909],[53.743389,75.093674],[53.73756,75.098572],[53.73172,75.103493],[53.720261,75.113182],[53.71302,75.11937],[53.707291,75.124252],[53.701962,75.128807],[53.69809,75.131989],[53.696869,75.132973],[53.69524,75.133926],[53.694248,75.134338],[53.69186,75.135223],[53.68578,75.13723],[53.677029,75.140228],[53.668419,75.143494],[53.659451,75.147034],[53.655479,75.148529],[53.653591,75.149269],[53.652241,75.150063],[53.65065,75.151268],[53.649139,75.152771],[53.64782,75.154587],[53.64653,75.156967],[53.645119,75.159668],[53.64109,75.167503],[53.617321,75.213669],[53.616631,75.214951],[53.615372,75.21682],[53.614319,75.218132],[53.61301,75.219513],[53.609341,75.223221],[53.604671,75.22805],[53.600021,75.232803],[53.596169,75.236603],[53.593948,75.239014],[53.59288,75.240448],[53.591839,75.242027],[53.58976,75.245743],[53.581951,75.260193],[53.58073,75.262482],[53.579708,75.264648],[53.57502,75.274643],[53.563271,75.299721],[53.562321,75.301727],[53.56139,75.303436],[53.56044,75.304993],[53.559071,75.306717],[53.55759,75.308319],[53.555511,75.310303],[53.553242,75.312363],[53.541851,75.323303],[53.537479,75.327553],[53.536171,75.32901],[53.53511,75.330566],[53.534489,75.331772],[53.534012,75.33287],[53.53347,75.334244],[53.53289,75.33622],[53.53075,75.345459],[53.528622,75.355003],[53.528259,75.356331],[53.52763,75.357857],[53.526871,75.359642],[53.519531,75.37545],[53.511829,75.391869],[53.507961,75.400261],[53.50388,75.409187],[53.496349,75.425369],[53.49411,75.429611],[53.487141,75.440918],[53.481949,75.449371],[53.480419,75.451622],[53.47884,75.453377],[53.477699,75.454468],[53.471352,75.459686],[53.45953,75.469933],[53.45129,75.47657],[53.4426,75.484047],[53.423809,75.499657],[53.405899,75.514816],[53.403011,75.517319],[53.400982,75.519676],[53.39257,75.529907],[53.379131,75.546082],[53.376369,75.549454],[53.373638,75.552551],[53.368839,75.557251],[53.361271,75.564484],[53.354622,75.57151],[53.346741,75.579842],[53.33374,75.593536],[53.332199,75.59507],[53.33054,75.596237],[53.32309,75.600822],[53.313171,75.60701],[53.303429,75.614983],[53.292061,75.625847],[53.28054,75.636963],[53.274841,75.642403],[53.269409,75.647438],[53.257622,75.658234],[53.25679,75.659019],[53.256062,75.659882],[53.25528,75.661018],[53.236881,75.692253],[53.224159,75.71373],[53.210369,75.737007],[53.184189,75.781197],[53.1828,75.783539],[53.18124,75.786362],[53.179989,75.7892],[53.178551,75.792747],[53.144051,75.880463],[53.13903,75.893288],[53.137718,75.896294],[53.121521,75.928673],[53.104469,75.962639],[53.103729,75.964798],[53.103119,75.967133],[53.098629,75.986427],[53.093159,76.010643],[53.08239,76.056717],[53.080021,76.06707],[53.079861,76.068283],[53.079788,76.06926],[53.079781,76.070702],[53.080002,76.072983],[53.083778,76.089394],[53.084011,76.092072],[53.083801,76.095413],[53.083351,76.098213],[53.081211,76.11013],[53.08083,76.112244],[53.079491,76.12011],[53.07848,76.123863],[53.077518,76.126373],[53.07658,76.128304],[53.075481,76.130173],[53.074551,76.131371],[53.073181,76.132782],[53.066799,76.138641],[53.060459,76.144562],[53.059891,76.145302],[53.058708,76.147507],[53.057671,76.150543],[53.046391,76.198189],[53.033669,76.251053],[53.03017,76.261673],[53.023602,76.281303],[53.01313,76.312683],[53.0103,76.321152],[52.99239,76.374603],[52.99131,76.377548],[52.988701,76.383408],[52.975609,76.412643],[52.959789,76.447762],[52.92849,76.517548],[52.927078,76.520401],[52.92522,76.523666],[52.923599,76.526367],[52.920731,76.531143],[52.912281,76.545067],[52.895981,76.571693],[52.894341,76.573639],[52.892899,76.575043],[52.89151,76.576134],[52.889301,76.577538],[52.879879,76.583122],[52.865108,76.59198],[52.838959,76.607697],[52.810711,76.624588],[52.79121,76.636238],[52.78701,76.638847],[52.78595,76.63945],[52.784939,76.640167],[52.736191,76.680183],[52.68597,76.721161],[52.684212,76.722443],[52.672199,76.730026],[52.656841,76.739647],[52.62907,76.757202],[52.618359,76.763992],[52.605968,76.771767],[52.58215,76.78669],[52.5345,76.816727],[52.52211,76.821098],[52.50993,76.825706],[52.485432,76.834663],[52.466202,76.84169],[52.40942,76.862663],[52.396179,76.868889],[52.37986,76.876846],[52.35146,76.890556],[52.35067,76.890938],[52.34148,76.89537],[52.329899,76.900993],[52.329559,76.901169],[52.32811,76.901947],[52.327049,76.902847],[52.326469,76.903397],[52.32436,76.90583],[52.313049,76.919693],[52.310089,76.923309],[52.309891,76.928452],[52.309071,76.94117],[52.308632,76.947121],[52.308498,76.949203],[52.308369,76.951317],[52.308079,76.955162],[52.307919,76.957283],[52.307789,76.958031],[52.307579,76.958633],[52.304588,76.960541],[52.302189,76.962097],[52.300522,76.963142],[52.29739,76.965118],[52.296429,76.965652],[52.296188,76.965668],[52.293209,76.965912],[52.291851,76.965919],[52.291389,76.965927],[52.290791,76.965988],[52.287601,76.966316],[52.285809,76.966431],[52.285671,76.966454],[52.28458,76.966713],[52.284031,76.967018],[52.28352,76.967438],[52.28307,76.967552],[52.275909,76.968437],[52.270489,76.96904],[52.268452,76.969261],[52.26461,76.969704],[52.264389,76.969749],[52.256741,76.970581],[52.25338,76.971031],[52.2528,76.97126],[52.252251,76.971741],[52.249111,76.976593],[52.24733,76.979172],[52.245079,76.982422],[52.245258,76.982758],[52.246681,76.985359],[52.245049,76.987846],[52.243629,76.985168],[52.24118,76.988808],[52.23851,76.992683],[52.23737,76.994247],[52.236721,76.995132],[52.232681,77.00103],[52.231129,77.003418],[52.22633,77.009827],[52.224651,77.011932],[52.223228,77.01329],[52.22081,77.014862],[52.20134,77.027008],[52.192451,77.033051],[52.155258,77.060623],[52.128948,77.078407],[52.120579,77.085007],[52.115608,77.089149],[52.114368,77.090462],[52.110329,77.095573],[52.087749,77.126488],[52.02565,77.220383],[52.017818,77.23365],[52.014431,77.238632],[52.009892,77.244614],[52.008942,77.245781],[52.003288,77.252037],[51.994431,77.26181],[51.987881,77.268944],[51.926472,77.334503],[51.91893,77.343452],[51.913319,77.350563],[51.91114,77.354134],[51.909191,77.358391],[51.90554,77.370628],[51.902649,77.381416],[51.90229,77.38253],[51.901718,77.384003],[51.900742,77.38607],[51.891979,77.400917],[51.8848,77.414436],[51.882252,77.419601],[51.881031,77.421867],[51.876968,77.426117],[51.86919,77.435799],[51.863548,77.443611],[51.861462,77.446404],[51.859451,77.448517],[51.856781,77.450691],[51.854179,77.452042],[51.828972,77.461777],[51.824478,77.463768],[51.820309,77.466713],[51.811329,77.473358],[51.805752,77.477402],[51.80146,77.480957],[51.79636,77.485367],[51.789841,77.490677],[51.770279,77.50605],[51.768761,77.507408],[51.76709,77.509178],[51.765709,77.510872],[51.73035,77.557549],[51.729481,77.558502],[51.728081,77.559578],[51.726379,77.560402],[51.725151,77.560593],[51.723949,77.560516],[51.722801,77.560226],[51.701229,77.551262],[51.70013,77.55098],[51.698509,77.550873],[51.697948,77.550949],[51.696819,77.5513],[51.681561,77.556793],[51.67968,77.557678],[51.67807,77.558594],[51.67651,77.559669],[51.65694,77.573929],[51.654819,77.5756],[51.6525,77.577698],[51.650768,77.579529],[51.637829,77.594147],[51.637039,77.594841],[51.635929,77.595558],[51.634789,77.5961],[51.633911,77.596329],[51.615162,77.599907],[51.614288,77.600143],[51.612862,77.600708],[51.61203,77.601196],[51.61095,77.60202],[51.597519,77.613213],[51.594929,77.615112],[51.5923,77.616814],[51.589958,77.61821],[51.54343,77.643517],[51.540958,77.644943],[51.539619,77.645889],[51.537781,77.647423],[51.53088,77.653717],[51.527859,77.656578],[51.52644,77.658257],[51.52536,77.659866],[51.522968,77.663757],[51.507431,77.6903],[51.5005,77.706619],[51.49971,77.708763],[51.491711,77.729446],[51.48793,77.741676],[51.487179,77.746033],[51.479191,77.798149],[51.477859,77.808937],[51.478561,77.820137],[51.47921,77.829269],[51.47839,77.838791],[51.473591,77.889008],[51.472099,77.898453],[51.47068,77.90657],[51.469509,77.91227],[51.468201,77.917809],[51.465511,77.928558],[51.46513,77.931038],[51.465,77.93309],[51.464909,77.935493],[51.464779,77.937134],[51.464298,77.945389],[51.463741,77.956268],[51.461029,77.989197],[51.460812,77.991142],[51.458012,78.012352],[51.45776,78.014717],[51.448521,78.092888],[51.44817,78.096573],[51.448158,78.098442],[51.4487,78.141037],[51.448662,78.141899],[51.447891,78.145554],[51.427341,78.207191],[51.418861,78.225723],[51.41803,78.22789],[51.40752,78.26239],[51.396679,78.298233],[51.39542,78.302254],[51.394371,78.304718],[51.394211,78.304947],[51.39386,78.305511],[51.393478,78.306084],[51.366341,78.342201],[51.358009,78.354073],[51.35482,78.360786],[51.233669,78.603119],[51.220341,78.630928],[51.188259,78.696838],[51.18729,78.69886],[51.186729,78.700058],[51.18626,78.701118],[51.124222,78.829292],[51.12355,78.830757],[51.12236,78.833801],[51.121422,78.837013],[51.12114,78.838249],[51.12051,78.841789],[51.095852,79.064957],[51.095509,79.068718],[51.095379,79.069504],[51.095032,79.071701],[51.09404,79.073753],[51.09264,79.075302],[51.079861,79.086357],[51.078751,79.087646],[51.07251,79.098297],[51.071159,79.100227],[51.05582,79.115723],[51.049122,79.122276],[51.046509,79.123253],[51.041889,79.123398],[51.039131,79.123734],[51.037231,79.125229],[51.035229,79.12896],[51.027439,79.144852],[51.026489,79.147476],[51.02626,79.148773],[51.02179,79.177223],[51.021488,79.178841],[51.020741,79.18203],[51.01981,79.187233],[51.01717,79.20491],[51.016891,79.206558],[51.016541,79.208183],[51.016029,79.210136],[51.015579,79.211617],[51.007591,79.234901],[51.005562,79.242317],[51.003342,79.251389],[51.003021,79.252533],[51.002659,79.253593],[51.001808,79.255669],[50.98951,79.284027],[50.98748,79.287827],[50.962818,79.324883],[50.962559,79.325447],[50.962379,79.326103],[50.962212,79.327141],[50.959042,79.355682],[50.958809,79.356934],[50.958149,79.358727],[50.957802,79.359367],[50.953659,79.365479],[50.930439,79.399277],[50.926579,79.403992],[50.918289,79.412323],[50.916969,79.413887],[50.913879,79.419724],[50.893089,79.460503],[50.872532,79.485619],[50.866772,79.489517],[50.82011,79.513809],[50.816929,79.5168],[50.814468,79.520363],[50.80534,79.535316],[50.795849,79.544861],[50.793091,79.548866],[50.770229,79.570343],[50.766281,79.576218],[50.758541,79.596062],[50.746498,79.631073],[50.731331,79.676567],[50.720749,79.708328],[50.703209,79.74054],[50.69994,79.747147],[50.69088,79.768768],[50.683689,79.79467],[50.67292,79.832642],[50.670799,79.840111],[50.662849,79.868134],[50.661018,79.872467],[50.65765,79.878677],[50.655571,79.882507],[50.63998,79.910912],[50.636139,79.916557],[50.620838,79.939331],[50.61507,79.951691],[50.600399,79.982117],[50.585468,80.013718],[50.580212,80.02227],[50.577808,80.02652],[50.57518,80.034264],[50.573009,80.041977],[50.57056,80.050537],[50.56884,80.056877],[50.566608,80.062363],[50.559872,80.072617],[50.553612,80.081573],[50.54895,80.091049],[50.54501,80.096603],[50.542839,80.097717],[50.533352,80.099632],[50.530899,80.100929],[50.525398,80.104149],[50.522221,80.105339],[50.51479,80.106903],[50.508839,80.10836],[50.507149,80.109169],[50.50613,80.109894],[50.505871,80.110092],[50.505508,80.110397],[50.499519,80.118111],[50.49921,80.118668],[50.498772,80.119797],[50.49789,80.123573],[50.49752,80.124908],[50.496269,80.129204],[50.495819,80.130363],[50.495411,80.131073],[50.49308,80.133904],[50.491718,80.135551],[50.490509,80.136971],[50.490189,80.137268],[50.486549,80.139992],[50.485451,80.140953],[50.481461,80.144653],[50.480961,80.14537],[50.480141,80.147072],[50.479561,80.148903],[50.479019,80.150627],[50.47871,80.151627],[50.478321,80.152977],[50.4776,80.156029],[50.477539,80.156303],[50.474152,80.174263],[50.473228,80.17939],[50.472271,80.184387],[50.47208,80.185463],[50.47179,80.187027],[50.47139,80.18969],[50.470718,80.196457],[50.470322,80.200493],[50.470058,80.202507],[50.469769,80.20388],[50.469521,80.204887],[50.469299,80.205589],[50.46806,80.20974],[50.46624,80.216202],[50.465012,80.21991],[50.46447,80.221497],[50.464031,80.222557],[50.463169,80.224312],[50.461349,80.227753],[50.460651,80.228928],[50.45948,80.230789],[50.458599,80.232033],[50.458118,80.232437],[50.456772,80.233307],[50.453121,80.235207],[50.448212,80.237793],[50.447819,80.237923],[50.447571,80.23793],[50.44733,80.237831],[50.447201,80.237694],[50.4459,80.236343],[50.44566,80.23613],[50.445492,80.235977],[50.445301,80.235924],[50.444969,80.23587],[50.444519,80.236481],[50.443932,80.237343],[50.443802,80.237633],[50.443722,80.237961],[50.443378,80.24015],[50.443199,80.241318],[50.44313,80.242111],[50.443039,80.243042],[50.442871,80.243759],[50.44278,80.244011],[50.442669,80.244308],[50.44231,80.24485],[50.441528,80.245911],[50.440762,80.24691],[50.440552,80.247276],[50.440559,80.251106],[50.440559,80.251862],[50.440571,80.255997],[50.44059,80.259911],[50.439892,80.258827],[50.438789,80.257118],[50.437721,80.25544],[50.437061,80.254433],[50.436649,80.253639],[50.436298,80.253082],[50.435532,80.251907],[50.434078,80.249634],[50.4338,80.249153],[50.432331,80.246696],[50.430851,80.244049],[50.429489,80.241982],[50.427849,80.239441],[50.426769,80.237717],[50.425671,80.235977],[50.424549,80.234207],[50.42345,80.232437],[50.422421,80.230797],[50.422329,80.230598],[50.422291,80.230423],[50.422272,80.230331],[50.422272,80.230019],[50.422218,80.229637],[50.422138,80.229317],[50.421902,80.228851],[50.4217,80.228592],[50.4216,80.228523],[50.42128,80.228302],[50.420979,80.228241],[50.420738,80.228401],[50.420589,80.228691],[50.42046,80.228798],[50.420231,80.228882],[50.419559,80.228821],[50.418201,80.228569],[50.41748,80.228432],[50.416191,80.22805],[50.415661,80.227791],[50.414989,80.227432],[50.414131,80.226929],[50.4053,80.221863],[50.40469,80.221527],[50.403019,80.221031],[50.402401,80.220863],[50.401581,80.220741],[50.401031,80.220657],[50.399311,80.22039],[50.39875,80.220543],[50.398548,80.220642],[50.398361,80.220787],[50.398159,80.220871],[50.397999,80.220901],[50.397629,80.220718],[50.3974,80.220711],[50.397072,80.220772],[50.396671,80.221039],[50.396351,80.221352],[50.395809,80.221992],[50.395439,80.222527],[50.395168,80.223038],[50.39502,80.223373],[50.39489,80.223763],[50.394798,80.223953],[50.394661,80.224113],[50.39455,80.224182],[50.394402,80.224228],[50.39402,80.224243],[50.39362,80.224319],[50.393101,80.224457],[50.392429,80.224716],[50.391159,80.225403],[50.390282,80.226082],[50.389118,80.22702],[50.385971,80.229622],[50.38485,80.23037],[50.38287,80.231682],[50.38155,80.232513],[50.380508,80.233391],[50.37973,80.234268],[50.37862,80.235771],[50.378281,80.236259],[50.378132,80.236458],[50.37574,80.239532],[50.37561,80.239922],[50.374352,80.241722],[50.37109,80.24633],[50.370972,80.246513],[50.368279,80.250412],[50.366982,80.252296],[50.36483,80.254951],[50.364552,80.255524],[50.363361,80.256828],[50.363029,80.256187],[50.36293,80.256058],[50.36277,80.255997],[50.36264,80.256119],[50.362091,80.25679],[50.361591,80.25737],[50.36013,80.259033],[50.359909,80.259407],[50.359852,80.25985],[50.359909,80.260277],[50.35997,80.260773],[50.3601,80.26178],[50.360271,80.263077],[50.36031,80.263931],[50.360378,80.265427],[50.360409,80.266212],[50.360451,80.267143],[50.360451,80.267761],[50.360378,80.268303],[50.36002,80.269943],[50.359829,80.27034],[50.359718,80.270462],[50.35952,80.270691],[50.358528,80.271301],[50.358398,80.271477],[50.357769,80.272652],[50.355282,80.276718],[50.353569,80.279518],[50.352551,80.281174],[50.349991,80.285347],[50.348801,80.287376],[50.34771,80.28933],[50.34613,80.292107],[50.344971,80.294273],[50.34164,80.300957],[50.339989,80.30381],[50.31815,80.339973],[50.317699,80.3405],[50.3097,80.352638],[50.29863,80.370323],[50.288872,80.387657],[50.254799,80.438637],[50.1786,80.543793],[50.147369,80.586998],[50.140499,80.595627],[50.129791,80.608902],[50.12748,80.611763],[50.125332,80.61425],[50.048908,80.68779],[50.013439,80.721893],[49.99485,80.740593],[49.99086,80.744957],[49.980228,80.756561],[49.977631,80.759216],[49.964771,80.772614],[49.960129,80.776558],[49.954281,80.780327],[49.948589,80.782913],[49.837891,80.833717],[49.83419,80.835533],[49.832191,80.837158],[49.80888,80.859039],[49.806938,80.860931],[49.797581,80.872002],[49.795361,80.87458],[49.794201,80.875519],[49.792919,80.875862],[49.782131,80.879662],[49.781448,80.879898],[49.77985,80.880836],[49.77879,80.882042],[49.777302,80.88385],[49.736259,80.945213],[49.733879,80.948143],[49.73111,80.950974],[49.673931,81.008041],[49.668369,81.014137],[49.662201,81.021088],[49.65498,81.028976],[49.646358,81.037537],[49.632919,81.050873],[49.631248,81.052078],[49.62986,81.052513],[49.625141,81.053543],[49.62352,81.054222],[49.621738,81.055252],[49.620129,81.056877],[49.605228,81.073448],[49.603111,81.076279],[49.59388,81.089241],[49.553799,81.14563],[49.5425,81.163139],[49.537991,81.17009],[49.53754,81.17112],[49.536152,81.171982],[49.532249,81.178162],[49.53075,81.180733],[49.523109,81.196442],[49.52261,81.198761],[49.52261,81.200989],[49.523109,81.203651],[49.52306,81.205711],[49.519772,81.231293],[49.5191,81.234207],[49.51704,81.241158],[49.509689,81.271461],[49.500149,81.299011],[49.499371,81.300636],[49.498089,81.302361],[49.48444,81.315964],[49.477909,81.323692],[49.474449,81.328407],[49.4725,81.331413],[49.470879,81.334503],[49.469261,81.338371],[49.455101,81.372704],[49.45393,81.374329],[49.45314,81.375107],[49.452301,81.37545],[49.445,81.376297],[49.443039,81.376823],[49.441429,81.377678],[49.44009,81.378883],[49.436741,81.383087],[49.435452,81.38472],[49.434219,81.38652],[49.433159,81.388237],[49.42725,81.401108],[49.421219,81.414253],[49.418541,81.419479],[49.411678,81.429916],[49.400391,81.447113],[49.39827,81.450287],[49.39156,81.461533],[49.38866,81.466682],[49.382511,81.47673],[49.380718,81.480247],[49.372341,81.49939],[49.37133,81.502136],[49.37072,81.504883],[49.36927,81.512001],[49.368649,81.514236],[49.367981,81.516037],[49.36647,81.518959],[49.364799,81.521713],[49.362339,81.525047],[49.356628,81.532257],[49.35479,81.53389],[49.34597,81.540771],[49.344952,81.541206],[49.343632,81.541473],[49.34333,81.541527],[49.340672,81.541313],[49.33812,81.541054],[49.335979,81.540817],[49.33514,81.540771],[49.334141,81.540863],[49.333038,81.54113],[49.332169,81.54155],[49.331421,81.542183],[49.329498,81.544533],[49.328152,81.546356],[49.32795,81.546631],[49.324299,81.551483],[49.322681,81.553627],[49.321751,81.554893],[49.321259,81.555237],[49.321011,81.555313],[49.32069,81.555267],[49.320511,81.555206],[49.320339,81.555031],[49.320141,81.554764],[49.32,81.554527],[49.319931,81.554253],[49.31987,81.553459],[49.319889,81.551407],[49.320042,81.544144],[49.320061,81.54332],[49.320091,81.541809],[49.320278,81.532089],[49.320541,81.520844],[49.321339,81.486343],[49.321339,81.484283],[49.321331,81.481621],[49.321308,81.47982],[49.32077,81.477058],[49.318619,81.468513],[49.318211,81.467102],[49.317501,81.464767],[49.31506,81.459068],[49.313931,81.456322],[49.29652,81.414993],[49.275181,81.364922],[49.254799,81.316856],[49.235931,81.271873],[49.23465,81.269058],[49.23217,81.264801],[49.230999,81.263184],[49.22913,81.261017],[49.226669,81.258499],[49.218109,81.250893],[49.19363,81.229141],[49.190189,81.22509],[49.189041,81.222366],[49.188091,81.219749],[49.187592,81.217003],[49.187149,81.214172],[49.187019,81.210899],[49.187302,81.204613],[49.187271,81.202583],[49.187061,81.200394],[49.186401,81.197197],[49.185638,81.195068],[49.18441,81.192802],[49.182369,81.190697],[49.179611,81.188919],[49.176208,81.187088],[49.174641,81.186363],[49.173618,81.185463],[49.172539,81.184052],[49.171612,81.182587],[49.17041,81.180519],[49.167099,81.174347],[49.16547,81.171173],[49.160641,81.158813],[49.15929,81.156151],[49.158119,81.154266],[49.1511,81.144478],[49.14925,81.141388],[49.147961,81.138901],[49.14621,81.134613],[49.145481,81.133408],[49.144531,81.132378],[49.142342,81.130493],[49.141048,81.128937],[49.140091,81.127403],[49.129929,81.109627],[49.128189,81.107323],[49.099369,81.076927],[49.09729,81.074699],[49.09594,81.072723],[49.09499,81.070839],[49.094372,81.069122],[49.09425,81.067413],[49.094372,81.065514],[49.0942,81.06337],[49.09351,81.059097],[49.091969,81.054367],[49.091129,81.052399],[49.089951,81.050339],[49.088772,81.048798],[49.071232,81.026314],[49.069771,81.024513],[49.068298,81.023216],[49.06707,81.02253],[49.059021,81.019096],[49.05661,81.017982],[49.048618,81.012573],[49.047379,81.011276],[49.037762,80.998329],[49.03619,80.996353],[49.03511,80.995407],[49.03371,80.994461],[49.020882,80.985367],[49.019501,80.984467],[49.014061,80.979347],[49.012428,80.978073],[49.01086,80.977211],[49.008888,80.976097],[49.00737,80.97464],[49.000839,80.966827],[48.999088,80.965027],[48.997849,80.963913],[48.99498,80.96199],[48.993118,80.960442],[48.99165,80.958298],[48.988419,80.95253],[48.987301,80.950897],[48.985722,80.94944],[48.984138,80.948486],[48.980709,80.947212],[48.978569,80.945923],[48.976822,80.944473],[48.95203,80.920937],[48.950581,80.919563],[48.94915,80.917877],[48.946911,80.913948],[48.913811,80.859528],[48.912689,80.8573],[48.9119,80.855164],[48.91127,80.852921],[48.910431,80.848801],[48.909691,80.846657],[48.903042,80.833443],[48.901741,80.831551],[48.900612,80.830002],[48.898918,80.828293],[48.89711,80.827003],[48.89357,80.825073],[48.887291,80.82206],[48.882999,80.819962],[48.881439,80.819473],[48.867081,80.817131],[48.866169,80.816963],[48.865391,80.816933],[48.864559,80.817062],[48.826309,80.825882],[48.824501,80.82666],[48.82275,80.827507],[48.82127,80.828537],[48.819519,80.830093],[48.80703,80.84082],[48.805389,80.84211],[48.803699,80.842957],[48.80172,80.843483],[48.798328,80.844597],[48.784302,80.850937],[48.783058,80.851288],[48.77718,80.851967],[48.775928,80.851967],[48.773079,80.85186],[48.76965,80.851547],[48.75919,80.850693],[48.756359,80.85054],[48.75177,80.848717],[48.739208,80.843727],[48.73711,80.842453],[48.735809,80.841164],[48.72823,80.829567],[48.726398,80.827591],[48.72459,80.826653],[48.722832,80.826393],[48.715981,80.82486],[48.71294,80.823891],[48.697102,80.817177],[48.691078,80.81456],[48.688881,80.813606],[48.687199,80.81292],[48.685501,80.812332],[48.683559,80.811493],[48.682331,80.810928],[48.68079,80.809769],[48.674721,80.80381],[48.670029,80.798843],[48.654549,80.782288],[48.652519,80.779533],[48.56625,80.656357],[48.562111,80.650528],[48.56052,80.649063],[48.558701,80.648117],[48.521759,80.631844],[48.514252,80.626694],[48.506981,80.62014],[48.470058,80.584862],[48.451328,80.564262],[48.445351,80.558434],[48.431862,80.544952],[48.428841,80.542213],[48.386341,80.499123],[48.384232,80.496117],[48.381611,80.492157],[48.36536,80.463501],[48.36467,80.462471],[48.36404,80.461952],[48.363251,80.4617],[48.359138,80.461868],[48.358231,80.461609],[48.35714,80.460922],[48.335468,80.440071],[48.334209,80.439377],[48.332901,80.43895],[48.33136,80.438698],[48.329479,80.438522],[48.303791,80.436546],[48.282089,80.435089],[48.280609,80.435013],[48.278839,80.435089],[48.276951,80.435349],[48.2565,80.442299],[48.218819,80.454918],[48.201778,80.461182],[48.199951,80.4617],[48.189301,80.464272],[48.18261,80.467102],[48.180321,80.467621],[48.178551,80.467789],[48.175289,80.467697],[48.151119,80.465637],[48.140419,80.464531],[48.138809,80.464012],[48.137661,80.463074],[48.13583,80.462547],[48.133202,80.462044],[48.129929,80.46067],[48.127239,80.459549],[48.125061,80.458183],[48.123798,80.457657],[48.120941,80.457237],[48.11853,80.456459],[48.114059,80.453888],[48.112919,80.453712],[48.110909,80.453712],[48.108559,80.454491],[48.102139,80.455261],[48.100361,80.455261],[48.094521,80.454659],[48.087639,80.453369],[48.082821,80.451309],[48.081959,80.450706],[48.0802,80.448807],[48.078949,80.446602],[48.07795,80.444893],[48.07597,80.443291],[48.073978,80.442009],[48.069759,80.440331],[48.068878,80.439133],[48.067829,80.436317],[48.066292,80.434669],[48.06041,80.433647],[48.05928,80.43306],[48.057381,80.43177],[48.05444,80.429626],[48.053261,80.428909],[48.051949,80.428711],[48.0438,80.429039],[48.0415,80.428818],[48.040199,80.428123],[48.03611,80.425949],[48.032051,80.423782],[48.030571,80.422501],[48.029652,80.421471],[48.02541,80.419167],[48.021198,80.416908],[48.019539,80.416183],[48.018749,80.4161],[48.017658,80.41629],[47.991871,80.420624],[47.99033,80.420883],[47.987949,80.420197],[47.987068,80.419563],[47.984379,80.416069],[47.98214,80.413673],[47.974831,80.406982],[47.963409,80.398438],[47.961182,80.397171],[47.958969,80.396156],[47.957169,80.395592],[47.955151,80.39521],[47.952431,80.394997],[47.948669,80.395233],[47.945518,80.395798],[47.940239,80.396606],[47.92968,80.398376],[47.927811,80.398933],[47.926281,80.399696],[47.924911,80.400841],[47.923679,80.402428],[47.92281,80.403801],[47.92189,80.405907],[47.921028,80.408737],[47.920361,80.413338],[47.920189,80.414627],[47.919071,80.421181],[47.917919,80.424767],[47.916519,80.42717],[47.915371,80.428757],[47.91367,80.430153],[47.912231,80.431068],[47.91,80.431641],[47.90947,80.431587],[47.908821,80.431511],[47.90741,80.43129],[47.90609,80.431107],[47.9039,80.430817],[47.901539,80.430519],[47.901409,80.430496],[47.901131,80.430527],[47.900841,80.430603],[47.9007,80.430649],[47.900421,80.430794],[47.900139,80.430977],[47.899738,80.43132],[47.89922,80.4319],[47.89888,80.432373],[47.89835,80.433281],[47.89814,80.433678],[47.897732,80.434517],[47.897449,80.43515],[47.897202,80.43576],[47.89706,80.436172],[47.896961,80.436607],[47.89687,80.437271],[47.896801,80.43882],[47.896111,80.441483],[47.8895,80.466629],[47.888458,80.469467],[47.88308,80.481781],[47.88253,80.484047],[47.88242,80.485947],[47.884239,80.498688],[47.884121,80.500748],[47.883259,80.503113],[47.872631,80.519592],[47.87114,80.521431],[47.86964,80.522461],[47.868599,80.523232],[47.867851,80.524094],[47.867081,80.525513],[47.865028,80.529671],[47.860371,80.535767],[47.846722,80.551987],[47.84539,80.552849],[47.843552,80.553879],[47.8428,80.554573],[47.84193,80.555679],[47.838188,80.558769],[47.824478,80.568977],[47.81485,80.57679],[47.79208,80.597733],[47.79047,80.599449],[47.788731,80.601768],[47.78735,80.603996],[47.785561,80.606148],[47.782742,80.608887],[47.762951,80.62709],[47.759609,80.629578],[47.752739,80.634468],[47.751869,80.635406],[47.75037,80.637993],[47.749512,80.639267],[47.748291,80.640556],[47.737209,80.650352],[47.735249,80.651627],[47.733231,80.652321],[47.730869,80.652496],[47.71777,80.652618],[47.71574,80.652786],[47.713951,80.653442],[47.71117,80.654472],[47.69194,80.662369],[47.684441,80.665321],[47.681252,80.667],[47.67836,80.667343],[47.67588,80.667603],[47.673679,80.668213],[47.672119,80.66906],[47.668591,80.671379],[47.66703,80.671982],[47.665409,80.671982],[47.66021,80.671204],[47.65744,80.670433],[47.655472,80.669144],[47.653679,80.667603],[47.650089,80.663834],[47.648769,80.661926],[47.64645,80.657806],[47.645531,80.656616],[47.644371,80.655586],[47.638119,80.650703],[47.636971,80.64949],[47.636341,80.648239],[47.635181,80.646782],[47.634201,80.645752],[47.632408,80.64489],[47.63055,80.644043],[47.628189,80.643257],[47.609489,80.641586],[47.595901,80.638283],[47.589649,80.636833],[47.587109,80.635887],[47.58363,80.633636],[47.578072,80.629959],[47.568802,80.623444],[47.56736,80.622231],[47.566078,80.621803],[47.564869,80.621628],[47.55537,80.622414],[47.549568,80.623093],[47.546799,80.623444],[47.543732,80.62336],[47.539551,80.622658],[47.532768,80.622917],[47.529751,80.623001],[47.526279,80.622147],[47.510658,80.61721],[47.487869,80.608543],[47.485722,80.607773],[47.480671,80.605751],[47.47731,80.604637],[47.43161,80.593521],[47.42905,80.592323],[47.421242,80.586311],[47.418598,80.584167],[47.416599,80.582916],[47.396759,80.579399],[47.392311,80.578667],[47.389759,80.579742],[47.387699,80.580429],[47.374851,80.580688],[47.372471,80.581078],[47.363312,80.584846],[47.360371,80.586273],[47.35825,80.586739],[47.352638,80.586647],[47.349819,80.587341],[47.34119,80.59259],[47.331879,80.597717],[47.319569,80.605148],[47.314831,80.610023],[47.300751,80.622543],[47.298939,80.623947],[47.296761,80.625023],[47.295071,80.626427],[47.292019,80.630363],[47.272099,80.654472],[47.270119,80.656708],[47.267269,80.658943],[47.260921,80.663689],[47.257599,80.666351],[47.25127,80.675407],[47.247211,80.683594],[47.246471,80.684959],[47.244949,80.686447],[47.243061,80.68705],[47.239849,80.687317],[47.233131,80.687828],[47.189499,80.691467],[47.144661,80.694481],[47.07082,80.699287],[47.052109,80.699966],[46.981419,80.698601],[46.977669,80.698257],[46.97451,80.696716],[46.971809,80.695],[46.969471,80.692078],[46.967251,80.688477],[46.935261,80.630463],[46.93327,80.626846],[46.930679,80.623589],[46.92189,80.6138],[46.89727,80.5858],[46.892929,80.58168],[46.890121,80.579361],[46.887299,80.57756],[46.861721,80.563393],[46.85849,80.562187],[46.85614,80.561417],[46.853561,80.560738],[46.839649,80.561081],[46.806992,80.561958],[46.728088,80.562302],[46.72385,80.56282],[46.721378,80.564018],[46.717739,80.56694],[46.714088,80.57106],[46.711262,80.575348],[46.709259,80.578957],[46.708199,80.581703],[46.706791,80.58342],[46.703732,80.583588],[46.68948,80.58342],[46.686069,80.583763],[46.683949,80.584793],[46.680531,80.588387],[46.678532,80.590446],[46.676289,80.591827],[46.674171,80.592346],[46.671822,80.59166],[46.666519,80.587883],[46.63953,80.570541],[46.635288,80.568657],[46.631519,80.568138],[46.628571,80.568481],[46.62513,80.569603],[46.557652,80.610458],[46.524948,80.630287],[46.49506,80.64814],[46.45723,80.670799],[46.428841,80.687798],[46.414989,80.696037],[46.413479,80.696259],[46.411678,80.696121],[46.41032,80.695602],[46.409321,80.695183],[46.40836,80.694923],[46.407001,80.694923],[46.405579,80.695351],[46.404751,80.695953],[46.402981,80.697411],[46.396648,80.703484],[46.384979,80.714737],[46.342571,80.749603],[46.303871,80.781372],[46.22459,80.846413],[46.207008,80.860657],[46.204029,80.863136],[46.19865,80.867607],[46.198219,80.868042],[46.197861,80.868729],[46.197861,80.869667],[46.198341,80.870354],[46.199711,80.87233],[46.200661,80.873878],[46.20298,80.880402],[46.203388,80.881767],[46.203449,80.883583],[46.20285,80.889503],[46.202621,80.89164],[46.201191,80.901688],[46.200062,80.904427],[46.19846,80.907349],[46.196499,80.910439],[46.190979,80.928886],[46.186642,80.939537],[46.185211,80.943008],[46.183781,80.947128],[46.182949,80.951332],[46.182598,80.955193],[46.182419,80.971069],[46.180462,80.972443],[46.176182,80.974503],[46.122959,81.002571],[46.11903,81.004288],[46.1157,81.006767],[46.086899,81.024117],[46.085949,81.024971],[46.085411,81.02626],[46.085171,81.027718],[46.084808,81.029182],[46.06403,81.067802],[46.061291,81.072441],[46.05891,81.075699],[46.01363,81.126251],[46.011719,81.128754],[46.010529,81.131401],[45.999378,81.170197],[45.99699,81.176643],[45.98489,81.20359],[45.983398,81.207283],[45.98209,81.2108],[45.974869,81.251556],[45.966999,81.295174],[45.96574,81.300751],[45.952202,81.352943],[45.92617,81.46151],[45.92474,81.467003],[45.923431,81.471207],[45.907719,81.513351],[45.884838,81.574379],[45.883888,81.576439],[45.88311,81.577553],[45.87851,81.58287],[45.841572,81.624672],[45.83918,81.627853],[45.82835,81.650421],[45.82291,81.661407],[45.782639,81.745087],[45.770489,81.775818],[45.711369,81.934608],[45.706032,81.947403],[45.701962,81.955116],[45.697521,81.961212],[45.695599,81.962929],[45.69392,81.963867],[45.69212,81.963959],[45.691051,81.963707],[45.686371,81.962837],[45.683491,81.962761],[45.682468,81.963188],[45.68079,81.964821],[45.58416,82.071327],[45.53891,82.121536],[45.502449,82.168114],[45.47237,82.206497],[45.435539,82.253471],[45.43288,82.256813],[45.352539,82.358437],[45.34301,82.370888],[45.295689,82.430367],[45.287159,82.441269],[45.282871,82.446083],[45.276649,82.452087],[45.258049,82.468567],[45.257339,82.469673],[45.256802,82.471046],[45.25655,82.472603],[45.256371,82.474907],[45.255772,82.476196],[45.255081,82.476967],[45.24276,82.492943],[45.24107,82.495087],[45.23835,82.500153],[45.23605,82.505562],[45.235748,82.50676],[45.235748,82.508476],[45.236408,82.513367],[45.23629,82.51474],[45.235691,82.516289],[45.234779,82.517754],[45.221298,82.542213],[45.217979,82.546928],[45.21302,82.553284],[45.21175,82.554398],[45.210171,82.555344],[45.208,82.556198],[45.2057,82.556969],[45.204491,82.557907],[45.200378,82.561691],[45.197479,82.564438],[45.195782,82.565468],[45.19421,82.56633],[45.19318,82.566406],[45.189789,82.565552],[45.17136,82.560516],[45.166561,82.559196],[45.163719,82.55809],[45.158691,82.556969],[45.152882,82.556717],[45.084499,82.560577],[45.081108,82.560997],[45.071529,82.563843],[45.0508,82.570007],[45.04612,82.571747],[45.04187,82.574661],[45.039688,82.57827],[45.01506,82.595444],[45.01239,82.597504],[45.005718,82.605743],[45.002682,82.608307],[44.99564,82.617073],[44.978771,82.627373],[44.958,82.636978],[44.947311,82.640244],[44.94281,82.639549],[44.936371,82.637833],[44.931629,82.632507],[44.93111,82.630547],[44.9258,82.610367],[44.903549,82.542389],[44.844742,82.543419],[44.835861,82.53981],[44.834709,82.554497],[44.825001,82.547546],[44.808102,82.535461],[44.803349,82.525513],[44.802368,82.523788],[44.798359,82.516747],[44.798481,82.514],[44.79129,82.502159],[44.78569,82.496147],[44.778252,82.493919],[44.77277,82.48774],[44.765209,82.48774],[44.7616,82.496841],[44.755459,82.512283],[44.755829,82.539062],[44.74157,82.540092],[44.725101,82.544388],[44.70644,82.549362],[44.700699,82.548683],[44.683128,82.544563],[44.676418,82.539917],[44.664211,82.517776],[44.65704,82.51091],[44.653099,82.507133],[44.595058,82.5037],[44.58345,82.503532],[44.582352,82.522926],[44.580879,82.523453],[44.557529,82.522873],[44.534039,82.522293],[44.52557,82.522072],[44.52927,82.554169],[44.5313,82.571716],[44.534229,82.594208],[44.53619,82.611549],[44.536442,82.617043],[44.536678,82.620987],[44.544998,82.64502],[44.546589,82.650337],[44.547451,82.655663],[44.548061,82.671463],[44.547199,82.679176],[44.547699,82.683823],[44.547699,82.686737],[44.546959,82.691711],[44.547451,82.696007],[44.547329,82.702187],[44.547569,82.705963],[44.545731,82.742699],[44.546101,82.745613],[44.554199,82.764877],[44.55444,82.765709],[44.557529,82.773193],[44.558979,82.777283],[44.56015,82.781342],[44.568581,82.81691],[44.569359,82.820198],[44.57032,82.823631],[44.571289,82.826576],[44.582081,82.85862],[44.582989,82.861427],[44.584259,82.865913],[44.585281,82.870201],[44.589359,82.889977],[44.590691,82.896233],[44.590988,82.897942],[44.59103,82.898331],[44.591629,82.901283],[44.592972,82.907463],[44.593128,82.908318],[44.594398,82.914139],[44.5956,82.919319],[44.595772,82.919952],[44.596539,82.921898],[44.597641,82.923813],[44.599129,82.92556],[44.59964,82.926018],[44.60025,82.926498],[44.601158,82.927078],[44.602718,82.927742],[44.608871,82.929962],[44.613121,82.931633],[44.61327,82.931717],[44.613789,82.93187],[44.617851,82.933357],[44.619282,82.933968],[44.628521,82.937401],[44.633331,82.93927],[44.63562,82.940033],[44.63689,82.940529],[44.637329,82.94075],[44.637859,82.940918],[44.641899,82.942482],[44.643261,82.943153],[44.643501,82.943359],[44.644581,82.944077],[44.645691,82.945137],[44.64632,82.945908],[44.647072,82.947403],[44.64753,82.948624],[44.647732,82.949257],[44.648071,82.950394],[44.648041,82.952026],[44.648121,82.954086],[44.647881,82.957283],[44.646622,82.960457],[44.645519,82.962517],[44.64283,82.96595],[44.640511,82.969559],[44.638519,82.972366],[44.63554,82.978752],[44.633381,82.985313],[44.632469,82.990089],[44.629028,83.018311],[44.627201,83.026718],[44.621578,83.048523],[44.615349,83.086113],[44.614861,83.091438],[44.615471,83.154221],[44.615681,83.190536],[44.61544,83.220917],[44.612629,83.238258],[44.601631,83.288887],[44.595638,83.3004],[44.59034,83.305893],[44.58234,83.314774],[44.57122,83.328331],[44.569988,83.330223],[44.565102,83.345497],[44.560581,83.365227],[44.551159,83.38755],[44.543209,83.426353],[44.542961,83.428749],[44.542839,83.452782],[44.549931,83.520592],[44.55006,83.523163],[44.549931,83.525574],[44.549568,83.527802],[44.54847,83.530891],[44.522888,83.596626],[44.51738,83.607964],[44.515301,83.610542],[44.493999,83.625816],[44.492531,83.626503],[44.49033,83.626678],[44.482121,83.626846],[44.480289,83.627708],[44.476238,83.630623],[44.474899,83.632339],[44.474159,83.634064],[44.473431,83.637154],[44.46228,83.72023],[44.46032,83.748039],[44.460442,83.753021],[44.464611,83.786148],[44.464851,83.791473],[44.462521,83.859108],[44.453579,83.898933],[44.43998,83.961418],[44.438141,83.967079],[44.41766,84.027496],[44.415581,84.031113],[44.38406,84.079178],[44.382961,84.081062],[44.381969,84.083122],[44.381359,84.086037],[44.379848,84.10498],[44.374119,84.176682],[44.371559,84.24231],[44.37125,84.250366],[44.371029,84.255867],[44.36956,84.293549],[44.369381,84.298866],[44.369419,84.305313],[44.369339,84.310707],[44.36924,84.314056],[44.368771,84.329811],[44.36895,84.336533],[44.369949,84.346283],[44.373421,84.381859],[44.374149,84.38546],[44.401112,84.488602],[44.401451,84.489929],[44.401489,84.49025],[44.401718,84.491364],[44.401939,84.492889],[44.402012,84.49366],[44.40205,84.494843],[44.40202,84.496437],[44.401958,84.497253],[44.401669,84.499237],[44.401421,84.500412],[44.401112,84.501549],[44.40057,84.503014],[44.399769,84.504753],[44.399059,84.506104],[44.39526,84.512733],[44.38364,84.533234],[44.382381,84.535522],[44.381882,84.536552],[44.381409,84.537643],[44.38113,84.538383],[44.38063,84.539909],[44.38044,84.54071],[44.38015,84.542343],[44.37999,84.543556],[44.379902,84.544807],[44.37986,84.546066],[44.37989,84.548592],[44.380539,84.571327],[44.38081,84.584824],[44.38163,84.621742],[44.38187,84.631577],[44.38195,84.634491],[44.38224,84.646912],[44.382339,84.648911],[44.382622,84.652283],[44.382851,84.654289],[44.383221,84.656693],[44.383591,84.65873],[44.38401,84.660812],[44.384491,84.662949],[44.38493,84.66465],[44.387989,84.675621],[44.395012,84.701317],[44.39798,84.712379],[44.398918,84.716614],[44.399319,84.718773],[44.399849,84.722267],[44.40015,84.724907],[44.400311,84.726669],[44.400551,84.730438],[44.401211,84.745941],[44.401871,84.761391],[44.40197,84.763748],[44.402451,84.774986],[44.40266,84.779877],[44.403,84.787857],[44.403179,84.791451],[44.40366,84.803093],[44.40369,84.805023],[44.40366,84.806641],[44.403519,84.809212],[44.403332,84.811028],[44.403172,84.812218],[44.40279,84.814468],[44.402401,84.816269],[44.401421,84.820137],[44.401199,84.821136],[44.400791,84.822662],[44.399288,84.828644],[44.399052,84.829597],[44.397511,84.835991],[44.396,84.842293],[44.39402,84.850548],[44.393211,84.855598],[44.392689,84.859741],[44.392189,84.865494],[44.39209,84.872017],[44.392109,84.87764],[44.39323,84.896751],[44.393291,84.902847],[44.393311,84.907852],[44.39307,84.916458],[44.393051,84.917793],[44.391701,84.944908],[44.391331,84.952461],[44.390469,84.958641],[44.38924,84.965851],[44.37661,85.01683],[44.373291,85.02816],[44.36483,85.052711],[44.36237,85.062317],[44.361019,85.069527],[44.360161,85.077087],[44.359669,85.083946],[44.359299,85.09185],[44.359669,85.099747],[44.36372,85.137863],[44.36433,85.146263],[44.36446,85.15313],[44.36433,85.160858],[44.36348,85.168922],[44.362,85.177849],[44.360039,85.184891],[44.357342,85.192963],[44.33942,85.237083],[44.33696,85.244797],[44.335121,85.251839],[44.333771,85.259743],[44.33316,85.267632],[44.333031,85.275528],[44.333889,85.284798],[44.334751,85.292862],[44.335121,85.299042],[44.335121,85.304192],[44.334511,85.310028],[44.334511,85.314323],[44.334869,85.322731],[44.336349,85.331833],[44.33831,85.342819],[44.338799,85.347282],[44.339169,85.352432],[44.339291,85.359642],[44.33905,85.365479],[44.337582,85.375954],[44.336472,85.384697],[44.335979,85.392601],[44.335979,85.403236],[44.33672,85.415077],[44.33979,85.453369],[44.340279,85.458],[44.341999,85.468483],[44.342731,85.474312],[44.343102,85.478783],[44.34322,85.484093],[44.343102,85.489243],[44.342491,85.495422],[44.338558,85.521858],[44.33794,85.528381],[44.337818,85.53405],[44.33807,85.545891],[44.33807,85.551041],[44.33733,85.556534],[44.336102,85.56237],[44.333771,85.568733],[44.33131,85.573883],[44.327141,85.579369],[44.322109,85.584343],[44.316212,85.588814],[44.312401,85.592758],[44.309212,85.596878],[44.306019,85.602028],[44.30331,85.607857],[44.30085,85.614899],[44.299011,85.622627],[44.298271,85.630524],[44.298149,85.639961],[44.29987,85.69558],[44.299381,85.703308],[44.298401,85.710693],[44.296799,85.718071],[44.28685,85.761147],[44.28574,85.768539],[44.284882,85.776947],[44.283161,85.799103],[44.282051,85.807854],[44.280331,85.816597],[44.27763,85.826042],[44.258949,85.880463],[44.256611,85.889732],[44.255131,85.898483],[44.25415,85.906563],[44.25354,85.914108],[44.25243,85.949982],[44.251942,85.956497],[44.25071,85.965431],[44.247509,85.98243],[44.246769,85.989639],[44.246399,85.995819],[44.246399,86.00354],[44.247021,86.009903],[44.25095,86.031181],[44.25563,86.052467],[44.25956,86.063797],[44.265461,86.077187],[44.26952,86.086113],[44.272099,86.093491],[44.273941,86.101387],[44.275169,86.109123],[44.275539,86.114433],[44.275661,86.120956],[44.275421,86.126793],[44.274681,86.133148],[44.273201,86.141037],[44.26226,86.187561],[44.246159,86.230133],[44.243328,86.239059],[44.24136,86.247993],[44.239891,86.257263],[44.23521,86.288498],[44.23312,86.298447],[44.2314,86.306183],[44.221561,86.339653],[44.216511,86.356651],[44.21455,86.363518],[44.21307,86.370728],[44.21233,86.377251],[44.21196,86.384277],[44.21233,86.39064],[44.212818,86.39682],[44.21418,86.403168],[44.216881,86.412613],[44.217991,86.418793],[44.218479,86.425659],[44.218479,86.432693],[44.217621,86.439217],[44.216019,86.445572],[44.213558,86.452606],[44.20052,86.483513],[44.198429,86.490196],[44.196701,86.497917],[44.195591,86.506851],[44.195221,86.515953],[44.195251,86.543556],[44.19471,86.554619],[44.19352,86.564163],[44.190159,86.588669],[44.189831,86.596909],[44.189831,86.604279],[44.19178,86.646683],[44.19178,86.655891],[44.1908,86.66391],[44.189499,86.671829],[44.186901,86.679314],[44.18372,86.68718],[44.18166,86.691147],[44.18071,86.692917],[44.178638,86.696259],[44.17778,86.697723],[44.176701,86.699837],[44.17556,86.702438],[44.174561,86.70517],[44.17395,86.70713],[44.17337,86.709412],[44.17284,86.71209],[44.172352,86.715782],[44.172249,86.71701],[44.17215,86.71917],[44.172009,86.728439],[44.171959,86.746559],[44.171791,86.759918],[44.171539,86.764847],[44.171219,86.768806],[44.17086,86.772324],[44.170589,86.774559],[44.1702,86.777046],[44.169151,86.782753],[44.16835,86.786324],[44.167511,86.789742],[44.166519,86.793556],[44.164181,86.802719],[44.16357,86.805313],[44.162861,86.808769],[44.16214,86.812958],[44.16148,86.818092],[44.161091,86.822517],[44.16058,86.831001],[44.160439,86.832359],[44.16008,86.834793],[44.159649,86.837013],[44.158669,86.840912],[44.157921,86.843369],[44.15683,86.846336],[44.155701,86.848953],[44.154442,86.851357],[44.153419,86.853218],[44.151951,86.855492],[44.15044,86.858032],[44.14957,86.859619],[44.148289,86.862106],[44.146641,86.865753],[44.145729,86.867897],[44.143909,86.872673],[44.14275,86.875504],[44.141731,86.877777],[44.1404,86.88047],[44.139519,86.882133],[44.13802,86.884773],[44.136848,86.886597],[44.13483,86.889458],[44.133209,86.891541],[44.131359,86.89373],[44.129169,86.896019],[44.119942,86.904999],[44.11771,86.907303],[44.114632,86.910797],[44.111851,86.914253],[44.109699,86.917122],[44.1073,86.920486],[44.105091,86.923759],[44.101471,86.928864],[44.097431,86.934837],[44.092442,86.942001],[44.091,86.944183],[44.08979,86.946167],[44.087761,86.949821],[44.086342,86.952797],[44.085121,86.955643],[44.083771,86.959244],[44.08276,86.962158],[44.08242,86.96331],[44.081749,86.96566],[44.08078,86.969597],[44.080059,86.973022],[44.076771,86.989891],[44.076229,86.992317],[44.07518,86.996613],[44.074291,86.999908],[44.072842,87.004631],[44.070599,87.010902],[44.069149,87.014557],[44.067589,87.018158],[44.066078,87.021446],[44.064331,87.024857],[44.06308,87.027153],[44.060379,87.031731],[44.053638,87.042503],[44.04911,87.049896],[44.046768,87.053978],[44.045158,87.056976],[44.043751,87.059807],[44.042549,87.062439],[44.037979,87.073174],[44.032749,87.085258],[44.03149,87.087898],[44.028469,87.093567],[44.027111,87.095787],[44.024738,87.099281],[44.022659,87.102112],[44.020248,87.105118],[44.017658,87.107986],[44.01181,87.113861],[44.006989,87.118851],[44.00354,87.122307],[44.0014,87.124702],[43.999149,87.127373],[43.995361,87.132362],[43.992489,87.136711],[43.990841,87.139389],[43.974121,87.167473],[43.972591,87.170227],[43.9706,87.174049],[43.969471,87.176369],[43.967602,87.180603],[43.966541,87.183228],[43.965569,87.185707],[43.96439,87.188911],[43.963001,87.192917],[43.954929,87.21653],[43.954769,87.216988],[43.953381,87.221046],[43.951832,87.226028],[43.950878,87.229561],[43.94986,87.233673],[43.9491,87.237152],[43.948372,87.240967],[43.94772,87.244904],[43.946381,87.25338],[43.945599,87.258263],[43.943878,87.26899],[43.943729,87.269943],[43.943661,87.270348],[43.94339,87.272049],[43.943081,87.273956],[43.94278,87.275772],[43.941769,87.280762],[43.941509,87.281837],[43.94083,87.284477],[43.940159,87.287323],[43.939629,87.289253],[43.939541,87.289574],[43.938251,87.293716],[43.93816,87.294029],[43.93755,87.295952],[43.935711,87.301018],[43.93557,87.301392],[43.93351,87.30648],[43.933399,87.306717],[43.9277,87.320503],[43.924629,87.327827],[43.924469,87.328171],[43.922958,87.331383],[43.92083,87.335472],[43.917881,87.340439],[43.915852,87.343498],[43.914989,87.344727],[43.9133,87.346977],[43.911129,87.349716],[43.908119,87.353493],[43.90696,87.35508],[43.905602,87.357002],[43.9044,87.358856],[43.90316,87.360962],[43.901939,87.36319],[43.900761,87.365501],[43.899651,87.367943],[43.898571,87.370491],[43.897621,87.373047],[43.89674,87.375633],[43.89579,87.37886],[43.895031,87.381783],[43.894871,87.382446],[43.894279,87.385109],[43.893951,87.386879],[43.893879,87.387268],[43.893501,87.389687],[43.893108,87.392593],[43.892899,87.394691],[43.892689,87.397362],[43.892529,87.400497],[43.892509,87.400887],[43.892479,87.404518],[43.89249,87.407967],[43.89249,87.411003],[43.89246,87.414047],[43.892361,87.415756],[43.892189,87.417381],[43.89196,87.419029],[43.891548,87.42086],[43.891022,87.422783],[43.8904,87.424583],[43.88958,87.426697],[43.88855,87.429367],[43.888359,87.42984],[43.88744,87.43222],[43.887341,87.43248],[43.886429,87.434799],[43.886311,87.435089],[43.88559,87.436859],[43.88485,87.438332],[43.884232,87.439407],[43.883789,87.440033],[43.883591,87.440277],[43.882641,87.441483],[43.881592,87.442558],[43.880539,87.443443],[43.879509,87.444138],[43.878349,87.444763],[43.87767,87.44503],[43.877491,87.445091],[43.876438,87.445389],[43.875191,87.445633],[43.873199,87.445862],[43.87233,87.446022],[43.871521,87.446297],[43.8708,87.446678],[43.86998,87.447144],[43.869301,87.447701],[43.868549,87.44841],[43.867981,87.449081],[43.86739,87.449913],[43.866821,87.450859],[43.866261,87.452019],[43.865822,87.453217],[43.864849,87.456688],[43.86478,87.456963],[43.86433,87.458298],[43.863811,87.459641],[43.863071,87.461128],[43.862381,87.462318],[43.861549,87.463501],[43.860691,87.464523],[43.85965,87.465569],[43.859409,87.465797],[43.85841,87.466583],[43.85751,87.467148],[43.85651,87.467682],[43.855469,87.468079],[43.854439,87.468384],[43.853588,87.46859],[43.853081,87.468727],[43.851749,87.469116],[43.8503,87.469673],[43.849232,87.470154],[43.848011,87.470772],[43.847389,87.471123],[43.84705,87.471336],[43.8461,87.47197],[43.844799,87.472923],[43.84341,87.474068],[43.842701,87.474693],[43.84201,87.475243],[43.84111,87.475983],[43.83971,87.476959],[43.83831,87.477814],[43.83717,87.478394],[43.8358,87.478996],[43.83424,87.479584],[43.832649,87.480026],[43.832432,87.480072],[43.830681,87.480377],[43.814949,87.482323],[43.813801,87.482513],[43.81266,87.482819],[43.81208,87.482986],[43.811771,87.483124],[43.810558,87.483627],[43.809471,87.4842],[43.808338,87.48494],[43.807209,87.485786],[43.806221,87.486656],[43.80513,87.487793],[43.804131,87.489014],[43.803341,87.490128],[43.802521,87.491386],[43.801628,87.492851],[43.80098,87.493896],[43.800289,87.494873],[43.79995,87.495247],[43.799122,87.496063],[43.798279,87.496712],[43.797352,87.497269],[43.796452,87.497643],[43.79562,87.497864],[43.79528,87.497917],[43.794739,87.497971],[43.79393,87.497971],[43.793282,87.497902],[43.792622,87.497749],[43.79195,87.497513],[43.79126,87.497223],[43.790421,87.496727],[43.78997,87.496391],[43.789669,87.496162],[43.78923,87.495773],[43.788609,87.495148],[43.786831,87.492996],[43.784351,87.489883],[43.78339,87.4888],[43.78244,87.487953],[43.781559,87.487282],[43.780479,87.486618],[43.779621,87.486221],[43.778622,87.485832],[43.777359,87.485489],[43.768581,87.484177],[43.7672,87.483994],[43.765968,87.483688],[43.76461,87.483208],[43.763302,87.482597],[43.762199,87.481934],[43.760948,87.481003],[43.759979,87.480133],[43.75798,87.478256],[43.75629,87.476753],[43.755219,87.475883],[43.75386,87.475052],[43.752739,87.474487],[43.751438,87.473969],[43.750031,87.473557],[43.749001,87.473343],[43.747791,87.473244],[43.74649,87.47319],[43.745319,87.473297],[43.744019,87.473534],[43.742809,87.473877],[43.741699,87.474297],[43.74049,87.474876],[43.739391,87.47554],[43.738281,87.476303],[43.73737,87.477051],[43.73629,87.478119],[43.735081,87.479286],[43.733238,87.481216],[43.72575,87.488892],[43.72366,87.490959],[43.722832,87.491814],[43.722229,87.492439],[43.721432,87.493263],[43.719742,87.494972],[43.717701,87.497032],[43.715801,87.499092],[43.713329,87.501373],[43.711281,87.503128],[43.708069,87.505676],[43.705551,87.507523],[43.702839,87.509422],[43.70277,87.509468],[43.688221,87.519676],[43.686871,87.520798],[43.685829,87.521828],[43.68462,87.523239],[43.683552,87.524712],[43.682499,87.526443],[43.68145,87.528549],[43.680691,87.530472],[43.68005,87.532501],[43.679531,87.534561],[43.679199,87.536484],[43.678959,87.538696],[43.6786,87.543793],[43.67857,87.544243],[43.67757,87.558968],[43.67749,87.560387],[43.677399,87.561157],[43.67728,87.562157],[43.677139,87.563583],[43.67701,87.564293],[43.67683,87.564903],[43.676601,87.565376],[43.676239,87.56588],[43.675919,87.566231],[43.675499,87.566544],[43.674992,87.56675],[43.674511,87.566833],[43.67387,87.566788],[43.67218,87.566673],[43.67149,87.566566],[43.667702,87.566078],[43.66563,87.565826],[43.664051,87.56575],[43.662689,87.565804],[43.661449,87.565971],[43.660259,87.566231],[43.659241,87.566559],[43.65818,87.566978],[43.657131,87.567467],[43.655708,87.568199],[43.649658,87.571487],[43.639301,87.577278],[43.637989,87.578117],[43.636768,87.579117],[43.635891,87.580017],[43.635071,87.58107],[43.634281,87.582336],[43.633598,87.583778],[43.633041,87.585251],[43.63274,87.586411],[43.632462,87.587967],[43.63224,87.589622],[43.632118,87.591454],[43.631851,87.597633],[43.63166,87.602814],[43.631641,87.603279],[43.631451,87.607712],[43.631241,87.612137],[43.631008,87.615463],[43.630951,87.616127],[43.630699,87.618637],[43.630329,87.621849],[43.62991,87.62468],[43.629162,87.629738],[43.627029,87.64415],[43.626369,87.648972],[43.626221,87.650948],[43.626209,87.652649],[43.626259,87.654282],[43.626381,87.655884],[43.626579,87.657341],[43.626831,87.658737],[43.627178,87.6605],[43.628189,87.664627],[43.62838,87.665329],[43.629429,87.669518],[43.629879,87.671638],[43.630192,87.673363],[43.63036,87.674721],[43.630501,87.676178],[43.630569,87.677811],[43.63055,87.679382],[43.630421,87.681129],[43.63026,87.682762],[43.630001,87.684677],[43.62574,87.709663],[43.62455,87.716537],[43.624481,87.717003],[43.624031,87.719711],[43.623959,87.720032],[43.62365,87.721848],[43.62323,87.724319],[43.619122,87.748306],[43.618641,87.750763],[43.618141,87.753036],[43.617962,87.754066],[43.60783,87.790024],[43.606331,87.79483],[43.604469,87.798782],[43.598629,87.809593],[43.5658,87.868134],[43.56356,87.873283],[43.562561,87.877747],[43.553478,87.936623],[43.550369,87.947952],[43.548012,87.953453],[43.545639,87.958076],[43.54229,87.962029],[43.51017,87.990517],[43.5047,87.995667],[43.501419,87.997803],[43.498638,87.998932],[43.49448,88],[43.492001,88.000366],[43.490589,88.001099],[43.48933,88.002701],[43.487259,88.007523],[43.485432,88.01181],[43.473808,88.040779],[43.471821,88.044037],[43.451771,88.064278],[43.42305,88.092621],[43.421719,88.094742],[43.418388,88.102074],[43.41431,88.110977],[43.40517,88.127991],[43.40303,88.132248],[43.401909,88.137573],[43.401039,88.144524],[43.401039,88.14724],[43.401409,88.150192],[43.40102,88.15242],[43.398079,88.160744],[43.39703,88.162621],[43.395271,88.164429],[43.388039,88.171944],[43.386688,88.174652],[43.37188,88.212837],[43.369881,88.215889],[43.367619,88.218224],[43.363781,88.220337],[43.352619,88.226151],[43.350868,88.227867],[43.350121,88.229424],[43.348751,88.233704],[43.346882,88.247093],[43.347191,88.253166],[43.347919,88.274597],[43.347969,88.280197],[43.3475,88.284607],[43.343578,88.307373],[43.343201,88.309288],[43.342369,88.311203],[43.34161,88.312332],[43.340641,88.313347],[43.336269,88.316933],[43.335411,88.31813],[43.333851,88.322166],[43.332958,88.323196],[43.331371,88.325027],[43.329269,88.329193],[43.328281,88.330704],[43.32671,88.331947],[43.324421,88.333443],[43.31831,88.337143],[43.317211,88.338058],[43.316551,88.338982],[43.316002,88.339928],[43.312481,88.348618],[43.311829,88.349541],[43.308739,88.353241],[43.307331,88.3545],[43.305771,88.355309],[43.304501,88.35553],[43.303329,88.355553],[43.302132,88.355293],[43.301041,88.354797],[43.299999,88.354073],[43.299019,88.352921],[43.29567,88.347366],[43.294922,88.34639],[43.29427,88.345863],[43.293468,88.345444],[43.292549,88.345306],[43.286049,88.345741],[43.28421,88.346138],[43.279449,88.348213],[43.278389,88.348846],[43.277592,88.349823],[43.275612,88.354141],[43.275002,88.354927],[43.27446,88.355331],[43.273899,88.355469],[43.273232,88.355362],[43.272732,88.355019],[43.27166,88.353889],[43.270939,88.353447],[43.27021,88.353317],[43.26955,88.35347],[43.268181,88.354393],[43.264778,88.35762],[43.263809,88.358849],[43.263401,88.360359],[43.26244,88.370163],[43.261951,88.37146],[43.261261,88.372208],[43.26041,88.372498],[43.25938,88.372566],[43.256512,88.372383],[43.255489,88.372543],[43.25478,88.372917],[43.24931,88.377213],[43.246029,88.379967],[43.244301,88.382111],[43.23455,88.400726],[43.232761,88.408127],[43.232342,88.411072],[43.232262,88.423782],[43.231758,88.42601],[43.227589,88.431534],[43.22604,88.433823],[43.224918,88.436653],[43.222912,88.445251],[43.222118,88.44709],[43.220909,88.448799],[43.217781,88.45314],[43.21653,88.454224],[43.214489,88.455139],[43.21336,88.455887],[43.211441,88.458023],[43.2104,88.458809],[43.206848,88.46019],[43.20443,88.461479],[43.199009,88.465073],[43.196541,88.467239],[43.19408,88.470032],[43.192829,88.471207],[43.191368,88.472076],[43.189159,88.473167],[43.188202,88.473831],[43.186279,88.47554],[43.185108,88.476303],[43.183319,88.476707],[43.180149,88.477287],[43.17802,88.477966],[43.174019,88.479759],[43.172951,88.480476],[43.172161,88.481453],[43.169781,88.484947],[43.168968,88.485672],[43.168079,88.486183],[43.167301,88.486397],[43.16626,88.48629],[43.162991,88.485527],[43.161709,88.485367],[43.16024,88.485497],[43.158871,88.485817],[43.157822,88.486397],[43.15678,88.487129],[43.15575,88.488297],[43.15485,88.489777],[43.15295,88.493713],[43.151932,88.495148],[43.150249,88.497177],[43.147289,88.499817],[43.145618,88.500908],[43.11911,88.508789],[43.113972,88.510857],[43.10878,88.514526],[43.104771,88.516747],[43.095871,88.520363],[43.08585,88.524307],[43.085049,88.52462],[43.084221,88.527397],[43.083469,88.533073],[43.064529,88.645844],[43.063782,88.650993],[43.06353,88.655983],[43.064659,88.704552],[43.062901,88.758797],[43.062149,88.766693],[43.061272,88.770302],[43.060139,88.773048],[43.054749,88.780937],[43.034679,88.809776],[43.031158,88.816467],[43.022129,88.835701],[43.020741,88.840851],[43.01685,88.861969],[43.01511,88.895157],[43.014431,88.903923],[43.01189,88.944511],[43.010181,88.985939],[43.008678,89.023689],[43.00766,89.051407],[43.006378,89.084343],[43.00621,89.086533],[43.00592,89.088699],[43.005348,89.091614],[43.004471,89.094673],[42.995232,89.121597],[42.994888,89.122597],[42.993141,89.127441],[42.986832,89.144073],[42.986031,89.1464],[42.983082,89.154968],[42.980911,89.161613],[42.97858,89.169212],[42.975029,89.179268],[42.974419,89.18145],[42.974018,89.182877],[42.970001,89.211029],[42.96912,89.214462],[42.968922,89.214996],[42.967739,89.218063],[42.957939,89.240379],[42.949902,89.258751],[42.931519,89.301567],[42.922131,89.323463],[42.92075,89.327423],[42.919739,89.332222],[42.919361,89.336693],[42.920872,89.430923],[42.92112,89.450844],[42.920872,89.456848],[42.91634,89.50766],[42.91534,89.513321],[42.912819,89.523277],[42.912071,89.528427],[42.91132,89.550583],[42.91169,89.55246],[42.912701,89.55452],[42.916729,89.560028],[42.917099,89.560532],[42.91848,89.563278],[42.919609,89.566368],[42.921749,89.569633],[42.924389,89.571167],[42.926029,89.572372],[42.929161,89.573227],[42.93055,89.574257],[42.931801,89.575813],[42.93243,89.578209],[42.93243,89.584053],[42.93306,89.586617],[42.935951,89.593658],[42.93721,89.597092],[42.937969,89.6007],[42.938339,89.604637],[42.938091,89.609283],[42.936081,89.6213],[42.934952,89.625237],[42.933819,89.628853],[42.933441,89.632111],[42.933441,89.634857],[42.933941,89.645332],[42.933689,89.64962],[42.931801,89.66198],[42.92263,89.702316],[42.921879,89.705238],[42.921879,89.708328],[42.922249,89.711418],[42.924259,89.721718],[42.9245,89.722847],[42.925522,89.727898],[42.926029,89.730988],[42.926029,89.734077],[42.92577,89.736481],[42.901379,89.832443],[42.900501,89.836906],[42.900249,89.841187],[42.900249,89.845154],[42.902519,89.868317],[42.903271,89.875359],[42.903271,89.879303],[42.902889,89.882736],[42.90189,89.887199],[42.89333,89.916039],[42.882519,89.957413],[42.879749,89.968567],[42.87484,89.992432],[42.875099,90.001534],[42.876228,90.003593],[42.877361,90.007881],[42.87812,90.013542],[42.87849,90.033287],[42.87925,90.038597],[42.880501,90.043587],[42.883518,90.048897],[42.8839,90.050797],[42.883518,90.052513],[42.882019,90.064011],[42.882389,90.07534],[42.885159,90.088043],[42.887299,90.107613],[42.887299,90.111557],[42.885658,90.118088],[42.884529,90.125473],[42.884529,90.155167],[42.884781,90.160141],[42.88755,90.178169],[42.89032,90.194313],[42.891571,90.202888],[42.892578,90.218163],[42.89283,90.225548],[42.894341,90.255417],[42.89547,90.257637],[42.897228,90.260223],[42.91433,90.276871],[42.916088,90.278587],[42.92572,90.286217],[42.926281,90.286659],[42.928669,90.289574],[42.954681,90.325447],[42.965561,90.339417],[42.969109,90.352364],[42.96933,90.354347],[42.97477,90.391518],[42.975849,90.398308],[42.976601,90.404121],[42.976608,90.404427],[42.979778,90.425003],[42.980309,90.428658],[42.981098,90.434731],[42.983521,90.450653],[42.98632,90.469856],[42.986919,90.474617],[42.987289,90.476891],[42.98819,90.483231],[42.98856,90.485153],[42.98893,90.486382],[42.989491,90.487823],[42.998089,90.50766],[42.998421,90.508636],[42.998821,90.510246],[42.999931,90.518677],[43.000271,90.520767],[43.000511,90.522957],[43.001389,90.528778],[43.00177,90.531792],[43.001911,90.532593],[43.002289,90.5355],[43.003151,90.540283],[43.00349,90.541817],[43.00515,90.55069],[43.005402,90.551743],[43.005741,90.553596],[43.00655,90.559807],[43.006821,90.561119],[43.010551,90.585213],[43.010761,90.586189],[43.01086,90.586868],[43.011879,90.59243],[43.012051,90.593674],[43.014481,90.607651],[43.015041,90.611397],[43.01532,90.612556],[43.016499,90.6185],[43.016621,90.618858],[43.01749,90.624069],[43.017841,90.625748],[43.01783,90.625999],[43.01865,90.62989],[43.019321,90.633347],[43.019691,90.634842],[43.019711,90.635452],[43.020451,90.639526],[43.023109,90.652611],[43.0243,90.659431],[43.025982,90.66787],[43.026249,90.669579],[43.027802,90.678146],[43.028332,90.680779],[43.028751,90.683296],[43.028961,90.684067],[43.029202,90.685738],[43.02927,90.686523],[43.030109,90.691254],[43.030991,90.695862],[43.031811,90.700508],[43.03191,90.701439],[43.033859,90.712013],[43.034119,90.713043],[43.034389,90.713882],[43.034821,90.714951],[43.035488,90.716331],[43.037731,90.720207],[43.038509,90.721474],[43.03936,90.722672],[43.039669,90.723244],[43.039711,90.723442],[43.041012,90.7258],[43.049889,90.741318],[43.078011,90.789993],[43.079781,90.793114],[43.091789,90.813927],[43.094238,90.818253],[43.105728,90.83815],[43.127251,90.875664],[43.128132,90.877113],[43.129059,90.878807],[43.152161,90.918983],[43.15641,90.926468],[43.15712,90.927567],[43.15815,90.928741],[43.160381,90.930939],[43.16106,90.931686],[43.161839,90.932793],[43.162491,90.934036],[43.162708,90.934593],[43.163059,90.935707],[43.167259,90.954353],[43.174629,90.9879],[43.177311,90.999687],[43.186829,91.042557],[43.18734,91.045181],[43.193069,91.070633],[43.197281,91.089661],[43.198051,91.092934],[43.200958,91.105988],[43.201221,91.106888],[43.201569,91.107857],[43.2425,91.200439],[43.247059,91.210648],[43.26371,91.248741],[43.269489,91.261757],[43.271019,91.265343],[43.275181,91.274818],[43.277649,91.280586],[43.28059,91.287086],[43.282509,91.291519],[43.285599,91.298424],[43.296082,91.322212],[43.296822,91.323753],[43.297359,91.324638],[43.303131,91.333267],[43.309929,91.343613],[43.311359,91.345619],[43.315521,91.3517],[43.31625,91.352943],[43.31702,91.354584],[43.32486,91.374878],[43.32983,91.387619],[43.33807,91.410332],[43.343979,91.426453],[43.347961,91.437576],[43.348209,91.438461],[43.348942,91.440407],[43.3494,91.441437],[43.352039,91.44873],[43.352589,91.451378],[43.3535,91.460182],[43.354031,91.465851],[43.354301,91.468117],[43.355129,91.476349],[43.355499,91.478973],[43.361481,91.501579],[43.363602,91.509407],[43.364449,91.512863],[43.37183,91.539879],[43.3741,91.548363],[43.374298,91.548882],[43.374851,91.549858],[43.375061,91.550453],[43.375771,91.553467],[43.37603,91.555138],[43.375938,91.555389],[43.37709,91.559853],[43.377621,91.562492],[43.380009,91.581299],[43.381809,91.596481],[43.382011,91.597931],[43.382099,91.598396],[43.382301,91.598907],[43.382561,91.601357],[43.382629,91.602577],[43.382641,91.604263],[43.382542,91.606644],[43.382259,91.609413],[43.381939,91.611397],[43.37965,91.621933],[43.378841,91.625473],[43.3764,91.634987],[43.37545,91.637947],[43.37505,91.639877],[43.374619,91.641647],[43.370998,91.655388],[43.37027,91.658417],[43.365871,91.675323],[43.365059,91.678452],[43.364731,91.67955],[43.363499,91.684471],[43.361439,91.692139],[43.359531,91.699547],[43.359241,91.701263],[43.359169,91.702637],[43.35928,91.703987],[43.359509,91.705276],[43.359982,91.707161],[43.36982,91.742973],[43.372631,91.753021],[43.37392,91.757812],[43.37442,91.759483],[43.375198,91.762428],[43.375401,91.763397],[43.375561,91.764717],[43.375599,91.765999],[43.375408,91.768929],[43.37521,91.770554],[43.374908,91.772171],[43.37463,91.773232],[43.374088,91.774811],[43.373291,91.776604],[43.364761,91.792717],[43.364399,91.793503],[43.363998,91.794601],[43.36359,91.796387],[43.36343,91.797989],[43.363441,91.799316],[43.363579,91.800652],[43.364021,91.802567],[43.366032,91.808868],[43.37429,91.834282],[43.375271,91.837433],[43.381149,91.855637],[43.382408,91.8592],[43.38306,91.861214],[43.393181,91.890991],[43.394131,91.893608],[43.404839,91.925247],[43.407921,91.934532],[43.408772,91.936867],[43.410931,91.943413],[43.411652,91.945847],[43.41333,91.951942],[43.41539,91.959442],[43.4156,91.960617],[43.415649,91.961197],[43.415649,91.961807],[43.415539,91.963013],[43.415421,91.963593],[43.41518,91.964447],[43.413719,91.968903],[43.408131,91.984978],[43.38829,92.04274],[43.38768,92.044403],[43.384071,92.055069],[43.383888,92.055931],[43.383739,92.062576],[43.383549,92.063652],[43.383751,92.077217],[43.383621,92.07988],[43.379551,92.111923],[43.3783,92.121323],[43.37817,92.12278],[43.378181,92.123451],[43.378139,92.123787],[43.37804,92.124077],[43.378078,92.124092],[43.377602,92.12693],[43.376678,92.134521],[43.37648,92.134933],[43.37635,92.13591],[43.376438,92.136101],[43.37492,92.146538],[43.3741,92.150238],[43.373829,92.150787],[43.373161,92.151619],[43.371979,92.152588],[43.371311,92.152802],[43.368759,92.1539],[43.343491,92.165489],[43.336319,92.16864],[43.33614,92.16864],[43.333519,92.169991],[43.322121,92.175133],[43.315922,92.177841],[43.315189,92.178223],[43.31448,92.17868],[43.31414,92.178963],[43.313519,92.179672],[43.31295,92.180489],[43.311031,92.183868],[43.309029,92.187683],[43.308578,92.188721],[43.308182,92.190086],[43.30558,92.201569],[43.305191,92.203537],[43.305031,92.204117],[43.304661,92.205032],[43.304211,92.205818],[43.303791,92.206337],[43.300419,92.209373],[43.29726,92.213799],[43.29509,92.219322],[43.293221,92.224327],[43.29282,92.225693],[43.29261,92.226868],[43.29121,92.236771],[43.290798,92.238876],[43.290199,92.241379],[43.290039,92.241692],[43.289768,92.243027],[43.289742,92.243393],[43.289631,92.243736],[43.289581,92.245827],[43.2896,92.249359],[43.28965,92.249733],[43.28944,92.251373],[43.28904,92.253258],[43.288872,92.253853],[43.288399,92.254959],[43.28759,92.2565],[43.286591,92.257843],[43.28548,92.259117],[43.266258,92.280243],[43.26268,92.284241],[43.258411,92.288857],[43.257809,92.289658],[43.25742,92.290321],[43.256969,92.29129],[43.256691,92.292053],[43.256378,92.293137],[43.2561,92.294647],[43.25592,92.296593],[43.255692,92.301987],[43.255619,92.306412],[43.255081,92.324226],[43.254978,92.326187],[43.254929,92.3265],[43.25465,92.327293],[43.25452,92.328056],[43.254539,92.331291],[43.254822,92.3321],[43.25502,92.332977],[43.25502,92.33429],[43.255081,92.334824],[43.255112,92.336983],[43.25491,92.351593],[43.25494,92.351967],[43.255192,92.352547],[43.255161,92.358383],[43.255341,92.369583],[43.255348,92.373428],[43.25544,92.37973],[43.255489,92.381088],[43.25544,92.38237],[43.255562,92.386459],[43.255569,92.38871],[43.255501,92.3909],[43.255562,92.41449],[43.255508,92.41684],[43.25544,92.417953],[43.255112,92.442863],[43.255032,92.44442],[43.254902,92.451012],[43.254879,92.455528],[43.254799,92.458504],[43.254829,92.460274],[43.254902,92.460899],[43.255131,92.46122],[43.255089,92.468697],[43.25489,92.477119],[43.254978,92.48597],[43.25494,92.488167],[43.25486,92.489609],[43.254711,92.507919],[43.25457,92.517036],[43.254532,92.517326],[43.254589,92.518883],[43.25581,92.530167],[43.25584,92.53196],[43.25576,92.533012],[43.255421,92.53582],[43.253208,92.549698],[43.252701,92.552528],[43.252499,92.553307],[43.251751,92.555443],[43.250801,92.557281],[43.250229,92.55851],[43.243992,92.570717],[43.242409,92.573624],[43.242149,92.574242],[43.236401,92.585487],[43.230221,92.597183],[43.22961,92.598503],[43.228851,92.599838],[43.2285,92.600647],[43.227299,92.602959],[43.22636,92.604622],[43.225151,92.607018],[43.222401,92.612137],[43.221802,92.61338],[43.219791,92.61718],[43.218559,92.61972],[43.2174,92.62175],[43.216888,92.622757],[43.2164,92.624069],[43.214039,92.628708],[43.213139,92.630333],[43.2122,92.632301],[43.212051,92.632523],[43.211658,92.63279],[43.210991,92.632889],[43.21035,92.633072],[43.210129,92.633209],[43.20993,92.633461],[43.207069,92.639236],[43.206989,92.639481],[43.205688,92.641998],[43.20525,92.64299],[43.204369,92.644783],[43.20388,92.645653],[43.19825,92.65416],[43.197201,92.655479],[43.196789,92.656464],[43.196609,92.657181],[43.19635,92.6577],[43.196079,92.65802],[43.190941,92.662827],[43.190338,92.663452],[43.188599,92.665031],[43.186859,92.666748],[43.185692,92.668007],[43.184761,92.669159],[43.183418,92.670967],[43.180092,92.676376],[43.172909,92.687592],[43.17234,92.688583],[43.169239,92.693604],[43.168331,92.695328],[43.167881,92.696358],[43.167221,92.698227],[43.166851,92.6996],[43.165169,92.706772],[43.16357,92.714363],[43.163559,92.714729],[43.161999,92.72184],[43.16135,92.722961],[43.15799,92.729736],[43.156681,92.732277],[43.155411,92.734993],[43.154388,92.737671],[43.153999,92.739197],[43.15382,92.740334],[43.153301,92.742409],[43.152962,92.744377],[43.15284,92.745354],[43.152012,92.750618],[43.151588,92.752319],[43.15163,92.752579],[43.151291,92.753853],[43.150669,92.755867],[43.150249,92.757011],[43.14949,92.75869],[43.14801,92.761574],[43.14732,92.762558],[43.145931,92.7649],[43.144001,92.767769],[43.1413,92.771973],[43.139622,92.77475],[43.138191,92.777542],[43.13784,92.778351],[43.136761,92.78141],[43.133678,92.791237],[43.133209,92.792923],[43.132771,92.79425],[43.132648,92.794487],[43.13208,92.796402],[43.130611,92.801697],[43.130001,92.804459],[43.129471,92.807159],[43.12764,92.815422],[43.12764,92.815628],[43.127708,92.816093],[43.128059,92.817108],[43.12809,92.817642],[43.127239,92.822151],[43.124889,92.833717],[43.12468,92.834572],[43.124001,92.836807],[43.123409,92.83847],[43.121769,92.843559],[43.117249,92.856644],[43.116928,92.857742],[43.097961,92.913582],[43.09219,92.930397],[43.091251,92.932861],[43.089909,92.936729],[43.08939,92.938499],[43.088219,92.941933],[43.085678,92.949699],[43.08448,92.953049],[43.084339,92.95372],[43.083939,92.954758],[43.081841,92.961029],[43.081139,92.962883],[43.077202,92.974609],[43.073639,92.984818],[43.07309,92.986237],[43.072651,92.98764],[43.071579,92.990761],[43.070629,92.993958],[43.06773,93.002113],[43.06179,93.019722],[43.059059,93.027451],[43.05798,93.03083],[43.05611,93.036209],[43.055599,93.037857],[43.054531,93.040833],[43.0536,93.043671],[43.050701,93.051971],[43.048828,93.05748],[43.04847,93.058357],[43.04398,93.071747],[43.04361,93.072983],[43.036949,93.0923],[43.030769,93.110497],[43.030392,93.111504],[43.02821,93.117996],[43.02644,93.122902],[43.02552,93.125717],[43.021511,93.137383],[43.020081,93.141777],[43.019531,93.143211],[43.018318,93.146812],[43.014252,93.158577],[43.012951,93.162216],[43.012581,93.163368],[43.012489,93.163933],[43.011021,93.167953],[43.01017,93.170631],[43.009911,93.171303],[42.956379,93.327377],[42.943939,93.363609],[42.93602,93.384903],[42.923698,93.417068],[42.914711,93.439667],[42.90744,93.457962],[42.906872,93.459129],[42.90659,93.460068],[42.90519,93.464157],[42.90258,93.470917],[42.902351,93.471611],[42.90118,93.474586],[42.89896,93.47998],[42.897121,93.484833],[42.895458,93.488991],[42.89336,93.494431],[42.892899,93.495789],[42.892529,93.496559],[42.88739,93.512894],[42.887272,93.517189],[42.888271,93.531914],[42.862091,93.564423],[42.861511,93.564209],[42.861229,93.564102],[42.86145,93.564613],[42.861591,93.565399],[42.861431,93.566383],[42.86108,93.567436],[42.860889,93.568802],[42.860519,93.574074],[42.860298,93.582787],[42.859718,93.588753],[42.859089,93.594093],[42.858608,93.596024],[42.858109,93.597328],[42.85775,93.598083],[42.844662,93.621597],[42.833488,93.641823],[42.828079,93.651497],[42.825699,93.655746],[42.824928,93.657333],[42.82415,93.659142],[42.823341,93.661308],[42.82259,93.663757],[42.821941,93.666389],[42.821411,93.669212],[42.82106,93.672157],[42.820869,93.675217],[42.820148,93.715927],[42.819351,93.749474],[42.819149,93.751984],[42.81884,93.754433],[42.81839,93.756721],[42.817348,93.760773],[42.816341,93.763344],[42.815842,93.763969],[42.81535,93.764908],[42.814701,93.766747],[42.812519,93.771149],[42.812069,93.772324],[42.811932,93.773102],[42.727871,93.941811],[42.721931,93.953537],[42.720589,93.955933],[42.719109,93.958252],[42.717548,93.960472],[42.699131,93.982513],[42.699059,93.983383],[42.698891,93.983681],[42.698071,93.984612],[42.696949,93.986053],[42.695301,93.987839],[42.69413,93.989487],[42.69381,93.99012],[42.69331,93.990646],[42.692101,93.991898],[42.69136,93.992996],[42.69014,93.994179],[42.687519,93.99733],[42.687038,93.997597],[42.686771,93.99736],[42.686432,93.997581],[42.65414,94.036118],[42.646832,94.044739],[42.645691,94.045403],[42.644489,94.046288],[42.644058,94.046982],[42.643921,94.047897],[42.64352,94.048683],[42.615822,94.081642],[42.615479,94.082474],[42.61515,94.083054],[42.61348,94.085068],[42.613319,94.085991],[42.612419,94.087349],[42.611771,94.087723],[42.610729,94.087997],[42.610352,94.088097],[42.5938,94.107742],[42.591869,94.110123],[42.591282,94.110817],[42.576759,94.127983],[42.57444,94.130577],[42.574371,94.130829],[42.55592,94.152588],[42.5546,94.153893],[42.552959,94.1549],[42.55114,94.155441],[42.549179,94.155487],[42.511021,94.154877],[42.50568,94.154716],[42.48864,94.154488],[42.479259,94.154243],[42.455231,94.153893],[42.45348,94.15358],[42.452808,94.153816],[42.416431,94.153236],[42.404751,94.152946],[42.390621,94.152786],[42.387569,94.152687],[42.38446,94.152702],[42.37709,94.15255],[42.375671,94.152588],[42.374401,94.152344],[42.37154,94.150558],[42.36993,94.14994],[42.368191,94.150368],[42.36639,94.151428],[42.364391,94.152222],[42.36224,94.152328],[42.34985,94.15213],[42.347618,94.152443],[42.345421,94.153099],[42.343281,94.154137],[42.341251,94.155533],[42.33934,94.15728],[42.33762,94.159363],[42.323891,94.17894],[42.299648,94.213142],[42.29924,94.213348],[42.29882,94.213783],[42.292431,94.222908],[42.292061,94.223824],[42.291611,94.224564],[42.26054,94.268501],[42.259979,94.269096],[42.258591,94.268639],[42.25832,94.269371],[42.258259,94.271477],[42.25798,94.272148],[42.221859,94.32328],[42.21785,94.328712],[42.201809,94.351463],[42.186401,94.3731],[42.18565,94.374268],[42.182468,94.378754],[42.17992,94.382103],[42.07518,94.501556],[42.07399,94.503014],[42.071751,94.506172],[42.070728,94.507843],[42.069248,94.510452],[42.05822,94.531387],[42.05555,94.536324],[42.034328,94.57663],[42.028992,94.586594],[42.01165,94.619476],[42.006409,94.629227],[42.002441,94.636864],[41.996479,94.647957],[41.97168,94.694656],[41.970669,94.696457],[41.96846,94.699707],[41.964611,94.704811],[41.961651,94.708549],[41.953011,94.719757],[41.951698,94.721367],[41.93182,94.747139],[41.928169,94.751717],[41.92601,94.754211],[41.917702,94.764259],[41.907219,94.776627],[41.906189,94.778198],[41.905659,94.779518],[41.90535,94.780724],[41.905182,94.781952],[41.905979,94.819061],[41.905891,94.82193],[41.904789,94.824211],[41.896778,94.833511],[41.889599,94.842018],[41.88821,94.843773],[41.886959,94.845734],[41.885899,94.847763],[41.872711,94.87912],[41.87204,94.881699],[41.871601,94.88427],[41.87085,94.886482],[41.86935,94.887657],[41.86618,94.889374],[41.864529,94.890427],[41.854229,94.897636],[41.853321,94.898354],[41.850658,94.900124],[41.845459,94.90377],[41.843231,94.905518],[41.84193,94.906731],[41.834141,94.91481],[41.83263,94.916656],[41.831348,94.918793],[41.830341,94.921066],[41.822659,94.947006],[41.822681,94.946938],[41.821529,94.950897],[41.811859,94.981277],[41.811451,94.982964],[41.811062,94.987167],[41.80801,95.009956],[41.807579,95.012787],[41.803242,95.035828],[41.80278,95.037987],[41.801811,95.039459],[41.800449,95.040283],[41.79937,95.041672],[41.798981,95.043709],[41.798931,95.046043],[41.79929,95.048683],[41.801491,95.056557],[41.807201,95.081543],[41.807819,95.084007],[41.808601,95.086418],[41.81176,95.094139],[41.812141,95.095657],[41.813389,95.102814],[41.81377,95.104523],[41.813801,95.106232],[41.81308,95.107803],[41.805882,95.116547],[41.79686,95.127617],[41.795639,95.128998],[41.795818,95.128799],[41.795311,95.129143],[41.795021,95.12973],[41.794418,95.130508],[41.793739,95.131241],[41.792912,95.131813],[41.791931,95.132187],[41.787621,95.133377],[41.785759,95.134048],[41.783821,95.13443],[41.77948,95.133087],[41.777401,95.133003],[41.769032,95.136383],[41.767269,95.13694],[41.761452,95.13842],[41.759869,95.138908],[41.758209,95.139793],[41.725281,95.170288],[41.716209,95.178574],[41.713089,95.181328],[41.7062,95.186333],[41.70443,95.187531],[41.702549,95.188553],[41.69426,95.191917],[41.69257,95.192741],[41.69117,95.193787],[41.690331,95.194557],[41.685749,95.199341],[41.67609,95.209084],[41.674431,95.210327],[41.67263,95.21125],[41.670658,95.211891],[41.66626,95.213074],[41.664299,95.214027],[41.662991,95.215828],[41.660839,95.219803],[41.65979,95.221008],[41.65844,95.221863],[41.648361,95.225349],[41.646259,95.226189],[41.644218,95.227188],[41.608528,95.247704],[41.60677,95.248993],[41.605129,95.250458],[41.603642,95.25209],[41.55867,95.303436],[41.557178,95.304878],[41.55547,95.306084],[41.5536,95.306976],[41.537659,95.313148],[41.521111,95.319687],[41.503269,95.326576],[41.499722,95.327744],[41.486279,95.331001],[41.483829,95.33149],[41.48151,95.331749],[41.418961,95.336037],[41.41769,95.336189],[41.34993,95.340813],[41.348049,95.341026],[41.346149,95.341423],[41.309109,95.351532],[41.299801,95.353996],[41.295872,95.355118],[41.286308,95.357643],[41.27911,95.359596],[41.267288,95.36293],[41.239849,95.370354],[41.235882,95.371529],[41.23431,95.371887],[41.230549,95.372963],[41.227638,95.37355],[41.210209,95.375168],[41.1908,95.376801],[41.1786,95.377998],[41.171768,95.378571],[41.170151,95.37912],[41.145889,95.396797],[41.144199,95.398277],[41.142658,95.39991],[41.14127,95.401672],[41.125759,95.42276],[41.12434,95.424553],[41.122841,95.426117],[41.121288,95.427467],[41.112598,95.434418],[41.11095,95.435333],[41.107349,95.436142],[41.10556,95.436951],[41.09116,95.448433],[41.089539,95.449463],[41.084831,95.452087],[41.083542,95.45327],[41.082561,95.454788],[41.078522,95.461853],[41.077301,95.463303],[41.075081,95.464668],[41.07473,95.464867],[41.073681,95.465584],[41.072338,95.466461],[41.06773,95.469482],[41.06414,95.472038],[41.061741,95.472977],[41.059601,95.473038],[41.05727,95.472641],[41.04948,95.469711],[41.047211,95.468109],[41.045151,95.467041],[41.043018,95.467041],[41.04055,95.467773],[41.037159,95.469513],[41.035561,95.469711],[41.033291,95.469711],[41.030491,95.469437],[41.028629,95.469437],[41.024899,95.470383],[41.021969,95.470909],[41.020901,95.470711],[41.019501,95.469383],[41.01804,95.468109],[41.015301,95.466637],[41.013241,95.466309],[41.008911,95.465981],[41.00671,95.466309],[41.004841,95.467308],[41.003052,95.468842],[41.000679,95.471848],[40.997429,95.475533],[40.993698,95.478722],[40.941299,95.523643],[40.882931,95.57193],[40.860771,95.59272],[40.852169,95.60096],[40.85096,95.601868],[40.849178,95.602623],[40.84457,95.604057],[40.84127,95.604858],[40.835602,95.606003],[40.832191,95.606857],[40.827271,95.608528],[40.824211,95.60997],[40.818081,95.613297],[40.815659,95.614197],[40.794498,95.620667],[40.79213,95.62159],[40.790161,95.622757],[40.739639,95.653053],[40.683159,95.68631],[40.560768,95.758293],[40.559139,95.75927],[40.557941,95.760551],[40.55727,95.761803],[40.556862,95.763359],[40.55566,95.769852],[40.55521,95.773392],[40.550732,95.791092],[40.5439,95.818512],[40.54306,95.821533],[40.543018,95.821587],[40.540649,95.831047],[40.53907,95.837341],[40.530319,95.872833],[40.529411,95.877419],[40.528881,95.881477],[40.528851,95.881737],[40.528599,95.886452],[40.528671,95.890549],[40.528831,95.892937],[40.529091,95.895401],[40.531139,95.913231],[40.531509,95.916992],[40.532009,95.922897],[40.532108,95.924156],[40.532829,95.935677],[40.533211,95.940323],[40.533291,95.941277],[40.533428,95.942421],[40.533798,95.945557],[40.534019,95.947113],[40.535252,95.954674],[40.53624,95.964233],[40.537189,95.976349],[40.539242,95.992767],[40.539989,96.005859],[40.54044,96.010193],[40.541,96.01384],[40.542919,96.026047],[40.543171,96.028214],[40.54752,96.070686],[40.54813,96.076599],[40.548721,96.084511],[40.549389,96.096077],[40.550598,96.11734],[40.55098,96.121567],[40.551849,96.128128],[40.556881,96.156647],[40.557098,96.158058],[40.557629,96.161926],[40.557949,96.165993],[40.55872,96.179993],[40.560951,96.199028],[40.563648,96.226624],[40.568291,96.274063],[40.56879,96.278961],[40.569698,96.285233],[40.57069,96.290207],[40.571339,96.292847],[40.57394,96.302109],[40.57439,96.30407],[40.574661,96.305313],[40.575359,96.308998],[40.57552,96.309914],[40.575581,96.310371],[40.575699,96.31115],[40.575871,96.312462],[40.576149,96.314682],[40.576519,96.319397],[40.576649,96.32518],[40.576401,96.338333],[40.57526,96.417137],[40.575562,96.426323],[40.576611,96.438957],[40.57682,96.443626],[40.576698,96.448219],[40.576618,96.451401],[40.576591,96.453537],[40.575729,96.465378],[40.575241,96.483818],[40.574841,96.488899],[40.573952,96.494553],[40.570702,96.510117],[40.569939,96.516006],[40.569469,96.522537],[40.569019,96.527107],[40.568401,96.531517],[40.567451,96.536507],[40.566219,96.54361],[40.565731,96.550591],[40.565731,96.553001],[40.566029,96.558853],[40.566509,96.568413],[40.566341,96.575249],[40.565929,96.582329],[40.565948,96.586288],[40.5662,96.590271],[40.566681,96.594307],[40.56736,96.599838],[40.567348,96.608368],[40.56723,96.61602],[40.567322,96.618179],[40.56736,96.618927],[40.56749,96.620659],[40.56765,96.622299],[40.5686,96.630157],[40.568958,96.634697],[40.571991,96.703812],[40.572929,96.710403],[40.575539,96.721573],[40.576149,96.725319],[40.576641,96.731293],[40.576611,96.736549],[40.576099,96.742088],[40.574718,96.750931],[40.574219,96.758362],[40.57423,96.758377],[40.574219,96.758362],[40.574409,96.762466],[40.575451,96.787216],[40.575531,96.792084],[40.5755,96.794434],[40.57523,96.799507],[40.574692,96.804893],[40.574379,96.807129],[40.570881,96.826408],[40.56163,96.876579],[40.559639,96.891777],[40.558578,96.896599],[40.558071,96.89843],[40.556839,96.9021],[40.555069,96.906273],[40.55328,96.909668],[40.540058,96.932861],[40.537289,96.936836],[40.536251,96.938164],[40.53344,96.941261],[40.530682,96.943817],[40.528179,96.94577],[40.5242,96.948303],[40.504028,96.959183],[40.497231,96.96241],[40.477169,96.971222],[40.476452,96.97155],[40.47179,96.973953],[40.467999,96.976357],[40.460899,96.981567],[40.451939,96.988083],[40.448231,96.990463],[40.44437,96.99221],[40.433559,96.996193],[40.428959,96.998672],[40.425781,97.000961],[40.424198,97.002312],[40.406921,97.019852],[40.404881,97.021606],[40.402088,97.023651],[40.40044,97.024658],[40.396702,97.026466],[40.391609,97.028053],[40.38802,97.028587],[40.381908,97.028717],[40.378609,97.02903],[40.375011,97.029701],[40.372089,97.03054],[40.359791,97.034866],[40.35503,97.03727],[40.35025,97.040588],[40.345829,97.044617],[40.341431,97.049957],[40.333191,97.061417],[40.330521,97.06485],[40.327141,97.068367],[40.323559,97.071114],[40.317268,97.075447],[40.31308,97.077667],[40.30891,97.079277],[40.305,97.080132],[40.30098,97.080467],[40.2971,97.080467],[40.293091,97.080917],[40.288311,97.082108],[40.26688,97.089203],[40.261761,97.091362],[40.257099,97.094933],[40.254799,97.097038],[40.237301,97.113998],[40.235271,97.116211],[40.232948,97.119034],[40.22443,97.130653],[40.220871,97.135269],[40.219921,97.136414],[40.217701,97.138802],[40.205471,97.150963],[40.202042,97.154533],[40.200539,97.156303],[40.198158,97.159508],[40.19643,97.162216],[40.194881,97.164932],[40.189041,97.176514],[40.188332,97.177803],[40.186069,97.181587],[40.185371,97.182716],[40.18232,97.18705],[40.175079,97.196701],[40.172459,97.200439],[40.17054,97.203568],[40.164322,97.214851],[40.157082,97.225838],[40.156799,97.226334],[40.155731,97.228149],[40.154251,97.23082],[40.154121,97.231056],[40.153229,97.232811],[40.151112,97.237022],[40.151009,97.237213],[40.150982,97.237267],[40.15041,97.238358],[40.148998,97.240868],[40.148609,97.241547],[40.146091,97.245667],[40.13966,97.255379],[40.138168,97.257477],[40.134159,97.262863],[40.132679,97.264732],[40.132481,97.264969],[40.131519,97.266159],[40.130619,97.26725],[40.125278,97.273499],[40.12468,97.274246],[40.124599,97.274353],[40.12376,97.275459],[40.123138,97.276314],[40.12138,97.278954],[40.11932,97.282463],[40.11787,97.285347],[40.11655,97.2883],[40.11364,97.29567],[40.112259,97.298973],[40.11026,97.303169],[40.108639,97.30616],[40.105339,97.311546],[40.103359,97.314743],[40.102581,97.315987],[40.0993,97.32074],[40.09594,97.324959],[40.0928,97.328407],[40.06662,97.353867],[40.065639,97.354958],[40.064789,97.355988],[40.063549,97.357536],[40.061871,97.359947],[40.06131,97.360832],[40.05941,97.364128],[40.058689,97.36557],[40.057331,97.368607],[40.05637,97.371147],[40.055241,97.374786],[40.05481,97.376282],[40.053959,97.380447],[40.05278,97.388863],[40.05191,97.393333],[40.050781,97.397476],[40.049431,97.401314],[40.047131,97.406311],[40.045422,97.409241],[40.042198,97.414253],[40.040081,97.417473],[40.037971,97.421021],[40.036121,97.424217],[40.034519,97.427292],[40.034119,97.428253],[40.03228,97.431709],[40.032021,97.43222],[40.029869,97.437187],[40.028511,97.441032],[40.025341,97.452019],[40.024109,97.455811],[40.023418,97.457764],[40.022968,97.458961],[40.02103,97.463692],[40.02071,97.464432],[40.013981,97.47892],[40.0061,97.496628],[40.00304,97.503929],[40.000721,97.509857],[39.995461,97.523727],[39.993599,97.52903],[39.990631,97.53772],[39.989929,97.539772],[39.98962,97.540733],[39.98864,97.543823],[39.988411,97.544548],[39.986259,97.552422],[39.98164,97.571747],[39.97945,97.579453],[39.979401,97.57962],[39.979351,97.579788],[39.979118,97.580513],[39.97887,97.581322],[39.976971,97.587341],[39.97562,97.59185],[39.974819,97.594749],[39.96983,97.615303],[39.96867,97.621437],[39.967949,97.626289],[39.96727,97.630531],[39.967091,97.631401],[39.96701,97.631737],[39.966751,97.63295],[39.966461,97.634132],[39.965889,97.6362],[39.964611,97.64003],[39.96413,97.641243],[39.96328,97.643227],[39.961391,97.647102],[39.95739,97.655563],[39.956459,97.657761],[39.952839,97.667587],[39.951511,97.671204],[39.950329,97.673973],[39.94931,97.676064],[39.948441,97.677696],[39.947762,97.678322],[39.947701,97.679047],[39.945889,97.682449],[39.945339,97.683403],[39.942699,97.687782],[39.940701,97.691788],[39.940109,97.693176],[39.93856,97.697433],[39.937222,97.702263],[39.93539,97.708588],[39.93507,97.709503],[39.933929,97.712547],[39.931839,97.717484],[39.92952,97.723167],[39.926521,97.73188],[39.922089,97.748093],[39.920631,97.752792],[39.920231,97.753883],[39.918991,97.757027],[39.916229,97.762711],[39.9146,97.765404],[39.905449,97.779282],[39.90078,97.786346],[39.90041,97.786903],[39.900028,97.787529],[39.899231,97.788834],[39.897919,97.791153],[39.897499,97.791946],[39.896629,97.793671],[39.896309,97.794373],[39.896091,97.794868],[39.894321,97.799217],[39.891281,97.808968],[39.889759,97.813011],[39.88876,97.81517],[39.886631,97.819153],[39.883789,97.823463],[39.883369,97.824059],[39.879879,97.829247],[39.87809,97.832474],[39.876228,97.836693],[39.875481,97.838623],[39.875309,97.839104],[39.874962,97.840103],[39.874771,97.840714],[39.874722,97.840858],[39.874321,97.842209],[39.87315,97.847214],[39.872742,97.849541],[39.872719,97.849663],[39.871429,97.857353],[39.870522,97.862541],[39.87038,97.863327],[39.869308,97.869034],[39.86927,97.869331],[39.868679,97.872292],[39.868259,97.874458],[39.868149,97.875038],[39.867668,97.877579],[39.867458,97.878647],[39.867161,97.880318],[39.86507,97.893143],[39.864841,97.894348],[39.86422,97.897163],[39.863911,97.898407],[39.863331,97.900642],[39.862461,97.903877],[39.861549,97.907227],[39.860451,97.910782],[39.859531,97.913383],[39.859241,97.914131],[39.85743,97.918419],[39.854691,97.92511],[39.85107,97.93644],[39.84874,97.942169],[39.842659,97.954224],[39.840599,97.958992],[39.839581,97.961853],[39.839069,97.963516],[39.838879,97.964233],[39.8386,97.965218],[39.838329,97.966293],[39.837719,97.969017],[39.83675,97.975533],[39.836411,97.980408],[39.835941,97.993233],[39.835751,97.995903],[39.835651,97.996964],[39.835098,98.001427],[39.83408,98.007278],[39.831661,98.019257],[39.830971,98.021942],[39.830681,98.022926],[39.830608,98.023193],[39.829281,98.027473],[39.827961,98.031921],[39.82518,98.042007],[39.825031,98.042557],[39.824108,98.045792],[39.823841,98.046638],[39.823441,98.047951],[39.82259,98.050499],[39.821659,98.053322],[39.821201,98.054817],[39.821121,98.055061],[39.8181,98.065804],[39.81255,98.082474],[39.808788,98.093147],[39.802261,98.115982],[39.801849,98.117073],[39.80143,98.118294],[39.800541,98.119141],[39.79985,98.119301],[39.799099,98.119057],[39.79842,98.118523],[39.796982,98.117729],[39.797039,98.118134],[39.79652,98.124336],[39.795589,98.126411],[39.795639,98.127251],[39.79586,98.127724],[39.796619,98.128571],[39.797409,98.129433],[39.798111,98.130386],[39.798328,98.130989],[39.798359,98.131729],[39.798031,98.133743],[39.79755,98.134857],[39.797009,98.135643],[39.796982,98.135674],[39.795631,98.137154],[39.793541,98.139603],[39.792252,98.141647],[39.791519,98.143112],[39.790741,98.145149],[39.79002,98.147614],[39.78804,98.154617],[39.780701,98.180634],[39.780441,98.182091],[39.780369,98.184196],[39.780418,98.184914],[39.78051,98.18557],[39.780621,98.186218],[39.780739,98.186783],[39.780972,98.187592],[39.781261,98.188377],[39.78223,98.190567],[39.783298,98.192757],[39.78352,98.193237],[39.784309,98.195053],[39.784859,98.196823],[39.785831,98.202904],[39.786282,98.204277],[39.78849,98.208946],[39.789669,98.211243],[39.790169,98.212196],[39.790649,98.213097],[39.795959,98.22258],[39.796169,98.223091],[39.79623,98.223351],[39.796291,98.223663],[39.79631,98.224037],[39.79631,98.224358],[39.796169,98.225693],[39.796021,98.227623],[39.795841,98.230141],[39.795841,98.23053],[39.79583,98.230713],[39.79578,98.231667],[39.795582,98.233299],[39.795071,98.242218],[39.794651,98.248848],[39.794151,98.250504],[39.79324,98.256889],[39.791481,98.268311],[39.788021,98.290779],[39.787079,98.297058],[39.786751,98.299362],[39.786461,98.301552],[39.786091,98.303917],[39.78603,98.304298],[39.785851,98.305321],[39.785561,98.306793],[39.785389,98.307648],[39.785061,98.309273],[39.784409,98.312523],[39.783039,98.321411],[39.782021,98.326538],[39.78178,98.327927],[39.78056,98.335876],[39.780079,98.339653],[39.779881,98.340431],[39.77956,98.34304],[39.77919,98.345444],[39.779011,98.347023],[39.778999,98.347427],[39.778149,98.352997],[39.777851,98.354439],[39.777699,98.356102],[39.776501,98.364517],[39.77597,98.367798],[39.77401,98.378723],[39.773579,98.380791],[39.770519,98.391006],[39.769279,98.395576],[39.76878,98.397713],[39.768452,98.39946],[39.767502,98.403862],[39.766529,98.408043],[39.765881,98.410362],[39.765621,98.41169],[39.76543,98.413017],[39.765171,98.415977],[39.76498,98.417648],[39.764271,98.422722],[39.764061,98.424698],[39.763851,98.427673],[39.763199,98.432503],[39.76268,98.440178],[39.76162,98.446182],[39.76141,98.447723],[39.761269,98.451622],[39.761139,98.452782],[39.760559,98.456367],[39.760319,98.458473],[39.76017,98.463516],[39.760139,98.469017],[39.759861,98.482643],[39.759819,98.487099],[39.759769,98.487679],[39.759571,98.488739],[39.7593,98.489487],[39.75909,98.489853],[39.75882,98.490143],[39.752739,98.493233],[39.752029,98.493523],[39.748878,98.495064],[39.738289,98.500366],[39.737671,98.500641],[39.736931,98.500282],[39.736752,98.500252],[39.73658,98.500671],[39.73679,98.50193],[39.736031,98.507088],[39.736031,98.507393],[39.735859,98.508347],[39.735641,98.50882],[39.7356,98.509163],[39.735699,98.509377],[39.735691,98.509933],[39.734879,98.515533],[39.734459,98.517387],[39.73423,98.518143],[39.73349,98.519363],[39.731339,98.522148],[39.7281,98.52726],[39.726971,98.529518],[39.72406,98.536087],[39.723068,98.540077],[39.71999,98.550377],[39.716782,98.56115],[39.71537,98.565041],[39.714031,98.566704],[39.713058,98.567459],[39.712219,98.569153],[39.71146,98.570107],[39.710419,98.571487],[39.70673,98.576279],[39.702721,98.58242],[39.69894,98.586761],[39.697819,98.588203],[39.684139,98.604286],[39.683121,98.605476],[39.68119,98.608124],[39.64846,98.658203],[39.644569,98.662773],[39.643269,98.664513],[39.643261,98.664833],[39.640518,98.667847],[39.607601,98.703133],[39.603149,98.708679],[39.601139,98.711227],[39.600971,98.711632],[39.59441,98.719849],[39.593201,98.721451],[39.59219,98.723343],[39.58913,98.733551],[39.587379,98.740196],[39.585281,98.747566],[39.586021,98.747627],[39.58485,98.749229],[39.582649,98.756844],[39.5784,98.772346],[39.576038,98.780312],[39.576111,98.780357],[39.574329,98.787033],[39.571388,98.82679],[39.571251,98.831139],[39.571301,98.872383],[39.571121,98.874039],[39.566021,98.892883],[39.565189,98.89576],[39.564991,98.895973],[39.562901,98.903687],[39.562199,98.905434],[39.561409,98.907211],[39.55806,98.91468],[39.55444,98.923119],[39.551739,98.928078],[39.550549,98.929718],[39.549809,98.930473],[39.543041,98.936996],[39.538151,98.939117],[39.5303,98.942497],[39.52425,98.944443],[39.522961,98.944969],[39.503269,98.959221],[39.49918,98.962677],[39.491112,98.96904],[39.488869,98.970703],[39.48769,98.971458],[39.474831,98.977982],[39.465591,98.982658],[39.464249,98.982803],[39.463219,98.98259],[39.44043,98.976547],[39.435268,98.975197],[39.430759,98.975433],[39.425461,98.975754],[39.419109,98.976158],[39.41626,98.976799],[39.41169,98.978249],[39.4104,98.978859],[39.409111,98.979713],[39.4021,98.985313],[39.380379,99.001549],[39.378712,99.00293],[39.372959,99.013206],[39.37006,99.019577],[39.368221,99.028664],[39.36755,99.030533],[39.365459,99.035042],[39.364899,99.036003],[39.363689,99.03862],[39.363079,99.040916],[39.363289,99.041077],[39.36293,99.042053],[39.363091,99.042236],[39.361801,99.045723],[39.359161,99.054321],[39.357269,99.060623],[39.356419,99.063431],[39.355801,99.069542],[39.35556,99.072449],[39.35223,99.082733],[39.35083,99.087013],[39.350349,99.089203],[39.349941,99.091743],[39.34956,99.092812],[39.348621,99.093613],[39.34539,99.09465],[39.344879,99.094971],[39.34433,99.095482],[39.343491,99.09729],[39.341419,99.103348],[39.341179,99.104057],[39.34127,99.104378],[39.340809,99.105591],[39.340618,99.106758],[39.34029,99.111366],[39.339458,99.122627],[39.339291,99.125473],[39.339031,99.125504],[39.339062,99.128487],[39.338871,99.13018],[39.33667,99.143822],[39.336281,99.145317],[39.32988,99.160294],[39.322922,99.176064],[39.321411,99.179459],[39.320782,99.180527],[39.318958,99.183006],[39.318039,99.184242],[39.317589,99.185204],[39.317451,99.185966],[39.317371,99.193848],[39.317188,99.195152],[39.31657,99.19735],[39.316299,99.198288],[39.315861,99.19986],[39.308239,99.227097],[39.296791,99.268066],[39.28944,99.29332],[39.28841,99.296143],[39.28421,99.303787],[39.280941,99.309776],[39.279888,99.311493],[39.275028,99.316841],[39.27433,99.318031],[39.272221,99.323334],[39.268768,99.333458],[39.26857,99.333878],[39.267639,99.335373],[39.26635,99.336998],[39.257931,99.347504],[39.257141,99.34848],[39.255829,99.350327],[39.254318,99.353149],[39.253361,99.35553],[39.23188,99.428017],[39.229439,99.436272],[39.22887,99.43763],[39.22739,99.439957],[39.227379,99.439842],[39.227371,99.440033],[39.224831,99.45179],[39.224781,99.453484],[39.22506,99.455002],[39.226871,99.460564],[39.2272,99.461502],[39.23122,99.469063],[39.232792,99.472069],[39.235748,99.478867],[39.235939,99.479828],[39.236271,99.48394],[39.236511,99.485748],[39.236938,99.48687],[39.237652,99.487846],[39.238331,99.488426],[39.238541,99.488548],[39.243401,99.489937],[39.24633,99.490753],[39.248489,99.491364],[39.249229,99.491653],[39.250969,99.492699],[39.25309,99.494164],[39.25983,99.497643],[39.261341,99.498772],[39.26313,99.498993],[39.263592,99.499229],[39.263969,99.499763],[39.264339,99.502136],[39.264141,99.505539],[39.26405,99.506943],[39.263851,99.509521],[39.263149,99.512421],[39.263081,99.513512],[39.26321,99.529457],[39.26326,99.543068],[39.265942,99.56086],[39.26627,99.562759],[39.266659,99.563828],[39.273312,99.579262],[39.276791,99.585587],[39.278049,99.588112],[39.27961,99.591179],[39.281841,99.596123],[39.28392,99.60022],[39.284031,99.600441],[39.284969,99.602753],[39.28653,99.607536],[39.292389,99.616859],[39.295189,99.621613],[39.296101,99.62326],[39.298328,99.627823],[39.3046,99.639008],[39.306141,99.642014],[39.30703,99.6437],[39.308552,99.646027],[39.309608,99.647614],[39.310169,99.648857],[39.311272,99.651543],[39.311722,99.653023],[39.314941,99.665878],[39.317089,99.671997],[39.325272,99.695152],[39.32645,99.698471],[39.329399,99.706573],[39.33012,99.709038],[39.330921,99.713821],[39.331009,99.715332],[39.330898,99.717041],[39.330791,99.718712],[39.330509,99.720238],[39.32444,99.733963],[39.321629,99.743492],[39.321362,99.745087],[39.32066,99.749489],[39.320358,99.750679],[39.319859,99.75238],[39.318211,99.756866],[39.315269,99.763817],[39.314651,99.765297],[39.3125,99.77124],[39.31179,99.773804],[39.307232,99.798157],[39.30724,99.798363],[39.30624,99.802261],[39.30579,99.803619],[39.304039,99.806503],[39.303089,99.808601],[39.301231,99.813339],[39.29937,99.818626],[39.29678,99.824249],[39.296059,99.825783],[39.293911,99.835258],[39.292961,99.837967],[39.29208,99.841263],[39.290489,99.84359],[39.289532,99.846039],[39.289379,99.847412],[39.289509,99.847923],[39.28949,99.851601],[39.289471,99.851898],[39.289619,99.854874],[39.289989,99.858093],[39.29121,99.868439],[39.29097,99.882759],[39.290371,99.885643],[39.289841,99.887009],[39.287552,99.891113],[39.286179,99.893799],[39.280209,99.907257],[39.279621,99.90831],[39.278042,99.910347],[39.275551,99.913368],[39.26358,99.931847],[39.247608,99.94902],[39.23772,99.959663],[39.233768,99.964027],[39.23381,99.964043],[39.232891,99.964813],[39.231831,99.965424],[39.229019,99.966759],[39.225101,99.967987],[39.223831,99.968613],[39.22287,99.969307],[39.221859,99.970322],[39.219028,99.973518],[39.217831,99.97477],[39.21484,99.977562],[39.21381,99.978691],[39.212311,99.981117],[39.211529,99.982117],[39.19817,99.993927],[39.19735,99.994827],[39.196949,99.995842],[39.196239,100.002251],[39.195889,100.00692],[39.19577,100.009262],[39.195641,100.010391],[39.19548,100.011673],[39.195061,100.01268],[39.193489,100.014412],[39.19268,100.015167],[39.192551,100.015137],[39.19252,100.01532],[39.19136,100.016487],[39.188541,100.019142],[39.18771,100.019958],[39.186081,100.02076],[39.182491,100.021347],[39.181751,100.021812],[39.181061,100.022751],[39.179779,100.025513],[39.17931,100.026199],[39.177872,100.028793],[39.177399,100.029953],[39.177029,100.031303],[39.176819,100.033096],[39.17691,100.037521],[39.176941,100.039017],[39.176842,100.043663],[39.175491,100.048759],[39.1749,100.050201],[39.174461,100.051987],[39.173759,100.055367],[39.172501,100.060173],[39.172588,100.060211],[39.172401,100.06073],[39.173038,100.069504],[39.17247,100.071899],[39.17226,100.073692],[39.17321,100.080002],[39.173149,100.081558],[39.173031,100.082077],[39.17268,100.083633],[39.172081,100.086273],[39.172218,100.086403],[39.171829,100.086838],[39.169621,100.091873],[39.1684,100.095497],[39.167149,100.098007],[39.16608,100.099167],[39.164761,100.100052],[39.16383,100.100693],[39.161388,100.10215],[39.16087,100.102692],[39.160172,100.103897],[39.157539,100.112488],[39.156929,100.113617],[39.156281,100.11451],[39.154079,100.11734],[39.153561,100.118408],[39.15316,100.119682],[39.15292,100.122673],[39.153061,100.123978],[39.154091,100.125526],[39.15649,100.128166],[39.157162,100.129143],[39.157452,100.130127],[39.156582,100.138634],[39.15657,100.138817],[39.156021,100.142693],[39.15493,100.14962],[39.15379,100.154404],[39.152962,100.157829],[39.151051,100.167427],[39.150871,100.167763],[39.147491,100.171143],[39.14727,100.171333],[39.14608,100.172897],[39.145721,100.173111],[39.143879,100.175812],[39.139511,100.181587],[39.138802,100.182419],[39.136372,100.184402],[39.135288,100.185448],[39.131851,100.192169],[39.131569,100.193153],[39.131149,100.197807],[39.130459,100.201263],[39.130039,100.202682],[39.127258,100.208557],[39.125149,100.213287],[39.121849,100.219254],[39.12056,100.221153],[39.117352,100.224907],[39.1129,100.232071],[39.112129,100.233353],[39.111488,100.234528],[39.110161,100.238693],[39.108261,100.24482],[39.106621,100.253532],[39.10601,100.255219],[39.099529,100.265472],[39.097809,100.267929],[39.09132,100.274979],[39.08886,100.278084],[39.08638,100.282143],[39.085449,100.283142],[39.083241,100.285378],[39.08152,100.287308],[39.079159,100.29039],[39.07848,100.290787],[39.077999,100.291763],[39.07642,100.293739],[39.074471,100.296593],[39.072319,100.299248],[39.07132,100.300247],[39.06966,100.301903],[39.057961,100.314529],[39.05022,100.322197],[39.04755,100.324883],[39.046558,100.325798],[39.043289,100.327919],[39.042301,100.328537],[39.041359,100.329247],[39.04044,100.330383],[39.03764,100.336403],[39.037201,100.337173],[39.031891,100.344978],[39.03001,100.347763],[39.01815,100.358269],[39.017208,100.359367],[39.014439,100.363419],[39.011909,100.366524],[39.011131,100.367569],[39.009892,100.370148],[39.009491,100.371307],[39.009411,100.37294],[39.009701,100.374458],[39.009899,100.376793],[39.009682,100.378067],[39.009171,100.379158],[39.00856,100.379959],[39.00684,100.381622],[39.006271,100.382782],[39.003311,100.390747],[39.000702,100.395638],[38.99966,100.398117],[38.99839,100.401466],[38.997978,100.402969],[38.997711,100.404762],[38.997398,100.406532],[38.996571,100.408501],[38.995571,100.410332],[38.995041,100.411652],[38.994362,100.414619],[38.994259,100.416],[38.994469,100.417084],[38.996239,100.421806],[38.996651,100.423264],[38.996609,100.428879],[38.996151,100.43045],[38.99585,100.430832],[38.991089,100.435509],[38.99017,100.435982],[38.989288,100.435959],[38.985409,100.434433],[38.980579,100.432991],[38.979401,100.433357],[38.97773,100.434357],[38.975861,100.437202],[38.974949,100.437912],[38.972141,100.438797],[38.960949,100.43602],[38.95298,100.433403],[38.95216,100.433128],[38.95126,100.432938],[38.95063,100.433144],[38.94836,100.434303],[38.942612,100.437157],[38.941761,100.437927],[38.938251,100.44165],[38.93692,100.443031],[38.9352,100.443413],[38.93541,100.444107],[38.935711,100.44725],[38.93644,100.452507],[38.93647,100.453751],[38.936588,100.45488],[38.936989,100.461548],[38.937401,100.465958],[38.937389,100.467453],[38.937469,100.468674],[38.937469,100.470398],[38.937439,100.472549],[38.937401,100.47464],[38.93734,100.477226],[38.937359,100.480133],[38.937489,100.482933],[38.937889,100.488083],[38.937908,100.488579],[38.93792,100.488907],[38.937729,100.488991],[38.934582,100.488632],[38.927471,100.487907],[38.92429,100.487694],[38.92131,100.487503],[38.918362,100.487297],[38.915371,100.487099],[38.911781,100.486893],[38.9081,100.486671],[38.906281,100.486549],[38.905769,100.486267],[38.905651,100.486282],[38.905361,100.486313],[38.905312,100.486366],[38.90453,100.487389],[38.903542,100.4888],[38.897739,100.496407],[38.894131,100.499657],[38.89225,100.500999],[38.888939,100.503441],[38.885078,100.50631],[38.878761,100.511673],[38.877159,100.51358],[38.87524,100.515968],[38.87027,100.52195],[38.860298,100.534897],[38.85957,100.537666],[38.85746,100.541687],[38.85574,100.54493],[38.854431,100.547401],[38.853851,100.548477],[38.853451,100.54921],[38.8521,100.551849],[38.851349,100.553253],[38.85001,100.555794],[38.84811,100.559349],[38.846142,100.563026],[38.84539,100.564133],[38.8442,100.565521],[38.839249,100.569122],[38.83136,100.571358],[38.83297,100.576851],[38.82534,100.582687],[38.81625,100.590927],[38.796181,100.60878],[38.763531,100.63195],[38.754429,100.637619],[38.725109,100.655472],[38.708359,100.664742],[38.70488,100.667488],[38.702068,100.670227],[38.688271,100.686203],[38.687061,100.687569],[38.676609,100.705421],[38.675941,100.706451],[38.66629,100.71315],[38.667099,100.716751],[38.6675,100.720528],[38.667759,100.723961],[38.672321,100.771339],[38.655701,100.774429],[38.61655,100.780777],[38.531059,100.795723],[38.483768,100.804131],[38.480141,100.805328],[38.47905,100.805946],[38.468189,100.812027],[38.46254,100.814774],[38.459721,100.815804],[38.448559,100.818031],[38.446949,100.818893],[38.445869,100.820427],[38.443581,100.8237],[38.441841,100.82576],[38.44009,100.82679],[38.43874,100.827637],[38.43565,100.829018],[38.416019,100.837936],[38.360451,100.86335],[38.358158,100.864899],[38.33218,100.886353],[38.31292,100.896477],[38.31076,100.897339],[38.305241,100.898201],[38.302811,100.898888],[38.277481,100.908836],[38.27182,100.911423],[38.267109,100.914162],[38.263329,100.916908],[38.240681,100.934937],[38.23893,100.935966],[38.230438,100.937851],[38.22525,100.938667],[38.22401,100.938904],[38.21764,100.940109],[38.215462,100.939423],[38.214828,100.939209],[38.21431,100.938957],[38.201801,100.93528],[38.20174,100.935257],[38.200401,100.934982],[38.194172,100.932129],[38.19355,100.932167],[38.191509,100.932266],[38.189819,100.932564],[38.188801,100.933067],[38.187191,100.933891],[38.183262,100.935593],[38.18232,100.93589],[38.18116,100.936142],[38.179989,100.936096],[38.178612,100.935837],[38.176151,100.935226],[38.17593,100.935158],[38.17543,100.935127],[38.17474,100.935226],[38.174381,100.935333],[38.173191,100.935997],[38.170811,100.938019],[38.169861,100.938141],[38.169529,100.938133],[38.16922,100.938057],[38.168282,100.936287],[38.166069,100.937134],[38.166561,100.93586],[38.16634,100.935364],[38.16626,100.934853],[38.165741,100.934723],[38.16497,100.93383],[38.162579,100.934982],[38.162231,100.93528],[38.161411,100.936569],[38.161209,100.936867],[38.16053,100.937439],[38.16029,100.937447],[38.15947,100.936722],[38.158779,100.936073],[38.15852,100.93576],[38.153389,100.931503],[38.152328,100.93026],[38.151409,100.928841],[38.1483,100.923149],[38.14677,100.922836],[38.14465,100.922813],[38.13913,100.922333],[38.138729,100.921997],[38.137669,100.920853],[38.13485,100.920441],[38.133919,100.920181],[38.133221,100.920242],[38.132881,100.920341],[38.126369,100.917053],[38.125771,100.917122],[38.12159,100.91671],[38.118771,100.917053],[38.11718,100.916672],[38.11676,100.91642],[38.11602,100.916412],[38.114201,100.916252],[38.113411,100.916367],[38.113071,100.916458],[38.113041,100.916473],[38.112598,100.916527],[38.112209,100.916611],[38.110981,100.917023],[38.11047,100.917229],[38.108398,100.917892],[38.105492,100.918831],[38.10294,100.919861],[38.101051,100.921097],[38.099892,100.921783],[38.09866,100.922501],[38.096241,100.920647],[38.095921,100.920799],[38.09502,100.921738],[38.09444,100.922363],[38.094238,100.922523],[38.092918,100.922768],[38.092659,100.922768],[38.091438,100.922371],[38.091202,100.92234],[38.09095,100.922371],[38.089951,100.92292],[38.089588,100.922997],[38.087589,100.922287],[38.086342,100.921783],[38.086128,100.921959],[38.085819,100.922127],[38.085381,100.922028],[38.08466,100.921509],[38.08456,100.921089],[38.084301,100.920227],[38.084221,100.920036],[38.08353,100.918831],[38.082909,100.91761],[38.08292,100.917099],[38.083038,100.916718],[38.083771,100.915039],[38.083309,100.911873],[38.0812,100.912231],[38.079781,100.910057],[38.077671,100.908447],[38.07642,100.907082],[38.075939,100.907028],[38.075169,100.906967],[38.073582,100.906807],[38.073139,100.906593],[38.072418,100.905533],[38.07119,100.903549],[38.070061,100.902039],[38.069592,100.901604],[38.069229,100.90123],[38.069118,100.901176],[38.068958,100.901093],[38.068691,100.900917],[38.066059,100.89875],[38.06493,100.896889],[38.064602,100.896294],[38.064362,100.895851],[38.064049,100.894623],[38.063911,100.894112],[38.06369,100.893761],[38.063389,100.893471],[38.061901,100.89257],[38.061508,100.892326],[38.061089,100.892036],[38.060539,100.891502],[38.06015,100.891083],[38.060131,100.89106],[38.05999,100.890923],[38.05806,100.889229],[38.057362,100.888283],[38.057281,100.888191],[38.056889,100.887894],[38.056358,100.887466],[38.055229,100.886688],[38.05442,100.886139],[38.053909,100.886078],[38.05283,100.886497],[38.050999,100.887207],[38.04887,100.887001],[38.047798,100.886871],[38.04686,100.887138],[38.04538,100.887756],[38.044159,100.888252],[38.042259,100.888908],[38.040859,100.889023],[38.039219,100.888992],[38.03812,100.889374],[38.035961,100.89048],[38.035191,100.891068],[38.033932,100.892174],[38.032829,100.893143],[38.0313,100.894478],[38.03019,100.89547],[38.029259,100.896149],[38.02895,100.896317],[38.028,100.8964],[38.02663,100.896248],[38.025509,100.896248],[38.024231,100.896317],[38.02322,100.896011],[38.021809,100.895432],[38.02076,100.89502],[38.01973,100.894882],[38.018162,100.894783],[38.016579,100.894653],[38.01572,100.894791],[38.014729,100.895241],[38.013451,100.895851],[38.01292,100.896111],[38.012611,100.896347],[38.0116,100.897499],[38.01049,100.898743],[38.009499,100.89991],[38.00872,100.901077],[38.007912,100.902313],[38.007401,100.903084],[38.006409,100.904556],[38.005939,100.90535],[38.00589,100.90554],[38.005859,100.906082],[38.006119,100.907249],[38.00631,100.907837],[38.006321,100.908043],[38.006199,100.908684],[38.005638,100.909477],[38.004921,100.909714],[38.004341,100.909889],[38.004211,100.909973],[38.00399,100.910172],[38.00354,100.910957],[38.00296,100.912216],[38.002159,100.913986],[38.001869,100.914558],[38.00148,100.915024],[38.000629,100.915543],[38.000141,100.916023],[38.000061,100.916191],[37.999931,100.916763],[37.99995,100.917664],[37.99976,100.918251],[37.999069,100.91922],[37.998081,100.920486],[37.994629,100.922951],[37.993259,100.923653],[37.992119,100.92395],[37.991749,100.924187],[37.991718,100.924271],[37.992081,100.924622],[37.992352,100.924583],[37.993462,100.924759],[37.994831,100.925262],[37.99577,100.925636],[37.995949,100.925858],[37.995369,100.926323],[37.994511,100.92617],[37.99313,100.926003],[37.991619,100.926338],[37.98933,100.927071],[37.988651,100.927277],[37.987629,100.927383],[37.986462,100.927254],[37.985901,100.927437],[37.985729,100.927917],[37.985729,100.928139],[37.985909,100.929626],[37.985851,100.929916],[37.98558,100.929962],[37.985111,100.929047],[37.98457,100.92804],[37.9841,100.927498],[37.983879,100.927353],[37.98291,100.927193],[37.981701,100.927467],[37.98,100.927994],[37.978321,100.928558],[37.976299,100.929497],[37.973499,100.930946],[37.97234,100.931587],[37.970921,100.932564],[37.969349,100.933693],[37.968651,100.934273],[37.96822,100.934914],[37.967701,100.935738],[37.966919,100.936974],[37.965889,100.938133],[37.96278,100.941231],[37.95332,100.950447],[37.95113,100.952316],[37.948059,100.954712],[37.946251,100.956261],[37.942341,100.960251],[37.940208,100.962517],[37.938641,100.964043],[37.925011,100.976463],[37.923859,100.977821],[37.912819,100.993507],[37.91153,100.995216],[37.906441,101.00177],[37.902988,101.006012],[37.897812,101.012581],[37.895741,101.015099],[37.894581,101.016342],[37.893471,101.017319],[37.886219,101.022598],[37.884129,101.0242],[37.882912,101.02549],[37.876579,101.034492],[37.87384,101.037201],[37.87289,101.038643],[37.871059,101.042099],[37.869381,101.045097],[37.865761,101.050629],[37.86404,101.053368],[37.861839,101.05851],[37.86116,101.060448],[37.860329,101.064133],[37.860329,101.065292],[37.8606,101.065331],[37.86047,101.066803],[37.86034,101.069008],[37.86026,101.069633],[37.860062,101.070129],[37.859489,101.070717],[37.85928,101.070801],[37.85873,101.070824],[37.85714,101.070374],[37.855881,101.070053],[37.855511,101.070183],[37.85537,101.070267],[37.854889,101.070847],[37.854771,101.07119],[37.854061,101.072327],[37.85331,101.073563],[37.85252,101.074989],[37.85228,101.075417],[37.85191,101.076263],[37.851521,101.077271],[37.850632,101.080223],[37.85051,101.080566],[37.8503,101.081352],[37.849998,101.082458],[37.84977,101.083717],[37.849621,101.084793],[37.849548,101.085373],[37.849491,101.085854],[37.849098,101.08725],[37.848598,101.088982],[37.847919,101.091454],[37.847698,101.093063],[37.84763,101.09433],[37.847599,101.094627],[37.84753,101.095673],[37.847462,101.096786],[37.847321,101.098503],[37.847118,101.099922],[37.846741,101.101959],[37.846489,101.103348],[37.846371,101.104027],[37.846199,101.104767],[37.8461,101.105431],[37.845741,101.10656],[37.84515,101.107933],[37.844719,101.109108],[37.84457,101.110367],[37.844479,101.112419],[37.844398,101.114662],[37.844311,101.115028],[37.84383,101.115433],[37.843449,101.115288],[37.842651,101.114532],[37.84185,101.11367],[37.840961,101.112709],[37.840488,101.112244],[37.840469,101.11219],[37.840439,101.112259],[37.840351,101.112129],[37.84013,101.111938],[37.839489,101.111588],[37.83905,101.111526],[37.83865,101.111588],[37.8381,101.111923],[37.8377,101.112373],[37.837238,101.113403],[37.8367,101.114769],[37.836479,101.115669],[37.8363,101.117081],[37.83577,101.12207],[37.835499,101.124001],[37.835121,101.125214],[37.834309,101.127197],[37.833679,101.129219],[37.833359,101.130989],[37.83305,101.133148],[37.83321,101.134811],[37.833881,101.137657],[37.834099,101.138351],[37.834702,101.13916],[37.83567,101.139702],[37.836121,101.139923],[37.836418,101.140373],[37.83614,101.140572],[37.835178,101.140648],[37.83382,101.140762],[37.832279,101.14077],[37.830601,101.140587],[37.82917,101.140778],[37.827431,101.140717],[37.825581,101.140388],[37.82452,101.1399],[37.823139,101.139297],[37.82214,101.139259],[37.821178,101.139618],[37.819019,101.140663],[37.817181,101.141411],[37.816669,101.141617],[37.815929,101.142174],[37.814751,101.143822],[37.813019,101.146439],[37.811901,101.148109],[37.811069,101.148567],[37.809551,101.148941],[37.807381,101.149544],[37.806061,101.150299],[37.804459,101.151299],[37.804119,101.151428],[37.80278,101.151962],[37.801182,101.152908],[37.798481,101.154587],[37.79567,101.156326],[37.795521,101.156441],[37.794899,101.157471],[37.793388,101.160606],[37.792149,101.163231],[37.791801,101.164368],[37.791191,101.167183],[37.790531,101.170303],[37.789902,101.173157],[37.789532,101.173958],[37.788589,101.17514],[37.787369,101.176498],[37.786541,101.177071],[37.785759,101.177933],[37.78442,101.179588],[37.783279,101.181313],[37.782421,101.183456],[37.7813,101.186394],[37.780449,101.188187],[37.779011,101.190361],[37.777809,101.191879],[37.77594,101.193947],[37.774529,101.194939],[37.772461,101.196312],[37.770329,101.197906],[37.7682,101.200546],[37.76577,101.203506],[37.76276,101.207207],[37.760689,101.210091],[37.75843,101.213463],[37.757191,101.215767],[37.755589,101.219109],[37.75441,101.222031],[37.753521,101.223457],[37.752949,101.224693],[37.752522,101.226517],[37.751942,101.228729],[37.751259,101.230072],[37.749901,101.232407],[37.749359,101.233803],[37.74844,101.236168],[37.7481,101.236839],[37.746868,101.238503],[37.745739,101.239891],[37.745441,101.240372],[37.74519,101.241577],[37.745049,101.24324],[37.744511,101.244423],[37.743649,101.246094],[37.742661,101.247627],[37.74091,101.249893],[37.739029,101.252281],[37.73679,101.255127],[37.734909,101.257561],[37.733028,101.260033],[37.732281,101.261452],[37.730949,101.264313],[37.730011,101.265556],[37.72863,101.266953],[37.727772,101.26783],[37.727531,101.268387],[37.727402,101.270111],[37.72736,101.27079],[37.727242,101.271141],[37.727051,101.271507],[37.726719,101.272079],[37.726391,101.272667],[37.725971,101.273331],[37.725208,101.274597],[37.724411,101.275932],[37.723999,101.277107],[37.723961,101.278053],[37.72422,101.279388],[37.724289,101.279747],[37.724159,101.28093],[37.723862,101.281448],[37.722301,101.283569],[37.721378,101.284973],[37.720901,101.286507],[37.72065,101.287338],[37.720161,101.288406],[37.719929,101.288811],[37.719589,101.289467],[37.719028,101.290482],[37.718262,101.291878],[37.71706,101.294037],[37.715969,101.296043],[37.714989,101.297813],[37.714699,101.298309],[37.71434,101.299026],[37.713829,101.300072],[37.713799,101.300117],[37.713242,101.300728],[37.712799,101.301132],[37.712601,101.301208],[37.712269,101.301277],[37.71159,101.301208],[37.71125,101.30101],[37.711079,101.300903],[37.71077,101.300743],[37.710209,101.300133],[37.709751,101.29969],[37.709309,101.299187],[37.708691,101.298683],[37.70834,101.298576],[37.707771,101.298767],[37.706871,101.299149],[37.706551,101.299294],[37.70607,101.299492],[37.705238,101.29985],[37.704762,101.300049],[37.704361,101.300217],[37.703651,101.300507],[37.70253,101.300987],[37.700699,101.30172],[37.698448,101.302338],[37.695919,101.302711],[37.69265,101.303146],[37.690048,101.303581],[37.68877,101.304001],[37.686951,101.304588],[37.686069,101.304909],[37.6847,101.305496],[37.68343,101.306107],[37.680759,101.307327],[37.67836,101.308121],[37.67527,101.309196],[37.672642,101.31041],[37.669472,101.311913],[37.668152,101.312767],[37.666481,101.313927],[37.665161,101.314903],[37.664322,101.315666],[37.662891,101.317139],[37.66127,101.318573],[37.660339,101.319321],[37.659191,101.320152],[37.65731,101.321297],[37.655869,101.322144],[37.654308,101.323029],[37.652191,101.324303],[37.648499,101.326591],[37.645439,101.328568],[37.64394,101.329826],[37.643021,101.330872],[37.64254,101.331497],[37.641319,101.333237],[37.639839,101.335373],[37.638199,101.337723],[37.636379,101.340317],[37.634541,101.342957],[37.632141,101.34639],[37.629341,101.350357],[37.627628,101.352814],[37.626659,101.354301],[37.62627,101.355598],[37.625721,101.357979],[37.625141,101.359108],[37.62434,101.360046],[37.62286,101.361603],[37.621571,101.363548],[37.62019,101.365372],[37.619209,101.366013],[37.617599,101.366814],[37.616562,101.367691],[37.61496,101.369507],[37.613701,101.370613],[37.610222,101.373337],[37.607319,101.375664],[37.60474,101.37793],[37.602089,101.380333],[37.598621,101.383461],[37.594391,101.387299],[37.591091,101.390297],[37.58691,101.394119],[37.583401,101.397293],[37.580681,101.399773],[37.580269,101.400131],[37.579899,101.400482],[37.579269,101.401047],[37.5783,101.401932],[37.57708,101.403053],[37.575291,101.404663],[37.57296,101.406754],[37.57003,101.409286],[37.566971,101.411903],[37.56599,101.412727],[37.56562,101.413033],[37.564522,101.413963],[37.563381,101.414726],[37.561989,101.415352],[37.56007,101.416077],[37.557541,101.417061],[37.554241,101.418373],[37.551399,101.419312],[37.547798,101.420357],[37.545071,101.421227],[37.542511,101.42215],[37.540421,101.422928],[37.53783,101.423813],[37.53566,101.424393],[37.534081,101.424332],[37.531898,101.42424],[37.529049,101.424202],[37.525181,101.424263],[37.52179,101.424278],[37.519741,101.424316],[37.516869,101.424393],[37.512939,101.424461],[37.508251,101.424538],[37.503899,101.424629],[37.500198,101.424683],[37.49575,101.424767],[37.492561,101.424797],[37.489559,101.424988],[37.487999,101.425407],[37.48576,101.425972],[37.482288,101.426201],[37.479931,101.426361],[37.4776,101.426498],[37.475159,101.426643],[37.473331,101.426697],[37.471889,101.426514],[37.47049,101.426529],[37.467419,101.426758],[37.46513,101.426933],[37.464211,101.42672],[37.464119,101.426697],[37.463982,101.426659],[37.463848,101.426582],[37.463139,101.426132],[37.46244,101.425659],[37.461079,101.424744],[37.459431,101.423668],[37.457729,101.422523],[37.45628,101.421501],[37.455479,101.420937],[37.45435,101.419746],[37.452621,101.417473],[37.451469,101.415993],[37.44981,101.413803],[37.44854,101.412338],[37.44804,101.412064],[37.44775,101.411888],[37.445492,101.411247],[37.443668,101.410637],[37.441891,101.40976],[37.44035,101.409012],[37.440208,101.408943],[37.43853,101.40863],[37.436539,101.408112],[37.434071,101.406921],[37.433498,101.406593],[37.432201,101.406242],[37.431061,101.406303],[37.42942,101.406502],[37.427738,101.406723],[37.425339,101.407478],[37.422489,101.408386],[37.420898,101.408218],[37.419739,101.407829],[37.417549,101.40773],[37.416061,101.407822],[37.414471,101.408257],[37.412609,101.408791],[37.411018,101.409241],[37.409962,101.409531],[37.40871,101.409767],[37.4076,101.409538],[37.406799,101.409302],[37.40564,101.409393],[37.404781,101.409843],[37.403141,101.410782],[37.401932,101.411163],[37.39996,101.411751],[37.398479,101.412033],[37.397221,101.412209],[37.396179,101.412369],[37.394939,101.412666],[37.394131,101.413139],[37.39407,101.413162],[37.393711,101.413223],[37.393089,101.412956],[37.391979,101.412209],[37.390869,101.411697],[37.389389,101.411148],[37.38903,101.410583],[37.38913,101.40995],[37.389179,101.409843],[37.389591,101.409142],[37.38966,101.408524],[37.389408,101.408096],[37.38839,101.406822],[37.387348,101.405571],[37.387112,101.405411],[37.386189,101.405357],[37.38554,101.40522],[37.384762,101.404449],[37.38401,101.403732],[37.38353,101.403618],[37.3825,101.403793],[37.38203,101.403572],[37.381908,101.40332],[37.38184,101.40303],[37.38163,101.401863],[37.381161,101.400917],[37.38028,101.399353],[37.379539,101.398064],[37.37907,101.397758],[37.378651,101.397919],[37.378529,101.398209],[37.378262,101.399963],[37.378239,101.400597],[37.378601,101.401222],[37.37904,101.401627],[37.37915,101.401901],[37.379169,101.402367],[37.37854,101.403183],[37.378342,101.40345],[37.378269,101.404053],[37.378471,101.404953],[37.378979,101.406151],[37.37957,101.407173],[37.379631,101.407341],[37.37973,101.407913],[37.379639,101.409309],[37.379372,101.409698],[37.378639,101.41011],[37.378429,101.410233],[37.378311,101.410339],[37.377861,101.411201],[37.377651,101.411713],[37.377571,101.411819],[37.376991,101.412308],[37.376259,101.412827],[37.374969,101.413727],[37.374741,101.413841],[37.373779,101.413933],[37.37265,101.414131],[37.372059,101.41494],[37.371849,101.415283],[37.37146,101.415459],[37.371319,101.415199],[37.37151,101.41481],[37.37159,101.414726],[37.37183,101.41449],[37.372509,101.413429],[37.373138,101.413017],[37.37431,101.412582],[37.37439,101.412537],[37.37524,101.411491],[37.376221,101.41021],[37.376579,101.409309],[37.37677,101.408707],[37.376801,101.407959],[37.376671,101.407494],[37.376549,101.407181],[37.375622,101.406151],[37.37534,101.405891],[37.374939,101.405739],[37.37405,101.405937],[37.372532,101.406487],[37.37244,101.406502],[37.371429,101.406052],[37.370049,101.405357],[37.369881,101.40464],[37.36993,101.404381],[37.370461,101.402924],[37.370449,101.402229],[37.370121,101.401772],[37.369801,101.401688],[37.368721,101.401741],[37.36731,101.401833],[37.36607,101.402046],[37.36491,101.402313],[37.363361,101.402893],[37.362251,101.403313],[37.36216,101.403671],[37.362228,101.403793],[37.362572,101.403816],[37.362751,101.403793],[37.36301,101.403664],[37.364571,101.40313],[37.364681,101.403091],[37.36499,101.403091],[37.365139,101.40345],[37.36483,101.403687],[37.364071,101.403687],[37.36314,101.404083],[37.362671,101.404282],[37.361889,101.404373],[37.361141,101.404373],[37.361,101.404381],[37.360821,101.404442],[37.360691,101.404716],[37.36097,101.405006],[37.362041,101.40477],[37.362999,101.404846],[37.363091,101.404861],[37.364029,101.404579],[37.364319,101.404488],[37.364849,101.404587],[37.36517,101.404739],[37.365719,101.40477],[37.366051,101.404442],[37.366531,101.404007],[37.366619,101.404022],[37.36742,101.404083],[37.367668,101.404312],[37.36755,101.404663],[37.36747,101.404694],[37.36647,101.404694],[37.366249,101.404793],[37.365921,101.405167],[37.365761,101.405357],[37.36499,101.405739],[37.363918,101.405998],[37.362591,101.406319],[37.36179,101.406464],[37.361012,101.406601],[37.360149,101.406754],[37.35891,101.406799],[37.358398,101.406807],[37.357201,101.407204],[37.356079,101.407928],[37.356022,101.407967],[37.35553,101.408157],[37.354881,101.407799],[37.353771,101.406982],[37.35355,101.40683],[37.337841,101.397949],[37.335972,101.398239],[37.33374,101.398643],[37.333111,101.398743],[37.33165,101.399529],[37.3283,101.401382],[37.327991,101.401611],[37.327702,101.402107],[37.327591,101.40287],[37.327621,101.403572],[37.32711,101.4048],[37.325871,101.406174],[37.32552,101.40638],[37.325272,101.406433],[37.324612,101.406219],[37.323872,101.405457],[37.32349,101.405167],[37.32299,101.405228],[37.321861,101.406189],[37.32111,101.407578],[37.32032,101.409317],[37.320179,101.40947],[37.319901,101.409416],[37.319881,101.408897],[37.319931,101.408813],[37.320728,101.407356],[37.321331,101.406303],[37.322369,101.404823],[37.322861,101.404213],[37.323071,101.403961],[37.323219,101.403831],[37.32349,101.40377],[37.324001,101.403893],[37.324501,101.403793],[37.3246,101.403587],[37.324551,101.402191],[37.324982,101.401337],[37.326141,101.400253],[37.326759,101.399658],[37.326931,101.399437],[37.326889,101.399101],[37.326778,101.398987],[37.326469,101.399132],[37.325409,101.400177],[37.32468,101.400787],[37.32391,101.401749],[37.323589,101.402153],[37.322632,101.40284],[37.32106,101.404533],[37.32021,101.405121],[37.31958,101.40609],[37.3195,101.406197],[37.31847,101.407379],[37.316929,101.409149],[37.31678,101.409607],[37.317039,101.412064],[37.317181,101.412399],[37.31757,101.412689],[37.318748,101.412956],[37.31889,101.412971],[37.319851,101.412727],[37.32058,101.412491],[37.32103,101.412643],[37.322189,101.413002],[37.32336,101.413361],[37.324661,101.413834],[37.324821,101.413918],[37.325069,101.414093],[37.325199,101.414383],[37.325119,101.414848],[37.324951,101.415009],[37.322498,101.415657],[37.322071,101.415771],[37.320229,101.415787],[37.31879,101.416527],[37.31702,101.417488],[37.314079,101.41925],[37.312801,101.420464],[37.31229,101.420959],[37.311039,101.421883],[37.308819,101.423248],[37.308151,101.423737],[37.307831,101.424103],[37.30756,101.424423],[37.307129,101.424561],[37.3064,101.424431],[37.306149,101.424408],[37.305901,101.424454],[37.305309,101.424759],[37.304619,101.42485],[37.303761,101.424797],[37.303371,101.424927],[37.302719,101.425468],[37.302361,101.425636],[37.302189,101.425346],[37.30238,101.425018],[37.303379,101.424522],[37.304871,101.424004],[37.306099,101.422768],[37.307281,101.422249],[37.307781,101.422028],[37.307709,101.421837],[37.306499,101.422058],[37.305401,101.42244],[37.30378,101.423218],[37.30299,101.423508],[37.30265,101.423378],[37.301788,101.422119],[37.299229,101.4188],[37.29887,101.418297],[37.297771,101.417084],[37.296501,101.415581],[37.295761,101.414757],[37.294979,101.414841],[37.29454,101.41497],[37.293732,101.414757],[37.292919,101.414383],[37.292629,101.414322],[37.290932,101.414398],[37.288929,101.414543],[37.287491,101.414978],[37.286819,101.415253],[37.285591,101.415314],[37.285339,101.415314],[37.284981,101.415489],[37.28487,101.416031],[37.284981,101.4161],[37.286949,101.415756],[37.287498,101.415688],[37.28775,101.415672],[37.28846,101.415657],[37.288528,101.415657],[37.288681,101.415703],[37.288731,101.415993],[37.288582,101.416199],[37.28772,101.416443],[37.28672,101.41655],[37.28492,101.416656],[37.282841,101.416847],[37.280769,101.416542],[37.277889,101.416054],[37.275749,101.415771],[37.273762,101.416153],[37.272942,101.416183],[37.272301,101.415916],[37.271969,101.415771],[37.270729,101.415771],[37.2687,101.416069],[37.26685,101.416168],[37.263821,101.41597],[37.2612,101.415314],[37.25959,101.41494],[37.25724,101.414398],[37.25568,101.41433],[37.253761,101.414413],[37.253609,101.414429],[37.251259,101.414558],[37.250561,101.415009],[37.24929,101.416481],[37.248531,101.417526],[37.244671,101.429771],[37.243301,101.435257],[37.242859,101.437271],[37.242939,101.438911],[37.24342,101.442207],[37.2449,101.44738],[37.245338,101.450417],[37.245529,101.452568],[37.245449,101.454262],[37.24464,101.464493],[37.24445,101.466148],[37.24437,101.466454],[37.244041,101.466988],[37.243401,101.467506],[37.243069,101.467857],[37.242939,101.468613],[37.243969,101.471687],[37.244919,101.472878],[37.245079,101.473251],[37.24514,101.475067],[37.243679,101.483513],[37.243172,101.48555],[37.242458,101.486748],[37.241989,101.487427],[37.24176,101.488922],[37.241661,101.490196],[37.24086,101.491463],[37.238831,101.495354],[37.238529,101.500031],[37.237782,101.50103],[37.236099,101.501312],[37.2356,101.501694],[37.2346,101.503036],[37.23447,101.503258],[37.234409,101.503517],[37.234539,101.504219],[37.235321,101.506203],[37.235191,101.507553],[37.235222,101.507881],[37.236031,101.509827],[37.235661,101.512444],[37.235168,101.516289],[37.23476,101.517311],[37.233669,101.518204],[37.233139,101.520264],[37.2327,101.520737],[37.23246,101.520737],[37.230881,101.520073],[37.230061,101.520126],[37.22958,101.520447],[37.229382,101.520668],[37.22855,101.521217],[37.228031,101.521927],[37.227242,101.522346],[37.226849,101.522469],[37.225948,101.523193],[37.224831,101.524261],[37.223831,101.526154],[37.222679,101.528816],[37.222561,101.528976],[37.22216,101.529846],[37.221958,101.530083],[37.221588,101.530113],[37.221241,101.529846],[37.22076,101.529358],[37.220341,101.529297],[37.219872,101.5298],[37.21909,101.531013],[37.218342,101.531342],[37.218159,101.531631],[37.218189,101.532112],[37.218819,101.534027],[37.219021,101.535423],[37.219009,101.535713],[37.21862,101.536133],[37.218182,101.53595],[37.216209,101.532883],[37.215919,101.532661],[37.215542,101.53273],[37.212608,101.537086],[37.21244,101.53727],[37.20805,101.53756],[37.207062,101.537064],[37.206692,101.537086],[37.206261,101.537643],[37.206009,101.537888],[37.20583,101.537933],[37.205631,101.537872],[37.20414,101.536377],[37.20364,101.536217],[37.203091,101.537331],[37.202221,101.538544],[37.20163,101.539177],[37.199741,101.539398],[37.199051,101.539177],[37.199131,101.539062],[37.200741,101.539124],[37.201439,101.538971],[37.20163,101.538849],[37.201561,101.538239],[37.200771,101.538116],[37.19978,101.538231],[37.19849,101.538254],[37.197311,101.538109],[37.19585,101.537376],[37.19503,101.537163],[37.19453,101.537262],[37.192909,101.538673],[37.18969,101.541893],[37.1894,101.542267],[37.18771,101.543747],[37.187351,101.544594],[37.18652,101.54702],[37.185921,101.547348],[37.18494,101.54747],[37.184078,101.547211],[37.182579,101.546593],[37.179371,101.547737],[37.177158,101.54882],[37.175419,101.549004],[37.174992,101.54911],[37.173851,101.550056],[37.171951,101.551811],[37.16856,101.555199],[37.16573,101.557533],[37.165051,101.558037],[37.1646,101.558212],[37.16185,101.558594],[37.150612,101.56044],[37.149799,101.560539],[37.148972,101.561523],[37.14526,101.565498],[37.145012,101.565239],[37.144112,101.564613],[37.142639,101.563789],[37.141941,101.563713],[37.141781,101.563766],[37.141171,101.564651],[37.140381,101.568283],[37.140129,101.569633],[37.139511,101.570518],[37.139111,101.570717],[37.13829,101.570168],[37.136162,101.569733],[37.127941,101.568977],[37.120708,101.566162],[37.115791,101.566833],[37.11084,101.566566],[37.11071,101.566589],[37.110439,101.566727],[37.110569,101.566597],[37.110451,101.56649],[37.10928,101.566307],[37.106831,101.565643],[37.10585,101.565697],[37.102749,101.566742],[37.100529,101.56694],[37.10001,101.56694],[37.09763,101.566391],[37.08778,101.565727],[37.084541,101.565201],[37.081539,101.566353],[37.078499,101.568489],[37.076111,101.570312],[37.07375,101.571854],[37.068119,101.575279],[37.06662,101.573463],[37.057621,101.568863],[37.054428,101.567383],[37.04855,101.566383],[37.045929,101.566063],[37.039959,101.569397],[37.038471,101.569267],[37.036831,101.568779],[37.031479,101.56675],[37.030899,101.566673],[37.0303,101.566719],[37.025002,101.56855],[37.023991,101.569206],[37.023399,101.569893],[37.021519,101.573753],[37.020229,101.57666],[37.01791,101.581337],[37.009121,101.59391],[37.005348,101.598343],[37.004761,101.600288],[37.00333,101.606148],[37.001411,101.615402],[37.001499,101.617416],[37.001041,101.619637],[36.99847,101.625504],[36.998131,101.625938],[36.996529,101.62748],[36.988991,101.633797],[36.98806,101.634453],[36.974491,101.64325],[36.96608,101.653717],[36.96159,101.659042],[36.96096,101.659973],[36.950859,101.667549],[36.948372,101.669502],[36.946701,101.670937],[36.943699,101.673103],[36.940811,101.675346],[36.938049,101.677582],[36.934719,101.680923],[36.927681,101.686798],[36.92522,101.689323],[36.92408,101.691132],[36.922691,101.694366],[36.921761,101.6968],[36.919979,101.702789],[36.919071,101.704964],[36.918449,101.706131],[36.916691,101.708611],[36.916679,101.708733],[36.91671,101.708809],[36.916759,101.70887],[36.917049,101.709122],[36.917431,101.709488],[36.91782,101.71003],[36.918171,101.710632],[36.918308,101.711243],[36.918079,101.711983],[36.91766,101.712891],[36.917179,101.713943],[36.916649,101.714989],[36.91605,101.716057],[36.915352,101.717194],[36.914558,101.718353],[36.9137,101.719528],[36.912769,101.720703],[36.911789,101.72187],[36.910728,101.723038],[36.909641,101.724213],[36.908501,101.725403],[36.907349,101.726593],[36.9062,101.727783],[36.905048,101.728996],[36.903889,101.730202],[36.902481,101.731659],[36.901321,101.732872],[36.900169,101.734077],[36.89901,101.735283],[36.89492,101.739517],[36.893959,101.740387],[36.892769,101.741287],[36.89156,101.742027],[36.89032,101.74263],[36.889,101.743149],[36.88768,101.743683],[36.886391,101.744308],[36.885139,101.745033],[36.88385,101.745789],[36.88253,101.746559],[36.88118,101.74736],[36.879841,101.748154],[36.87849,101.748947],[36.87714,101.749786],[36.87339,101.75248],[36.868092,101.756477],[36.866772,101.757263],[36.86541,101.758003],[36.864021,101.758713],[36.85524,101.761681],[36.85376,101.762123],[36.85231,101.762558],[36.850849,101.762993],[36.849369,101.763443],[36.832531,101.766273],[36.821499,101.769531],[36.812901,101.772072],[36.81139,101.772331],[36.758228,101.771317],[36.756771,101.770851],[36.755322,101.770401],[36.753849,101.769951],[36.75116,101.769203],[36.74971,101.768867],[36.748341,101.7686],[36.746971,101.768387],[36.745579,101.768204],[36.744171,101.768021],[36.742722,101.767822],[36.684299,101.766548],[36.68285,101.766586],[36.6814,101.766693],[36.67997,101.7668],[36.6786,101.76696],[36.67728,101.767159],[36.676041,101.767357],[36.6749,101.767563],[36.67384,101.767769],[36.672791,101.767982],[36.671791,101.768181],[36.670921,101.768356],[36.670441,101.768448],[36.670219,101.768509],[36.669899,101.76857],[36.66946,101.768646],[36.6689,101.768784],[36.668201,101.768944],[36.667488,101.769127],[36.66687,101.769287],[36.66642,101.769417],[36.666119,101.769524],[36.665741,101.769691],[36.66518,101.769867],[36.66449,101.770111],[36.663719,101.770401],[36.662949,101.770714],[36.662121,101.771027],[36.661228,101.771378],[36.66024,101.771767],[36.659199,101.772171],[36.658131,101.772583],[36.657089,101.772987],[36.656109,101.773369],[36.655209,101.773781],[36.654449,101.774147],[36.653919,101.774353],[36.653351,101.774567],[36.653011,101.774696],[36.652409,101.774918],[36.651878,101.775124],[36.65136,101.775291],[36.65062,101.775543],[36.6497,101.775574],[36.648708,101.775352],[36.648239,101.774963],[36.648102,101.774643],[36.647961,101.774147],[36.647781,101.773842],[36.647572,101.773697],[36.647209,101.773727],[36.646111,101.774017],[36.644958,101.774422],[36.64172,101.776169],[36.64053,101.776848],[36.640259,101.777359],[36.64035,101.777939],[36.640629,101.778648],[36.640591,101.779846],[36.640331,101.78064],[36.63974,101.782043],[36.639099,101.783524],[36.63863,101.784576],[36.638149,101.785751],[36.637661,101.787308],[36.636921,101.790131],[36.636768,101.790733],[36.636501,101.791649],[36.63623,101.792412],[36.63588,101.793198],[36.635471,101.793922],[36.634838,101.794792],[36.634369,101.795288],[36.63266,101.796669],[36.631969,101.797287],[36.63147,101.797859],[36.630901,101.798683],[36.630348,101.799767],[36.63007,101.800583],[36.629768,101.801903],[36.629539,101.80378],[36.62936,101.804733],[36.629009,101.805862],[36.628529,101.806923],[36.62804,101.807693],[36.627628,101.808243],[36.623409,101.813072],[36.622681,101.814003],[36.622162,101.814781],[36.621712,101.815613],[36.62014,101.818932],[36.619671,101.819687],[36.61898,101.820557],[36.618038,101.82151],[36.616959,101.822289],[36.612671,101.824448],[36.611801,101.824959],[36.610989,101.825569],[36.61042,101.826103],[36.609501,101.82708],[36.605671,101.831581],[36.60498,101.832253],[36.604431,101.832687],[36.603031,101.833603],[36.596249,101.837624],[36.595249,101.838371],[36.594379,101.839287],[36.5938,101.840103],[36.59309,101.841537],[36.592079,101.844223],[36.591572,101.845154],[36.590981,101.845978],[36.58989,101.846977],[36.588341,101.847977],[36.58757,101.848618],[36.58704,101.849213],[36.586411,101.850014],[36.58567,101.851311],[36.583961,101.855827],[36.58371,101.856491],[36.583389,101.857323],[36.582649,101.85907],[36.582081,101.860291],[36.581921,101.860588],[36.581089,101.862213],[36.580181,101.863838],[36.57859,101.866623],[36.578281,101.867188],[36.576771,101.869682],[36.575649,101.871872],[36.57513,101.873138],[36.57481,101.874153],[36.573139,101.879433],[36.572811,101.880302],[36.572319,101.881653],[36.572071,101.882149],[36.571621,101.882858],[36.571098,101.883499],[36.569538,101.885063],[36.568748,101.886147],[36.56823,101.887062],[36.568001,101.887573],[36.56741,101.889587],[36.567242,101.893753],[36.56715,101.89492],[36.566921,101.896339],[36.56657,101.897942],[36.565361,101.90155],[36.565159,101.90213],[36.56501,101.902573],[36.5648,101.903381],[36.564171,101.906937],[36.563869,101.909027],[36.563831,101.90934],[36.563728,101.910263],[36.563499,101.91169],[36.562759,101.915443],[36.562241,101.917618],[36.56118,101.921127],[36.560188,101.923721],[36.559429,101.925407],[36.55801,101.928009],[36.55735,101.929329],[36.556789,101.930763],[36.556438,101.932068],[36.55624,101.933167],[36.556141,101.934288],[36.55595,101.940407],[36.555901,101.941208],[36.555679,101.942772],[36.555401,101.944077],[36.5532,101.952919],[36.552898,101.954018],[36.552471,101.955353],[36.552071,101.956352],[36.551609,101.957291],[36.550812,101.958611],[36.548988,101.960968],[36.5485,101.961594],[36.54364,101.967583],[36.542759,101.968826],[36.54158,101.970863],[36.540878,101.972298],[36.539371,101.975861],[36.538769,101.977127],[36.53796,101.9786],[36.536041,101.981743],[36.535351,101.982986],[36.53484,101.984047],[36.533951,101.986221],[36.532661,101.989998],[36.531658,101.992554],[36.529919,101.9963],[36.527691,102.000778],[36.525009,102.006371],[36.524189,102.008232],[36.52359,102.009804],[36.523079,102.011726],[36.522671,102.013718],[36.522041,102.01722],[36.521339,102.021637],[36.520679,102.025291],[36.520351,102.026657],[36.520031,102.027733],[36.5186,102.031937],[36.51833,102.033043],[36.518169,102.033867],[36.518051,102.034721],[36.517971,102.035873],[36.517879,102.039383],[36.51767,102.041382],[36.51725,102.04335],[36.51638,102.04631],[36.5159,102.048157],[36.515629,102.049507],[36.51543,102.050903],[36.515289,102.052628],[36.51524,102.054077],[36.5154,102.058456],[36.51535,102.060219],[36.515121,102.062248],[36.5144,102.066704],[36.51424,102.067497],[36.514011,102.068283],[36.51366,102.069122],[36.51329,102.069763],[36.512821,102.070381],[36.51405,102.069],[36.514992,102.067719],[36.51535,102.066994],[36.515541,102.066483],[36.515732,102.065666],[36.51582,102.064537],[36.515701,102.062073],[36.51564,102.061752],[36.515499,102.059753],[36.515388,102.061218],[36.515121,102.062866],[36.514889,102.064522],[36.51487,102.066162],[36.515049,102.06778],[36.515442,102.06929],[36.51601,102.070717],[36.51664,102.072037],[36.5172,102.073357],[36.517639,102.074722],[36.517929,102.076103],[36.518059,102.07756],[36.518009,102.079102],[36.517689,102.080673],[36.517288,102.082336],[36.517052,102.084053],[36.51693,102.085716],[36.516819,102.087341],[36.516708,102.088913],[36.516579,102.090446],[36.51646,102.091858],[36.51635,102.093132],[36.516201,102.094276],[36.515961,102.095322],[36.515678,102.096283],[36.515369,102.097137],[36.515072,102.097809],[36.514832,102.098297],[36.514339,102.099182],[36.513672,102.100212],[36.51292,102.10144],[36.5121,102.102783],[36.51125,102.104141],[36.51041,102.105492],[36.50956,102.106888],[36.508709,102.108208],[36.50795,102.109558],[36.507332,102.110977],[36.506771,102.112473],[36.506302,102.113983],[36.505932,102.115494],[36.50565,102.116966],[36.505459,102.118408],[36.505341,102.119873],[36.505291,102.121384],[36.505291,102.122963],[36.505291,102.124634],[36.505291,102.12635],[36.50528,102.128067],[36.505291,102.129753],[36.505291,102.131401],[36.50531,102.133011],[36.505291,102.134583],[36.505219,102.136162],[36.5051,102.137733],[36.504951,102.139252],[36.504768,102.140717],[36.504539,102.142174],[36.504269,102.143677],[36.503948,102.145271],[36.503571,102.146896],[36.503159,102.148529],[36.502682,102.150146],[36.502178,102.151779],[36.50169,102.153442],[36.50119,102.155128],[36.500721,102.156883],[36.50029,102.158699],[36.499939,102.160583],[36.499569,102.162857],[36.499088,102.165863],[36.49881,102.167648],[36.498482,102.16935],[36.498081,102.171013],[36.497581,102.172569],[36.49699,102.174057],[36.4963,102.175423],[36.495522,102.17672],[36.494671,102.178017],[36.493801,102.179337],[36.492939,102.180656],[36.492069,102.181938],[36.491199,102.183212],[36.490349,102.184479],[36.48954,102.185707],[36.488831,102.186958],[36.48822,102.188217],[36.48764,102.189484],[36.487148,102.190773],[36.486759,102.192101],[36.48645,102.193459],[36.486191,102.194839],[36.486019,102.196243],[36.485859,102.197617],[36.485649,102.199074],[36.485439,102.200699],[36.48521,102.202408],[36.485001,102.204178],[36.484791,102.20594],[36.484558,102.207703],[36.484329,102.209351],[36.48407,102.210953],[36.483749,102.212486],[36.483391,102.214043],[36.483021,102.215584],[36.482571,102.21711],[36.482151,102.21859],[36.481731,102.220016],[36.481258,102.221397],[36.480751,102.222717],[36.48024,102.224037],[36.47971,102.225327],[36.47921,102.226562],[36.47876,102.22773],[36.478329,102.228928],[36.478088,102.230209],[36.477921,102.231552],[36.477879,102.232903],[36.477989,102.234261],[36.478088,102.235641],[36.478168,102.237137],[36.47826,102.23877],[36.47839,102.240379],[36.478519,102.241943],[36.47868,102.243439],[36.478882,102.244881],[36.47913,102.246277],[36.479408,102.247627],[36.479759,102.248993],[36.480141,102.25042],[36.480499,102.251892],[36.480862,102.253357],[36.48122,102.254807],[36.481579,102.256302],[36.481979,102.25782],[36.482441,102.259323],[36.48296,102.260757],[36.483471,102.262192],[36.48407,102.263641],[36.484718,102.265106],[36.48539,102.266541],[36.486012,102.267982],[36.48658,102.269432],[36.487011,102.270943],[36.48732,102.272476],[36.48745,102.274063],[36.487461,102.275627],[36.487289,102.277168],[36.486992,102.278641],[36.486599,102.28009],[36.486149,102.281517],[36.48563,102.282944],[36.485119,102.284378],[36.484581,102.285851],[36.4841,102.287376],[36.483749,102.28891],[36.48354,102.290466],[36.483398,102.292061],[36.483471,102.293587],[36.48362,102.29512],[36.48381,102.296677],[36.483978,102.298286],[36.484161,102.299919],[36.484341,102.301567],[36.48452,102.303177],[36.48465,102.304802],[36.484718,102.306412],[36.484749,102.307991],[36.484741,102.309563],[36.484699,102.311142],[36.484612,102.312683],[36.484482,102.314201],[36.484291,102.315689],[36.484081,102.317146],[36.483829,102.31855],[36.483559,102.319923],[36.483261,102.321312],[36.48291,102.322769],[36.482632,102.324226],[36.482399,102.325684],[36.482201,102.327171],[36.482059,102.328697],[36.48196,102.330231],[36.48185,102.331787],[36.48175,102.333397],[36.481651,102.33503],[36.481541,102.336693],[36.481441,102.338341],[36.4813,102.339897],[36.481152,102.341423],[36.48093,102.342857],[36.480652,102.344177],[36.480251,102.345413],[36.47982,102.346573],[36.479279,102.347778],[36.478661,102.348984],[36.477901,102.350281],[36.477112,102.351631],[36.476299,102.352989],[36.475491,102.354332],[36.47472,102.355698],[36.474079,102.357162],[36.473549,102.358688],[36.473122,102.360329],[36.472778,102.361992],[36.472519,102.363678],[36.47226,102.365356],[36.472,102.367058],[36.471741,102.368736],[36.471489,102.370407],[36.471241,102.372093],[36.471001,102.373756],[36.470749,102.375412],[36.47049,102.377068],[36.47023,102.378731],[36.46999,102.380379],[36.46973,102.382027],[36.469398,102.383659],[36.469101,102.385353],[36.468819,102.387062],[36.468571,102.388809],[36.468391,102.390533],[36.468281,102.392227],[36.468201,102.393929],[36.46817,102.395607],[36.46822,102.397293],[36.468311,102.398956],[36.468418,102.400627],[36.46854,102.402298],[36.46867,102.403969],[36.4688,102.405609],[36.468929,102.40728],[36.469059,102.409012],[36.46917,102.410759],[36.46925,102.412483],[36.469299,102.414177],[36.46928,102.415909],[36.469231,102.417641],[36.46909,102.419342],[36.468929,102.421013],[36.468739,102.422737],[36.468529,102.424477],[36.468342,102.426208],[36.468151,102.427872],[36.46796,102.429443],[36.467758,102.430946],[36.467579,102.432426],[36.467388,102.433937],[36.467171,102.435501],[36.466999,102.43705],[36.466881,102.438629],[36.466801,102.440239],[36.466751,102.441872],[36.46674,102.443466],[36.46677,102.445053],[36.466801,102.446579],[36.466801,102.448067],[36.46674,102.449516],[36.466549,102.450996],[36.466309,102.452454],[36.4659,102.453903],[36.465401,102.455292],[36.464828,102.456596],[36.464211,102.457817],[36.463581,102.459007],[36.46294,102.460167],[36.462299,102.461288],[36.461739,102.462334],[36.461151,102.463387],[36.460579,102.464439],[36.45993,102.465591],[36.45916,102.467003],[36.458431,102.468513],[36.457821,102.470093],[36.457352,102.471764],[36.457008,102.473488],[36.456791,102.475258],[36.4566,102.477028],[36.45644,102.47876],[36.456329,102.480461],[36.456181,102.482147],[36.456032,102.483803],[36.455952,102.485474],[36.455891,102.48716],[36.45591,102.488869],[36.455978,102.490601],[36.4561,102.492317],[36.45628,102.494019],[36.456459,102.495728],[36.456589,102.497452],[36.45657,102.499168],[36.456371,102.500893],[36.45607,102.502541],[36.455582,102.504173],[36.45496,102.50576],[36.45438,102.507317],[36.453819,102.508827],[36.453251,102.510307],[36.45274,102.511742],[36.452179,102.513206],[36.451561,102.514618],[36.45089,102.516006],[36.45015,102.517303],[36.44923,102.51857],[36.448299,102.519783],[36.447399,102.520927],[36.446529,102.522049],[36.445629,102.523178],[36.444729,102.524338],[36.443859,102.525436],[36.443008,102.526543],[36.442249,102.52755],[36.44162,102.528481],[36.441051,102.529404],[36.440578,102.530243],[36.440128,102.531029],[36.43969,102.532089],[36.439209,102.533524],[36.438808,102.53508],[36.43853,102.536713],[36.4384,102.53833],[36.438389,102.539978],[36.438499,102.541557],[36.438751,102.543022],[36.439079,102.544373],[36.439468,102.545677],[36.439899,102.546959],[36.44035,102.548233],[36.440811,102.549522],[36.441269,102.550812],[36.441669,102.552162],[36.442009,102.553596],[36.442211,102.555061],[36.442242,102.55658],[36.442051,102.558067],[36.44173,102.559517],[36.441269,102.56089],[36.440651,102.562233],[36.43996,102.563477],[36.439201,102.564728],[36.438412,102.565933],[36.43763,102.567123],[36.43684,102.568329],[36.43605,102.569527],[36.43528,102.570717],[36.43449,102.57193],[36.433681,102.573174],[36.43288,102.574402],[36.432121,102.575684],[36.431419,102.576973],[36.430759,102.578323],[36.430141,102.579697],[36.429531,102.5811],[36.42897,102.582497],[36.428459,102.583946],[36.427971,102.585457],[36.42757,102.587013],[36.4272,102.588516],[36.42683,102.590019],[36.426521,102.591553],[36.426239,102.593063],[36.4259,102.594582],[36.42551,102.596077],[36.425091,102.597572],[36.424599,102.599121],[36.424049,102.60067],[36.423489,102.602203],[36.422932,102.603737],[36.422352,102.605301],[36.42178,102.606827],[36.42123,102.60833],[36.420719,102.609802],[36.420238,102.611267],[36.419849,102.612663],[36.419529,102.614037],[36.419258,102.615433],[36.41898,102.616821],[36.41869,102.618233],[36.418468,102.619659],[36.418301,102.621063],[36.41819,102.622437],[36.41806,102.623863],[36.417931,102.625282],[36.417809,102.626678],[36.41769,102.628036],[36.417568,102.629356],[36.41745,102.630707],[36.417339,102.632027],[36.417221,102.633324],[36.41711,102.63459],[36.417,102.635918],[36.416828,102.637367],[36.416611,102.638893],[36.416279,102.640312],[36.415859,102.641762],[36.415352,102.643158],[36.414768,102.644478],[36.414131,102.645714],[36.413441,102.646812],[36.412739,102.64785],[36.411991,102.648811],[36.411201,102.649727],[36.410412,102.650673],[36.40955,102.651558],[36.40871,102.652481],[36.407871,102.653397],[36.407082,102.65432],[36.406368,102.655373],[36.405788,102.656548],[36.405411,102.657738],[36.405239,102.658928],[36.40517,102.660103],[36.405258,102.661217],[36.405491,102.662277],[36.4058,102.663422],[36.406132,102.664673],[36.406269,102.666008],[36.40617,102.667488],[36.405979,102.668938],[36.405548,102.670311],[36.40501,102.6716],[36.404251,102.672897],[36.4034,102.674133],[36.402451,102.675148],[36.401409,102.675972],[36.400311,102.676628],[36.399181,102.677101],[36.398029,102.677467],[36.396889,102.677834],[36.395802,102.678284],[36.364868,102.688026],[36.36396,102.688309],[36.362999,102.688637],[36.362,102.68911],[36.361,102.689774],[36.3601,102.690628],[36.35936,102.691597],[36.358742,102.692703],[36.358269,102.693863],[36.357868,102.695084],[36.357529,102.696289],[36.357231,102.69751],[36.356941,102.698799],[36.35667,102.700218],[36.356491,102.701668],[36.356461,102.703102],[36.35659,102.704483],[36.356838,102.70578],[36.357239,102.707047],[36.357792,102.708229],[36.358471,102.709267],[36.35918,102.710274],[36.35981,102.711349],[36.360279,102.71257],[36.360569,102.713837],[36.36071,102.715134],[36.360661,102.716423],[36.360439,102.717644],[36.360062,102.718781],[36.35965,102.720009],[36.3591,102.721207],[36.35844,102.722366],[36.357651,102.723473],[36.356758,102.724503],[36.355801,102.725403],[36.354801,102.726173],[36.35376,102.726898],[36.35268,102.727661],[36.351768,102.728653],[36.351051,102.729797],[36.350521,102.731071],[36.350109,102.732437],[36.349739,102.73391],[36.349369,102.735382],[36.348991,102.736839],[36.348671,102.738258],[36.348381,102.739609],[36.347988,102.741013],[36.34753,102.742332],[36.34005,102.754784],[36.339161,102.755432],[36.338169,102.756142],[36.33712,102.75695],[36.33596,102.757759],[36.334949,102.758667],[36.334141,102.75975],[36.33358,102.760887],[36.33321,102.76194],[36.332981,102.762993],[36.332859,102.764],[36.332878,102.765083],[36.333118,102.766228],[36.333401,102.767479],[36.333641,102.76873],[36.333832,102.77002],[36.33387,102.771461],[36.333691,102.773102],[36.333351,102.774803],[36.333031,102.776466],[36.33279,102.778137],[36.332611,102.779831],[36.33255,102.781532],[36.332619,102.783272],[36.332779,102.784943],[36.333,102.786591],[36.333241,102.788223],[36.333469,102.789871],[36.33371,102.791519],[36.333961,102.793167],[36.334221,102.794807],[36.334469,102.796463],[36.334751,102.798119],[36.335018,102.799782],[36.33527,102.80146],[36.335522,102.803047],[36.335701,102.804604],[36.335709,102.806122],[36.335571,102.80764],[36.33527,102.809128],[36.334789,102.810516],[36.33424,102.811836],[36.333691,102.813164],[36.333199,102.814468],[36.332821,102.815819],[36.33255,102.817177],[36.332378,102.818512],[36.332352,102.819801],[36.332409,102.821037],[36.332481,102.82225],[36.332569,102.823647],[36.33268,102.825363],[36.332802,102.827103],[36.33292,102.828842],[36.333038,102.830582],[36.33316,102.832314],[36.333271,102.834053],[36.333302,102.83577],[36.333069,102.837486],[36.332649,102.839211],[36.332062,102.840851],[36.331589,102.842529],[36.331371,102.844269],[36.33147,102.846001],[36.331718,102.847679],[36.332001,102.849373],[36.33226,102.851051],[36.332458,102.852707],[36.332451,102.854446],[36.33223,102.856232],[36.331841,102.85791],[36.331322,102.859482],[36.330509,102.860924],[36.32962,102.862282],[36.328651,102.863586],[36.327679,102.864929],[36.326698,102.866257],[36.325729,102.867592],[36.32476,102.868896],[36.323879,102.87027],[36.323071,102.871727],[36.322418,102.873322],[36.321899,102.874947],[36.321522,102.87661],[36.32122,102.878304],[36.32093,102.879982],[36.32061,102.881683],[36.32021,102.883362],[36.319729,102.885094],[36.31918,102.886726],[36.318581,102.888237],[36.31789,102.889702],[36.31715,102.891113],[36.31636,102.892509],[36.31546,102.893852],[36.31448,102.895157],[36.313461,102.896408],[36.312439,102.897636],[36.311409,102.898888],[36.310379,102.900078],[36.309341,102.901283],[36.308311,102.902496],[36.30732,102.903763],[36.3064,102.905037],[36.305618,102.906418],[36.304939,102.907898],[36.304379,102.90947],[36.30394,102.91111],[36.303631,102.912811],[36.303459,102.914543],[36.303349,102.916283],[36.303249,102.918022],[36.303169,102.919777],[36.303082,102.921577],[36.30299,102.923393],[36.302891,102.925148],[36.302811,102.926842],[36.302719,102.928467],[36.30275,102.930069],[36.302879,102.931648],[36.30307,102.933121],[36.303219,102.934509],[36.303249,102.935883],[36.303261,102.937149],[36.303242,102.938301],[36.303188,102.939346],[36.30312,102.940231],[36.302509,102.94854],[36.302429,102.949707],[36.302299,102.951012],[36.302052,102.952461],[36.30167,102.954018],[36.301109,102.95565],[36.300381,102.957191],[36.29958,102.958641],[36.298752,102.96006],[36.297901,102.961487],[36.297039,102.962936],[36.296181,102.964371],[36.29533,102.96582],[36.29446,102.967308],[36.293629,102.968842],[36.292938,102.970451],[36.292339,102.972061],[36.291771,102.973679],[36.291199,102.975304],[36.290668,102.976952],[36.290089,102.978577],[36.289429,102.980171],[36.288651,102.981689],[36.287769,102.983124],[36.286812,102.984482],[36.285789,102.985733],[36.284691,102.986877],[36.283539,102.987923],[36.282318,102.988853],[36.281071,102.989723],[36.279819,102.990578],[36.278629,102.991524],[36.2775,102.992592],[36.276402,102.993752],[36.275372,102.994957],[36.274429,102.99633],[36.273571,102.99781],[36.272812,102.999336],[36.27206,103.000877],[36.271278,103.002441],[36.2705,103.004028],[36.26984,103.0056],[36.269218,103.007156],[36.268581,103.008713],[36.267792,103.010246],[36.267071,103.011818],[36.266232,103.013313],[36.265228,103.014641],[36.264111,103.015762],[36.262798,103.016663],[36.26141,103.017357],[36.26004,103.017838],[36.258659,103.018257],[36.257309,103.018677],[36.255932,103.019127],[36.25457,103.019524],[36.25322,103.019897],[36.251839,103.020363],[36.250542,103.02108],[36.249359,103.022057],[36.248291,103.023262],[36.247379,103.024658],[36.24667,103.026222],[36.245949,103.027779],[36.245079,103.029182],[36.24408,103.030457],[36.243038,103.031708],[36.241989,103.032951],[36.240891,103.034233],[36.23983,103.035477],[36.23877,103.03672],[36.237789,103.037971],[36.236752,103.039223],[36.23576,103.040527],[36.234989,103.04203],[36.234489,103.043694],[36.234299,103.045448],[36.23436,103.047256],[36.234612,103.049057],[36.234859,103.050789],[36.234909,103.052551],[36.234669,103.054314],[36.23418,103.055977],[36.233521,103.057579],[36.232681,103.059013],[36.2318,103.060432],[36.230919,103.061852],[36.230049,103.063278],[36.229179,103.064713],[36.228291,103.066116],[36.227409,103.067543],[36.226589,103.068893],[36.225819,103.070343],[36.225121,103.071907],[36.224529,103.073502],[36.223999,103.075157],[36.22348,103.076859],[36.223,103.07856],[36.222569,103.080292],[36.22208,103.081963],[36.2215,103.083603],[36.22084,103.085167],[36.220119,103.08667],[36.219379,103.088173],[36.218639,103.089668],[36.217918,103.091179],[36.21722,103.092697],[36.21656,103.094208],[36.215981,103.095863],[36.2155,103.09758],[36.215191,103.099319],[36.214958,103.101059],[36.21476,103.102783],[36.214439,103.104477],[36.213909,103.106148],[36.21312,103.107712],[36.21209,103.1091],[36.211048,103.11039],[36.210018,103.111679],[36.20903,103.112991],[36.208172,103.114464],[36.207531,103.116043],[36.207211,103.117798],[36.207008,103.119583],[36.206829,103.121361],[36.206631,103.123161],[36.206459,103.124924],[36.20628,103.126694],[36.2061,103.128464],[36.205921,103.130234],[36.205811,103.132004],[36.20578,103.133774],[36.205841,103.135551],[36.205971,103.137329],[36.20612,103.139122],[36.206249,103.140907],[36.206322,103.142693],[36.206268,103.144447],[36.206039,103.146172],[36.205601,103.147781],[36.205009,103.1493],[36.204239,103.150772],[36.20332,103.152107],[36.202358,103.153252],[36.201359,103.154373],[36.200371,103.155518],[36.199459,103.156754],[36.198689,103.158157],[36.198021,103.159721],[36.19754,103.161339],[36.197262,103.163033],[36.197151,103.164787],[36.19722,103.166573],[36.197369,103.168312],[36.19754,103.170013],[36.197659,103.171692],[36.197681,103.173317],[36.19746,103.174927],[36.197029,103.176422],[36.196381,103.177856],[36.19553,103.179077],[36.194611,103.180206],[36.193699,103.18132],[36.192829,103.182426],[36.191952,103.183563],[36.191071,103.184753],[36.190231,103.185966],[36.189449,103.187233],[36.188648,103.188507],[36.187698,103.189781],[36.186691,103.190971],[36.18565,103.192047],[36.184521,103.193123],[36.18338,103.194138],[36.18224,103.195129],[36.18108,103.196098],[36.180031,103.197189],[36.17907,103.198433],[36.17823,103.199791],[36.177589,103.201393],[36.17709,103.203041],[36.176739,103.204681],[36.176399,103.206306],[36.17598,103.207893],[36.17548,103.209412],[36.174858,103.210854],[36.174191,103.212288],[36.173538,103.213852],[36.172989,103.2155],[36.172649,103.217247],[36.172531,103.219101],[36.172668,103.221329],[36.172939,103.22316],[36.173222,103.224876],[36.1735,103.226547],[36.173752,103.228127],[36.173939,103.229721],[36.174179,103.231247],[36.174438,103.232758],[36.174648,103.234306],[36.174759,103.235893],[36.17474,103.237457],[36.17469,103.239113],[36.174622,103.240784],[36.1745,103.242447],[36.174511,103.244179],[36.174648,103.245949],[36.17495,103.247719],[36.175381,103.249428],[36.175941,103.251106],[36.176579,103.252762],[36.177219,103.254372],[36.177799,103.255951],[36.178169,103.257561],[36.178371,103.259117],[36.178391,103.260643],[36.178268,103.262154],[36.178009,103.263657],[36.177662,103.26506],[36.177181,103.266342],[36.176559,103.267609],[36.175961,103.268806],[36.175381,103.269981],[36.17482,103.271133],[36.174301,103.27227],[36.17384,103.273376],[36.17345,103.274384],[36.173161,103.275284],[36.172939,103.27607],[36.172798,103.276749],[36.17268,103.277298],[36.172619,103.277718],[36.172619,103.278023],[36.17255,103.278267],[36.172482,103.278526],[36.172138,103.279694],[36.172081,103.279877],[36.171959,103.280159],[36.171791,103.280441],[36.17173,103.280579],[36.171711,103.280663],[36.171661,103.280769],[36.171638,103.280807],[36.1716,103.280853],[36.171551,103.280937],[36.171391,103.281303],[36.17112,103.282066],[36.170689,103.283333],[36.170292,103.284767],[36.170071,103.286293],[36.169991,103.287849],[36.170078,103.289436],[36.1702,103.291023],[36.170231,103.29258],[36.170151,103.293983],[36.169941,103.295372],[36.169571,103.296951],[36.16851,103.305054],[36.168419,103.306953],[36.16827,103.308723],[36.16785,103.310417],[36.167179,103.311996],[36.166271,103.313431],[36.16523,103.314774],[36.1642,103.316132],[36.163361,103.317711],[36.163029,103.31881],[36.162781,103.320084],[36.162498,103.325623],[36.162251,103.328667],[36.161888,103.330269],[36.161179,103.332024],[36.16016,103.333656],[36.157082,103.338173],[36.155689,103.340042],[36.154961,103.340767],[36.153721,103.341583],[36.148899,103.343163],[36.148109,103.343552],[36.1474,103.344063],[36.14653,103.344963],[36.142269,103.350891],[36.141861,103.351784],[36.141548,103.352837],[36.141392,103.353622],[36.141312,103.354942],[36.141312,103.356323],[36.141521,103.3582],[36.142639,103.366814],[36.14333,103.372566],[36.14349,103.37439],[36.143551,103.378151],[36.14362,103.380043],[36.143951,103.382278],[36.144451,103.38401],[36.145111,103.385612],[36.15411,103.398842],[36.155128,103.400093],[36.15612,103.401283],[36.157051,103.402473],[36.15781,103.403847],[36.158379,103.405357],[36.158821,103.406967],[36.159088,103.408684],[36.159321,103.410454],[36.159531,103.412643],[36.159882,103.414429],[36.16058,103.416023],[36.161499,103.417427],[36.16264,103.418617],[36.163952,103.419487],[36.165371,103.420067],[36.166809,103.420593],[36.168251,103.421089],[36.169708,103.421608],[36.17115,103.422272],[36.172501,103.423119],[36.173721,103.424263],[36.174858,103.425537],[36.175659,103.427223],[36.176361,103.429291],[36.176991,103.431534],[36.177189,103.432838],[36.177212,103.434021],[36.17717,103.434967],[36.17688,103.436829],[36.17598,103.441719],[36.175621,103.44455],[36.175591,103.446701],[36.176281,103.450691],[36.176701,103.452438],[36.177071,103.454086],[36.177361,103.455711],[36.17746,103.457237],[36.177158,103.456787],[36.176998,103.456589],[36.1768,103.456467],[36.176449,103.456459],[36.176331,103.456612],[36.17625,103.456818],[36.176201,103.457039],[36.176231,103.457268],[36.176331,103.457474],[36.176491,103.457603],[36.176689,103.457733],[36.17691,103.457787],[36.177349,103.458008],[36.177731,103.458298],[36.17804,103.458687],[36.178211,103.459213],[36.178299,103.459747],[36.178322,103.460243],[36.17831,103.460457],[36.178242,103.460709],[36.178249,103.46109],[36.177689,103.462067],[36.177311,103.462547],[36.1772,103.462738],[36.177109,103.462982],[36.17701,103.463928],[36.176899,103.464378],[36.1768,103.4645],[36.175251,103.465729],[36.174911,103.467194],[36.17487,103.467773],[36.174591,103.469757],[36.174309,103.470833],[36.174229,103.471077],[36.173988,103.471497],[36.173538,103.471733],[36.174229,103.471489],[36.17416,103.471832],[36.173969,103.472],[36.173069,103.475014],[36.171669,103.478172],[36.171021,103.480209],[36.170811,103.482384],[36.170441,103.482681],[36.169361,103.482674],[36.168732,103.482658],[36.167721,103.482674],[36.167332,103.482841],[36.16708,103.483437],[36.16634,103.486961],[36.165279,103.491341],[36.164589,103.493446],[36.163799,103.494377],[36.162411,103.495079],[36.155079,103.497543],[36.15213,103.498734],[36.151791,103.49884],[36.14447,103.500648],[36.14299,103.501266],[36.142841,103.501373],[36.141708,103.502586],[36.14072,103.503593],[36.14006,103.504601],[36.138741,103.508942],[36.138149,103.511543],[36.137932,103.513313],[36.138039,103.518738],[36.138,103.522591],[36.137661,103.524048],[36.136459,103.526466],[36.136051,103.526978],[36.13266,103.529221],[36.12867,103.530296],[36.123032,103.531723],[36.122059,103.532089],[36.11982,103.533241],[36.116169,103.535553],[36.115021,103.53627],[36.11412,103.537117],[36.11311,103.538673],[36.11042,103.545486],[36.109219,103.548241],[36.1087,103.550247],[36.108509,103.552002],[36.108749,103.556358],[36.108971,103.55764],[36.109459,103.559082],[36.1115,103.562927],[36.11195,103.564087],[36.111801,103.564117],[36.11142,103.564163],[36.11076,103.564323],[36.109909,103.56456],[36.109112,103.56485],[36.10836,103.565163],[36.10775,103.56543],[36.10733,103.565666],[36.10696,103.566017],[36.10664,103.566307],[36.10622,103.566803],[36.105869,103.566978],[36.105518,103.566887],[36.105099,103.56665],[36.104721,103.566406],[36.104382,103.566269],[36.104061,103.566223],[36.10379,103.566322],[36.1035,103.566559],[36.103199,103.566811],[36.10268,103.567261],[36.101822,103.567711],[36.100868,103.568237],[36.10009,103.569122],[36.09935,103.569992],[36.09861,103.57077],[36.098011,103.571213],[36.097469,103.571411],[36.096951,103.571587],[36.096409,103.571777],[36.095909,103.57196],[36.09539,103.572144],[36.09481,103.572159],[36.0942,103.572037],[36.09362,103.571877],[36.093029,103.571693],[36.092361,103.571571],[36.091492,103.57151],[36.09053,103.571442],[36.089512,103.571136],[36.088509,103.570709],[36.08754,103.570297],[36.086658,103.569923],[36.085831,103.569489],[36.085011,103.568947],[36.08429,103.568451],[36.08358,103.568001],[36.08279,103.567543],[36.081951,103.567322],[36.08112,103.567436],[36.080292,103.567734],[36.07943,103.567833],[36.078571,103.567574],[36.077759,103.567329],[36.077,103.567253],[36.076241,103.567482],[36.075581,103.568031],[36.074841,103.568703],[36.074081,103.569122],[36.07338,103.569473],[36.07267,103.569794],[36.071899,103.57016],[36.071281,103.570473],[36.07069,103.570763],[36.070011,103.570992],[36.069382,103.570869],[36.06881,103.570473],[36.06813,103.569923],[36.067268,103.569206],[36.06641,103.56852],[36.065659,103.56781],[36.065121,103.567162],[36.06464,103.566566],[36.064171,103.566093],[36.063671,103.565788],[36.06316,103.565529],[36.062641,103.565269],[36.062092,103.564987],[36.06168,103.564552],[36.061611,103.563751],[36.061699,103.562576],[36.061779,103.561279],[36.061821,103.56012],[36.06144,103.559196],[36.060928,103.558563],[36.060329,103.558067],[36.05983,103.557602],[36.059681,103.556778],[36.05991,103.555649],[36.060169,103.55442],[36.06041,103.553177],[36.060741,103.552063],[36.061352,103.55098],[36.061878,103.549911],[36.062229,103.54892],[36.062469,103.547882],[36.062538,103.546783],[36.062408,103.54567],[36.062168,103.544594],[36.061852,103.543556],[36.061321,103.54274],[36.060532,103.542427],[36.0597,103.542511],[36.058929,103.542641],[36.05827,103.542763],[36.057571,103.542877],[36.05674,103.54303],[36.055882,103.543091],[36.054989,103.543007],[36.054211,103.543007],[36.053532,103.54306],[36.05267,103.54364],[36.05183,103.544357],[36.051189,103.544891],[36.050709,103.545082],[36.050079,103.544983],[36.04929,103.544731],[36.048359,103.544601],[36.047379,103.544884],[36.04657,103.545647],[36.04586,103.546608],[36.045101,103.547447],[36.044239,103.547958],[36.043221,103.548027],[36.04221,103.547821],[36.041279,103.547829],[36.04044,103.548058],[36.039669,103.548241],[36.039051,103.548279],[36.03828,103.548019],[36.037239,103.548073],[36.036171,103.548233],[36.035,103.548187],[36.03418,103.548042],[36.033569,103.547798],[36.033138,103.547546],[36.03281,103.547379],[36.032139,103.547073],[36.0313,103.546738],[36.03046,103.546089],[36.029499,103.545258],[36.028412,103.544601],[36.027321,103.544006],[36.02631,103.543457],[36.02544,103.543007],[36.0247,103.543068],[36.024109,103.543259],[36.023312,103.542931],[36.0224,103.542397],[36.021481,103.541931],[36.02066,103.541771],[36.01923,103.541351],[36.01841,103.540916],[36.017712,103.540497],[36.01722,103.540237],[36.01685,103.53994],[36.016548,103.539543],[36.0163,103.538963],[36.01622,103.538322],[36.016319,103.537514],[36.016602,103.536491],[36.016899,103.535431],[36.017239,103.534363],[36.01749,103.533386],[36.01749,103.532539],[36.017208,103.531807],[36.0168,103.531281],[36.016399,103.530853],[36.016022,103.53038],[36.015701,103.529823],[36.015511,103.529167],[36.015419,103.528473],[36.015541,103.527573],[36.015862,103.526611],[36.01627,103.525742],[36.01672,103.524986],[36.0172,103.524429],[36.01767,103.52401],[36.01828,103.523903],[36.019169,103.524139],[36.020119,103.524406],[36.02108,103.524277],[36.0219,103.523712],[36.02269,103.523102],[36.023571,103.522758],[36.02457,103.522697],[36.025539,103.52256],[36.026371,103.522072],[36.027069,103.521233],[36.027729,103.520287],[36.028469,103.519417],[36.02932,103.518646],[36.03019,103.517883],[36.031052,103.517113],[36.031799,103.516441],[36.032398,103.515793],[36.032879,103.514977],[36.033272,103.514061],[36.033539,103.513077],[36.033741,103.512009],[36.034111,103.510986],[36.034561,103.509987],[36.03484,103.508858],[36.034859,103.507698],[36.034721,103.506607],[36.034519,103.505722],[36.03434,103.504883],[36.03421,103.503868],[36.034302,103.502808],[36.034489,103.501747],[36.034618,103.500687],[36.034512,103.499649],[36.034328,103.498642],[36.034161,103.49765],[36.03397,103.496681],[36.033791,103.495697],[36.033691,103.494698],[36.033852,103.493683],[36.0341,103.492653],[36.034271,103.491653],[36.034851,103.490936],[36.03537,103.490097],[36.0355,103.489067],[36.035511,103.488098],[36.035259,103.487198],[36.03503,103.486282],[36.035271,103.48539],[36.035851,103.48455],[36.03611,103.483437],[36.036289,103.482193],[36.036461,103.480927],[36.03656,103.479729],[36.036449,103.478622],[36.036308,103.477608],[36.036549,103.476707],[36.037239,103.476028],[36.03809,103.475502],[36.0438,103.472023],[36.044491,103.471581],[36.044979,103.47113],[36.04533,103.470642],[36.045639,103.469948],[36.045769,103.469147],[36.045811,103.468369],[36.04591,103.467506],[36.046101,103.466667],[36.046398,103.46582],[36.046768,103.464973],[36.047211,103.464149],[36.04768,103.463463],[36.048019,103.462967],[36.048401,103.462517],[36.048851,103.461937],[36.04937,103.461304],[36.04995,103.460564],[36.050499,103.459877],[36.051048,103.45919],[36.05164,103.458443],[36.052231,103.457718],[36.052872,103.456917],[36.053539,103.455994],[36.05407,103.454971],[36.054401,103.45388],[36.054588,103.452766],[36.054691,103.451637],[36.054779,103.450531],[36.054981,103.449379],[36.055248,103.44809],[36.055519,103.446823],[36.055759,103.445663],[36.055969,103.444656],[36.055969,103.443802],[36.05571,103.442848],[36.055401,103.441811],[36.05508,103.44072],[36.05476,103.439629],[36.05444,103.438599],[36.054131,103.437607],[36.053871,103.436653],[36.053699,103.435631],[36.0536,103.434662],[36.053501,103.4338],[36.053391,103.43293],[36.053249,103.431831],[36.053051,103.43071],[36.052872,103.429764],[36.052731,103.428963],[36.052608,103.428207],[36.052471,103.427383],[36.052349,103.426514],[36.052189,103.425667],[36.051991,103.424957],[36.0518,103.424332],[36.051609,103.42366],[36.051411,103.422951],[36.051151,103.422188],[36.05072,103.421577],[36.05019,103.42115],[36.049648,103.420738],[36.04911,103.420326],[36.048531,103.419884],[36.047852,103.419342],[36.047081,103.418777],[36.046211,103.418312],[36.04528,103.417999],[36.044319,103.417847],[36.043331,103.41774],[36.042358,103.417633],[36.041401,103.417557],[36.040531,103.417473],[36.039688,103.417389],[36.038879,103.417313],[36.038071,103.417229],[36.037331,103.417152],[36.036671,103.417038],[36.03606,103.416924],[36.03553,103.416801],[36.03513,103.416687],[36.034931,103.416634],[36.034752,103.416557],[36.033508,103.416237],[36.032879,103.416054],[36.032101,103.415817],[36.031219,103.415558],[36.030369,103.41526],[36.029572,103.414803],[36.028801,103.414139],[36.028091,103.413544],[36.02739,103.413071],[36.026649,103.412933],[36.02597,103.413177],[36.02533,103.41362],[36.0247,103.41407],[36.02409,103.414139],[36.02359,103.41378],[36.02317,103.413292],[36.02272,103.41275],[36.022209,103.412132],[36.02158,103.411392],[36.020859,103.410553],[36.020149,103.409683],[36.01939,103.40892],[36.01857,103.408272],[36.0177,103.407707],[36.016781,103.407303],[36.01585,103.406937],[36.014961,103.406616],[36.01416,103.406326],[36.013451,103.405968],[36.012798,103.40535],[36.012291,103.404457],[36.01181,103.40332],[36.011269,103.402077],[36.010719,103.400902],[36.010208,103.39978],[36.00972,103.398743],[36.009071,103.397873],[36.008339,103.397087],[36.007671,103.396378],[36.00716,103.395576],[36.006851,103.394493],[36.00663,103.393227],[36.006371,103.391907],[36.005951,103.390648],[36.005299,103.389511],[36.004532,103.388588],[36.003651,103.387939],[36.002659,103.387642],[36.00169,103.387741],[36.000679,103.387947],[35.99968,103.388184],[35.99876,103.388367],[35.99791,103.388344],[35.997021,103.387993],[35.996109,103.387543],[35.995152,103.387077],[35.994228,103.386673],[35.99342,103.386421],[35.99268,103.38665],[35.992088,103.38726],[35.99144,103.387802],[35.990589,103.388161],[35.989651,103.388153],[35.98872,103.387917],[35.98782,103.38755],[35.98695,103.387047],[35.986061,103.386543],[35.985241,103.386017],[35.984661,103.385193],[35.984119,103.384323],[35.983421,103.383781],[35.982712,103.383301],[35.982182,103.382423],[35.981739,103.38134],[35.981319,103.380302],[35.980881,103.379242],[35.98045,103.378166],[35.98003,103.377159],[35.979622,103.376213],[35.979359,103.375229],[35.979252,103.374123],[35.978951,103.373123],[35.97839,103.372238],[35.977871,103.371323],[35.977631,103.370201],[35.977291,103.369133],[35.9767,103.36837],[35.9762,103.367844],[35.975719,103.367332],[35.975201,103.366882],[35.974529,103.366463],[35.973789,103.365952],[35.97324,103.365128],[35.97274,103.364227],[35.97226,103.363327],[35.971748,103.362427],[35.970909,103.361908],[35.96991,103.361443],[35.968899,103.360977],[35.967949,103.360443],[35.96703,103.359848],[35.966141,103.359261],[35.96529,103.358704],[35.964481,103.358124],[35.963871,103.357224],[35.963322,103.35611],[35.962742,103.355072],[35.96204,103.354179],[35.96133,103.353317],[35.96072,103.352547],[35.960159,103.351891],[35.959671,103.351433],[35.959,103.350822],[35.958199,103.350197],[35.957401,103.349541],[35.9566,103.3489],[35.955761,103.34832],[35.954899,103.347893],[35.95401,103.347527],[35.953079,103.347183],[35.952209,103.346848],[35.951519,103.346367],[35.951019,103.345596],[35.95052,103.344849],[35.949871,103.344421],[35.94907,103.344223],[35.948292,103.344101],[35.947639,103.344002],[35.946999,103.343887],[35.946301,103.343773],[35.945591,103.343651],[35.944809,103.343529],[35.944,103.343323],[35.943291,103.342857],[35.942692,103.342148],[35.942131,103.341408],[35.94154,103.340843],[35.940899,103.340607],[35.94035,103.340424],[35.93993,103.34037],[35.939491,103.340332],[35.938862,103.340317],[35.938301,103.340363],[35.937832,103.340408],[35.937439,103.340424],[35.93705,103.340431],[35.936581,103.340317],[35.936211,103.339737],[35.93605,103.339012],[35.93589,103.338287],[35.935741,103.337608],[35.935551,103.336746],[35.93536,103.335999],[35.935181,103.33535],[35.93491,103.334801],[35.934639,103.334183],[35.934662,103.333519],[35.93483,103.332878],[35.934952,103.332329],[35.93502,103.331711],[35.934879,103.331123],[35.934502,103.330612],[35.934231,103.330093],[35.934292,103.329514],[35.934471,103.328979],[35.934689,103.328453],[35.934959,103.327942],[35.93523,103.327438],[35.935558,103.326881],[35.935928,103.326302],[35.936329,103.325996],[35.93676,103.325882],[35.937099,103.325798],[35.93716,103.325638],[35.93689,103.325508],[35.9366,103.325447],[35.936371,103.325523],[35.936001,103.325783],[35.935661,103.326157],[35.93544,103.326553],[35.93528,103.326714],[35.935001,103.326576],[35.934631,103.32637],[35.934261,103.326149],[35.934132,103.325859],[35.93417,103.32534],[35.93425,103.324707],[35.93433,103.324173],[35.934429,103.323708],[35.934502,103.323181],[35.93457,103.322563],[35.934631,103.321854],[35.934711,103.32106],[35.934811,103.320267],[35.934879,103.319504],[35.934971,103.318771],[35.934929,103.318176],[35.934952,103.317688],[35.934898,103.317123],[35.934818,103.316391],[35.934792,103.315918],[35.934799,103.315819],[35.93449,103.315529],[35.934021,103.3153],[35.933731,103.315079],[35.9333,103.314484],[35.932991,103.314209],[35.93206,103.31369],[35.931179,103.313438],[35.93055,103.31308],[35.93045,103.312927],[35.930561,103.31279],[35.931301,103.312927],[35.931931,103.312729],[35.932541,103.312851],[35.93264,103.312767],[35.932671,103.312683],[35.93259,103.312553],[35.932251,103.312363],[35.93095,103.312019],[35.93042,103.3116],[35.93021,103.311493],[35.93,103.311501],[35.929619,103.311707],[35.92934,103.311974],[35.929199,103.31218],[35.929001,103.312714],[35.92902,103.312897],[35.929161,103.313431],[35.929131,103.313599],[35.92905,103.31369],[35.92836,103.313927],[35.928131,103.313873],[35.92802,103.313766],[35.927731,103.313408],[35.92757,103.313408],[35.927471,103.313507],[35.927441,103.313728],[35.92749,103.313828],[35.92778,103.314056],[35.92786,103.31427],[35.927811,103.3144],[35.927441,103.314796],[35.927219,103.315201],[35.92659,103.316589],[35.92635,103.317291],[35.92606,103.31871],[35.925869,103.31913],[35.925659,103.319351],[35.921909,103.322456],[35.921421,103.322708],[35.921211,103.322723],[35.920971,103.322647],[35.9207,103.322456],[35.92025,103.321831],[35.91988,103.321548],[35.919651,103.321533],[35.9193,103.3218],[35.91909,103.3218],[35.918961,103.321693],[35.918789,103.321426],[35.91853,103.320938],[35.91827,103.320763],[35.918091,103.320763],[35.917961,103.320847],[35.917641,103.321823],[35.917561,103.321907],[35.917419,103.321968],[35.917191,103.321877],[35.91679,103.321487],[35.916691,103.321449],[35.916561,103.321487],[35.916161,103.3218],[35.915901,103.321831],[35.914989,103.321136],[35.914841,103.321091],[35.914459,103.321136],[35.913651,103.321487],[35.913311,103.321579],[35.912979,103.321579],[35.912811,103.321503],[35.912701,103.321327],[35.912571,103.320686],[35.912449,103.320587],[35.91235,103.320618],[35.912251,103.320877],[35.912121,103.321709],[35.91201,103.322006],[35.911621,103.322807],[35.911381,103.32312],[35.911091,103.323288],[35.910511,103.323349],[35.90971,103.323288],[35.909481,103.32338],[35.909069,103.323914],[35.90884,103.324318],[35.908539,103.325203],[35.908451,103.325363],[35.907921,103.325851],[35.907841,103.326057],[35.907871,103.326271],[35.908291,103.327103],[35.908451,103.327797],[35.90844,103.328041],[35.90834,103.328178],[35.90797,103.328407],[35.9076,103.328377],[35.90731,103.328247],[35.907181,103.32814],[35.906361,103.327087],[35.906281,103.326759],[35.90596,103.326157],[35.905769,103.326073],[35.904621,103.32605],[35.90448,103.325974],[35.90419,103.325638],[35.904121,103.32547],[35.903931,103.323669],[35.90382,103.323341],[35.9034,103.322639],[35.903271,103.322327],[35.903221,103.322166],[35.903141,103.321648],[35.903191,103.321518],[35.90332,103.321419],[35.903751,103.321373],[35.90398,103.32122],[35.90406,103.321098],[35.904079,103.320961],[35.904041,103.320587],[35.903931,103.320419],[35.903801,103.320358],[35.90366,103.320343],[35.90303,103.320427],[35.902809,103.320297],[35.90266,103.32],[35.90202,103.318047],[35.90184,103.317719],[35.9016,103.317497],[35.899841,103.318741],[35.89954,103.320923],[35.899841,103.321854],[35.899891,103.322159],[35.899761,103.32328],[35.899811,103.323608],[35.900421,103.324417],[35.900829,103.325241],[35.90099,103.325394],[35.901291,103.325539],[35.901581,103.325768],[35.902,103.326828],[35.902531,103.327347],[35.90313,103.328468],[35.903351,103.329033],[35.903721,103.329483],[35.90395,103.330208],[35.903961,103.330566],[35.903881,103.330856],[35.903931,103.331078],[35.90419,103.331284],[35.90443,103.33165],[35.904701,103.331947],[35.905319,103.332397],[35.905491,103.332619],[35.905651,103.333023],[35.90554,103.333847],[35.905609,103.334068],[35.90588,103.334503],[35.9062,103.334747],[35.907101,103.335007],[35.907181,103.335159],[35.907181,103.335693],[35.907219,103.335777],[35.907341,103.335876],[35.90757,103.335876],[35.90773,103.335777],[35.907879,103.335617],[35.908119,103.33519],[35.908291,103.335121],[35.90839,103.335159],[35.908779,103.33548],[35.909451,103.335854],[35.90955,103.335991],[35.90955,103.336067],[35.90942,103.336571],[35.90942,103.336723],[35.909931,103.337753],[35.90995,103.338097],[35.90974,103.338676],[35.909679,103.33876],[35.90918,103.339058],[35.908791,103.339523],[35.908291,103.339897],[35.9081,103.339897],[35.907909,103.339653],[35.90773,103.339607],[35.9076,103.339737],[35.907501,103.340157],[35.907391,103.340317],[35.906929,103.340553],[35.90678,103.3405],[35.90641,103.34005],[35.906231,103.340027],[35.905979,103.340157],[35.90591,103.340218],[35.90575,103.340828],[35.9053,103.341309],[35.905121,103.341347],[35.904881,103.341309],[35.904751,103.3414],[35.904411,103.342293],[35.9039,103.343323],[35.903801,103.343407],[35.903419,103.343559],[35.902191,103.343681],[35.90147,103.343674],[35.901081,103.343536],[35.90065,103.343536],[35.89859,103.343857],[35.89846,103.343979],[35.89817,103.344414],[35.897621,103.344704],[35.897129,103.345703],[35.896881,103.34639],[35.896431,103.34671],[35.895969,103.346939],[35.89587,103.347069],[35.895691,103.347488],[35.89558,103.347527],[35.89534,103.347504],[35.89521,103.347527],[35.89476,103.348007],[35.89463,103.348091],[35.89418,103.348106],[35.893681,103.348648],[35.893181,103.349037],[35.892849,103.34922],[35.89254,103.349564],[35.89238,103.349663],[35.891979,103.3498],[35.890751,103.349899],[35.890461,103.349991],[35.890411,103.350182],[35.89043,103.350258],[35.890511,103.350327],[35.89156,103.35038],[35.892181,103.350471],[35.893009,103.350128],[35.893799,103.349693],[35.89444,103.349716],[35.894539,103.349617],[35.894619,103.349274],[35.894699,103.349159],[35.89558,103.349037],[35.896191,103.348778],[35.896641,103.34893],[35.897041,103.34993],[35.89719,103.350098],[35.897339,103.350098],[35.89772,103.349899],[35.8978,103.349777],[35.8978,103.349579],[35.89764,103.349007],[35.8978,103.348557],[35.897709,103.348099],[35.8978,103.347931],[35.898121,103.347954],[35.89872,103.348198],[35.899151,103.348503],[35.89925,103.348503],[35.899361,103.34832],[35.89933,103.347771],[35.89941,103.34761],[35.89954,103.347588],[35.90036,103.347977],[35.900539,103.348007],[35.90073,103.347939],[35.90081,103.347816],[35.900829,103.347687],[35.90081,103.347557],[35.90065,103.347237],[35.900631,103.347099],[35.900749,103.346939],[35.900909,103.346909],[35.90134,103.347023],[35.901581,103.347237],[35.901871,103.347633],[35.902,103.347656],[35.90229,103.347557],[35.902451,103.347679],[35.902481,103.347763],[35.902481,103.347893],[35.90239,103.34819],[35.902279,103.348427],[35.902161,103.348557],[35.901821,103.34874],[35.901421,103.349083],[35.90097,103.349548],[35.900539,103.349586],[35.900391,103.34967],[35.8992,103.351128],[35.898899,103.35125],[35.89851,103.351738],[35.897949,103.352081],[35.897701,103.352127],[35.89711,103.351883],[35.89674,103.351799],[35.89637,103.351517],[35.896191,103.351509],[35.895741,103.352219],[35.895531,103.352287],[35.895241,103.35228],[35.895111,103.352341],[35.895081,103.352386],[35.89502,103.352798],[35.89492,103.353027],[35.89476,103.353088],[35.89397,103.353027],[35.893871,103.353111],[35.893799,103.353317],[35.893951,103.354019],[35.89389,103.354156],[35.8937,103.354309],[35.893311,103.354301],[35.89315,103.354233],[35.89241,103.353683],[35.892151,103.353607],[35.892021,103.353699],[35.892021,103.35376],[35.89212,103.353859],[35.892509,103.353973],[35.89323,103.354584],[35.893391,103.35466],[35.89381,103.354607],[35.893921,103.35466],[35.89402,103.35479],[35.89415,103.355057],[35.894161,103.35524],[35.89365,103.356293],[35.893379,103.357338],[35.89333,103.357857],[35.89352,103.358528],[35.893539,103.358757],[35.89328,103.359581],[35.893101,103.36042],[35.892891,103.36097],[35.892601,103.361397],[35.892479,103.361679],[35.892399,103.362267],[35.89225,103.362717],[35.891689,103.363441],[35.891701,103.363586],[35.89183,103.36393],[35.89188,103.364227],[35.891739,103.364799],[35.891239,103.365868],[35.89119,103.366417],[35.89098,103.366737],[35.89064,103.367073],[35.890411,103.367378],[35.890461,103.367554],[35.8909,103.367996],[35.890999,103.368294],[35.890999,103.368591],[35.890789,103.369034],[35.89082,103.36924],[35.891251,103.369507],[35.89138,103.369766],[35.89138,103.370003],[35.8913,103.370537],[35.89101,103.371597],[35.890831,103.371979],[35.89056,103.372147],[35.89024,103.372467],[35.890041,103.372566],[35.88974,103.372597],[35.88937,103.372917],[35.88903,103.373154],[35.88842,103.374519],[35.888161,103.374847],[35.886051,103.37606],[35.886009,103.37616],[35.88596,103.376633],[35.885849,103.376869],[35.88541,103.377274],[35.884781,103.377457],[35.884541,103.377586],[35.88446,103.377731],[35.884411,103.378151],[35.8843,103.378258],[35.883511,103.378441],[35.88298,103.378433],[35.882721,103.378593],[35.88261,103.378754],[35.882599,103.37886],[35.882771,103.379341],[35.882801,103.379578],[35.882759,103.379761],[35.882641,103.37989],[35.881191,103.380547],[35.880939,103.38073],[35.880829,103.380997],[35.880619,103.382156],[35.880322,103.382767],[35.880291,103.38385],[35.880409,103.384117],[35.880939,103.38459],[35.881069,103.384758],[35.88121,103.385139],[35.88121,103.385368],[35.881161,103.385468],[35.880951,103.385757],[35.88076,103.385887],[35.879971,103.386147],[35.879841,103.386299],[35.879841,103.386543],[35.88002,103.386917],[35.879921,103.387154],[35.879681,103.387321],[35.87952,103.387543],[35.879551,103.387688],[35.879791,103.388077],[35.879791,103.388206],[35.879631,103.38842],[35.879021,103.388748],[35.87709,103.389458],[35.876881,103.389587],[35.87672,103.389809],[35.87672,103.389977],[35.876801,103.39016],[35.878311,103.3909],[35.878521,103.391068],[35.878559,103.39119],[35.878521,103.391258],[35.878349,103.391243],[35.87804,103.390953],[35.877689,103.39077],[35.87616,103.39035],[35.876011,103.390266],[35.875931,103.390129],[35.87603,103.389709],[35.87619,103.389503],[35.87701,103.388939],[35.878201,103.388283],[35.87825,103.388153],[35.878231,103.388077],[35.87812,103.388031],[35.877522,103.388428],[35.875599,103.389351],[35.875351,103.389648],[35.87513,103.390297],[35.875111,103.390511],[35.87524,103.390678],[35.87656,103.391373],[35.87661,103.391434],[35.876629,103.391602],[35.876541,103.391769],[35.876339,103.39193],[35.875771,103.392357],[35.875191,103.392609],[35.874691,103.392929],[35.874081,103.393051],[35.87344,103.393417],[35.871861,103.39402],[35.87075,103.394524],[35.87011,103.394608],[35.869961,103.394691],[35.86961,103.395073],[35.868111,103.395668],[35.867321,103.396179],[35.867111,103.39637],[35.867069,103.396553],[35.867081,103.396683],[35.867199,103.396843],[35.86832,103.39743],[35.869591,103.398453],[35.87022,103.398804],[35.87038,103.399048],[35.870361,103.399178],[35.870201,103.399361],[35.869431,103.399841],[35.869091,103.399986],[35.86861,103.400093],[35.868141,103.400467],[35.86787,103.400551],[35.867661,103.400681],[35.867149,103.401268],[35.867119,103.401443],[35.867149,103.401558],[35.86763,103.402008],[35.867649,103.402283],[35.867481,103.402573],[35.867161,103.402901],[35.866291,103.403427],[35.86607,103.403679],[35.865761,103.404739],[35.865841,103.406013],[35.865971,103.40625],[35.86607,103.406303],[35.866211,103.406273],[35.867451,103.405586],[35.867729,103.40551],[35.867889,103.405602],[35.86832,103.406197],[35.868839,103.406593],[35.868931,103.406731],[35.86898,103.406891],[35.868931,103.407028],[35.868771,103.407204],[35.867191,103.407806],[35.866859,103.407967],[35.866791,103.408081],[35.866791,103.408257],[35.866909,103.408417],[35.867561,103.408813],[35.867691,103.408951],[35.86776,103.409119],[35.86768,103.409271],[35.867569,103.40934],[35.86515,103.410027],[35.864929,103.410172],[35.864769,103.410393],[35.864689,103.410759],[35.864761,103.411324],[35.864731,103.411621],[35.864109,103.412628],[35.86393,103.413116],[35.863892,103.414146],[35.86396,103.414627],[35.86388,103.414917],[35.863529,103.415466],[35.863441,103.415733],[35.863411,103.416649],[35.863491,103.416946],[35.863731,103.417427],[35.86372,103.417908],[35.863781,103.418327],[35.864071,103.418747],[35.864521,103.420151],[35.864891,103.42057],[35.86499,103.420769],[35.86499,103.421059],[35.864799,103.421509],[35.86478,103.421677],[35.865089,103.422218],[35.865089,103.422607],[35.86515,103.422897],[35.865471,103.423698],[35.865509,103.424347],[35.866211,103.425583],[35.866371,103.425957],[35.866501,103.426392],[35.866631,103.427513],[35.866611,103.427803],[35.866501,103.428108],[35.866081,103.428947],[35.866081,103.429131],[35.866161,103.429199],[35.866261,103.429161],[35.86668,103.428268],[35.86694,103.427948],[35.86705,103.427917],[35.867531,103.428108],[35.867661,103.428101],[35.86779,103.428017],[35.868309,103.427551],[35.86842,103.427544],[35.868481,103.427681],[35.868301,103.427917],[35.867771,103.428368],[35.867661,103.428436],[35.867161,103.42852],[35.867001,103.428658],[35.866699,103.429367],[35.866699,103.429558],[35.866791,103.429817],[35.866791,103.430061],[35.866631,103.430191],[35.866371,103.430267],[35.86623,103.430397],[35.866119,103.430641],[35.86594,103.431297],[35.86578,103.431534],[35.865601,103.431633],[35.86512,103.431763],[35.86441,103.432266],[35.864201,103.432281],[35.863701,103.432137],[35.86356,103.432137],[35.86343,103.432259],[35.86338,103.43248],[35.863491,103.433296],[35.864361,103.435059],[35.864361,103.435333],[35.864269,103.435577],[35.864109,103.435791],[35.863621,103.436157],[35.863491,103.436699],[35.863361,103.436943],[35.862949,103.437317],[35.86245,103.437477],[35.862171,103.437668],[35.861931,103.437866],[35.861752,103.438148],[35.86166,103.438637],[35.86132,103.439491],[35.861229,103.440849],[35.86158,103.441933],[35.861771,103.44236],[35.862122,103.442917],[35.862141,103.443161],[35.862011,103.443298],[35.86132,103.443497],[35.861111,103.443932],[35.861012,103.444],[35.86031,103.444054],[35.8601,103.444153],[35.860031,103.444237],[35.860031,103.444519],[35.86034,103.444893],[35.860371,103.445053],[35.860321,103.445221],[35.86005,103.445541],[35.859909,103.445587],[35.859699,103.445587],[35.858891,103.445396],[35.85844,103.445396],[35.856571,103.445953],[35.8563,103.446091],[35.855801,103.44648],[35.855221,103.446709],[35.85482,103.446999],[35.854191,103.447113],[35.85363,103.447479],[35.852451,103.447937],[35.851891,103.448051],[35.85046,103.447929],[35.850182,103.44796],[35.84903,103.448624],[35.847549,103.449226],[35.8456,103.450958],[35.8447,103.45121],[35.844551,103.451347],[35.844379,103.451988],[35.84417,103.452217],[35.841621,103.453018],[35.84103,103.4533],[35.840721,103.453308],[35.839741,103.453018],[35.839409,103.45269],[35.839081,103.452217],[35.838791,103.451988],[35.837379,103.45195],[35.836552,103.45182],[35.836411,103.451714],[35.836281,103.4515],[35.83577,103.44986],[35.835541,103.449448],[35.834641,103.449051],[35.8339,103.448349],[35.833389,103.448067],[35.831711,103.446968],[35.831539,103.446907],[35.831089,103.446907],[35.83028,103.446663],[35.829361,103.446587],[35.82859,103.446327],[35.828239,103.44632],[35.826759,103.446579],[35.825489,103.446587],[35.823792,103.446289],[35.822731,103.446251],[35.822109,103.445961],[35.82196,103.445953],[35.821239,103.446121],[35.82066,103.446564],[35.820499,103.446617],[35.819111,103.446938],[35.816921,103.447937],[35.816559,103.448021],[35.81599,103.447937],[35.814091,103.44809],[35.81358,103.448036],[35.812801,103.448151],[35.8125,103.448067],[35.81221,103.447906],[35.812111,103.447777],[35.81205,103.447578],[35.81213,103.446388],[35.812031,103.445686],[35.812229,103.444946],[35.812241,103.444763],[35.812191,103.44458],[35.811161,103.443619],[35.810452,103.442787],[35.809799,103.442299],[35.809681,103.442131],[35.808922,103.440361],[35.808731,103.440071],[35.80843,103.439758],[35.808281,103.439697],[35.807869,103.439728],[35.807449,103.439537],[35.806911,103.439407],[35.805611,103.438591],[35.804291,103.438309],[35.80405,103.438179],[35.803631,103.43782],[35.802731,103.437592],[35.802341,103.437393],[35.801941,103.437286],[35.80056,103.437141],[35.7995,103.437111],[35.798691,103.437286],[35.798481,103.43721],[35.798012,103.436867],[35.797791,103.436821],[35.795181,103.43663],[35.793781,103.436768],[35.792801,103.436974],[35.79229,103.43692],[35.79073,103.436157],[35.78941,103.435959],[35.788971,103.435799],[35.787891,103.434837],[35.787312,103.434486],[35.786201,103.434097],[35.785431,103.434029],[35.783321,103.432663],[35.78191,103.431961],[35.780861,103.431618],[35.780449,103.431396],[35.779381,103.431396],[35.77903,103.431473],[35.778332,103.431137],[35.777512,103.431],[35.77626,103.430901],[35.77512,103.430588],[35.774719,103.430557],[35.77388,103.430611],[35.77367,103.430557],[35.773472,103.430397],[35.773041,103.429649],[35.772831,103.429337],[35.771561,103.428581],[35.770069,103.427193],[35.769489,103.427048],[35.768162,103.42617],[35.767551,103.426033],[35.767231,103.425774],[35.76545,103.424019],[35.764339,103.423241],[35.763401,103.42289],[35.762741,103.422348],[35.762371,103.421913],[35.76136,103.420219],[35.761292,103.419991],[35.761238,103.419327],[35.76086,103.418114],[35.760712,103.417877],[35.76012,103.417557],[35.759979,103.417381],[35.759651,103.41674],[35.759491,103.41655],[35.758671,103.415916],[35.757431,103.415581],[35.757252,103.415482],[35.757038,103.415268],[35.756512,103.414574],[35.75589,103.414101],[35.755531,103.413559],[35.755131,103.413231],[35.75449,103.41291],[35.7537,103.412727],[35.753029,103.412468],[35.751961,103.4123],[35.751732,103.412338],[35.75153,103.412437],[35.750721,103.413139],[35.750191,103.413361],[35.748661,103.414337],[35.747501,103.415573],[35.747021,103.416161],[35.746319,103.416679],[35.74596,103.417007],[35.74577,103.417267],[35.745159,103.417717],[35.744869,103.418159],[35.74469,103.418793],[35.74456,103.418877],[35.744171,103.418907],[35.743889,103.419144],[35.74361,103.419609],[35.743511,103.41996],[35.743462,103.420349],[35.74345,103.420807],[35.743721,103.421707],[35.743698,103.42186],[35.743629,103.421928],[35.743401,103.421959],[35.742809,103.421829],[35.7416,103.421478],[35.741199,103.42128],[35.74094,103.421227],[35.74065,103.42131],[35.74012,103.421638],[35.739811,103.421738],[35.738621,103.421799],[35.737419,103.422371],[35.736851,103.422546],[35.736271,103.423141],[35.735371,103.423576],[35.734909,103.424309],[35.73457,103.42469],[35.733471,103.425323],[35.732941,103.425507],[35.732761,103.425659],[35.73243,103.426041],[35.731781,103.426521],[35.731392,103.426888],[35.73093,103.427017],[35.73019,103.427361],[35.729591,103.427727],[35.728901,103.427887],[35.727501,103.428978],[35.72707,103.429199],[35.726212,103.429367],[35.72541,103.430107],[35.725182,103.43026],[35.72477,103.430443],[35.723,103.431],[35.722721,103.430969],[35.72171,103.430527],[35.72142,103.430519],[35.720909,103.43058],[35.720711,103.430641],[35.719101,103.431473],[35.718399,103.43222],[35.718151,103.432373],[35.717541,103.432457],[35.717239,103.432411],[35.716431,103.432129],[35.716171,103.432137],[35.7155,103.432327],[35.714588,103.43293],[35.713051,103.43364],[35.71278,103.433823],[35.71246,103.434158],[35.712231,103.434334],[35.71172,103.434471],[35.711391,103.434441],[35.710972,103.434128],[35.710869,103.43399],[35.710831,103.433823],[35.71093,103.431198],[35.71101,103.430946],[35.7113,103.430458],[35.711399,103.430191],[35.711391,103.429947],[35.711239,103.429314],[35.711208,103.428047],[35.711151,103.427719],[35.710819,103.427368],[35.710091,103.426849],[35.70953,103.42601],[35.708981,103.425728],[35.708778,103.425507],[35.70842,103.424606],[35.708229,103.423592],[35.70797,103.42308],[35.707722,103.422737],[35.706871,103.422058],[35.706322,103.421387],[35.70499,103.419319],[35.7048,103.418739],[35.704361,103.416847],[35.703651,103.415848],[35.70327,103.41497],[35.703098,103.414879],[35.70266,103.414818],[35.702049,103.414467],[35.701721,103.414383],[35.701271,103.414291],[35.70076,103.414337],[35.700081,103.414261],[35.69939,103.413971],[35.69849,103.413681],[35.697868,103.413673],[35.697472,103.413559],[35.696949,103.413498],[35.696659,103.413551],[35.696331,103.413689],[35.696159,103.413696],[35.695,103.413429],[35.69334,103.41317],[35.692032,103.41304],[35.69128,103.41317],[35.690941,103.413109],[35.69067,103.412949],[35.690331,103.412468],[35.690182,103.412369],[35.687698,103.411743],[35.687191,103.411568],[35.68639,103.411217],[35.685081,103.41053],[35.684212,103.410477],[35.682892,103.410057],[35.68222,103.410103],[35.681419,103.41024],[35.680771,103.410057],[35.680248,103.410011],[35.67989,103.409798],[35.679691,103.409737],[35.679241,103.409889],[35.678841,103.41011],[35.678001,103.41021],[35.67762,103.410141],[35.676731,103.40963],[35.676571,103.409576],[35.6759,103.40979],[35.675289,103.410103],[35.675011,103.410103],[35.674641,103.410011],[35.674511,103.40992],[35.674179,103.409286],[35.67355,103.408478],[35.673241,103.407913],[35.672878,103.406868],[35.67276,103.406113],[35.672611,103.405769],[35.67205,103.40509],[35.671398,103.40477],[35.671242,103.40461],[35.67078,103.403748],[35.670349,103.403191],[35.669762,103.402283],[35.66938,103.401527],[35.667961,103.39978],[35.667419,103.399017],[35.666729,103.397881],[35.666481,103.397179],[35.666401,103.3964],[35.666401,103.396027],[35.6665,103.39534],[35.66684,103.394257],[35.666851,103.39389],[35.6661,103.392097],[35.665989,103.391739],[35.665932,103.391281],[35.66592,103.390427],[35.666031,103.389999],[35.66695,103.388039],[35.666988,103.387772],[35.666931,103.386757],[35.666962,103.386276],[35.667122,103.385788],[35.667679,103.38459],[35.667751,103.384331],[35.667721,103.384216],[35.667549,103.384087],[35.66613,103.383667],[35.665871,103.38353],[35.66489,103.382767],[35.664322,103.381897],[35.664261,103.381706],[35.664249,103.381287],[35.6642,103.381027],[35.664322,103.38092],[35.665871,103.378578],[35.666142,103.378319],[35.66671,103.378059],[35.666851,103.377937],[35.666889,103.377823],[35.66687,103.377693],[35.666512,103.37719],[35.666351,103.376846],[35.666328,103.376404],[35.666401,103.375977],[35.666561,103.375519],[35.66674,103.375221],[35.666988,103.374947],[35.66732,103.374748],[35.668049,103.374527],[35.668598,103.37394],[35.66864,103.373871],[35.66864,103.373657],[35.668331,103.373161],[35.668308,103.37291],[35.668442,103.372383],[35.668991,103.370827],[35.669281,103.370537],[35.669781,103.370399],[35.669899,103.370308],[35.67017,103.369781],[35.670681,103.369217],[35.670738,103.369003],[35.67075,103.368317],[35.671169,103.366959],[35.67131,103.366699],[35.67149,103.366508],[35.67197,103.366348],[35.672138,103.366158],[35.67226,103.365868],[35.672588,103.365303],[35.672779,103.364464],[35.673592,103.362717],[35.67384,103.362488],[35.674469,103.362373],[35.67466,103.362167],[35.674641,103.361969],[35.67429,103.361183],[35.674179,103.360779],[35.674141,103.360336],[35.674179,103.35997],[35.674278,103.35952],[35.6744,103.3592],[35.675159,103.357887],[35.675381,103.357407],[35.675671,103.356628],[35.67572,103.356117],[35.675522,103.354897],[35.675228,103.354187],[35.67519,103.353928],[35.67511,103.352631],[35.67495,103.351517],[35.674931,103.350708],[35.67498,103.349876],[35.675152,103.349289],[35.676109,103.348091],[35.676201,103.347801],[35.676189,103.347366],[35.67625,103.347],[35.67664,103.346359],[35.676708,103.346169],[35.676651,103.34594],[35.676479,103.345848],[35.67622,103.345863],[35.675591,103.346001],[35.675369,103.345947],[35.674358,103.34494],[35.674191,103.344566],[35.673908,103.343567],[35.673439,103.342529],[35.672691,103.341347],[35.672001,103.339569],[35.67157,103.338913],[35.67141,103.338219],[35.671101,103.337196],[35.671089,103.336029],[35.671391,103.335098],[35.67144,103.33448],[35.671391,103.334053],[35.671181,103.333214],[35.671169,103.332649],[35.671379,103.33062],[35.671589,103.32991],[35.671638,103.329498],[35.671589,103.329224],[35.670971,103.327377],[35.67094,103.326408],[35.671162,103.324913],[35.67104,103.323448],[35.670731,103.322311],[35.670158,103.321243],[35.670052,103.320953],[35.669651,103.319107],[35.669701,103.318359],[35.66983,103.317574],[35.670078,103.317001],[35.670559,103.316399],[35.671478,103.316109],[35.672039,103.315468],[35.672112,103.315041],[35.672001,103.314247],[35.672031,103.313904],[35.672371,103.312859],[35.672649,103.312218],[35.672852,103.31192],[35.673111,103.311699],[35.673901,103.31144],[35.674511,103.31105],[35.674591,103.310944],[35.674629,103.310707],[35.674511,103.310501],[35.674358,103.310379],[35.673752,103.310043],[35.673439,103.309769],[35.673,103.30909],[35.672859,103.308746],[35.672291,103.306664],[35.672249,103.30632],[35.672241,103.305237],[35.672031,103.30368],[35.67181,103.303261],[35.671211,103.302803],[35.671021,103.302429],[35.670952,103.302147],[35.670959,103.301697],[35.671268,103.30024],[35.671268,103.299927],[35.6712,103.299637],[35.67104,103.2994],[35.670189,103.298431],[35.669708,103.297737],[35.66906,103.29705],[35.668468,103.295937],[35.66814,103.295647],[35.667011,103.29483],[35.666752,103.294487],[35.66613,103.293007],[35.665619,103.291512],[35.665421,103.290428],[35.66547,103.289299],[35.66563,103.289001],[35.6661,103.288353],[35.666439,103.287956],[35.667191,103.287514],[35.667252,103.287369],[35.66721,103.287209],[35.666969,103.287086],[35.665951,103.287117],[35.66523,103.287567],[35.665001,103.287628],[35.664711,103.28759],[35.66431,103.287376],[35.664001,103.287308],[35.663181,103.287369],[35.662651,103.287308],[35.662441,103.287209],[35.662392,103.287086],[35.66243,103.286957],[35.662498,103.286911],[35.66312,103.287117],[35.663261,103.287079],[35.663288,103.286957],[35.663158,103.286827],[35.662258,103.286507],[35.661449,103.286011],[35.661442,103.285828],[35.661579,103.285767],[35.662231,103.286209],[35.662338,103.286217],[35.662361,103.286171],[35.662338,103.286049],[35.66177,103.285568],[35.661541,103.285301],[35.661201,103.284683],[35.66111,103.28434],[35.660938,103.282738],[35.6609,103.2826],[35.660751,103.282387],[35.660568,103.282318],[35.65966,103.282188],[35.659149,103.281898],[35.65765,103.281517],[35.65723,103.281487],[35.657101,103.281387],[35.65707,103.281288],[35.657101,103.281197],[35.65723,103.281128],[35.658131,103.281342],[35.658291,103.281258],[35.65831,103.281151],[35.658291,103.281067],[35.65818,103.281013],[35.65773,103.280991],[35.657372,103.280891],[35.656239,103.280273],[35.654949,103.279778],[35.654598,103.279572],[35.65456,103.279449],[35.654621,103.27935],[35.655392,103.279572],[35.65596,103.27951],[35.65641,103.279533],[35.65654,103.27948],[35.656582,103.279373],[35.656528,103.279259],[35.656471,103.279228],[35.655281,103.279137],[35.65514,103.279053],[35.65514,103.278923],[35.655182,103.278839],[35.655331,103.278748],[35.656681,103.278648],[35.656792,103.278557],[35.656761,103.278397],[35.656651,103.278313],[35.655998,103.278236],[35.655331,103.278297],[35.655258,103.278229],[35.655251,103.278137],[35.6553,103.278038],[35.65546,103.277946],[35.65675,103.27771],[35.65683,103.277557],[35.656811,103.277481],[35.6567,103.277397],[35.655861,103.277428],[35.65443,103.277191],[35.65427,103.277077],[35.654251,103.276917],[35.65448,103.276817],[35.65659,103.276543],[35.656731,103.276367],[35.656731,103.276268],[35.656681,103.276176],[35.656528,103.276077],[35.655151,103.27552],[35.65369,103.275146],[35.653419,103.275131],[35.653278,103.275177],[35.652969,103.275414],[35.652748,103.275414],[35.65258,103.275169],[35.652451,103.274719],[35.652321,103.27446],[35.651939,103.274063],[35.651451,103.273788],[35.651291,103.273598],[35.651299,103.27343],[35.65136,103.273361],[35.651501,103.273323],[35.651642,103.273369],[35.652271,103.273804],[35.65239,103.273811],[35.652481,103.273743],[35.6525,103.273628],[35.652458,103.273483],[35.65226,103.273148],[35.6521,103.272957],[35.651661,103.272659],[35.651211,103.272621],[35.65004,103.272881],[35.649658,103.273033],[35.649212,103.273361],[35.649109,103.273376],[35.648979,103.273323],[35.64819,103.272118],[35.646919,103.271004],[35.646561,103.270851],[35.64571,103.270798],[35.645481,103.270714],[35.64291,103.267601],[35.642479,103.267113],[35.641449,103.266518],[35.640148,103.265381],[35.639851,103.26535],[35.639332,103.26561],[35.638561,103.265511],[35.638519,103.265419],[35.638618,103.265297],[35.639278,103.265327],[35.639462,103.265289],[35.640018,103.264847],[35.64048,103.264709],[35.64053,103.264664],[35.640541,103.264526],[35.640461,103.264488],[35.640331,103.264511],[35.639488,103.264816],[35.639141,103.264877],[35.63884,103.264847],[35.637539,103.264397],[35.63736,103.26413],[35.636978,103.262703],[35.636829,103.262299],[35.63596,103.260696],[35.634201,103.25956],[35.633709,103.259323],[35.633259,103.259193],[35.633369,103.258347],[35.633419,103.257973],[35.63335,103.25753],[35.632938,103.256683],[35.631889,103.254807],[35.631321,103.253601],[35.630329,103.252037],[35.629211,103.251122],[35.627739,103.249153],[35.62553,103.245537],[35.62373,103.242867],[35.622391,103.240761],[35.620541,103.236931],[35.620201,103.236359],[35.618198,103.23378],[35.617821,103.233383],[35.616402,103.232117],[35.614368,103.230057],[35.612492,103.228554],[35.61097,103.227501],[35.61018,103.22702],[35.60989,103.226784],[35.60968,103.226479],[35.609032,103.225113],[35.608459,103.223633],[35.606361,103.217888],[35.60556,103.215599],[35.605331,103.214813],[35.605228,103.214073],[35.604889,103.211906],[35.604721,103.210388],[35.60458,103.209633],[35.604149,103.206146],[35.60376,103.203613],[35.6036,103.202927],[35.603359,103.202293],[35.603119,103.201691],[35.602638,103.200798],[35.601089,103.198578],[35.600658,103.198082],[35.599781,103.197357],[35.598999,103.196541],[35.597111,103.195717],[35.596088,103.194817],[35.59544,103.194504],[35.595081,103.19426],[35.59306,103.192612],[35.592621,103.192284],[35.59185,103.191849],[35.59042,103.190697],[35.590179,103.190697],[35.58989,103.19088],[35.588188,103.19265],[35.58741,103.193542],[35.584061,103.197113],[35.582069,103.199463],[35.58186,103.199707],[35.581558,103.199982],[35.575211,103.207153],[35.57468,103.207718],[35.57449,103.207787],[35.57439,103.207703],[35.5728,103.204857],[35.57233,103.203918],[35.571621,103.201767],[35.571049,103.200562],[35.567841,103.195183],[35.566792,103.19313],[35.56625,103.191948],[35.564529,103.187828],[35.56329,103.185181],[35.562019,103.182838],[35.56052,103.180397],[35.55962,103.179077],[35.556969,103.175499],[35.55489,103.17289],[35.550018,103.166527],[35.548321,103.164391],[35.5476,103.163391],[35.546902,103.162338],[35.545528,103.16008],[35.543041,103.15567],[35.54232,103.15464],[35.541561,103.153687],[35.54073,103.152809],[35.539799,103.152023],[35.538818,103.151321],[35.535782,103.149399],[35.534851,103.148666],[35.533989,103.147789],[35.533211,103.146782],[35.532539,103.145638],[35.53196,103.14431],[35.530941,103.141441],[35.530281,103.140083],[35.529461,103.138878],[35.526112,103.134903],[35.5242,103.13282],[35.523232,103.132057],[35.521309,103.13089],[35.520531,103.130219],[35.51989,103.129433],[35.519241,103.128273],[35.51741,103.124367],[35.516689,103.1231],[35.514229,103.119591],[35.5135,103.118378],[35.512829,103.117073],[35.511581,103.114212],[35.510941,103.1129],[35.510281,103.111717],[35.509041,103.109848],[35.505951,103.106201],[35.505112,103.104973],[35.50441,103.103653],[35.50386,103.102333],[35.50346,103.101013],[35.503189,103.099716],[35.502399,103.094597],[35.502201,103.093712],[35.501808,103.092293],[35.501389,103.090981],[35.50058,103.08902],[35.499882,103.087723],[35.495811,103.081123],[35.48962,103.071373],[35.488949,103.070259],[35.488369,103.069061],[35.487919,103.067871],[35.487572,103.066711],[35.48708,103.064552],[35.486481,103.062363],[35.486,103.060966],[35.485378,103.059608],[35.484631,103.058342],[35.483799,103.05722],[35.478809,103.051376],[35.47821,103.050323],[35.477829,103.049171],[35.47768,103.047943],[35.477772,103.045326],[35.47773,103.043961],[35.47747,103.042709],[35.477051,103.041588],[35.476521,103.040527],[35.47591,103.03965],[35.47348,103.036369],[35.473091,103.035751],[35.472778,103.035004],[35.472481,103.034416],[35.47213,103.033684],[35.471741,103.03286],[35.471352,103.031998],[35.470959,103.03112],[35.47057,103.030228],[35.4702,103.029404],[35.469872,103.028671],[35.469601,103.028069],[35.469429,103.02774],[35.469158,103.027458],[35.46896,103.027069],[35.468651,103.026581],[35.46825,103.025993],[35.467819,103.025383],[35.467369,103.024727],[35.4669,103.023933],[35.466431,103.022949],[35.465912,103.021828],[35.465328,103.020729],[35.46468,103.019623],[35.464008,103.018539],[35.463291,103.017517],[35.462559,103.016533],[35.461849,103.015556],[35.46114,103.014618],[35.46048,103.013733],[35.459919,103.012947],[35.45927,103.012123],[35.458549,103.011261],[35.457821,103.010536],[35.457119,103.009933],[35.456459,103.009354],[35.45591,103.008858],[35.455589,103.008537],[35.455299,103.008209],[35.45509,103.00795],[35.454781,103.007591],[35.454411,103.007004],[35.45396,103.00631],[35.45343,103.005493],[35.452881,103.004639],[35.45229,103.003723],[35.45166,103.002747],[35.450989,103.001732],[35.450352,103.000763],[35.449749,102.999847],[35.449181,102.99894],[35.448589,102.998016],[35.448009,102.997017],[35.44743,102.995979],[35.44685,102.994904],[35.446331,102.993752],[35.44582,102.992622],[35.44537,102.991463],[35.44492,102.990227],[35.444489,102.988983],[35.44408,102.987747],[35.44368,102.986572],[35.443291,102.985443],[35.442909,102.984306],[35.442478,102.983147],[35.442039,102.982018],[35.441681,102.981148],[35.44136,102.980476],[35.440971,102.97966],[35.440491,102.978683],[35.439949,102.977654],[35.439381,102.976646],[35.43877,102.975662],[35.438099,102.97467],[35.43742,102.97364],[35.436722,102.97261],[35.436008,102.971558],[35.435322,102.970543],[35.43462,102.969528],[35.433941,102.968452],[35.4333,102.967262],[35.43269,102.966011],[35.43211,102.964684],[35.43158,102.963417],[35.431,102.962303],[35.430302,102.961357],[35.429562,102.960564],[35.428768,102.959732],[35.427952,102.958832],[35.42709,102.957909],[35.426281,102.956879],[35.425621,102.955727],[35.425098,102.954536],[35.424549,102.953484],[35.423809,102.952728],[35.422932,102.952316],[35.422001,102.952164],[35.421009,102.951927],[35.420071,102.951408],[35.419189,102.950607],[35.418491,102.94957],[35.418018,102.94838],[35.417789,102.947189],[35.417782,102.946098],[35.41782,102.945053],[35.4179,102.944054],[35.417839,102.943031],[35.417629,102.941994],[35.417309,102.94101],[35.41695,102.940071],[35.416561,102.939163],[35.416069,102.938316],[35.415401,102.937714],[35.414631,102.937431],[35.41383,102.937317],[35.413139,102.937134],[35.412491,102.936829],[35.411789,102.936691],[35.4114,102.936707],[35.411301,102.936707],[35.411072,102.93676],[35.41066,102.936859],[35.409988,102.937027],[35.409199,102.937218],[35.408352,102.937424],[35.407452,102.937622],[35.406528,102.937851],[35.405682,102.938026],[35.404869,102.937973],[35.404079,102.937561],[35.403461,102.93679],[35.403118,102.935806],[35.403011,102.934837],[35.403049,102.933891],[35.40324,102.932953],[35.403542,102.932159],[35.40387,102.931419],[35.40424,102.930603],[35.40443,102.929657],[35.404491,102.928612],[35.404388,102.927582],[35.404121,102.926682],[35.403759,102.925926],[35.403309,102.925323],[35.402802,102.92482],[35.40226,102.924454],[35.401581,102.924118],[35.400791,102.923843],[35.399948,102.923599],[35.399151,102.9235],[35.39827,102.923492],[35.39735,102.923553],[35.396461,102.923607],[35.39558,102.923599],[35.394718,102.923477],[35.39389,102.923233],[35.39307,102.922943],[35.392231,102.922623],[35.39143,102.92234],[35.39061,102.921997],[35.389771,102.921677],[35.388908,102.921349],[35.388069,102.921028],[35.387199,102.9207],[35.386341,102.920349],[35.385529,102.919762],[35.38496,102.918961],[35.384529,102.918007],[35.384071,102.917122],[35.3834,102.916473],[35.382599,102.916077],[35.38166,102.915848],[35.380772,102.915627],[35.37994,102.915367],[35.379131,102.915009],[35.378422,102.914597],[35.377838,102.914192],[35.37468,102.90918],[35.374611,102.908829],[35.374439,102.908287],[35.374298,102.907402],[35.374321,102.906273],[35.374531,102.905228],[35.37495,102.904221],[35.375511,102.903107],[35.3759,102.90184],[35.375999,102.900543],[35.375912,102.899307],[35.375759,102.898193],[35.37561,102.897133],[35.375469,102.89608],[35.375301,102.894974],[35.374969,102.893929],[35.374378,102.89315],[35.37368,102.892708],[35.372768,102.892517],[35.371868,102.892357],[35.370911,102.892181],[35.36985,102.891998],[35.368778,102.891777],[35.367809,102.891579],[35.366951,102.891083],[35.366268,102.890213],[35.365891,102.889053],[35.365669,102.888008],[35.36544,102.887177],[35.36515,102.886414],[35.36488,102.885513],[35.36478,102.884354],[35.364731,102.883034],[35.364552,102.88176],[35.364288,102.880661],[35.364029,102.879623],[35.363899,102.878464],[35.364021,102.877327],[35.364441,102.876213],[35.364979,102.875038],[35.365551,102.873749],[35.366169,102.872398],[35.366798,102.870979],[35.36742,102.869614],[35.368019,102.868248],[35.368549,102.866814],[35.368858,102.865257],[35.368961,102.86364],[35.368801,102.862106],[35.368431,102.860733],[35.368,102.859467],[35.367599,102.858261],[35.36639,102.854156],[35.365791,102.853081],[35.364971,102.852219],[35.363811,102.851501],[35.363041,102.850388],[35.362431,102.84906],[35.362061,102.847656],[35.36227,102.846184],[35.362411,102.844818],[35.36026,102.837929],[35.359489,102.837067],[35.35873,102.836166],[35.35833,102.834877],[35.358231,102.833473],[35.35804,102.83223],[35.357498,102.831139],[35.35677,102.830231],[35.35622,102.829117],[35.355942,102.827766],[35.355701,102.826424],[35.35524,102.825127],[35.35461,102.823883],[35.35376,102.822739],[35.352798,102.821808],[35.35183,102.821068],[35.35104,102.820137],[35.350651,102.81884],[35.350788,102.81739],[35.35146,102.816071],[35.352291,102.814774],[35.352989,102.813347],[35.353378,102.811852],[35.353401,102.810509],[35.353149,102.809212],[35.35268,102.807991],[35.35199,102.806923],[35.351181,102.805923],[35.35033,102.804901],[35.349461,102.803833],[35.348579,102.802696],[35.347729,102.801422],[35.346909,102.800049],[35.346119,102.798599],[35.34531,102.797157],[35.344509,102.795769],[35.34375,102.794441],[35.342979,102.793121],[35.342239,102.791832],[35.341431,102.790657],[35.34045,102.789818],[35.339298,102.789383],[35.3381,102.789253],[35.336971,102.789108],[35.33593,102.788727],[35.334961,102.787979],[35.334099,102.786957],[35.333279,102.785858],[35.332409,102.784927],[35.331421,102.784317],[35.330471,102.784027],[35.329521,102.783981],[35.32848,102.783913],[35.3274,102.783783],[35.326351,102.783684],[35.325291,102.783577],[35.32428,102.783379],[35.32341,102.782951],[35.322651,102.782417],[35.321892,102.781883],[35.32111,102.781273],[35.320259,102.780647],[35.319302,102.779938],[35.318272,102.779167],[35.317268,102.778442],[35.316319,102.777733],[35.31538,102.777039],[35.314579,102.776443],[35.313789,102.775848],[35.313019,102.775261],[35.31218,102.774643],[35.311279,102.773972],[35.310329,102.773247],[35.309299,102.772476],[35.308281,102.771721],[35.30727,102.770973],[35.306221,102.770241],[35.305149,102.76963],[35.303982,102.769386],[35.302799,102.769669],[35.301762,102.770378],[35.300961,102.771469],[35.300449,102.772797],[35.300171,102.774277],[35.29998,102.775772],[35.29966,102.777222],[35.299042,102.778503],[35.298061,102.779442],[35.29686,102.779953],[35.29562,102.780006],[35.294418,102.77993],[35.293289,102.779846],[35.292091,102.779808],[35.290871,102.780098],[35.289761,102.780853],[35.288792,102.781937],[35.287811,102.783127],[35.286819,102.784317],[35.285671,102.785278],[35.284519,102.785851],[35.283691,102.786346],[35.282909,102.786987],[35.28215,102.787903],[35.281509,102.789078],[35.28088,102.790298],[35.27998,102.791092],[35.279041,102.791397],[35.278191,102.791832],[35.277489,102.792702],[35.276871,102.793739],[35.27599,102.794518],[35.275082,102.795197],[35.274281,102.796066],[35.273659,102.797142],[35.27285,102.797981],[35.271969,102.798538],[35.27113,102.799278],[35.270439,102.800369],[35.27002,102.801697],[35.269691,102.803078],[35.269009,102.804176],[35.26833,102.80526],[35.267719,102.806412],[35.267151,102.807663],[35.26646,102.808907],[35.265461,102.809837],[35.26432,102.810318],[35.263149,102.810349],[35.262001,102.810471],[35.260948,102.810944],[35.260021,102.811798],[35.259159,102.813004],[35.258171,102.814133],[35.256962,102.81472],[35.255711,102.814743],[35.254459,102.814583],[35.253288,102.814636],[35.252251,102.815086],[35.251461,102.81588],[35.250809,102.81662],[35.25013,102.817413],[35.24934,102.818222],[35.248451,102.819069],[35.247459,102.819939],[35.246399,102.820847],[35.2453,102.821823],[35.24419,102.822777],[35.243111,102.823723],[35.24213,102.824547],[35.241241,102.825233],[35.240318,102.825447],[35.23938,102.825203],[35.238338,102.824837],[35.237228,102.824516],[35.23616,102.824661],[35.235271,102.82534],[35.23457,102.826111],[35.23394,102.826828],[35.23325,102.827423],[35.232368,102.827667],[35.23151,102.827499],[35.230751,102.826981],[35.22998,102.826317],[35.229229,102.825653],[35.2285,102.825111],[35.227921,102.824867],[35.227428,102.824753],[35.226891,102.824638],[35.226311,102.824516],[35.225788,102.824364],[35.2253,102.824142],[35.224899,102.823929],[35.224579,102.823761],[35.224289,102.823593],[35.223721,102.823593],[35.223019,102.824867],[35.22028,102.823959],[35.219189,102.82222],[35.219341,102.820396],[35.217682,102.819847],[35.216991,102.819962],[35.216461,102.820084],[35.216099,102.820137],[35.21553,102.820168],[35.214588,102.82019],[35.212101,102.820183],[35.211349,102.820267],[35.210251,102.820648],[35.209091,102.821487],[35.20895,102.821457],[35.20776,102.822563],[35.207409,102.822762],[35.206841,102.82299],[35.20562,102.823189],[35.205009,102.823189],[35.203999,102.823151],[35.20266,102.82312],[35.20145,102.822144],[35.19294,102.825737],[35.191181,102.825211],[35.18959,102.824623],[35.18874,102.823799],[35.187778,102.822731],[35.187222,102.822189],[35.186218,102.821831],[35.18605,102.821823],[35.185322,102.821877],[35.184959,102.821877],[35.184441,102.821777],[35.18425,102.821716],[35.182701,102.820602],[35.182388,102.82045],[35.181721,102.820358],[35.180901,102.820633],[35.180462,102.820976],[35.180199,102.821297],[35.17981,102.822037],[35.179729,102.822243],[35.179531,102.822861],[35.17952,102.824043],[35.177551,102.824539],[35.176521,102.824928],[35.169189,102.832947],[35.168301,102.831947],[35.167881,102.832352],[35.16703,102.833344],[35.166321,102.834084],[35.165489,102.834763],[35.164631,102.835503],[35.16338,102.836906],[35.162361,102.838348],[35.16256,102.839882],[35.156368,102.845108],[35.15435,102.845139],[35.153439,102.845741],[35.152439,102.846649],[35.15229,102.846764],[35.151039,102.847153],[35.14999,102.847733],[35.148682,102.84922],[35.144951,102.850227],[35.143131,102.848869],[35.142151,102.848541],[35.140621,102.848083],[35.1395,102.847763],[35.138168,102.847656],[35.137821,102.847679],[35.136589,102.847939],[35.13625,102.848083],[35.134949,102.848778],[35.13311,102.849907],[35.130322,102.850929],[35.12952,102.851608],[35.128719,102.85257],[35.127361,102.853859],[35.126019,102.855324],[35.114201,102.858513],[35.114029,102.860222],[35.113811,102.860641],[35.11343,102.861794],[35.11274,102.863426],[35.111851,102.86483],[35.110458,102.866867],[35.110008,102.867348],[35.108829,102.868202],[35.106941,102.869392],[35.1059,102.870377],[35.105209,102.871582],[35.104801,102.872726],[35.10276,102.878822],[35.101971,102.881264],[35.101219,102.882874],[35.100349,102.884193],[35.09911,102.886208],[35.09874,102.887062],[35.098228,102.888268],[35.097759,102.889137],[35.09724,102.889877],[35.096531,102.890739],[35.09597,102.891609],[35.095181,102.893143],[35.094181,102.894974],[35.093029,102.896812],[35.09185,102.898552],[35.091179,102.899857],[35.09074,102.90136],[35.09066,102.902786],[35.090691,102.903732],[35.090698,102.904198],[35.090401,102.905327],[35.090199,102.905724],[35.089939,102.906036],[35.089359,102.906487],[35.088699,102.906723],[35.088348,102.906731],[35.08746,102.906471],[35.086861,102.906021],[35.085949,102.905281],[35.085789,102.905167],[35.084629,102.90464],[35.084122,102.904533],[35.083241,102.904503],[35.08252,102.904678],[35.082439,102.905113],[35.080551,102.905243],[35.080002,102.905342],[35.07943,102.905388],[35.078529,102.905533],[35.077862,102.905724],[35.07674,102.906197],[35.076092,102.906303],[35.075779,102.906281],[35.075321,102.906151],[35.074951,102.905998],[35.074261,102.905907],[35.073589,102.905968],[35.073021,102.906273],[35.0728,102.906464],[35.07222,102.907021],[35.07185,102.907333],[35.070881,102.907707],[35.07037,102.90773],[35.069679,102.907471],[35.069519,102.907372],[35.06921,102.907112],[35.06815,102.905968],[35.067699,102.905647],[35.066841,102.905418],[35.066139,102.905472],[35.065319,102.905853],[35.06353,102.906998],[35.060638,102.908791],[35.059471,102.909378],[35.05872,102.909523],[35.057129,102.909554],[35.05666,102.909569],[35.055828,102.909561],[35.055069,102.909683],[35.05476,102.909767],[35.054298,102.909988],[35.053692,102.910393],[35.053219,102.910629],[35.052132,102.911293],[35.05164,102.911552],[35.051029,102.911957],[35.050388,102.9123],[35.049751,102.912727],[35.049061,102.913116],[35.0485,102.913307],[35.047729,102.91349],[35.04673,102.913612],[35.045731,102.913612],[35.045341,102.913628],[35.04422,102.91391],[35.043549,102.914284],[35.043388,102.914413],[35.042709,102.915176],[35.042332,102.915733],[35.041721,102.916733],[35.04084,102.918243],[35.040649,102.918663],[35.04018,102.919487],[35.03981,102.920067],[35.039669,102.920258],[35.038979,102.920837],[35.034828,102.92321],[35.034069,102.923576],[35.033489,102.923683],[35.032349,102.923714],[35.031311,102.924141],[35.03067,102.924637],[35.030319,102.92485],[35.029362,102.925087],[35.028751,102.925011],[35.027981,102.924629],[35.02702,102.924057],[35.02623,102.923759],[35.025589,102.923683],[35.025311,102.923691],[35.02446,102.924072],[35.023602,102.924522],[35.023251,102.924591],[35.022881,102.924622],[35.022148,102.924583],[35.021389,102.924629],[35.020828,102.924843],[35.020691,102.924896],[35.020302,102.925171],[35.019508,102.925797],[35.018921,102.926018],[35.017399,102.926132],[35.017029,102.926201],[35.01582,102.92659],[35.015659,102.926613],[35.014999,102.926613],[35.0144,102.926361],[35.01395,102.926071],[35.013599,102.925758],[35.01334,102.925507],[35.01223,102.924316],[35.011372,102.923477],[35.010792,102.922783],[35.010441,102.922287],[35.01025,102.921921],[35.01001,102.921494],[35.00967,102.9207],[35.008801,102.918907],[35.008308,102.917824],[35.007332,102.915756],[35.005859,102.912498],[35.00528,102.91127],[35.004841,102.910263],[35.004608,102.909851],[35.00452,102.909607],[35.00441,102.909309],[35.004002,102.908371],[35.003311,102.906532],[35.002911,102.905418],[35.00272,102.904968],[35.002331,102.904541],[35.00214,102.904472],[35.001499,102.904503],[35.000359,102.904617],[34.999981,102.904694],[34.998661,102.905273],[34.99477,102.905273],[34.993271,102.904968],[34.993111,102.906036],[34.993172,102.906326],[34.993172,102.906883],[34.993061,102.907677],[34.992901,102.9077],[34.992901,102.907707],[34.99292,102.907784],[34.992962,102.908218],[34.993011,102.908371],[34.99297,102.908592],[34.992722,102.908707],[34.99202,102.90873],[34.990101,102.908607],[34.989811,102.908546],[34.98624,102.908333],[34.97057,102.907372],[34.970188,102.907257],[34.96883,102.907173],[34.968571,102.907097],[34.968449,102.906738],[34.968349,102.906082],[34.96822,102.905457],[34.967999,102.904533],[34.967899,102.904167],[34.967709,102.903862],[34.967522,102.903618],[34.967319,102.90345],[34.966942,102.903412],[34.96677,102.903374],[34.966469,102.903259],[34.966099,102.903061],[34.965698,102.902763],[34.96529,102.902351],[34.965,102.90197],[34.964722,102.90155],[34.96365,102.899529],[34.96339,102.899071],[34.96312,102.898552],[34.962379,102.897202],[34.961761,102.896187],[34.961559,102.895844],[34.961151,102.895271],[34.960979,102.894951],[34.96072,102.894524],[34.960529,102.894287],[34.960339,102.893967],[34.958981,102.892014],[34.958031,102.890839],[34.957039,102.889557],[34.956711,102.889183],[34.954849,102.886749],[34.954552,102.886398],[34.95417,102.885887],[34.953442,102.884987],[34.95295,102.884338],[34.95298,102.884361],[34.952621,102.883888],[34.95232,102.883553],[34.950809,102.881683],[34.949909,102.880409],[34.949902,102.880363],[34.949459,102.879562],[34.949249,102.879082],[34.948891,102.878151],[34.94838,102.876427],[34.94825,102.875931],[34.94809,102.875397],[34.947899,102.874863],[34.947491,102.873863],[34.94685,102.872551],[34.946629,102.872147],[34.945992,102.871132],[34.945702,102.870758],[34.945068,102.870163],[34.944729,102.869919],[34.944359,102.869698],[34.94392,102.869476],[34.943031,102.869164],[34.9426,102.86898],[34.94141,102.868584],[34.940441,102.868263],[34.940182,102.868202],[34.94017,102.868172],[34.93821,102.867638],[34.92548,102.864548],[34.924671,102.864166],[34.924419,102.864082],[34.924049,102.864014],[34.923771,102.863907],[34.921612,102.863007],[34.920521,102.862503],[34.919701,102.862137],[34.919361,102.862007],[34.919041,102.861908],[34.91869,102.861847],[34.917961,102.861893],[34.917591,102.861954],[34.91721,102.862061],[34.916382,102.862396],[34.915192,102.862839],[34.91394,102.863182],[34.90559,102.863182],[34.905281,102.86306],[34.90493,102.862877],[34.904579,102.86264],[34.904289,102.862381],[34.90379,102.861794],[34.903591,102.861473],[34.903091,102.860428],[34.902969,102.860107],[34.902748,102.859421],[34.90255,102.858582],[34.902401,102.857788],[34.90229,102.856934],[34.90226,102.855743],[34.902302,102.854851],[34.902699,102.843513],[34.902748,102.843033],[34.902802,102.842773],[34.902882,102.842484],[34.902969,102.842239],[34.903091,102.841988],[34.903259,102.841743],[34.90345,102.841476],[34.903641,102.841309],[34.903839,102.841148],[34.90427,102.840889],[34.90451,102.840767],[34.904919,102.840477],[34.90519,102.840347],[34.90554,102.840111],[34.905949,102.839867],[34.9062,102.839684],[34.906399,102.8395],[34.906651,102.839073],[34.90675,102.838837],[34.906841,102.838516],[34.906841,102.838203],[34.906799,102.837883],[34.906731,102.837639],[34.906609,102.837341],[34.906422,102.837128],[34.9062,102.836983],[34.905891,102.836929],[34.905659,102.837013],[34.905479,102.837128],[34.905289,102.837334],[34.904961,102.837769],[34.9048,102.837929],[34.90456,102.838112],[34.904369,102.838158],[34.90416,102.838158],[34.90387,102.838058],[34.903702,102.837914],[34.903561,102.8377],[34.90345,102.83744],[34.9034,102.837181],[34.903358,102.8367],[34.903389,102.834],[34.90337,102.833641],[34.903309,102.833313],[34.90316,102.833023],[34.902889,102.832733],[34.902481,102.832588],[34.902111,102.83255],[34.901699,102.832443],[34.90139,102.832268],[34.901291,102.832199],[34.90126,102.832207],[34.900959,102.832062],[34.90073,102.831909],[34.900188,102.831413],[34.899799,102.830994],[34.899551,102.830391],[34.89954,102.829742],[34.89975,102.828796],[34.900291,102.826729],[34.900459,102.826141],[34.900791,102.825249],[34.901192,102.824402],[34.901939,102.823067],[34.902519,102.821953],[34.902809,102.820869],[34.902828,102.820053],[34.90266,102.818581],[34.90242,102.817253],[34.902142,102.816521],[34.90155,102.816017],[34.901119,102.815987],[34.90094,102.816032],[34.900219,102.81646],[34.89735,102.818604],[34.89658,102.819038],[34.896309,102.81913],[34.895592,102.81926],[34.89455,102.81913],[34.894299,102.819038],[34.894279,102.819054],[34.893848,102.818817],[34.891331,102.817307],[34.890549,102.816818],[34.88974,102.816223],[34.889099,102.81562],[34.88662,102.813263],[34.885929,102.812698],[34.885239,102.812553],[34.883179,102.812737],[34.882179,102.812881],[34.881531,102.813217],[34.880081,102.814484],[34.879219,102.815117],[34.87833,102.815407],[34.876251,102.815826],[34.87524,102.816177],[34.87442,102.816704],[34.8736,102.817513],[34.871979,102.819473],[34.871269,102.820374],[34.87011,102.822029],[34.868389,102.825363],[34.8675,102.827492],[34.867031,102.82843],[34.866348,102.829491],[34.865631,102.830368],[34.86274,102.833412],[34.862671,102.833473],[34.862171,102.833946],[34.861832,102.834343],[34.86105,102.835129],[34.8605,102.835587],[34.859859,102.836037],[34.859131,102.836388],[34.85902,102.836411],[34.85841,102.836441],[34.856838,102.836319],[34.85606,102.836372],[34.855518,102.83654],[34.854542,102.836899],[34.85199,102.837784],[34.851212,102.838028],[34.850399,102.838058],[34.849541,102.837807],[34.847771,102.83709],[34.846642,102.836693],[34.845551,102.836502],[34.84444,102.836479],[34.84346,102.836617],[34.842529,102.836884],[34.838779,102.838303],[34.837971,102.838623],[34.836941,102.838989],[34.836239,102.839203],[34.835381,102.839401],[34.834461,102.839531],[34.83366,102.839577],[34.832821,102.839577],[34.83197,102.8395],[34.831059,102.839348],[34.830219,102.839012],[34.82938,102.838501],[34.8284,102.837921],[34.827801,102.837502],[34.828339,102.837227],[34.8283,102.836708],[34.827179,102.836128],[34.827049,102.835678],[34.826839,102.834747],[34.826328,102.83239],[34.82626,102.831909],[34.826221,102.831367],[34.825481,102.809509],[34.82452,102.804512],[34.824749,102.800652],[34.82336,102.796608],[34.823029,102.794762],[34.822659,102.792732],[34.82222,102.790337],[34.82225,102.789932],[34.82235,102.789238],[34.822399,102.788689],[34.822479,102.788254],[34.822819,102.78569],[34.82291,102.78476],[34.822922,102.784363],[34.822948,102.783829],[34.82283,102.782516],[34.822781,102.782173],[34.822762,102.781914],[34.822659,102.781242],[34.822479,102.78022],[34.822361,102.77935],[34.822289,102.778992],[34.822231,102.77858],[34.8218,102.77594],[34.82169,102.775124],[34.82148,102.773903],[34.821281,102.772614],[34.821251,102.772308],[34.821159,102.771797],[34.82077,102.769218],[34.820641,102.768478],[34.820499,102.767776],[34.82032,102.767067],[34.82,102.766113],[34.81992,102.765938],[34.81881,102.76329],[34.817699,102.760696],[34.817261,102.759697],[34.816891,102.758812],[34.816559,102.758057],[34.816399,102.757668],[34.816101,102.757004],[34.815361,102.755127],[34.81501,102.754242],[34.814602,102.753212],[34.814301,102.752411],[34.81414,102.752022],[34.814011,102.751694],[34.813309,102.749931],[34.812111,102.746841],[34.81181,102.746033],[34.811581,102.745331],[34.811359,102.744476],[34.811249,102.743782],[34.811211,102.743439],[34.811161,102.743103],[34.811131,102.742279],[34.81115,102.741661],[34.811211,102.740913],[34.81134,102.740082],[34.81142,102.739647],[34.811649,102.738876],[34.811939,102.738121],[34.812569,102.736847],[34.812939,102.736191],[34.813702,102.734894],[34.81395,102.734512],[34.814281,102.73394],[34.814442,102.733627],[34.814701,102.733047],[34.814831,102.732674],[34.814941,102.732277],[34.815048,102.731667],[34.815029,102.731659],[34.815189,102.730492],[34.81522,102.730164],[34.815319,102.729599],[34.815411,102.728943],[34.81546,102.72863],[34.815491,102.728317],[34.815609,102.727676],[34.815632,102.727371],[34.815681,102.727142],[34.815811,102.726151],[34.81591,102.725548],[34.815979,102.724693],[34.815971,102.723831],[34.815922,102.723358],[34.81583,102.722801],[34.815731,102.722366],[34.81546,102.72139],[34.813671,102.702057],[34.813679,102.701981],[34.813641,102.701767],[34.813622,102.701439],[34.81358,102.701263],[34.81353,102.700867],[34.81329,102.699417],[34.813221,102.699097],[34.813171,102.698761],[34.812931,102.697617],[34.812698,102.696899],[34.81258,102.696678],[34.81245,102.696259],[34.811798,102.69503],[34.810711,102.6931],[34.80978,102.691353],[34.80933,102.69059],[34.808609,102.689217],[34.807819,102.687881],[34.807301,102.687149],[34.806492,102.686287],[34.806389,102.68618],[34.805779,102.685753],[34.804722,102.685097],[34.80024,102.682579],[34.798962,102.681671],[34.798031,102.68074],[34.797771,102.68045],[34.796791,102.679237],[34.795681,102.677917],[34.794701,102.676682],[34.793739,102.675369],[34.792339,102.673683],[34.79084,102.672112],[34.790329,102.671608],[34.789688,102.671013],[34.78886,102.67012],[34.7882,102.669006],[34.787392,102.667397],[34.786709,102.666054],[34.786228,102.665031],[34.785648,102.663887],[34.785099,102.662712],[34.784191,102.660843],[34.783691,102.659462],[34.783642,102.659241],[34.783249,102.657211],[34.783051,102.656487],[34.782711,102.65522],[34.782429,102.653969],[34.781731,102.651283],[34.781391,102.649628],[34.78133,102.647057],[34.7812,102.644676],[34.781181,102.643707],[34.781181,102.641258],[34.78093,102.639847],[34.780602,102.638451],[34.78027,102.637558],[34.779869,102.636703],[34.77692,102.631866],[34.77594,102.630173],[34.775299,102.629143],[34.774818,102.628311],[34.774311,102.627243],[34.773731,102.625763],[34.773201,102.624527],[34.77282,102.623756],[34.77142,102.62188],[34.77108,102.621521],[34.770821,102.621147],[34.77055,102.620667],[34.770279,102.620064],[34.769798,102.619324],[34.769329,102.618683],[34.767971,102.617058],[34.767368,102.616386],[34.766109,102.615143],[34.765209,102.614143],[34.764912,102.613869],[34.764641,102.613586],[34.763229,102.611977],[34.762489,102.611],[34.76207,102.610291],[34.761742,102.609581],[34.76152,102.6092],[34.760941,102.608047],[34.759949,102.60598],[34.75972,102.605438],[34.75909,102.604111],[34.75845,102.603073],[34.75753,102.601501],[34.756649,102.600288],[34.75621,102.599533],[34.75499,102.597313],[34.75415,102.595909],[34.753601,102.594887],[34.753201,102.593872],[34.753159,102.593674],[34.75293,102.591904],[34.752861,102.590759],[34.752949,102.589401],[34.753078,102.588303],[34.75351,102.586922],[34.75565,102.579758],[34.75584,102.578217],[34.755981,102.576653],[34.756039,102.576088],[34.75629,102.574623],[34.7565,102.57196],[34.756531,102.571327],[34.75676,102.568359],[34.756779,102.567932],[34.75708,102.564949],[34.757191,102.564148],[34.757309,102.563568],[34.75753,102.56205],[34.757702,102.560501],[34.757729,102.559914],[34.75769,102.55909],[34.757641,102.558891],[34.75716,102.557549],[34.756889,102.557037],[34.75618,102.556236],[34.755322,102.55571],[34.754429,102.555428],[34.753979,102.555321],[34.752979,102.555206],[34.750229,102.554993],[34.749149,102.554863],[34.74852,102.554703],[34.747108,102.554283],[34.746811,102.554123],[34.746132,102.55365],[34.745998,102.553543],[34.745251,102.552658],[34.74506,102.55217],[34.744949,102.55172],[34.744862,102.551529],[34.74464,102.550888],[34.744049,102.549103],[34.743271,102.547394],[34.742561,102.546082],[34.74268,102.54583],[34.74239,102.545258],[34.742222,102.544983],[34.741859,102.544289],[34.741718,102.543991],[34.74144,102.54348],[34.740608,102.541634],[34.740349,102.540916],[34.739979,102.539757],[34.739399,102.537689],[34.73888,102.535637],[34.73838,102.533928],[34.738071,102.532784],[34.73782,102.531952],[34.737358,102.530571],[34.73682,102.529381],[34.73637,102.52861],[34.736069,102.528183],[34.73502,102.526894],[34.73431,102.526207],[34.733829,102.525833],[34.73296,102.525223],[34.732029,102.524673],[34.731319,102.524223],[34.726311,102.521217],[34.723518,102.519577],[34.722172,102.518883],[34.72105,102.518623],[34.719391,102.51841],[34.717651,102.518143],[34.717461,102.518097],[34.71558,102.517487],[34.71307,102.51667],[34.709629,102.515488],[34.708309,102.515083],[34.707741,102.514877],[34.70652,102.51416],[34.705318,102.513],[34.704071,102.511543],[34.703339,102.510597],[34.70274,102.509758],[34.702259,102.508583],[34.70203,102.507317],[34.70182,102.505287],[34.701599,102.502953],[34.70126,102.500847],[34.700729,102.498833],[34.700359,102.49704],[34.700291,102.49659],[34.700001,102.494347],[34.699799,102.493042],[34.69915,102.491188],[34.698078,102.490112],[34.696999,102.489166],[34.695801,102.488373],[34.69511,102.488029],[34.694759,102.4879],[34.69408,102.487679],[34.692692,102.487457],[34.690979,102.487511],[34.689369,102.487808],[34.68774,102.488319],[34.685471,102.489143],[34.683971,102.489433],[34.68269,102.489357],[34.682259,102.489273],[34.68082,102.488647],[34.679729,102.487808],[34.678478,102.486389],[34.67598,102.483437],[34.674229,102.4813],[34.67318,102.479584],[34.672508,102.4786],[34.67181,102.478119],[34.671429,102.477966],[34.671051,102.477898],[34.668739,102.477768],[34.667679,102.477547],[34.667271,102.477371],[34.665409,102.476357],[34.664761,102.476143],[34.662941,102.475693],[34.66077,102.475197],[34.659939,102.474907],[34.659328,102.474617],[34.65836,102.47403],[34.657051,102.473282],[34.65633,102.472839],[34.655609,102.472458],[34.654861,102.472214],[34.65448,102.472153],[34.654079,102.47213],[34.653461,102.472183],[34.651669,102.47242],[34.650768,102.472382],[34.6492,102.472054],[34.648781,102.471931],[34.647369,102.471687],[34.646561,102.471687],[34.64637,102.471703],[34.64497,102.472054],[34.64394,102.472504],[34.642288,102.473297],[34.640911,102.473801],[34.640308,102.473846],[34.63929,102.473633],[34.638321,102.473129],[34.636902,102.472618],[34.635311,102.472473],[34.633961,102.472221],[34.633759,102.472153],[34.63192,102.471359],[34.629452,102.470207],[34.628571,102.469833],[34.627731,102.469353],[34.626911,102.468842],[34.626579,102.468613],[34.624931,102.467598],[34.62447,102.467377],[34.623749,102.467003],[34.620998,102.465317],[34.619572,102.464363],[34.617699,102.462662],[34.617031,102.462303],[34.6161,102.461952],[34.61515,102.461853],[34.61438,102.461983],[34.61335,102.46241],[34.612289,102.463211],[34.611771,102.463799],[34.611141,102.464928],[34.610661,102.466003],[34.610538,102.466187],[34.610062,102.46682],[34.609459,102.467216],[34.608841,102.467323],[34.608318,102.467293],[34.607849,102.467133],[34.607441,102.466827],[34.606098,102.465607],[34.605228,102.464577],[34.60186,102.460617],[34.601051,102.459717],[34.59996,102.458519],[34.597759,102.456078],[34.597462,102.455803],[34.59639,102.455307],[34.595989,102.455292],[34.595409,102.455429],[34.594521,102.455887],[34.594219,102.456169],[34.593861,102.456657],[34.59367,102.45694],[34.593369,102.457336],[34.593029,102.45787],[34.591129,102.46077],[34.588699,102.464363],[34.58794,102.46537],[34.58733,102.46595],[34.586712,102.466316],[34.58577,102.46666],[34.584919,102.466667],[34.584469,102.466583],[34.583969,102.466507],[34.582829,102.466202],[34.582531,102.466187],[34.582298,102.466118],[34.58157,102.466019],[34.578449,102.46534],[34.577202,102.464851],[34.575939,102.464088],[34.574711,102.463013],[34.573879,102.461967],[34.573132,102.460823],[34.570789,102.456993],[34.56992,102.455521],[34.568779,102.454231],[34.567451,102.453133],[34.56498,102.451134],[34.563641,102.449997],[34.56292,102.44928],[34.56282,102.449142],[34.56234,102.448418],[34.560749,102.445572],[34.55888,102.442146],[34.558361,102.441238],[34.556309,102.437523],[34.555641,102.436447],[34.55505,102.435829],[34.554169,102.435059],[34.553329,102.434258],[34.552429,102.432999],[34.55085,102.430573],[34.549931,102.429123],[34.549271,102.428207],[34.548389,102.427467],[34.547298,102.426773],[34.546532,102.425888],[34.546001,102.424759],[34.54562,102.423302],[34.545071,102.421654],[34.544369,102.420593],[34.54319,102.419388],[34.542789,102.418854],[34.542461,102.418289],[34.542191,102.417671],[34.541901,102.41658],[34.54158,102.414993],[34.541168,102.413979],[34.540581,102.413132],[34.53854,102.410606],[34.537159,102.408981],[34.536518,102.408287],[34.53492,102.407066],[34.53458,102.406693],[34.53373,102.405434],[34.53315,102.404007],[34.532421,102.40184],[34.531719,102.400589],[34.53067,102.399391],[34.52882,102.397598],[34.52821,102.396782],[34.526871,102.394547],[34.525902,102.39312],[34.525051,102.392174],[34.523788,102.390823],[34.522869,102.389793],[34.521931,102.388527],[34.52145,102.38765],[34.520679,102.386192],[34.519939,102.384987],[34.519279,102.384018],[34.518421,102.382797],[34.517941,102.38208],[34.516659,102.380219],[34.515621,102.378754],[34.514771,102.376633],[34.50613,102.368523],[34.505322,102.366173],[34.5037,102.363876],[34.501049,102.359802],[34.500092,102.358276],[34.49889,102.3563],[34.497841,102.354683],[34.496971,102.353416],[34.495789,102.352112],[34.494671,102.351784],[34.48978,102.338341],[34.490662,102.336861],[34.490559,102.335258],[34.490429,102.333649],[34.490398,102.333054],[34.490261,102.331688],[34.490219,102.330711],[34.490131,102.329948],[34.489769,102.328743],[34.4893,102.32785],[34.488739,102.327042],[34.487259,102.325104],[34.48687,102.324623],[34.486191,102.323677],[34.485748,102.322968],[34.485409,102.32235],[34.485249,102.322037],[34.48457,102.320282],[34.483841,102.318626],[34.480789,102.313278],[34.479919,102.311729],[34.478199,102.308777],[34.477699,102.308037],[34.477131,102.307373],[34.47683,102.307083],[34.476021,102.306396],[34.472462,102.303352],[34.471939,102.302994],[34.47176,102.302872],[34.470989,102.302498],[34.470181,102.302277],[34.469139,102.302208],[34.468719,102.302254],[34.46809,102.302391],[34.467178,102.303284],[34.466572,102.302879],[34.465462,102.303436],[34.464691,102.303574],[34.46426,102.303612],[34.463089,102.303551],[34.462589,102.303452],[34.461342,102.302994],[34.460819,102.30275],[34.455811,102.300583],[34.45499,102.30027],[34.45414,102.300056],[34.453041,102.299957],[34.450451,102.300034],[34.44627,102.300171],[34.445278,102.300171],[34.44389,102.299896],[34.441971,102.299477],[34.439621,102.298927],[34.431759,102.297218],[34.429379,102.296806],[34.426949,102.296707],[34.426071,102.296623],[34.425629,102.296516],[34.424591,102.296173],[34.42358,102.295723],[34.42215,102.295219],[34.421108,102.295021],[34.419628,102.294083],[34.41708,102.29528],[34.413521,102.295677],[34.410141,102.296028],[34.40892,102.29612],[34.398399,102.297173],[34.394421,102.297592],[34.393822,102.297684],[34.392269,102.298111],[34.38921,102.299088],[34.38755,102.299583],[34.38662,102.299812],[34.382931,102.300613],[34.380459,102.301064],[34.379219,102.301178],[34.378189,102.301247],[34.37674,102.301529],[34.372559,102.302727],[34.370708,102.303192],[34.369881,102.303368],[34.364689,102.304161],[34.363022,102.304207],[34.359451,102.303726],[34.358231,102.303619],[34.357208,102.303612],[34.353741,102.303864],[34.352852,102.303909],[34.35051,102.304108],[34.350021,102.304199],[34.349758,102.304291],[34.348721,102.304733],[34.347759,102.305511],[34.346939,102.306488],[34.34655,102.307022],[34.346069,102.307747],[34.345402,102.308563],[34.344791,102.309082],[34.344631,102.309189],[34.34396,102.309593],[34.343269,102.309853],[34.34251,102.310028],[34.341579,102.310066],[34.338428,102.3097],[34.33593,102.309433],[34.33326,102.309067],[34.33086,102.308769],[34.32967,102.30835],[34.329151,102.307983],[34.328819,102.307709],[34.32795,102.306801],[34.327499,102.306381],[34.326248,102.305489],[34.325771,102.305237],[34.325089,102.304947],[34.32362,102.304588],[34.32235,102.30468],[34.321461,102.304947],[34.319901,102.305779],[34.318371,102.30661],[34.31649,102.307579],[34.31612,102.307793],[34.315159,102.308479],[34.313511,102.309837],[34.310379,102.312492],[34.308121,102.314293],[34.305241,102.316673],[34.303188,102.318352],[34.301781,102.319527],[34.297661,102.322906],[34.296581,102.323822],[34.29166,102.327873],[34.291111,102.328346],[34.289768,102.329712],[34.288582,102.331207],[34.280128,102.343491],[34.27388,102.352661],[34.27211,102.355057],[34.270851,102.356216],[34.268822,102.357643],[34.266102,102.359451],[34.262959,102.361519],[34.26181,102.362518],[34.260311,102.364166],[34.257961,102.366676],[34.248569,102.377083],[34.247108,102.378723],[34.24577,102.38015],[34.244541,102.381317],[34.24242,102.383034],[34.23119,102.391983],[34.222839,102.39859],[34.221378,102.399857],[34.220169,102.401161],[34.218891,102.402946],[34.215382,102.408546],[34.213509,102.411499],[34.20911,102.417763],[34.20789,102.418282],[34.207649,102.419868],[34.205429,102.422913],[34.204109,102.424973],[34.203629,102.426666],[34.203098,102.428757],[34.20248,102.432091],[34.20042,102.442657],[34.197849,102.456253],[34.1973,102.459023],[34.19706,102.460426],[34.196369,102.464111],[34.196129,102.466629],[34.195629,102.474739],[34.195271,102.477531],[34.193829,102.483788],[34.1926,102.486267],[34.19241,102.489609],[34.191132,102.493523],[34.189491,102.497711],[34.189571,102.501793],[34.188831,102.504898],[34.188229,102.508217],[34.18763,102.509987],[34.186218,102.515877],[34.185211,102.520317],[34.183899,102.525864],[34.183189,102.528763],[34.182529,102.531616],[34.181938,102.534042],[34.181278,102.536423],[34.180641,102.538559],[34.179699,102.541634],[34.17907,102.5439],[34.178169,102.546806],[34.177151,102.550217],[34.176739,102.55175],[34.176121,102.553719],[34.175461,102.555748],[34.17477,102.557159],[34.17395,102.558182],[34.17289,102.558884],[34.171749,102.559273],[34.170589,102.559387],[34.168159,102.559578],[34.16251,102.560081],[34.160141,102.560318],[34.15765,102.560509],[34.15731,102.560608],[34.157009,102.560783],[34.15667,102.561234],[34.155861,102.562752],[34.154591,102.564873],[34.154411,102.565613],[34.154419,102.565758],[34.154598,102.566277],[34.154881,102.566757],[34.155289,102.567383],[34.155651,102.567993],[34.155701,102.568123],[34.15572,102.568939],[34.155331,102.569717],[34.1549,102.570488],[34.154251,102.571564],[34.154091,102.571739],[34.15382,102.571907],[34.15242,102.572319],[34.151798,102.572937],[34.151661,102.573471],[34.151508,102.574753],[34.151279,102.577316],[34.150928,102.580673],[34.150951,102.581352],[34.151138,102.583923],[34.15094,102.584732],[34.150742,102.584976],[34.15062,102.585083],[34.15036,102.585197],[34.148972,102.585426],[34.146721,102.585762],[34.146019,102.585907],[34.145489,102.586121],[34.14447,102.586723],[34.14291,102.587181],[34.1423,102.58741],[34.141529,102.58786],[34.14101,102.588257],[34.140419,102.588898],[34.139992,102.589684],[34.137878,102.594872],[34.137569,102.595581],[34.137058,102.596458],[34.136478,102.597252],[34.136108,102.597794],[34.135769,102.598373],[34.135502,102.59919],[34.135269,102.599823],[34.134621,102.600739],[34.13414,102.601173],[34.133541,102.601761],[34.132969,102.602966],[34.13279,102.603416],[34.132259,102.604134],[34.131371,102.605133],[34.130749,102.605881],[34.130569,102.606178],[34.13039,102.606453],[34.129902,102.607567],[34.129478,102.608711],[34.129021,102.609818],[34.128429,102.610817],[34.128059,102.611389],[34.125,102.616364],[34.123699,102.618591],[34.12326,102.619942],[34.123058,102.621437],[34.123169,102.623863],[34.12286,102.62487],[34.122269,102.625343],[34.121922,102.625443],[34.120152,102.62561],[34.11916,102.629173],[34.117748,102.629852],[34.11734,102.630692],[34.11689,102.631721],[34.116718,102.632317],[34.11668,102.632736],[34.116741,102.633392],[34.117569,102.634941],[34.117119,102.636574],[34.117851,102.637733],[34.117489,102.639999],[34.11742,102.640556],[34.11742,102.640762],[34.117611,102.641777],[34.117809,102.642403],[34.118019,102.64315],[34.118118,102.64357],[34.118328,102.644272],[34.118549,102.645073],[34.118622,102.645287],[34.11869,102.6455],[34.118961,102.646332],[34.119091,102.646553],[34.119579,102.646988],[34.12048,102.647331],[34.120602,102.647346],[34.120838,102.647476],[34.121189,102.647629],[34.121571,102.647881],[34.12178,102.648064],[34.122101,102.648453],[34.122299,102.648804],[34.122421,102.649071],[34.12252,102.649559],[34.12254,102.650414],[34.12241,102.651123],[34.12159,102.654167],[34.12141,102.654877],[34.120789,102.657181],[34.120602,102.657951],[34.119202,102.663193],[34.11874,102.664993],[34.117939,102.667877],[34.117481,102.669327],[34.117271,102.669952],[34.116741,102.671371],[34.116451,102.672081],[34.11586,102.673431],[34.115139,102.674973],[34.114189,102.67688],[34.113899,102.67749],[34.113861,102.677513],[34.113602,102.678078],[34.11298,102.679298],[34.111851,102.681679],[34.11161,102.682251],[34.111301,102.683113],[34.110828,102.684723],[34.110661,102.68541],[34.11026,102.686928],[34.10931,102.690353],[34.108589,102.693024],[34.108318,102.694092],[34.107891,102.695663],[34.107639,102.696693],[34.10741,102.697479],[34.107201,102.698318],[34.106979,102.699112],[34.1068,102.699806],[34.106602,102.700508],[34.10611,102.702332],[34.105911,102.703239],[34.10569,102.704292],[34.105518,102.705276],[34.10527,102.70755],[34.105209,102.708504],[34.10516,102.709648],[34.105122,102.711617],[34.105061,102.712791],[34.104931,102.713821],[34.104752,102.714607],[34.104321,102.715973],[34.104279,102.716187],[34.104019,102.716766],[34.10371,102.71772],[34.103432,102.71846],[34.103142,102.71933],[34.102959,102.720306],[34.10294,102.720757],[34.103001,102.72171],[34.10358,102.725479],[34.10368,102.726471],[34.10368,102.727333],[34.103619,102.727814],[34.103371,102.728653],[34.102989,102.729439],[34.102558,102.730049],[34.102509,102.730164],[34.10207,102.730568],[34.10099,102.731247],[34.100201,102.731697],[34.098301,102.732727],[34.09761,102.733131],[34.09655,102.733688],[34.095421,102.734306],[34.094818,102.734612],[34.094059,102.734802],[34.093418,102.734848],[34.092781,102.734718],[34.092171,102.734459],[34.091621,102.734123],[34.090931,102.733582],[34.090691,102.733414],[34.087151,102.730698],[34.086498,102.730301],[34.086021,102.730087],[34.085419,102.729973],[34.084221,102.729912],[34.08215,102.729851],[34.081181,102.729134],[34.07951,102.730637],[34.07851,102.729851],[34.077999,102.729927],[34.078018,102.729927],[34.077862,102.72998],[34.077381,102.730087],[34.07605,102.730476],[34.0742,102.730957],[34.073021,102.731308],[34.072559,102.731361],[34.072121,102.731377],[34.071659,102.731323],[34.071259,102.731216],[34.069962,102.730743],[34.0695,102.730553],[34.067268,102.729713],[34.06567,102.729057],[34.064571,102.728554],[34.062561,102.727524],[34.062019,102.727226],[34.05949,102.725906],[34.059021,102.725723],[34.058472,102.725548],[34.05484,102.724602],[34.054459,102.724518],[34.05402,102.724388],[34.053341,102.724113],[34.052719,102.723793],[34.04837,102.721077],[34.048031,102.720886],[34.04689,102.720177],[34.04665,102.720039],[34.04604,102.719757],[34.045361,102.719566],[34.044289,102.719398],[34.0443,102.719414],[34.044189,102.719414],[34.043919,102.71936],[34.043369,102.719299],[34.042461,102.719162],[34.042141,102.719139],[34.04137,102.719017],[34.04052,102.718941],[34.040279,102.71888],[34.039242,102.718773],[34.038658,102.718681],[34.038349,102.718658],[34.037701,102.718559],[34.036789,102.718437],[34.036201,102.718437],[34.03595,102.718483],[34.035679,102.718536],[34.035469,102.71862],[34.035061,102.718903],[34.034851,102.719101],[34.034481,102.719582],[34.034019,102.720261],[34.032318,102.722923],[34.032169,102.723129],[34.031799,102.723518],[34.031601,102.723686],[34.03141,102.723824],[34.03117,102.723953],[34.03093,102.724037],[34.030689,102.724113],[34.03043,102.724152],[34.03019,102.724136],[34.029148,102.72406],[34.028519,102.723984],[34.028259,102.723991],[34.027969,102.723953],[34.02771,102.723953],[34.027409,102.723999],[34.027111,102.724083],[34.026871,102.724167],[34.026611,102.724319],[34.026119,102.724693],[34.025501,102.725212],[34.025318,102.725319],[34.02512,102.725502],[34.024391,102.726021],[34.023659,102.726501],[34.023232,102.726753],[34.023048,102.726883],[34.022831,102.726997],[34.021309,102.72789],[34.021019,102.728081],[34.020611,102.728416],[34.020409,102.72863],[34.019951,102.729271],[34.019691,102.729782],[34.018902,102.731781],[34.018452,102.732986],[34.018139,102.733757],[34.017879,102.734299],[34.01767,102.734619],[34.017479,102.734863],[34.01725,102.735107],[34.017052,102.735359],[34.016781,102.735641],[34.013119,102.738113],[34.008789,102.741043],[34.00354,102.74456],[34.002659,102.745171],[34.002548,102.745232],[34.001911,102.745667],[34.001431,102.745911],[34.000221,102.746902],[33.99966,102.747452],[33.999161,102.748161],[33.998959,102.74855],[33.998829,102.748894],[33.998611,102.749763],[33.99855,102.750549],[33.998581,102.751427],[33.998661,102.752113],[33.99894,102.753883],[33.998981,102.754433],[33.99905,102.754868],[33.999142,102.755241],[33.999321,102.756371],[33.999962,102.760437],[34.00042,102.763367],[34.00053,102.764191],[34.00061,102.765053],[34.00058,102.765778],[34.00045,102.766693],[34.000111,102.767281],[33.99979,102.767883],[33.997421,102.771591],[33.997379,102.77169],[33.997211,102.771896],[33.9944,102.77623],[33.991291,102.781052],[33.990311,102.782539],[33.988289,102.785713],[33.98724,102.787323],[33.985649,102.789726],[33.984509,102.791489],[33.983978,102.792351],[33.982471,102.794647],[33.980518,102.797699],[33.980141,102.798248],[33.979351,102.799507],[33.978889,102.800194],[33.97575,102.805038],[33.97533,102.805717],[33.974899,102.806343],[33.97456,102.806892],[33.97398,102.807747],[33.97361,102.808327],[33.973179,102.808983],[33.97274,102.809677],[33.97234,102.81028],[33.971889,102.810997],[33.967892,102.817139],[33.966999,102.818527],[33.966179,102.819763],[33.965462,102.820877],[33.96508,102.821442],[33.96019,102.828987],[33.95985,102.829529],[33.956089,102.83532],[33.955639,102.836037],[33.955219,102.836662],[33.954239,102.838188],[33.953659,102.83905],[33.953629,102.839073],[33.953621,102.839127],[33.953159,102.839882],[33.950729,102.843613],[33.950432,102.844116],[33.949982,102.844757],[33.943562,102.854668],[33.941631,102.857613],[33.937241,102.864418],[33.936729,102.865189],[33.936131,102.865997],[33.935501,102.866768],[33.93491,102.867416],[33.934181,102.868118],[33.930019,102.871872],[33.929482,102.872414],[33.928982,102.873016],[33.928581,102.873756],[33.928459,102.874039],[33.928261,102.874702],[33.927151,102.879211],[33.926868,102.880211],[33.92659,102.880882],[33.926262,102.881554],[33.92585,102.882187],[33.925751,102.882309],[33.92522,102.882874],[33.924709,102.883324],[33.92411,102.883743],[33.921749,102.8853],[33.912102,102.891747],[33.909801,102.893257],[33.908459,102.894173],[33.90493,102.896492],[33.90419,102.897003],[33.902908,102.897842],[33.900631,102.899384],[33.894958,102.903137],[33.894371,102.903549],[33.88932,102.906891],[33.88871,102.907333],[33.888161,102.907669],[33.885799,102.909233],[33.885151,102.909683],[33.88385,102.910522],[33.880421,102.912827],[33.872849,102.917847],[33.871632,102.918694],[33.871029,102.91906],[33.861191,102.925621],[33.84753,102.934692],[33.843861,102.937149],[33.8433,102.937508],[33.839359,102.94014],[33.838619,102.940613],[33.837799,102.94117],[33.83699,102.941803],[33.83633,102.942436],[33.835701,102.943169],[33.83033,102.950912],[33.830059,102.951248],[33.82962,102.951691],[33.829041,102.952103],[33.828609,102.952293],[33.828289,102.952393],[33.827839,102.952477],[33.825901,102.952759],[33.825291,102.952873],[33.824951,102.952972],[33.82473,102.953056],[33.82378,102.95359],[33.82267,102.954277],[33.822578,102.954353],[33.821991,102.954712],[33.821289,102.955017],[33.82061,102.9552],[33.817371,102.955978],[33.815041,102.95649],[33.814362,102.956612],[33.813492,102.95665],[33.812759,102.956581],[33.811111,102.95649],[33.809631,102.956383],[33.808189,102.956322],[33.80751,102.956383],[33.806839,102.956612],[33.806271,102.956963],[33.80566,102.957474],[33.803619,102.959358],[33.802921,102.959923],[33.802151,102.96032],[33.801472,102.960487],[33.800758,102.96051],[33.800201,102.960388],[33.799492,102.960083],[33.798309,102.959412],[33.797821,102.959167],[33.797161,102.958946],[33.796391,102.958923],[33.79549,102.959068],[33.795151,102.959137],[33.794991,102.959137],[33.79488,102.95919],[33.789989,102.960152],[33.788921,102.960342],[33.788219,102.960487],[33.787189,102.960617],[33.786499,102.960617],[33.78574,102.960587],[33.784649,102.96048],[33.783852,102.960327],[33.781792,102.96003],[33.781132,102.959969],[33.78038,102.959976],[33.779659,102.960052],[33.778271,102.960243],[33.777191,102.960342],[33.775761,102.960533],[33.77491,102.960587],[33.77422,102.960609],[33.773399,102.960564],[33.772469,102.960442],[33.771858,102.960327],[33.7701,102.959953],[33.767799,102.959488],[33.763859,102.958656],[33.76247,102.958344],[33.760979,102.957939],[33.759571,102.957527],[33.758968,102.957336],[33.75602,102.956253],[33.75528,102.955994],[33.74733,102.953102],[33.746521,102.952003],[33.739429,102.953453],[33.73904,102.95488],[33.738609,102.955276],[33.738121,102.955704],[33.737041,102.956688],[33.73307,102.960243],[33.732578,102.960716],[33.731289,102.961899],[33.730652,102.962433],[33.72995,102.962967],[33.729382,102.963333],[33.72916,102.963417],[33.728291,102.963753],[33.72757,102.963913],[33.726791,102.963966],[33.720871,102.964233],[33.71986,102.964287],[33.719379,102.964302],[33.717449,102.964409],[33.711418,102.964668],[33.706329,102.964928],[33.704552,102.964989],[33.703678,102.964943],[33.7029,102.96479],[33.700619,102.964142],[33.699989,102.963997],[33.699162,102.963982],[33.69836,102.964157],[33.696911,102.964821],[33.6945,102.966003],[33.68998,102.968147],[33.689308,102.968353],[33.68885,102.96843],[33.68819,102.968384],[33.687592,102.968231],[33.687099,102.967987],[33.686779,102.967796],[33.686111,102.967247],[33.685181,102.966362],[33.684639,102.965912],[33.684299,102.965668],[33.683739,102.965393],[33.683189,102.965149],[33.682461,102.964928],[33.681049,102.964546],[33.68066,102.96447],[33.67968,102.964203],[33.679169,102.964073],[33.678822,102.963959],[33.677391,102.9636],[33.677269,102.963593],[33.676781,102.963371],[33.676491,102.963211],[33.67598,102.962837],[33.675831,102.962708],[33.674549,102.961243],[33.674171,102.960907],[33.673759,102.960617],[33.673061,102.96032],[33.67297,102.960274],[33.672691,102.960243],[33.672081,102.96022],[33.672058,102.960243],[33.671799,102.960251],[33.67091,102.960327],[33.669979,102.960426],[33.668468,102.960564],[33.667591,102.960587],[33.666801,102.96048],[33.66629,102.960281],[33.66592,102.960052],[33.66552,102.959747],[33.66534,102.959587],[33.665039,102.959244],[33.66473,102.958801],[33.663448,102.956543],[33.662201,102.954262],[33.66201,102.953957],[33.66161,102.953217],[33.661018,102.952362],[33.66029,102.951698],[33.659512,102.951286],[33.659019,102.951157],[33.65802,102.950996],[33.653961,102.950623],[33.65266,102.95047],[33.651711,102.950119],[33.65136,102.949898],[33.650639,102.949242],[33.649712,102.94828],[33.648491,102.946968],[33.64846,102.946907],[33.647911,102.946327],[33.647621,102.946083],[33.6474,102.945847],[33.647099,102.945572],[33.646801,102.945328],[33.64645,102.945084],[33.646141,102.944893],[33.645821,102.944748],[33.64521,102.944527],[33.644489,102.944389],[33.643711,102.944397],[33.64344,102.944443],[33.64278,102.944603],[33.64246,102.94471],[33.641861,102.945023],[33.641541,102.945221],[33.641239,102.945457],[33.640751,102.945892],[33.640251,102.946373],[33.63728,102.9496],[33.63625,102.950737],[33.635609,102.951401],[33.635101,102.951851],[33.634411,102.95224],[33.634312,102.952278],[33.633221,102.95253],[33.631989,102.952599],[33.631111,102.952782],[33.630299,102.953247],[33.62973,102.953773],[33.628448,102.955116],[33.627991,102.955566],[33.627449,102.955917],[33.626678,102.956131],[33.625938,102.956017],[33.625351,102.955704],[33.624329,102.954811],[33.624031,102.954567],[33.623772,102.954407],[33.623371,102.954208],[33.623089,102.954109],[33.622799,102.954048],[33.622501,102.95401],[33.622181,102.954018],[33.620621,102.954269],[33.620171,102.954308],[33.619781,102.954308],[33.61916,102.954224],[33.618759,102.954086],[33.618351,102.953903],[33.618019,102.95369],[33.617241,102.95314],[33.616989,102.952904],[33.616562,102.95256],[33.615978,102.952049],[33.615711,102.951843],[33.615139,102.951447],[33.614639,102.951218],[33.614071,102.951111],[33.613449,102.951157],[33.61269,102.951347],[33.612331,102.951462],[33.611542,102.95166],[33.61105,102.951683],[33.610149,102.951462],[33.609959,102.951347],[33.609249,102.950798],[33.609169,102.950706],[33.60878,102.950104],[33.607841,102.947853],[33.607712,102.94751],[33.607029,102.945877],[33.60688,102.945473],[33.606258,102.944077],[33.605999,102.943443],[33.606239,102.942429],[33.605961,102.942207],[33.605289,102.941772],[33.603168,102.941093],[33.602612,102.939697],[33.598629,102.938179],[33.598061,102.937988],[33.597691,102.937843],[33.597599,102.937843],[33.596951,102.937767],[33.59639,102.937759],[33.595661,102.93869],[33.594891,102.938461],[33.59399,102.938477],[33.59269,102.940697],[33.592319,102.940483],[33.592289,102.940483],[33.59235,102.940598],[33.592289,102.940742],[33.59235,102.941292],[33.59026,102.944901],[33.588982,102.944992],[33.588531,102.945557],[33.588219,102.94593],[33.58786,102.946457],[33.586781,102.947868],[33.586369,102.948547],[33.58622,102.948624],[33.58601,102.948837],[33.585121,102.949966],[33.584629,102.950562],[33.584221,102.950989],[33.583839,102.951408],[33.582951,102.952339],[33.582539,102.952797],[33.580509,102.954964],[33.579029,102.956596],[33.57869,102.95694],[33.577942,102.957771],[33.577641,102.958038],[33.57756,102.958092],[33.577511,102.958138],[33.577469,102.958168],[33.57653,102.961349],[33.576649,102.961388],[33.576839,102.9618],[33.577148,102.962677],[33.577599,102.964157],[33.577709,102.964577],[33.578209,102.965652],[33.577011,102.967728],[33.562309,102.992767],[33.56229,102.995613],[33.56152,102.997063],[33.560551,102.998123],[33.558681,102.998947],[33.55827,103.000237],[33.558331,103.003082],[33.55722,103.005333],[33.556961,103.007217],[33.556789,103.008347],[33.55669,103.00946],[33.55669,103.016533],[33.556629,103.018227],[33.556561,103.018593],[33.556301,103.019386],[33.556061,103.019974],[33.55497,103.022774],[33.554691,103.023613],[33.554531,103.024307],[33.554489,103.024986],[33.554611,103.025681],[33.554852,103.026299],[33.555038,103.026611],[33.55547,103.027077],[33.556049,103.027412],[33.556301,103.027473],[33.558159,103.027588],[33.558571,103.027443],[33.560741,103.027687],[33.562149,103.02787],[33.564812,103.028107],[33.56588,103.028259],[33.566101,103.028313],[33.566521,103.02845],[33.567268,103.028893],[33.568119,103.029701],[33.568401,103.03009],[33.568619,103.030518],[33.569099,103.031937],[33.56929,103.032692],[33.570278,103.03598],[33.570869,103.037613],[33.571529,103.038567],[33.571819,103.038918],[33.572639,103.039703],[33.57436,103.041023],[33.576141,103.042473],[33.577438,103.043503],[33.578541,103.044456],[33.57946,103.045403],[33.58009,103.046387],[33.580711,103.047668],[33.581051,103.048508],[33.581772,103.050163],[33.582081,103.050926],[33.582359,103.051498],[33.583759,103.054657],[33.584389,103.05619],[33.5853,103.058311],[33.585911,103.059708],[33.58717,103.062637],[33.587841,103.064102],[33.588612,103.066017],[33.589489,103.067993],[33.590069,103.069412],[33.59116,103.072006],[33.592331,103.0737],[33.592239,103.076012],[33.591888,103.077469],[33.588421,103.091187],[33.58823,103.093384],[33.587769,103.099693],[33.586311,103.101318],[33.58577,103.102692],[33.58519,103.103661],[33.584728,103.104362],[33.584541,103.104553],[33.583931,103.10508],[33.583511,103.105438],[33.582981,103.105759],[33.581848,103.106354],[33.576511,103.108421],[33.56625,103.112213],[33.562092,103.113823],[33.560051,103.114532],[33.557999,103.115288],[33.556381,103.115921],[33.554642,103.116798],[33.55278,103.118057],[33.540932,103.12635],[33.540051,103.126831],[33.53867,103.127197],[33.536831,103.127403],[33.534981,103.127831],[33.533508,103.128571],[33.532131,103.129562],[33.530449,103.130882],[33.528648,103.132103],[33.52784,103.132584],[33.526031,103.13372],[33.525089,103.134483],[33.523491,103.136093],[33.52187,103.137619],[33.520359,103.138779],[33.518581,103.139954],[33.51659,103.141243],[33.51403,103.142937],[33.512081,103.144287],[33.510559,103.145508],[33.5093,103.146713],[33.508282,103.147774],[33.506821,103.149513],[33.505219,103.151497],[33.503681,103.153297],[33.502419,103.154572],[33.501141,103.155182],[33.498909,103.156174],[33.49741,103.157066],[33.496059,103.158203],[33.494041,103.160233],[33.490829,103.163582],[33.4893,103.164886],[33.488022,103.165588],[33.48666,103.165993],[33.482281,103.167053],[33.48,103.167587],[33.47776,103.167923],[33.47578,103.167976],[33.47366,103.167992],[33.473042,103.168053],[33.472118,103.168411],[33.471451,103.168877],[33.46891,103.171303],[33.46743,103.172752],[33.466019,103.173973],[33.465092,103.174339],[33.464039,103.174347],[33.463402,103.17424],[33.460442,103.17347],[33.459129,103.173553],[33.458099,103.17395],[33.456661,103.174797],[33.452709,103.177162],[33.451981,103.177551],[33.450802,103.177933],[33.448799,103.178253],[33.4459,103.178673],[33.444172,103.178818],[33.442329,103.178841],[33.440689,103.178886],[33.43597,103.178757],[33.43486,103.178963],[33.434509,103.179077],[33.43354,103.179619],[33.432861,103.180191],[33.432621,103.180367],[33.428909,103.183418],[33.427761,103.184303],[33.426731,103.185028],[33.426079,103.185371],[33.424889,103.185768],[33.423561,103.186249],[33.42234,103.186783],[33.42144,103.187538],[33.420849,103.188568],[33.41993,103.190323],[33.419071,103.191368],[33.41795,103.1922],[33.416611,103.192886],[33.41518,103.193527],[33.414162,103.193932],[33.412579,103.19426],[33.411289,103.194458],[33.409969,103.194748],[33.409081,103.195297],[33.408409,103.195999],[33.407421,103.197197],[33.40657,103.198158],[33.40559,103.198967],[33.40443,103.199654],[33.403301,103.200119],[33.402142,103.200333],[33.400848,103.200493],[33.3992,103.20047],[33.39814,103.200737],[33.397228,103.201271],[33.395699,103.202797],[33.39473,103.20369],[33.393841,103.204552],[33.393452,103.204903],[33.39249,103.205544],[33.391548,103.20594],[33.39053,103.205963],[33.38789,103.205322],[33.3843,103.204483],[33.38155,103.203796],[33.380268,103.203644],[33.380119,103.203667],[33.37936,103.20401],[33.378689,103.204781],[33.377628,103.206673],[33.377392,103.20694],[33.376301,103.207603],[33.37542,103.207771],[33.375221,103.207787],[33.373589,103.207779],[33.371601,103.207703],[33.369869,103.20768],[33.368271,103.207527],[33.364609,103.206711],[33.363331,103.206749],[33.362511,103.206848],[33.35915,103.207161],[33.35651,103.207298],[33.354771,103.207253],[33.352612,103.206963],[33.350712,103.206741],[33.350052,103.206711],[33.348801,103.20694],[33.34761,103.207336],[33.346218,103.207764],[33.344971,103.207817],[33.34351,103.207718],[33.340851,103.207443],[33.339149,103.207283],[33.337589,103.207191],[33.33651,103.207367],[33.335629,103.207718],[33.335289,103.207893],[33.33448,103.208481],[33.33342,103.209343],[33.332958,103.209671],[33.331921,103.210167],[33.33073,103.210426],[33.328442,103.210587],[33.326839,103.21067],[33.32542,103.210709],[33.324169,103.210793],[33.322571,103.210983],[33.32114,103.211067],[33.31963,103.21125],[33.318501,103.211456],[33.318321,103.211517],[33.317341,103.212067],[33.317051,103.212341],[33.31641,103.213173],[33.315929,103.214523],[33.315769,103.215584],[33.315392,103.217644],[33.315022,103.218781],[33.31493,103.218964],[33.314308,103.219673],[33.31403,103.219887],[33.31282,103.220322],[33.310768,103.220886],[33.309471,103.221313],[33.308739,103.221474],[33.307789,103.221581],[33.307049,103.221519],[33.304871,103.221161],[33.30373,103.221107],[33.30304,103.221283],[33.301949,103.221893],[33.30154,103.222267],[33.3009,103.223007],[33.300018,103.223831],[33.29895,103.224327],[33.297581,103.224564],[33.296982,103.22464],[33.295471,103.22496],[33.294319,103.225349],[33.292728,103.226143],[33.291061,103.226891],[33.288261,103.227432],[33.286781,103.227943],[33.282139,103.229927],[33.280621,103.230652],[33.276501,103.233047],[33.274921,103.234009],[33.273731,103.234467],[33.27227,103.234741],[33.271271,103.23468],[33.270931,103.234619],[33.27002,103.234413],[33.26836,103.233803],[33.26722,103.233566],[33.266048,103.233704],[33.264832,103.233948],[33.261791,103.23468],[33.26038,103.234917],[33.25914,103.235062],[33.257462,103.235161],[33.253731,103.235443],[33.25238,103.235397],[33.25106,103.235001],[33.249592,103.234207],[33.245819,103.232117],[33.244678,103.231339],[33.24382,103.230408],[33.240059,103.225594],[33.238972,103.224113],[33.23819,103.223106],[33.23785,103.22274],[33.23695,103.222267],[33.236149,103.22216],[33.235329,103.222282],[33.233398,103.222618],[33.231781,103.22258],[33.231091,103.222488],[33.22718,103.221893],[33.225471,103.221657],[33.224178,103.221687],[33.223011,103.22187],[33.221619,103.222328],[33.219818,103.223061],[33.218491,103.223648],[33.21571,103.2248],[33.214199,103.225372],[33.212749,103.225952],[33.20895,103.227547],[33.202869,103.230019],[33.201542,103.230637],[33.199081,103.23204],[33.197811,103.23259],[33.19664,103.232933],[33.19558,103.233063],[33.194279,103.233063],[33.192841,103.23288],[33.191399,103.232643],[33.18642,103.231979],[33.185291,103.231842],[33.183811,103.231827],[33.18346,103.231873],[33.182259,103.232147],[33.180988,103.232643],[33.179909,103.233147],[33.178261,103.233887],[33.176609,103.234703],[33.1754,103.23526],[33.17424,103.235748],[33.173161,103.236099],[33.171631,103.236526],[33.168621,103.23732],[33.167042,103.237823],[33.16547,103.238548],[33.164291,103.239281],[33.160252,103.242126],[33.15736,103.244202],[33.155819,103.245247],[33.15461,103.245842],[33.15316,103.246277],[33.15181,103.246437],[33.14666,103.246887],[33.145031,103.24704],[33.1436,103.247307],[33.142368,103.247726],[33.14098,103.248497],[33.139992,103.249237],[33.134682,103.253471],[33.13332,103.254578],[33.132111,103.255623],[33.13126,103.256447],[33.130001,103.257912],[33.128738,103.259537],[33.127579,103.261253],[33.126831,103.262512],[33.12627,103.263611],[33.124859,103.266617],[33.124149,103.268204],[33.123569,103.269531],[33.12236,103.272102],[33.12175,103.273468],[33.121052,103.274872],[33.1194,103.278381],[33.118641,103.280159],[33.118469,103.281509],[33.118641,103.284523],[33.118599,103.285828],[33.118481,103.286583],[33.11805,103.287819],[33.116661,103.290291],[33.11607,103.291298],[33.114521,103.294037],[33.113831,103.295357],[33.110771,103.300713],[33.108799,103.30423],[33.10693,103.307663],[33.10585,103.309563],[33.10474,103.311562],[33.10376,103.313301],[33.10342,103.313927],[33.10157,103.317261],[33.100632,103.318848],[33.099758,103.320091],[33.096821,103.323883],[33.096001,103.324966],[33.095161,103.326042],[33.094471,103.327003],[33.093639,103.328377],[33.092258,103.331177],[33.091648,103.332573],[33.091042,103.333832],[33.090149,103.335831],[33.089481,103.337082],[33.088829,103.338371],[33.08831,103.339577],[33.087849,103.340714],[33.087318,103.342339],[33.087101,103.343529],[33.086899,103.345703],[33.086929,103.347954],[33.08675,103.349571],[33.0863,103.350693],[33.08556,103.351624],[33.084641,103.352303],[33.078941,103.355186],[33.078522,103.35537],[33.077671,103.355667],[33.076359,103.355904],[33.075459,103.355949],[33.0746,103.355873],[33.07333,103.355553],[33.07206,103.355103],[33.071529,103.354889],[33.069302,103.35408],[33.06802,103.353828],[33.066929,103.353844],[33.06506,103.35424],[33.063622,103.354446],[33.062641,103.354362],[33.061691,103.354103],[33.060921,103.353767],[33.060162,103.353394],[33.05899,103.352783],[33.056351,103.351448],[33.055248,103.350853],[33.05402,103.350143],[33.052711,103.349342],[33.051449,103.348427],[33.050282,103.347649],[33.049179,103.347076],[33.048111,103.346832],[33.046661,103.346809],[33.04493,103.347054],[33.043259,103.347359],[33.04216,103.347313],[33.040951,103.347214],[33.039921,103.347031],[33.038059,103.346832],[33.037102,103.347107],[33.029449,103.349022],[33.028889,103.349289],[33.02813,103.349907],[33.027081,103.351288],[33.026409,103.352318],[33.025848,103.353027],[33.024971,103.353699],[33.023991,103.354027],[33.021801,103.354317],[33.020592,103.354553],[33.019341,103.354713],[33.017941,103.354828],[33.016911,103.35479],[33.016479,103.354752],[33.01535,103.354446],[33.01424,103.354088],[33.013458,103.353592],[33.01091,103.352257],[33.0103,103.351982],[33.008732,103.351624],[33.005501,103.351112],[33.004581,103.3507],[33.003799,103.350021],[33.003651,103.349854],[33.003201,103.349083],[33.002541,103.347862],[33.001862,103.346657],[33.001579,103.346313],[33.00087,103.345573],[32.999931,103.345062],[32.998878,103.344803],[32.992008,103.343224],[32.990391,103.343048],[32.989071,103.34304],[32.987709,103.343117],[32.986309,103.343323],[32.984741,103.343651],[32.979359,103.344963],[32.977219,103.345512],[32.974861,103.346077],[32.970989,103.347076],[32.96925,103.347572],[32.967682,103.348213],[32.966331,103.348824],[32.965172,103.349152],[32.964169,103.349197],[32.963829,103.349136],[32.962742,103.348732],[32.960621,103.347633],[32.959702,103.347198],[32.95908,103.347054],[32.95863,103.347038],[32.958031,103.347107],[32.957119,103.347351],[32.955151,103.347977],[32.952831,103.348663],[32.952141,103.3489],[32.951641,103.349167],[32.95116,103.349442],[32.949409,103.350571],[32.94825,103.351273],[32.94762,103.351593],[32.947079,103.351791],[32.945309,103.35257],[32.944351,103.3526],[32.943501,103.352821],[32.943272,103.352859],[32.941738,103.353241],[32.940842,103.353378],[32.940022,103.353416],[32.93951,103.353409],[32.938541,103.353279],[32.937328,103.352989],[32.936821,103.352829],[32.935581,103.352386],[32.93502,103.352127],[32.93438,103.35173],[32.92968,103.348557],[32.928959,103.348389],[32.92881,103.348389],[32.927872,103.348579],[32.927238,103.348923],[32.926979,103.349167],[32.926231,103.350121],[32.92588,103.350883],[32.92561,103.351929],[32.925621,103.353188],[32.926079,103.354408],[32.92646,103.355003],[32.926689,103.355247],[32.926819,103.35537],[32.927231,103.355652],[32.92894,103.356537],[32.92939,103.356903],[32.92963,103.357208],[32.929829,103.357567],[32.929981,103.358223],[32.930019,103.358673],[32.93,103.359138],[32.929909,103.3601],[32.930092,103.361542],[32.93021,103.362022],[32.93042,103.36274],[32.930618,103.364227],[32.930641,103.364723],[32.930511,103.366203],[32.93037,103.366928],[32.929901,103.370033],[32.929829,103.370567],[32.92918,103.373558],[32.928799,103.375076],[32.928452,103.376228],[32.928242,103.377434],[32.928139,103.378677],[32.928169,103.3797],[32.928249,103.38044],[32.928341,103.380913],[32.928692,103.382339],[32.928909,103.382988],[32.929192,103.383743],[32.929409,103.384277],[32.929859,103.385559],[32.930119,103.386688],[32.93008,103.38781],[32.929829,103.388687],[32.92976,103.388863],[32.929501,103.389328],[32.929329,103.389587],[32.928612,103.390182],[32.927959,103.390533],[32.92667,103.391029],[32.9259,103.391296],[32.924332,103.391922],[32.924019,103.392059],[32.921459,103.393173],[32.92033,103.393883],[32.918991,103.394997],[32.91835,103.397507],[32.918289,103.399567],[32.918541,103.402367],[32.918579,103.403191],[32.918869,103.404228],[32.91993,103.406593],[32.920429,103.408546],[32.9212,103.410851],[32.921989,103.412651],[32.922771,103.414688],[32.92392,103.417473],[32.9244,103.418663],[32.92532,103.420891],[32.92561,103.421631],[32.925999,103.422462],[32.926659,103.423683],[32.927441,103.424919],[32.928329,103.426208],[32.928848,103.427254],[32.928989,103.427818],[32.92905,103.429153],[32.928909,103.430054],[32.928532,103.431862],[32.928421,103.432999],[32.928551,103.434288],[32.928719,103.435532],[32.928741,103.436203],[32.92852,103.437347],[32.92844,103.437569],[32.927872,103.438599],[32.926811,103.440201],[32.92614,103.441238],[32.925838,103.441612],[32.92487,103.442177],[32.924221,103.442284],[32.923759,103.442238],[32.92308,103.442139],[32.92284,103.442032],[32.922298,103.441994],[32.921169,103.441811],[32.919289,103.441727],[32.917931,103.441872],[32.917221,103.442162],[32.916569,103.442596],[32.914398,103.444443],[32.913891,103.444946],[32.912571,103.446381],[32.911499,103.447723],[32.91016,103.449493],[32.90984,103.449928],[32.909279,103.450684],[32.90884,103.451134],[32.907711,103.452148],[32.90715,103.452873],[32.906818,103.453522],[32.90646,103.454453],[32.906151,103.455406],[32.905731,103.456581],[32.905121,103.457428],[32.904419,103.458252],[32.90411,103.458588],[32.903252,103.459747],[32.903019,103.460037],[32.90263,103.460426],[32.90176,103.461113],[32.901588,103.461182],[32.901039,103.461357],[32.900089,103.461479],[32.89872,103.461533],[32.897171,103.46167],[32.896172,103.461678],[32.894901,103.461601],[32.89386,103.461304],[32.893242,103.461021],[32.892818,103.460808],[32.88744,103.45845],[32.885921,103.458076],[32.884232,103.45826],[32.88364,103.458801],[32.88335,103.459244],[32.883228,103.460114],[32.883331,103.461067],[32.883701,103.462151],[32.884941,103.464317],[32.885361,103.465477],[32.88559,103.466217],[32.885941,103.46756],[32.886768,103.471481],[32.88702,103.472878],[32.88702,103.473999],[32.886959,103.474541],[32.8867,103.475273],[32.886589,103.475487],[32.886299,103.475929],[32.885639,103.476753],[32.885151,103.477409],[32.884171,103.4786],[32.883739,103.479172],[32.883289,103.480072],[32.883289,103.481178],[32.88422,103.483498],[32.884609,103.484032],[32.885479,103.484833],[32.885681,103.485199],[32.885921,103.486977],[32.886101,103.48748],[32.88789,103.488998],[32.88847,103.489853],[32.889359,103.490211],[32.88966,103.490784],[32.89048,103.491524],[32.890678,103.491867],[32.890888,103.492531],[32.89201,103.494492],[32.89254,103.495956],[32.8932,103.496986],[32.893539,103.497864],[32.894569,103.499237],[32.894711,103.499672],[32.894741,103.500282],[32.895451,103.501518],[32.89576,103.503227],[32.895981,103.503563],[32.896961,103.504143],[32.898571,103.505417],[32.898788,103.505783],[32.89922,103.506897],[32.89954,103.508629],[32.899872,103.509567],[32.901138,103.512047],[32.9021,103.513329],[32.90271,103.514191],[32.90337,103.515282],[32.903599,103.5159],[32.90369,103.51725],[32.903641,103.5177],[32.903542,103.51815],[32.9034,103.51857],[32.903118,103.51918],[32.90287,103.519539],[32.901981,103.52021],[32.89875,103.521294],[32.897659,103.521713],[32.896591,103.52224],[32.895561,103.522926],[32.89481,103.523613],[32.89386,103.524544],[32.892632,103.525681],[32.89151,103.526657],[32.889999,103.528061],[32.88969,103.528328],[32.887032,103.530907],[32.88538,103.532829],[32.88414,103.534088],[32.883041,103.535133],[32.88232,103.535957],[32.88184,103.536827],[32.881329,103.538147],[32.880569,103.539284],[32.880119,103.539719],[32.87899,103.540367],[32.878181,103.540756],[32.876961,103.541527],[32.87677,103.541687],[32.875542,103.542923],[32.87439,103.544113],[32.87344,103.544777],[32.87281,103.54496],[32.872379,103.544991],[32.871529,103.544769],[32.869991,103.543968],[32.868919,103.543694],[32.86871,103.543694],[32.86792,103.543907],[32.865631,103.545013],[32.864841,103.545326],[32.863529,103.546043],[32.863209,103.546341],[32.862499,103.547562],[32.862141,103.548943],[32.861809,103.550858],[32.86142,103.552467],[32.86134,103.552696],[32.860748,103.55394],[32.860229,103.554649],[32.859379,103.555748],[32.858181,103.55687],[32.857422,103.557388],[32.855759,103.558571],[32.854111,103.559631],[32.852581,103.560661],[32.85178,103.56115],[32.850929,103.561546],[32.84938,103.560806],[32.847279,103.562027],[32.846119,103.561127],[32.844318,103.560806],[32.842979,103.560966],[32.83886,103.561691],[32.836922,103.561974],[32.835239,103.562263],[32.835041,103.562317],[32.833969,103.562889],[32.832489,103.56398],[32.832199,103.56424],[32.830921,103.565247],[32.829681,103.565933],[32.828079,103.566483],[32.826851,103.566849],[32.826199,103.566994],[32.825119,103.566849],[32.82309,103.565964],[32.82196,103.56604],[32.821091,103.566437],[32.819809,103.567093],[32.81958,103.567169],[32.818661,103.567421],[32.816849,103.567734],[32.81509,103.567963],[32.813641,103.568352],[32.81329,103.568604],[32.81266,103.569221],[32.81216,103.570007],[32.811611,103.570801],[32.810741,103.571503],[32.80975,103.571831],[32.80854,103.571991],[32.806389,103.572197],[32.80484,103.572342],[32.801029,103.572723],[32.800159,103.572884],[32.79948,103.573219],[32.79895,103.573669],[32.79842,103.574249],[32.79784,103.575233],[32.79734,103.576553],[32.79668,103.578011],[32.796631,103.578827],[32.796841,103.581757],[32.796799,103.582779],[32.796261,103.583809],[32.795582,103.584511],[32.793018,103.585953],[32.792259,103.586868],[32.79192,103.587959],[32.79147,103.592941],[32.79113,103.595108],[32.79044,103.596313],[32.789612,103.596863],[32.78825,103.597397],[32.788052,103.597458],[32.787029,103.597878],[32.786579,103.598267],[32.786301,103.598579],[32.78574,103.599663],[32.78553,103.60096],[32.78524,103.603996],[32.785069,103.605637],[32.785721,103.607887],[32.785721,103.608856],[32.785389,103.609711],[32.784641,103.610893],[32.78352,103.612663],[32.782211,103.614609],[32.78183,103.615097],[32.780869,103.616226],[32.78072,103.616257],[32.780609,103.61631],[32.780491,103.616371],[32.780258,103.616623],[32.779961,103.616898],[32.778049,103.618217],[32.776642,103.619171],[32.775639,103.619743],[32.774971,103.619812],[32.774311,103.619583],[32.773739,103.619347],[32.773289,103.619118],[32.772671,103.618927],[32.771999,103.618568],[32.771679,103.618523],[32.771259,103.618523],[32.770809,103.618294],[32.770481,103.618217],[32.770248,103.61824],[32.7701,103.618294],[32.769852,103.618462],[32.769402,103.618912],[32.769089,103.619797],[32.768589,103.620064],[32.76759,103.620682],[32.767712,103.618896],[32.767509,103.618248],[32.767559,103.617279],[32.767399,103.616951],[32.767208,103.616699],[32.766899,103.61644],[32.766251,103.616249],[32.76609,103.616226],[32.765862,103.616249],[32.765579,103.616241],[32.765041,103.616058],[32.76498,103.616013],[32.764648,103.615883],[32.76403,103.615891],[32.763828,103.615959],[32.763561,103.616081],[32.762581,103.616364],[32.76236,103.616409],[32.76173,103.616272],[32.76059,103.615753],[32.756771,103.614197],[32.755939,103.613922],[32.754959,103.613441],[32.754341,103.613152],[32.754169,103.613091],[32.753738,103.61306],[32.753349,103.613052],[32.75243,103.612778],[32.751999,103.612778],[32.751919,103.612762],[32.751499,103.612793],[32.750641,103.612663],[32.750401,103.61261],[32.749691,103.612511],[32.748161,103.612556],[32.747429,103.612289],[32.746552,103.611816],[32.745739,103.611656],[32.74556,103.611679],[32.745361,103.611656],[32.744301,103.611977],[32.74408,103.612099],[32.7439,103.612099],[32.743488,103.611992],[32.743408,103.611992],[32.743271,103.612053],[32.742981,103.61232],[32.742882,103.612396],[32.74255,103.61274],[32.742531,103.61274],[32.742401,103.612938],[32.74218,103.613113],[32.741951,103.613312],[32.74173,103.613472],[32.741379,103.613831],[32.741161,103.613983],[32.74057,103.614433],[32.740231,103.614548],[32.740028,103.614571],[32.739491,103.614548],[32.738289,103.614304],[32.737469,103.614227],[32.736851,103.614113],[32.736641,103.614113],[32.736401,103.614021],[32.736271,103.614014],[32.73555,103.613983],[32.734982,103.613892],[32.73439,103.614037],[32.73407,103.614166],[32.73391,103.614182],[32.73341,103.614281],[32.733051,103.614441],[32.73288,103.614662],[32.731121,103.615913],[32.733009,103.614578],[32.731171,103.616257],[32.728809,103.614731],[32.72821,103.614487],[32.72781,103.61451],[32.7276,103.614601],[32.727131,103.615219],[32.7267,103.615868],[32.726521,103.616058],[32.726341,103.616112],[32.725739,103.616089],[32.724991,103.615448],[32.723011,103.613426],[32.722759,103.613197],[32.722198,103.612961],[32.72105,103.612663],[32.720032,103.612297],[32.71991,103.612244],[32.719711,103.612053],[32.719181,103.611343],[32.718578,103.610367],[32.718201,103.60994],[32.717861,103.609596],[32.7174,103.609222],[32.716751,103.608887],[32.71611,103.608681],[32.714588,103.608047],[32.71349,103.607727],[32.712181,103.607422],[32.711411,103.607193],[32.71056,103.607246],[32.710251,103.607239],[32.709042,103.606903],[32.70776,103.606293],[32.707481,103.606216],[32.707062,103.606163],[32.706421,103.606087],[32.70546,103.605927],[32.704552,103.605583],[32.703732,103.605598],[32.70332,103.605667],[32.703072,103.605698],[32.702839,103.605667],[32.70211,103.605438],[32.701931,103.605408],[32.701771,103.605408],[32.701271,103.605263],[32.700932,103.605141],[32.700531,103.604874],[32.699711,103.604362],[32.699169,103.604118],[32.698891,103.604088],[32.698589,103.604118],[32.698139,103.604012],[32.6973,103.603699],[32.69627,103.6036],[32.695469,103.603432],[32.695122,103.60334],[32.694538,103.603218],[32.693939,103.603157],[32.69331,103.602837],[32.69286,103.602531],[32.692181,103.602127],[32.69138,103.602203],[32.690689,103.60231],[32.68866,103.601852],[32.687641,103.601738],[32.68716,103.601822],[32.686211,103.602089],[32.686081,103.602112],[32.684361,103.601738],[32.682961,103.601402],[32.682331,103.601341],[32.681709,103.601334],[32.680939,103.601372],[32.68008,103.601387],[32.679352,103.601357],[32.67865,103.60128],[32.67775,103.60128],[32.67635,103.601967],[32.67564,103.60199],[32.6745,103.601768],[32.673389,103.60173],[32.671902,103.601349],[32.671082,103.601578],[32.670502,103.601852],[32.669762,103.602242],[32.66906,103.602257],[32.667542,103.602127],[32.666489,103.602188],[32.665051,103.602013],[32.663712,103.601898],[32.661572,103.601799],[32.660351,103.601608],[32.659389,103.601212],[32.658588,103.60099],[32.657459,103.600868],[32.657021,103.600853],[32.655869,103.600868],[32.654869,103.600761],[32.652618,103.600151],[32.65189,103.599792],[32.651279,103.599457],[32.650551,103.598969],[32.650131,103.598763],[32.64856,103.59819],[32.64624,103.597343],[32.64613,103.597282],[32.646099,103.597252],[32.644691,103.596863],[32.64436,103.596947],[32.644329,103.59697],[32.64418,103.597214],[32.643421,103.598312],[32.643139,103.598549],[32.64296,103.598618],[32.64146,103.598503],[32.640888,103.598488],[32.638309,103.598106],[32.637669,103.597969],[32.637081,103.597794],[32.63623,103.597557],[32.635571,103.597229],[32.634159,103.59642],[32.633621,103.595932],[32.633099,103.595192],[32.63298,103.595062],[32.630989,103.593307],[32.630871,103.593224],[32.63018,103.593033],[32.62859,103.592728],[32.627861,103.592484],[32.627331,103.592087],[32.626701,103.591553],[32.626431,103.591339],[32.625969,103.591042],[32.625401,103.590927],[32.624741,103.590843],[32.623569,103.590637],[32.62336,103.590607],[32.620441,103.590843],[32.61964,103.590919],[32.618912,103.591141],[32.618301,103.591522],[32.617229,103.592491],[32.61618,103.593407],[32.613911,103.59549],[32.612141,103.597343],[32.60939,103.600151],[32.60881,103.600609],[32.60812,103.600983],[32.607559,103.601189],[32.60487,103.602074],[32.60397,103.601501],[32.599178,103.605614],[32.598019,103.605003],[32.597408,103.605362],[32.597099,103.605637],[32.596779,103.605873],[32.5961,103.606407],[32.59581,103.607697],[32.58968,103.610817],[32.588779,103.609818],[32.587219,103.609459],[32.58707,103.609444],[32.586552,103.60965],[32.58593,103.61013],[32.585361,103.610619],[32.585091,103.61097],[32.584961,103.611092],[32.58469,103.611214],[32.584171,103.611511],[32.58358,103.612038],[32.583382,103.613289],[32.573071,103.617027],[32.572479,103.61599],[32.572121,103.61599],[32.57011,103.616623],[32.56966,103.616882],[32.569519,103.617027],[32.569351,103.617126],[32.56926,103.617233],[32.568729,103.617599],[32.56815,103.617767],[32.567829,103.61776],[32.567451,103.617661],[32.566639,103.617523],[32.566261,103.61763],[32.565498,103.618553],[32.565231,103.618668],[32.561069,103.620064],[32.560051,103.620728],[32.560001,103.62178],[32.54961,103.625549],[32.546169,103.626801],[32.544022,103.627579],[32.5396,103.629181],[32.539082,103.628212],[32.530869,103.630623],[32.528111,103.630257],[32.527721,103.630333],[32.526001,103.631042],[32.52544,103.631203],[32.52467,103.631088],[32.523991,103.630859],[32.523708,103.630859],[32.522869,103.631157],[32.52224,103.631233],[32.521599,103.631126],[32.520771,103.631111],[32.520168,103.631279],[32.519741,103.6315],[32.519482,103.631683],[32.519119,103.632027],[32.518742,103.632233],[32.51857,103.632362],[32.518261,103.632889],[32.518059,103.633118],[32.517811,103.633324],[32.517342,103.633774],[32.516441,103.634323],[32.5159,103.634613],[32.515598,103.634857],[32.515469,103.635094],[32.515301,103.636017],[32.515099,103.636948],[32.514881,103.637337],[32.514751,103.63868],[32.510632,103.641068],[32.509769,103.639954],[32.509331,103.639832],[32.508751,103.63958],[32.508579,103.639526],[32.508289,103.639519],[32.507221,103.639709],[32.506599,103.639847],[32.505138,103.64035],[32.504871,103.640373],[32.504539,103.640282],[32.504421,103.640213],[32.504131,103.639923],[32.504051,103.639793],[32.502449,103.639282],[32.502102,103.639664],[32.501961,103.639877],[32.501869,103.640083],[32.50156,103.641472],[32.501389,103.642082],[32.500481,103.644814],[32.4991,103.645393],[32.498219,103.645126],[32.49791,103.645111],[32.49778,103.645119],[32.49712,103.645409],[32.496429,103.645859],[32.493111,103.648804],[32.492649,103.648972],[32.49192,103.649017],[32.49152,103.648979],[32.491261,103.648872],[32.491058,103.648666],[32.49078,103.648216],[32.490429,103.647552],[32.490261,103.647293],[32.48975,103.646797],[32.489422,103.646507],[32.488869,103.646133],[32.488708,103.646088],[32.488609,103.646103],[32.488419,103.646156],[32.488251,103.646294],[32.487968,103.646683],[32.487228,103.647362],[32.4869,103.647827],[32.486591,103.648651],[32.486309,103.649246],[32.485149,103.651466],[32.484699,103.652138],[32.484268,103.652397],[32.483719,103.652641],[32.482811,103.652809],[32.481812,103.653061],[32.481209,103.653191],[32.480999,103.653259],[32.48045,103.653709],[32.480061,103.654411],[32.479839,103.655159],[32.479599,103.656219],[32.479561,103.656441],[32.479481,103.657791],[32.47961,103.659042],[32.475731,103.661293],[32.474949,103.660133],[32.474339,103.660072],[32.47393,103.660149],[32.472481,103.660339],[32.47221,103.660408],[32.469349,103.661484],[32.468899,103.662041],[32.46833,103.662727],[32.467201,103.664032],[32.466019,103.66507],[32.464512,103.666359],[32.464039,103.666801],[32.463879,103.66703],[32.463669,103.667793],[32.463581,103.668404],[32.463928,103.669243],[32.455311,103.675484],[32.44862,103.680344],[32.443989,103.683693],[32.438961,103.687317],[32.43782,103.686546],[32.43652,103.686813],[32.436062,103.686958],[32.435749,103.687141],[32.43425,103.688454],[32.433849,103.688766],[32.43364,103.688881],[32.43288,103.689041],[32.432201,103.689087],[32.431709,103.689262],[32.43148,103.689537],[32.431221,103.689781],[32.430901,103.690392],[32.430779,103.690521],[32.430569,103.690689],[32.430302,103.691002],[32.43005,103.691017],[32.429619,103.691109],[32.429199,103.691223],[32.428699,103.691429],[32.4282,103.691597],[32.427891,103.691879],[32.427719,103.692093],[32.427269,103.692978],[32.42688,103.693932],[32.426559,103.694733],[32.426208,103.695396],[32.425591,103.695999],[32.42511,103.6968],[32.424549,103.697533],[32.423981,103.698036],[32.42355,103.69838],[32.42337,103.698738],[32.423248,103.699593],[32.42337,103.700943],[32.42247,103.701736],[32.42268,103.703369],[32.422531,103.703758],[32.421791,103.704437],[32.42112,103.705002],[32.420502,103.705597],[32.419819,103.70636],[32.41909,103.707314],[32.41893,103.707489],[32.4179,103.709068],[32.41293,103.713463],[32.411888,103.713661],[32.410511,103.71376],[32.409721,103.713173],[32.4021,103.720001],[32.401299,103.720428],[32.387909,103.726318],[32.387878,103.727661],[32.387779,103.727737],[32.387428,103.728081],[32.387211,103.728348],[32.386478,103.728844],[32.38607,103.728958],[32.385349,103.728912],[32.384682,103.728897],[32.383949,103.728867],[32.38303,103.727943],[32.37851,103.728539],[32.378052,103.729881],[32.377319,103.730423],[32.377121,103.730499],[32.37574,103.730873],[32.374809,103.731003],[32.374081,103.731056],[32.373859,103.73111],[32.373112,103.73143],[32.37228,103.731667],[32.371811,103.73175],[32.371632,103.731697],[32.37093,103.731216],[32.369781,103.730347],[32.369221,103.729057],[32.365871,103.728638],[32.36549,103.726868],[32.365139,103.726471],[32.364941,103.726196],[32.364769,103.726021],[32.3647,103.725861],[32.36459,103.725563],[32.364441,103.724899],[32.364208,103.724403],[32.363659,103.723984],[32.36335,103.723862],[32.36224,103.723877],[32.361752,103.723869],[32.361462,103.723907],[32.3605,103.724121],[32.360321,103.724121],[32.35928,103.723869],[32.358891,103.724007],[32.358719,103.724167],[32.358139,103.725037],[32.35788,103.725449],[32.357471,103.726189],[32.35717,103.72718],[32.357121,103.727638],[32.357059,103.727814],[32.356861,103.727661],[32.35606,103.728683],[32.356659,103.730026],[32.356579,103.730827],[32.356449,103.731697],[32.356121,103.733276],[32.355782,103.735153],[32.355492,103.735832],[32.35524,103.736168],[32.35519,103.736282],[32.35503,103.736519],[32.35458,103.736748],[32.353859,103.736992],[32.3536,103.73703],[32.35339,103.73703],[32.352219,103.736847],[32.350929,103.736702],[32.350719,103.736748],[32.350319,103.736893],[32.350101,103.736282],[32.34993,103.737289],[32.34943,103.737503],[32.348598,103.737381],[32.348,103.737122],[32.347729,103.736923],[32.347641,103.735962],[32.34623,103.735779],[32.345821,103.734337],[32.34568,103.7342],[32.345551,103.734009],[32.345379,103.733856],[32.340771,103.727203],[32.34053,103.726822],[32.340481,103.726677],[32.340439,103.726479],[32.34045,103.726242],[32.3405,103.726082],[32.34066,103.72567],[32.340672,103.725456],[32.340439,103.724876],[32.340099,103.724167],[32.340019,103.723389],[32.340031,103.72316],[32.340111,103.7229],[32.340462,103.722481],[32.340611,103.722221],[32.340599,103.721718],[32.340519,103.721527],[32.340092,103.720932],[32.339809,103.720772],[32.33762,103.72052],[32.33683,103.72049],[32.336369,103.720421],[32.335609,103.720207],[32.33519,103.720032],[32.334728,103.719711],[32.334259,103.71933],[32.333832,103.719162],[32.333599,103.719109],[32.332722,103.718712],[32.33234,103.718613],[32.331558,103.71875],[32.330231,103.719467],[32.329472,103.719803],[32.329041,103.719841],[32.328621,103.719849],[32.32827,103.71981],[32.327869,103.719887],[32.327389,103.719841],[32.327122,103.719658],[32.327019,103.719437],[32.32682,103.718987],[32.32658,103.718788],[32.32629,103.718719],[32.326061,103.718613],[32.325771,103.718536],[32.325531,103.71859],[32.325089,103.718727],[32.324959,103.718803],[32.32428,103.719032],[32.32365,103.719139],[32.323429,103.719193],[32.3232,103.719276],[32.323051,103.71936],[32.322319,103.719917],[32.321701,103.720268],[32.320808,103.72068],[32.320461,103.720589],[32.32016,103.720291],[32.319981,103.7202],[32.31926,103.720177],[32.319061,103.7202],[32.318741,103.720169],[32.318642,103.720329],[32.318451,103.720284],[32.31786,103.720062],[32.317741,103.720062],[32.317532,103.720154],[32.317039,103.720467],[32.316441,103.721413],[32.316071,103.721367],[32.315369,103.72123],[32.314651,103.720978],[32.313961,103.720818],[32.313251,103.720802],[32.312721,103.720818],[32.312141,103.720993],[32.31142,103.721336],[32.31131,103.721367],[32.310471,103.721367],[32.310162,103.721313],[32.30938,103.720802],[32.30904,103.72068],[32.308788,103.720657],[32.30843,103.720863],[32.308201,103.7211],[32.307041,103.721878],[32.30603,103.722488],[32.30579,103.722588],[32.305161,103.723068],[32.304489,103.723373],[32.30444,103.723373],[32.303829,103.723457],[32.303188,103.72361],[32.302551,103.723793],[32.301521,103.723824],[32.300659,103.723892],[32.300339,103.723938],[32.29982,103.724121],[32.299648,103.724281],[32.299541,103.724426],[32.29929,103.725037],[32.299129,103.725609],[32.299,103.726334],[32.29895,103.726807],[32.29908,103.72802],[32.28278,103.735847],[32.282139,103.734863],[32.281811,103.734901],[32.281319,103.734909],[32.280991,103.734932],[32.280048,103.735046],[32.279228,103.734962],[32.27861,103.735107],[32.278561,103.73513],[32.2784,103.735298],[32.277771,103.736427],[32.277031,103.737267],[32.276718,103.737709],[32.27663,103.7388],[32.27467,103.739754],[32.274441,103.741219],[32.273811,103.741577],[32.27319,103.741737],[32.272499,103.741997],[32.271721,103.742462],[32.27121,103.742844],[32.270771,103.743271],[32.27013,103.743736],[32.269711,103.743942],[32.26902,103.744179],[32.26878,103.744217],[32.268242,103.7444],[32.267399,103.744713],[32.266949,103.745033],[32.266449,103.745407],[32.266289,103.745499],[32.26561,103.745697],[32.264511,103.745117],[32.26244,103.74675],[32.26263,103.748032],[32.262428,103.748466],[32.26202,103.748802],[32.261749,103.748993],[32.26149,103.749092],[32.261181,103.749313],[32.260849,103.749634],[32.260441,103.749863],[32.259892,103.749931],[32.259129,103.749352],[32.255508,103.75219],[32.255661,103.75383],[32.25523,103.755402],[32.2547,103.756187],[32.254581,103.756477],[32.25425,103.756783],[32.25404,103.757088],[32.253658,103.757812],[32.253181,103.758797],[32.252628,103.759499],[32.252041,103.759956],[32.251362,103.76017],[32.250881,103.760178],[32.250431,103.760246],[32.250271,103.760193],[32.250019,103.760139],[32.24942,103.760101],[32.24892,103.760193],[32.24855,103.760353],[32.248371,103.760628],[32.24818,103.760788],[32.247921,103.76078],[32.247719,103.760857],[32.247601,103.760986],[32.24733,103.761414],[32.24699,103.761803],[32.24659,103.762108],[32.246311,103.762253],[32.24559,103.762543],[32.24535,103.762657],[32.24522,103.762688],[32.244541,103.762772],[32.24379,103.762787],[32.243359,103.762917],[32.243111,103.763077],[32.242298,103.764],[32.24152,103.764717],[32.240849,103.765167],[32.2402,103.76545],[32.239552,103.765663],[32.238811,103.765701],[32.23835,103.765701],[32.23772,103.765602],[32.237068,103.765427],[32.236561,103.76516],[32.236031,103.764816],[32.23555,103.764458],[32.234901,103.763496],[32.233509,103.764069],[32.23288,103.764282],[32.224331,103.765762],[32.220219,103.766548],[32.219711,103.765091],[32.219559,103.764893],[32.219341,103.764732],[32.219231,103.764687],[32.21899,103.764641],[32.218861,103.764603],[32.217991,103.764503],[32.216721,103.764427],[32.21656,103.764503],[32.21627,103.76458],[32.215931,103.764526],[32.215691,103.764557],[32.215611,103.764603],[32.215092,103.7649],[32.21487,103.765068],[32.214329,103.765556],[32.213848,103.765984],[32.21368,103.766083],[32.213299,103.766129],[32.21262,103.765923],[32.212448,103.765938],[32.212139,103.765953],[32.21146,103.766144],[32.211151,103.766167],[32.210129,103.766037],[32.20974,103.765907],[32.208851,103.765282],[32.20853,103.765259],[32.20784,103.765244],[32.207291,103.765198],[32.206909,103.765213],[32.205502,103.765457],[32.20406,103.765137],[32.20266,103.764061],[32.202389,103.763924],[32.202091,103.763809],[32.201061,103.763603],[32.200821,103.763321],[32.200741,103.762932],[32.200588,103.762619],[32.200359,103.762421],[32.200008,103.762177],[32.199879,103.762032],[32.199371,103.762123],[32.19912,103.762032],[32.197449,103.761223],[32.19677,103.760948],[32.19651,103.760857],[32.19553,103.760399],[32.195431,103.760384],[32.194851,103.760391],[32.19352,103.760483],[32.193169,103.76049],[32.192711,103.760437],[32.19249,103.760361],[32.192451,103.760384],[32.19223,103.760292],[32.191719,103.760223],[32.19112,103.760071],[32.190578,103.759804],[32.190128,103.759468],[32.189541,103.758987],[32.189251,103.758774],[32.189072,103.758713],[32.1884,103.758659],[32.18734,103.75856],[32.186588,103.758537],[32.18642,103.758507],[32.185841,103.758492],[32.185539,103.758423],[32.18528,103.758179],[32.185169,103.757729],[32.184952,103.757149],[32.184818,103.756958],[32.184601,103.756721],[32.183971,103.756264],[32.182529,103.755493],[32.18235,103.755463],[32.180672,103.755501],[32.18037,103.755623],[32.180271,103.755722],[32.179218,103.756973],[32.17902,103.757111],[32.178589,103.757187],[32.178162,103.757187],[32.17794,103.757133],[32.1782,103.757179],[32.177479,103.756889],[32.176491,103.756157],[32.175869,103.755608],[32.17561,103.755188],[32.175282,103.754471],[32.17485,103.753616],[32.174622,103.752991],[32.174191,103.751953],[32.174129,103.751694],[32.173981,103.75135],[32.173321,103.750267],[32.172981,103.749519],[32.172749,103.748756],[32.17263,103.748497],[32.17244,103.748177],[32.171909,103.747513],[32.171791,103.747299],[32.171471,103.746872],[32.171249,103.746223],[32.171101,103.745667],[32.171001,103.745117],[32.171021,103.744598],[32.171059,103.744263],[32.17112,103.743896],[32.171131,103.743523],[32.171082,103.743179],[32.170929,103.742683],[32.1707,103.742149],[32.17046,103.741623],[32.170261,103.741432],[32.170029,103.74147],[32.169788,103.741653],[32.169571,103.741737],[32.16925,103.741951],[32.168861,103.742126],[32.168369,103.742264],[32.167759,103.742081],[32.167648,103.741997],[32.16708,103.741257],[32.166809,103.741043],[32.16544,103.740593],[32.164761,103.740387],[32.164242,103.740181],[32.163879,103.739899],[32.163651,103.739647],[32.163429,103.739227],[32.16325,103.738724],[32.163109,103.738358],[32.162701,103.737907],[32.162079,103.737297],[32.16188,103.737061],[32.161549,103.736763],[32.161449,103.736633],[32.161121,103.73629],[32.16048,103.735924],[32.159801,103.735672],[32.158619,103.735321],[32.158321,103.735168],[32.157829,103.734978],[32.157619,103.734871],[32.157261,103.734863],[32.15641,103.734749],[32.156132,103.734734],[32.155869,103.734741],[32.15556,103.734787],[32.15498,103.734978],[32.154881,103.734993],[32.15456,103.734863],[32.154018,103.734497],[32.153561,103.734306],[32.153309,103.734123],[32.153069,103.733887],[32.15284,103.73362],[32.152649,103.733353],[32.152611,103.7332],[32.152512,103.733101],[32.152302,103.732964],[32.152199,103.732933],[32.151611,103.732811],[32.150921,103.732643],[32.150028,103.73246],[32.149891,103.732407],[32.14967,103.732384],[32.149471,103.732323],[32.149132,103.732269],[32.148769,103.732162],[32.148399,103.732109],[32.148102,103.732147],[32.147652,103.732246],[32.147018,103.732269],[32.146889,103.732231],[32.146309,103.731903],[32.146118,103.731773],[32.145882,103.731682],[32.145241,103.731667],[32.14481,103.731697],[32.144581,103.731773],[32.143681,103.732109],[32.14352,103.732193],[32.14336,103.732239],[32.143082,103.732399],[32.142429,103.732674],[32.142059,103.732903],[32.14172,103.7332],[32.141521,103.733467],[32.14122,103.733803],[32.140888,103.733917],[32.14045,103.733757],[32.140251,103.733597],[32.139679,103.733017],[32.13945,103.732826],[32.138981,103.732613],[32.138741,103.732536],[32.138519,103.732513],[32.138199,103.732567],[32.137489,103.732903],[32.13707,103.733231],[32.136742,103.733437],[32.136459,103.733528],[32.136021,103.73365],[32.135731,103.733757],[32.13538,103.733849],[32.135151,103.733849],[32.134472,103.733772],[32.134109,103.733658],[32.1339,103.733612],[32.133678,103.733719],[32.13327,103.734016],[32.132912,103.734138],[32.132721,103.734177],[32.132309,103.734451],[32.13208,103.734528],[32.131302,103.734627],[32.130322,103.734642],[32.129959,103.734703],[32.129459,103.734818],[32.128342,103.734962],[32.12801,103.734932],[32.12796,103.734947],[32.127811,103.734932],[32.127411,103.734818],[32.127129,103.734779],[32.126709,103.734642],[32.126419,103.734444],[32.12624,103.734329],[32.12587,103.733849],[32.125641,103.733711],[32.125179,103.733582],[32.124821,103.733543],[32.123871,103.733559],[32.12331,103.733521],[32.122761,103.733383],[32.12159,103.732971],[32.12088,103.732597],[32.120209,103.732147],[32.119419,103.731651],[32.118851,103.731148],[32.118061,103.73037],[32.11755,103.729736],[32.117001,103.728928],[32.11657,103.728508],[32.116482,103.728447],[32.11618,103.728317],[32.115959,103.728271],[32.115841,103.728233],[32.11515,103.728073],[32.114681,103.727882],[32.114521,103.727791],[32.11412,103.727226],[32.11396,103.727127],[32.1138,103.726967],[32.113609,103.726753],[32.11338,103.726562],[32.112801,103.726143],[32.11261,103.726112],[32.112209,103.726151],[32.112041,103.726128],[32.111629,103.725693],[32.111462,103.725578],[32.111382,103.725487],[32.11079,103.725159],[32.110691,103.725189],[32.110519,103.725319],[32.110249,103.725563],[32.11005,103.725731],[32.109749,103.725662],[32.109631,103.725563],[32.109341,103.725449],[32.108501,103.725731],[32.108212,103.725983],[32.107979,103.726227],[32.107899,103.726288],[32.107689,103.726372],[32.107262,103.726448],[32.107059,103.726433],[32.106621,103.726227],[32.1064,103.725937],[32.106468,103.725822],[32.10664,103.725662],[32.106419,103.725403],[32.106838,103.724632],[32.106541,103.724342],[32.106781,103.723579],[32.10656,103.723412],[32.106461,103.723213],[32.105831,103.723534],[32.10561,103.723511],[32.105389,103.723541],[32.103531,103.725349],[32.103321,103.725487],[32.103142,103.725563],[32.102829,103.725723],[32.102638,103.725754],[32.102261,103.725891],[32.102081,103.725922],[32.1017,103.725937],[32.100639,103.725937],[32.100368,103.725883],[32.100151,103.725639],[32.099911,103.725288],[32.099491,103.724838],[32.0994,103.724709],[32.09919,103.724068],[32.09903,103.723351],[32.09874,103.722366],[32.09869,103.722183],[32.098431,103.721733],[32.098091,103.721329],[32.098011,103.721268],[32.097778,103.72123],[32.09734,103.721336],[32.096729,103.721321],[32.096039,103.721069],[32.095852,103.72084],[32.095718,103.720329],[32.095692,103.720032],[32.095558,103.719658],[32.095242,103.71949],[32.094551,103.719528],[32.093971,103.719597],[32.093029,103.719841],[32.092461,103.720016],[32.092072,103.719994],[32.09169,103.720093],[32.09132,103.720222],[32.090988,103.720383],[32.090691,103.720467],[32.09034,103.720451],[32.090019,103.72039],[32.08976,103.720177],[32.089458,103.719994],[32.089298,103.719978],[32.08894,103.719887],[32.088661,103.71965],[32.088459,103.719582],[32.08799,103.719368],[32.0877,103.71917],[32.087158,103.718628],[32.086891,103.718407],[32.08662,103.718384],[32.08622,103.718437],[32.085991,103.718513],[32.085491,103.718719],[32.085121,103.718826],[32.08485,103.718964],[32.08456,103.719177],[32.084278,103.719513],[32.083988,103.719597],[32.083691,103.719414],[32.08334,103.719078],[32.083149,103.71891],[32.082939,103.718788],[32.082661,103.718811],[32.082359,103.718948],[32.081539,103.719131],[32.081551,103.719147],[32.08149,103.719147],[32.081402,103.719177],[32.081322,103.719177],[32.081108,103.719292],[32.0807,103.719437],[32.080441,103.719467],[32.079571,103.719292],[32.079418,103.7192],[32.079071,103.718903],[32.078289,103.718468],[32.077709,103.71804],[32.07732,103.717697],[32.077068,103.717644],[32.076691,103.717667],[32.07597,103.71785],[32.075291,103.717949],[32.074791,103.717903],[32.07415,103.717781],[32.073978,103.71769],[32.073811,103.717697],[32.073521,103.71759],[32.073269,103.71756],[32.073101,103.717461],[32.072868,103.717392],[32.072659,103.7173],[32.072201,103.717331],[32.071869,103.717308],[32.071651,103.717239],[32.071442,103.717163],[32.071369,103.717056],[32.071178,103.716927],[32.070919,103.716942],[32.070351,103.717209],[32.069969,103.717339],[32.069939,103.717133],[32.069771,103.716927],[32.071201,103.716042],[32.07135,103.715736],[32.07127,103.715477],[32.070969,103.715363],[32.070621,103.715279],[32.070332,103.715103],[32.070061,103.714867],[32.06992,103.714828],[32.06934,103.714539],[32.06897,103.714447],[32.068741,103.714417],[32.068489,103.714371],[32.068489,103.714256],[32.068359,103.714127],[32.068241,103.71376],[32.068069,103.71347],[32.067909,103.713387],[32.067501,103.713242],[32.06707,103.713173],[32.066971,103.713188],[32.06673,103.713463],[32.066639,103.713783],[32.06649,103.71405],[32.065781,103.714432],[32.065659,103.714233],[32.065651,103.713913],[32.06575,103.71283],[32.065701,103.712608],[32.065639,103.712532],[32.065121,103.71212],[32.065071,103.711838],[32.065239,103.711227],[32.065262,103.710899],[32.06509,103.710602],[32.064751,103.710327],[32.064442,103.710121],[32.064159,103.710213],[32.063801,103.71051],[32.063591,103.710823],[32.06345,103.711143],[32.063278,103.711411],[32.063019,103.711502],[32.06271,103.711517],[32.062469,103.71138],[32.062168,103.711082],[32.06192,103.710777],[32.06189,103.710609],[32.061798,103.710243],[32.061611,103.709633],[32.06134,103.709129],[32.0611,103.708908],[32.06097,103.70874],[32.06094,103.708641],[32.060879,103.708618],[32.060692,103.708397],[32.060551,103.708183],[32.06041,103.707863],[32.06041,103.707817],[32.060459,103.707581],[32.060478,103.707321],[32.06041,103.707062],[32.060181,103.706543],[32.06015,103.70636],[32.060181,103.705681],[32.05999,103.705177],[32.059761,103.704674],[32.05954,103.704399],[32.059391,103.704086],[32.05901,103.703987],[32.058632,103.703957],[32.05806,103.703819],[32.057991,103.703613],[32.05806,103.703194],[32.057499,103.703552],[32.057331,103.703819],[32.05698,103.704231],[32.05648,103.704903],[32.05624,103.705261],[32.056068,103.705452],[32.055962,103.705627],[32.055691,103.705872],[32.0555,103.705994],[32.05529,103.70607],[32.055061,103.7062],[32.054859,103.706284],[32.0546,103.706306],[32.054409,103.705971],[32.0541,103.705528],[32.05405,103.705307],[32.053959,103.705109],[32.053959,103.704964],[32.054081,103.704842],[32.054539,103.704552],[32.054741,103.704468],[32.054859,103.704231],[32.05481,103.703911],[32.054722,103.703659],[32.0546,103.703461],[32.054501,103.703247],[32.054451,103.703056],[32.054619,103.702797],[32.05455,103.702911],[32.056252,103.701553],[32.056499,103.701393],[32.056709,103.70118],[32.056801,103.701027],[32.057209,103.700912],[32.057961,103.700989],[32.058311,103.700768],[32.058529,103.700684],[32.058811,103.700706],[32.059181,103.700844],[32.0592,103.700867],[32.059509,103.701019],[32.059669,103.701073],[32.060009,103.700996],[32.060581,103.700813],[32.06073,103.700661],[32.06078,103.700417],[32.06076,103.700233],[32.06057,103.699951],[32.060429,103.699837],[32.060169,103.699677],[32.058109,103.698669],[32.057529,103.698318],[32.057381,103.698257],[32.057308,103.69825],[32.057011,103.698143],[32.056919,103.69809],[32.05685,103.698013],[32.056671,103.697723],[32.056561,103.697388],[32.056461,103.696854],[32.0564,103.696701],[32.055801,103.695648],[32.055531,103.695229],[32.055012,103.694649],[32.054909,103.69442],[32.05484,103.693748],[32.054829,103.693298],[32.054821,103.693039],[32.05484,103.69265],[32.054699,103.692177],[32.05471,103.692101],[32.054562,103.691803],[32.053829,103.690521],[32.053612,103.690224],[32.053162,103.689713],[32.052589,103.688713],[32.052509,103.688606],[32.05228,103.688454],[32.051979,103.688316],[32.051769,103.688171],[32.05154,103.687897],[32.05138,103.687752],[32.051041,103.687187],[32.05088,103.687027],[32.050549,103.687027],[32.04998,103.687103],[32.049671,103.686989],[32.04921,103.686707],[32.04884,103.68615],[32.048988,103.685677],[32.048859,103.684868],[32.048698,103.684334],[32.04834,103.6828],[32.048092,103.681953],[32.048038,103.681664],[32.048149,103.68132],[32.04829,103.681358],[32.048149,103.681213],[32.047981,103.680946],[32.047791,103.680733],[32.04731,103.680023],[32.046822,103.679764],[32.046478,103.679703],[32.046249,103.679611],[32.046211,103.679604],[32.0462,103.679619],[32.045959,103.679878],[32.045879,103.680122],[32.045681,103.680962],[32.045631,103.681129],[32.045521,103.681473],[32.045311,103.682533],[32.045219,103.682877],[32.04509,103.683601],[32.044991,103.683937],[32.044788,103.684158],[32.044609,103.684196],[32.043598,103.68428],[32.042339,103.684319],[32.04211,103.684349],[32.04179,103.684509],[32.041679,103.684669],[32.0415,103.684883],[32.04113,103.684967],[32.041069,103.684937],[32.040691,103.684624],[32.04034,103.68454],[32.03973,103.684624],[32.039589,103.684593],[32.039341,103.684464],[32.038689,103.683983],[32.038311,103.68383],[32.0382,103.683769],[32.038101,103.683678],[32.037682,103.683083],[32.037521,103.682961],[32.037281,103.682922],[32.037289,103.682953],[32.037029,103.683006],[32.03677,103.68309],[32.036461,103.683273],[32.036072,103.683601],[32.036011,103.683693],[32.035789,103.684303],[32.035461,103.684898],[32.035381,103.686089],[32.033588,103.686653],[32.03339,103.687881],[32.033291,103.688087],[32.033081,103.688461],[32.032982,103.68856],[32.032951,103.688622],[32.03281,103.688744],[32.032391,103.689171],[32.032379,103.689217],[32.03233,103.689247],[32.031929,103.689728],[32.031879,103.689758],[32.0317,103.689934],[32.031361,103.69017],[32.031109,103.690269],[32.030891,103.690323],[32.030621,103.690323],[32.030411,103.690247],[32.029942,103.690117],[32.029812,103.690063],[32.029789,103.690041],[32.029701,103.69001],[32.02953,103.689987],[32.02906,103.689789],[32.02874,103.689713],[32.028679,103.689682],[32.02832,103.689552],[32.027969,103.689598],[32.02779,103.689713],[32.02774,103.689789],[32.027599,103.689911],[32.02747,103.690048],[32.02689,103.690582],[32.026562,103.690826],[32.025902,103.691238],[32.025791,103.691353],[32.02533,103.691628],[32.025211,103.691757],[32.025082,103.691963],[32.02504,103.692108],[32.025021,103.692329],[32.025021,103.692688],[32.02504,103.69278],[32.025021,103.693359],[32.024921,103.693649],[32.024811,103.69381],[32.024632,103.693947],[32.02438,103.694],[32.024231,103.693916],[32.023949,103.693527],[32.02346,103.693108],[32.023392,103.693024],[32.023048,103.692467],[32.0228,103.692017],[32.022049,103.690773],[32.02161,103.68985],[32.02132,103.68856],[32.021198,103.68856],[32.018799,103.687172],[32.018398,103.687973],[32.017841,103.688713],[32.017681,103.688873],[32.01749,103.688988],[32.017269,103.689072],[32.016529,103.689171],[32.01627,103.689232],[32.016109,103.68924],[32.015911,103.689194],[32.015789,103.689087],[32.015659,103.688873],[32.015282,103.688042],[32.01524,103.687988],[32.015141,103.687767],[32.01498,103.6875],[32.014832,103.687309],[32.014671,103.687241],[32.014599,103.687248],[32.014469,103.687302],[32.014351,103.687393],[32.01403,103.687553],[32.013962,103.68763],[32.013512,103.687889],[32.013248,103.687958],[32.013031,103.687897],[32.012581,103.687714],[32.012291,103.687553],[32.01202,103.687332],[32.01173,103.686836],[32.01165,103.686684],[32.011608,103.686623],[32.01152,103.686417],[32.0112,103.685883],[32.01107,103.685593],[32.010941,103.68515],[32.010891,103.684738],[32.010761,103.683968],[32.010681,103.683746],[32.01062,103.683708],[32.010551,103.683678],[32.01012,103.683777],[32.00996,103.683853],[32.009838,103.683937],[32.00935,103.684143],[32.0093,103.684174],[32.009121,103.684242],[32.00806,103.684708],[32.00771,103.684776],[32.006889,103.684822],[32.005989,103.684822],[32.005859,103.684799],[32.00555,103.684593],[32.005421,103.684341],[32.005329,103.684013],[32.00515,103.683601],[32.005001,103.683434],[32.004749,103.683296],[32.004169,103.683273],[32.003941,103.68338],[32.00388,103.68364],[32.00391,103.684212],[32.004059,103.68502],[32.004089,103.685089],[32.004139,103.685707],[32.004219,103.686089],[32.00441,103.686531],[32.004959,103.687462],[32.005562,103.688522],[32.005859,103.689491],[32.005871,103.69001],[32.00568,103.690758],[32.00552,103.691643],[32.004871,103.693199],[32.004799,103.693359],[32.0047,103.693489],[32.00449,103.693489],[32.004379,103.69326],[32.00444,103.692886],[32.004509,103.692108],[32.00449,103.691849],[32.00444,103.691673],[32.004009,103.690979],[32.00378,103.690742],[32.003441,103.690742],[32.003101,103.690804],[32.00272,103.690826],[32.002499,103.690697],[32.002419,103.690392],[32.0023,103.689796],[32.002209,103.689667],[32.00145,103.688766],[32.00124,103.688393],[32.00082,103.687828],[32.000992,103.687607],[32.000961,103.687553],[32.00106,103.687531],[32.001209,103.687347],[32.00016,103.685837],[31.99964,103.685143],[31.99942,103.684769],[31.999229,103.684349],[31.99905,103.683792],[31.998989,103.683434],[31.998949,103.683281],[31.998859,103.683098],[31.998819,103.68306],[31.998409,103.682907],[31.998079,103.682671],[31.997959,103.682503],[31.997829,103.682228],[31.997499,103.682091],[31.997,103.682266],[31.996469,103.682426],[31.99605,103.682426],[31.99486,103.682411],[31.994129,103.681923],[31.99395,103.681549],[31.99382,103.680733],[31.99361,103.680489],[31.993389,103.680641],[31.992479,103.681931],[31.992331,103.682098],[31.99192,103.682259],[31.991211,103.682198],[31.990641,103.682121],[31.989719,103.681847],[31.98885,103.681557],[31.98814,103.681267],[31.98777,103.681091],[31.98768,103.680992],[31.987761,103.680817],[31.987921,103.680878],[31.988609,103.681297],[31.990959,103.681488],[31.991449,103.681488],[31.991989,103.68116],[31.9921,103.680992],[31.99231,103.680511],[31.99242,103.680313],[31.99271,103.680031],[31.992861,103.679916],[31.99299,103.679764],[31.993219,103.67907],[31.9935,103.678726],[31.993641,103.67865],[31.993731,103.678436],[31.99354,103.678329],[31.993441,103.678413],[31.99317,103.678703],[31.99308,103.678848],[31.992929,103.67939],[31.992689,103.67968],[31.992359,103.679787],[31.99194,103.680229],[31.99155,103.680397],[31.99077,103.680252],[31.990499,103.680153],[31.99,103.679901],[31.989771,103.679802],[31.98945,103.679733],[31.98896,103.679604],[31.988859,103.679558],[31.98881,103.679497],[31.988251,103.679222],[31.987749,103.679077],[31.98703,103.679077],[31.98654,103.679153],[31.98535,103.679413],[31.98514,103.67942],[31.984949,103.67939],[31.98477,103.679337],[31.98423,103.678902],[31.98399,103.678673],[31.98382,103.678413],[31.98365,103.677872],[31.983561,103.67691],[31.983561,103.676697],[31.983521,103.676399],[31.983509,103.676422],[31.983419,103.6763],[31.98321,103.676147],[31.983049,103.676079],[31.982861,103.676041],[31.9825,103.676003],[31.982321,103.676003],[31.98192,103.675957],[31.98172,103.675972],[31.981541,103.676003],[31.981211,103.676132],[31.98065,103.67646],[31.98004,103.676773],[31.979469,103.677017],[31.978901,103.677094],[31.97864,103.677101],[31.978121,103.677193],[31.97716,103.677322],[31.97678,103.677353],[31.97662,103.677361],[31.976391,103.677406],[31.975889,103.677467],[31.97518,103.677452],[31.97434,103.677452],[31.972851,103.677422],[31.972481,103.677498],[31.972269,103.677597],[31.972019,103.677711],[31.97098,103.678223],[31.970699,103.678268],[31.97035,103.67823],[31.970209,103.678169],[31.9692,103.677452],[31.969009,103.677406],[31.968861,103.677422],[31.968651,103.677467],[31.968149,103.677643],[31.96809,103.677628],[31.96797,103.677681],[31.96767,103.677963],[31.96734,103.678337],[31.96706,103.678772],[31.96677,103.679108],[31.96656,103.679268],[31.96627,103.679611],[31.96604,103.680023],[31.965691,103.680557],[31.9653,103.680649],[31.964319,103.680389],[31.963421,103.680183],[31.96328,103.679947],[31.96348,103.679878],[31.963539,103.679893],[31.96409,103.680153],[31.96434,103.680191],[31.96452,103.680191],[31.964701,103.680153],[31.96505,103.679962],[31.96534,103.679703],[31.96578,103.679398],[31.966209,103.678726],[31.966619,103.67791],[31.966999,103.677277],[31.96771,103.676239],[31.967979,103.675949],[31.96834,103.675743],[31.96888,103.675522],[31.96911,103.675323],[31.969009,103.675201],[31.96888,103.675278],[31.968691,103.675461],[31.968349,103.675697],[31.96773,103.67601],[31.96744,103.676178],[31.967239,103.676422],[31.96682,103.67717],[31.96637,103.677567],[31.965931,103.677887],[31.965731,103.677994],[31.96524,103.678032],[31.964569,103.677971],[31.96418,103.678108],[31.96356,103.678459],[31.963341,103.678352],[31.963449,103.678131],[31.964211,103.677711],[31.96497,103.677437],[31.96604,103.677391],[31.966471,103.677063],[31.96681,103.676117],[31.967119,103.675697],[31.96789,103.675049],[31.968349,103.674713],[31.968861,103.674477],[31.968941,103.674232],[31.968691,103.674118],[31.968611,103.674133],[31.968361,103.674217],[31.96801,103.674431],[31.96714,103.675072],[31.96664,103.67527],[31.966471,103.675247],[31.966181,103.675323],[31.96574,103.675484],[31.965521,103.675537],[31.96493,103.675636],[31.963949,103.675972],[31.96307,103.676208],[31.96254,103.67617],[31.96192,103.675827],[31.960951,103.675194],[31.960871,103.675133],[31.960739,103.674927],[31.96084,103.67482],[31.961069,103.674911],[31.96154,103.675346],[31.962179,103.675468],[31.962669,103.675468],[31.962879,103.67543],[31.96319,103.675293],[31.96376,103.674843],[31.96398,103.674622],[31.964001,103.674301],[31.963751,103.674339],[31.963039,103.674927],[31.962721,103.675018],[31.962061,103.674911],[31.96166,103.674683],[31.96077,103.673447],[31.96077,103.673424],[31.95982,103.672707],[31.95936,103.672493],[31.95837,103.672241],[31.95751,103.672234],[31.9566,103.672363],[31.95599,103.67218],[31.95553,103.671944],[31.95491,103.671677],[31.953979,103.671417],[31.953461,103.671089],[31.95289,103.67086],[31.95249,103.670731],[31.95084,103.670067],[31.950411,103.670029],[31.950081,103.670082],[31.94912,103.670319],[31.94894,103.670326],[31.948771,103.670303],[31.948521,103.670303],[31.94829,103.670341],[31.948021,103.670441],[31.94791,103.670509],[31.947599,103.670509],[31.94602,103.67038],[31.945841,103.670433],[31.94503,103.670418],[31.94383,103.670372],[31.943661,103.670387],[31.943171,103.670403],[31.942419,103.670448],[31.941509,103.67067],[31.941351,103.670692],[31.941111,103.670776],[31.940821,103.670929],[31.94002,103.671257],[31.93902,103.671547],[31.93849,103.671623],[31.93815,103.671692],[31.937639,103.671738],[31.937469,103.671783],[31.93697,103.671852],[31.93646,103.672043],[31.93585,103.672333],[31.934759,103.672752],[31.93413,103.672867],[31.933599,103.673019],[31.93354,103.673058],[31.932859,103.673279],[31.93256,103.67334],[31.931919,103.673264],[31.931589,103.673149],[31.931379,103.673042],[31.93117,103.672859],[31.930771,103.67276],[31.930531,103.67276],[31.93025,103.672691],[31.929951,103.672691],[31.92959,103.672623],[31.929331,103.672401],[31.929041,103.672379],[31.92865,103.672188],[31.92831,103.672058],[31.92807,103.672012],[31.927919,103.671783],[31.92782,103.671547],[31.92782,103.671547],[31.927719,103.671501],[31.92771,103.671417],[31.92749,103.671432],[31.926901,103.671623],[31.92679,103.671707],[31.926661,103.671753],[31.926371,103.671883],[31.92581,103.672043],[31.925119,103.672096],[31.9249,103.67215],[31.92481,103.672127],[31.92453,103.671997],[31.92415,103.671989],[31.923849,103.672096],[31.92359,103.67215],[31.922529,103.672409],[31.922079,103.672539],[31.921459,103.672783],[31.92091,103.673141],[31.920349,103.673569],[31.919979,103.67379],[31.919319,103.674133],[31.918659,103.674423],[31.91729,103.675049],[31.91678,103.675262],[31.91613,103.675682],[31.91539,103.676239],[31.915359,103.676582],[31.914511,103.677742],[31.914009,103.678291],[31.913601,103.678833],[31.91308,103.678993],[31.912729,103.679131],[31.9121,103.679466],[31.911579,103.679718],[31.91099,103.679832],[31.910271,103.679893],[31.90967,103.679993],[31.9091,103.68026],[31.907619,103.681168],[31.907049,103.681503],[31.906269,103.681839],[31.90589,103.681938],[31.904499,103.682213],[31.904249,103.682297],[31.90403,103.682281],[31.904119,103.682426],[31.903959,103.68248],[31.903431,103.682518],[31.90321,103.682602],[31.901991,103.683411],[31.90144,103.683746],[31.90024,103.684357],[31.899611,103.684769],[31.898359,103.685959],[31.897631,103.686348],[31.89703,103.686691],[31.896799,103.68679],[31.896139,103.686897],[31.89554,103.68692],[31.89493,103.686859],[31.894199,103.68663],[31.89382,103.686569],[31.893709,103.686577],[31.89315,103.686852],[31.89258,103.687492],[31.892191,103.68811],[31.891279,103.689301],[31.890841,103.689812],[31.89011,103.690804],[31.889391,103.691223],[31.889191,103.691292],[31.888929,103.691277],[31.888611,103.691231],[31.88792,103.690979],[31.887289,103.690666],[31.88656,103.690437],[31.886129,103.690376],[31.88599,103.690407],[31.885361,103.690712],[31.885,103.690567],[31.884661,103.690491],[31.884489,103.690613],[31.88435,103.690804],[31.884199,103.691093],[31.88397,103.691597],[31.883671,103.692062],[31.88357,103.692192],[31.88382,103.692307],[31.88278,103.69278],[31.882139,103.69313],[31.88139,103.693382],[31.87995,103.693489],[31.879089,103.693687],[31.87871,103.693871],[31.87858,103.693947],[31.878481,103.693916],[31.878059,103.694077],[31.87727,103.694649],[31.8771,103.694809],[31.876459,103.695236],[31.876011,103.69548],[31.87565,103.695534],[31.875521,103.695457],[31.874981,103.695259],[31.874701,103.695236],[31.874319,103.695343],[31.873831,103.695557],[31.87311,103.695923],[31.872299,103.696114],[31.871611,103.696136],[31.87063,103.696083],[31.87023,103.696098],[31.86994,103.696152],[31.869049,103.696487],[31.86899,103.696548],[31.86886,103.696854],[31.868799,103.697189],[31.86879,103.697708],[31.86862,103.698029],[31.868509,103.698059],[31.86772,103.698013],[31.867599,103.69796],[31.86746,103.69796],[31.867069,103.697998],[31.866871,103.697891],[31.86672,103.69767],[31.866501,103.697449],[31.866051,103.697197],[31.865761,103.696892],[31.865219,103.696541],[31.864599,103.696083],[31.864519,103.695999],[31.86438,103.695717],[31.863899,103.69545],[31.86322,103.695358],[31.862711,103.695427],[31.86134,103.695557],[31.861099,103.695442],[31.86097,103.695412],[31.860649,103.695374],[31.860359,103.695358],[31.860029,103.695427],[31.859529,103.695686],[31.85914,103.695938],[31.858879,103.695969],[31.85874,103.69603],[31.85832,103.696037],[31.858009,103.696136],[31.85664,103.696747],[31.856409,103.696793],[31.856199,103.696777],[31.8557,103.696693],[31.855379,103.696671],[31.85475,103.696823],[31.853951,103.69706],[31.853689,103.69709],[31.853081,103.697052],[31.852369,103.696953],[31.85146,103.696747],[31.850861,103.696648],[31.849831,103.696602],[31.849291,103.696671],[31.848949,103.696671],[31.8487,103.696831],[31.848021,103.696877],[31.847349,103.696777],[31.84696,103.696739],[31.8466,103.696617],[31.8458,103.695999],[31.845579,103.695717],[31.845369,103.695389],[31.845169,103.694893],[31.844761,103.694054],[31.844509,103.693748],[31.84387,103.693314],[31.8437,103.693169],[31.843361,103.693047],[31.84314,103.693153],[31.843069,103.693283],[31.843031,103.693367],[31.842939,103.693893],[31.842859,103.694023],[31.84277,103.694077],[31.841921,103.694344],[31.841619,103.694389],[31.841511,103.694489],[31.841459,103.694504],[31.84137,103.694862],[31.841339,103.695251],[31.84124,103.695763],[31.841061,103.696518],[31.84091,103.696716],[31.8407,103.696854],[31.840509,103.697037],[31.84016,103.697861],[31.839609,103.698853],[31.839121,103.699532],[31.83886,103.70108],[31.838499,103.701141],[31.838421,103.701653],[31.838369,103.702339],[31.838329,103.702591],[31.838249,103.702843],[31.83782,103.703659],[31.836781,103.704193],[31.836821,103.705048],[31.83672,103.705704],[31.83482,103.710823],[31.835489,103.71196],[31.83531,103.712517],[31.835011,103.713013],[31.83404,103.712936],[31.832781,103.716331],[31.83177,103.715919],[31.831129,103.716087],[31.830839,103.716331],[31.83029,103.716728],[31.83008,103.716957],[31.829781,103.717499],[31.829479,103.71814],[31.829161,103.718758],[31.82902,103.718933],[31.828711,103.719254],[31.82844,103.719498],[31.82836,103.719704],[31.828369,103.71981],[31.82831,103.719887],[31.828291,103.719978],[31.82782,103.720734],[31.826111,103.721161],[31.823009,103.724838],[31.822451,103.725182],[31.821369,103.725723],[31.820841,103.726112],[31.82028,103.72644],[31.820021,103.726547],[31.81946,103.726852],[31.819099,103.727173],[31.81893,103.727631],[31.818899,103.727852],[31.818899,103.727951],[31.81883,103.728271],[31.8188,103.728691],[31.81778,103.728409],[31.81743,103.7286],[31.81723,103.728737],[31.81683,103.728958],[31.81637,103.729111],[31.81601,103.729378],[31.815741,103.729462],[31.815371,103.729492],[31.81517,103.729584],[31.814989,103.729752],[31.814989,103.729897],[31.815599,103.730919],[31.81551,103.731392],[31.81539,103.731552],[31.81481,103.731583],[31.813641,103.731087],[31.813419,103.73127],[31.813231,103.731483],[31.81304,103.731712],[31.81291,103.73201],[31.812599,103.732117],[31.81226,103.732399],[31.81201,103.732559],[31.81159,103.732712],[31.81119,103.732674],[31.811069,103.732788],[31.81065,103.732727],[31.81044,103.732819],[31.81044,103.732948],[31.8099,103.732964],[31.809681,103.732986],[31.809259,103.733231],[31.809,103.73333],[31.808741,103.733383],[31.808281,103.733231],[31.8078,103.733177],[31.80777,103.733208],[31.80809,103.734016],[31.80801,103.734131],[31.80776,103.734138],[31.80702,103.733963],[31.806049,103.73391],[31.80595,103.734001],[31.80534,103.734131],[31.805201,103.734467],[31.805201,103.735077],[31.805111,103.735077],[31.805019,103.735962],[31.804911,103.736061],[31.80488,103.736153],[31.804291,103.735771],[31.803391,103.735138],[31.802799,103.734863],[31.802441,103.734749],[31.80213,103.73468],[31.801661,103.734596],[31.801189,103.734482],[31.80093,103.734444],[31.80147,103.733681],[31.80092,103.733597],[31.800369,103.733429],[31.79858,103.732971],[31.7983,103.732933],[31.797649,103.732811],[31.79673,103.732826],[31.796431,103.732918],[31.79594,103.733017],[31.79587,103.73307],[31.795811,103.73317],[31.79587,103.733437],[31.796009,103.733582],[31.795839,103.733742],[31.79594,103.73407],[31.79627,103.734894],[31.795931,103.735298],[31.79587,103.735443],[31.79578,103.735764],[31.795811,103.735786],[31.795839,103.735947],[31.795971,103.73629],[31.796049,103.736839],[31.796089,103.737083],[31.796089,103.737518],[31.79598,103.738052],[31.795971,103.738373],[31.795919,103.738823],[31.795839,103.739319],[31.79579,103.739769],[31.79587,103.740547],[31.796141,103.742592],[31.79608,103.742622],[31.79587,103.742081],[31.79582,103.742561],[31.79558,103.742851],[31.79524,103.743011],[31.79487,103.743393],[31.791531,103.753731],[31.790319,103.753754],[31.78965,103.754066],[31.789061,103.754578],[31.7887,103.755051],[31.78842,103.7556],[31.78825,103.755981],[31.787979,103.756798],[31.787901,103.756958],[31.787571,103.757446],[31.787069,103.758057],[31.78665,103.758438],[31.78623,103.758682],[31.786051,103.758743],[31.784121,103.759537],[31.783621,103.759697],[31.78343,103.759697],[31.783079,103.759857],[31.78252,103.760017],[31.78229,103.760429],[31.781969,103.760643],[31.781691,103.760643],[31.781321,103.760651],[31.78089,103.760803],[31.780479,103.760918],[31.78023,103.761017],[31.780081,103.761139],[31.77957,103.761681],[31.77924,103.762138],[31.7792,103.762253],[31.779119,103.762688],[31.77916,103.763138],[31.77915,103.763344],[31.77903,103.763603],[31.778959,103.763962],[31.77894,103.764267],[31.77887,103.764503],[31.77846,103.765358],[31.778111,103.765938],[31.777809,103.766518],[31.777611,103.766853],[31.777361,103.767357],[31.777241,103.767723],[31.77718,103.768112],[31.777109,103.76886],[31.7771,103.769501],[31.777121,103.769859],[31.77721,103.770309],[31.777361,103.771294],[31.77734,103.771584],[31.777189,103.77227],[31.7771,103.773232],[31.77759,103.774353],[31.776859,103.776382],[31.77779,103.777153],[31.777719,103.777412],[31.777571,103.777603],[31.77737,103.777733],[31.776951,103.777908],[31.77623,103.778259],[31.776159,103.778313],[31.77593,103.778969],[31.774679,103.778999],[31.774561,103.779083],[31.774309,103.779404],[31.77387,103.780411],[31.77351,103.781342],[31.773149,103.782097],[31.773479,103.78299],[31.76511,103.789299],[31.76424,103.788803],[31.764059,103.788918],[31.76396,103.789017],[31.76359,103.78933],[31.763201,103.789612],[31.76284,103.790092],[31.76256,103.790787],[31.76247,103.791367],[31.762871,103.792313],[31.7623,103.793083],[31.763201,103.794403],[31.76347,103.794762],[31.764099,103.795464],[31.764521,103.796158],[31.765039,103.797447],[31.765289,103.798141],[31.765409,103.798553],[31.765511,103.799088],[31.76552,103.799751],[31.765471,103.800423],[31.76553,103.801903],[31.765551,103.802116],[31.76556,103.802422],[31.76553,103.80323],[31.765539,103.805206],[31.76553,103.805862],[31.765511,103.805923],[31.765459,103.807419],[31.765499,103.807999],[31.76549,103.808167],[31.765591,103.808479],[31.765671,103.808777],[31.765909,103.809509],[31.766029,103.809807],[31.7661,103.810127],[31.76622,103.810516],[31.766491,103.81205],[31.76668,103.812691],[31.767071,103.813316],[31.76815,103.814392],[31.768391,103.814743],[31.76856,103.815079],[31.76861,103.815353],[31.76865,103.815804],[31.768539,103.816299],[31.76837,103.816772],[31.76803,103.817413],[31.767691,103.817787],[31.76757,103.817833],[31.76709,103.818169],[31.766491,103.818489],[31.765921,103.818359],[31.765209,103.818123],[31.76478,103.818001],[31.76436,103.817917],[31.764151,103.81794],[31.76396,103.818024],[31.7638,103.818176],[31.762899,103.818771],[31.762751,103.818893],[31.762119,103.819878],[31.761869,103.820221],[31.761511,103.820778],[31.761311,103.821159],[31.760889,103.821877],[31.760509,103.822403],[31.760389,103.822533],[31.76022,103.822693],[31.76004,103.822823],[31.75967,103.822952],[31.759541,103.822952],[31.75906,103.822998],[31.758619,103.823097],[31.75794,103.823311],[31.757521,103.823471],[31.75667,103.823486],[31.751591,103.831108],[31.75139,103.831291],[31.75066,103.831802],[31.75094,103.833023],[31.750351,103.833847],[31.750219,103.833977],[31.750019,103.834091],[31.749229,103.834328],[31.74898,103.834503],[31.748501,103.835091],[31.748199,103.835854],[31.748199,103.835838],[31.747869,103.836678],[31.747589,103.837143],[31.747339,103.83744],[31.74721,103.837669],[31.74711,103.837692],[31.74708,103.837738],[31.746849,103.837769],[31.7467,103.837723],[31.746651,103.837738],[31.74621,103.837601],[31.745951,103.837608],[31.74544,103.837784],[31.74523,103.83783],[31.744459,103.83783],[31.74403,103.837967],[31.74374,103.838074],[31.743549,103.838203],[31.74305,103.838676],[31.74268,103.839233],[31.74264,103.839241],[31.74234,103.839577],[31.74229,103.839592],[31.74169,103.840752],[31.741409,103.841141],[31.741159,103.841011],[31.74094,103.841164],[31.740669,103.841454],[31.738171,103.843643],[31.737659,103.844048],[31.737391,103.844177],[31.737169,103.844238],[31.7369,103.844383],[31.73649,103.84449],[31.73601,103.844513],[31.734369,103.844421],[31.734011,103.844353],[31.73353,103.843582],[31.73074,103.845497],[31.722481,103.851181],[31.721781,103.850327],[31.72146,103.850388],[31.721239,103.850449],[31.7208,103.850632],[31.720289,103.850891],[31.719749,103.851257],[31.71924,103.851646],[31.718679,103.852013],[31.71838,103.852097],[31.71792,103.852119],[31.717039,103.852493],[31.7167,103.8526],[31.716,103.853142],[31.71582,103.853348],[31.7155,103.852966],[31.71513,103.853149],[31.714649,103.853256],[31.714319,103.853317],[31.713989,103.853409],[31.713329,103.853523],[31.712799,103.853447],[31.71246,103.853416],[31.71192,103.853363],[31.711491,103.853279],[31.711149,103.853256],[31.710831,103.853287],[31.710279,103.853523],[31.710039,103.853561],[31.709749,103.853569],[31.709419,103.8535],[31.70919,103.853378],[31.709021,103.853363],[31.70867,103.853432],[31.70829,103.853592],[31.707581,103.85379],[31.707319,103.853844],[31.706829,103.853851],[31.70647,103.853882],[31.706051,103.853889],[31.705891,103.853859],[31.704599,103.853119],[31.704229,103.852859],[31.703501,103.851593],[31.70344,103.851463],[31.70225,103.850548],[31.701151,103.84977],[31.7006,103.849579],[31.700199,103.850067],[31.699499,103.850227],[31.69916,103.850357],[31.697941,103.850883],[31.697689,103.850838],[31.697639,103.850853],[31.698191,103.850487],[31.697781,103.850502],[31.697229,103.850662],[31.696899,103.850662],[31.69673,103.850693],[31.696581,103.850632],[31.696159,103.850243],[31.695869,103.849747],[31.69516,103.848351],[31.69486,103.847588],[31.69433,103.846321],[31.69418,103.845993],[31.69404,103.845657],[31.693939,103.845467],[31.69384,103.845367],[31.69348,103.845093],[31.69335,103.844971],[31.69327,103.844948],[31.69294,103.844727],[31.69268,103.844513],[31.69241,103.844414],[31.692181,103.844368],[31.69173,103.844383],[31.691389,103.844437],[31.69006,103.844933],[31.68998,103.844948],[31.689449,103.844887],[31.68928,103.844833],[31.68854,103.844673],[31.686399,103.844727],[31.685869,103.844772],[31.68545,103.844772],[31.68499,103.84481],[31.6845,103.844833],[31.684099,103.844887],[31.68379,103.84491],[31.68375,103.844948],[31.683599,103.844994],[31.68347,103.844978],[31.683081,103.844879],[31.682541,103.844589],[31.682091,103.844261],[31.681471,103.843887],[31.68079,103.84359],[31.67959,103.84343],[31.6793,103.843353],[31.67861,103.842819],[31.677931,103.842216],[31.677271,103.841614],[31.676781,103.841202],[31.67572,103.84024],[31.67477,103.83934],[31.67441,103.83905],[31.67417,103.838814],[31.673901,103.838577],[31.673281,103.83799],[31.67313,103.837891],[31.672689,103.837433],[31.67164,103.836563],[31.6712,103.836143],[31.669941,103.834976],[31.669479,103.834534],[31.66906,103.834213],[31.66855,103.833969],[31.6682,103.833893],[31.66783,103.833763],[31.667379,103.833633],[31.66733,103.833656],[31.666821,103.833366],[31.66638,103.833031],[31.66555,103.832458],[31.664881,103.831863],[31.663839,103.830544],[31.663401,103.829941],[31.662809,103.829079],[31.662411,103.8284],[31.662041,103.827629],[31.66198,103.827469],[31.661921,103.827377],[31.661631,103.826813],[31.66135,103.826134],[31.66128,103.825989],[31.66123,103.825844],[31.661119,103.82563],[31.66086,103.824982],[31.66082,103.824669],[31.660879,103.824387],[31.661119,103.824112],[31.6614,103.8237],[31.66165,103.823158],[31.66206,103.822563],[31.66206,103.822166],[31.66115,103.82093],[31.6605,103.819977],[31.66037,103.819511],[31.6604,103.819298],[31.66054,103.819008],[31.661131,103.818253],[31.662029,103.817177],[31.66238,103.816566],[31.66254,103.816109],[31.66251,103.816078],[31.662821,103.815193],[31.662979,103.814796],[31.663099,103.814362],[31.66312,103.813957],[31.663,103.813606],[31.662861,103.813271],[31.662609,103.812897],[31.662161,103.812553],[31.661501,103.812119],[31.661381,103.812057],[31.66119,103.811897],[31.66066,103.811737],[31.657261,103.811653],[31.656969,103.811607],[31.656799,103.811607],[31.65591,103.811508],[31.65435,103.811256],[31.65407,103.81115],[31.65349,103.810959],[31.65291,103.810699],[31.65218,103.810318],[31.65169,103.810028],[31.651421,103.809837],[31.65086,103.809486],[31.650181,103.809013],[31.64917,103.80835],[31.64901,103.808273],[31.648069,103.80764],[31.64772,103.807457],[31.64661,103.806664],[31.646,103.806282],[31.645321,103.805817],[31.64521,103.805771],[31.644779,103.805473],[31.64201,103.803658],[31.64163,103.803429],[31.641411,103.803261],[31.640711,103.802788],[31.640459,103.80265],[31.640051,103.802353],[31.63879,103.801537],[31.638399,103.801224],[31.63818,103.800911],[31.637899,103.800056],[31.637699,103.799606],[31.63752,103.79937],[31.637421,103.799309],[31.637091,103.799179],[31.636299,103.798683],[31.63612,103.798439],[31.636049,103.79818],[31.63599,103.797836],[31.63596,103.797417],[31.63578,103.796913],[31.63439,103.795692],[31.633631,103.79509],[31.633011,103.794724],[31.63138,103.793823],[31.630911,103.793266],[31.63064,103.792877],[31.630251,103.792221],[31.628441,103.789413],[31.627769,103.788399],[31.62665,103.786667],[31.626141,103.786324],[31.625351,103.786057],[31.624701,103.785873],[31.62455,103.785858],[31.623051,103.786079],[31.62244,103.785873],[31.622271,103.78569],[31.621571,103.784348],[31.620819,103.782867],[31.62027,103.781723],[31.620211,103.781509],[31.62023,103.780823],[31.620359,103.779968],[31.620359,103.779022],[31.62023,103.776962],[31.62007,103.77623],[31.619789,103.775642],[31.61961,103.775467],[31.619471,103.775192],[31.619471,103.775131],[31.61939,103.775017],[31.61923,103.774712],[31.618891,103.77417],[31.618549,103.773529],[31.6182,103.772949],[31.617941,103.772743],[31.6178,103.772667],[31.617611,103.772621],[31.615549,103.772438],[31.615431,103.772453],[31.61515,103.772438],[31.61446,103.772339],[31.6124,103.772141],[31.611521,103.771957],[31.611401,103.771889],[31.61091,103.771347],[31.610479,103.770729],[31.609631,103.769333],[31.609159,103.768631],[31.608749,103.767776],[31.60873,103.767029],[31.60874,103.766586],[31.60874,103.766281],[31.608841,103.765717],[31.60885,103.765213],[31.608801,103.764809],[31.60874,103.764587],[31.6085,103.763832],[31.608351,103.763412],[31.608299,103.763184],[31.60766,103.7612],[31.607519,103.760681],[31.60745,103.760246],[31.60742,103.759247],[31.60746,103.758263],[31.607491,103.758011],[31.607479,103.757538],[31.60751,103.755051],[31.60742,103.754303],[31.60717,103.753563],[31.6071,103.753403],[31.606939,103.753181],[31.606911,103.753014],[31.606859,103.752869],[31.60623,103.751663],[31.606039,103.751427],[31.605419,103.750862],[31.60511,103.750618],[31.604509,103.750183],[31.603661,103.749817],[31.60322,103.749542],[31.602449,103.749207],[31.60186,103.749046],[31.60113,103.748894],[31.600531,103.748779],[31.600149,103.748749],[31.599739,103.74881],[31.599489,103.748947],[31.599791,103.750053],[31.59976,103.750511],[31.59939,103.750511],[31.598949,103.750381],[31.598301,103.749687],[31.597931,103.749947],[31.59779,103.750061],[31.59738,103.750267],[31.597139,103.750298],[31.596889,103.750267],[31.59667,103.750229],[31.595501,103.750107],[31.595249,103.750107],[31.594379,103.750031],[31.593941,103.749969],[31.593651,103.749893],[31.59326,103.749657],[31.59285,103.749336],[31.591949,103.748558],[31.59079,103.74762],[31.589581,103.74659],[31.58902,103.746071],[31.58843,103.745483],[31.587721,103.744789],[31.586809,103.743843],[31.585581,103.742828],[31.585119,103.742523],[31.58432,103.741852],[31.584089,103.741547],[31.583691,103.740662],[31.5835,103.740356],[31.58338,103.74012],[31.583389,103.739594],[31.58337,103.739517],[31.583269,103.73941],[31.58316,103.739052],[31.58317,103.738792],[31.583099,103.738708],[31.582979,103.738319],[31.582911,103.738052],[31.58285,103.737244],[31.583099,103.735764],[31.58333,103.734688],[31.583441,103.733932],[31.583599,103.73304],[31.58354,103.732521],[31.583509,103.732407],[31.583321,103.732109],[31.583139,103.731934],[31.582781,103.731773],[31.58251,103.731468],[31.582439,103.731194],[31.582399,103.730988],[31.58235,103.730873],[31.582319,103.730713],[31.58205,103.730408],[31.581869,103.730232],[31.58148,103.729797],[31.581249,103.729568],[31.57992,103.728477],[31.579309,103.728127],[31.578699,103.727837],[31.57826,103.727676],[31.577909,103.727654],[31.57765,103.727661],[31.577391,103.727859],[31.57725,103.728027],[31.577181,103.728218],[31.577049,103.728989],[31.57687,103.729736],[31.57692,103.729759],[31.576811,103.730118],[31.576521,103.73053],[31.57486,103.731537],[31.574511,103.731621],[31.57411,103.731613],[31.572451,103.731178],[31.572081,103.731049],[31.57181,103.730904],[31.571581,103.730659],[31.57115,103.730003],[31.57091,103.729698],[31.570841,103.729446],[31.570551,103.728958],[31.570419,103.728668],[31.570259,103.727829],[31.570221,103.727303],[31.570259,103.726196],[31.570601,103.725067],[31.571039,103.723846],[31.571091,103.723778],[31.571409,103.723427],[31.571951,103.723061],[31.572781,103.72226],[31.572981,103.721764],[31.573111,103.720444],[31.57321,103.719803],[31.57345,103.717644],[31.57349,103.717079],[31.57333,103.716583],[31.572769,103.715477],[31.57268,103.715317],[31.57251,103.714951],[31.572399,103.714767],[31.572121,103.714607],[31.570459,103.714119],[31.57028,103.714073],[31.56971,103.714188],[31.569071,103.714523],[31.56881,103.71463],[31.56859,103.714638],[31.56839,103.714592],[31.56753,103.714233],[31.567221,103.71405],[31.566891,103.713669],[31.56612,103.712608],[31.56591,103.712273],[31.56567,103.711967],[31.565531,103.7117],[31.565269,103.710907],[31.565241,103.710709],[31.56505,103.708588],[31.564871,103.707779],[31.56448,103.70652],[31.56403,103.7052],[31.563551,103.704109],[31.56237,103.701767],[31.56175,103.70079],[31.561319,103.700592],[31.56106,103.700706],[31.560499,103.701073],[31.560169,103.700996],[31.559509,103.700127],[31.55743,103.697662],[31.557249,103.697479],[31.55703,103.697067],[31.556971,103.696693],[31.556971,103.696404],[31.55706,103.695908],[31.5571,103.695534],[31.55711,103.695259],[31.557211,103.694489],[31.557289,103.693314],[31.55723,103.692993],[31.55699,103.692467],[31.556499,103.691849],[31.555901,103.691437],[31.555229,103.691093],[31.554729,103.690727],[31.553869,103.690033],[31.55308,103.689453],[31.55245,103.689293],[31.55179,103.689331],[31.5515,103.689194],[31.551279,103.688927],[31.551201,103.68882],[31.551069,103.68856],[31.550911,103.688332],[31.55088,103.688263],[31.550791,103.688141],[31.55068,103.687943],[31.550501,103.687691],[31.55039,103.687492],[31.550249,103.687332],[31.550039,103.686989],[31.549721,103.686569],[31.549561,103.686401],[31.54932,103.686073],[31.549061,103.685806],[31.548849,103.685654],[31.548201,103.685471],[31.546721,103.685173],[31.54623,103.685043],[31.545071,103.684883],[31.544661,103.684914],[31.54361,103.685059],[31.542259,103.685219],[31.541861,103.685226],[31.54143,103.68512],[31.54108,103.684959],[31.540331,103.684486],[31.539591,103.684113],[31.539339,103.683937],[31.538879,103.683456],[31.53878,103.683273],[31.538549,103.682693],[31.53841,103.682228],[31.538349,103.682083],[31.53797,103.681633],[31.537781,103.681549],[31.53731,103.681503],[31.536909,103.681633],[31.536739,103.681793],[31.53632,103.682243],[31.535919,103.682571],[31.53581,103.682632],[31.53521,103.682831],[31.5347,103.682961],[31.534069,103.683067],[31.533119,103.683151],[31.532459,103.683151],[31.532169,103.682983],[31.531931,103.682549],[31.53187,103.682388],[31.531691,103.682007],[31.531469,103.681419],[31.531269,103.681068],[31.53096,103.680771],[31.53055,103.680618],[31.53031,103.680397],[31.53005,103.680122],[31.52984,103.679527],[31.529831,103.679237],[31.52985,103.678467],[31.529909,103.678139],[31.529831,103.677742],[31.529591,103.677254],[31.529289,103.676773],[31.52895,103.676277],[31.52866,103.675941],[31.528271,103.675453],[31.527849,103.675003],[31.526911,103.674347],[31.525351,103.67337],[31.5249,103.673058],[31.524019,103.672531],[31.523661,103.672401],[31.52273,103.672012],[31.522129,103.671738],[31.521561,103.671509],[31.521231,103.67131],[31.52075,103.670868],[31.52038,103.670471],[31.520069,103.670227],[31.519911,103.670128],[31.51977,103.670013],[31.518841,103.669434],[31.518539,103.669327],[31.5182,103.669296],[31.516991,103.669312],[31.516451,103.669228],[31.516319,103.669167],[31.51606,103.668999],[31.515751,103.668556],[31.51548,103.668114],[31.515421,103.667801],[31.5154,103.667542],[31.515381,103.666924],[31.515329,103.666283],[31.515261,103.665817],[31.51515,103.665497],[31.51512,103.664787],[31.51515,103.664192],[31.51516,103.66349],[31.51511,103.66272],[31.5149,103.662178],[31.514629,103.661797],[31.514311,103.66124],[31.51392,103.660606],[31.513571,103.660072],[31.51343,103.65992],[31.51298,103.659317],[31.51251,103.658638],[31.512381,103.658386],[31.5123,103.658096],[31.51219,103.657417],[31.5121,103.656967],[31.512091,103.65657],[31.5121,103.656174],[31.51206,103.655632],[31.51227,103.654694],[31.51231,103.653923],[31.51231,103.653488],[31.512251,103.653],[31.51214,103.652657],[31.51195,103.652367],[31.511379,103.651993],[31.51108,103.651909],[31.51009,103.651833],[31.509399,103.651611],[31.509001,103.65139],[31.50861,103.651253],[31.508169,103.651001],[31.50762,103.650551],[31.507179,103.650223],[31.506929,103.650146],[31.506809,103.650017],[31.50654,103.649467],[31.506161,103.648819],[31.505791,103.648247],[31.505501,103.647942],[31.50522,103.647743],[31.50474,103.64743],[31.5044,103.647377],[31.503639,103.647423],[31.50312,103.647408],[31.50276,103.647362],[31.50252,103.647293],[31.502279,103.647186],[31.50178,103.647293],[31.50156,103.647324],[31.501129,103.647163],[31.50087,103.647011],[31.499599,103.646423],[31.499189,103.64592],[31.49877,103.64518],[31.49864,103.644798],[31.498529,103.644257],[31.49844,103.643959],[31.498249,103.643623],[31.49818,103.643509],[31.49803,103.643204],[31.49761,103.642769],[31.49737,103.64241],[31.497351,103.642281],[31.496889,103.641319],[31.49667,103.640373],[31.49663,103.640022],[31.49654,103.639511],[31.49651,103.639214],[31.496559,103.638962],[31.496651,103.638741],[31.496771,103.638527],[31.496889,103.638321],[31.49692,103.638],[31.496679,103.637642],[31.496361,103.637306],[31.49608,103.637123],[31.495819,103.637016],[31.495211,103.636902],[31.495001,103.636887],[31.4946,103.636818],[31.49444,103.636742],[31.49408,103.636436],[31.493879,103.636208],[31.49338,103.635498],[31.493259,103.635101],[31.49325,103.63456],[31.493299,103.634087],[31.49329,103.634064],[31.49328,103.633797],[31.493179,103.633537],[31.49304,103.633362],[31.49292,103.63311],[31.49287,103.632629],[31.492889,103.632347],[31.49287,103.632141],[31.49279,103.631889],[31.49268,103.631683],[31.492519,103.631279],[31.49246,103.631027],[31.49229,103.630524],[31.492279,103.630211],[31.49213,103.629646],[31.49206,103.629494],[31.492041,103.629478],[31.49194,103.629204],[31.49168,103.628479],[31.491529,103.627823],[31.491541,103.627007],[31.491779,103.625931],[31.49194,103.625412],[31.49206,103.625076],[31.49214,103.624893],[31.492161,103.624718],[31.49226,103.624557],[31.49284,103.624184],[31.493641,103.623482],[31.494209,103.622757],[31.49416,103.622543],[31.493589,103.621727],[31.493231,103.621323],[31.492849,103.621063],[31.49229,103.620827],[31.49198,103.62072],[31.491289,103.620644],[31.4911,103.620537],[31.490971,103.62043],[31.49082,103.62014],[31.490959,103.619667],[31.491131,103.619537],[31.49202,103.619431],[31.49262,103.619301],[31.492849,103.619164],[31.493589,103.618568],[31.493971,103.618217],[31.49407,103.618088],[31.49424,103.617722],[31.494249,103.617439],[31.494209,103.61702],[31.49416,103.616814],[31.49394,103.616463],[31.493799,103.616333],[31.49304,103.615288],[31.49287,103.614967],[31.49275,103.614693],[31.49246,103.61438],[31.49251,103.614326],[31.492359,103.614159],[31.4921,103.613907],[31.492029,103.613792],[31.491261,103.612923],[31.49037,103.611641],[31.489941,103.611397],[31.48942,103.611343],[31.489161,103.611237],[31.488001,103.611008],[31.48781,103.611],[31.48749,103.610901],[31.48715,103.610863],[31.48699,103.610863],[31.48642,103.610641],[31.485809,103.610527],[31.485399,103.610321],[31.48514,103.610168],[31.4848,103.609711],[31.48461,103.609352],[31.484529,103.609108],[31.48443,103.608566],[31.484421,103.608223],[31.484249,103.60759],[31.484171,103.60746],[31.484011,103.607246],[31.48378,103.60685],[31.483641,103.606483],[31.48325,103.605629],[31.48311,103.605347],[31.48307,103.605148],[31.48288,103.604584],[31.48271,103.604187],[31.482441,103.603287],[31.482109,103.602463],[31.481991,103.602074],[31.48176,103.601486],[31.481529,103.601044],[31.48126,103.600342],[31.48111,103.60006],[31.480829,103.599457],[31.48035,103.598396],[31.479919,103.597481],[31.479851,103.597382],[31.479401,103.596352],[31.47921,103.596039],[31.47884,103.59549],[31.478701,103.595261],[31.47863,103.59478],[31.478609,103.594254],[31.47863,103.59391],[31.478939,103.591682],[31.47924,103.590721],[31.47921,103.590088],[31.47917,103.589813],[31.479179,103.589661],[31.47929,103.588966],[31.47933,103.588593],[31.479521,103.587677],[31.479679,103.586761],[31.479891,103.585663],[31.47998,103.584953],[31.48003,103.584641],[31.480061,103.584351],[31.480089,103.584023],[31.47991,103.583214],[31.47979,103.58284],[31.47925,103.581673],[31.479031,103.581337],[31.478769,103.580887],[31.478291,103.580223],[31.47813,103.579971],[31.47789,103.579399],[31.477711,103.578911],[31.477579,103.578613],[31.47744,103.57827],[31.477369,103.578049],[31.477171,103.577744],[31.47682,103.577278],[31.476589,103.577057],[31.47645,103.576981],[31.47596,103.576874],[31.475651,103.576843],[31.47522,103.576736],[31.474939,103.576721],[31.474701,103.576691],[31.474701,103.576538],[31.47485,103.57589],[31.47493,103.575394],[31.474899,103.575012],[31.47488,103.574982],[31.474701,103.574913],[31.47438,103.574913],[31.4736,103.574699],[31.47336,103.574677],[31.47287,103.574707],[31.472691,103.574692],[31.472071,103.573463],[31.47057,103.572227],[31.469021,103.570557],[31.467991,103.569771],[31.467079,103.569771],[31.46619,103.570038],[31.46537,103.570297],[31.464979,103.570297],[31.46344,103.569809],[31.46101,103.568909],[31.460279,103.568176],[31.459869,103.566643],[31.459511,103.564423],[31.45912,103.562363],[31.45895,103.561737],[31.45866,103.561172],[31.457279,103.558601],[31.456921,103.557899],[31.45583,103.555847],[31.45546,103.555267],[31.45499,103.554581],[31.454519,103.55394],[31.454309,103.553558],[31.454201,103.552887],[31.454559,103.551971],[31.454941,103.551086],[31.45583,103.549187],[31.45603,103.548561],[31.456051,103.547821],[31.455839,103.54734],[31.45536,103.546867],[31.45483,103.546669],[31.454321,103.546539],[31.45405,103.54644],[31.45322,103.545769],[31.452959,103.545502],[31.45269,103.545273],[31.452419,103.545273],[31.45207,103.545097],[31.45167,103.544968],[31.4515,103.544937],[31.45006,103.544777],[31.449619,103.544678],[31.448759,103.544289],[31.447929,103.543854],[31.446199,103.542969],[31.445761,103.542709],[31.445221,103.542221],[31.44474,103.541649],[31.444201,103.5411],[31.44396,103.540993],[31.44367,103.540916],[31.44301,103.54097],[31.439659,103.541473],[31.43886,103.541656],[31.43778,103.542038],[31.43689,103.542381],[31.436449,103.542473],[31.4356,103.542572],[31.43504,103.542603],[31.43441,103.542709],[31.43392,103.542732],[31.43346,103.542732],[31.433439,103.542702],[31.43302,103.542763],[31.43259,103.542961],[31.42981,103.544456],[31.429331,103.544563],[31.429131,103.54454],[31.428671,103.544243],[31.42819,103.543793],[31.42675,103.542313],[31.42621,103.541862],[31.425631,103.541344],[31.4251,103.540894],[31.42322,103.539574],[31.42255,103.539131],[31.420071,103.537849],[31.419399,103.537537],[31.418791,103.537178],[31.41828,103.536774],[31.41699,103.535599],[31.41613,103.534889],[31.415621,103.534599],[31.415159,103.534439],[31.414471,103.534264],[31.4142,103.534172],[31.4135,103.533989],[31.41247,103.533699],[31.41194,103.533478],[31.4118,103.533379],[31.411671,103.533257],[31.41148,103.533012],[31.411209,103.532547],[31.41111,103.53241],[31.410629,103.531464],[31.41045,103.531174],[31.410061,103.530838],[31.409889,103.530731],[31.40934,103.530617],[31.409149,103.530602],[31.40756,103.530182],[31.405861,103.52977],[31.405149,103.529556],[31.404869,103.529404],[31.40461,103.529167],[31.404289,103.528397],[31.4041,103.527321],[31.403919,103.526123],[31.403549,103.523849],[31.403299,103.523109],[31.403049,103.522797],[31.402411,103.522438],[31.401699,103.522278],[31.4014,103.522232],[31.399179,103.521721],[31.398439,103.52153],[31.39542,103.520851],[31.39481,103.520683],[31.394239,103.520287],[31.39345,103.5196],[31.39155,103.517853],[31.39131,103.517677],[31.38913,103.515678],[31.389139,103.515663],[31.389111,103.515671],[31.38839,103.515022],[31.38792,103.514572],[31.3871,103.513901],[31.386959,103.513748],[31.372419,103.509407],[31.372141,103.509369],[31.37159,103.509079],[31.371031,103.508568],[31.370649,103.508171],[31.370449,103.507912],[31.36974,103.507149],[31.369089,103.506401],[31.36894,103.506187],[31.36865,103.505577],[31.36833,103.5047],[31.36797,103.503563],[31.36692,103.500427],[31.36664,103.499542],[31.366489,103.499138],[31.366409,103.498779],[31.366329,103.49865],[31.366199,103.498291],[31.36598,103.49752],[31.365681,103.49704],[31.364771,103.496407],[31.36245,103.494919],[31.36208,103.494667],[31.361071,103.494041],[31.359541,103.493042],[31.35741,103.491707],[31.35729,103.491661],[31.35708,103.491631],[31.3564,103.4916],[31.355619,103.491638],[31.355021,103.491547],[31.35438,103.491257],[31.35321,103.490623],[31.35268,103.490349],[31.352221,103.490082],[31.35165,103.489799],[31.35129,103.489647],[31.350531,103.489464],[31.34993,103.489326],[31.34919,103.489143],[31.34828,103.488937],[31.347219,103.488564],[31.346821,103.488358],[31.346279,103.488037],[31.34433,103.486763],[31.34374,103.486504],[31.343491,103.486443],[31.342831,103.486427],[31.342421,103.486519],[31.342251,103.486572],[31.34177,103.486649],[31.340799,103.486862],[31.340321,103.486931],[31.339331,103.487167],[31.339029,103.48719],[31.338591,103.487122],[31.33721,103.486099],[31.336519,103.485413],[31.33604,103.484711],[31.33556,103.483917],[31.335421,103.483276],[31.33383,103.480087],[31.333611,103.479721],[31.333361,103.479378],[31.333019,103.479057],[31.332359,103.478569],[31.33135,103.477859],[31.330931,103.477432],[31.33073,103.477013],[31.32996,103.47448],[31.329849,103.474258],[31.32967,103.47403],[31.32946,103.473862],[31.32926,103.473793],[31.328569,103.473801],[31.32366,103.474693],[31.322969,103.474777],[31.322241,103.474907],[31.321489,103.474937],[31.320959,103.47477],[31.320721,103.474617],[31.32004,103.474167],[31.31922,103.473587],[31.31871,103.473312],[31.31826,103.473183],[31.3176,103.473129],[31.31675,103.473099],[31.314791,103.473061],[31.314131,103.472977],[31.313431,103.472839],[31.31291,103.472748],[31.311569,103.472473],[31.31142,103.47245],[31.310841,103.47229],[31.310711,103.472237],[31.31061,103.472168],[31.310511,103.472069],[31.310221,103.471672],[31.30938,103.470322],[31.30928,103.470108],[31.30896,103.469612],[31.30871,103.469307],[31.308189,103.468964],[31.30788,103.468842],[31.30744,103.468697],[31.306231,103.468193],[31.30521,103.467827],[31.303169,103.466942],[31.302691,103.466766],[31.302429,103.46669],[31.301991,103.466507],[31.3016,103.466209],[31.301519,103.466164],[31.3015,103.466057],[31.301161,103.465897],[31.30098,103.465851],[31.300831,103.465759],[31.30061,103.465729],[31.300011,103.465698],[31.299561,103.465477],[31.2994,103.465157],[31.299179,103.464828],[31.29841,103.464378],[31.29821,103.464104],[31.298149,103.463753],[31.29805,103.463463],[31.29759,103.463226],[31.297171,103.462921],[31.295549,103.462402],[31.289801,103.460899],[31.28867,103.461166],[31.280279,103.469017],[31.27939,103.469353],[31.27865,103.470039],[31.277781,103.471283],[31.27607,103.474007],[31.274839,103.474609],[31.273741,103.474922],[31.27346,103.474907],[31.27326,103.474876],[31.273069,103.474823],[31.272539,103.474747],[31.27182,103.475014],[31.271271,103.475098],[31.27033,103.475189],[31.269159,103.475159],[31.26734,103.475319],[31.26685,103.475456],[31.26601,103.475906],[31.26573,103.476089],[31.264391,103.477097],[31.26379,103.477753],[31.26339,103.478279],[31.263041,103.479218],[31.26285,103.479637],[31.26289,103.480217],[31.26284,103.480522],[31.262449,103.481049],[31.261801,103.481667],[31.26133,103.482147],[31.260521,103.482559],[31.25906,103.480049],[31.257441,103.480988],[31.250851,103.486687],[31.249491,103.488113],[31.24909,103.488403],[31.24823,103.488411],[31.2472,103.487907],[31.24691,103.487778],[31.24605,103.487694],[31.231581,103.492683],[31.22551,103.486893],[31.20331,103.497948],[31.17948,103.496834],[31.160801,103.494209],[31.156799,103.491173],[31.148029,103.488243],[31.140209,103.48967],[31.13055,103.494873],[31.122959,103.496063],[31.118771,103.494431],[31.11475,103.489479],[31.11301,103.485519],[31.11005,103.483063],[31.107821,103.481087],[31.10568,103.479523],[31.1042,103.478653],[31.102659,103.478302],[31.1021,103.478157],[31.101521,103.478127],[31.1012,103.478233],[31.10042,103.478691],[31.09967,103.478943],[31.098499,103.479149],[31.098141,103.479118],[31.097481,103.479111],[31.097071,103.479134],[31.096581,103.479263],[31.0959,103.479858],[31.09536,103.480507],[31.09507,103.481194],[31.09473,103.482063],[31.094601,103.482246],[31.09396,103.483131],[31.09333,103.483788],[31.092581,103.484711],[31.091961,103.485336],[31.09182,103.485428],[31.091551,103.485481],[31.09111,103.485313],[31.0909,103.48513],[31.090441,103.484558],[31.09029,103.484444],[31.089769,103.484253],[31.089439,103.484322],[31.089211,103.484489],[31.088739,103.484894],[31.08844,103.485107],[31.08814,103.48526],[31.08798,103.485313],[31.087151,103.485283],[31.08099,103.485023],[31.08004,103.484787],[31.07909,103.484596],[31.07826,103.484528],[31.07803,103.484528],[31.076891,103.484703],[31.076639,103.484787],[31.07621,103.484901],[31.07493,103.485321],[31.07374,103.486191],[31.07304,103.486572],[31.072531,103.4869],[31.072001,103.487381],[31.07168,103.487602],[31.071199,103.487823],[31.07078,103.488029],[31.070181,103.488373],[31.06941,103.488876],[31.06925,103.489197],[31.068439,103.489433],[31.06757,103.489807],[31.06679,103.490547],[31.066259,103.490631],[31.065491,103.490921],[31.06476,103.491257],[31.064449,103.491547],[31.06436,103.491722],[31.064289,103.491898],[31.0641,103.492142],[31.063959,103.492287],[31.06378,103.492561],[31.06341,103.493294],[31.063021,103.494453],[31.04641,103.526978],[31.045561,103.528099],[31.045469,103.528198],[31.044621,103.52887],[31.04331,103.529427],[31.04154,103.529877],[31.03215,103.534622],[31.031231,103.535057],[31.02936,103.535568],[31.028521,103.535843],[31.028061,103.536072],[31.02762,103.536369],[31.0271,103.536819],[31.026369,103.537727],[31.02529,103.539307],[31.024401,103.540733],[31.02223,103.543907],[31.0205,103.546577],[31.01989,103.547508],[31.019421,103.548233],[31.018761,103.549217],[31.01827,103.550056],[31.016239,103.554207],[31,103.586853],[30.998091,103.59005],[30.997681,103.590523],[30.997181,103.590973],[30.996849,103.591232],[30.99613,103.591728],[30.994261,103.592941],[30.99297,103.593803],[30.99185,103.594482],[30.989941,103.594841],[30.988621,103.594322],[30.987591,103.59417],[30.986259,103.593773],[30.98485,103.593773],[30.98218,103.594559],[30.98111,103.594566],[30.979811,103.594269],[30.977461,103.59359],[30.976021,103.5933],[30.975691,103.593277],[30.974489,103.5933],[30.968679,103.594116],[30.964621,103.594727],[30.964001,103.594841],[30.96237,103.595337],[30.96122,103.596024],[30.960211,103.59697],[30.959351,103.598152],[30.958561,103.599762],[30.956551,103.604424],[30.955151,103.607269],[30.95435,103.608627],[30.95089,103.613831],[30.95076,103.614052],[30.950279,103.614952],[30.94981,103.615753],[30.95084,103.615593],[30.95225,103.615532],[30.953581,103.61544],[30.95606,103.615318],[30.95643,103.615288],[30.956989,103.615211],[30.957359,103.615143],[30.957899,103.614998],[30.958441,103.614822],[30.959141,103.614571],[30.959829,103.614304],[30.96102,103.613876],[30.96183,103.613579],[30.962391,103.613373],[30.9631,103.614807],[30.96336,103.615799],[30.963539,103.616302],[30.96368,103.616631],[30.96384,103.616966],[30.965599,103.620323],[30.96623,103.621567],[30.967489,103.624222],[30.9722,103.633148],[30.977289,103.642822],[30.979099,103.645447],[30.978251,103.646347],[30.976589,103.647888],[30.974079,103.650269],[30.97238,103.65197],[30.970909,103.653526],[30.969839,103.654716],[30.968639,103.656143],[30.96751,103.657547],[30.96689,103.658363],[30.96583,103.65979],[30.964109,103.662231],[30.96328,103.663368],[30.962151,103.664833],[30.96097,103.66626],[30.960381,103.667],[30.96023,103.667236],[30.960091,103.667473],[30.95998,103.667747],[30.959789,103.667877],[30.95978,103.667747],[30.959209,103.668411],[30.9589,103.668793],[30.958099,103.669853],[30.957161,103.671143],[30.95595,103.672943],[30.955231,103.674072],[30.952909,103.677902],[30.95179,103.679703],[30.95059,103.681709],[30.949539,103.683418],[30.948919,103.684387],[30.948441,103.685112],[30.946659,103.687637],[30.945499,103.689217],[30.944401,103.690613],[30.94367,103.691513],[30.941299,103.694313],[30.93787,103.698303],[30.9366,103.69986],[30.935209,103.701637],[30.933901,103.703407],[30.933069,103.704597],[30.932249,103.705803],[30.93026,103.708878],[30.92915,103.710564],[30.928301,103.711777],[30.92745,103.712952],[30.926741,103.713837],[30.926001,103.714722],[30.92543,103.715347],[30.924641,103.716148],[30.923651,103.717117],[30.922649,103.718063],[30.92116,103.71936],[30.919451,103.720932],[30.918831,103.721542],[30.91785,103.722572],[30.917471,103.722992],[30.91674,103.723831],[30.91588,103.724892],[30.91522,103.725761],[30.914129,103.727333],[30.913691,103.728027],[30.913139,103.728973],[30.9126,103.729927],[30.912069,103.730949],[30.91169,103.731743],[30.911209,103.732803],[30.91054,103.734383],[30.910151,103.735451],[30.90979,103.736519],[30.907459,103.744202],[30.90659,103.746933],[30.906219,103.747978],[30.90593,103.748749],[30.90542,103.749992],[30.904989,103.750977],[30.904369,103.752274],[30.90366,103.753609],[30.902901,103.754898],[30.902121,103.756119],[30.901489,103.757042],[30.900669,103.758133],[30.900181,103.758751],[30.899691,103.759354],[30.89871,103.760468],[30.897711,103.76152],[30.8972,103.762016],[30.896469,103.762703],[30.895241,103.763748],[30.894569,103.764267],[30.89386,103.764793],[30.892929,103.765442],[30.89245,103.765747],[30.89105,103.766602],[30.888321,103.768097],[30.887011,103.768806],[30.885719,103.769524],[30.884649,103.770149],[30.88401,103.770561],[30.88294,103.771317],[30.88183,103.772202],[30.88139,103.772591],[30.880751,103.773193],[30.87995,103.773979],[30.879379,103.774582],[30.87867,103.775398],[30.87817,103.776016],[30.87768,103.776649],[30.877211,103.777298],[30.87676,103.777946],[30.876011,103.779152],[30.875561,103.779938],[30.875271,103.780487],[30.87471,103.781616],[30.873949,103.783363],[30.873369,103.784813],[30.872669,103.786507],[30.87229,103.787331],[30.871759,103.788399],[30.871731,103.78846],[30.871059,103.789703],[30.87076,103.790207],[30.8703,103.790939],[30.86948,103.792137],[30.869141,103.792603],[30.86861,103.793266],[30.867701,103.794357],[30.867149,103.794991],[30.86639,103.795761],[30.86561,103.796501],[30.864811,103.797203],[30.861601,103.799957],[30.859289,103.80191],[30.858471,103.802628],[30.85726,103.803719],[30.856291,103.804657],[30.85533,103.805634],[30.854509,103.806503],[30.8498,103.811783],[30.848881,103.812798],[30.84778,103.813957],[30.846491,103.815239],[30.84572,103.815941],[30.844299,103.817162],[30.84318,103.818062],[30.842051,103.818932],[30.84137,103.819427],[30.840231,103.820213],[30.8391,103.820953],[30.8354,103.823181],[30.83396,103.824097],[30.833031,103.824722],[30.832359,103.825211],[30.83148,103.825867],[30.83041,103.826736],[30.82938,103.827629],[30.82819,103.828728],[30.8272,103.829712],[30.82618,103.830788],[30.82559,103.831444],[30.824631,103.832573],[30.82229,103.835541],[30.821581,103.836411],[30.82119,103.836853],[30.820379,103.83773],[30.819759,103.838371],[30.81912,103.838989],[30.818251,103.839783],[30.817591,103.840332],[30.81691,103.840874],[30.816,103.841553],[30.81461,103.842506],[30.810249,103.84536],[30.809401,103.845963],[30.808769,103.84642],[30.80835,103.846733],[30.807949,103.847061],[30.807341,103.84758],[30.806721,103.848129],[30.80587,103.848938],[30.80525,103.849564],[30.804661,103.850189],[30.8039,103.851044],[30.80353,103.851471],[30.80266,103.852547],[30.802,103.853439],[30.80117,103.854637],[30.80069,103.8554],[30.79991,103.856697],[30.7966,103.862488],[30.795549,103.864281],[30.79442,103.866318],[30.79245,103.869789],[30.790501,103.873192],[30.78861,103.876472],[30.78834,103.876984],[30.78797,103.877747],[30.7875,103.878838],[30.787291,103.879433],[30.78709,103.88002],[30.786909,103.880638],[30.786751,103.881271],[30.78661,103.881897],[30.786501,103.882553],[30.786409,103.883186],[30.786341,103.883827],[30.786289,103.88446],[30.786261,103.885094],[30.786261,103.886047],[30.78632,103.887306],[30.78647,103.889542],[30.78635,103.891296],[30.78624,103.892967],[30.785839,103.895668],[30.78549,103.897171],[30.78499,103.898582],[30.784599,103.899689],[30.78377,103.901466],[30.783159,103.902473],[30.78298,103.902771],[30.782511,103.903587],[30.78203,103.904282],[30.78134,103.905197],[30.77743,103.910294],[30.773211,103.915771],[30.772129,103.91713],[30.77091,103.91864],[30.769369,103.920647],[30.7686,103.921638],[30.766121,103.924881],[30.7631,103.929024],[30.76078,103.93219],[30.75775,103.936234],[30.757311,103.936577],[30.7565,103.93766],[30.75602,103.938057],[30.755301,103.938583],[30.754761,103.938843],[30.7542,103.939056],[30.75358,103.939201],[30.752729,103.939293],[30.7521,103.939232],[30.75139,103.939072],[30.750839,103.938889],[30.75004,103.938591],[30.748631,103.937691],[30.746429,103.936737],[30.74535,103.936371],[30.74428,103.93605],[30.7437,103.935883],[30.739031,103.934921],[30.736521,103.934418],[30.736271,103.934357],[30.734831,103.934059],[30.73411,103.933907],[30.73082,103.933296],[30.72954,103.933067],[30.729179,103.933006],[30.725719,103.93264],[30.725229,103.932571],[30.72271,103.932442],[30.719419,103.932381],[30.715771,103.932343],[30.712839,103.932167],[30.71044,103.931961],[30.70717,103.931511],[30.702971,103.930763],[30.70075,103.930359],[30.698931,103.930107],[30.6966,103.929947],[30.693951,103.929916],[30.69375,103.929916],[30.69273,103.929947],[30.69128,103.930038],[30.6903,103.930122],[30.685061,103.930573],[30.682341,103.930847],[30.67981,103.931221],[30.676941,103.931831],[30.674351,103.932541],[30.67045,103.93396],[30.66506,103.935852],[30.663919,103.936203],[30.66292,103.936432],[30.66181,103.936653],[30.660431,103.936867],[30.65892,103.936996],[30.65756,103.937042],[30.65484,103.937103],[30.650579,103.93708],[30.648371,103.93718],[30.64661,103.937378],[30.64509,103.937637],[30.64365,103.938019],[30.64196,103.938469],[30.63983,103.939247],[30.63492,103.941093],[30.633631,103.941528],[30.63224,103.941971],[30.630779,103.94239],[30.629311,103.942734],[30.627041,103.943169],[30.62483,103.943512],[30.619511,103.944397],[30.61833,103.944679],[30.616791,103.945107],[30.615311,103.945686],[30.61389,103.946373],[30.61227,103.947456],[30.61113,103.94841],[30.60972,103.949783],[30.60885,103.950798],[30.607639,103.952438],[30.606489,103.954514],[30.605459,103.956711],[30.60393,103.960114],[30.601891,103.964783],[30.60046,103.96785],[30.599171,103.970444],[30.597589,103.973083],[30.59609,103.975372],[30.59486,103.977203],[30.592131,103.981133],[30.591129,103.982712],[30.589991,103.985039],[30.589319,103.986877],[30.58885,103.988724],[30.58856,103.990677],[30.588461,103.992706],[30.58849,103.994728],[30.58868,104.002876],[30.58857,104.005081],[30.588181,104.007187],[30.58745,104.009308],[30.5863,104.011383],[30.584311,104.014137],[30.58374,104.014938],[30.58132,104.018349],[30.5807,104.019234],[30.579081,104.022034],[30.57872,104.02272],[30.578449,104.023232],[30.57793,104.023956],[30.577459,104.024513],[30.57682,104.024979],[30.576241,104.025208],[30.57585,104.025307],[30.575529,104.025391],[30.57468,104.025391],[30.57391,104.025269],[30.57362,104.025162],[30.571671,104.024368],[30.570181,104.023758],[30.56801,104.022743],[30.56468,104.020882],[30.554741,104.014908],[30.55094,104.012497],[30.548651,104.010696],[30.54603,104.008163],[30.54306,104.004494],[30.54019,103.999863],[30.538441,103.997513],[30.536329,103.995216],[30.528799,103.987923],[30.525129,103.984543],[30.522129,103.982224],[30.51981,103.980797],[30.51687,103.979141],[30.51384,103.977158],[30.51082,103.974457],[30.50326,103.967072],[30.50028,103.964706],[30.497601,103.96299],[30.48823,103.958504],[30.482201,103.955002],[30.476259,103.950844],[30.47337,103.948822],[30.470671,103.947304],[30.46776,103.94593],[30.45928,103.942421],[30.455521,103.940567],[30.452351,103.938187],[30.450029,103.935883],[30.44676,103.931976],[30.443501,103.928284],[30.43807,103.92318],[30.42778,103.913887],[30.424299,103.910683],[30.42137,103.908173],[30.418739,103.906342],[30.415751,103.904572],[30.409611,103.900833],[30.408791,103.900307],[30.40811,103.899879],[30.40642,103.89872],[30.406269,103.898613],[30.406139,103.898514],[30.405199,103.897797],[30.404831,103.897507],[30.404539,103.897301],[30.4027,103.895752],[30.402639,103.895714],[30.400829,103.894089],[30.395901,103.889481],[30.38553,103.878517],[30.38382,103.876129],[30.382191,103.873322],[30.381121,103.870064],[30.380699,103.86879],[30.38039,103.867699],[30.379641,103.864769],[30.378071,103.858124],[30.37772,103.856689],[30.376881,103.85466],[30.375919,103.852417],[30.374901,103.850273],[30.3745,103.849602],[30.373409,103.848267],[30.37274,103.847504],[30.371759,103.846527],[30.37007,103.845253],[30.37002,103.845222],[30.36821,103.844131],[30.36706,103.843628],[30.364889,103.842949],[30.362579,103.842438],[30.359209,103.841759],[30.35545,103.841057],[30.351959,103.840683],[30.349331,103.83992],[30.34514,103.838531],[30.342319,103.83725],[30.339621,103.836571],[30.336281,103.835983],[30.332951,103.835632],[30.32992,103.835281],[30.32859,103.835083],[30.3276,103.834839],[30.32691,103.834572],[30.326309,103.834229],[30.325581,103.833733],[30.32482,103.833267],[30.32445,103.833092],[30.324329,103.833061],[30.323629,103.832787],[30.32313,103.832687],[30.322559,103.832611],[30.32193,103.832611],[30.3211,103.83271],[30.32037,103.832901],[30.319811,103.833107],[30.319309,103.833397],[30.318569,103.8339],[30.318041,103.834328],[30.317631,103.834663],[30.31662,103.835457],[30.31559,103.835968],[30.3148,103.836304],[30.31304,103.83699],[30.311819,103.837433],[30.305599,103.839798],[30.303049,103.840767],[30.302441,103.841011],[30.301571,103.841316],[30.300711,103.841667],[30.300541,103.841743],[30.29854,103.842484],[30.29718,103.842903],[30.29463,103.843719],[30.293159,103.843903],[30.29126,103.844063],[30.28908,103.844002],[30.28517,103.843407],[30.279461,103.842461],[30.274309,103.84182],[30.272249,103.841682],[30.26882,103.841507],[30.263081,103.841637],[30.260481,103.841827],[30.25771,103.842117],[30.254551,103.842537],[30.252159,103.842957],[30.244909,103.844063],[30.238979,103.844971],[30.2346,103.845627],[30.228121,103.846626],[30.223459,103.847366],[30.21862,103.847878],[30.21557,103.848358],[30.21253,103.848862],[30.21196,103.848938],[30.21122,103.849037],[30.211149,103.849052],[30.21056,103.849129],[30.20863,103.849457],[30.206671,103.849739],[30.206619,103.849747],[30.20463,103.850037],[30.20118,103.850723],[30.19952,103.850739],[30.19763,103.850632],[30.195299,103.850273],[30.193661,103.849907],[30.192101,103.849403],[30.18655,103.847427],[30.18231,103.845909],[30.17621,103.843719],[30.170601,103.841721],[30.166719,103.840317],[30.161591,103.838501],[30.156549,103.83667],[30.15312,103.835442],[30.149229,103.83403],[30.14525,103.832611],[30.142139,103.831398],[30.139771,103.83033],[30.134809,103.827782],[30.13142,103.825974],[30.12595,103.82296],[30.12237,103.821037],[30.12002,103.819763],[30.11664,103.817947],[30.11326,103.816017],[30.111601,103.815163],[30.10816,103.813248],[30.1056,103.811852],[30.102711,103.810066],[30.099331,103.808411],[30.095301,103.806702],[30.09252,103.805687],[30.086599,103.80368],[30.08601,103.803482],[30.085569,103.803329],[30.08502,103.803139],[30.08182,103.80204],[30.081141,103.801811],[30.079639,103.8013],[30.07716,103.800453],[30.07605,103.800056],[30.074249,103.799438],[30.07411,103.799393],[30.07151,103.798538],[30.06843,103.797859],[30.06653,103.797302],[30.06459,103.796806],[30.062309,103.796303],[30.055731,103.795067],[30.050871,103.794098],[30.04826,103.793358],[30.046261,103.792587],[30.0441,103.791458],[30.042601,103.790527],[30.036551,103.786591],[30.03101,103.782967],[30.029051,103.781616],[30.024891,103.778503],[30.021879,103.775917],[30.0187,103.77298],[30.01498,103.769363],[30.013029,103.767441],[30.011021,103.765747],[30.009581,103.764793],[30.00824,103.764023],[30.00703,103.763443],[30.00528,103.762733],[30.004009,103.762444],[30.0023,103.762123],[30.00091,103.762047],[29.99885,103.762077],[29.996031,103.762238],[29.98945,103.762657],[29.98629,103.762863],[29.985081,103.762993],[29.983101,103.763489],[29.98243,103.763687],[29.9806,103.764481],[29.977921,103.765984],[29.97703,103.766487],[29.97328,103.768593],[29.97217,103.769096],[29.969801,103.769981],[29.969139,103.770142],[29.968201,103.770332],[29.965611,103.770554],[29.96287,103.770348],[29.96159,103.770027],[29.9582,103.769203],[29.956301,103.768723],[29.95241,103.767761],[29.94582,103.766167],[29.941891,103.764954],[29.938259,103.763428],[29.93232,103.760307],[29.9265,103.757187],[29.92123,103.754211],[29.9186,103.752403],[29.916189,103.75061],[29.9119,103.747131],[29.90592,103.742203],[29.90304,103.740356],[29.902201,103.739906],[29.90093,103.739372],[29.89822,103.738579],[29.89192,103.737061],[29.888399,103.735947],[29.886129,103.735092],[29.884081,103.734154],[29.88076,103.732521],[29.877239,103.730759],[29.87343,103.729156],[29.872789,103.728912],[29.86729,103.727081],[29.861521,103.725227],[29.8587,103.724289],[29.856159,103.723618],[29.854139,103.723183],[29.847811,103.72216],[29.84544,103.721687],[29.843941,103.72123],[29.842291,103.720627],[29.841141,103.720047],[29.839939,103.719368],[29.83886,103.718597],[29.834391,103.714973],[29.82803,103.709839],[29.824579,103.706779],[29.82353,103.705704],[29.818701,103.700737],[29.816549,103.699013],[29.81579,103.698471],[29.81492,103.69799],[29.81385,103.697479],[29.81284,103.697067],[29.81114,103.696518],[29.804569,103.694901],[29.801861,103.694099],[29.800591,103.693657],[29.79631,103.691856],[29.79286,103.690376],[29.78804,103.688293],[29.78281,103.686028],[29.7794,103.684883],[29.77482,103.683647],[29.771151,103.68325],[29.76623,103.682564],[29.7612,103.681862],[29.75733,103.680702],[29.752661,103.678726],[29.741501,103.673637],[29.735689,103.670433],[29.730261,103.667122],[29.728109,103.665894],[29.725889,103.665009],[29.723049,103.664223],[29.719179,103.663467],[29.71279,103.661957],[29.70635,103.660027],[29.70294,103.659363],[29.70014,103.659142],[29.68815,103.659363],[29.68462,103.659538],[29.68202,103.660202],[29.67861,103.661789],[29.669941,103.667168],[29.667179,103.669067],[29.66548,103.670013],[29.66226,103.671219],[29.65731,103.672684],[29.654421,103.673882],[29.651899,103.675377],[29.64912,103.677238],[29.64385,103.680489],[29.639219,103.682854],[29.63732,103.683731],[29.63269,103.685913],[29.629339,103.687523],[29.626249,103.68943],[29.62406,103.690987],[29.618151,103.695602],[29.61622,103.696747],[29.61463,103.697456],[29.61256,103.69812],[29.611,103.698418],[29.60833,103.698517],[29.59409,103.697853],[29.59317,103.697777],[29.59227,103.697708],[29.590639,103.697578],[29.589661,103.697533],[29.588791,103.697472],[29.588249,103.697449],[29.57856,103.697304],[29.5669,103.703148],[29.545259,103.705719],[29.533911,103.709663],[29.5194,103.710701],[29.50877,103.719643],[29.49684,103.726669],[29.47427,103.734573],[29.463039,103.741623],[29.456329,103.746758],[29.44392,103.752083],[29.435089,103.758949],[29.42598,103.763763],[29.41267,103.773537],[29.407921,103.7761],[29.388491,103.777473],[29.381571,103.779373],[29.375561,103.784538],[29.367929,103.790733],[29.359091,103.80069],[29.352209,103.809097],[29.335911,103.826767],[29.318411,103.840843],[29.305571,103.847687],[29.294029,103.850273],[29.289061,103.853722],[29.285049,103.858421],[29.28236,103.861847],[29.278641,103.865082],[29.27508,103.866959],[29.27075,103.867813],[29.266239,103.869019],[29.262159,103.871269],[29.25914,103.875252],[29.256281,103.880081],[29.254311,103.88562],[29.25462,103.892014],[29.25462,103.896103],[29.25388,103.89949],[29.25211,103.902519],[29.24992,103.903862],[29.24637,103.904198],[29.239189,103.902817],[29.2363,103.903],[29.2334,103.904572],[29.22904,103.90992],[29.22484,103.915077],[29.22064,103.922813],[29.217951,103.927429],[29.21423,103.930832],[29.210199,103.933403],[29.20557,103.936142],[29.201851,103.936989],[29.19854,103.937851],[29.19643,103.938721],[29.192829,103.940613],[29.18956,103.942139],[29.18597,103.942307],[29.18281,103.943001],[29.178619,103.944717],[29.171591,103.945229],[29.16573,103.945923],[29.161699,103.947372],[29.160009,103.947983],[29.158831,103.948608],[29.15626,103.949867],[29.152901,103.951424],[29.149111,103.953827],[29.1474,103.955566],[29.146151,103.957626],[29.145109,103.960457],[29.142111,103.970154],[29.14106,103.973381],[29.139879,103.975868],[29.13899,103.976921],[29.136841,103.97908],[29.134291,103.981583],[29.13253,103.984039],[29.13093,103.986557],[29.12966,103.987846],[29.12866,103.988503],[29.127199,103.98938],[29.125521,103.990341],[29.124041,103.991127],[29.119749,103.993317],[29.11607,103.995277],[29.11408,103.996292],[29.112249,103.997368],[29.11076,103.998611],[29.10943,104.000572],[29.108459,104.002899],[29.107861,104.005363],[29.107149,104.009163],[29.106421,104.012009],[29.10582,104.014008],[29.104271,104.017776],[29.103621,104.019836],[29.10293,104.023308],[29.102461,104.025742],[29.10177,104.027687],[29.100349,104.030693],[29.099409,104.032883],[29.098749,104.034416],[29.09796,104.036942],[29.097639,104.038231],[29.097269,104.039864],[29.09687,104.041733],[29.096081,104.043922],[29.09543,104.044937],[29.094481,104.04641],[29.093491,104.047684],[29.092251,104.049271],[29.09111,104.051208],[29.090521,104.053123],[29.09025,104.054497],[29.090191,104.055412],[29.09095,104.06636],[29.08976,104.070282],[29.086451,104.075089],[29.084789,104.082336],[29.08194,104.09523],[29.08194,104.100754],[29.083441,104.1138],[29.083441,104.123207],[29.08194,104.130234],[29.081051,104.137589],[29.078979,104.141144],[29.074051,104.144547],[29.07147,104.146637],[29.069349,104.150803],[29.0674,104.15818],[29.06502,104.162086],[29.06082,104.166382],[29.057659,104.171707],[29.053459,104.177032],[29.050289,104.182549],[29.04789,104.189774],[29.044889,104.195938],[29.042179,104.201973],[29.03993,104.212639],[29.03933,104.220207],[29.03903,104.228256],[29.03784,104.231812],[29.03484,104.236618],[29.028379,104.253113],[29.026449,104.257019],[29.021049,104.261993],[29.01655,104.268517],[29.01055,104.274857],[29.00544,104.280022],[29.00108,104.287064],[28.99402,104.295143],[28.98967,104.302856],[28.98292,104.309708],[28.97978,104.313469],[28.970779,104.318787],[28.95965,104.328072],[28.95751,104.330688],[28.9533,104.345627],[28.949699,104.352333],[28.94536,104.363281],[28.933331,104.374786],[28.93166,104.380173],[28.93046,104.396652],[28.928961,104.401611],[28.92506,104.414322],[28.92205,104.426697],[28.92115,104.433708],[28.91231,104.449966],[28.905689,104.457191],[28.902519,104.467171],[28.89502,104.482246],[28.8881,104.49015],[28.88599,104.496696],[28.88163,104.504936],[28.88027,104.513527],[28.873369,104.529999],[28.870211,104.537712],[28.86569,104.545631],[28.864491,104.554916],[28.860729,104.567627],[28.859831,104.576729],[28.857719,104.585152],[28.85787,104.598732],[28.857719,104.609558],[28.859831,104.621941],[28.861771,104.631523],[28.86043,104.638496],[28.857889,104.644302],[28.85685,104.64566],[28.856409,104.645889],[28.855829,104.645912],[28.85532,104.645851],[28.8547,104.645592],[28.854259,104.645401],[28.85355,104.644783],[28.85206,104.6436],[28.85038,104.642418],[28.84877,104.641296],[28.847361,104.64032],[28.84576,104.639198],[28.84403,104.637993],[28.84247,104.636917],[28.84119,104.636147],[28.839411,104.63517],[28.838369,104.634666],[28.83795,104.634483],[28.83754,104.634277],[28.83667,104.633926],[28.836451,104.633842],[28.83535,104.6334],[28.83428,104.63295],[28.833019,104.632332],[28.832069,104.631706],[28.83111,104.630867],[28.830311,104.629936],[28.830179,104.629784],[28.829399,104.628593],[28.82859,104.627098],[28.82773,104.625526],[28.82724,104.624779],[28.826429,104.623734],[28.82542,104.622673],[28.823549,104.621033],[28.82159,104.619324],[28.820299,104.618202],[28.81879,104.61689],[28.8176,104.615837],[28.816589,104.61496],[28.81525,104.6138],[28.81423,104.612862],[28.81304,104.611588],[28.811781,104.610023],[28.81085,104.608841],[28.809839,104.607529],[28.80899,104.606438],[28.80829,104.605591],[28.80397,104.599716],[28.79163,104.60006],[28.77869,104.590103],[28.768459,104.583923],[28.764999,104.582039],[28.75341,104.570534],[28.7498,104.564194],[28.741831,104.551826],[28.73023,104.546158],[28.723009,104.535347],[28.71352,104.533112],[28.71097,104.53157],[28.70705,104.521606],[28.703291,104.519379],[28.69832,104.519897],[28.68597,104.524361],[28.68507,104.523331],[28.682211,104.520752],[28.672421,104.509598],[28.66684,104.501183],[28.664129,104.500328],[28.65494,104.501701],[28.651779,104.500839],[28.63928,104.496384],[28.635811,104.493629],[28.62888,104.483849],[28.62285,104.476982],[28.61788,104.467537],[28.608089,104.457916],[28.599489,104.44368],[28.599649,104.435951],[28.59844,104.429077],[28.600401,104.421021],[28.601,104.411232],[28.603109,104.394073],[28.603109,104.384453],[28.59889,104.372437],[28.587891,104.364723],[28.56769,104.354424],[28.563009,104.348747],[28.56241,104.339653],[28.564819,104.332947],[28.564671,104.32798],[28.558189,104.323517],[28.549589,104.320587],[28.543711,104.312363],[28.544621,104.305489],[28.544769,104.295532],[28.53949,104.285919],[28.53919,104.276817],[28.542509,104.26532],[28.551399,104.260002],[28.55744,104.260857],[28.561199,104.257263],[28.563009,104.246437],[28.562111,104.240433],[28.555321,104.22876],[28.55216,104.226868],[28.5511,104.22155],[28.54492,104.213654],[28.54055,104.20919],[28.536169,104.200607],[28.536631,104.192368],[28.532709,104.189102],[28.52652,104.187729],[28.523661,104.184471],[28.51038,104.181381],[28.502541,104.186867],[28.49575,104.186363],[28.49379,104.184471],[28.491529,104.186012],[28.48896,104.190483],[28.484739,104.192879],[28.48217,104.192368],[28.47765,104.190987],[28.472059,104.191681],[28.46904,104.193222],[28.46467,104.192879],[28.45742,104.191849],[28.45561,104.192711],[28.45335,104.195969],[28.44837,104.196136],[28.446711,104.195107],[28.45335,104.187393],[28.45471,104.190132],[28.45335,104.192543],[28.451691,104.194427],[28.449881,104.194427],[28.44656,104.192711],[28.445049,104.187393],[28.44293,104.185837],[28.438709,104.184982],[28.436899,104.183441],[28.435989,104.179657],[28.43478,104.178802],[28.43207,104.179657],[28.430401,104.178978],[28.429199,104.177429],[28.427691,104.176743],[28.42573,104.176918],[28.41984,104.175369],[28.39855,104.157013],[28.39492,104.150993],[28.3916,104.147049],[28.38798,104.147217],[28.384649,104.147392],[28.38254,104.149452],[28.37635,104.150139],[28.372419,104.15168],[28.36698,104.152367],[28.35928,104.149803],[28.35656,104.14756],[28.350519,104.14035],[28.34553,104.13829],[28.340851,104.133324],[28.33481,104.132797],[28.328911,104.13623],[28.323021,104.135033],[28.318029,104.135536],[28.31501,104.134506],[28.3067,104.136063],[28.30216,104.138474],[28.298389,104.13726],[28.2943,104.138809],[28.2875,104.144302],[28.27949,104.143784],[28.27541,104.145683],[28.268,104.153397],[28.26059,104.152367],[28.254551,104.144989],[28.24925,104.141899],[28.24729,104.140869],[28.244869,104.137444],[28.228689,104.140869],[28.205839,104.139839],[28.204781,104.134506],[28.201611,104.131599],[28.202209,104.124557],[28.200399,104.118378],[28.19994,104.111],[28.188601,104.103104],[28.184361,104.1007],[28.17906,104.096581],[28.17725,104.092461],[28.17165,104.093658],[28.165291,104.094002],[28.16151,104.092796],[28.15213,104.084389],[28.14592,104.083191],[28.141991,104.082672],[28.13608,104.072548],[28.132151,104.072723],[28.1273,104.073227],[28.1273,104.079758],[28.1273,104.082848],[28.12488,104.083878],[28.119579,104.080788],[28.11731,104.081642],[28.114429,104.086792],[28.11458,104.090569],[28.09354,104.131943],[28.09066,104.134003],[28.08672,104.133141],[28.0846,104.133827],[28.074301,104.141899],[28.06855,104.141899],[28.063551,104.144989],[28.05961,104.144653],[28.053101,104.145844],[28.046881,104.143784],[28.04492,104.142593],[28.040979,104.132111],[28.03643,104.125237],[28.03734,104.121811],[28.03931,104.119408],[28.04492,104.104134],[28.04295,104.097778],[28.039459,104.089882],[28.036131,104.079582],[28.027639,104.075638],[28.023701,104.076317],[28.01643,104.066193],[28.01552,104.052979],[28.01749,104.047653],[28.02037,104.036842],[28.01128,104.010918],[28.00491,104.006973],[28.00279,104.00251],[27.992331,103.988777],[27.99157,103.974182],[27.97747,103.962509],[27.97505,103.953934],[27.966101,103.948952],[27.96595,103.941223],[27.963221,103.935913],[27.95549,103.935043],[27.94791,103.919937],[27.93684,103.917374],[27.928499,103.916679],[27.916361,103.915131],[27.904831,103.913254],[27.89315,103.909286],[27.89012,103.912041],[27.884649,103.910843],[27.874941,103.906197],[27.86569,103.89917],[27.861441,103.897621],[27.854151,103.889557],[27.85294,103.88784],[27.853701,103.88475],[27.8496,103.876343],[27.846411,103.875481],[27.84565,103.873253],[27.843229,103.872223],[27.840639,103.867073],[27.83503,103.867409],[27.831989,103.864151],[27.828501,103.863121],[27.824551,103.857109],[27.821369,103.855049],[27.817869,103.855217],[27.81332,103.856941],[27.81135,103.859512],[27.80846,103.858139],[27.804661,103.861923],[27.799959,103.863289],[27.797831,103.864838],[27.79814,103.868271],[27.787661,103.878403],[27.7869,103.880966],[27.77627,103.880287],[27.7749,103.883202],[27.7708,103.883202],[27.76852,103.88681],[27.75865,103.886978],[27.7547,103.88475],[27.749531,103.884918],[27.74634,103.887154],[27.74361,103.887321],[27.73844,103.891273],[27.73601,103.89299],[27.73358,103.895218],[27.732059,103.89196],[27.72872,103.892303],[27.725531,103.896927],[27.715651,103.891441],[27.712761,103.89196],[27.70896,103.889214],[27.703951,103.88681],[27.701361,103.887497],[27.698931,103.886467],[27.696199,103.886292],[27.69376,103.884918],[27.689659,103.884064],[27.686621,103.880463],[27.684799,103.879768],[27.682671,103.877876],[27.680389,103.877022],[27.67902,103.875481],[27.67598,103.874786],[27.67066,103.866722],[27.667311,103.865181],[27.66564,103.856598],[27.66412,103.852303],[27.65789,103.848183],[27.652719,103.846123],[27.65028,103.843552],[27.64694,103.843552],[27.64283,103.842857],[27.63949,103.839943],[27.63797,103.837029],[27.631729,103.83239],[27.628229,103.831017],[27.626101,103.827583],[27.623819,103.826393],[27.623671,103.82209],[27.621849,103.820717],[27.62261,103.816772],[27.61956,103.815567],[27.618191,103.811279],[27.61515,103.806824],[27.61059,103.80407],[27.605419,103.801147],[27.59964,103.800461],[27.59507,103.800461],[27.593861,103.801491],[27.592939,103.803207],[27.590811,103.804916],[27.588989,103.808357],[27.587311,103.807671],[27.588989,103.805267],[27.59005,103.80304],[27.59157,103.801826],[27.59157,103.798576],[27.592939,103.798576],[27.5931,103.795998],[27.587009,103.785873],[27.586399,103.783813],[27.58518,103.783813],[27.58518,103.781921],[27.582291,103.777107],[27.580311,103.774544],[27.57818,103.773682],[27.57773,103.771797],[27.57362,103.770416],[27.573931,103.768883],[27.57469,103.768021],[27.57453,103.765099],[27.57453,103.763039],[27.57469,103.761841],[27.57316,103.759781],[27.57073,103.758583],[27.56982,103.756172],[27.566931,103.756172],[27.56312,103.753937],[27.56053,103.754967],[27.55475,103.754112],[27.54973,103.752571],[27.54668,103.752739],[27.53923,103.748962],[27.53344,103.747589],[27.530701,103.746902],[27.52355,103.739182],[27.51639,103.736778],[27.51137,103.739182],[27.506189,103.740211],[27.50436,103.739349],[27.50071,103.734718],[27.49873,103.730423],[27.495081,103.729393],[27.494619,103.726646],[27.493549,103.726822],[27.491421,103.728203],[27.476191,103.728706],[27.454559,103.719437],[27.44207,103.725273],[27.41617,103.733856],[27.3988,103.720993],[27.38965,103.717033],[27.36128,103.693459],[27.35232,103.692528],[27.351521,103.692436],[27.34355,103.691467],[27.31587,103.685341],[27.29833,103.681534],[27.29615,103.68148],[27.294399,103.681831],[27.28997,103.683388],[27.2887,103.683456],[27.28771,103.683289],[27.269011,103.676178],[27.268061,103.67598],[27.25794,103.676392],[27.25091,103.676598],[27.24836,103.676224],[27.217649,103.667976],[27.210899,103.667221],[27.20487,103.667038],[27.200251,103.666199],[27.196159,103.664726],[27.19311,103.663017],[27.191919,103.662132],[27.182261,103.651466],[27.179991,103.649803],[27.1779,103.648628],[27.175831,103.647827],[27.17329,103.647232],[27.17054,103.647072],[27.167339,103.647293],[27.164,103.647942],[27.15872,103.649628],[27.154169,103.651733],[27.152031,103.652283],[27.147369,103.652802],[27.143101,103.653908],[27.14143,103.653961],[27.14053,103.65387],[27.131121,103.650887],[27.129351,103.650627],[27.127211,103.650993],[27.12598,103.651718],[27.125299,103.65181],[27.124319,103.651947],[27.12398,103.651947],[27.12299,103.651672],[27.12096,103.651001],[27.113211,103.649933],[27.11253,103.649673],[27.110041,103.648109],[27.10898,103.647667],[27.108009,103.647499],[27.104919,103.647614],[27.103239,103.647346],[27.10194,103.646919],[27.09943,103.645592],[27.09831,103.645218],[27.09693,103.645073],[27.095551,103.645157],[27.09359,103.64563],[27.091999,103.646187],[27.088079,103.647491],[27.08704,103.647629],[27.086451,103.647598],[27.08568,103.647453],[27.084551,103.646973],[27.083851,103.6465],[27.083,103.645699],[27.08264,103.645157],[27.082161,103.644569],[27.080271,103.641853],[27.07803,103.639061],[27.07766,103.63871],[27.077499,103.638573],[27.075359,103.636833],[27.07407,103.636208],[27.07329,103.636017],[27.072309,103.636047],[27.071739,103.636208],[27.07119,103.636482],[27.070351,103.637131],[27.0693,103.638069],[27.06863,103.638474],[27.068081,103.638657],[27.066259,103.638893],[27.065479,103.639137],[27.06492,103.639473],[27.064301,103.640038],[27.06389,103.640556],[27.06365,103.640984],[27.06341,103.641617],[27.063271,103.642319],[27.063351,103.645111],[27.06321,103.646027],[27.06299,103.646698],[27.06267,103.647324],[27.06238,103.647667],[27.06175,103.648239],[27.060841,103.64872],[27.06019,103.648888],[27.059589,103.648903],[27.058981,103.648804],[27.05514,103.647217],[27.05409,103.647003],[27.052629,103.647003],[27.051451,103.647293],[27.05052,103.647758],[27.04999,103.648079],[27.047319,103.650131],[27.045959,103.650383],[27.04484,103.650269],[27.043961,103.649933],[27.04318,103.649384],[27.04158,103.647636],[27.040319,103.646759],[27.039061,103.646202],[27.03179,103.644981],[27.0299,103.644348],[27.02809,103.643211],[27.027651,103.64283],[27.026739,103.641541],[27.02565,103.63929],[27.02478,103.638153],[27.023161,103.636528],[27.022461,103.635483],[27.02191,103.634117],[27.0217,103.632423],[27.02203,103.623558],[27.021061,103.613472],[27.02072,103.612587],[27.02059,103.612259],[27.020491,103.612167],[27.020229,103.61161],[27.01918,103.610069],[27.018311,103.6092],[27.01779,103.60881],[27.017229,103.608498],[27.015921,103.607979],[27.01515,103.607826],[27.0135,103.607803],[27.01181,103.608093],[27.011709,103.608093],[27.010019,103.608276],[27.00703,103.607964],[27.005871,103.608063],[27.00322,103.608597],[27.002371,103.60862],[27.00173,103.608582],[27.0007,103.608337],[26.999479,103.607758],[26.99892,103.607384],[26.99749,103.605911],[26.996691,103.604797],[26.99585,103.603188],[26.995411,103.601929],[26.99506,103.599991],[26.994711,103.594978],[26.994341,103.593391],[26.99378,103.592201],[26.990351,103.588181],[26.98736,103.583832],[26.98568,103.582413],[26.984591,103.581718],[26.98411,103.581467],[26.98325,103.581146],[26.98291,103.5811],[26.982059,103.58091],[26.977859,103.581146],[26.976681,103.580917],[26.97571,103.580482],[26.97448,103.579628],[26.97374,103.578789],[26.972731,103.577187],[26.97262,103.577072],[26.96594,103.565643],[26.965549,103.564171],[26.965549,103.561852],[26.96533,103.560837],[26.964781,103.559708],[26.9634,103.55764],[26.96254,103.556923],[26.96184,103.556503],[26.96139,103.556374],[26.951269,103.55677],[26.949631,103.55658],[26.94891,103.556358],[26.94841,103.556068],[26.947809,103.55555],[26.947411,103.555054],[26.94702,103.554291],[26.946119,103.5513],[26.945709,103.550461],[26.94334,103.547234],[26.94191,103.544724],[26.94112,103.543762],[26.94002,103.542824],[26.93877,103.542023],[26.93788,103.541611],[26.937149,103.541367],[26.93611,103.541443],[26.934299,103.541588],[26.933229,103.541473],[26.932819,103.541367],[26.932211,103.541054],[26.93066,103.539978],[26.93,103.539673],[26.92931,103.539543],[26.928841,103.539528],[26.928129,103.539642],[26.926069,103.540443],[26.925381,103.540588],[26.9245,103.540611],[26.923599,103.540489],[26.92186,103.539993],[26.92103,103.539917],[26.92061,103.539963],[26.919809,103.540237],[26.919241,103.540558],[26.9184,103.541283],[26.91699,103.542778],[26.915291,103.544022],[26.914021,103.544777],[26.91256,103.545868],[26.91078,103.547691],[26.907909,103.551788],[26.90708,103.552597],[26.9065,103.552979],[26.90564,103.553337],[26.904961,103.553467],[26.903021,103.553612],[26.90229,103.55378],[26.901381,103.554176],[26.90003,103.554817],[26.899111,103.555107],[26.898161,103.555237],[26.89669,103.555199],[26.89435,103.554764],[26.89176,103.553963],[26.89102,103.553658],[26.890181,103.553383],[26.888451,103.552727],[26.888281,103.552612],[26.882441,103.549599],[26.8783,103.547081],[26.87499,103.545753],[26.873461,103.545357],[26.870871,103.544884],[26.86898,103.544853],[26.866899,103.54525],[26.86474,103.545937],[26.863489,103.546127],[26.86207,103.546089],[26.86063,103.545738],[26.85984,103.545372],[26.85869,103.544601],[26.85038,103.53727],[26.84799,103.535637],[26.846399,103.534782],[26.84396,103.533813],[26.83536,103.531258],[26.8347,103.530968],[26.83407,103.530586],[26.83326,103.530037],[26.832041,103.528839],[26.83091,103.527328],[26.83005,103.525391],[26.82686,103.516579],[26.82457,103.512283],[26.821711,103.508636],[26.820379,103.507294],[26.81715,103.504631],[26.814951,103.502937],[26.812519,103.500366],[26.810841,103.498398],[26.809139,103.496788],[26.80666,103.495071],[26.80418,103.493851],[26.801371,103.493073],[26.79701,103.492371],[26.795879,103.492073],[26.79248,103.490677],[26.79015,103.489326],[26.78669,103.48716],[26.783381,103.485764],[26.78071,103.485107],[26.77058,103.482986],[26.766041,103.481598],[26.76531,103.481339],[26.76446,103.480957],[26.763821,103.480339],[26.76302,103.479523],[26.762051,103.478531],[26.761669,103.478287],[26.76128,103.478104],[26.76041,103.477943],[26.759781,103.477966],[26.759159,103.478119],[26.75857,103.478416],[26.757839,103.478989],[26.75737,103.479553],[26.75712,103.479958],[26.75683,103.480637],[26.756651,103.481377],[26.75659,103.482094],[26.756491,103.483223],[26.75629,103.483994],[26.756069,103.484467],[26.755079,103.486023],[26.753731,103.487671],[26.751841,103.489517],[26.75123,103.489983],[26.750151,103.490578],[26.74922,103.490883],[26.74822,103.491028],[26.747219,103.490982],[26.746269,103.490784],[26.744961,103.490211],[26.743071,103.489067],[26.742649,103.488876],[26.74197,103.488708],[26.74106,103.48864],[26.737221,103.488533],[26.737341,103.487473],[26.736679,103.486862],[26.736601,103.486687],[26.735531,103.485252],[26.734989,103.484703],[26.73424,103.484253],[26.732981,103.483849],[26.732,103.483582],[26.731449,103.483307],[26.7311,103.483078],[26.730499,103.482452],[26.730009,103.481682],[26.729321,103.480247],[26.728939,103.479683],[26.728479,103.479187],[26.728121,103.478951],[26.726521,103.478203],[26.72613,103.477951],[26.72559,103.477501],[26.725121,103.476929],[26.723829,103.474678],[26.72327,103.474121],[26.72208,103.473419],[26.721121,103.472977],[26.72057,103.472603],[26.71909,103.471123],[26.718109,103.470413],[26.716681,103.469528],[26.715919,103.468903],[26.71526,103.468147],[26.710609,103.461243],[26.708389,103.458847],[26.70776,103.457916],[26.70702,103.456749],[26.70652,103.456177],[26.705839,103.455643],[26.704889,103.455193],[26.70277,103.45462],[26.701481,103.454048],[26.691151,103.446541],[26.68638,103.443703],[26.685579,103.443001],[26.68322,103.440132],[26.67824,103.435547],[26.677401,103.43454],[26.67481,103.430267],[26.674141,103.429466],[26.67314,103.428673],[26.670521,103.426804],[26.669189,103.425629],[26.6684,103.424561],[26.668381,103.424461],[26.666929,103.423126],[26.666401,103.422836],[26.66445,103.420998],[26.663811,103.420197],[26.663759,103.41996],[26.66337,103.419403],[26.660549,103.416901],[26.65888,103.414871],[26.65806,103.414238],[26.654551,103.412773],[26.65377,103.41227],[26.65312,103.411682],[26.65242,103.410744],[26.650511,103.407066],[26.65012,103.406532],[26.64963,103.406036],[26.64196,103.400917],[26.638769,103.399353],[26.636061,103.398041],[26.634979,103.397331],[26.63376,103.396317],[26.63225,103.394592],[26.627741,103.389038],[26.62705,103.387947],[26.624969,103.382874],[26.62381,103.379868],[26.623381,103.379211],[26.622931,103.37886],[26.622601,103.378677],[26.62208,103.37851],[26.62118,103.378342],[26.620661,103.378143],[26.620199,103.3778],[26.618971,103.376579],[26.61879,103.376266],[26.6173,103.374977],[26.616819,103.374672],[26.61614,103.374443],[26.615271,103.374283],[26.614929,103.374153],[26.614441,103.373901],[26.613911,103.373398],[26.613041,103.372147],[26.612579,103.37178],[26.61199,103.371429],[26.610559,103.37085],[26.609949,103.370407],[26.60861,103.368393],[26.608141,103.367996],[26.60759,103.36776],[26.607281,103.367691],[26.60648,103.367706],[26.604321,103.368393],[26.603701,103.368401],[26.60276,103.368134],[26.602051,103.367638],[26.600719,103.3666],[26.600389,103.366402],[26.599649,103.366127],[26.594931,103.365623],[26.59449,103.365494],[26.59387,103.365181],[26.59334,103.364754],[26.593019,103.364357],[26.59199,103.363037],[26.58865,103.358833],[26.588079,103.358269],[26.587099,103.357651],[26.586571,103.357437],[26.585621,103.357277],[26.584681,103.357353],[26.58441,103.357368],[26.58337,103.357529],[26.582121,103.357491],[26.58202,103.35746],[26.57988,103.35688],[26.57847,103.356453],[26.576639,103.356483],[26.57616,103.356628],[26.57501,103.357262],[26.573641,103.358566],[26.572889,103.360184],[26.57221,103.361847],[26.57144,103.362839],[26.570829,103.363373],[26.570009,103.363831],[26.56896,103.36412],[26.56839,103.364113],[26.56765,103.364037],[26.56732,103.363983],[26.56605,103.36335],[26.565611,103.363037],[26.561211,103.358841],[26.56068,103.358238],[26.55739,103.352203],[26.55625,103.350777],[26.555281,103.349998],[26.551029,103.347748],[26.54763,103.345238],[26.543949,103.342262],[26.54328,103.341537],[26.54122,103.338219],[26.5352,103.32708],[26.5343,103.326233],[26.53418,103.326141],[26.5306,103.324722],[26.53013,103.324417],[26.52984,103.324158],[26.529591,103.323853],[26.52923,103.323128],[26.529131,103.322723],[26.529091,103.321892],[26.52928,103.32029],[26.529249,103.319679],[26.529091,103.319107],[26.52883,103.318604],[26.5261,103.315666],[26.5256,103.315247],[26.52487,103.314781],[26.52132,103.313271],[26.520399,103.313087],[26.51967,103.313087],[26.513321,103.313911],[26.512739,103.313904],[26.51181,103.31369],[26.511129,103.313377],[26.51038,103.312759],[26.5098,103.312019],[26.50769,103.307098],[26.506969,103.306129],[26.5065,103.305687],[26.505831,103.305313],[26.504841,103.305023],[26.499769,103.305023],[26.49926,103.304916],[26.49859,103.304657],[26.49827,103.304459],[26.49769,103.303886],[26.496719,103.302559],[26.49597,103.301826],[26.49544,103.301514],[26.494869,103.301292],[26.494061,103.301193],[26.49346,103.301247],[26.49209,103.301643],[26.487391,103.30336],[26.484831,103.303802],[26.484209,103.303802],[26.483999,103.303772],[26.482771,103.303909],[26.481871,103.304153],[26.480391,103.304916],[26.47942,103.305557],[26.4783,103.306091],[26.47756,103.306236],[26.477131,103.306213],[26.476629,103.306061],[26.476021,103.305687],[26.474951,103.304581],[26.473909,103.303993],[26.47316,103.30378],[26.472469,103.303741],[26.471979,103.303833],[26.47183,103.303886],[26.47172,103.304001],[26.471331,103.304131],[26.470421,103.304176],[26.46986,103.304047],[26.46932,103.303772],[26.468941,103.303452],[26.468309,103.302727],[26.466181,103.299278],[26.46574,103.298576],[26.46533,103.29808],[26.46483,103.297737],[26.464491,103.297577],[26.463921,103.297493],[26.46352,103.297531],[26.462311,103.297974],[26.460239,103.298714],[26.459629,103.298843],[26.459009,103.298889],[26.45858,103.298851],[26.457951,103.298683],[26.456949,103.298157],[26.456591,103.297897],[26.456091,103.297447],[26.455721,103.296959],[26.45507,103.295624],[26.453449,103.290291],[26.4531,103.289574],[26.45273,103.28907],[26.452141,103.288483],[26.447451,103.285461],[26.447041,103.285057],[26.44672,103.284607],[26.44651,103.284088],[26.44643,103.283531],[26.44644,103.282013],[26.44626,103.281258],[26.44591,103.280571],[26.442511,103.276314],[26.44105,103.274773],[26.42713,103.267792],[26.42532,103.266891],[26.424749,103.266602],[26.424561,103.266487],[26.393221,103.250977],[26.391689,103.250366],[26.391001,103.250252],[26.390511,103.250252],[26.38979,103.250359],[26.389311,103.250511],[26.388599,103.250839],[26.38796,103.251289],[26.387421,103.251831],[26.38199,103.258743],[26.380569,103.260162],[26.3787,103.261597],[26.37796,103.262077],[26.376129,103.262993],[26.374269,103.263718],[26.37236,103.264168],[26.36668,103.265137],[26.36566,103.26519],[26.36433,103.265091],[26.36381,103.264969],[26.36306,103.264641],[26.36236,103.264252],[26.359619,103.262039],[26.358789,103.261551],[26.35813,103.261337],[26.35747,103.261276],[26.355379,103.261307],[26.354601,103.261162],[26.34967,103.258942],[26.348619,103.25872],[26.34795,103.258759],[26.34745,103.258904],[26.34697,103.259163],[26.346371,103.259651],[26.34589,103.260277],[26.34553,103.261009],[26.34346,103.267906],[26.3433,103.269096],[26.343361,103.269836],[26.34374,103.271461],[26.3438,103.272087],[26.34333,103.27475],[26.34334,103.27597],[26.343531,103.277008],[26.34387,103.278038],[26.34478,103.280586],[26.344999,103.281326],[26.34659,103.285301],[26.346701,103.285789],[26.346741,103.28656],[26.346519,103.288887],[26.346769,103.292091],[26.34671,103.29287],[26.34654,103.29332],[26.344839,103.296158],[26.344681,103.296356],[26.34429,103.296669],[26.343599,103.296982],[26.34197,103.297363],[26.34129,103.297623],[26.3395,103.298767],[26.338619,103.299133],[26.334459,103.300262],[26.333811,103.300591],[26.333441,103.30088],[26.332121,103.302429],[26.328951,103.30632],[26.328211,103.307053],[26.327579,103.307518],[26.32666,103.307922],[26.32531,103.308357],[26.32243,103.309929],[26.32165,103.310471],[26.31884,103.314163],[26.31797,103.315041],[26.31698,103.315773],[26.315729,103.316521],[26.315001,103.317123],[26.31403,103.318253],[26.312361,103.320862],[26.31218,103.321312],[26.311239,103.325974],[26.31101,103.326736],[26.309771,103.329491],[26.309549,103.330276],[26.30946,103.330818],[26.30946,103.332451],[26.309401,103.332977],[26.309179,103.33374],[26.30858,103.334938],[26.3076,103.336472],[26.30689,103.338226],[26.30661,103.339333],[26.30633,103.340973],[26.30619,103.341461],[26.305849,103.342163],[26.305531,103.342537],[26.30406,103.343918],[26.30307,103.344681],[26.30007,103.347366],[26.298969,103.348038],[26.29743,103.348663],[26.294941,103.349159],[26.294559,103.349297],[26.29011,103.352043],[26.28854,103.353416],[26.287861,103.354118],[26.287491,103.354378],[26.286869,103.354637],[26.28377,103.355232],[26.283331,103.355377],[26.28273,103.355713],[26.280279,103.358047],[26.279699,103.358467],[26.277109,103.359993],[26.2764,103.360291],[26.27462,103.360687],[26.273331,103.36097],[26.27282,103.361153],[26.27235,103.361397],[26.27169,103.361893],[26.26902,103.364273],[26.26837,103.36467],[26.2679,103.364868],[26.267389,103.36499],[26.266621,103.36499],[26.26524,103.364647],[26.26186,103.363678],[26.261129,103.363548],[26.260429,103.363541],[26.26001,103.363602],[26.25942,103.363823],[26.257891,103.364769],[26.257271,103.365021],[26.256359,103.365173],[26.253691,103.365349],[26.25301,103.365479],[26.24645,103.367821],[26.244711,103.368767],[26.24288,103.370148],[26.238939,103.373947],[26.2377,103.375526],[26.236839,103.377007],[26.235729,103.379669],[26.235359,103.38105],[26.234341,103.389236],[26.23395,103.390549],[26.23344,103.39151],[26.233101,103.391953],[26.23229,103.392693],[26.23144,103.393372],[26.230499,103.394333],[26.229891,103.395218],[26.22916,103.396698],[26.22888,103.397476],[26.228121,103.400261],[26.227501,103.40213],[26.227301,103.402931],[26.227091,103.403427],[26.226641,103.404121],[26.22611,103.404709],[26.22547,103.405182],[26.224661,103.405533],[26.221069,103.406113],[26.219521,103.406143],[26.218451,103.40596],[26.21789,103.405693],[26.215919,103.404037],[26.21559,103.403633],[26.21291,103.401031],[26.21072,103.399094],[26.207279,103.39798],[26.203951,103.398811],[26.2036,103.399063],[26.203199,103.3992],[26.202829,103.399406],[26.20146,103.399971],[26.200609,103.400146],[26.19997,103.400192],[26.19912,103.400063],[26.19795,103.399513],[26.196461,103.398643],[26.195471,103.398148],[26.19492,103.397797],[26.194241,103.397324],[26.194031,103.397247],[26.19183,103.396027],[26.190729,103.39579],[26.189899,103.395866],[26.188931,103.396301],[26.18684,103.397659],[26.1859,103.39827],[26.18556,103.398376],[26.183399,103.398598],[26.18268,103.398857],[26.181829,103.399399],[26.18091,103.400352],[26.178711,103.403313],[26.17831,103.403709],[26.177891,103.403923],[26.177549,103.403999],[26.177019,103.403893],[26.176781,103.403763],[26.176559,103.403557],[26.176319,103.403137],[26.17622,103.402802],[26.17618,103.402283],[26.176229,103.401787],[26.176371,103.4011],[26.17642,103.400589],[26.17622,103.398972],[26.17621,103.397568],[26.17647,103.39576],[26.176189,103.393623],[26.175739,103.391579],[26.175739,103.391418],[26.17531,103.390739],[26.174931,103.390457],[26.174641,103.390373],[26.174351,103.390373],[26.17407,103.390442],[26.173679,103.390701],[26.173361,103.391098],[26.173,103.391907],[26.172779,103.392677],[26.172409,103.393379],[26.17231,103.393494],[26.17207,103.393646],[26.171659,103.393723],[26.168779,103.393097],[26.168171,103.392822],[26.16744,103.392273],[26.167351,103.392174],[26.166031,103.391159],[26.16197,103.38813],[26.160919,103.387016],[26.160311,103.386307],[26.15793,103.384117],[26.157539,103.383659],[26.155451,103.380707],[26.154449,103.379318],[26.153799,103.377769],[26.153231,103.375031],[26.153231,103.374878],[26.15317,103.374748],[26.15295,103.374046],[26.152229,103.373108],[26.151541,103.372322],[26.15114,103.371468],[26.1509,103.370163],[26.150761,103.369881],[26.15069,103.36956],[26.15045,103.369148],[26.14999,103.368767],[26.149561,103.368652],[26.14912,103.368683],[26.1486,103.368927],[26.147631,103.369682],[26.147181,103.369873],[26.14687,103.369904],[26.146391,103.369827],[26.14535,103.369431],[26.14488,103.36937],[26.144581,103.369408],[26.144341,103.36953],[26.14411,103.369728],[26.14381,103.370247],[26.143709,103.370888],[26.143721,103.372162],[26.1436,103.372597],[26.143379,103.373001],[26.1432,103.373222],[26.142719,103.373543],[26.14189,103.373787],[26.137711,103.373772],[26.136459,103.373596],[26.135691,103.373672],[26.13501,103.373833],[26.12385,103.377121],[26.122641,103.377708],[26.11801,103.381523],[26.116779,103.382263],[26.1161,103.38253],[26.11503,103.382759],[26.113741,103.382843],[26.111959,103.382561],[26.11124,103.382233],[26.110331,103.381683],[26.110001,103.381363],[26.108641,103.379333],[26.10817,103.378563],[26.107849,103.377998],[26.107479,103.377693],[26.10696,103.377563],[26.10442,103.377533],[26.10367,103.377296],[26.102921,103.376793],[26.102301,103.376068],[26.100321,103.372772],[26.099701,103.371986],[26.099489,103.371803],[26.09893,103.371521],[26.098669,103.371498],[26.098049,103.371613],[26.097521,103.371902],[26.096581,103.372757],[26.095949,103.373337],[26.09532,103.373833],[26.09458,103.3741],[26.09387,103.374077],[26.09329,103.373894],[26.090401,103.372589],[26.083139,103.368111],[26.082951,103.368011],[26.07933,103.364166],[26.078779,103.363388],[26.078369,103.362213],[26.078131,103.361214],[26.07766,103.360123],[26.07703,103.359161],[26.07538,103.356583],[26.07522,103.356468],[26.07472,103.356041],[26.074341,103.355797],[26.07395,103.355652],[26.07341,103.355598],[26.07279,103.35569],[26.066151,103.35788],[26.06604,103.357964],[26.06423,103.358704],[26.054621,103.363274],[26.05266,103.3638],[26.05201,103.364159],[26.051319,103.364777],[26.05094,103.365219],[26.050579,103.365707],[26.050171,103.366112],[26.049669,103.366417],[26.04929,103.366547],[26.048889,103.366623],[26.04748,103.36657],[26.04694,103.366669],[26.04641,103.36689],[26.045811,103.367363],[26.043739,103.369476],[26.042669,103.370308],[26.037701,103.373703],[26.03702,103.373978],[26.036551,103.374069],[26.035601,103.374107],[26.03249,103.37413],[26.030939,103.374496],[26.027519,103.375816],[26.02634,103.376213],[26.025709,103.376297],[26.02487,103.376244],[26.02202,103.375542],[26.015551,103.374832],[26.014351,103.374496],[26.01321,103.374023],[26.0124,103.373756],[26.011789,103.373688],[26.007721,103.373962],[26.00436,103.373741],[26.00349,103.37384],[26.000931,103.374496],[26.00028,103.374527],[25.99984,103.374474],[25.99917,103.374283],[25.99048,103.369667],[25.98843,103.368462],[25.987419,103.367493],[25.98374,103.362061],[25.98126,103.359642],[25.974859,103.354439],[25.97471,103.354286],[25.968161,103.348991],[25.967581,103.348373],[25.967051,103.347679],[25.96632,103.346207],[25.966,103.34536],[25.965891,103.344963],[25.965139,103.343102],[25.96468,103.3423],[25.96401,103.341583],[25.96048,103.339149],[25.95989,103.338921],[25.95927,103.33886],[25.95841,103.338966],[25.95583,103.339653],[25.954,103.339706],[25.95211,103.339279],[25.95129,103.339073],[25.95068,103.339043],[25.950279,103.339081],[25.949671,103.339279],[25.94873,103.339767],[25.94838,103.340057],[25.946369,103.342346],[25.945511,103.343246],[25.945009,103.343643],[25.944611,103.343849],[25.944201,103.343979],[25.943991,103.344009],[25.943371,103.343933],[25.942789,103.343681],[25.94227,103.343277],[25.941629,103.34256],[25.937929,103.337509],[25.93656,103.335693],[25.935539,103.334587],[25.934219,103.33329],[25.933281,103.33181],[25.93195,103.32885],[25.93116,103.327721],[25.93108,103.327606],[25.930941,103.327522],[25.93082,103.32737],[25.93,103.326981],[25.928551,103.326042],[25.92778,103.325394],[25.926069,103.323463],[25.925529,103.323059],[25.924589,103.322632],[25.92318,103.322243],[25.922449,103.3218],[25.921789,103.321243],[25.920389,103.319901],[25.920111,103.319733],[25.919769,103.319641],[25.91926,103.319649],[25.915279,103.321182],[25.9137,103.321838],[25.91114,103.321938],[25.91078,103.319809],[25.91044,103.316429],[25.910641,103.316177],[25.910789,103.315857],[25.911779,103.314079],[25.912121,103.313232],[25.912319,103.312576],[25.9126,103.310478],[25.913059,103.308723],[25.913099,103.308289],[25.912689,103.306068],[25.91288,103.303902],[25.912809,103.303436],[25.912411,103.302567],[25.91205,103.302177],[25.911591,103.301903],[25.91148,103.301888],[25.910851,103.301537],[25.910299,103.301361],[25.908951,103.300728],[25.9088,103.300598],[25.906731,103.299622],[25.905649,103.299858],[25.905439,103.300003],[25.905359,103.299957],[25.904671,103.300102],[25.903919,103.300034],[25.903509,103.299767],[25.90321,103.299316],[25.902201,103.295471],[25.90147,103.293877],[25.90085,103.293854],[25.90065,103.293762],[25.90052,103.293427],[25.900061,103.292648],[25.89992,103.291634],[25.899891,103.291107],[25.899771,103.290756],[25.899521,103.290352],[25.89922,103.290131],[25.899059,103.290092],[25.89883,103.290108],[25.89856,103.290039],[25.897209,103.290359],[25.8962,103.290253],[25.895651,103.289963],[25.89509,103.289436],[25.894699,103.288834],[25.894199,103.287666],[25.893629,103.287033],[25.893419,103.28688],[25.89274,103.286728],[25.89192,103.286789],[25.890381,103.287148],[25.8895,103.287239],[25.887739,103.286926],[25.88566,103.286507],[25.88493,103.286583],[25.883249,103.287277],[25.88265,103.287369],[25.881981,103.287216],[25.879101,103.28566],[25.87722,103.284523],[25.876011,103.284119],[25.871019,103.283287],[25.86895,103.283157],[25.86727,103.282509],[25.86611,103.281937],[25.865749,103.28183],[25.86347,103.281464],[25.86125,103.280663],[25.85948,103.280479],[25.856489,103.280434],[25.854349,103.280251],[25.8536,103.279984],[25.853001,103.279556],[25.852051,103.278236],[25.850981,103.276466],[25.850651,103.276039],[25.8494,103.275017],[25.849079,103.274834],[25.84857,103.274673],[25.848049,103.274628],[25.847309,103.274696],[25.84659,103.274849],[25.845449,103.274872],[25.84498,103.274757],[25.844231,103.274399],[25.843599,103.274246],[25.84259,103.274292],[25.838961,103.274857],[25.837351,103.274857],[25.83423,103.273956],[25.833731,103.273933],[25.833059,103.274109],[25.832451,103.27446],[25.8311,103.275482],[25.83045,103.275703],[25.829679,103.275757],[25.827801,103.275658],[25.82725,103.275711],[25.826559,103.275932],[25.82596,103.27626],[25.82546,103.276657],[25.82526,103.276878],[25.8204,103.277748],[25.8202,103.277733],[25.820049,103.277649],[25.81978,103.277359],[25.81876,103.276527],[25.8181,103.276207],[25.817751,103.276108],[25.816999,103.276108],[25.81418,103.276428],[25.81275,103.276459],[25.810659,103.276108],[25.80863,103.276161],[25.803711,103.276512],[25.799,103.275848],[25.797159,103.275597],[25.796749,103.275597],[25.796009,103.275749],[25.7952,103.276108],[25.79451,103.276657],[25.79405,103.277161],[25.793079,103.278763],[25.79258,103.279327],[25.79213,103.279648],[25.791451,103.279907],[25.790899,103.279999],[25.790331,103.279953],[25.789801,103.279778],[25.78635,103.277962],[25.78553,103.277649],[25.784929,103.277496],[25.784149,103.277458],[25.78261,103.277557],[25.78163,103.277496],[25.78021,103.277199],[25.77636,103.276031],[25.771879,103.274979],[25.77083,103.274529],[25.769979,103.274109],[25.769329,103.273857],[25.76755,103.273407],[25.76668,103.273247],[25.76523,103.272781],[25.76408,103.272308],[25.763359,103.272102],[25.762831,103.272057],[25.762381,103.272133],[25.76111,103.27253],[25.7603,103.272797],[25.75943,103.272858],[25.759081,103.272781],[25.7582,103.272346],[25.75625,103.271156],[25.755899,103.271004],[25.75555,103.270882],[25.75481,103.27076],[25.75461,103.27076],[25.75441,103.270798],[25.75098,103.27066],[25.74658,103.27095],[25.745951,103.270882],[25.74535,103.270699],[25.741751,103.269157],[25.740379,103.268951],[25.727909,103.269653],[25.72686,103.269577],[25.72611,103.269402],[25.72541,103.269096],[25.723101,103.267998],[25.722099,103.267677],[25.721081,103.267548],[25.72028,103.267563],[25.719259,103.267677],[25.7166,103.267754],[25.714849,103.267647],[25.71176,103.267097],[25.709009,103.26635],[25.708229,103.266197],[25.70643,103.266159],[25.703899,103.266403],[25.70166,103.266502],[25.695101,103.266151],[25.69413,103.26593],[25.69368,103.265709],[25.692631,103.26506],[25.69173,103.264702],[25.69101,103.26458],[25.6898,103.264664],[25.68721,103.265106],[25.685909,103.265381],[25.6849,103.265511],[25.68416,103.26548],[25.683701,103.265358],[25.681999,103.264557],[25.68136,103.264351],[25.68075,103.264259],[25.67716,103.265152],[25.676611,103.265182],[25.67605,103.265083],[25.67461,103.264557],[25.67281,103.263763],[25.67136,103.26326],[25.668329,103.262451],[25.667351,103.261978],[25.665979,103.261162],[25.665279,103.260902],[25.664801,103.260811],[25.664061,103.260811],[25.661209,103.261253],[25.66028,103.261253],[25.65893,103.261002],[25.65873,103.260933],[25.657881,103.26078],[25.65686,103.260857],[25.65041,103.263283],[25.64731,103.264412],[25.64706,103.264481],[25.646259,103.264603],[25.645109,103.264549],[25.64435,103.264412],[25.63361,103.261147],[25.63203,103.260757],[25.63093,103.260399],[25.62985,103.259933],[25.628759,103.259354],[25.62656,103.257698],[25.62546,103.256607],[25.62421,103.254982],[25.62351,103.25383],[25.62183,103.250664],[25.620859,103.249229],[25.61961,103.247726],[25.607679,103.235161],[25.599199,103.226303],[25.597651,103.224983],[25.595449,103.223511],[25.5819,103.217506],[25.5807,103.217133],[25.57921,103.216927],[25.578711,103.216911],[25.577959,103.216927],[25.57568,103.216881],[25.574659,103.216698],[25.566509,103.214333],[25.5655,103.213852],[25.5634,103.212646],[25.5632,103.212509],[25.55838,103.209663],[25.556431,103.208527],[25.55505,103.207977],[25.553829,103.20768],[25.550329,103.207092],[25.54949,103.206947],[25.549971,103.207581],[25.55011,103.207863],[25.55036,103.208107],[25.550711,103.208153],[25.551161,103.208252],[25.551571,103.208557],[25.55184,103.206657],[25.55212,103.2062],[25.552441,103.206009],[25.55271,103.205597],[25.552811,103.204437],[25.55295,103.201317],[25.55307,103.197433],[25.553141,103.196373],[25.553471,103.191902],[25.55352,103.191704],[25.55443,103.188454],[25.55512,103.185707],[25.55559,103.183983],[25.556129,103.182167],[25.556459,103.181473],[25.556829,103.180923],[25.557421,103.18029],[25.557961,103.179893],[25.558849,103.179443],[25.56251,103.177856],[25.56278,103.177696],[25.563021,103.177513],[25.56337,103.176979],[25.56349,103.176689],[25.56361,103.176163],[25.5637,103.175423],[25.56385,103.174667],[25.566589,103.167618],[25.56706,103.166313],[25.56739,103.165588],[25.568171,103.164452],[25.568741,103.163582],[25.569189,103.163292],[25.57011,103.16304],[25.57065,103.162827],[25.57196,103.16214],[25.572519,103.161873],[25.573351,103.16143],[25.573721,103.161507],[25.5742,103.161903],[25.57464,103.161949],[25.574829,103.161812],[25.57535,103.161179],[25.57547,103.160851],[25.575331,103.160667],[25.57497,103.160606],[25.57469,103.160347],[25.574699,103.15976],[25.5748,103.159492],[25.57592,103.158859],[25.57621,103.158661],[25.576571,103.158234],[25.57695,103.157837],[25.57728,103.157677],[25.57756,103.157677],[25.577869,103.1576],[25.578381,103.15728],[25.578501,103.157158],[25.578569,103.156998],[25.578751,103.156227],[25.57889,103.155884],[25.578951,103.155617],[25.578899,103.155373],[25.57851,103.154999],[25.578341,103.154762],[25.5783,103.154556],[25.578291,103.153717],[25.578421,103.153511],[25.578581,103.153572],[25.578779,103.153908],[25.57897,103.154114],[25.579531,103.154411],[25.5797,103.154297],[25.579691,103.154083],[25.57925,103.153549],[25.579029,103.153137],[25.57893,103.152763],[25.57901,103.152313],[25.579121,103.152031],[25.57951,103.151489],[25.57963,103.15123],[25.57971,103.150513],[25.57984,103.15023],[25.580021,103.15023],[25.58012,103.150337],[25.580151,103.150909],[25.58033,103.151741],[25.580509,103.15197],[25.580709,103.152061],[25.58091,103.152077],[25.58124,103.151878],[25.582331,103.149551],[25.583521,103.147102],[25.58371,103.146568],[25.583759,103.14608],[25.58305,103.142853],[25.582661,103.141586],[25.582661,103.141121],[25.583111,103.139793],[25.58313,103.139458],[25.58235,103.136772],[25.581261,103.134132],[25.58086,103.133087],[25.580469,103.132187],[25.58016,103.131752],[25.57819,103.130074],[25.57766,103.129532],[25.577579,103.129402],[25.57732,103.128807],[25.576981,103.127869],[25.57686,103.127609],[25.576509,103.127213],[25.57601,103.126793],[25.575859,103.126587],[25.57546,103.125763],[25.575029,103.125343],[25.574381,103.125191],[25.57383,103.125221],[25.573139,103.125366],[25.572701,103.125343],[25.572411,103.12513],[25.572041,103.124657],[25.57058,103.12236],[25.570129,103.121719],[25.56999,103.121452],[25.56992,103.12104],[25.570089,103.120644],[25.57011,103.120171],[25.569851,103.119743],[25.569521,103.119537],[25.567829,103.119141],[25.567499,103.11882],[25.567249,103.118172],[25.566469,103.117126],[25.566259,103.116653],[25.566311,103.116257],[25.56665,103.115494],[25.566719,103.114906],[25.5667,103.11467],[25.566521,103.114182],[25.56608,103.113403],[25.56568,103.112846],[25.565281,103.112373],[25.56498,103.112122],[25.563419,103.111099],[25.55805,103.107399],[25.55769,103.107231],[25.5539,103.105881],[25.5509,103.104362],[25.54928,103.103989],[25.54875,103.103996],[25.548,103.10421],[25.547489,103.104179],[25.546881,103.103958],[25.546,103.103523],[25.54587,103.103317],[25.5459,103.103203],[25.546021,103.102921],[25.54619,103.10276],[25.546551,103.102676],[25.547609,103.102509],[25.54808,103.102531],[25.548491,103.102364],[25.548651,103.102249],[25.548809,103.101883],[25.54903,103.101791],[25.549311,103.102112],[25.549601,103.102226],[25.55043,103.102081],[25.55094,103.101936],[25.55117,103.101807],[25.55135,103.101593],[25.551689,103.101341],[25.55188,103.101341],[25.55261,103.101448],[25.552971,103.101334],[25.553209,103.101028],[25.55323,103.100754],[25.552891,103.099854],[25.55262,103.099663],[25.55237,103.099602],[25.55221,103.099319],[25.552,103.098473],[25.551741,103.097923],[25.55172,103.097511],[25.55191,103.097099],[25.552271,103.096809],[25.5527,103.09684],[25.552879,103.096947],[25.553631,103.097603],[25.554001,103.097733],[25.555149,103.097931],[25.555559,103.098129],[25.55596,103.098267],[25.55673,103.097969],[25.55715,103.097763],[25.557779,103.097687],[25.558451,103.097481],[25.559259,103.096878],[25.559469,103.096367],[25.55983,103.096092],[25.55995,103.09584],[25.559891,103.095459],[25.55999,103.095337],[25.56019,103.095222],[25.56027,103.094994],[25.560261,103.09491],[25.56045,103.094612],[25.56053,103.094597],[25.560789,103.094353],[25.56094,103.093941],[25.561159,103.093773],[25.56131,103.093964],[25.56152,103.094498],[25.561859,103.094933],[25.562401,103.095062],[25.562771,103.095047],[25.563141,103.09494],[25.56348,103.094719],[25.564951,103.093613],[25.565281,103.093552],[25.56558,103.093719],[25.56576,103.093781],[25.566071,103.093773],[25.56847,103.093002],[25.568859,103.09269],[25.570089,103.091476],[25.570459,103.091301],[25.570709,103.091263],[25.571011,103.09111],[25.571091,103.090919],[25.571091,103.090347],[25.57073,103.089706],[25.570801,103.089394],[25.57111,103.089249],[25.571381,103.08902],[25.57136,103.088783],[25.570959,103.088074],[25.57095,103.087837],[25.571119,103.087791],[25.57139,103.087784],[25.572081,103.087608],[25.57238,103.08741],[25.57251,103.087021],[25.572309,103.083817],[25.57247,103.082024],[25.572451,103.081833],[25.572371,103.081642],[25.571899,103.080872],[25.57159,103.080421],[25.571381,103.08004],[25.57136,103.079712],[25.571541,103.079498],[25.571911,103.079277],[25.572201,103.078949],[25.57238,103.078491],[25.572651,103.078102],[25.573219,103.077606],[25.57412,103.076927],[25.57445,103.076408],[25.57472,103.075829],[25.57514,103.07444],[25.57538,103.073853],[25.576191,103.072327],[25.576509,103.071617],[25.576969,103.070282],[25.57692,103.069893],[25.57634,103.068428],[25.576241,103.068283],[25.57583,103.067947],[25.575491,103.067886],[25.57477,103.067917],[25.57431,103.067993],[25.573549,103.068024],[25.573231,103.067886],[25.573071,103.067589],[25.572729,103.06546],[25.572651,103.065163],[25.572309,103.064743],[25.571779,103.064262],[25.571659,103.063957],[25.57176,103.063797],[25.573151,103.062553],[25.57329,103.062248],[25.57332,103.058449],[25.57328,103.057503],[25.573191,103.056824],[25.572861,103.05513],[25.57259,103.054642],[25.5718,103.053482],[25.57119,103.052803],[25.57078,103.052467],[25.5707,103.052429],[25.5704,103.052116],[25.57029,103.051788],[25.570129,103.051514],[25.56991,103.051277],[25.569401,103.051086],[25.56897,103.051041],[25.568569,103.050858],[25.568251,103.050484],[25.56826,103.050209],[25.568439,103.050117],[25.56875,103.050163],[25.56941,103.050034],[25.56971,103.049828],[25.570129,103.049744],[25.57021,103.049751],[25.57085,103.049637],[25.57099,103.049553],[25.571159,103.049057],[25.571171,103.048843],[25.5711,103.048607],[25.57073,103.047859],[25.57004,103.046677],[25.56974,103.046463],[25.56904,103.04615],[25.56856,103.04583],[25.56805,103.045403],[25.56785,103.045097],[25.567631,103.044533],[25.567249,103.044243],[25.566759,103.044067],[25.56636,103.044167],[25.56559,103.044731],[25.56531,103.044678],[25.565241,103.043938],[25.56517,103.043663],[25.565241,103.043167],[25.565371,103.042923],[25.56538,103.042542],[25.565269,103.042374],[25.56428,103.041054],[25.563749,103.040413],[25.562929,103.039612],[25.562571,103.03894],[25.56245,103.038544],[25.562031,103.037956],[25.561899,103.037437],[25.561741,103.037323],[25.561319,103.037193],[25.56114,103.037109],[25.56098,103.036812],[25.561119,103.036598],[25.56152,103.036247],[25.56159,103.036003],[25.56147,103.035896],[25.561171,103.035744],[25.56093,103.035667],[25.56032,103.035713],[25.56004,103.035538],[25.55975,103.035011],[25.55949,103.034401],[25.55925,103.034157],[25.55895,103.033997],[25.55879,103.033691],[25.558889,103.033432],[25.55932,103.032944],[25.559469,103.032471],[25.55938,103.032204],[25.55883,103.031616],[25.55821,103.031197],[25.55794,103.030731],[25.55785,103.030411],[25.5576,103.030113],[25.556141,103.029617],[25.555771,103.029457],[25.555401,103.02948],[25.555309,103.029533],[25.554899,103.029587],[25.55475,103.029381],[25.554729,103.028687],[25.554689,103.028503],[25.554489,103.028358],[25.55349,103.028343],[25.55323,103.028152],[25.55324,103.027718],[25.55316,103.027229],[25.55294,103.026657],[25.5527,103.026413],[25.55253,103.026337],[25.552259,103.025993],[25.552361,103.025703],[25.552589,103.025459],[25.55295,103.025337],[25.55312,103.025436],[25.553419,103.025757],[25.55369,103.025909],[25.555309,103.025841],[25.55563,103.025673],[25.55615,103.025169],[25.556259,103.024849],[25.55616,103.024689],[25.55513,103.023552],[25.555019,103.023193],[25.55521,103.023087],[25.555559,103.023102],[25.556179,103.022926],[25.556749,103.02269],[25.55724,103.022552],[25.55743,103.022537],[25.557711,103.022598],[25.55817,103.022781],[25.559549,103.023666],[25.56052,103.024246],[25.561411,103.024841],[25.562189,103.025307],[25.56303,103.025551],[25.56348,103.025864],[25.563971,103.025993],[25.56423,103.026016],[25.564751,103.025917],[25.565861,103.025681],[25.566389,103.025398],[25.566771,103.025307],[25.567551,103.025284],[25.567841,103.025299],[25.56811,103.025513],[25.568371,103.02594],[25.568729,103.026199],[25.568899,103.026283],[25.569241,103.026222],[25.569469,103.026047],[25.569651,103.025772],[25.569889,103.0252],[25.569969,103.024673],[25.57015,103.024231],[25.570391,103.023933],[25.57065,103.023376],[25.57066,103.022972],[25.570589,103.022568],[25.57069,103.022057],[25.57078,103.021828],[25.570761,103.021362],[25.570669,103.021133],[25.570669,103.020638],[25.570841,103.019882],[25.570829,103.019081],[25.570971,103.018578],[25.57155,103.017769],[25.572029,103.017174],[25.572241,103.016777],[25.573,103.014839],[25.573151,103.01416],[25.573271,103.013031],[25.573271,103.012833],[25.57338,103.012459],[25.573601,103.012138],[25.5737,103.011833],[25.57345,103.011597],[25.57276,103.011101],[25.572639,103.010773],[25.57287,103.010193],[25.57291,103.009628],[25.5728,103.008873],[25.572901,103.008636],[25.573071,103.00869],[25.574011,103.009239],[25.57431,103.009277],[25.574421,103.009071],[25.574459,103.00782],[25.574369,103.007431],[25.574089,103.00692],[25.57399,103.006683],[25.57394,103.006271],[25.573971,103.005928],[25.5744,103.004807],[25.574659,103.003403],[25.574949,103.002617],[25.575359,103.001923],[25.5756,103.001801],[25.5758,103.001961],[25.576151,103.002373],[25.5765,103.002541],[25.57749,103.001961],[25.577869,103.0019],[25.578369,103.001999],[25.57873,103.001869],[25.57901,103.001549],[25.579069,103.001289],[25.577009,102.99852],[25.57688,102.998253],[25.57686,102.997772],[25.577089,102.996407],[25.57708,102.996094],[25.57691,102.995811],[25.5767,102.995773],[25.576521,102.995819],[25.575609,102.996269],[25.575411,102.99617],[25.57548,102.996048],[25.5763,102.995232],[25.57654,102.995064],[25.57675,102.995033],[25.57715,102.995049],[25.577591,102.99514],[25.57785,102.995064],[25.57794,102.99482],[25.57836,102.993217],[25.578449,102.992981],[25.578621,102.992683],[25.578791,102.992439],[25.579309,102.991913],[25.5812,102.990082],[25.58205,102.989059],[25.582279,102.988907],[25.58251,102.988792],[25.58301,102.988663],[25.583771,102.988411],[25.58437,102.988167],[25.5846,102.988037],[25.585039,102.987671],[25.58606,102.98629],[25.58633,102.986267],[25.586519,102.986343],[25.58758,102.986969],[25.587811,102.987312],[25.587959,102.987717],[25.58802,102.988091],[25.588169,102.988327],[25.588539,102.988564],[25.58975,102.988907],[25.590191,102.988777],[25.590389,102.988503],[25.590839,102.987663],[25.59111,102.987282],[25.591299,102.987152],[25.591869,102.987137],[25.592039,102.986992],[25.59201,102.986649],[25.59215,102.986328],[25.592461,102.986252],[25.5931,102.986252],[25.59341,102.986153],[25.593769,102.985893],[25.594481,102.985092],[25.59498,102.984711],[25.595209,102.984337],[25.595329,102.98391],[25.59564,102.983597],[25.59643,102.983238],[25.59668,102.983063],[25.597679,102.981483],[25.59775,102.98114],[25.597561,102.980873],[25.59642,102.979721],[25.59584,102.979057],[25.59581,102.978737],[25.59623,102.977921],[25.596569,102.977707],[25.597219,102.977814],[25.59786,102.978073],[25.59832,102.978287],[25.599661,102.9786],[25.599911,102.978561],[25.60006,102.97834],[25.6001,102.977921],[25.599991,102.977463],[25.599779,102.976967],[25.5998,102.976639],[25.600031,102.976479],[25.60071,102.976173],[25.60117,102.975754],[25.60154,102.975067],[25.601641,102.974602],[25.601561,102.974007],[25.60165,102.973717],[25.60182,102.973747],[25.602051,102.974007],[25.60243,102.97509],[25.6024,102.975471],[25.60183,102.976227],[25.60181,102.976547],[25.602011,102.976547],[25.603609,102.975906],[25.603821,102.975647],[25.603769,102.97541],[25.603359,102.974609],[25.603331,102.974472],[25.60346,102.974319],[25.604481,102.974373],[25.604771,102.974297],[25.60491,102.974197],[25.605009,102.973938],[25.60498,102.973549],[25.60494,102.973457],[25.604691,102.973167],[25.604469,102.973106],[25.60416,102.973312],[25.603689,102.973396],[25.603491,102.973343],[25.60321,102.973167],[25.60293,102.972801],[25.60251,102.972412],[25.60206,102.972237],[25.601959,102.97213],[25.601971,102.971931],[25.602171,102.971863],[25.602819,102.971992],[25.60317,102.972214],[25.60331,102.972351],[25.603649,102.972473],[25.60388,102.972321],[25.60404,102.972183],[25.60442,102.972023],[25.60486,102.972092],[25.60602,102.972649],[25.60634,102.972748],[25.606899,102.97274],[25.60745,102.972878],[25.607981,102.972961],[25.608231,102.972862],[25.60829,102.972633],[25.608471,102.972298],[25.60874,102.972343],[25.608879,102.972397],[25.60988,102.972366],[25.610029,102.972321],[25.610189,102.972076],[25.61021,102.971901],[25.610331,102.971603],[25.61055,102.971573],[25.61134,102.971786],[25.61194,102.972267],[25.612289,102.972359],[25.613131,102.972153],[25.613319,102.972054],[25.61364,102.971764],[25.613831,102.971558],[25.614111,102.971474],[25.614429,102.97155],[25.615049,102.971512],[25.615311,102.971291],[25.6154,102.971161],[25.61553,102.971077],[25.615829,102.971008],[25.615959,102.970932],[25.616211,102.970627],[25.616461,102.970528],[25.616739,102.970497],[25.617399,102.969994],[25.61771,102.969803],[25.617941,102.969498],[25.61805,102.969223],[25.618219,102.969032],[25.61842,102.969048],[25.618561,102.969223],[25.618561,102.969383],[25.618481,102.970016],[25.618481,102.970551],[25.618549,102.971062],[25.618759,102.971489],[25.618971,102.971657],[25.619221,102.97171],[25.61978,102.971733],[25.62006,102.971626],[25.620211,102.971413],[25.62038,102.970863],[25.620449,102.970512],[25.620649,102.970238],[25.62126,102.969719],[25.62174,102.969093],[25.6222,102.968323],[25.622499,102.968132],[25.62294,102.96814],[25.6234,102.968117],[25.62351,102.968178],[25.623699,102.968407],[25.623911,102.96859],[25.625469,102.967621],[25.627781,102.966187],[25.627621,102.965813],[25.627621,102.965477],[25.627859,102.96505],[25.6283,102.964462],[25.628889,102.963753],[25.629,102.963387],[25.629089,102.962563],[25.62904,102.962257],[25.628839,102.961777],[25.62862,102.961403],[25.62833,102.961143],[25.62796,102.960907],[25.627819,102.960747],[25.62731,102.959862],[25.62722,102.959396],[25.62723,102.959007],[25.627291,102.958633],[25.627211,102.958298],[25.62694,102.95784],[25.62648,102.957329],[25.62628,102.956963],[25.62595,102.956596],[25.625601,102.956352],[25.62553,102.956039],[25.62541,102.955711],[25.62524,102.955406],[25.62499,102.955162],[25.62484,102.955063],[25.623581,102.954483],[25.62315,102.954224],[25.622629,102.953583],[25.62224,102.953362],[25.62196,102.953468],[25.62182,102.953552],[25.621469,102.953529],[25.620239,102.952423],[25.61982,102.951881],[25.61858,102.950859],[25.61842,102.95076],[25.618259,102.9505],[25.61829,102.950073],[25.61845,102.949753],[25.618719,102.949577],[25.61883,102.949387],[25.618811,102.949226],[25.618719,102.948967],[25.618641,102.948402],[25.618441,102.947952],[25.61828,102.94735],[25.618179,102.946892],[25.61812,102.94632],[25.617769,102.945633],[25.61768,102.945137],[25.61776,102.94471],[25.617649,102.944382],[25.617491,102.944077],[25.61746,102.943748],[25.617781,102.942963],[25.617809,102.942078],[25.61795,102.941742],[25.61797,102.941528],[25.617781,102.94117],[25.61776,102.940407],[25.617861,102.939972],[25.617901,102.939339],[25.6178,102.938782],[25.61771,102.938461],[25.61768,102.937958],[25.617781,102.937714],[25.617821,102.937241],[25.618,102.936813],[25.61805,102.936348],[25.618099,102.935249],[25.617941,102.934036],[25.61797,102.933632],[25.617861,102.932953],[25.617729,102.932457],[25.617479,102.932083],[25.617371,102.931808],[25.617081,102.931541],[25.616779,102.931427],[25.61676,102.931282],[25.61688,102.931107],[25.61673,102.930267],[25.616631,102.929993],[25.616199,102.929237],[25.615931,102.928963],[25.614639,102.928253],[25.61445,102.928078],[25.613991,102.927422],[25.613489,102.927032],[25.6127,102.92659],[25.61248,102.926521],[25.61199,102.926628],[25.61153,102.926666],[25.611259,102.926537],[25.61105,102.925926],[25.610781,102.925697],[25.610479,102.925613],[25.6103,102.925392],[25.610371,102.924728],[25.610371,102.924301],[25.61043,102.923973],[25.610491,102.923828],[25.610439,102.9235],[25.610201,102.923363],[25.609949,102.923264],[25.609461,102.923233],[25.60914,102.923157],[25.6084,102.922737],[25.60824,102.922859],[25.608191,102.923111],[25.608259,102.923241],[25.608219,102.923508],[25.60812,102.923492],[25.607941,102.923561],[25.607849,102.923927],[25.607771,102.924011],[25.60762,102.92395],[25.60759,102.923622],[25.607691,102.922592],[25.60787,102.922256],[25.60795,102.921982],[25.607821,102.921707],[25.607491,102.921211],[25.60722,102.921173],[25.607071,102.921188],[25.60692,102.921127],[25.60644,102.92083],[25.606291,102.920807],[25.606211,102.920982],[25.606159,102.921494],[25.606091,102.921577],[25.605961,102.921516],[25.60586,102.921082],[25.60568,102.92099],[25.605619,102.920792],[25.60569,102.920547],[25.60565,102.92009],[25.60545,102.919838],[25.604271,102.91967],[25.60396,102.91951],[25.60379,102.919617],[25.60364,102.919807],[25.603559,102.920151],[25.603359,102.920151],[25.602989,102.919861],[25.60272,102.919739],[25.602579,102.919456],[25.60223,102.919037],[25.60183,102.918709],[25.60136,102.918083],[25.601191,102.917763],[25.600969,102.917557],[25.60087,102.917397],[25.600599,102.917236],[25.6003,102.917297],[25.600161,102.917664],[25.600241,102.918022],[25.60009,102.918243],[25.599541,102.918098],[25.59934,102.918182],[25.599211,102.918518],[25.599051,102.918556],[25.5989,102.918793],[25.59885,102.918968],[25.59865,102.919121],[25.59852,102.918968],[25.598511,102.918709],[25.59864,102.918373],[25.59866,102.918228],[25.598579,102.918022],[25.598511,102.917908],[25.598511,102.917587],[25.598379,102.917328],[25.598351,102.917107],[25.59819,102.916779],[25.59796,102.916611],[25.59761,102.916496],[25.59729,102.916458],[25.596769,102.916283],[25.59659,102.916077],[25.59671,102.915573],[25.596649,102.914948],[25.596519,102.914742],[25.596359,102.914711],[25.59586,102.914703],[25.59573,102.914757],[25.5954,102.915154],[25.59506,102.91571],[25.59487,102.915878],[25.59474,102.915932],[25.594431,102.915878],[25.59407,102.915756],[25.593691,102.915382],[25.593519,102.914993],[25.592871,102.914192],[25.592609,102.913803],[25.59234,102.913513],[25.59211,102.912987],[25.59197,102.912491],[25.591669,102.911789],[25.59071,102.91037],[25.590469,102.91021],[25.590071,102.910103],[25.58975,102.90995],[25.58959,102.909912],[25.589211,102.909927],[25.58868,102.910004],[25.5884,102.909897],[25.588261,102.909798],[25.58798,102.909813],[25.58782,102.909859],[25.5875,102.909882],[25.58699,102.90976],[25.585819,102.909187],[25.585449,102.908943],[25.58544,102.908699],[25.5858,102.908569],[25.586081,102.908386],[25.586241,102.908234],[25.586269,102.908043],[25.58604,102.907837],[25.585581,102.90773],[25.584961,102.907799],[25.584629,102.907753],[25.58371,102.907288],[25.583099,102.906822],[25.58275,102.906807],[25.582661,102.906822],[25.58205,102.906647],[25.58185,102.90641],[25.58164,102.905609],[25.581699,102.905273],[25.58185,102.905029],[25.581779,102.904793],[25.58152,102.904533],[25.58119,102.904556],[25.58087,102.904472],[25.580669,102.904457],[25.5804,102.904388],[25.580099,102.904373],[25.580009,102.904198],[25.58032,102.903831],[25.58083,102.903282],[25.580879,102.903183],[25.580811,102.903053],[25.580469,102.902924],[25.57958,102.902191],[25.57937,102.901939],[25.57925,102.901649],[25.57921,102.901337],[25.5791,102.901031],[25.57893,102.901062],[25.578751,102.90136],[25.578501,102.901573],[25.578369,102.901543],[25.57807,102.90139],[25.57753,102.900818],[25.577379,102.900467],[25.577169,102.899788],[25.57715,102.899384],[25.5774,102.899071],[25.57745,102.898804],[25.577271,102.898483],[25.577089,102.898247],[25.57703,102.897957],[25.577141,102.897652],[25.577379,102.897438],[25.577539,102.897362],[25.577721,102.897148],[25.577629,102.897003],[25.57741,102.896973],[25.577209,102.897003],[25.576229,102.897469],[25.57593,102.897659],[25.5756,102.897598],[25.57543,102.897522],[25.57514,102.897453],[25.57485,102.897209],[25.57473,102.896812],[25.57469,102.896591],[25.57452,102.896301],[25.57415,102.896103],[25.573811,102.896027],[25.572241,102.896133],[25.572001,102.896263],[25.57193,102.896683],[25.57172,102.896973],[25.57151,102.897011],[25.57128,102.896873],[25.571131,102.896721],[25.57074,102.896187],[25.570379,102.89521],[25.57044,102.89476],[25.57066,102.894417],[25.57089,102.894234],[25.57114,102.894127],[25.57148,102.894119],[25.571859,102.893997],[25.572029,102.893837],[25.571951,102.893669],[25.571739,102.893547],[25.57148,102.893463],[25.57128,102.893227],[25.57128,102.89296],[25.5714,102.892723],[25.571951,102.892273],[25.57198,102.892021],[25.57176,102.891647],[25.57155,102.891586],[25.571421,102.891663],[25.571011,102.891693],[25.570869,102.891327],[25.57057,102.891052],[25.57011,102.890793],[25.569719,102.890694],[25.569361,102.89035],[25.568489,102.889229],[25.567909,102.887688],[25.56793,102.88752],[25.567909,102.886253],[25.567949,102.885918],[25.56806,102.885567],[25.568069,102.885399],[25.56794,102.885048],[25.56743,102.884483],[25.567261,102.884377],[25.567141,102.884232],[25.566931,102.883827],[25.56671,102.883163],[25.566589,102.882423],[25.56633,102.881477],[25.56632,102.881042],[25.56641,102.880409],[25.56662,102.880058],[25.56691,102.879951],[25.5672,102.879997],[25.567471,102.880219],[25.567591,102.88018],[25.56765,102.878922],[25.567579,102.878487],[25.56748,102.878326],[25.5672,102.87812],[25.56711,102.877892],[25.56727,102.877777],[25.567751,102.877922],[25.56814,102.878143],[25.56839,102.878052],[25.568529,102.877747],[25.56867,102.877533],[25.568661,102.877319],[25.56848,102.877167],[25.56822,102.876717],[25.567921,102.875954],[25.56743,102.875412],[25.567089,102.874863],[25.56694,102.874687],[25.566811,102.874443],[25.56683,102.873787],[25.566799,102.873581],[25.566589,102.873062],[25.566509,102.872383],[25.566549,102.872101],[25.56629,102.871712],[25.56604,102.871521],[25.565519,102.871399],[25.565491,102.871338],[25.56555,102.87114],[25.56568,102.871109],[25.566219,102.871094],[25.566681,102.871117],[25.566839,102.871063],[25.56694,102.870743],[25.567181,102.870689],[25.567419,102.870743],[25.56765,102.870598],[25.5679,102.870247],[25.56834,102.87001],[25.56852,102.869949],[25.56879,102.869957],[25.568951,102.869881],[25.568781,102.86982],[25.56852,102.869843],[25.568211,102.869904],[25.56769,102.870216],[25.56748,102.870209],[25.567341,102.870003],[25.567181,102.869881],[25.56711,102.869911],[25.566959,102.869873],[25.56674,102.869568],[25.566549,102.869568],[25.5662,102.869759],[25.565901,102.869751],[25.565769,102.869553],[25.565639,102.869141],[25.565439,102.868973],[25.565161,102.86927],[25.56481,102.869278],[25.564409,102.869057],[25.56431,102.868896],[25.564449,102.868843],[25.564699,102.869011],[25.56496,102.868927],[25.56514,102.868698],[25.565149,102.86824],[25.565331,102.867973],[25.56554,102.867981],[25.565651,102.868149],[25.56567,102.868233],[25.56596,102.868752],[25.566059,102.86882],[25.56624,102.868729],[25.56636,102.8685],[25.56641,102.868118],[25.566561,102.867844],[25.566719,102.867844],[25.56735,102.867981],[25.56756,102.868156],[25.567579,102.868401],[25.56781,102.868553],[25.568159,102.86853],[25.568399,102.868423],[25.56855,102.868217],[25.568529,102.867973],[25.568211,102.867592],[25.568029,102.867249],[25.56786,102.867027],[25.567881,102.866783],[25.568911,102.866707],[25.569241,102.866783],[25.570761,102.86763],[25.57093,102.867523],[25.570921,102.867348],[25.57099,102.867012],[25.571159,102.86647],[25.57136,102.866241],[25.57143,102.866257],[25.571569,102.866379],[25.57169,102.866524],[25.57197,102.866653],[25.572149,102.866577],[25.572069,102.866501],[25.57164,102.866364],[25.57136,102.866058],[25.571199,102.865608],[25.571171,102.864967],[25.57122,102.864708],[25.57115,102.864471],[25.570881,102.864357],[25.570511,102.864471],[25.57025,102.864342],[25.57019,102.864197],[25.569851,102.863907],[25.569229,102.86396],[25.568859,102.863937],[25.568781,102.863853],[25.56867,102.863609],[25.568251,102.863373],[25.56687,102.86322],[25.56637,102.86319],[25.566031,102.863022],[25.565651,102.862617],[25.56531,102.862083],[25.56517,102.861656],[25.56525,102.86129],[25.565519,102.860847],[25.565741,102.860687],[25.56608,102.860863],[25.56629,102.860771],[25.566311,102.860611],[25.566139,102.860527],[25.565479,102.860512],[25.565109,102.860558],[25.56468,102.860573],[25.564329,102.860741],[25.56365,102.861557],[25.563601,102.861717],[25.563629,102.861923],[25.563789,102.862122],[25.563881,102.862328],[25.563761,102.862427],[25.563601,102.862373],[25.56307,102.861832],[25.562429,102.861343],[25.561569,102.860893],[25.561119,102.860367],[25.560459,102.859528],[25.56015,102.859093],[25.56003,102.85833],[25.559959,102.857964],[25.559919,102.857437],[25.559719,102.856163],[25.55953,102.855972],[25.55942,102.855942],[25.55896,102.855942],[25.55772,102.856003],[25.55703,102.855904],[25.55681,102.855904],[25.55654,102.855782],[25.55633,102.855614],[25.55617,102.855263],[25.55599,102.855133],[25.555901,102.855164],[25.555651,102.855431],[25.555321,102.855392],[25.55456,102.85511],[25.554291,102.855057],[25.553921,102.855179],[25.553591,102.855324],[25.553341,102.855362],[25.55294,102.855301],[25.552679,102.855202],[25.55188,102.855217],[25.55147,102.855087],[25.550859,102.854698],[25.54953,102.853508],[25.54875,102.852898],[25.548559,102.852814],[25.54796,102.852661],[25.547449,102.852577],[25.546801,102.852379],[25.546551,102.852379],[25.54578,102.852631],[25.54534,102.85257],[25.544741,102.852402],[25.544359,102.852173],[25.543779,102.85141],[25.543341,102.850937],[25.542999,102.850693],[25.54266,102.850594],[25.54203,102.850563],[25.54142,102.850288],[25.54101,102.849953],[25.540751,102.849663],[25.540251,102.849312],[25.53968,102.849091],[25.539049,102.8489],[25.53875,102.848778],[25.53825,102.848732],[25.537319,102.848907],[25.53697,102.848846],[25.53651,102.848648],[25.53606,102.848587],[25.53561,102.848587],[25.53496,102.84845],[25.53355,102.848106],[25.53294,102.847832],[25.532459,102.847412],[25.53199,102.846916],[25.53117,102.846443],[25.53091,102.846397],[25.530769,102.846527],[25.530701,102.846657],[25.530491,102.846817],[25.52914,102.847054],[25.52866,102.846939],[25.528021,102.846474],[25.526331,102.84597],[25.525669,102.845963],[25.52438,102.845863],[25.5235,102.845863],[25.521919,102.845772],[25.521441,102.845711],[25.520981,102.845543],[25.520729,102.845329],[25.520269,102.84507],[25.519991,102.844971],[25.51977,102.84494],[25.51848,102.845047],[25.51799,102.845009],[25.517521,102.844788],[25.51539,102.843437],[25.515289,102.843292],[25.51527,102.84272],[25.51557,102.841843],[25.51557,102.841537],[25.5149,102.840942],[25.514481,102.840714],[25.514111,102.840759],[25.513929,102.840874],[25.513559,102.841217],[25.513269,102.841309],[25.513109,102.841232],[25.51281,102.841003],[25.512461,102.8405],[25.51214,102.840179],[25.51178,102.839981],[25.511009,102.840279],[25.50868,102.841408],[25.507601,102.841782],[25.5072,102.841812],[25.50643,102.841499],[25.505911,102.841209],[25.50576,102.84108],[25.50568,102.840912],[25.50565,102.840752],[25.505659,102.840363],[25.50563,102.840202],[25.505501,102.840057],[25.50535,102.839996],[25.504881,102.840202],[25.50456,102.840401],[25.50433,102.840698],[25.50415,102.841026],[25.504129,102.841652],[25.504061,102.84185],[25.50346,102.842682],[25.503401,102.84285],[25.50321,102.843002],[25.50305,102.84301],[25.502899,102.842857],[25.5028,102.842712],[25.50263,102.842163],[25.502251,102.841728],[25.50206,102.841614],[25.501881,102.84156],[25.50173,102.841629],[25.50161,102.841751],[25.501551,102.841911],[25.50153,102.842102],[25.501699,102.842911],[25.50173,102.843353],[25.5016,102.843964],[25.501631,102.844162],[25.501949,102.844704],[25.502001,102.844856],[25.50201,102.845062],[25.501961,102.845253],[25.501881,102.845398],[25.50091,102.845932],[25.500811,102.846062],[25.50058,102.846848],[25.50036,102.84716],[25.500231,102.84726],[25.50005,102.847298],[25.499531,102.847183],[25.498911,102.846977],[25.498529,102.846832],[25.498199,102.846657],[25.497431,102.846008],[25.49725,102.846008],[25.497061,102.846153],[25.496731,102.846649],[25.49658,102.846779],[25.496401,102.846878],[25.49621,102.846901],[25.49605,102.846802],[25.49593,102.846649],[25.495649,102.8461],[25.49518,102.845451],[25.495001,102.845131],[25.494949,102.844948],[25.494949,102.844711],[25.495131,102.844299],[25.495461,102.84388],[25.495529,102.843681],[25.49548,102.843483],[25.495279,102.843407],[25.49511,102.843452],[25.494909,102.843552],[25.494711,102.843559],[25.49456,102.843483],[25.494431,102.843353],[25.494129,102.842613],[25.493851,102.842361],[25.49333,102.842079],[25.492979,102.842056],[25.492781,102.842102],[25.491449,102.842697],[25.491261,102.842728],[25.49066,102.842682],[25.49048,102.842712],[25.490351,102.84285],[25.49028,102.843033],[25.49025,102.843262],[25.490259,102.843498],[25.49033,102.843758],[25.49045,102.843979],[25.49118,102.844856],[25.491461,102.845497],[25.491579,102.84568],[25.492001,102.846497],[25.492149,102.846931],[25.492149,102.847107],[25.49206,102.847298],[25.491211,102.848328],[25.491131,102.84848],[25.4911,102.848663],[25.49118,102.848877],[25.492599,102.849213],[25.492929,102.849411],[25.49305,102.849602],[25.493059,102.849762],[25.492979,102.849998],[25.49276,102.850098],[25.4921,102.850159],[25.49176,102.850311],[25.491449,102.850578],[25.491261,102.850861],[25.49118,102.851227],[25.491199,102.851608],[25.491501,102.853897],[25.491631,102.854309],[25.492001,102.854851],[25.492149,102.854958],[25.492611,102.855202],[25.493151,102.855362],[25.49333,102.855461],[25.49346,102.855598],[25.493629,102.855713],[25.49371,102.855827],[25.493759,102.856033],[25.49371,102.856232],[25.49328,102.857147],[25.493151,102.857277],[25.49301,102.857353],[25.492701,102.857353],[25.49131,102.857033],[25.49065,102.856781],[25.490499,102.856781],[25.49036,102.85688],[25.49025,102.857033],[25.49,102.857529],[25.489611,102.858009],[25.48958,102.8582],[25.489651,102.858528],[25.48966,102.858711],[25.48963,102.858963],[25.489429,102.859299],[25.489309,102.859428],[25.488501,102.860626],[25.48835,102.860809],[25.48811,102.861008],[25.4869,102.861458],[25.486309,102.861809],[25.48605,102.862099],[25.485649,102.8629],[25.485399,102.863228],[25.48378,102.864662],[25.48358,102.864731],[25.4834,102.864632],[25.48321,102.864349],[25.48316,102.864159],[25.48311,102.863579],[25.482929,102.863258],[25.482731,102.863152],[25.482559,102.863007],[25.482531,102.862801],[25.48255,102.862549],[25.482599,102.862381],[25.482599,102.862183],[25.48255,102.861961],[25.48246,102.861801],[25.48225,102.861702],[25.4821,102.861763],[25.481661,102.862099],[25.48148,102.862152],[25.48131,102.862099],[25.48101,102.8619],[25.48085,102.861847],[25.4807,102.861847],[25.479509,102.862251],[25.479111,102.862358],[25.478609,102.86235],[25.478559,102.862152],[25.47875,102.861504],[25.478649,102.860329],[25.4786,102.86013],[25.47851,102.859947],[25.478331,102.859802],[25.47753,102.859261],[25.47735,102.859261],[25.477261,102.859413],[25.477261,102.860153],[25.477501,102.860397],[25.477831,102.860603],[25.47805,102.860832],[25.47806,102.861],[25.478029,102.861183],[25.477949,102.861351],[25.47761,102.861801],[25.47753,102.861977],[25.47748,102.862228],[25.47735,102.86261],[25.47736,102.862808],[25.477409,102.862999],[25.47806,102.863533],[25.478251,102.863564],[25.47891,102.863503],[25.47913,102.863411],[25.47933,102.863403],[25.47953,102.863449],[25.47961,102.863663],[25.4795,102.864311],[25.479259,102.864883],[25.47893,102.865448],[25.478809,102.865578],[25.478661,102.865662],[25.47813,102.865753],[25.4769,102.865433],[25.476549,102.86541],[25.47576,102.865562],[25.47558,102.86573],[25.47566,102.865913],[25.4758,102.866051],[25.476049,102.866379],[25.47608,102.866547],[25.476049,102.866707],[25.47596,102.866882],[25.47571,102.867126],[25.4744,102.868561],[25.47431,102.868759],[25.474331,102.868927],[25.4744,102.86911],[25.47456,102.869263],[25.47488,102.869331],[25.47506,102.869476],[25.47513,102.869713],[25.475109,102.869904],[25.47493,102.870232],[25.47411,102.87101],[25.47381,102.871529],[25.47368,102.871658],[25.473551,102.871712],[25.473181,102.871696],[25.473,102.871727],[25.47283,102.871803],[25.472731,102.871948],[25.47266,102.87236],[25.472759,102.87291],[25.4729,102.8731],[25.47308,102.873131],[25.47341,102.873062],[25.473579,102.873062],[25.473749,102.873207],[25.473881,102.873734],[25.47385,102.874153],[25.47378,102.874352],[25.473499,102.874611],[25.4734,102.874748],[25.473249,102.875282],[25.473129,102.875481],[25.473,102.875557],[25.472799,102.875633],[25.47246,102.875664],[25.47233,102.875732],[25.472231,102.875908],[25.47226,102.876083],[25.472349,102.876228],[25.472509,102.876381],[25.47296,102.87661],[25.47303,102.876762],[25.473,102.876953],[25.47278,102.87735],[25.472811,102.877548],[25.47291,102.877747],[25.473249,102.878059],[25.47333,102.878258],[25.473351,102.878433],[25.473301,102.878609],[25.4732,102.878761],[25.47295,102.878998],[25.47263,102.879112],[25.472281,102.879128],[25.471979,102.879333],[25.471901,102.879501],[25.471861,102.879677],[25.471951,102.879913],[25.47208,102.880051],[25.472361,102.880257],[25.47258,102.8806],[25.472731,102.880707],[25.473961,102.881401],[25.47415,102.881332],[25.474279,102.881203],[25.47476,102.880508],[25.474899,102.880402],[25.4751,102.880333],[25.475281,102.880432],[25.475349,102.880653],[25.47525,102.881012],[25.474911,102.881432],[25.47423,102.881828],[25.473909,102.882057],[25.473749,102.882133],[25.47356,102.882149],[25.47341,102.882103],[25.471951,102.881058],[25.47163,102.880852],[25.47106,102.880859],[25.470329,102.881081],[25.470011,102.881081],[25.46986,102.881012],[25.469761,102.880852],[25.469761,102.880661],[25.469931,102.88031],[25.47015,102.879349],[25.47028,102.879181],[25.470631,102.879051],[25.470831,102.878906],[25.47093,102.8787],[25.470949,102.878532],[25.470751,102.877808],[25.470659,102.877632],[25.47053,102.87751],[25.469311,102.876862],[25.46911,102.876801],[25.46891,102.876778],[25.46871,102.876831],[25.468081,102.877312],[25.467911,102.877861],[25.46788,102.878082],[25.467779,102.87825],[25.466949,102.879158],[25.466749,102.879227],[25.466579,102.87925],[25.46641,102.879211],[25.466129,102.87896],[25.46583,102.878448],[25.4657,102.878326],[25.465549,102.878258],[25.465401,102.87825],[25.46493,102.878311],[25.46476,102.87825],[25.464649,102.878113],[25.4646,102.87793],[25.4646,102.877731],[25.464531,102.87735],[25.464411,102.877251],[25.46426,102.877182],[25.46298,102.877258],[25.462259,102.876953],[25.461411,102.876801],[25.46125,102.87661],[25.461229,102.87645],[25.461309,102.876297],[25.46216,102.875549],[25.462311,102.875381],[25.462811,102.874962],[25.46335,102.874832],[25.463511,102.874763],[25.463631,102.874657],[25.46373,102.874512],[25.46385,102.87413],[25.46406,102.873802],[25.464211,102.873779],[25.46493,102.873901],[25.465111,102.873863],[25.465231,102.873749],[25.4653,102.87355],[25.46533,102.873352],[25.4652,102.873161],[25.464729,102.873001],[25.464581,102.87291],[25.46446,102.87278],[25.46406,102.872147],[25.463909,102.872002],[25.46356,102.87178],[25.462851,102.871513],[25.4627,102.871407],[25.46258,102.871277],[25.462379,102.870979],[25.461849,102.870407],[25.46151,102.870262],[25.4608,102.870033],[25.460461,102.869881],[25.460329,102.869759],[25.45993,102.869049],[25.45923,102.868309],[25.4587,102.868134],[25.45853,102.868027],[25.458401,102.867897],[25.45816,102.867561],[25.45788,102.866852],[25.457781,102.866699],[25.4575,102.866402],[25.457411,102.866226],[25.457399,102.866051],[25.457451,102.865463],[25.45743,102.864883],[25.457199,102.864357],[25.4571,102.863602],[25.45698,102.863449],[25.45653,102.863258],[25.456181,102.863258],[25.45583,102.863129],[25.455709,102.862984],[25.455629,102.862801],[25.45566,102.86261],[25.455851,102.862129],[25.455851,102.861954],[25.455759,102.861763],[25.455231,102.86145],[25.454981,102.861061],[25.454651,102.86071],[25.454359,102.860558],[25.45381,102.86013],[25.453501,102.859932],[25.452881,102.859734],[25.45211,102.859901],[25.45195,102.859978],[25.45178,102.860107],[25.45166,102.86026],[25.45155,102.860611],[25.4515,102.861214],[25.45145,102.861382],[25.451361,102.861526],[25.451031,102.861748],[25.450661,102.861877],[25.44981,102.862411],[25.44965,102.862556],[25.44873,102.863228],[25.447849,102.863831],[25.44751,102.863998],[25.44698,102.864159],[25.44636,102.864182],[25.44566,102.864281],[25.445311,102.86425],[25.44516,102.864159],[25.44491,102.863899],[25.44475,102.863808],[25.444401,102.863762],[25.44418,102.863808],[25.44401,102.863899],[25.44385,102.864029],[25.44346,102.864449],[25.44326,102.864563],[25.44306,102.864609],[25.44265,102.864632],[25.44243,102.864609],[25.44228,102.864563],[25.441481,102.864502],[25.441059,102.864502],[25.440861,102.864548],[25.440359,102.864807],[25.440201,102.864799],[25.440029,102.864708],[25.439581,102.864227],[25.43918,102.863983],[25.438959,102.86393],[25.438749,102.863953],[25.43853,102.864014],[25.43811,102.864197],[25.437929,102.86425],[25.4377,102.864258],[25.43751,102.864357],[25.437229,102.864754],[25.436661,102.866081],[25.43648,102.86618],[25.4363,102.86618],[25.436131,102.866081],[25.436029,102.865898],[25.435961,102.865677],[25.43586,102.865013],[25.435961,102.864311],[25.435949,102.863708],[25.436001,102.86351],[25.436279,102.862808],[25.436279,102.862633],[25.43618,102.862511],[25.436029,102.862427],[25.435881,102.862396],[25.43536,102.862381],[25.43516,102.862297],[25.435011,102.86216],[25.43471,102.861603],[25.434561,102.861427],[25.433929,102.861099],[25.43343,102.860611],[25.43306,102.860382],[25.43128,102.859863],[25.430349,102.859657],[25.43,102.85968],[25.429359,102.859863],[25.42898,102.859833],[25.4284,102.859848],[25.428209,102.859909],[25.42803,102.860031],[25.427879,102.860184],[25.427759,102.860359],[25.427731,102.86058],[25.427759,102.860802],[25.42828,102.862396],[25.42823,102.862579],[25.428101,102.862701],[25.42786,102.862709],[25.42775,102.862633],[25.427629,102.86248],[25.427481,102.862106],[25.427361,102.861931],[25.427151,102.861351],[25.427059,102.861183],[25.426809,102.860878],[25.426611,102.860558],[25.426359,102.860352],[25.4258,102.859497],[25.42568,102.859001],[25.425659,102.858482],[25.4256,102.858261],[25.425501,102.858101],[25.42535,102.857964],[25.42518,102.857857],[25.424311,102.857552],[25.42363,102.85733],[25.423401,102.8573],[25.423161,102.857307],[25.422029,102.857483],[25.42161,102.857384],[25.42083,102.857002],[25.420059,102.856499],[25.419701,102.856201],[25.4195,102.856079],[25.419081,102.855957],[25.41791,102.855911],[25.41675,102.855782],[25.416531,102.855698],[25.416349,102.855583],[25.41605,102.855278],[25.41556,102.854599],[25.41531,102.853363],[25.41511,102.852951],[25.414961,102.852783],[25.414631,102.852531],[25.413759,102.85218],[25.413309,102.851929],[25.41258,102.851334],[25.412251,102.850998],[25.411699,102.850212],[25.41028,102.848152],[25.409849,102.847504],[25.409679,102.847298],[25.409401,102.846863],[25.4091,102.846481],[25.408279,102.84568],[25.40801,102.845253],[25.407801,102.84481],[25.40765,102.84465],[25.40731,102.844383],[25.4069,102.844254],[25.406731,102.844162],[25.406561,102.844002],[25.40645,102.843811],[25.406099,102.842812],[25.40543,102.841782],[25.40526,102.841614],[25.4046,102.84108],[25.4042,102.841011],[25.404011,102.841026],[25.403851,102.840958],[25.403749,102.840828],[25.4037,102.84063],[25.403629,102.839958],[25.403549,102.839752],[25.403231,102.839432],[25.403049,102.839333],[25.402849,102.839302],[25.402651,102.83931],[25.40205,102.8395],[25.401831,102.839478],[25.401649,102.839378],[25.401461,102.839211],[25.40118,102.838852],[25.400949,102.838432],[25.400551,102.83786],[25.40011,102.83741],[25.399799,102.837196],[25.399509,102.837151],[25.399111,102.837181],[25.39893,102.83725],[25.3983,102.83741],[25.3981,102.83741],[25.397079,102.837151],[25.39666,102.837158],[25.396259,102.83725],[25.395309,102.837646],[25.394609,102.838028],[25.394279,102.838058],[25.39415,102.838013],[25.39385,102.837807],[25.39315,102.837379],[25.39286,102.837112],[25.392679,102.836731],[25.39233,102.836159],[25.392151,102.835747],[25.39205,102.835327],[25.391781,102.834534],[25.3915,102.83416],[25.388599,102.83271],[25.38818,102.832428],[25.387711,102.831909],[25.38728,102.830551],[25.38706,102.830101],[25.386909,102.829613],[25.386909,102.829399],[25.38703,102.828911],[25.38703,102.828697],[25.38698,102.828499],[25.38686,102.828346],[25.386101,102.827682],[25.3855,102.826782],[25.38496,102.825996],[25.38435,102.824959],[25.384211,102.824753],[25.38353,102.823349],[25.38341,102.823128],[25.38328,102.823029],[25.38295,102.822678],[25.382799,102.822433],[25.38241,102.821632],[25.38208,102.821159],[25.38188,102.820961],[25.381451,102.82061],[25.3806,102.82],[25.380381,102.819878],[25.37966,102.819252],[25.37941,102.81913],[25.378929,102.819061],[25.37793,102.81913],[25.37746,102.81926],[25.3766,102.81971],[25.375759,102.820084],[25.375549,102.820213],[25.375311,102.820297],[25.37466,102.820213],[25.373779,102.819809],[25.373329,102.819809],[25.371929,102.820152],[25.371679,102.820259],[25.37105,102.820633],[25.370449,102.82106],[25.369749,102.8218],[25.368879,102.822632],[25.368311,102.82296],[25.368111,102.823013],[25.36688,102.823463],[25.36648,102.823509],[25.365629,102.823448],[25.365499,102.823311],[25.365379,102.823112],[25.365179,102.822479],[25.36491,102.8218],[25.36458,102.820801],[25.36446,102.820549],[25.36393,102.819061],[25.3638,102.818878],[25.363649,102.818581],[25.36335,102.817749],[25.36265,102.816528],[25.36178,102.814552],[25.361549,102.813408],[25.36161,102.81295],[25.361879,102.811958],[25.36203,102.811501],[25.362061,102.811028],[25.3619,102.809761],[25.3619,102.809196],[25.36198,102.808327],[25.362181,102.805733],[25.36215,102.805511],[25.36198,102.805099],[25.36161,102.804459],[25.36153,102.804001],[25.361549,102.803726],[25.361429,102.803261],[25.3612,102.802811],[25.36083,102.801811],[25.36063,102.800056],[25.360531,102.79985],[25.36006,102.799309],[25.35881,102.798058],[25.35746,102.795761],[25.357,102.795113],[25.356331,102.79451],[25.35531,102.793701],[25.35508,102.793411],[25.355009,102.793198],[25.355009,102.792198],[25.35533,102.790901],[25.35535,102.790398],[25.355129,102.78878],[25.355181,102.786247],[25.35511,102.785751],[25.3549,102.785332],[25.354759,102.785133],[25.354259,102.78418],[25.35335,102.782707],[25.353201,102.782562],[25.35285,102.782303],[25.352551,102.781883],[25.352051,102.781357],[25.35166,102.781197],[25.35148,102.781181],[25.35108,102.78125],[25.350901,102.781258],[25.3507,102.781197],[25.35051,102.781097],[25.350361,102.78093],[25.3501,102.780533],[25.349751,102.780312],[25.349609,102.780159],[25.349449,102.779877],[25.3491,102.779411],[25.348579,102.779114],[25.34816,102.77903],[25.347561,102.779129],[25.34738,102.779251],[25.347231,102.779411],[25.347,102.779846],[25.346861,102.780006],[25.34668,102.780128],[25.345711,102.78035],[25.344999,102.780563],[25.3444,102.780884],[25.343981,102.781029],[25.3438,102.781128],[25.343451,102.781433],[25.342911,102.782227],[25.342751,102.782303],[25.34256,102.782303],[25.342381,102.782249],[25.341379,102.781799],[25.340401,102.780952],[25.339411,102.779709],[25.33926,102.779549],[25.339149,102.779358],[25.3389,102.779053],[25.338699,102.7789],[25.338511,102.778847],[25.33835,102.778862],[25.33798,102.77906],[25.337681,102.779182],[25.33713,102.779282],[25.33671,102.779228],[25.335751,102.778976],[25.334999,102.778748],[25.33411,102.778229],[25.33375,102.778152],[25.3332,102.778198],[25.332109,102.778458],[25.33078,102.77903],[25.329651,102.779747],[25.329109,102.780182],[25.328581,102.78038],[25.328159,102.780403],[25.32778,102.780296],[25.327459,102.780029],[25.327101,102.779297],[25.3269,102.778999],[25.326759,102.778877],[25.32641,102.778709],[25.32626,102.778709],[25.32546,102.778847],[25.32505,102.778862],[25.32481,102.778809],[25.324249,102.778603],[25.32403,102.77858],[25.32296,102.778801],[25.32276,102.778801],[25.32201,102.778458],[25.320801,102.778099],[25.3204,102.777901],[25.31953,102.777107],[25.31885,102.7761],[25.318029,102.775299],[25.3179,102.775131],[25.317801,102.774902],[25.317751,102.774658],[25.317711,102.774178],[25.317579,102.773697],[25.31743,102.773514],[25.317101,102.773201],[25.31636,102.772697],[25.31525,102.771652],[25.314301,102.770958],[25.313709,102.770607],[25.313061,102.770683],[25.312851,102.77066],[25.311979,102.770409],[25.311359,102.770302],[25.30946,102.769798],[25.30933,102.769707],[25.30883,102.769157],[25.30838,102.768501],[25.308109,102.767357],[25.308149,102.765984],[25.30813,102.76503],[25.307949,102.764412],[25.307699,102.764076],[25.30756,102.763977],[25.306709,102.762749],[25.3062,102.762283],[25.305599,102.761902],[25.30525,102.761581],[25.305149,102.761383],[25.30501,102.76091],[25.30493,102.760429],[25.3048,102.760231],[25.304609,102.760078],[25.303801,102.759712],[25.3027,102.759331],[25.30253,102.759209],[25.30241,102.759048],[25.30233,102.758827],[25.30221,102.758148],[25.3022,102.757431],[25.30213,102.75721],[25.301979,102.757057],[25.301611,102.756882],[25.301479,102.756729],[25.301081,102.755898],[25.300461,102.754181],[25.3002,102.753799],[25.300011,102.753632],[25.299101,102.752998],[25.298161,102.752251],[25.297831,102.75193],[25.29756,102.751534],[25.296909,102.750809],[25.29673,102.750702],[25.29631,102.750633],[25.295959,102.750458],[25.295811,102.750313],[25.295549,102.749947],[25.29483,102.749382],[25.29401,102.749008],[25.293579,102.748901],[25.29213,102.748711],[25.2918,102.748528],[25.289631,102.747597],[25.288031,102.7472],[25.286249,102.746384],[25.285561,102.746201],[25.28441,102.745758],[25.28348,102.745483],[25.282261,102.745361],[25.282009,102.7453],[25.281601,102.745148],[25.28043,102.744957],[25.279409,102.745033],[25.27891,102.744911],[25.27791,102.744728],[25.2775,102.744583],[25.277309,102.744453],[25.276699,102.743713],[25.276501,102.743584],[25.276331,102.74353],[25.27615,102.743553],[25.27533,102.743752],[25.27416,102.74411],[25.27375,102.744377],[25.27355,102.744476],[25.273331,102.74453],[25.272881,102.744461],[25.27243,102.744431],[25.27141,102.744263],[25.27063,102.744202],[25.26993,102.7444],[25.26943,102.744408],[25.268709,102.744331],[25.26803,102.744263],[25.26738,102.744247],[25.267179,102.744308],[25.26638,102.744659],[25.266159,102.744682],[25.26573,102.744553],[25.2649,102.74408],[25.264681,102.744034],[25.2642,102.74398],[25.263729,102.743797],[25.26333,102.74353],[25.262911,102.742996],[25.26273,102.742607],[25.26263,102.742012],[25.26255,102.741852],[25.26235,102.74176],[25.26218,102.741882],[25.261999,102.74221],[25.261829,102.74231],[25.2614,102.742279],[25.261181,102.742302],[25.260981,102.742363],[25.260799,102.742477],[25.260611,102.742554],[25.26041,102.742531],[25.260031,102.742348],[25.25985,102.742203],[25.25935,102.741982],[25.25881,102.741859],[25.25831,102.741814],[25.25808,102.74173],[25.257111,102.741249],[25.25668,102.740982],[25.256451,102.740898],[25.256201,102.740883],[25.25573,102.740952],[25.25548,102.740959],[25.254749,102.741096],[25.254511,102.741096],[25.253901,102.740807],[25.25366,102.740761],[25.252911,102.740898],[25.252159,102.740959],[25.25168,102.740883],[25.251129,102.740631],[25.250759,102.740601],[25.250111,102.740707],[25.2498,102.740646],[25.249359,102.740402],[25.249201,102.740356],[25.24901,102.740356],[25.24855,102.740601],[25.24818,102.740631],[25.24753,102.740608],[25.24736,102.740646],[25.247129,102.740578],[25.246811,102.740402],[25.24625,102.739906],[25.24605,102.739777],[25.245609,102.739662],[25.24523,102.739449],[25.245001,102.739197],[25.244551,102.7388],[25.24441,102.738731],[25.2442,102.738747],[25.243811,102.738899],[25.24361,102.738876],[25.2435,102.738777],[25.243299,102.73851],[25.24305,102.738281],[25.24271,102.738129],[25.24238,102.73806],[25.241579,102.738113],[25.241211,102.738159],[25.24103,102.738129],[25.2409,102.738029],[25.24078,102.737862],[25.24066,102.737747],[25.240179,102.737511],[25.240009,102.73748],[25.239229,102.73745],[25.238729,102.737282],[25.23835,102.737251],[25.237881,102.737297],[25.237221,102.737343],[25.235609,102.736977],[25.234329,102.736778],[25.2339,102.736633],[25.233561,102.73645],[25.23329,102.736298],[25.23288,102.736214],[25.23233,102.73616],[25.230209,102.736107],[25.229759,102.736511],[25.229549,102.736862],[25.22921,102.737083],[25.22872,102.737267],[25.228609,102.737549],[25.2286,102.737953],[25.228479,102.738281],[25.2283,102.738564],[25.2281,102.738861],[25.228081,102.739014],[25.22818,102.739159],[25.228359,102.739212],[25.22863,102.739128],[25.229,102.738701],[25.229481,102.738197],[25.229851,102.738068],[25.230709,102.738083],[25.231279,102.738281],[25.231649,102.738281],[25.231859,102.738297],[25.2321,102.738564],[25.23221,102.738762],[25.23258,102.738907],[25.232929,102.738853],[25.233179,102.739014],[25.23344,102.739212],[25.233629,102.739616],[25.23385,102.739777],[25.23403,102.73983],[25.23436,102.739761],[25.234619,102.739822],[25.235109,102.740349],[25.23571,102.740593],[25.23596,102.740913],[25.235979,102.74115],[25.235941,102.74144],[25.23563,102.741623],[25.235201,102.741631],[25.23461,102.741753],[25.234079,102.742081],[25.233801,102.742172],[25.233379,102.742126],[25.23267,102.742027],[25.2323,102.742172],[25.232019,102.742378],[25.23185,102.742706],[25.231701,102.74308],[25.231529,102.743401],[25.231359,102.743507],[25.2311,102.743477],[25.230749,102.74321],[25.230709,102.742867],[25.230579,102.742317],[25.230129,102.742027],[25.229601,102.741783],[25.22872,102.741814],[25.227989,102.741661],[25.227409,102.741661],[25.22665,102.741447],[25.226259,102.741127],[25.225981,102.74073],[25.225731,102.740448],[25.225559,102.740402],[25.22541,102.74041],[25.22529,102.740593],[25.225189,102.74073],[25.224751,102.741013],[25.22418,102.741211],[25.223949,102.741653],[25.22373,102.741837],[25.22183,102.742447],[25.219999,102.742653],[25.21899,102.742851],[25.21788,102.742699],[25.2171,102.742561],[25.215811,102.742683],[25.214781,102.742683],[25.21406,102.742882],[25.21328,102.742981],[25.21253,102.742828],[25.212231,102.743088],[25.211861,102.743858],[25.21159,102.744217],[25.211161,102.744347],[25.211029,102.744209],[25.210899,102.743446],[25.210871,102.742729],[25.21055,102.742264],[25.21018,102.74202],[25.20965,102.741982],[25.20941,102.742279],[25.209459,102.742699],[25.209351,102.742912],[25.20911,102.742943],[25.207479,102.742851],[25.205999,102.742462],[25.20532,102.742371],[25.204309,102.741959],[25.20381,102.741859],[25.203341,102.741959],[25.202749,102.741966],[25.20096,102.741631],[25.19952,102.741211],[25.19906,102.74118],[25.19445,102.741096],[25.192699,102.740768],[25.192181,102.7407],[25.191839,102.740784],[25.19108,102.741158],[25.19055,102.741158],[25.189501,102.741226],[25.18906,102.741074],[25.18828,102.740822],[25.187519,102.740784],[25.186279,102.740784],[25.185511,102.740677],[25.18507,102.740356],[25.184259,102.739868],[25.182449,102.73896],[25.180901,102.738281],[25.17981,102.737999],[25.17901,102.737846],[25.178101,102.737534],[25.177349,102.737221],[25.17658,102.736443],[25.176279,102.736061],[25.17568,102.73568],[25.17518,102.735573],[25.174761,102.735382],[25.17448,102.73513],[25.174141,102.734596],[25.174101,102.734512],[25.174061,102.734062],[25.17408,102.733528],[25.17395,102.733047],[25.173759,102.732803],[25.173281,102.732712],[25.171709,102.733147],[25.17136,102.733078],[25.170719,102.732887],[25.17041,102.73288],[25.17008,102.733032],[25.16971,102.733414],[25.169359,102.733856],[25.169081,102.734032],[25.16876,102.734001],[25.167959,102.733429],[25.166889,102.73288],[25.16662,102.732826],[25.166071,102.732826],[25.165831,102.73275],[25.16568,102.73243],[25.165621,102.732117],[25.165449,102.731796],[25.165211,102.731827],[25.16507,102.732018],[25.16501,102.732109],[25.16511,102.732559],[25.1654,102.733002],[25.16581,102.733147],[25.16637,102.733238],[25.1667,102.733253],[25.166901,102.733482],[25.16687,102.73362],[25.16671,102.733849],[25.166439,102.733757],[25.165951,102.73349],[25.165461,102.733429],[25.165001,102.733307],[25.16473,102.733078],[25.164579,102.73278],[25.164591,102.732483],[25.164579,102.732147],[25.164551,102.731758],[25.16436,102.731583],[25.16415,102.731651],[25.16408,102.731979],[25.1642,102.732529],[25.16419,102.732811],[25.164301,102.733307],[25.16448,102.733551],[25.164829,102.733658],[25.16518,102.733711],[25.165421,102.733833],[25.16543,102.734154],[25.1653,102.734283],[25.165001,102.734253],[25.16433,102.73391],[25.16366,102.733597],[25.1635,102.73317],[25.16338,102.732651],[25.163231,102.732201],[25.16297,102.731949],[25.162689,102.73188],[25.162411,102.732079],[25.16213,102.73278],[25.16194,102.733513],[25.161711,102.733711],[25.160521,102.734306],[25.1602,102.734238],[25.15971,102.733849],[25.15906,102.733299],[25.158609,102.73307],[25.158409,102.733078],[25.158159,102.732979],[25.157909,102.732857],[25.157761,102.732536],[25.157579,102.732353],[25.157471,102.732361],[25.157301,102.732452],[25.15723,102.732613],[25.1572,102.732948],[25.15723,102.733299],[25.157459,102.733528],[25.15806,102.733688],[25.15843,102.733833],[25.158751,102.734261],[25.15893,102.734871],[25.15921,102.735603],[25.15962,102.735992],[25.160009,102.736122],[25.160339,102.736259],[25.1609,102.736732],[25.161659,102.737053],[25.16231,102.737183],[25.162661,102.73716],[25.162769,102.737213],[25.162979,102.73735],[25.163139,102.73777],[25.1632,102.737846],[25.1633,102.738113],[25.16328,102.73838],[25.163059,102.738678],[25.162661,102.739052],[25.16227,102.739311],[25.161751,102.739433],[25.16147,102.739403],[25.16116,102.739403],[25.161051,102.739372],[25.160629,102.73925],[25.160061,102.739029],[25.15967,102.738876],[25.15741,102.738419],[25.156481,102.738129],[25.15554,102.737587],[25.153151,102.736588],[25.150579,102.735527],[25.149429,102.735031],[25.148701,102.734787],[25.14473,102.733528],[25.143021,102.73275],[25.141371,102.732208],[25.136999,102.730568],[25.130501,102.728256],[25.12912,102.727676],[25.12747,102.726837],[25.12598,102.725861],[25.12476,102.72522],[25.123051,102.724701],[25.121719,102.72422],[25.119909,102.72393],[25.118311,102.723679],[25.117149,102.723381],[25.11606,102.723129],[25.11553,102.723099],[25.115311,102.723259],[25.11496,102.724297],[25.114599,102.725632],[25.114111,102.72641],[25.11356,102.727448],[25.1129,102.728729],[25.108379,102.726807],[25.10449,102.725151],[25.101049,102.723686],[25.10005,102.72654],[25.09898,102.729637],[25.09713,102.73497],[25.096161,102.737579],[25.09581,102.737534],[25.09334,102.736557],[25.09148,102.735909],[25.09123,102.735817],[25.0889,102.73497],[25.08815,102.734673],[25.087391,102.734383],[25.085621,102.732613],[25.0839,102.730911],[25.081699,102.733963],[25.08021,102.736153],[25.07494,102.743919],[25.074869,102.744019],[25.071899,102.74762],[25.07069,102.749336],[25.07015,102.751411],[25.067841,102.750389],[25.066681,102.749413],[25.065109,102.747681],[25.063669,102.746552],[25.06233,102.745644],[25.060631,102.744438],[25.060289,102.744202],[25.057619,102.742691],[25.057409,102.742462],[25.05604,102.742752],[25.051701,102.742897],[25.049891,102.742989],[25.04567,102.743103],[25.04431,102.743134],[25.0413,102.743263],[25.03709,102.743469],[25.035601,102.743599],[25.033911,102.743767],[25.03154,102.74382],[25.030161,102.74353],[25.02953,102.743271],[25.02825,102.742767],[25.026091,102.741898],[25.025089,102.741814],[25.0238,102.74205],[25.0231,102.742233],[25.022341,102.742371],[25.02179,102.742477],[25.021219,102.742592],[25.01985,102.742943],[25.01964,102.743042],[25.019501,102.743187],[25.019449,102.743347],[25.01948,102.743477],[25.01955,102.74366],[25.0198,102.74395],[25.01992,102.744102],[25.02,102.744362],[25.020029,102.744621],[25.01989,102.745796],[25.01976,102.746368],[25.01919,102.749313],[25.01759,102.755577],[25.017191,102.756592],[25.01643,102.757927],[25.01516,102.759399],[25.01408,102.760368],[25.00745,102.764168],[25.005659,102.76519],[25.004789,102.765747],[25.004169,102.766327],[25.00341,102.767403],[25.00296,102.768417],[25.00198,102.770973],[25.00152,102.771751],[25.0009,102.772476],[24.9932,102.778389],[24.992041,102.779327],[24.99118,102.779999],[24.990601,102.780243],[24.98991,102.780342],[24.98925,102.780243],[24.98415,102.778168],[24.982491,102.777603],[24.98114,102.777588],[24.978029,102.777863],[24.973841,102.778633],[24.973101,102.778778],[24.972031,102.779068],[24.971201,102.779381],[24.96909,102.780296],[24.967541,102.781143],[24.966209,102.781967],[24.957451,102.787659],[24.956369,102.788292],[24.955509,102.788712],[24.95487,102.788963],[24.95372,102.78936],[24.951731,102.789703],[24.95056,102.78978],[24.93424,102.789619],[24.926109,102.788887],[24.924629,102.788948],[24.923161,102.789169],[24.92104,102.789757],[24.919081,102.79068],[24.917391,102.791763],[24.904909,102.800919],[24.90271,102.802032],[24.900499,102.802696],[24.898359,102.802963],[24.89703,102.80323],[24.895639,102.803741],[24.894461,102.804321],[24.89431,102.804398],[24.89344,102.804947],[24.89315,102.805153],[24.891251,102.806808],[24.88316,102.814201],[24.880819,102.815666],[24.878929,102.816467],[24.876221,102.817123],[24.874001,102.817291],[24.84852,102.817581],[24.84655,102.81736],[24.84318,102.816437],[24.839991,102.814957],[24.830021,102.808449],[24.828449,102.807693],[24.82411,102.806129],[24.822969,102.805481],[24.819901,102.802963],[24.817209,102.801666],[24.81572,102.801048],[24.814489,102.800247],[24.81016,102.795677],[24.8069,102.793289],[24.8011,102.787453],[24.800039,102.78669],[24.79859,102.785896],[24.79657,102.785118],[24.795799,102.784828],[24.785509,102.780983],[24.784889,102.780609],[24.784161,102.780037],[24.783541,102.779297],[24.78186,102.776398],[24.779381,102.77179],[24.77845,102.770477],[24.77702,102.76889],[24.776011,102.768021],[24.77453,102.766991],[24.77227,102.765877],[24.770599,102.765327],[24.76366,102.764069],[24.734501,102.754677],[24.732719,102.753777],[24.73086,102.752457],[24.72957,102.751198],[24.709591,102.725899],[24.69681,102.713463],[24.696119,102.712807],[24.694839,102.710548],[24.69313,102.706947],[24.69272,102.706306],[24.69241,102.705963],[24.691811,102.705513],[24.69121,102.70517],[24.68935,102.704407],[24.688761,102.704002],[24.68825,102.703491],[24.68782,102.702888],[24.68749,102.70192],[24.685551,102.695763],[24.678829,102.681763],[24.67807,102.680649],[24.67717,102.67971],[24.67095,102.675392],[24.670059,102.674568],[24.669491,102.67379],[24.668909,102.672684],[24.668631,102.671654],[24.664829,102.653343],[24.66445,102.65229],[24.66386,102.651253],[24.66073,102.647186],[24.65988,102.646393],[24.6506,102.638947],[24.643311,102.630211],[24.64097,102.628479],[24.627899,102.623543],[24.627211,102.623138],[24.626381,102.622452],[24.62466,102.620277],[24.623949,102.619698],[24.617371,102.616913],[24.61204,102.614761],[24.605829,102.610237],[24.601089,102.607674],[24.599501,102.606468],[24.597919,102.604881],[24.58987,102.595268],[24.579691,102.585068],[24.57741,102.583359],[24.57579,102.58242],[24.56934,102.579987],[24.55953,102.577469],[24.555241,102.575607],[24.554131,102.57534],[24.549549,102.575256],[24.54882,102.575157],[24.54788,102.574913],[24.542219,102.572319],[24.541121,102.571609],[24.54015,102.570663],[24.53915,102.569366],[24.53838,102.568626],[24.537069,102.567719],[24.53651,102.567162],[24.536051,102.566528],[24.53557,102.565552],[24.535021,102.56356],[24.5345,102.56234],[24.53392,102.56147],[24.533079,102.560638],[24.53204,102.55999],[24.53105,102.559647],[24.52458,102.558792],[24.523661,102.558517],[24.522989,102.558189],[24.52256,102.557877],[24.519461,102.555054],[24.51862,102.554459],[24.517719,102.554039],[24.516569,102.553757],[24.515289,102.553772],[24.514521,102.55397],[24.50947,102.556023],[24.50729,102.556717],[24.50609,102.557312],[24.500919,102.560722],[24.5002,102.561043],[24.494989,102.561996],[24.493891,102.562347],[24.49102,102.563553],[24.489889,102.563797],[24.488701,102.563843],[24.487949,102.563721],[24.487209,102.563522],[24.485359,102.562782],[24.484381,102.562553],[24.481859,102.562187],[24.481131,102.561974],[24.48068,102.561729],[24.47967,102.560867],[24.47547,102.556763],[24.471451,102.554123],[24.470181,102.55291],[24.468599,102.550987],[24.467661,102.550163],[24.466789,102.549622],[24.466089,102.549316],[24.46512,102.549049],[24.41419,102.541649],[24.40333,102.539558],[24.399929,102.53891],[24.398029,102.538544],[24.391729,102.537331],[24.390289,102.537117],[24.37652,102.535439],[24.37458,102.534958],[24.370319,102.533524],[24.359261,102.530693],[24.3577,102.530441],[24.35693,102.530312],[24.355539,102.53009],[24.353239,102.529762],[24.350981,102.529442],[24.349449,102.529114],[24.34881,102.528976],[24.33872,102.52536],[24.335779,102.523987],[24.331289,102.521278],[24.328819,102.519768],[24.32793,102.519234],[24.324511,102.517273],[24.32218,102.516609],[24.317949,102.515617],[24.316759,102.515068],[24.31604,102.514557],[24.315069,102.513573],[24.3137,102.511871],[24.312799,102.511147],[24.31176,102.510597],[24.30479,102.508911],[24.3043,102.508743],[24.30143,102.507187],[24.291599,102.50116],[24.290791,102.500458],[24.29007,102.499619],[24.28937,102.498367],[24.288759,102.497108],[24.288271,102.496353],[24.2878,102.495827],[24.28723,102.495407],[24.286591,102.495087],[24.285919,102.494888],[24.28525,102.494797],[24.282829,102.494797],[24.282221,102.494743],[24.28142,102.494476],[24.280569,102.493973],[24.2794,102.492844],[24.276489,102.4879],[24.27578,102.487053],[24.274691,102.486198],[24.273609,102.485657],[24.272449,102.485382],[24.26977,102.485046],[24.268471,102.48465],[24.26585,102.483528],[24.26474,102.483238],[24.26259,102.483109],[24.25843,102.483162],[24.25771,102.483017],[24.25713,102.482857],[24.25701,102.482826],[24.25679,102.48275],[24.256611,102.482689],[24.256069,102.482513],[24.25515,102.482117],[24.253349,102.48143],[24.25172,102.480797],[24.250879,102.480476],[24.25012,102.480263],[24.248831,102.480049],[24.247219,102.480019],[24.23737,102.481071],[24.235371,102.480927],[24.224079,102.478661],[24.212351,102.474663],[24.210661,102.473763],[24.20948,102.472878],[24.20829,102.471649],[24.204809,102.466621],[24.203409,102.46524],[24.20174,102.464043],[24.196659,102.461678],[24.19556,102.460876],[24.194941,102.460243],[24.19416,102.459106],[24.193331,102.457581],[24.191719,102.455399],[24.191389,102.454742],[24.191139,102.454033],[24.19101,102.45327],[24.19099,102.452591],[24.19091,102.45002],[24.190901,102.449692],[24.19076,102.444458],[24.19109,102.441818],[24.191771,102.437843],[24.19174,102.436836],[24.191641,102.436348],[24.19136,102.435623],[24.191099,102.435181],[24.18651,102.43042],[24.185989,102.429581],[24.185711,102.428879],[24.184311,102.419518],[24.183969,102.418533],[24.183371,102.417389],[24.182409,102.415947],[24.181881,102.414803],[24.18154,102.413551],[24.1812,102.403793],[24.180929,102.402191],[24.18042,102.400688],[24.177509,102.395042],[24.176331,102.392754],[24.17631,102.392723],[24.176149,102.392403],[24.17314,102.386574],[24.172701,102.385933],[24.170879,102.384216],[24.17062,102.383812],[24.17046,102.383347],[24.170179,102.381378],[24.16997,102.380669],[24.169609,102.380043],[24.169121,102.379478],[24.16855,102.379021],[24.16753,102.378349],[24.167021,102.377808],[24.166389,102.377007],[24.166019,102.376701],[24.165569,102.376472],[24.16416,102.376099],[24.16374,102.3759],[24.163389,102.375603],[24.163139,102.375191],[24.162661,102.374092],[24.162411,102.373703],[24.162251,102.37352],[24.16185,102.373238],[24.161409,102.373077],[24.15999,102.37294],[24.15954,102.372833],[24.159321,102.372726],[24.158939,102.372467],[24.15859,102.372147],[24.158319,102.371773],[24.15811,102.37133],[24.15798,102.37085],[24.157841,102.369583],[24.15766,102.368828],[24.157379,102.368118],[24.15666,102.367088],[24.156179,102.366371],[24.155479,102.364662],[24.15521,102.364029],[24.154329,102.363487],[24.153721,102.363167],[24.152889,102.362442],[24.15229,102.361687],[24.15196,102.361397],[24.15155,102.361153],[24.15045,102.360817],[24.149799,102.360527],[24.149441,102.360222],[24.149151,102.35984],[24.14892,102.359413],[24.14876,102.358917],[24.148399,102.356651],[24.148041,102.355782],[24.14629,102.353394],[24.14595,102.35276],[24.145611,102.35183],[24.14521,102.350128],[24.145029,102.349693],[24.14465,102.349068],[24.14324,102.347618],[24.142731,102.346786],[24.1418,102.344177],[24.14126,102.343384],[24.140659,102.342873],[24.140129,102.342621],[24.13954,102.342499],[24.138929,102.342506],[24.136841,102.342957],[24.1362,102.343002],[24.135571,102.342903],[24.13516,102.342743],[24.132589,102.340973],[24.13216,102.340759],[24.131701,102.340622],[24.130989,102.340523],[24.127661,102.340523],[24.12628,102.340202],[24.124981,102.339577],[24.12085,102.33638],[24.117701,102.334648],[24.11706,102.334412],[24.11635,102.334328],[24.11565,102.334381],[24.114941,102.334572],[24.114281,102.334923],[24.113449,102.33548],[24.11302,102.335693],[24.11256,102.335808],[24.11208,102.335823],[24.11161,102.335716],[24.111179,102.335503],[24.10861,102.333557],[24.106741,102.33268],[24.10528,102.331383],[24.10442,102.330612],[24.102909,102.329628],[24.10244,102.329132],[24.102039,102.328522],[24.101669,102.327477],[24.101049,102.32486],[24.10013,102.319603],[24.09733,102.308762],[24.097191,102.307899],[24.096939,102.306992],[24.09639,102.305817],[24.09561,102.304764],[24.094851,102.304039],[24.093651,102.30307],[24.093321,102.302711],[24.09306,102.302307],[24.092791,102.301651],[24.092609,102.300667],[24.092541,102.29995],[24.092421,102.29953],[24.092239,102.299141],[24.091841,102.298592],[24.09063,102.297256],[24.0902,102.296577],[24.08963,102.295433],[24.08935,102.295059],[24.08901,102.294746],[24.0886,102.294563],[24.088381,102.29451],[24.087959,102.294518],[24.087219,102.29483],[24.08667,102.295097],[24.08625,102.295174],[24.08585,102.295242],[24.082951,102.296356],[24.082621,102.296516],[24.08209,102.296532],[24.0816,102.296417],[24.081181,102.296318],[24.08079,102.296112],[24.08042,102.295807],[24.08012,102.295441],[24.07991,102.295013],[24.07976,102.29454],[24.079679,102.294022],[24.0797,102.293243],[24.0802,102.290543],[24.08024,102.290009],[24.08013,102.28923],[24.079941,102.288757],[24.07933,102.287903],[24.077909,102.28611],[24.0777,102.285744],[24.0776,102.285332],[24.07761,102.284912],[24.077709,102.2845],[24.077909,102.284126],[24.078409,102.283669],[24.078991,102.283257],[24.079321,102.282921],[24.07955,102.282509],[24.07966,102.282051],[24.07967,102.281578],[24.07852,102.277153],[24.07806,102.276161],[24.075491,102.272011],[24.075199,102.271309],[24.0748,102.269821],[24.074591,102.269386],[24.074459,102.269173],[24.073931,102.2686],[24.07037,102.266113],[24.069981,102.265747],[24.06966,102.26532],[24.06941,102.264839],[24.069151,102.264069],[24.06813,102.258057],[24.067631,102.25647],[24.063391,102.248207],[24.063089,102.247742],[24.06238,102.246918],[24.06155,102.246246],[24.059299,102.244904],[24.057791,102.243858],[24.057039,102.243134],[24.05673,102.242722],[24.05632,102.242027],[24.05582,102.240761],[24.054319,102.236038],[24.05357,102.234596],[24.05155,102.231468],[24.050631,102.22953],[24.04875,102.224281],[24.048401,102.223633],[24.04619,102.221077],[24.04599,102.220711],[24.045799,102.220093],[24.045759,102.219177],[24.045759,102.21759],[24.045759,102.217461],[24.04575,102.214523],[24.04575,102.213913],[24.045691,102.207733],[24.045561,102.206467],[24.045349,102.205673],[24.04513,102.205132],[24.04483,102.204391],[24.044189,102.203178],[24.037531,102.195297],[24.036949,102.194763],[24.03628,102.194359],[24.031691,102.192528],[24.03071,102.192322],[24.029181,102.192192],[24.02747,102.192032],[24.026331,102.191757],[24.02446,102.191139],[24.023439,102.190964],[24.014271,102.191002],[24.01329,102.190872],[24.0121,102.190483],[24.0112,102.189987],[24.010401,102.189377],[24.00802,102.186996],[24.007721,102.186577],[24.00737,102.18586],[24.006901,102.18457],[24.00667,102.18409],[24.006371,102.183662],[24.005791,102.183144],[24.005569,102.182983],[24.00429,102.182053],[24.004009,102.181839],[24.00309,102.181152],[24.002621,102.180801],[23.999161,102.178482],[23.99815,102.178101],[23.997219,102.177979],[23.993441,102.17823],[23.991911,102.17807],[23.98851,102.17717],[23.987881,102.177116],[23.98723,102.17717],[23.986589,102.17733],[23.98562,102.177834],[23.98452,102.178513],[23.983761,102.178818],[23.982731,102.178993],[23.981871,102.178902],[23.98102,102.178642],[23.979971,102.178177],[23.979059,102.177948],[23.9765,102.177856],[23.975559,102.177658],[23.97468,102.177238],[23.974079,102.176819],[23.971951,102.174683],[23.97135,102.174232],[23.96685,102.171967],[23.96616,102.171738],[23.965191,102.171669],[23.96447,102.171761],[23.963039,102.172127],[23.962561,102.172188],[23.96209,102.172127],[23.96162,102.171944],[23.96122,102.171661],[23.958651,102.168922],[23.95356,102.16555],[23.953131,102.16507],[23.952921,102.164711],[23.952669,102.163879],[23.95248,102.162537],[23.952339,102.162109],[23.952101,102.161728],[23.95179,102.161423],[23.946501,102.158653],[23.94496,102.157494],[23.942419,102.154846],[23.9419,102.154488],[23.941311,102.154297],[23.94047,102.154228],[23.93947,102.154266],[23.939091,102.154243],[23.93854,102.154083],[23.937599,102.153488],[23.93655,102.152649],[23.935699,102.152184],[23.93387,102.15155],[23.933331,102.151237],[23.932699,102.150703],[23.932409,102.150391],[23.931231,102.148399],[23.93082,102.14798],[23.93018,102.147568],[23.929529,102.147186],[23.92911,102.146828],[23.92877,102.146393],[23.928169,102.145157],[23.92758,102.144363],[23.926809,102.14373],[23.92609,102.143349],[23.91666,102.14122],[23.914061,102.140831],[23.913349,102.140778],[23.908159,102.14093],[23.90766,102.140877],[23.897499,102.139458],[23.89678,102.139381],[23.896061,102.139252],[23.89463,102.13871],[23.89208,102.137512],[23.890499,102.136703],[23.88798,102.134712],[23.887449,102.134132],[23.88703,102.133453],[23.88681,102.132957],[23.886379,102.13176],[23.885281,102.129013],[23.877159,102.123848],[23.876949,102.123734],[23.87628,102.123627],[23.874849,102.12368],[23.874399,102.12365],[23.87398,102.123482],[23.87368,102.123154],[23.873461,102.12278],[23.872881,102.121277],[23.872459,102.120659],[23.87211,102.1203],[23.870911,102.119453],[23.87038,102.118896],[23.87023,102.118698],[23.86998,102.118233],[23.86936,102.116547],[23.86911,102.11615],[23.86895,102.115959],[23.868561,102.115646],[23.86725,102.114952],[23.865561,102.113297],[23.864361,102.11203],[23.86401,102.11145],[23.863859,102.110832],[23.86388,102.110413],[23.864111,102.10981],[23.864361,102.109459],[23.86471,102.109177],[23.86515,102.109001],[23.867279,102.108498],[23.86791,102.108231],[23.868099,102.108109],[23.868401,102.107727],[23.86895,102.106552],[23.869209,102.10611],[23.869551,102.105713],[23.869949,102.105431],[23.870399,102.105209],[23.87126,102.104851],[23.871599,102.104584],[23.871849,102.104279],[23.871929,102.104057],[23.87195,102.103851],[23.87188,102.103378],[23.87175,102.103012],[23.871481,102.102699],[23.871111,102.102448],[23.870911,102.102364],[23.870501,102.102333],[23.87026,102.102379],[23.86981,102.1026],[23.86916,102.102798],[23.86871,102.102829],[23.8685,102.102814],[23.867149,102.102249],[23.86648,102.10183],[23.865879,102.101303],[23.86536,102.100647],[23.86388,102.098213],[23.86368,102.09761],[23.863661,102.097412],[23.8638,102.096764],[23.864031,102.096359],[23.86445,102.095848],[23.864981,102.095001],[23.865299,102.094254],[23.865681,102.093201],[23.86581,102.092934],[23.866131,102.092484],[23.86668,102.091904],[23.867149,102.091263],[23.867399,102.090759],[23.86763,102.089981],[23.867781,102.088951],[23.86775,102.088509],[23.867701,102.088303],[23.867479,102.087929],[23.867149,102.087646],[23.8666,102.087448],[23.8664,102.087448],[23.86618,102.087509],[23.865761,102.087761],[23.86545,102.088081],[23.865259,102.088478],[23.865049,102.0896],[23.864811,102.090233],[23.864599,102.090599],[23.864059,102.091103],[23.861059,102.092583],[23.86046,102.092957],[23.860161,102.093208],[23.85955,102.094032],[23.85935,102.094452],[23.859079,102.09481],[23.85873,102.095154],[23.857849,102.095581],[23.85738,102.095703],[23.857161,102.095711],[23.85676,102.095901],[23.856409,102.096161],[23.85626,102.096313],[23.856159,102.096497],[23.85605,102.096626],[23.85606,102.0989],[23.85601,102.099152],[23.855801,102.099579],[23.855511,102.099983],[23.85516,102.100304],[23.85471,102.100906],[23.854309,102.101929],[23.854,102.102547],[23.853701,102.102913],[23.853161,102.10331],[23.852949,102.103401],[23.85203,102.10363],[23.85128,102.103683],[23.85055,102.1036],[23.84981,102.103409],[23.84853,102.10321],[23.84803,102.103027],[23.847799,102.102913],[23.847401,102.102577],[23.846701,102.101784],[23.84593,102.101196],[23.84486,102.100601],[23.84428,102.100159],[23.843531,102.099258],[23.84318,102.09893],[23.842779,102.098663],[23.841961,102.098312],[23.84136,102.097954],[23.841181,102.097809],[23.84103,102.097633],[23.8407,102.096977],[23.84058,102.096527],[23.8403,102.095161],[23.840151,102.094727],[23.84005,102.094551],[23.83938,102.093979],[23.839199,102.093857],[23.837481,102.093353],[23.83728,102.093262],[23.835831,102.092857],[23.835409,102.092659],[23.835011,102.092377],[23.834681,102.092049],[23.83445,102.091698],[23.834129,102.090881],[23.8332,102.088898],[23.83288,102.08831],[23.830799,102.084099],[23.83016,102.083054],[23.829861,102.08271],[23.82933,102.082359],[23.828329,102.081863],[23.822161,102.078331],[23.82205,102.078178],[23.82181,102.077698],[23.821199,102.076813],[23.82086,102.076462],[23.8188,102.074661],[23.818331,102.074333],[23.817829,102.074112],[23.817329,102.074013],[23.81706,102.074051],[23.81608,102.073959],[23.81583,102.073883],[23.815359,102.073601],[23.81246,102.070953],[23.811911,102.070358],[23.810949,102.069153],[23.810579,102.068832],[23.81036,102.06871],[23.809879,102.068527],[23.809629,102.068497],[23.80913,102.06855],[23.808661,102.068703],[23.80765,102.069527],[23.80718,102.069809],[23.806931,102.069908],[23.806431,102.069977],[23.805929,102.069809],[23.8057,102.069702],[23.805111,102.069206],[23.804449,102.068359],[23.804079,102.067978],[23.80345,102.067581],[23.80213,102.067047],[23.80155,102.066658],[23.801029,102.0662],[23.79903,102.064003],[23.798861,102.06385],[23.79821,102.063148],[23.797501,102.062531],[23.79648,102.061852],[23.795851,102.061501],[23.79565,102.061363],[23.79418,102.060448],[23.792999,102.059502],[23.791599,102.058357],[23.79055,102.057701],[23.78875,102.056847],[23.78598,102.056],[23.78591,102.055946],[23.785601,102.055771],[23.785271,102.05555],[23.78495,102.055313],[23.784639,102.055054],[23.78433,102.054779],[23.783991,102.054497],[23.78377,102.054321],[23.783541,102.054138],[23.7833,102.053963],[23.78306,102.05378],[23.78281,102.053612],[23.78229,102.053284],[23.782021,102.053123],[23.78175,102.052963],[23.781481,102.052818],[23.7812,102.052673],[23.780661,102.052353],[23.78039,102.052193],[23.780121,102.05204],[23.77984,102.05188],[23.77957,102.05172],[23.779301,102.051559],[23.77903,102.051399],[23.77877,102.051224],[23.778509,102.051064],[23.778259,102.05088],[23.778009,102.05069],[23.777769,102.050507],[23.77754,102.050323],[23.777309,102.050117],[23.777081,102.049919],[23.776859,102.049721],[23.77664,102.049507],[23.77643,102.049316],[23.77622,102.049118],[23.77602,102.04892],[23.77581,102.048721],[23.775511,102.048431],[23.7752,102.048141],[23.7749,102.047859],[23.77459,102.047569],[23.77438,102.047371],[23.774179,102.04718],[23.773979,102.046982],[23.77376,102.046783],[23.77355,102.046593],[23.77322,102.046303],[23.772989,102.046112],[23.77276,102.045937],[23.77252,102.045761],[23.77227,102.045593],[23.77202,102.045433],[23.77178,102.045273],[23.771521,102.04512],[23.771271,102.044983],[23.771021,102.04483],[23.770769,102.044693],[23.77051,102.04454],[23.77026,102.044403],[23.77002,102.044243],[23.76977,102.044098],[23.76952,102.043953],[23.76927,102.043793],[23.76902,102.043663],[23.76878,102.04351],[23.76853,102.043373],[23.76829,102.043221],[23.76804,102.043083],[23.767799,102.042938],[23.76755,102.042801],[23.767309,102.042664],[23.767071,102.042503],[23.76683,102.042351],[23.7666,102.042198],[23.766371,102.042038],[23.766041,102.041786],[23.76582,102.041618],[23.76549,102.041344],[23.76528,102.041161],[23.76507,102.04097],[23.76486,102.040771],[23.76465,102.040573],[23.764441,102.040367],[23.764231,102.040161],[23.76403,102.039963],[23.763821,102.039757],[23.76362,102.039551],[23.76321,102.039162],[23.76289,102.038918],[23.76255,102.038696],[23.762199,102.038513],[23.76182,102.038368],[23.761419,102.038277],[23.761141,102.038239],[23.76086,102.038223],[23.760571,102.038193],[23.760269,102.038147],[23.759979,102.038116],[23.759689,102.038078],[23.757641,102.03775],[23.757311,102.037598],[23.756981,102.03743],[23.756651,102.037262],[23.756321,102.037079],[23.755989,102.036888],[23.755011,102.036324],[23.754681,102.036102],[23.75433,102.035889],[23.753969,102.03569],[23.753599,102.035492],[23.753241,102.035309],[23.752871,102.035103],[23.75251,102.034882],[23.75218,102.034607],[23.7519,102.034271],[23.751671,102.033897],[23.751459,102.033508],[23.75127,102.033119],[23.75107,102.032738],[23.750851,102.032372],[23.750629,102.032013],[23.75038,102.031677],[23.75012,102.031349],[23.749861,102.031029],[23.74958,102.030724],[23.7493,102.030403],[23.74902,102.030083],[23.748791,102.029701],[23.74864,102.029289],[23.748581,102.028877],[23.748619,102.028458],[23.74872,102.028053],[23.74893,102.027687],[23.74921,102.02739],[23.74954,102.027168],[23.749901,102.027031],[23.750259,102.026939],[23.750629,102.026894],[23.750999,102.026817],[23.75135,102.026718],[23.751659,102.026527],[23.751909,102.026268],[23.75206,102.025917],[23.752131,102.025558],[23.752119,102.025169],[23.75209,102.024773],[23.75205,102.024353],[23.752041,102.023933],[23.752081,102.023499],[23.75218,102.023071],[23.7523,102.022659],[23.752541,102.021828],[23.75256,102.021408],[23.752501,102.021004],[23.75231,102.020653],[23.75205,102.020363],[23.75172,102.02021],[23.751369,102.020126],[23.75102,102.020172],[23.750681,102.020287],[23.75042,102.020561],[23.75021,102.020889],[23.75001,102.02124],[23.74964,102.021957],[23.749451,102.022324],[23.74926,102.022667],[23.749041,102.023003],[23.748739,102.023247],[23.748409,102.02343],[23.74807,102.023537],[23.747721,102.023613],[23.74737,102.023666],[23.74703,102.023781],[23.746719,102.023956],[23.74645,102.024193],[23.74621,102.024467],[23.745991,102.024773],[23.74575,102.02507],[23.74552,102.02536],[23.74523,102.025597],[23.74489,102.025787],[23.74453,102.025871],[23.744169,102.02581],[23.74382,102.025681],[23.74349,102.02549],[23.743179,102.025299],[23.74287,102.025101],[23.742559,102.024902],[23.74225,102.024696],[23.74193,102.024513],[23.74161,102.024307],[23.741289,102.024109],[23.74095,102.023911],[23.740601,102.02372],[23.740259,102.023529],[23.73991,102.023338],[23.739571,102.023163],[23.739229,102.022987],[23.738899,102.022812],[23.73856,102.022629],[23.738239,102.022461],[23.737909,102.022293],[23.737579,102.022118],[23.737261,102.021942],[23.736931,102.021767],[23.736589,102.021599],[23.73625,102.021431],[23.73591,102.021248],[23.735571,102.021057],[23.735241,102.020844],[23.73493,102.020592],[23.734631,102.020317],[23.73436,102.020027],[23.734131,102.019699],[23.73391,102.019363],[23.733709,102.019028],[23.73349,102.0187],[23.733231,102.018402],[23.73295,102.01815],[23.73263,102.01799],[23.732281,102.017921],[23.73192,102.01796],[23.731581,102.018059],[23.73127,102.018257],[23.73101,102.018532],[23.73082,102.01886],[23.730709,102.019241],[23.730671,102.019638],[23.73073,102.020042],[23.73086,102.020432],[23.731039,102.020798],[23.73127,102.021141],[23.731501,102.021477],[23.73172,102.021843],[23.731939,102.022202],[23.73214,102.02256],[23.73234,102.022926],[23.73254,102.023277],[23.732731,102.023651],[23.732901,102.024033],[23.73307,102.024406],[23.733231,102.024803],[23.733379,102.0252],[23.73353,102.025597],[23.733681,102.026009],[23.73382,102.026413],[23.733959,102.02681],[23.73411,102.027206],[23.734249,102.027611],[23.73439,102.028023],[23.734541,102.028419],[23.734699,102.028816],[23.73485,102.029213],[23.735001,102.02961],[23.73514,102.030022],[23.735229,102.030441],[23.73527,102.030884],[23.73526,102.031319],[23.73522,102.031761],[23.73513,102.032173],[23.734989,102.03257],[23.7348,102.032944],[23.734591,102.033287],[23.734341,102.033592],[23.734051,102.033867],[23.733749,102.034103],[23.733419,102.034286],[23.73308,102.034439],[23.732719,102.034561],[23.732349,102.034653],[23.731979,102.034683],[23.7316,102.034668],[23.731199,102.034607],[23.730789,102.034538],[23.73037,102.034447],[23.729919,102.03437],[23.729469,102.034286],[23.72901,102.034233],[23.728559,102.03418],[23.728109,102.034126],[23.727659,102.034103],[23.7272,102.03405],[23.726749,102.033997],[23.726311,102.033928],[23.72587,102.033821],[23.725451,102.033691],[23.725031,102.033539],[23.724621,102.033371],[23.724211,102.033188],[23.723789,102.03302],[23.723351,102.032913],[23.7229,102.032883],[23.72246,102.032944],[23.72204,102.033089],[23.721649,102.03331],[23.721291,102.033546],[23.72093,102.033798],[23.72056,102.034027],[23.7202,102.034264],[23.71983,102.034462],[23.71946,102.034668],[23.71908,102.034866],[23.71871,102.035072],[23.71833,102.035263],[23.717951,102.035461],[23.71756,102.035637],[23.717171,102.035828],[23.716789,102.036011],[23.716419,102.036209],[23.71603,102.036308],[23.71563,102.036346],[23.71525,102.036301],[23.714899,102.036148],[23.714581,102.035927],[23.714291,102.035683],[23.71402,102.035408],[23.71372,102.035156],[23.713409,102.03492],[23.713079,102.034714],[23.712721,102.034538],[23.71236,102.034393],[23.711981,102.034264],[23.711599,102.034103],[23.711229,102.033951],[23.710871,102.033783],[23.71052,102.033577],[23.71019,102.033363],[23.709869,102.033119],[23.70957,102.032867],[23.709261,102.032623],[23.708941,102.032402],[23.708611,102.032211],[23.70826,102.032066],[23.707911,102.03196],[23.70755,102.031891],[23.70718,102.031853],[23.70681,102.031837],[23.70644,102.031822],[23.70606,102.031792],[23.7057,102.031723],[23.705351,102.031593],[23.705009,102.031433],[23.704691,102.031227],[23.704399,102.030983],[23.704121,102.030693],[23.703871,102.03038],[23.70363,102.030052],[23.703381,102.029716],[23.703119,102.029404],[23.70257,102.028763],[23.70228,102.02845],[23.701969,102.028137],[23.70167,102.027847],[23.701361,102.02755],[23.70105,102.02726],[23.700741,102.026993],[23.70059,102.026863],[23.70014,102.026466],[23.699841,102.02623],[23.699539,102.025978],[23.699261,102.025703],[23.698999,102.025414],[23.698771,102.025078],[23.69857,102.024727],[23.698389,102.024361],[23.69825,102.023987],[23.698139,102.023598],[23.698071,102.023209],[23.698021,102.022812],[23.698009,102.022423],[23.698021,102.022034],[23.698021,102.021652],[23.69804,102.021271],[23.69805,102.020889],[23.698059,102.020493],[23.698071,102.020103],[23.69809,102.019676],[23.698099,102.019257],[23.698099,102.018837],[23.698099,102.018417],[23.69808,102.017982],[23.69805,102.017548],[23.698009,102.017113],[23.69796,102.01667],[23.697889,102.016228],[23.697809,102.015793],[23.697729,102.01535],[23.69763,102.014923],[23.697531,102.014503],[23.69742,102.014076],[23.697321,102.01368],[23.69721,102.013283],[23.697109,102.012894],[23.69701,102.012489],[23.696911,102.012093],[23.6968,102.011703],[23.696699,102.011307],[23.69659,102.01091],[23.696489,102.010513],[23.69639,102.010117],[23.696289,102.009727],[23.69619,102.009331],[23.696079,102.008942],[23.69598,102.008537],[23.695869,102.008148],[23.69577,102.007751],[23.695669,102.007362],[23.69557,102.006973],[23.695471,102.006577],[23.69537,102.006203],[23.695271,102.005829],[23.695169,102.005463],[23.69507,102.005089],[23.694969,102.004723],[23.69488,102.004356],[23.69478,102.00399],[23.694679,102.003616],[23.69458,102.003242],[23.694481,102.002869],[23.694389,102.002487],[23.69429,102.002121],[23.694189,102.001747],[23.69409,102.001373],[23.693991,102.000999],[23.693899,102.000633],[23.6938,102.000259],[23.693701,101.999893],[23.693609,101.999542],[23.69352,101.999191],[23.693411,101.998848],[23.693279,101.998497],[23.69315,101.998154],[23.69301,101.997803],[23.692869,101.997437],[23.692711,101.99707],[23.692539,101.996696],[23.692381,101.996323],[23.6922,101.995949],[23.692011,101.995567],[23.69183,101.995193],[23.691641,101.994797],[23.691441,101.994423],[23.69125,101.994034],[23.69105,101.993637],[23.690861,101.993248],[23.69066,101.992859],[23.69047,101.992462],[23.690281,101.992073],[23.6901,101.991653],[23.689939,101.991241],[23.689791,101.990822],[23.68964,101.990387],[23.689501,101.989967],[23.689369,101.989563],[23.689251,101.989128],[23.68915,101.988708],[23.689051,101.988281],[23.688971,101.987862],[23.68889,101.987442],[23.68882,101.987022],[23.688761,101.986603],[23.688721,101.986183],[23.688681,101.985764],[23.68865,101.985352],[23.688629,101.98494],[23.68861,101.984528],[23.688589,101.984123],[23.68858,101.983711],[23.68856,101.983307],[23.688551,101.98291],[23.68852,101.982513],[23.68849,101.982101],[23.68845,101.981697],[23.688391,101.981293],[23.688311,101.980888],[23.688219,101.980492],[23.68811,101.980087],[23.68799,101.979691],[23.687851,101.979301],[23.687691,101.978912],[23.687531,101.978523],[23.68737,101.978127],[23.68722,101.977753],[23.687059,101.977364],[23.686899,101.976967],[23.686741,101.976593],[23.68659,101.976212],[23.68643,101.97583],[23.686279,101.975456],[23.686131,101.975098],[23.685961,101.974747],[23.68578,101.974442],[23.685579,101.974136],[23.68536,101.973877],[23.68512,101.973633],[23.684879,101.973412],[23.684629,101.973221],[23.68438,101.973053],[23.684151,101.9729],[23.68383,101.972603],[23.683571,101.972458],[23.68306,101.972168],[23.682819,101.971977],[23.682501,101.971779],[23.682249,101.971626],[23.681971,101.971443],[23.681641,101.971237],[23.681391,101.971077],[23.68115,101.970932],[23.680889,101.970779],[23.68063,101.970627],[23.680349,101.970459],[23.680071,101.970284],[23.679779,101.970108],[23.679489,101.969933],[23.67918,101.969757],[23.678881,101.969597],[23.67857,101.969452],[23.678261,101.96933],[23.67794,101.969223],[23.67762,101.969131],[23.677299,101.969063],[23.67697,101.969009],[23.67663,101.968971],[23.676291,101.968933],[23.675949,101.968887],[23.6756,101.968826],[23.67527,101.968727],[23.67462,101.968483],[23.67432,101.968277],[23.67403,101.968079],[23.67374,101.967857],[23.67345,101.967644],[23.673161,101.96743],[23.672859,101.967239],[23.67255,101.967056],[23.672239,101.966927],[23.67193,101.96682],[23.671619,101.966743],[23.67131,101.966667],[23.671021,101.966621],[23.67075,101.966614],[23.670349,101.966614],[23.66995,101.966637],[23.66091,101.97168],[23.660431,101.971909],[23.66013,101.972076],[23.659809,101.972214],[23.659479,101.972313],[23.65914,101.972366],[23.658791,101.972412],[23.658449,101.97242],[23.65773,101.972427],[23.65737,101.97242],[23.657,101.972412],[23.65662,101.972397],[23.65624,101.972389],[23.655849,101.972366],[23.65547,101.972298],[23.6551,101.97216],[23.654751,101.97197],[23.65443,101.971764],[23.65411,101.971542],[23.65379,101.971336],[23.65346,101.971184],[23.65312,101.971046],[23.652769,101.970978],[23.652399,101.970947],[23.65204,101.970963],[23.651661,101.970993],[23.65127,101.971024],[23.650909,101.971001],[23.65053,101.970917],[23.650181,101.970757],[23.649851,101.970558],[23.649561,101.970299],[23.649281,101.970032],[23.64901,101.969772],[23.64875,101.969513],[23.648491,101.969261],[23.64823,101.969002],[23.64797,101.96875],[23.647699,101.968491],[23.64743,101.968231],[23.64716,101.967957],[23.646891,101.967682],[23.646641,101.967377],[23.64642,101.967056],[23.64624,101.966698],[23.646099,101.966316],[23.645969,101.965927],[23.64583,101.965553],[23.6457,101.965149],[23.645559,101.964767],[23.645399,101.964409],[23.64522,101.964088],[23.644991,101.963814],[23.644739,101.963562],[23.64447,101.963341],[23.643101,101.962318],[23.64275,101.96209],[23.64241,101.961853],[23.642071,101.961632],[23.641741,101.961411],[23.641399,101.961182],[23.641069,101.96096],[23.640751,101.960716],[23.64043,101.96048],[23.640141,101.96022],[23.63987,101.959953],[23.63962,101.959686],[23.638901,101.958862],[23.63866,101.958588],[23.638479,101.958397],[23.63728,101.957024],[23.63489,101.954277],[23.63361,101.952621],[23.633329,101.951576],[23.63299,101.948517],[23.632059,101.946426],[23.63175,101.945503],[23.632021,101.944267],[23.63216,101.943573],[23.632389,101.942902],[23.63249,101.942574],[23.632521,101.942223],[23.632259,101.93898],[23.632299,101.938667],[23.632351,101.938339],[23.63238,101.938011],[23.632401,101.937683],[23.632401,101.937332],[23.63241,101.936653],[23.632389,101.936287],[23.63237,101.935944],[23.632351,101.935593],[23.632339,101.935226],[23.63236,101.934883],[23.63245,101.934517],[23.632561,101.934174],[23.63269,101.93383],[23.63283,101.933472],[23.63298,101.933113],[23.633129,101.932747],[23.633289,101.932404],[23.633591,101.931664],[23.63368,101.931267],[23.633711,101.930862],[23.63368,101.930473],[23.633631,101.930069],[23.63357,101.929688],[23.633459,101.929329],[23.633369,101.92897],[23.63332,101.928612],[23.63331,101.928253],[23.633329,101.927528],[23.63336,101.927162],[23.633511,101.926819],[23.633711,101.926514],[23.63435,101.925613],[23.635139,101.924377],[23.635309,101.923653],[23.63538,101.923286],[23.635441,101.92292],[23.6355,101.922546],[23.635559,101.922188],[23.63562,101.921806],[23.635691,101.921448],[23.635771,101.921082],[23.635851,101.920723],[23.63595,101.920349],[23.636061,101.919983],[23.636169,101.919609],[23.63629,101.919243],[23.63641,101.918869],[23.63653,101.918503],[23.636641,101.918121],[23.636761,101.917747],[23.636869,101.917374],[23.63698,101.917],[23.63711,101.916634],[23.637251,101.916267],[23.637409,101.915909],[23.637581,101.915573],[23.637791,101.915253],[23.63802,101.914963],[23.63826,101.914673],[23.638519,101.914398],[23.638809,101.914162],[23.63909,101.913933],[23.639971,101.913269],[23.640249,101.913033],[23.640499,101.912773],[23.640751,101.912514],[23.64097,101.912216],[23.641159,101.911926],[23.641331,101.911613],[23.64147,101.911301],[23.641581,101.91098],[23.64167,101.91066],[23.641729,101.910339],[23.641781,101.910027],[23.64183,101.909714],[23.64188,101.909401],[23.64193,101.909103],[23.641979,101.908813],[23.64201,101.908386],[23.642031,101.90799],[23.64205,101.9076],[23.642071,101.907204],[23.64213,101.906799],[23.642191,101.906387],[23.64225,101.905983],[23.6423,101.905571],[23.64238,101.905151],[23.642521,101.904739],[23.642651,101.904472],[23.642799,101.904221],[23.642969,101.903976],[23.64316,101.903763],[23.64337,101.903542],[23.643591,101.903343],[23.64382,101.903152],[23.644039,101.902946],[23.64427,101.90274],[23.64447,101.902519],[23.644661,101.902283],[23.644831,101.902023],[23.645029,101.901604],[23.64513,101.901299],[23.64521,101.900993],[23.645281,101.900658],[23.64535,101.900337],[23.64542,101.900009],[23.6455,101.899681],[23.645611,101.899353],[23.645729,101.89904],[23.64588,101.898743],[23.646061,101.898438],[23.646259,101.898163],[23.646469,101.897881],[23.646681,101.897598],[23.646891,101.897301],[23.647091,101.897003],[23.647261,101.896683],[23.647421,101.896362],[23.647539,101.896019],[23.64765,101.895683],[23.64773,101.895317],[23.647791,101.894958],[23.647829,101.894592],[23.647881,101.894234],[23.647921,101.893852],[23.647961,101.893494],[23.64802,101.89312],[23.6481,101.892761],[23.648199,101.892403],[23.648319,101.892067],[23.648451,101.891739],[23.6486,101.891434],[23.64876,101.891121],[23.64893,101.890831],[23.64909,101.890533],[23.64922,101.890244],[23.649361,101.889954],[23.64949,101.889671],[23.649639,101.889397],[23.649771,101.889122],[23.64991,101.888847],[23.650049,101.888573],[23.65019,101.888298],[23.65033,101.888023],[23.650471,101.887733],[23.65062,101.887428],[23.65077,101.887123],[23.650921,101.88681],[23.65107,101.886497],[23.65123,101.886177],[23.65139,101.885849],[23.65156,101.885521],[23.65172,101.885178],[23.65189,101.884842],[23.65204,101.884499],[23.65221,101.884163],[23.65237,101.88382],[23.65254,101.883492],[23.6527,101.883179],[23.652849,101.882874],[23.653009,101.882584],[23.653151,101.882294],[23.653299,101.882019],[23.653521,101.88163],[23.65366,101.881378],[23.653799,101.881149],[23.6539,101.880768],[23.6546,101.878288],[23.65497,101.877052],[23.65519,101.876587],[23.65564,101.875954],[23.657261,101.874313],[23.657681,101.873672],[23.657881,101.873199],[23.65803,101.8722],[23.658001,101.868111],[23.65777,101.867126],[23.657431,101.866409],[23.656799,101.865631],[23.65568,101.864571],[23.65534,101.864098],[23.655069,101.863403],[23.654449,101.860573],[23.653891,101.859253],[23.65309,101.857887],[23.652849,101.857109],[23.6527,101.855202],[23.652519,101.854607],[23.652201,101.854088],[23.65103,101.852982],[23.650789,101.852661],[23.650499,101.851913],[23.65053,101.851082],[23.650631,101.85022],[23.6506,101.849571],[23.650471,101.849152],[23.650129,101.848633],[23.649679,101.848213],[23.647881,101.847023],[23.64748,101.846626],[23.647169,101.846169],[23.64691,101.845627],[23.64591,101.842331],[23.64588,101.841537],[23.646021,101.840973],[23.646509,101.839737],[23.64658,101.839371],[23.646561,101.838982],[23.646391,101.838463],[23.6462,101.838158],[23.645679,101.837677],[23.644739,101.836983],[23.64422,101.836113],[23.643431,101.833298],[23.643379,101.832687],[23.643419,101.832283],[23.643539,101.831909],[23.64373,101.831596],[23.64398,101.831306],[23.644661,101.830681],[23.645029,101.830032],[23.64509,101.829674],[23.645069,101.829277],[23.644979,101.828918],[23.64468,101.82843],[23.64443,101.828194],[23.64377,101.827888],[23.64187,101.827499],[23.641439,101.827347],[23.641121,101.827271],[23.64064,101.827003],[23.64023,101.82666],[23.6397,101.825867],[23.638741,101.824013],[23.63851,101.823723],[23.63822,101.823479],[23.63772,101.823273],[23.634621,101.822853],[23.63373,101.822456],[23.633289,101.822166],[23.63265,101.821503],[23.632271,101.820862],[23.63167,101.819717],[23.631189,101.819206],[23.630751,101.818939],[23.63028,101.818771],[23.629459,101.818718],[23.628241,101.818901],[23.627939,101.818893],[23.62748,101.818764],[23.62705,101.818542],[23.626699,101.818192],[23.62628,101.817398],[23.625401,101.815086],[23.625311,101.814537],[23.62536,101.813812],[23.62553,101.813271],[23.62578,101.812782],[23.627951,101.810028],[23.628139,101.809547],[23.628189,101.809029],[23.62818,101.808868],[23.627979,101.808357],[23.627661,101.807938],[23.627119,101.807632],[23.62405,101.80632],[23.625191,101.808884],[23.62512,101.809036],[23.625,101.80941],[23.624729,101.809753],[23.624331,101.8106],[23.623581,101.811707],[23.623159,101.811996],[23.622641,101.812172],[23.62188,101.81218],[23.619591,101.811241],[23.618839,101.811234],[23.61693,101.811867],[23.616489,101.81189],[23.616039,101.811752],[23.61566,101.81147],[23.615379,101.811073],[23.615351,101.810913],[23.615259,101.810677],[23.61528,101.810501],[23.61525,101.810333],[23.6154,101.809113],[23.61533,101.808052],[23.615101,101.807381],[23.61482,101.806931],[23.61384,101.805931],[23.61338,101.804947],[23.612089,101.804108],[23.606489,101.800911],[23.60602,101.800377],[23.605721,101.79985],[23.60515,101.798477],[23.60471,101.798012],[23.603531,101.797302],[23.602871,101.79673],[23.601749,101.795517],[23.601049,101.794998],[23.600031,101.794533],[23.59981,101.794533],[23.597759,101.793373],[23.59746,101.793297],[23.59713,101.79306],[23.596479,101.792343],[23.59548,101.790649],[23.59395,101.787376],[23.593281,101.787666],[23.593069,101.787567],[23.59271,101.787483],[23.59218,101.787453],[23.591379,101.787331],[23.591049,101.787209],[23.59067,101.786911],[23.588079,101.784103],[23.58736,101.783546],[23.583599,101.781487],[23.58288,101.780853],[23.58206,101.779671],[23.581341,101.77845],[23.579889,101.77681],[23.57777,101.773178],[23.57704,101.772392],[23.57626,101.771942],[23.574301,101.771294],[23.57362,101.770897],[23.569811,101.767776],[23.568859,101.767281],[23.56444,101.765839],[23.563801,101.765472],[23.56325,101.764969],[23.56292,101.764526],[23.56076,101.761436],[23.56049,101.761147],[23.560011,101.760841],[23.559481,101.760651],[23.55802,101.760628],[23.557501,101.760529],[23.55702,101.760277],[23.556749,101.760063],[23.556431,101.759598],[23.55628,101.759247],[23.55587,101.756828],[23.555571,101.756027],[23.55514,101.75531],[23.554581,101.754723],[23.55154,101.752617],[23.55105,101.752113],[23.55064,101.751312],[23.549629,101.747353],[23.5494,101.746819],[23.54907,101.746384],[23.54847,101.745941],[23.547041,101.74514],[23.54565,101.743851],[23.540291,101.738487],[23.52383,101.719322],[23.52364,101.719063],[23.523529,101.718758],[23.523479,101.718697],[23.52347,101.718613],[23.523279,101.718323],[23.522591,101.716637],[23.521999,101.715767],[23.52058,101.714523],[23.52,101.713913],[23.519779,101.713562],[23.51964,101.71315],[23.5196,101.712479],[23.519739,101.711777],[23.521111,101.707848],[23.52124,101.70697],[23.521231,101.706749],[23.52112,101.706306],[23.520889,101.705887],[23.52058,101.705521],[23.520399,101.70536],[23.51824,101.70433],[23.51787,101.704071],[23.51755,101.703743],[23.51734,101.703331],[23.51722,101.702873],[23.51722,101.7024],[23.517321,101.701958],[23.518999,101.698547],[23.51775,101.698097],[23.51767,101.6978],[23.517309,101.697159],[23.51687,101.69648],[23.516701,101.695976],[23.516529,101.69442],[23.51643,101.693939],[23.516211,101.693497],[23.515921,101.693123],[23.515539,101.692818],[23.515129,101.692596],[23.51243,101.691757],[23.51194,101.691704],[23.51141,101.691719],[23.51091,101.691818],[23.50996,101.692207],[23.507971,101.693314],[23.507601,101.693588],[23.50729,101.693932],[23.507059,101.694366],[23.50691,101.694847],[23.506861,101.695351],[23.507,101.696098],[23.50742,101.697243],[23.5075,101.697701],[23.507481,101.698158],[23.507339,101.698608],[23.507099,101.699013],[23.506781,101.699333],[23.506161,101.699654],[23.50526,101.700027],[23.504829,101.700287],[23.504471,101.700638],[23.50415,101.701057],[23.503901,101.701538],[23.503441,101.703049],[23.503309,101.703537],[23.50313,101.703979],[23.50301,101.704163],[23.50268,101.704491],[23.502291,101.70472],[23.501909,101.704857],[23.501499,101.704849],[23.50091,101.704697],[23.50058,101.704491],[23.500111,101.704033],[23.49843,101.701653],[23.498051,101.700943],[23.49762,101.699638],[23.497089,101.697792],[23.49687,101.697281],[23.496441,101.696579],[23.49609,101.696167],[23.493389,101.694],[23.492741,101.693573],[23.49201,101.69326],[23.491501,101.693169],[23.49099,101.693161],[23.49048,101.693253],[23.49,101.69342],[23.482491,101.698227],[23.481791,101.698517],[23.481319,101.698624],[23.47983,101.698692],[23.47933,101.698769],[23.478849,101.698921],[23.47797,101.699402],[23.476339,101.700623],[23.47547,101.701134],[23.474991,101.701286],[23.47427,101.701363],[23.473539,101.701248],[23.47261,101.70092],[23.471729,101.700432],[23.470921,101.699806],[23.4702,101.699051],[23.469601,101.698143],[23.467279,101.693512],[23.4664,101.692177],[23.46524,101.690804],[23.46394,101.689568],[23.462299,101.688393],[23.45648,101.68544],[23.45483,101.684227],[23.451571,101.679291],[23.45013,101.677612],[23.44994,101.67746],[23.449751,101.677254],[23.44949,101.677063],[23.44916,101.676651],[23.44833,101.676033],[23.44721,101.675468],[23.446461,101.675232],[23.445459,101.675049],[23.444201,101.675041],[23.44323,101.675217],[23.43902,101.67688],[23.43664,101.677452],[23.432159,101.677811],[23.43161,101.677773],[23.431431,101.677727],[23.431009,101.677711],[23.43075,101.677757],[23.430719,101.677887],[23.43041,101.678017],[23.42782,101.678543],[23.42403,101.680153],[23.423691,101.680183],[23.42275,101.680458],[23.422331,101.68055],[23.42065,101.680603],[23.41925,101.680367],[23.41754,101.679703],[23.416361,101.679008],[23.41523,101.678017],[23.41408,101.67662],[23.409769,101.67025],[23.409281,101.66922],[23.408991,101.667892],[23.408939,101.666992],[23.40909,101.665619],[23.409439,101.664513],[23.410669,101.661987],[23.4111,101.660606],[23.41157,101.658386],[23.4119,101.657417],[23.41876,101.645554],[23.422489,101.637756],[23.4282,101.62957],[23.42873,101.628517],[23.429131,101.626556],[23.42959,101.622337],[23.42943,101.621048],[23.42898,101.619904],[23.42824,101.618896],[23.427191,101.618149],[23.42573,101.617706],[23.424709,101.617783],[23.42399,101.617973],[23.421801,101.619003],[23.42082,101.619186],[23.41987,101.61908],[23.4189,101.618713],[23.418091,101.617973],[23.417589,101.617203],[23.417191,101.615929],[23.41724,101.6147],[23.41798,101.611702],[23.41794,101.610687],[23.417459,101.60936],[23.417101,101.608871],[23.416019,101.608063],[23.41116,101.606781],[23.410561,101.606598],[23.409781,101.606407],[23.408819,101.605873],[23.40723,101.604347],[23.40661,101.603989],[23.40645,101.603943],[23.40589,101.603752],[23.40432,101.603638],[23.403259,101.603188],[23.40159,101.602028],[23.393909,101.58802],[23.392799,101.586533],[23.392191,101.585709],[23.391319,101.584778],[23.390221,101.583527],[23.38945,101.582977],[23.38868,101.582642],[23.383381,101.580978],[23.382919,101.580917],[23.376631,101.581413],[23.37141,101.58181],[23.370029,101.581902],[23.365709,101.581863],[23.364161,101.581528],[23.36342,101.580582],[23.36319,101.579971],[23.363119,101.57975],[23.36302,101.578888],[23.363171,101.577911],[23.36417,101.574783],[23.36421,101.57399],[23.36409,101.572906],[23.36302,101.568893],[23.362671,101.566399],[23.36252,101.565987],[23.36227,101.565643],[23.36195,101.565338],[23.360991,101.564751],[23.36055,101.564323],[23.36034,101.563942],[23.36025,101.563507],[23.360241,101.563011],[23.36146,101.555557],[23.361481,101.555077],[23.36145,101.554817],[23.3613,101.554359],[23.361059,101.553932],[23.35988,101.552742],[23.359739,101.552559],[23.359541,101.552139],[23.35944,101.551666],[23.359461,101.551193],[23.3596,101.550743],[23.35985,101.550331],[23.360359,101.549797],[23.3624,101.548019],[23.36273,101.547653],[23.363001,101.547234],[23.363171,101.546722],[23.36323,101.546188],[23.363171,101.545624],[23.362129,101.542778],[23.36191,101.542297],[23.361429,101.541649],[23.36083,101.54113],[23.356621,101.539139],[23.355459,101.538544],[23.35391,101.537888],[23.353291,101.53775],[23.35309,101.53775],[23.35268,101.537857],[23.35231,101.538101],[23.352011,101.538452],[23.35129,101.539688],[23.351,101.539993],[23.35067,101.540222],[23.350281,101.540352],[23.349859,101.540367],[23.349211,101.54026],[23.34816,101.539841],[23.347811,101.539619],[23.34753,101.53933],[23.34734,101.538963],[23.34724,101.538513],[23.347269,101.537819],[23.347429,101.53669],[23.34742,101.536232],[23.347321,101.535797],[23.346979,101.535103],[23.346121,101.533829],[23.34573,101.533813],[23.344851,101.533127],[23.344709,101.532967],[23.34454,101.532593],[23.344469,101.532181],[23.344481,101.531754],[23.344749,101.531113],[23.345341,101.530067],[23.34547,101.52964],[23.34549,101.529419],[23.34544,101.528961],[23.345369,101.528732],[23.34515,101.528313],[23.344681,101.527786],[23.343719,101.526917],[23.34347,101.526573],[23.343281,101.526154],[23.34318,101.525703],[23.34318,101.525223],[23.343321,101.52449],[23.343639,101.523193],[23.34362,101.522339],[23.34285,101.519333],[23.34116,101.5177],[23.34013,101.517014],[23.33942,101.516563],[23.33905,101.51619],[23.335939,101.511429],[23.335501,101.510902],[23.335039,101.510536],[23.333469,101.510399],[23.3328,101.510399],[23.332359,101.510406],[23.331421,101.510529],[23.33069,101.510742],[23.33045,101.510841],[23.32917,101.511803],[23.32873,101.512032],[23.328251,101.512169],[23.327749,101.51223],[23.327009,101.512154],[23.323721,101.511398],[23.32324,101.511223],[23.322809,101.510941],[23.322451,101.510597],[23.322161,101.510147],[23.320351,101.505699],[23.32012,101.505348],[23.319851,101.505074],[23.316191,101.503098],[23.316031,101.50293],[23.315781,101.502434],[23.315651,101.501892],[23.315639,101.501511],[23.31591,101.500183],[23.31591,101.499603],[23.31584,101.499207],[23.31547,101.498512],[23.31509,101.4981],[23.313749,101.497139],[23.313049,101.4963],[23.311449,101.493736],[23.310949,101.49324],[23.310511,101.49295],[23.309811,101.492706],[23.309259,101.49263],[23.308701,101.492653],[23.30798,101.492867],[23.307329,101.493263],[23.30624,101.494263],[23.30578,101.494499],[23.30526,101.494598],[23.30475,101.494522],[23.30443,101.494408],[23.304001,101.494133],[23.30332,101.493523],[23.302679,101.493134],[23.302151,101.492973],[23.300329,101.492828],[23.29982,101.492691],[23.29936,101.492416],[23.29896,101.492058],[23.298651,101.49157],[23.29851,101.491203],[23.29841,101.490593],[23.298441,101.489937],[23.29887,101.488731],[23.29994,101.486298],[23.30003,101.485863],[23.300039,101.485397],[23.299959,101.484947],[23.29982,101.484512],[23.29916,101.483093],[23.29899,101.48246],[23.298941,101.479362],[23.29888,101.478943],[23.29845,101.477783],[23.29397,101.471352],[23.293539,101.470367],[23.293381,101.469688],[23.29336,101.469353],[23.293779,101.464844],[23.2936,101.460899],[23.29335,101.459717],[23.29188,101.454727],[23.29196,101.453789],[23.292139,101.453323],[23.29254,101.452782],[23.293091,101.452377],[23.29735,101.450317],[23.29784,101.450218],[23.298019,101.450157],[23.29837,101.45005],[23.300659,101.448982],[23.301109,101.448647],[23.301611,101.448097],[23.30344,101.445053],[23.303631,101.44455],[23.30373,101.44381],[23.303711,101.443443],[23.302691,101.440353],[23.30262,101.439346],[23.303419,101.434143],[23.30341,101.433594],[23.30246,101.428864],[23.30212,101.426933],[23.30205,101.425301],[23.30209,101.423752],[23.30225,101.423042],[23.302509,101.422371],[23.30275,101.421272],[23.30324,101.419991],[23.30357,101.418121],[23.304411,101.41581],[23.30448,101.414879],[23.3043,101.414093],[23.303921,101.412971],[23.30341,101.411713],[23.303289,101.411186],[23.302959,101.410378],[23.302151,101.407608],[23.302019,101.403557],[23.30205,101.399788],[23.301559,101.398216],[23.299601,101.394699],[23.29941,101.394173],[23.298491,101.388153],[23.29851,101.387039],[23.299,101.381798],[23.299179,101.379967],[23.299601,101.375473],[23.29952,101.37381],[23.29854,101.368073],[23.298491,101.367287],[23.298559,101.366814],[23.29862,101.366577],[23.29883,101.366158],[23.298969,101.365967],[23.299129,101.365807],[23.29973,101.365448],[23.30014,101.365318],[23.300591,101.365318],[23.300791,101.365372],[23.301411,101.365631],[23.302679,101.366463],[23.30315,101.366669],[23.305269,101.367111],[23.308611,101.368553],[23.30908,101.368668],[23.309549,101.368683],[23.30978,101.368637],[23.310221,101.368462],[23.31061,101.368179],[23.310921,101.367813],[23.311159,101.367348],[23.311291,101.366852],[23.31131,101.3666],[23.31126,101.366089],[23.31119,101.365829],[23.310949,101.365372],[23.310631,101.36496],[23.31044,101.364777],[23.308399,101.363472],[23.30801,101.363098],[23.30773,101.362648],[23.307541,101.362137],[23.30748,101.361893],[23.30747,101.361351],[23.307541,101.360817],[23.30772,101.360313],[23.30801,101.359863],[23.30838,101.359489],[23.30883,101.3592],[23.309771,101.358704],[23.310181,101.358353],[23.31049,101.357941],[23.31069,101.357468],[23.31078,101.356972],[23.310459,101.352417],[23.31035,101.351883],[23.310141,101.351357],[23.30983,101.350891],[23.309111,101.350021],[23.308661,101.349297],[23.30788,101.347549],[23.3076,101.347076],[23.30723,101.346687],[23.305611,101.345879],[23.305229,101.345596],[23.304939,101.345253],[23.30475,101.344803],[23.304661,101.344322],[23.30468,101.343826],[23.304729,101.343597],[23.30492,101.343163],[23.305201,101.342789],[23.30537,101.342644],[23.306009,101.34227],[23.308861,101.341087],[23.309299,101.340843],[23.309669,101.3405],[23.309959,101.340073],[23.310141,101.3396],[23.31019,101.339104],[23.310141,101.338593],[23.30998,101.338097],[23.309719,101.337692],[23.309549,101.337517],[23.30913,101.337242],[23.308649,101.337067],[23.30817,101.337013],[23.30768,101.337082],[23.30719,101.337273],[23.305771,101.33799],[23.301991,101.340103],[23.30154,101.340286],[23.30106,101.340393],[23.30057,101.34037],[23.29932,101.340088],[23.29855,101.34005],[23.297001,101.340271],[23.29649,101.34024],[23.29598,101.340118],[23.293831,101.339027],[23.293381,101.338768],[23.29261,101.338577],[23.29154,101.338562],[23.288971,101.338783],[23.288191,101.338737],[23.287689,101.338608],[23.287201,101.338387],[23.28404,101.335876],[23.283569,101.335587],[23.283079,101.335388],[23.28257,101.335274],[23.282049,101.335251],[23.281521,101.33532],[23.28101,101.335487],[23.28054,101.335732],[23.27841,101.337212],[23.277769,101.337517],[23.277321,101.337593],[23.27689,101.337547],[23.27648,101.33741],[23.2761,101.337143],[23.27562,101.336594],[23.27515,101.335983],[23.27478,101.335617],[23.274361,101.335373],[23.274139,101.335289],[23.273899,101.335243],[23.273439,101.335251],[23.272051,101.335579],[23.27157,101.335564],[23.27112,101.335403],[23.27072,101.335167],[23.27021,101.334663],[23.26919,101.333076],[23.269051,101.332809],[23.26845,101.332222],[23.267771,101.331757],[23.267241,101.331573],[23.266479,101.33149],[23.265961,101.331558],[23.265221,101.331787],[23.263969,101.332336],[23.263201,101.332497],[23.261641,101.332603],[23.261129,101.332733],[23.260651,101.332947],[23.260201,101.333229],[23.26,101.333397],[23.259661,101.333832],[23.259109,101.334793],[23.259041,101.334999],[23.257879,101.336838],[23.25754,101.337242],[23.256929,101.337769],[23.25646,101.33802],[23.25596,101.338181],[23.255699,101.338219],[23.255159,101.338188],[23.25489,101.338142],[23.24906,101.335602],[23.248369,101.335197],[23.24132,101.329826],[23.24147,101.328873],[23.24135,101.32872],[23.24053,101.327087],[23.24011,101.326118],[23.2397,101.325417],[23.239361,101.325027],[23.23761,101.323486],[23.23728,101.323082],[23.23691,101.322357],[23.236731,101.321823],[23.236641,101.321274],[23.236641,101.320442],[23.23761,101.314987],[23.23786,101.314232],[23.238091,101.313751],[23.23838,101.313309],[23.238939,101.312729],[23.239361,101.312393],[23.240049,101.312019],[23.24082,101.311768],[23.241579,101.311661],[23.24288,101.311569],[23.24366,101.311401],[23.244169,101.311203],[23.24485,101.310791],[23.24724,101.308578],[23.249371,101.306458],[23.25046,101.305717],[23.2514,101.305183],[23.252029,101.304672],[23.25238,101.30426],[23.253401,101.302597],[23.25375,101.3022],[23.254169,101.301857],[23.25576,101.300957],[23.256809,101.300117],[23.25803,101.298683],[23.259621,101.296432],[23.26001,101.295692],[23.260309,101.294907],[23.260509,101.293823],[23.260599,101.28904],[23.260759,101.28791],[23.26182,101.283836],[23.26189,101.283279],[23.261841,101.282417],[23.26166,101.281563],[23.2612,101.280502],[23.25816,101.275703],[23.25787,101.27494],[23.25729,101.272781],[23.25692,101.271729],[23.256861,101.271446],[23.25684,101.270866],[23.25701,101.269768],[23.2575,101.267838],[23.257601,101.266983],[23.257561,101.265312],[23.25761,101.264763],[23.25774,101.264198],[23.25815,101.263153],[23.258499,101.261742],[23.259399,101.259422],[23.26021,101.255463],[23.2605,101.254677],[23.261391,101.253326],[23.26161,101.252808],[23.261709,101.252228],[23.26173,101.251953],[23.26165,101.251404],[23.26148,101.2509],[23.261221,101.25042],[23.257629,101.245293],[23.25453,101.24102],[23.25424,101.240463],[23.25411,101.240051],[23.25407,101.239372],[23.254141,101.238907],[23.25489,101.237106],[23.255079,101.236382],[23.255131,101.235603],[23.25507,101.234787],[23.25494,101.234009],[23.254641,101.232986],[23.253679,101.230522],[23.253099,101.228249],[23.25218,101.224899],[23.252119,101.224251],[23.252159,101.223793],[23.25227,101.223343],[23.25267,101.222473],[23.255369,101.21814],[23.25563,101.217392],[23.255819,101.216293],[23.255989,101.211189],[23.25593,101.210632],[23.255699,101.209801],[23.25515,101.208397],[23.255079,101.207947],[23.255119,101.207291],[23.25556,101.205559],[23.25559,101.204849],[23.255541,101.204369],[23.253651,101.197647],[23.25321,101.190193],[23.253139,101.189636],[23.252899,101.18885],[23.25223,101.187347],[23.252081,101.186821],[23.252029,101.186028],[23.252029,101.184959],[23.251909,101.184181],[23.251471,101.182693],[23.251419,101.182167],[23.251471,101.181671],[23.251711,101.180946],[23.25214,101.179993],[23.252359,101.179207],[23.25268,101.176117],[23.253679,101.172638],[23.253969,101.17189],[23.25404,101.171608],[23.25423,101.17112],[23.25482,101.170181],[23.255159,101.169746],[23.259211,101.165756],[23.259529,101.165337],[23.25967,101.165108],[23.2598,101.164597],[23.25979,101.164093],[23.258751,101.160049],[23.25845,101.159592],[23.258369,101.15921],[23.258289,101.158447],[23.258169,101.158096],[23.257179,101.156563],[23.25629,101.155159],[23.255951,101.154793],[23.255541,101.154503],[23.25308,101.15316],[23.24979,101.150223],[23.247089,101.148514],[23.246321,101.147751],[23.244961,101.146111],[23.244539,101.145798],[23.244101,101.145569],[23.243641,101.145447],[23.243139,101.145439],[23.237881,101.146713],[23.23527,101.146896],[23.23027,101.148399],[23.227171,101.148933],[23.226601,101.149139],[23.226101,101.149513],[23.225031,101.150719],[23.22471,101.150948],[23.22401,101.151237],[23.223459,101.151314],[23.2229,101.151283],[23.21833,101.149529],[23.217529,101.149437],[23.21492,101.150093],[23.214319,101.150146],[23.21393,101.150101],[23.213551,101.149986],[23.212259,101.149292],[23.211651,101.149101],[23.20582,101.149193],[23.20516,101.149101],[23.20451,101.148857],[23.20013,101.146408],[23.197161,101.144211],[23.196699,101.14399],[23.196171,101.143883],[23.19566,101.143867],[23.18998,101.145264],[23.18713,101.146263],[23.182751,101.14782],[23.18214,101.147957],[23.18144,101.147972],[23.17918,101.148079],[23.176701,101.148148],[23.176439,101.148087],[23.1756,101.147591],[23.173691,101.145157],[23.173109,101.144783],[23.17226,101.144508],[23.17214,101.144493],[23.171379,101.144051],[23.17091,101.143517],[23.17028,101.14193],[23.17,101.14164],[23.16972,101.141602],[23.169439,101.141708],[23.168489,101.142616],[23.168249,101.142776],[23.167931,101.142853],[23.16761,101.14283],[23.167219,101.142616],[23.166941,101.142342],[23.165541,101.140137],[23.165371,101.139969],[23.165131,101.139893],[23.1649,101.1399],[23.16469,101.140007],[23.164539,101.140213],[23.16445,101.14048],[23.16448,101.140793],[23.16538,101.143227],[23.16543,101.14357],[23.16539,101.143867],[23.165239,101.144112],[23.16502,101.14431],[23.16489,101.144363],[23.16461,101.144333],[23.16432,101.144157],[23.163019,101.142433],[23.16272,101.142174],[23.162319,101.142067],[23.16206,101.142113],[23.16169,101.142326],[23.16151,101.142563],[23.16139,101.143013],[23.161699,101.14537],[23.161659,101.145683],[23.161551,101.14595],[23.16135,101.146149],[23.16123,101.146217],[23.161091,101.14624],[23.16082,101.146202],[23.16057,101.146072],[23.160259,101.145714],[23.159731,101.144867],[23.159531,101.144707],[23.159149,101.144577],[23.157949,101.144608],[23.157829,101.144577],[23.15764,101.144417],[23.15748,101.144173],[23.15741,101.14389],[23.15745,101.143623],[23.157551,101.143349],[23.159639,101.140259],[23.159769,101.139923],[23.15979,101.139557],[23.159719,101.139076],[23.159531,101.138649],[23.15921,101.138329],[23.156639,101.137047],[23.156389,101.136993],[23.156059,101.137062],[23.1558,101.137283],[23.155689,101.137459],[23.1556,101.137772],[23.155609,101.138649],[23.155491,101.139977],[23.15535,101.140266],[23.15517,101.140411],[23.154699,101.140518],[23.153589,101.140503],[23.15336,101.140556],[23.153191,101.140694],[23.15309,101.140862],[23.152969,101.14135],[23.15296,101.141541],[23.152849,101.141853],[23.152651,101.142036],[23.15243,101.142143],[23.15204,101.142143],[23.15184,101.142113],[23.151449,101.142242],[23.1513,101.14238],[23.15011,101.145851],[23.149879,101.146141],[23.149561,101.146332],[23.149179,101.146339],[23.148781,101.146133],[23.14868,101.146019],[23.14852,101.145737],[23.148199,101.14447],[23.14818,101.144096],[23.148239,101.143761],[23.148491,101.14312],[23.148529,101.142517],[23.14846,101.142067],[23.147579,101.140503],[23.14716,101.139427],[23.146629,101.138603],[23.1465,101.13829],[23.146351,101.137589],[23.146191,101.137383],[23.1458,101.137131],[23.1457,101.137131],[23.14535,101.136864],[23.145149,101.136597],[23.14497,101.136078],[23.145,101.135048],[23.144831,101.134483],[23.144569,101.134003],[23.14341,101.13269],[23.14303,101.131958],[23.14296,101.131317],[23.142981,101.130791],[23.143021,101.13031],[23.14278,101.12957],[23.142031,101.128441],[23.14192,101.12812],[23.14188,101.127731],[23.14192,101.127457],[23.14204,101.12693],[23.141991,101.126511],[23.141701,101.125992],[23.140921,101.124786],[23.140791,101.124329],[23.140751,101.123627],[23.140591,101.123238],[23.13983,101.122459],[23.139219,101.122047],[23.13895,101.121941],[23.13866,101.12191],[23.137951,101.122078],[23.13674,101.122704],[23.135241,101.123283],[23.13401,101.123489],[23.133511,101.123459],[23.13283,101.123253],[23.13246,101.123253],[23.130779,101.123734],[23.130409,101.123901],[23.12991,101.124283],[23.12949,101.124657],[23.129351,101.124763],[23.128851,101.12487],[23.12851,101.124863],[23.126789,101.12442],[23.126419,101.124367],[23.12533,101.124573],[23.12499,101.124588],[23.12468,101.124496],[23.124411,101.124329],[23.124189,101.124077],[23.123911,101.123688],[23.123671,101.123543],[23.1227,101.12326],[23.12211,101.122917],[23.120399,101.121613],[23.119591,101.120728],[23.11902,101.120232],[23.117861,101.119186],[23.11676,101.118294],[23.11643,101.117828],[23.11591,101.116852],[23.115431,101.116112],[23.113951,101.11451],[23.113501,101.114166],[23.112789,101.11393],[23.112261,101.113762],[23.11195,101.113548],[23.111401,101.112953],[23.111071,101.112709],[23.110701,101.112541],[23.110331,101.112419],[23.11002,101.112228],[23.10965,101.111816],[23.10878,101.110573],[23.107849,101.109497],[23.107559,101.1091],[23.10708,101.108177],[23.10644,101.106758],[23.10614,101.105141],[23.106171,101.104942],[23.106541,101.103653],[23.10606,101.099571],[23.10594,101.099129],[23.105619,101.098534],[23.102871,101.095078],[23.102421,101.094269],[23.10216,101.093369],[23.10181,101.091087],[23.10194,101.087334],[23.101749,101.084717],[23.101681,101.084343],[23.10136,101.08358],[23.095289,101.071663],[23.092871,101.062553],[23.09272,101.062317],[23.092489,101.062149],[23.088921,101.061073],[23.08243,101.056297],[23.0809,101.055191],[23.080441,101.055038],[23.078341,101.055092],[23.07649,101.055237],[23.07522,101.055809],[23.074841,101.05587],[23.074341,101.055779],[23.073879,101.055496],[23.073151,101.054863],[23.07061,101.053688],[23.070391,101.053497],[23.07021,101.053238],[23.069651,101.050728],[23.069481,101.050293],[23.06922,101.050041],[23.06679,101.048531],[23.066,101.048271],[23.06559,101.048264],[23.065319,101.048363],[23.0651,101.048523],[23.06461,101.048958],[23.06423,101.049133],[23.063789,101.049156],[23.063459,101.049057],[23.062389,101.048508],[23.059759,101.048233],[23.058189,101.048424],[23.057249,101.048233],[23.05648,101.047813],[23.055799,101.047012],[23.05534,101.046501],[23.055099,101.046356],[23.05422,101.046242],[23.04863,101.048233],[23.04837,101.04837],[23.047871,101.048431],[23.02458,101.048302],[23.024071,101.048157],[23.02363,101.047836],[23.02182,101.045883],[23.01825,101.044289],[23.017651,101.044228],[23.010521,101.045853],[23.01018,101.045998],[23.009899,101.046257],[23.009689,101.0466],[23.00923,101.047546],[23.00905,101.047729],[23.008829,101.047852],[23.008591,101.047897],[23.008221,101.047829],[23.0072,101.047447],[23.00699,101.04744],[23.00671,101.047546],[23.00486,101.049133],[23.004459,101.049347],[23.004141,101.049469],[23.003429,101.049538],[23.002609,101.049538],[23.001209,101.0495],[22.99102,101.050056],[22.990601,101.050232],[22.988979,101.051308],[22.986931,101.052177],[22.983101,101.053596],[22.98258,101.053596],[22.98111,101.053093],[22.980881,101.052917],[22.98064,101.052544],[22.98027,101.051727],[22.980181,101.051598],[22.979851,101.051323],[22.977791,101.050697],[22.977329,101.050682],[22.97683,101.050743],[22.97641,101.05069],[22.976101,101.050507],[22.97517,101.049477],[22.975031,101.049393],[22.97488,101.049339],[22.97471,101.049347],[22.97455,101.049408],[22.974409,101.049507],[22.974291,101.049789],[22.974131,101.051559],[22.973989,101.051819],[22.9736,101.052063],[22.97324,101.052071],[22.97154,101.051743],[22.97117,101.05188],[22.97064,101.052979],[22.9704,101.053261],[22.9699,101.053467],[22.969589,101.053482],[22.96904,101.053253],[22.967541,101.051788],[22.96735,101.051491],[22.967199,101.050926],[22.96707,101.050056],[22.966869,101.04985],[22.96673,101.049789],[22.966591,101.049767],[22.966249,101.049873],[22.96386,101.051697],[22.9636,101.05175],[22.963301,101.051643],[22.959089,101.045609],[22.956141,101.043243],[22.95582,101.042763],[22.95554,101.041786],[22.955561,101.041611],[22.955469,101.041199],[22.95533,101.040993],[22.955111,101.040871],[22.95499,101.04084],[22.95459,101.040916],[22.95439,101.041054],[22.95409,101.041618],[22.95377,101.042618],[22.953621,101.0429],[22.9533,101.043198],[22.95293,101.043343],[22.952551,101.043373],[22.95105,101.043114],[22.94944,101.042679],[22.94734,101.042618],[22.945259,101.041969],[22.943899,101.041206],[22.9433,101.0411],[22.94108,101.041023],[22.940371,101.040817],[22.93914,101.040337],[22.938881,101.040291],[22.937981,101.040459],[22.937111,101.040733],[22.936819,101.040688],[22.93659,101.040581],[22.9363,101.040291],[22.935471,101.038452],[22.934389,101.037483],[22.93408,101.036903],[22.933861,101.03627],[22.93358,101.035828],[22.930759,101.033897],[22.928329,101.0327],[22.92807,101.032654],[22.92779,101.032707],[22.925079,101.034653],[22.923201,101.035942],[22.92071,101.03714],[22.91906,101.038437],[22.918779,101.038589],[22.91832,101.038673],[22.913601,101.038834],[22.90958,101.038292],[22.909451,101.0383],[22.907591,101.039146],[22.90667,101.039864],[22.906139,101.040077],[22.903391,101.040199],[22.9011,101.039917],[22.899839,101.04007],[22.898951,101.040367],[22.894341,101.042671],[22.892481,101.043266],[22.89069,101.044769],[22.890381,101.04493],[22.89023,101.044968],[22.89006,101.044968],[22.88994,101.044899],[22.88973,101.04493],[22.885571,101.044243],[22.885229,101.044144],[22.884729,101.044144],[22.883869,101.044243],[22.882971,101.044228],[22.88155,101.043968],[22.879829,101.044067],[22.87952,101.044228],[22.87929,101.044434],[22.879181,101.044807],[22.87919,101.045258],[22.87907,101.045502],[22.878929,101.045624],[22.878759,101.045647],[22.87855,101.045624],[22.87825,101.045418],[22.87788,101.044594],[22.877769,101.044441],[22.87748,101.044289],[22.87735,101.044273],[22.87706,101.044327],[22.87561,101.045067],[22.87435,101.045563],[22.874069,101.045738],[22.873659,101.046143],[22.87348,101.046463],[22.873461,101.046783],[22.87372,101.047661],[22.873671,101.048126],[22.873381,101.048607],[22.8731,101.049057],[22.87294,101.049553],[22.872959,101.049843],[22.87299,101.051071],[22.873091,101.051468],[22.87307,101.051727],[22.872841,101.052048],[22.87248,101.052231],[22.872129,101.052238],[22.871901,101.052139],[22.871731,101.05201],[22.87158,101.051781],[22.87137,101.051331],[22.870871,101.050537],[22.87031,101.050301],[22.87015,101.050247],[22.86977,101.050247],[22.868971,101.05014],[22.868629,101.050194],[22.86834,101.050377],[22.86783,101.051132],[22.867571,101.051727],[22.86725,101.052254],[22.86702,101.052406],[22.866871,101.052437],[22.86664,101.052406],[22.8664,101.052299],[22.86628,101.0522],[22.86537,101.051041],[22.864679,101.049889],[22.864491,101.049759],[22.86417,101.04966],[22.863911,101.049744],[22.863689,101.049896],[22.86302,101.050751],[22.862921,101.050842],[22.8627,101.050903],[22.862459,101.050858],[22.862341,101.050789],[22.862141,101.050583],[22.86179,101.049911],[22.86162,101.049759],[22.861549,101.049652],[22.861429,101.049568],[22.861179,101.04953],[22.860901,101.049637],[22.86054,101.050079],[22.860201,101.050247],[22.85998,101.050201],[22.859751,101.050087],[22.85951,101.049782],[22.85891,101.049133],[22.858801,101.048973],[22.85874,101.048752],[22.85858,101.04847],[22.85841,101.047997],[22.858,101.047462],[22.857731,101.047256],[22.85655,101.046967],[22.8563,101.046959],[22.855829,101.046768],[22.85537,101.04673],[22.854799,101.046623],[22.85006,101.045921],[22.845831,101.044746],[22.84557,101.044601],[22.84523,101.044167],[22.84511,101.043877],[22.845091,101.043388],[22.845209,101.042717],[22.84556,101.04084],[22.84547,101.039772],[22.84502,101.038681],[22.84433,101.037338],[22.844259,101.03698],[22.84441,101.03569],[22.84409,101.032707],[22.843941,101.032372],[22.84374,101.032219],[22.843361,101.032143],[22.84267,101.032249],[22.842449,101.032204],[22.84227,101.032082],[22.84207,101.03154],[22.84198,101.029114],[22.842051,101.028877],[22.842239,101.02861],[22.84289,101.028084],[22.843069,101.027802],[22.843121,101.027473],[22.842661,101.025063],[22.84259,101.023514],[22.8423,101.022087],[22.842039,101.021744],[22.841921,101.021637],[22.840469,101.021187],[22.83992,101.020882],[22.839251,101.020699],[22.83877,101.020607],[22.83643,101.020943],[22.83602,101.020882],[22.83543,101.020538],[22.835251,101.02018],[22.835159,101.019417],[22.835239,101.019051],[22.835609,101.018333],[22.835791,101.017487],[22.83559,101.016022],[22.835461,101.015701],[22.835409,101.015404],[22.83482,101.014267],[22.83457,101.014038],[22.83433,101.013992],[22.833139,101.014503],[22.83259,101.014458],[22.831869,101.014343],[22.83053,101.014374],[22.830259,101.014282],[22.83005,101.014122],[22.82991,101.013893],[22.82984,101.013634],[22.829969,101.011917],[22.829901,101.011574],[22.829679,101.011261],[22.82835,101.010513],[22.82818,101.01033],[22.82806,101.010017],[22.828091,101.009712],[22.82819,101.009499],[22.828621,101.008827],[22.82872,101.008507],[22.828699,101.008148],[22.828489,101.007767],[22.828329,101.007561],[22.828199,101.007271],[22.82818,101.006958],[22.828251,101.006508],[22.82892,101.004562],[22.828939,101.004387],[22.82892,101.004211],[22.82877,101.003937],[22.828609,101.00386],[22.82851,101.003838],[22.827129,101.004417],[22.82692,101.004593],[22.8267,101.004982],[22.82649,101.006523],[22.82633,101.00679],[22.82616,101.006943],[22.82592,101.007004],[22.825689,101.006958],[22.82403,101.006088],[22.823681,101.00605],[22.82346,101.006119],[22.82337,101.006187],[22.82324,101.006432],[22.823219,101.006813],[22.82399,101.008453],[22.82399,101.008774],[22.823879,101.008957],[22.823681,101.009087],[22.82329,101.009109],[22.822479,101.008789],[22.8221,101.00872],[22.82177,101.008583],[22.821529,101.008583],[22.820789,101.008713],[22.81996,101.008583],[22.81974,101.008629],[22.81953,101.008781],[22.81933,101.009148],[22.819201,101.009819],[22.818939,101.010223],[22.81875,101.01033],[22.81855,101.010323],[22.81834,101.010223],[22.81811,101.009933],[22.81785,101.008659],[22.817579,101.008057],[22.817181,101.007607],[22.81698,101.007149],[22.816971,101.006393],[22.817101,101.005531],[22.81698,101.004761],[22.81669,101.004066],[22.81662,101.003967],[22.816351,101.003433],[22.816111,101.00322],[22.8158,101.003128],[22.815439,101.003159],[22.81422,101.003883],[22.813881,101.003998],[22.81366,101.004013],[22.813259,101.003754],[22.81312,101.00354],[22.813089,101.003281],[22.813181,101.002853],[22.813629,101.002243],[22.81424,101.001587],[22.814421,101.00119],[22.81451,100.999588],[22.81435,100.99884],[22.813931,100.997803],[22.81389,100.997131],[22.8141,100.995453],[22.81406,100.995247],[22.813869,100.99498],[22.81354,100.994713],[22.812071,100.994713],[22.811621,100.994812],[22.811399,100.994797],[22.811131,100.994667],[22.811001,100.994537],[22.810301,100.993599],[22.810169,100.99321],[22.809681,100.992577],[22.808121,100.991653],[22.80743,100.990997],[22.80442,100.986687],[22.803289,100.985558],[22.800989,100.9842],[22.79668,100.982613],[22.79608,100.982559],[22.795641,100.98262],[22.79413,100.983139],[22.79402,100.983147],[22.78949,100.984673],[22.78833,100.984734],[22.78718,100.984337],[22.786381,100.98378],[22.785009,100.982468],[22.783701,100.981873],[22.78307,100.981773],[22.778049,100.982323],[22.775881,100.981888],[22.773491,100.98156],[22.77161,100.981628],[22.770651,100.981438],[22.76981,100.98101],[22.769211,100.980476],[22.76837,100.979477],[22.76026,100.960899],[22.757999,100.955803],[22.757441,100.955391],[22.75708,100.955048],[22.75721,100.954697],[22.757549,100.954514],[22.75704,100.954567],[22.755301,100.954819],[22.75485,100.955139],[22.7547,100.95517],[22.75456,100.955002],[22.75416,100.954086],[22.7537,100.952957],[22.75363,100.952232],[22.753639,100.951859],[22.753731,100.95031],[22.75379,100.949226],[22.75386,100.948143],[22.753901,100.947762],[22.754181,100.947342],[22.754499,100.947273],[22.75466,100.947357],[22.75481,100.947609],[22.754841,100.947906],[22.754721,100.948082],[22.75465,100.948151],[22.75444,100.948288],[22.75411,100.948311],[22.753559,100.948311],[22.751921,100.947998],[22.75135,100.947693],[22.74992,100.946747],[22.74894,100.945709],[22.74827,100.944641],[22.74794,100.943817],[22.747869,100.943604],[22.747629,100.942703],[22.74728,100.940529],[22.747,100.939323],[22.746799,100.938171],[22.74645,100.937271],[22.74609,100.936653],[22.74593,100.936523],[22.74559,100.936256],[22.745041,100.935921],[22.744431,100.935699],[22.743589,100.935547],[22.74295,100.935478],[22.742531,100.935432],[22.742319,100.93541],[22.74148,100.935318],[22.740669,100.935219],[22.73987,100.935173],[22.73967,100.935181],[22.738371,100.935532],[22.737089,100.935951],[22.737221,100.937561],[22.736879,100.938103],[22.736759,100.93824],[22.736469,100.938568],[22.735411,100.939491],[22.735109,100.939758],[22.73385,100.938789],[22.73255,100.937866],[22.73188,100.937424],[22.7313,100.937263],[22.73031,100.937019],[22.72901,100.936897],[22.72834,100.93692],[22.727659,100.936996],[22.726971,100.937157],[22.72587,100.937553],[22.725189,100.937759],[22.72473,100.937843],[22.72377,100.937927],[22.723061,100.937889],[22.72282,100.937859],[22.72212,100.937721],[22.721439,100.937607],[22.72052,100.937538],[22.71982,100.937569],[22.718861,100.937721],[22.71837,100.937798],[22.71788,100.937851],[22.71763,100.937859],[22.716881,100.937851],[22.716391,100.937813],[22.715691,100.937683],[22.714161,100.937149],[22.71335,100.936859],[22.70923,100.935532],[22.706129,100.935272],[22.7059,100.935303],[22.70228,100.935913],[22.698429,100.936508],[22.697969,100.936501],[22.695841,100.935799],[22.69434,100.934319],[22.693859,100.933487],[22.692881,100.931847],[22.692579,100.931488],[22.69058,100.929947],[22.688129,100.929352],[22.687429,100.929367],[22.686251,100.929581],[22.68441,100.93026],[22.684179,100.930351],[22.6835,100.930618],[22.68281,100.93087],[22.681641,100.931152],[22.680941,100.93116],[22.68004,100.930992],[22.678801,100.930367],[22.67804,100.92984],[22.677851,100.92971],[22.675659,100.928902],[22.67326,100.929527],[22.673059,100.929657],[22.672211,100.930489],[22.671471,100.931808],[22.67083,100.933502],[22.67029,100.934967],[22.66975,100.936409],[22.669571,100.936882],[22.668791,100.938911],[22.668209,100.940453],[22.667789,100.941566],[22.667259,100.942947],[22.666759,100.944099],[22.666229,100.944946],[22.66468,100.94651],[22.664499,100.946678],[22.663601,100.9478],[22.6632,100.94841],[22.66169,100.949921],[22.661079,100.950256],[22.65884,100.951897],[22.65867,100.952042],[22.65498,100.95533],[22.652889,100.957962],[22.650261,100.962303],[22.649429,100.963142],[22.646749,100.965019],[22.64267,100.968117],[22.637991,100.972588],[22.635099,100.975403],[22.634501,100.975807],[22.63336,100.976723],[22.632851,100.977272],[22.63204,100.97821],[22.630671,100.979149],[22.62907,100.979347],[22.626699,100.979889],[22.62571,100.98082],[22.625561,100.981003],[22.625271,100.981339],[22.624451,100.982117],[22.621981,100.983459],[22.621571,100.983727],[22.62063,100.984596],[22.62031,100.985008],[22.619671,100.986153],[22.619551,100.986382],[22.61792,100.989319],[22.617081,100.990868],[22.616619,100.99173],[22.615801,100.99321],[22.615339,100.994034],[22.613991,100.99749],[22.61388,100.99794],[22.613501,101.000053],[22.613371,101.000763],[22.612659,101.004387],[22.612049,101.00573],[22.611759,101.006104],[22.610201,101.00721],[22.609751,101.007362],[22.607679,101.007797],[22.606541,101.008034],[22.605619,101.008209],[22.604639,101.006989],[22.60265,101.008003],[22.602079,101.008499],[22.601891,101.008682],[22.600941,101.009567],[22.60054,101.009903],[22.599701,101.010483],[22.599489,101.010628],[22.598221,101.011467],[22.59697,101.012291],[22.595961,101.013023],[22.5944,101.014282],[22.5931,101.015518],[22.59235,101.016289],[22.591801,101.016899],[22.591261,101.017517],[22.590919,101.01796],[22.59057,101.018387],[22.59005,101.01902],[22.589531,101.019653],[22.58902,101.020264],[22.58886,101.020462],[22.58802,101.021461],[22.58716,101.0224],[22.5863,101.023323],[22.5856,101.024063],[22.58543,101.024239],[22.58489,101.024803],[22.583969,101.025703],[22.583059,101.026604],[22.582319,101.027351],[22.58213,101.027542],[22.58135,101.02832],[22.580959,101.028717],[22.58037,101.029327],[22.579769,101.02993],[22.579161,101.03051],[22.578529,101.031021],[22.577629,101.031601],[22.576929,101.031967],[22.57407,101.032806],[22.57268,101.033127],[22.569481,101.033974],[22.566851,101.035629],[22.564631,101.038254],[22.562571,101.04084],[22.561569,101.042],[22.56105,101.042549],[22.55653,101.046677],[22.551979,101.050056],[22.549089,101.051498],[22.54871,101.051857],[22.547211,101.054031],[22.545851,101.055611],[22.54336,101.057426],[22.538851,101.060677],[22.536671,101.062241],[22.535339,101.063202],[22.53406,101.064117],[22.53334,101.064636],[22.533159,101.064774],[22.532261,101.065422],[22.530951,101.066353],[22.53075,101.06649],[22.52914,101.067642],[22.527901,101.068542],[22.52706,101.069153],[22.525999,101.069908],[22.52557,101.070213],[22.524731,101.070824],[22.523899,101.071411],[22.523279,101.071854],[22.52087,101.073593],[22.519039,101.074821],[22.515511,101.076576],[22.51333,101.077263],[22.51284,101.077393],[22.507811,101.078346],[22.502991,101.079971],[22.4993,101.081062],[22.49831,101.081284],[22.497311,101.081467],[22.49608,101.081688],[22.4951,101.081871],[22.49365,101.082123],[22.49098,101.082588],[22.49074,101.082626],[22.48781,101.08316],[22.48311,101.084023],[22.479179,101.084732],[22.47846,101.084869],[22.47751,101.085037],[22.47727,101.085091],[22.474871,101.085403],[22.472151,101.084801],[22.47193,101.084686],[22.469971,101.083214],[22.46851,101.081123],[22.46838,101.080887],[22.46525,101.076134],[22.46405,101.075218],[22.46118,101.073936],[22.46097,101.07383],[22.46055,101.073578],[22.46015,101.073303],[22.45813,101.071114],[22.454941,101.066788],[22.45241,101.063629],[22.451441,101.062912],[22.450809,101.062576],[22.450399,101.062378],[22.449249,101.061684],[22.44907,101.061531],[22.448311,101.060661],[22.44747,101.058617],[22.44726,101.057877],[22.447041,101.057114],[22.446621,101.055618],[22.44656,101.055382],[22.44626,101.054199],[22.446159,101.053268],[22.44618,101.052567],[22.446199,101.052338],[22.44644,101.051201],[22.44669,101.050537],[22.446791,101.050323],[22.44743,101.049301],[22.44944,101.047501],[22.45256,101.045052],[22.45421,101.043716],[22.45508,101.042671],[22.455469,101.041603],[22.45558,101.040413],[22.455441,101.039482],[22.455299,101.039047],[22.454571,101.037857],[22.453421,101.036743],[22.452419,101.035797],[22.451059,101.034531],[22.44902,101.032204],[22.448139,101.03109],[22.448,101.030907],[22.447321,101.030052],[22.446791,101.029404],[22.446239,101.028793],[22.445601,101.028267],[22.445089,101.027977],[22.44455,101.027733],[22.44379,101.027473],[22.442869,101.027039],[22.44202,101.026077],[22.441919,101.025887],[22.440689,101.022301],[22.439899,101.018692],[22.43993,101.01844],[22.44076,101.016403],[22.441521,101.014671],[22.441589,101.013519],[22.441429,101.012611],[22.441191,101.011757],[22.440969,101.010933],[22.44091,101.010727],[22.440741,101.010117],[22.44063,101.009697],[22.44046,101.009087],[22.440399,101.008888],[22.44026,101.008293],[22.43997,101.007103],[22.43926,101.005013],[22.438971,101.004204],[22.43878,101.003777],[22.43825,101.003036],[22.43762,101.002419],[22.437071,101.002037],[22.435881,101.001503],[22.43569,101.001411],[22.43453,101.000877],[22.432699,101.00032],[22.431379,100.999817],[22.429871,100.999237],[22.429649,100.999161],[22.42835,100.998688],[22.42729,100.998253],[22.425751,100.997887],[22.425079,100.997864],[22.424191,100.99781],[22.422859,100.997726],[22.42264,100.997711],[22.42198,100.997673],[22.42152,100.996429],[22.421169,100.995857],[22.420839,100.995033],[22.420691,100.994614],[22.420389,100.993767],[22.42004,100.992973],[22.41968,100.992416],[22.41955,100.992264],[22.41909,100.991814],[22.418539,100.991493],[22.41814,100.991341],[22.417721,100.991249],[22.416821,100.99128],[22.41659,100.991333],[22.414579,100.991943],[22.413879,100.992104],[22.41272,100.992363],[22.412491,100.992409],[22.412029,100.992523],[22.411489,100.99173],[22.410629,100.991402],[22.409349,100.990982],[22.408449,100.990921],[22.40686,100.991699],[22.406151,100.992973],[22.406,100.993713],[22.40591,100.994217],[22.40572,100.995506],[22.405109,100.997917],[22.40416,100.998901],[22.403561,100.999229],[22.40292,100.999512],[22.40205,100.999962],[22.40163,101.000214],[22.401421,101.000351],[22.400829,101.000778],[22.40065,101.000923],[22.399929,101.001457],[22.398781,101.001991],[22.39797,101.001999],[22.39777,101.001953],[22.39657,101.001633],[22.396379,101.001579],[22.39558,101.001373],[22.39538,101.001312],[22.39526,100.999611],[22.394581,100.999031],[22.39352,100.99868],[22.39287,100.998627],[22.39201,100.998672],[22.391159,100.998779],[22.390329,100.998871],[22.389509,100.99894],[22.38932,100.998947],[22.38833,100.999069],[22.38817,100.999077],[22.38769,100.999107],[22.386909,100.999184],[22.386049,100.999191],[22.385309,100.99913],[22.38492,100.999077],[22.384109,100.998894],[22.38331,100.998627],[22.38269,100.998428],[22.382271,100.998299],[22.38162,100.9981],[22.381399,100.998016],[22.379789,100.997589],[22.37746,100.997719],[22.37701,100.997803],[22.37565,100.99794],[22.374069,100.997757],[22.371149,100.996773],[22.36879,100.996872],[22.36677,100.998077],[22.36544,100.998917],[22.363939,100.999222],[22.36371,100.999207],[22.361771,100.998497],[22.361561,100.998383],[22.36068,100.997917],[22.35667,100.996277],[22.355659,100.996132],[22.35545,100.996094],[22.3552,100.996048],[22.35351,100.995506],[22.352989,100.995354],[22.35206,100.994911],[22.351191,100.9944],[22.350361,100.99382],[22.349239,100.992828],[22.3489,100.992477],[22.347679,100.990936],[22.34753,100.990723],[22.347231,100.990303],[22.3466,100.989418],[22.346451,100.989197],[22.345881,100.988319],[22.3456,100.987877],[22.344879,100.987053],[22.34469,100.986832],[22.3444,100.986397],[22.343929,100.985764],[22.34325,100.984917],[22.342899,100.98452],[22.34236,100.983963],[22.341551,100.983261],[22.341339,100.983093],[22.340931,100.982758],[22.340309,100.982277],[22.33968,100.98185],[22.33882,100.981354],[22.337931,100.980911],[22.337259,100.980621],[22.33658,100.980331],[22.335899,100.980011],[22.335011,100.979507],[22.334351,100.979088],[22.333929,100.978783],[22.333309,100.978302],[22.33271,100.977814],[22.332319,100.97747],[22.33115,100.976021],[22.33066,100.975357],[22.33033,100.974922],[22.32984,100.974281],[22.32935,100.97364],[22.328871,100.973007],[22.328541,100.972603],[22.328211,100.972168],[22.327511,100.971367],[22.32696,100.970787],[22.32638,100.970261],[22.325781,100.969727],[22.32449,100.968719],[22.323839,100.968231],[22.322981,100.967537],[22.32235,100.966988],[22.32173,100.966423],[22.32111,100.965813],[22.320511,100.965157],[22.31974,100.964256],[22.319361,100.963791],[22.319,100.963318],[22.31883,100.963081],[22.318489,100.962601],[22.318001,100.961853],[22.317539,100.961113],[22.31683,100.959846],[22.3167,100.959587],[22.316441,100.959053],[22.31583,100.95768],[22.315411,100.956596],[22.31521,100.956093],[22.314989,100.955597],[22.314751,100.955116],[22.31435,100.954437],[22.31389,100.953796],[22.31356,100.953377],[22.3132,100.953003],[22.313021,100.952812],[22.312639,100.952461],[22.312241,100.952141],[22.31143,100.951508],[22.310619,100.950844],[22.309799,100.950172],[22.30938,100.949837],[22.30875,100.949333],[22.30834,100.948967],[22.30776,100.948433],[22.307011,100.947678],[22.30665,100.947304],[22.30629,100.94693],[22.305771,100.946358],[22.30448,100.944847],[22.302361,100.942863],[22.30135,100.942192],[22.300039,100.941544],[22.29891,100.941139],[22.298679,100.941078],[22.29401,100.939636],[22.29364,100.939407],[22.29315,100.939018],[22.292601,100.938454],[22.292191,100.937828],[22.291941,100.937363],[22.29166,100.936699],[22.29142,100.936028],[22.291241,100.935516],[22.291,100.934837],[22.290689,100.933968],[22.29043,100.933243],[22.290171,100.932518],[22.289909,100.931793],[22.28965,100.931053],[22.28944,100.930489],[22.289181,100.929733],[22.288919,100.92897],[22.288719,100.928398],[22.288429,100.927658],[22.288191,100.927109],[22.28772,100.926224],[22.28751,100.925888],[22.28701,100.925056],[22.286711,100.924561],[22.286501,100.924217],[22.2857,100.922897],[22.283091,100.922768],[22.2829,100.922638],[22.282551,100.92234],[22.282061,100.921547],[22.28171,100.920723],[22.281401,100.919838],[22.28109,100.919243],[22.280649,100.918709],[22.280479,100.918556],[22.279711,100.918083],[22.27906,100.917793],[22.27845,100.917397],[22.27788,100.916908],[22.27706,100.91597],[22.276711,100.915627],[22.27635,100.915314],[22.275961,100.915047],[22.275339,100.914749],[22.274691,100.91449],[22.27426,100.914291],[22.273479,100.913727],[22.27298,100.913193],[22.27249,100.912582],[22.271811,100.911751],[22.271299,100.911133],[22.2708,100.9105],[22.270121,100.909691],[22.269621,100.909081],[22.26911,100.908478],[22.2686,100.907867],[22.267941,100.907059],[22.26745,100.906471],[22.26729,100.906281],[22.266529,100.905327],[22.26638,100.905159],[22.266109,100.904793],[22.265181,100.903084],[22.26512,100.902878],[22.26486,100.901817],[22.264759,100.901176],[22.264681,100.900543],[22.26461,100.900162],[22.264441,100.899437],[22.264219,100.898758],[22.264151,100.89859],[22.263769,100.897781],[22.262951,100.896568],[22.26133,100.89476],[22.25939,100.892632],[22.257799,100.890877],[22.25618,100.889526],[22.254049,100.888847],[22.252899,100.888924],[22.249889,100.889832],[22.24725,100.890663],[22.24247,100.892181],[22.24225,100.89225],[22.241619,100.892464],[22.240801,100.892723],[22.240601,100.892776],[22.239651,100.893082],[22.23909,100.89325],[22.237379,100.893532],[22.23546,100.892883],[22.233191,100.891357],[22.23279,100.891243],[22.229931,100.891037],[22.227671,100.891037],[22.22744,100.891037],[22.22624,100.890999],[22.226,100.890961],[22.22529,100.890846],[22.224819,100.890739],[22.222071,100.889473],[22.221689,100.889198],[22.220579,100.88842],[22.217211,100.886803],[22.216749,100.886673],[22.21537,100.886177],[22.215151,100.88607],[22.213539,100.884918],[22.21335,100.884743],[22.21269,100.883972],[22.211559,100.88224],[22.21076,100.881287],[22.209181,100.880188],[22.20785,100.879623],[22.20566,100.878441],[22.20363,100.876953],[22.20343,100.876793],[22.20179,100.875679],[22.20072,100.875061],[22.199169,100.874298],[22.19618,100.873253],[22.19453,100.872864],[22.192659,100.872551],[22.191271,100.872337],[22.189659,100.872108],[22.18873,100.872002],[22.18466,100.871529],[22.184441,100.871552],[22.18379,100.871658],[22.18276,100.872009],[22.18195,100.872292],[22.181749,100.872353],[22.18115,100.872498],[22.18075,100.872551],[22.17971,100.872528],[22.1782,100.872253],[22.17522,100.871643],[22.17458,100.871513],[22.1733,100.871239],[22.172661,100.871101],[22.17029,100.87149],[22.168579,100.872566],[22.16478,100.875488],[22.164101,100.877136],[22.164101,100.878738],[22.16431,100.880547],[22.163891,100.882553],[22.162741,100.884567],[22.16111,100.888344],[22.15967,100.889977],[22.15947,100.890106],[22.15798,100.8908],[22.156429,100.891068],[22.154831,100.890587],[22.15423,100.890297],[22.15365,100.889992],[22.15346,100.889893],[22.15308,100.889687],[22.1521,100.889374],[22.1511,100.889267],[22.1509,100.889297],[22.15032,100.889381],[22.149731,100.889503],[22.1486,100.889763],[22.147829,100.889931],[22.146811,100.890137],[22.146601,100.890182],[22.1453,100.890213],[22.1434,100.889481],[22.141661,100.88871],[22.14024,100.888573],[22.13888,100.88858],[22.13842,100.888573],[22.136339,100.888329],[22.13586,100.888229],[22.13463,100.888077],[22.133619,100.88813],[22.133141,100.88826],[22.132429,100.888542],[22.13179,100.888947],[22.13122,100.889442],[22.13084,100.889793],[22.130289,100.890343],[22.13011,100.890518],[22.129749,100.890877],[22.12937,100.891243],[22.12919,100.891434],[22.128811,100.891777],[22.128059,100.892509],[22.12748,100.893066],[22.127279,100.893272],[22.12668,100.893837],[22.125839,100.894562],[22.125389,100.894897],[22.124491,100.895523],[22.12426,100.895668],[22.123569,100.896049],[22.12311,100.896271],[22.122881,100.896378],[22.121969,100.896767],[22.12151,100.896927],[22.121059,100.897087],[22.120359,100.897293],[22.1199,100.8974],[22.119209,100.897537],[22.118031,100.897697],[22.117319,100.897758],[22.117081,100.897774],[22.116381,100.897797],[22.115919,100.897781],[22.115219,100.897751],[22.114771,100.897697],[22.11454,100.897667],[22.113411,100.897438],[22.113171,100.897377],[22.112221,100.897087],[22.1113,100.896767],[22.109541,100.896072],[22.109329,100.896004],[22.108931,100.895844],[22.107821,100.895363],[22.10671,100.894867],[22.1063,100.894707],[22.105659,100.894447],[22.104509,100.894028],[22.10401,100.893913],[22.102751,100.893784],[22.102249,100.893806],[22.10034,100.894386],[22.09577,100.896683],[22.09535,100.896889],[22.09514,100.897003],[22.091,100.899063],[22.09016,100.899467],[22.08934,100.899872],[22.0875,100.90078],[22.086281,100.901398],[22.086069,100.901497],[22.084459,100.90229],[22.082359,100.903587],[22.08218,100.90374],[22.080879,100.904747],[22.08029,100.905144],[22.079691,100.905487],[22.07802,100.906349],[22.076559,100.907097],[22.074671,100.908073],[22.074459,100.90818],[22.07284,100.909088],[22.072651,100.909233],[22.071779,100.910347],[22.07155,100.911049],[22.07114,100.91275],[22.07007,100.914352],[22.06971,100.914612],[22.06798,100.915222],[22.06732,100.915314],[22.06707,100.915398],[22.067011,100.915398],[22.066839,100.915367],[22.06671,100.915428],[22.06671,100.915428],[22.066191,100.915527],[22.065809,100.915627],[22.065701,100.915657],[22.0648,100.915863],[22.064171,100.915993],[22.06389,100.916054],[22.063181,100.916206],[22.06303,100.916252],[22.06241,100.916389],[22.06175,100.916527],[22.061239,100.916649],[22.059919,100.916832],[22.05904,100.916962],[22.05825,100.916946],[22.05735,100.916603],[22.05529,100.916061],[22.052691,100.91539],[22.043591,100.899223],[22.04199,100.896301],[22.040911,100.894302],[22.04068,100.893753],[22.04048,100.893158],[22.040251,100.892387],[22.04018,100.892197],[22.03977,100.891548],[22.039471,100.891258],[22.03857,100.890778],[22.03838,100.890678],[22.037889,100.890312],[22.037439,100.889587],[22.037371,100.889359],[22.03727,100.888687],[22.03849,100.887321],[22.038231,100.886932],[22.03797,100.886543],[22.03784,100.886353],[22.037319,100.885567],[22.03694,100.884987],[22.0368,100.884804],[22.03665,100.884613],[22.03618,100.885109],[22.035931,100.885269],[22.03573,100.885452],[22.035629,100.886169],[22.035851,100.886627],[22.036329,100.887131],[22.03694,100.887589],[22.037371,100.887947],[22.037769,100.888542],[22.038059,100.889397],[22.038601,100.890022],[22.038759,100.890091],[22.03908,100.890213],[22.039551,100.890381],[22.039709,100.890427],[22.040171,100.890617],[22.04055,100.890907],[22.04085,100.891487],[22.04088,100.891983],[22.040859,100.892303],[22.041019,100.893082],[22.04133,100.893448],[22.04187,100.893829],[22.042009,100.893929],[22.04236,100.894287],[22.042669,100.894897],[22.042761,100.895416],[22.04281,100.89608],[22.04302,100.896843],[22.043171,100.8974],[22.043329,100.897919],[22.04336,100.898033],[22.04343,100.898308],[22.043329,100.898941],[22.043221,100.899231],[22.04311,100.89959],[22.04307,100.899696],[22.042959,100.900017],[22.042801,100.900459],[22.04266,100.901329],[22.04273,100.901848],[22.042891,100.902496],[22.043011,100.903023],[22.04307,100.90329],[22.0431,100.903831],[22.04306,100.904114],[22.04298,100.904373],[22.042709,100.904846],[22.0425,100.905212],[22.042471,100.90583],[22.042601,100.906067],[22.042801,100.906258],[22.043329,100.906708],[22.04343,100.906807],[22.0436,100.907654],[22.04347,100.907928],[22.0432,100.908363],[22.042931,100.908813],[22.042509,100.909538],[22.042471,100.910461],[22.0427,100.910889],[22.042801,100.911018],[22.04372,100.911949],[22.043859,100.912079],[22.044359,100.912582],[22.04472,100.913528],[22.04451,100.913986],[22.04413,100.91433],[22.043119,100.915154],[22.04287,100.915573],[22.04269,100.916199],[22.04266,100.916359],[22.042521,100.917137],[22.04232,100.917717],[22.042139,100.918114],[22.04208,100.918228],[22.041771,100.919312],[22.041821,100.920036],[22.041901,100.920273],[22.04212,100.920998],[22.041929,100.921722],[22.041439,100.922592],[22.04129,100.924171],[22.04126,100.92466],[22.04137,100.925926],[22.041439,100.926308],[22.0415,100.928253],[22.041519,100.929138],[22.04121,100.929947],[22.0408,100.930191],[22.038839,100.931381],[22.03824,100.932617],[22.03816,100.932838],[22.03783,100.933723],[22.0376,100.93438],[22.03727,100.935242],[22.037001,100.935867],[22.03648,100.936867],[22.035589,100.938187],[22.03503,100.938904],[22.03474,100.939247],[22.03359,100.940689],[22.03301,100.941406],[22.032301,100.942299],[22.031099,100.943787],[22.03026,100.94487],[22.029539,100.945839],[22.029261,100.946281],[22.029091,100.946602],[22.02861,100.94767],[22.028391,100.948227],[22.02833,100.948433],[22.02803,100.949387],[22.02774,100.950394],[22.027679,100.950592],[22.02737,100.95163],[22.027,100.952888],[22.026939,100.953102],[22.0266,100.954163],[22.026011,100.955406],[22.02549,100.956146],[22.02519,100.956497],[22.02504,100.956673],[22.02302,100.958931],[22.02248,100.959717],[22.02177,100.960983],[22.021351,100.961884],[22.021231,100.962097],[22.020651,100.963203],[22.019051,100.965302],[22.01857,100.965767],[22.017229,100.967117],[22.016939,100.967453],[22.01679,100.967613],[22.016109,100.968483],[22.01552,100.96946],[22.015409,100.969658],[22.015011,100.970444],[22.01482,100.970802],[22.014271,100.971931],[22.014071,100.972328],[22.013821,100.972816],[22.013639,100.97316],[22.01335,100.973732],[22.01317,100.974136],[22.01281,100.974823],[22.011311,100.976913],[22.011169,100.977074],[22.010731,100.977562],[22.01045,100.97789],[22.010059,100.978409],[22.00983,100.978767],[22.00942,100.979523],[22.00905,100.980263],[22.0086,100.981056],[22.008369,100.981331],[22.00786,100.981812],[22.007601,100.982002],[22.007469,100.982094],[22.00699,100.982437],[22.006559,100.982841],[22.00647,100.982948],[22.005951,100.983681],[22.005751,100.9841],[22.005449,100.985153],[22.005381,100.985611],[22.00523,100.986397],[22.0049,100.987267],[22.00474,100.987556],[22.00428,100.98819],[22.00396,100.988487],[22.003151,100.989082],[22.00243,100.989517],[22.001011,100.990921],[22.000919,100.991051],[22.000191,100.992073],[21.99983,100.992554],[21.99975,100.992683],[21.999149,100.993523],[21.99906,100.993629],[21.998871,100.993843],[21.99811,100.994507],[21.99707,100.995071],[21.99651,100.995293],[21.995951,100.995506],[21.995399,100.995743],[21.99486,100.995956],[21.99436,100.996239],[21.992809,100.99765],[21.992701,100.99781],[21.99198,100.998779],[21.99185,100.998947],[21.99131,100.999641],[21.99102,100.999992],[21.990459,101.000717],[21.9888,101.00293],[21.98838,101.003487],[21.98786,101.003998],[21.987049,101.004883],[21.98671,101.005211],[21.986349,101.005539],[21.986179,101.005699],[21.98562,101.006172],[21.98525,101.006493],[21.984249,101.007271],[21.983841,101.007568],[21.98321,101.008003],[21.98258,101.008438],[21.98197,101.008873],[21.98177,101.009018],[21.98078,101.009811],[21.97967,101.010818],[21.976709,101.013283],[21.97607,101.013962],[21.975679,101.014252],[21.97489,101.014801],[21.97427,101.015198],[21.973869,101.015503],[21.973471,101.015793],[21.973101,101.016113],[21.97262,101.016701],[21.97249,101.016899],[21.97216,101.017563],[21.972071,101.017776],[21.971621,101.01918],[21.97146,101.019653],[21.971149,101.020576],[21.970921,101.021278],[21.97084,101.021507],[21.9706,101.022209],[21.97053,101.022453],[21.970289,101.02314],[21.970209,101.023376],[21.96982,101.024544],[21.969509,101.025467],[21.96785,101.026176],[21.967251,101.026573],[21.96661,101.026871],[21.966169,101.027061],[21.965309,101.027412],[21.96509,101.027496],[21.96422,101.027847],[21.964001,101.027946],[21.96335,101.028214],[21.9627,101.028503],[21.96207,101.028816],[21.961081,101.02951],[21.959749,101.030479],[21.95956,101.030617],[21.95937,101.031616],[21.95859,101.033081],[21.95812,101.034248],[21.95792,101.034698],[21.957279,101.035843],[21.956381,101.037048],[21.95595,101.037666],[21.95558,101.038307],[21.955469,101.038544],[21.955259,101.038979],[21.95509,101.039436],[21.954941,101.039902],[21.954729,101.040619],[21.95439,101.041817],[21.95418,101.042542],[21.95396,101.043243],[21.953409,101.044312],[21.953291,101.04451],[21.95188,101.046097],[21.95171,101.046272],[21.950581,101.047478],[21.95042,101.047653],[21.94935,101.048798],[21.94685,101.05146],[21.946529,101.051804],[21.94636,101.051964],[21.94483,101.053726],[21.94429,101.054443],[21.943529,101.055481],[21.943279,101.055817],[21.942329,101.057137],[21.942209,101.057312],[21.941851,101.0578],[21.941481,101.058273],[21.94095,101.058861],[21.940399,101.059402],[21.940269,101.05954],[21.939581,101.060219],[21.93902,101.060753],[21.93784,101.061127],[21.936701,101.061577],[21.93651,101.061684],[21.935301,101.062218],[21.933491,101.063057],[21.933109,101.063278],[21.930639,101.065109],[21.929501,101.066231],[21.92934,101.066391],[21.92901,101.066727],[21.92783,101.067917],[21.926649,101.069092],[21.925051,101.07045],[21.923241,101.071693],[21.921989,101.072533],[21.92062,101.073593],[21.92009,101.074112],[21.919189,101.075279],[21.917681,101.078453],[21.91642,101.081444],[21.916321,101.081673],[21.91571,101.083008],[21.915051,101.084587],[21.914379,101.087097],[21.914391,101.08876],[21.91444,101.089287],[21.914471,101.089722],[21.91452,101.090286],[21.914539,101.090439],[21.914579,101.091003],[21.914721,101.092216],[21.91493,101.095016],[21.91506,101.097748],[21.915051,101.103523],[21.914909,101.107643],[21.9149,101.107872],[21.914909,101.109596],[21.91526,101.113564],[21.91547,101.115044],[21.915751,101.11705],[21.915939,101.118347],[21.915991,101.118874],[21.916019,101.119141],[21.916071,101.119949],[21.91601,101.121269],[21.9158,101.122299],[21.915449,101.123268],[21.91511,101.123947],[21.914339,101.125504],[21.913811,101.127823],[21.91431,101.129951],[21.9146,101.13063],[21.91634,101.134247],[21.91654,101.134712],[21.91663,101.134933],[21.91839,101.139374],[21.918449,101.139603],[21.918631,101.140579],[21.91876,101.14238],[21.918859,101.14476],[21.9189,101.145813],[21.91894,101.146584],[21.918949,101.147102],[21.91897,101.147614],[21.91897,101.147873],[21.918949,101.148628],[21.91885,101.149399],[21.91869,101.150139],[21.918539,101.150879],[21.918449,101.151123],[21.91787,101.151672],[21.91713,101.152397],[21.914841,101.154327],[21.914499,101.154694],[21.914339,101.154877],[21.91366,101.155952],[21.913231,101.156891],[21.912741,101.158127],[21.91255,101.158638],[21.912081,101.159897],[21.911791,101.160652],[21.911501,101.1614],[21.911221,101.16214],[21.910749,101.163353],[21.910561,101.163811],[21.91011,101.164993],[21.909559,101.166382],[21.90947,101.166618],[21.90922,101.167343],[21.908661,101.170502],[21.908001,101.175049],[21.90786,101.175529],[21.907351,101.177269],[21.9072,101.177757],[21.90691,101.178757],[21.90649,101.180817],[21.906509,101.182121],[21.906549,101.182381],[21.90708,101.184097],[21.90826,101.186363],[21.90966,101.189034],[21.909769,101.189247],[21.911289,101.191254],[21.91147,101.191406],[21.912081,101.191833],[21.91445,101.193123],[21.91466,101.193253],[21.91526,101.193687],[21.916121,101.194618],[21.91687,101.195992],[21.91704,101.196457],[21.91711,101.196709],[21.91733,101.197769],[21.9175,101.198914],[21.917601,101.199783],[21.91777,101.200951],[21.91785,101.201508],[21.917971,101.202339],[21.918619,101.205002],[21.918949,101.20575],[21.92004,101.207611],[21.92045,101.208313],[21.920891,101.209213],[21.92137,101.210838],[21.92153,101.212631],[21.92156,101.213158],[21.921659,101.215263],[21.922371,101.219688],[21.922689,101.220886],[21.922979,101.221992],[21.92321,101.222763],[21.92333,101.223259],[21.923441,101.223701],[21.92392,101.226082],[21.92395,101.22644],[21.923969,101.226624],[21.923981,101.227013],[21.923981,101.227837],[21.923941,101.228706],[21.92392,101.228943],[21.9238,101.23037],[21.92371,101.231903],[21.923519,101.233963],[21.92304,101.239906],[21.92206,101.242363],[21.920389,101.244179],[21.920219,101.24437],[21.91906,101.246536],[21.918921,101.247253],[21.918831,101.249329],[21.918831,101.250221],[21.91881,101.250877],[21.91881,101.251099],[21.91873,101.252403],[21.918659,101.252838],[21.917749,101.255157],[21.91548,101.257736],[21.9149,101.258217],[21.9147,101.258377],[21.913401,101.259087],[21.912701,101.259354],[21.91222,101.259483],[21.910749,101.259811],[21.909769,101.26001],[21.90855,101.260277],[21.904751,101.261467],[21.904381,101.261726],[21.90402,101.262016],[21.902321,101.264214],[21.90143,101.265541],[21.90106,101.26609],[21.90019,101.267357],[21.89957,101.26825],[21.899309,101.26857],[21.898569,101.269302],[21.897261,101.269974],[21.89506,101.26992],[21.89484,101.269852],[21.89373,101.269432],[21.89328,101.269257],[21.89189,101.268799],[21.889059,101.268402],[21.88468,101.268173],[21.88446,101.26815],[21.880329,101.268433],[21.87883,101.269524],[21.87771,101.271393],[21.87731,101.273888],[21.87648,101.276787],[21.874929,101.278214],[21.8743,101.278458],[21.87303,101.278679],[21.872,101.278687],[21.871189,101.278717],[21.870171,101.278763],[21.868931,101.278839],[21.868509,101.278893],[21.86767,101.279099],[21.86746,101.279167],[21.86684,101.279404],[21.866631,101.279488],[21.864929,101.280167],[21.86426,101.280296],[21.86335,101.280312],[21.86289,101.280228],[21.86204,101.279892],[21.861469,101.279503],[21.860571,101.278488],[21.85997,101.277496],[21.85952,101.276718],[21.859289,101.276337],[21.85895,101.275749],[21.858391,101.274803],[21.85804,101.274223],[21.857809,101.273827],[21.857309,101.273087],[21.85689,101.272568],[21.856409,101.272102],[21.855659,101.271606],[21.855261,101.271423],[21.85461,101.271233],[21.854389,101.271179],[21.853291,101.271133],[21.852421,101.27121],[21.851561,101.271378],[21.851351,101.271423],[21.85051,101.271637],[21.849689,101.27195],[21.84889,101.272293],[21.8487,101.272392],[21.848129,101.272713],[21.847771,101.272957],[21.847429,101.273247],[21.84683,101.273911],[21.84646,101.274467],[21.846029,101.275543],[21.84589,101.276451],[21.845881,101.276939],[21.845921,101.277412],[21.84621,101.278847],[21.84626,101.279083],[21.846439,101.280022],[21.846581,101.280724],[21.84668,101.281174],[21.846979,101.282547],[21.847031,101.282784],[21.84713,101.283241],[21.847349,101.284653],[21.847349,101.285362],[21.8473,101.285828],[21.847019,101.286682],[21.84655,101.287537],[21.846081,101.288116],[21.84572,101.288437],[21.844709,101.288986],[21.844259,101.28907],[21.84314,101.2892],[21.842449,101.289177],[21.84178,101.289192],[21.840891,101.289299],[21.840441,101.289413],[21.83959,101.289742],[21.838961,101.290031],[21.838329,101.290314],[21.83728,101.290787],[21.83707,101.290894],[21.836439,101.291168],[21.83539,101.291641],[21.83518,101.291733],[21.837179,101.294617],[21.83725,101.295601],[21.837299,101.296066],[21.837339,101.296532],[21.83736,101.296997],[21.837311,101.297943],[21.83708,101.298828],[21.836729,101.299622],[21.836349,101.300133],[21.835699,101.300697],[21.83474,101.301224],[21.833679,101.301613],[21.832809,101.301918],[21.832371,101.302078],[21.83148,101.302383],[21.83082,101.302612],[21.829941,101.302917],[21.82951,101.303078],[21.82864,101.303383],[21.82777,101.303688],[21.827339,101.303841],[21.827129,101.303917],[21.82626,101.304222],[21.825411,101.304497],[21.82457,101.304688],[21.82436,101.304718],[21.823521,101.304771],[21.822651,101.304733],[21.822201,101.30468],[21.821079,101.304573],[21.82085,101.304527],[21.819771,101.304443],[21.81955,101.304428],[21.81811,101.304497],[21.81752,101.30468],[21.816549,101.305153],[21.81568,101.305801],[21.815121,101.306473],[21.81469,101.307243],[21.81444,101.307861],[21.81424,101.308502],[21.81418,101.308723],[21.81395,101.309578],[21.8139,101.309792],[21.81373,101.310448],[21.81356,101.311096],[21.81325,101.31218],[21.81319,101.312401],[21.81284,101.313881],[21.81263,101.31456],[21.8123,101.315376],[21.81167,101.316238],[21.81151,101.316383],[21.81098,101.31675],[21.810591,101.316917],[21.80978,101.317047],[21.808729,101.316933],[21.808331,101.316833],[21.80751,101.316612],[21.80731,101.316551],[21.806709,101.316383],[21.806101,101.316223],[21.8053,101.316002],[21.804489,101.315781],[21.804079,101.315666],[21.80308,101.315407],[21.802679,101.315308],[21.80188,101.315117],[21.801279,101.31498],[21.80068,101.314873],[21.79945,101.314781],[21.79841,101.314857],[21.798201,101.314888],[21.797569,101.315033],[21.795139,101.316109],[21.793831,101.316849],[21.792339,101.317703],[21.79178,101.318008],[21.789539,101.319283],[21.78265,101.342934],[21.78219,101.344131],[21.781931,101.34478],[21.781851,101.344978],[21.781731,101.345337],[21.781601,101.345802],[21.781321,101.347321],[21.781321,101.348717],[21.78134,101.348991],[21.78142,101.349808],[21.781549,101.350937],[21.78159,101.351227],[21.781731,101.352409],[21.78182,101.353279],[21.781839,101.353569],[21.781839,101.354141],[21.781771,101.35498],[21.78137,101.356293],[21.78125,101.356529],[21.780661,101.357407],[21.780331,101.357803],[21.780149,101.357986],[21.779631,101.35849],[21.77928,101.35881],[21.778761,101.359261],[21.778431,101.359573],[21.77767,101.360451],[21.77689,101.361717],[21.77639,101.362892],[21.776091,101.363632],[21.7756,101.364861],[21.77527,101.365578],[21.77515,101.365807],[21.774731,101.366463],[21.77421,101.367027],[21.77383,101.36734],[21.773621,101.36747],[21.77272,101.367897],[21.77083,101.368332],[21.770361,101.368439],[21.768511,101.368843],[21.76614,101.369759],[21.765829,101.370018],[21.765699,101.370163],[21.7647,101.371513],[21.764299,101.372093],[21.763041,101.37394],[21.76263,101.374557],[21.762211,101.375183],[21.76193,101.375603],[21.7612,101.375648],[21.75919,101.376251],[21.757509,101.376091],[21.7568,101.375893],[21.75511,101.375412],[21.754869,101.375359],[21.75362,101.375191],[21.752081,101.375168],[21.75131,101.375191],[21.750299,101.375198],[21.749281,101.375198],[21.748529,101.375168],[21.74777,101.37513],[21.74675,101.375053],[21.745741,101.374924],[21.745489,101.374878],[21.744989,101.374809],[21.74449,101.374741],[21.74399,101.37468],[21.74349,101.374619],[21.74324,101.374588],[21.74173,101.374428],[21.74098,101.374313],[21.73995,101.374153],[21.738661,101.373993],[21.73815,101.373947],[21.737619,101.373917],[21.736851,101.373947],[21.73633,101.374008],[21.735069,101.374283],[21.73406,101.37468],[21.73381,101.374786],[21.73307,101.375107],[21.73283,101.375229],[21.73185,101.375648],[21.7311,101.375923],[21.730591,101.376083],[21.7293,101.376266],[21.728769,101.376282],[21.727711,101.376221],[21.72718,101.37619],[21.72665,101.376152],[21.72613,101.376167],[21.725349,101.376213],[21.724819,101.376312],[21.72456,101.376373],[21.72378,101.376556],[21.723,101.376747],[21.72221,101.3769],[21.720619,101.37709],[21.71957,101.377083],[21.718781,101.377083],[21.718,101.37706],[21.71748,101.377029],[21.71697,101.377022],[21.715139,101.376961],[21.71434,101.37693],[21.713289,101.376907],[21.712761,101.376877],[21.712231,101.376862],[21.71196,101.376839],[21.71143,101.376793],[21.71064,101.376678],[21.710131,101.376579],[21.709869,101.376511],[21.708151,101.375938],[21.707439,101.375671],[21.70673,101.375397],[21.70648,101.375298],[21.705759,101.375038],[21.70479,101.374771],[21.70454,101.374733],[21.703791,101.374649],[21.703541,101.374641],[21.70084,101.374786],[21.699369,101.374687],[21.696461,101.374207],[21.69548,101.374046],[21.694759,101.373917],[21.69404,101.373779],[21.692101,101.373558],[21.68832,101.373627],[21.68716,101.373703],[21.68671,101.373718],[21.68626,101.373734],[21.68581,101.373756],[21.684259,101.373848],[21.68294,101.373917],[21.68227,101.373962],[21.68181,101.373993],[21.677691,101.374207],[21.6772,101.374252],[21.67627,101.37429],[21.67564,101.374329],[21.675261,101.374352],[21.674931,101.374367],[21.674431,101.374397],[21.674231,101.374382],[21.67403,101.374367],[21.673719,101.374367],[21.67363,101.374397],[21.67362,101.374397],[21.673281,101.374443],[21.672291,101.374519],[21.672041,101.374527],[21.669769,101.374817],[21.668909,101.374962],[21.66818,101.375053],[21.667589,101.375069],[21.66655,101.374992],[21.66567,101.37484],[21.66522,101.374733],[21.66452,101.374573],[21.66358,101.374336],[21.662609,101.374107],[21.660681,101.37365],[21.66044,101.373596],[21.65901,101.37326],[21.658279,101.373192],[21.65803,101.373199],[21.65778,101.37323],[21.65707,101.373413],[21.656429,101.373741],[21.65411,101.375397],[21.65262,101.376442],[21.651871,101.376961],[21.651131,101.37748],[21.649639,101.378517],[21.64854,101.379333],[21.648359,101.379478],[21.647209,101.38092],[21.64658,101.382469],[21.646481,101.382919],[21.646391,101.383598],[21.64636,101.384529],[21.64633,101.385681],[21.646311,101.386139],[21.646299,101.386581],[21.64628,101.387253],[21.64625,101.388138],[21.64624,101.38858],[21.646231,101.389023],[21.646259,101.389893],[21.646299,101.390961],[21.64636,101.391586],[21.646391,101.392227],[21.64641,101.392662],[21.646429,101.392883],[21.646481,101.394188],[21.646429,101.395058],[21.646339,101.395477],[21.646061,101.396561],[21.645821,101.3974],[21.64576,101.397614],[21.645651,101.398033],[21.64547,101.398666],[21.64535,101.399094],[21.64529,101.3993],[21.645109,101.399933],[21.64506,101.400139],[21.643129,101.399544],[21.64254,101.399788],[21.6415,101.400208],[21.640881,101.400436],[21.639811,101.400787],[21.639601,101.400864],[21.639179,101.400993],[21.638599,101.401253],[21.63805,101.401588],[21.637421,101.402153],[21.63689,101.402802],[21.636669,101.403191],[21.63641,101.40377],[21.63624,101.404167],[21.63607,101.404556],[21.63582,101.405159],[21.635731,101.405357],[21.635389,101.406151],[21.635139,101.406754],[21.6348,101.407539],[21.63463,101.407944],[21.63438,101.408531],[21.634041,101.409317],[21.633869,101.409721],[21.638929,101.41069],[21.6392,101.411049],[21.63945,101.411423],[21.639811,101.411957],[21.64032,101.412682],[21.64068,101.413223],[21.641041,101.41375],[21.641399,101.414284],[21.641649,101.414627],[21.641899,101.414993],[21.64266,101.416107],[21.643089,101.416939],[21.64325,101.417381],[21.643419,101.418068],[21.643499,101.418533],[21.6436,101.419006],[21.64378,101.41996],[21.64397,101.420914],[21.64411,101.421623],[21.644251,101.42234],[21.64114,101.423126],[21.640671,101.423347],[21.64003,101.423569],[21.63954,101.423698],[21.63903,101.423843],[21.6387,101.423912],[21.638,101.424049],[21.6373,101.424187],[21.63678,101.424309],[21.63625,101.424438],[21.634991,101.424744],[21.63446,101.424873],[21.63378,101.425079],[21.63345,101.425209],[21.632799,101.425537],[21.632339,101.42585],[21.631901,101.426201],[21.63147,101.426613],[21.631081,101.42704],[21.630831,101.427322],[21.630569,101.427612],[21.63015,101.427834],[21.62956,101.42836],[21.62854,101.429283],[21.628099,101.42968],[21.62752,101.430206],[21.62678,101.430862],[21.618349,101.454582],[21.618311,101.454857],[21.61771,101.456886],[21.616671,101.45816],[21.61628,101.458443],[21.615459,101.458977],[21.61483,101.459373],[21.613991,101.459908],[21.61311,101.46048],[21.61268,101.460747],[21.61224,101.460999],[21.61179,101.461197],[21.610849,101.461502],[21.6096,101.461723],[21.60911,101.4618],[21.60862,101.461884],[21.60788,101.462013],[21.606421,101.462273],[21.6057,101.462334],[21.60523,101.462303],[21.60499,101.46225],[21.604521,101.46212],[21.60429,101.462029],[21.603821,101.461838],[21.60358,101.461731],[21.6031,101.461517],[21.60235,101.461327],[21.601851,101.461273],[21.601089,101.461357],[21.599911,101.461807],[21.59948,101.462097],[21.598249,101.463051],[21.597851,101.463371],[21.597231,101.463837],[21.597031,101.463997],[21.596621,101.46431],[21.59622,101.464577],[21.595289,101.465027],[21.594259,101.465149],[21.593731,101.465141],[21.592951,101.46508],[21.59244,101.465012],[21.59144,101.464943],[21.59119,101.464928],[21.5907,101.464928],[21.59045,101.464943],[21.588699,101.465279],[21.58823,101.465553],[21.58778,101.465813],[21.586901,101.466393],[21.585779,101.467117],[21.5851,101.467484],[21.58486,101.46759],[21.58313,101.467796],[21.581961,101.467537],[21.58009,101.467323],[21.57918,101.467537],[21.57896,101.467628],[21.578751,101.467743],[21.57708,101.469528],[21.57564,101.471237],[21.573721,101.47213],[21.57185,101.47226],[21.571609,101.472267],[21.570921,101.47242],[21.5707,101.472504],[21.56967,101.473106],[21.56683,101.474373],[21.56468,101.474983],[21.564091,101.475304],[21.563181,101.47596],[21.562389,101.476761],[21.56115,101.478378],[21.561001,101.478561],[21.55938,101.480637],[21.559231,101.480827],[21.55831,101.481956],[21.5578,101.482483],[21.55722,101.48291],[21.556589,101.483231],[21.556141,101.483383],[21.554979,101.483566],[21.55451,101.483582],[21.554279,101.483589],[21.552191,101.48365],[21.551279,101.483681],[21.55061,101.483704],[21.548849,101.483757],[21.547979,101.483788],[21.54689,101.483841],[21.546671,101.483856],[21.546049,101.483971],[21.54414,101.484978],[21.54397,101.48513],[21.54348,101.485657],[21.542891,101.48642],[21.54274,101.48661],[21.542,101.487556],[21.541861,101.487747],[21.540859,101.489021],[21.54043,101.48954],[21.540291,101.489708],[21.539841,101.490173],[21.5392,101.4907],[21.53886,101.490921],[21.538691,101.49102],[21.538151,101.491287],[21.537781,101.491432],[21.537041,101.491669],[21.536671,101.491783],[21.5347,101.492409],[21.53422,101.492554],[21.533739,101.492706],[21.533421,101.492813],[21.53117,101.493507],[21.52005,101.497276],[21.51823,101.497932],[21.516729,101.498421],[21.516121,101.498749],[21.515369,101.499313],[21.51487,101.499863],[21.5142,101.500954],[21.51395,101.501404],[21.51309,101.502617],[21.512489,101.50341],[21.5119,101.504204],[21.51145,101.504799],[21.51115,101.505203],[21.509859,101.505867],[21.50952,101.506233],[21.508989,101.506767],[21.508471,101.507317],[21.508301,101.5075],[21.50812,101.507683],[21.50765,101.508568],[21.50758,101.508743],[21.50746,101.509407],[21.507481,101.510117],[21.507641,101.511124],[21.50786,101.512627],[21.507959,101.513397],[21.507151,101.514633],[21.50692,101.515289],[21.506491,101.516243],[21.5063,101.516731],[21.506149,101.517258],[21.506001,101.518044],[21.50596,101.518547],[21.50596,101.518784],[21.50597,101.518982],[21.505989,101.519333],[21.506029,101.519653],[21.506069,101.519997],[21.50596,101.522263],[21.50559,101.523567],[21.50539,101.524117],[21.505199,101.524643],[21.50493,101.525421],[21.504669,101.526169],[21.504499,101.526657],[21.50436,101.527168],[21.50421,101.527679],[21.50399,101.528442],[21.503691,101.529457],[21.50388,101.531113],[21.503839,101.531891],[21.50375,101.532417],[21.503469,101.53344],[21.503189,101.534187],[21.502741,101.535393],[21.502649,101.535629],[21.50247,101.536118],[21.50219,101.53685],[21.502001,101.537354],[21.50169,101.538101],[21.50135,101.539108],[21.50128,101.540138],[21.50182,101.541763],[21.502119,101.54213],[21.502279,101.542297],[21.502819,101.542686],[21.50433,101.543671],[21.505131,101.544182],[21.50856,101.546333],[21.50975,101.547249],[21.51009,101.547607],[21.51037,101.548019],[21.510691,101.548714],[21.51091,101.549713],[21.51087,101.550743],[21.510019,101.552643],[21.50943,101.553497],[21.507971,101.555656],[21.507099,101.556976],[21.50695,101.55722],[21.506689,101.557663],[21.50597,101.558723],[21.5054,101.55957],[21.50499,101.560188],[21.504021,101.561607],[21.50321,101.562866],[21.501711,101.565132],[21.500299,101.567253],[21.49931,101.568764],[21.498329,101.570236],[21.496941,101.572327],[21.49625,101.573372],[21.49472,101.575684],[21.491819,101.579353],[21.48933,101.58075],[21.48888,101.580887],[21.486139,101.581078],[21.48407,101.580566],[21.481621,101.579582],[21.481171,101.579399],[21.480721,101.579224],[21.47644,101.57753],[21.474199,101.57666],[21.47193,101.57579],[21.467951,101.574188],[21.46373,101.572517],[21.46306,101.572258],[21.46283,101.572166],[21.461531,101.571663],[21.45727,101.570129],[21.45557,101.56974],[21.450569,101.568871],[21.450121,101.568939],[21.449129,101.569443],[21.448389,101.570358],[21.447821,101.571732],[21.44714,101.573059],[21.447001,101.573257],[21.44635,101.573936],[21.44599,101.574226],[21.44524,101.574738],[21.44451,101.575249],[21.44367,101.576317],[21.443371,101.57695],[21.44311,101.577583],[21.44302,101.577797],[21.44268,101.578644],[21.442419,101.579277],[21.442169,101.579933],[21.442089,101.580139],[21.441589,101.581169],[21.441469,101.581367],[21.439939,101.583168],[21.43919,101.583748],[21.43844,101.584328],[21.43825,101.584473],[21.43788,101.584763],[21.437309,101.58519],[21.43712,101.585327],[21.43615,101.584167],[21.43479,101.583832],[21.4333,101.582962],[21.43273,101.582451],[21.432541,101.582253],[21.431669,101.581284],[21.430969,101.580513],[21.430269,101.57975],[21.43008,101.579567],[21.429501,101.579071],[21.428391,101.578491],[21.427919,101.578346],[21.427429,101.578247],[21.425461,101.578407],[21.424049,101.579048],[21.420389,101.581108],[21.419979,101.581337],[21.41571,101.583321],[21.41457,101.583511],[21.41366,101.583542],[21.41206,101.583427],[21.408621,101.583557],[21.40716,101.584686],[21.4049,101.588074],[21.403959,101.589478],[21.40303,101.590919],[21.402679,101.592781],[21.403009,101.593674],[21.40378,101.594841],[21.40402,101.595253],[21.40432,101.595886],[21.404461,101.596336],[21.404591,101.597549],[21.40451,101.598282],[21.40427,101.599258],[21.404169,101.599762],[21.40451,101.601669],[21.406111,101.604439],[21.40613,101.605873],[21.4058,101.606552],[21.404699,101.607536],[21.404261,101.607697],[21.403339,101.607971],[21.402929,101.608177],[21.402559,101.608459],[21.401739,101.610237],[21.401871,101.611267],[21.40221,101.612251],[21.402809,101.613823],[21.40299,101.614487],[21.40303,101.614967],[21.40284,101.616112],[21.401939,101.618828],[21.40192,101.619072],[21.40217,101.620598],[21.40247,101.621201],[21.40373,101.623901],[21.40465,101.626793],[21.40407,101.628906],[21.40324,101.63076],[21.403139,101.630989],[21.40155,101.634537],[21.40093,101.636017],[21.40012,101.637909],[21.399981,101.638763],[21.400181,101.639793],[21.400709,101.640717],[21.40102,101.641144],[21.401131,101.641296],[21.40196,101.642464],[21.402081,101.642639],[21.402981,101.643921],[21.404921,101.645638],[21.40534,101.645882],[21.406879,101.646599],[21.407089,101.646721],[21.40806,101.647476],[21.40929,101.649406],[21.40995,101.651413],[21.410191,101.652168],[21.412201,101.65831],[21.412661,101.659714],[21.413031,101.660873],[21.41342,101.661987],[21.413731,101.66288],[21.414021,101.663788],[21.4142,101.664726],[21.4142,101.665672],[21.414061,101.666344],[21.41399,101.66655],[21.41383,101.666992],[21.413389,101.66777],[21.41296,101.668297],[21.41247,101.668762],[21.411989,101.669197],[21.411329,101.669762],[21.410851,101.670174],[21.409861,101.671089],[21.409519,101.671387],[21.40654,101.674118],[21.40633,101.674179],[21.405331,101.675163],[21.40472,101.675667],[21.403,101.676773],[21.402309,101.677094],[21.402069,101.677193],[21.401581,101.677368],[21.40037,101.677727],[21.39938,101.678017],[21.397619,101.678543],[21.39686,101.678772],[21.39661,101.678848],[21.39558,101.679153],[21.393749,101.679703],[21.39349,101.679787],[21.39068,101.680634],[21.3897,101.680923],[21.388531,101.681267],[21.3883,101.681343],[21.38497,101.681824],[21.38472,101.681793],[21.38423,101.681709],[21.383301,101.681473],[21.38283,101.681328],[21.381849,101.681137],[21.3811,101.681099],[21.37989,101.681252],[21.374399,101.682503],[21.371639,101.683113],[21.37097,101.683243],[21.370119,101.683434],[21.369711,101.683517],[21.36779,101.683937],[21.366369,101.684273],[21.363689,101.684883],[21.358419,101.68605],[21.355499,101.686691],[21.35397,101.687172],[21.351471,101.688713],[21.34923,101.689758],[21.34716,101.689621],[21.346491,101.689499],[21.34627,101.689461],[21.3445,101.68914],[21.34428,101.68911],[21.34269,101.688812],[21.340111,101.68895],[21.33828,101.689888],[21.337641,101.690331],[21.334961,101.692108],[21.332781,101.692627],[21.3321,101.692612],[21.331181,101.692581],[21.330429,101.692551],[21.330179,101.692528],[21.326281,101.692917],[21.324341,101.693268],[21.324089,101.693314],[21.32147,101.693352],[21.31986,101.693321],[21.317921,101.694153],[21.317711,101.69426],[21.31728,101.694427],[21.316139,101.69445],[21.314119,101.693893],[21.3139,101.693832],[21.31188,101.693459],[21.30991,101.693947],[21.308069,101.69548],[21.30736,101.696136],[21.306259,101.697166],[21.30348,101.699059],[21.30176,101.699493],[21.29907,101.699257],[21.293909,101.698067],[21.292749,101.697807],[21.289789,101.697159],[21.289129,101.697006],[21.28742,101.696632],[21.286369,101.696388],[21.28471,101.696053],[21.28323,101.696136],[21.281811,101.696793],[21.28023,101.698433],[21.27973,101.699074],[21.279221,101.699722],[21.27784,101.701424],[21.27766,101.70163],[21.276819,101.70269],[21.276661,101.702904],[21.275181,101.70472],[21.27319,101.706131],[21.271839,101.706734],[21.271469,101.707047],[21.270941,101.70787],[21.26981,101.711739],[21.26972,101.711983],[21.2689,101.713188],[21.2665,101.715477],[21.26597,101.715958],[21.265369,101.716316],[21.26404,101.716522],[21.263161,101.716293],[21.260771,101.714844],[21.25922,101.713852],[21.257099,101.712517],[21.25647,101.712128],[21.256081,101.711884],[21.255791,101.711723],[21.25561,101.711571],[21.25526,101.711327],[21.25515,101.711273],[21.2542,101.710693],[21.253139,101.710037],[21.253019,101.709969],[21.252831,101.709846],[21.251011,101.708702],[21.250351,101.708321],[21.249781,101.70813],[21.24929,101.707947],[21.24873,101.70787],[21.24799,101.707802],[21.246639,101.707718],[21.24645,101.707703],[21.24424,101.707573],[21.24391,101.707512],[21.24243,101.707199],[21.23983,101.706123],[21.237459,101.705139],[21.232361,101.703072],[21.232071,101.702988],[21.229389,101.702309],[21.229059,101.702217],[21.22883,101.702263],[21.22781,101.702744],[21.227631,101.702858],[21.226589,101.703712],[21.22473,101.704857],[21.22368,101.705063],[21.221531,101.704613],[21.22003,101.704063],[21.217899,101.703362],[21.21722,101.703201],[21.21579,101.703049],[21.21278,101.70285],[21.209311,101.702278],[21.207649,101.701683],[21.20392,101.700203],[21.202351,101.699127],[21.200911,101.696533],[21.1991,101.693657],[21.19673,101.692017],[21.194309,101.690483],[21.19376,101.690102],[21.193081,101.689651],[21.1917,101.688637],[21.190769,101.687233],[21.19038,101.68663],[21.190069,101.686272],[21.189859,101.686096],[21.18948,101.685799],[21.188499,101.68512],[21.18718,101.684097],[21.18701,101.683723],[21.186689,101.683517],[21.186279,101.683693],[21.18615,101.683632],[21.185841,101.683296],[21.18573,101.682793],[21.18601,101.681519],[21.18609,101.680992],[21.18647,101.680603],[21.186871,101.680237],[21.187,101.679932],[21.18693,101.678787],[21.18714,101.678131],[21.187559,101.677711],[21.18775,101.677139],[21.18775,101.676033],[21.187361,101.675491],[21.18634,101.67466],[21.186001,101.674156],[21.185749,101.673912],[21.18507,101.673508],[21.184771,101.673378],[21.184389,101.673187],[21.18375,101.672913],[21.182159,101.67215],[21.180889,101.671158],[21.179991,101.670067],[21.17861,101.669197],[21.17667,101.668991],[21.17417,101.668457],[21.173349,101.668541],[21.17028,101.669739],[21.16925,101.670959],[21.1682,101.672523],[21.16785,101.672813],[21.166189,101.673027],[21.16534,101.672256],[21.16515,101.671768],[21.16436,101.671318],[21.164221,101.671341],[21.162239,101.671417],[21.15913,101.672249],[21.158449,101.672173],[21.157101,101.671822],[21.156509,101.671494],[21.15626,101.671288],[21.155239,101.671181],[21.15383,101.6716],[21.153191,101.672234],[21.15299,101.67263],[21.152439,101.67305],[21.151421,101.673592],[21.150631,101.67337],[21.15029,101.672989],[21.15037,101.672081],[21.150669,101.671257],[21.150391,101.670158],[21.15033,101.670067],[21.14954,101.669273],[21.14859,101.668411],[21.14756,101.668449],[21.14698,101.668678],[21.145809,101.668266],[21.14555,101.667824],[21.14522,101.666992],[21.14439,101.666809],[21.14426,101.666893],[21.14325,101.666779],[21.141621,101.665131],[21.140881,101.664749],[21.139521,101.664429],[21.138849,101.664528],[21.13736,101.665062],[21.1367,101.665047],[21.133381,101.664391],[21.13324,101.66433],[21.132509,101.663429],[21.13204,101.662064],[21.13155,101.661484],[21.12817,101.657883],[21.12644,101.656097],[21.124781,101.654663],[21.123831,101.654449],[21.122801,101.654503],[21.121611,101.653748],[21.12063,101.65239],[21.119909,101.652184],[21.119591,101.652199],[21.118719,101.651787],[21.116011,101.64978],[21.114189,101.648827],[21.11272,101.647827],[21.11216,101.647171],[21.11198,101.646858],[21.110399,101.645432],[21.10799,101.643784],[21.1066,101.642517],[21.105141,101.642128],[21.10467,101.642021],[21.10405,101.641533],[21.10235,101.639343],[21.10084,101.638039],[21.10059,101.637817],[21.099581,101.637688],[21.098789,101.637917],[21.097651,101.637497],[21.09745,101.636864],[21.097389,101.636368],[21.0968,101.635696],[21.09623,101.635429],[21.095579,101.635422],[21.094721,101.635567],[21.093611,101.635033],[21.0937,101.634087],[21.093571,101.633324],[21.093201,101.633339],[21.09173,101.633362],[21.091311,101.634033],[21.091339,101.634407],[21.090811,101.634972],[21.090679,101.634956],[21.090429,101.634933],[21.09004,101.63427],[21.090031,101.633827],[21.08955,101.633232],[21.08824,101.63266],[21.08761,101.631882],[21.08699,101.629753],[21.086281,101.629288],[21.085979,101.629883],[21.085951,101.630363],[21.085409,101.631233],[21.08371,101.633232],[21.08346,101.633499],[21.08213,101.634163],[21.081591,101.634033],[21.08135,101.633919],[21.08079,101.63427],[21.08078,101.634552],[21.080839,101.635437],[21.08036,101.63588],[21.08003,101.635902],[21.07967,101.636673],[21.079691,101.638252],[21.079399,101.639343],[21.078541,101.639977],[21.077511,101.640182],[21.07645,101.639679],[21.076229,101.639442],[21.075251,101.639282],[21.0749,101.639587],[21.074249,101.640633],[21.0742,101.641724],[21.074301,101.642326],[21.073811,101.642967],[21.07135,101.643784],[21.06925,101.644409],[21.06815,101.643997],[21.06529,101.641731],[21.06399,101.64122],[21.063589,101.640419],[21.06303,101.6399],[21.062799,101.640053],[21.06217,101.640602],[21.061819,101.641602],[21.061831,101.641678],[21.061939,101.64257],[21.061939,101.643494],[21.06189,101.64373],[21.06179,101.644058],[21.061331,101.644096],[21.060949,101.644112],[21.060551,101.64415],[21.058901,101.644211],[21.05814,101.644142],[21.057421,101.643707],[21.0557,101.641777],[21.054649,101.639397],[21.054371,101.637123],[21.05472,101.636192],[21.05496,101.635902],[21.055201,101.634933],[21.05521,101.633789],[21.05562,101.633133],[21.056,101.632858],[21.056259,101.632507],[21.056231,101.631889],[21.056009,101.631126],[21.056009,101.63031],[21.055611,101.629601],[21.05542,101.629463],[21.055229,101.629066],[21.05549,101.628708],[21.055759,101.628609],[21.056959,101.628326],[21.05728,101.628036],[21.057211,101.627663],[21.05706,101.627472],[21.056881,101.627289],[21.056749,101.626503],[21.056881,101.625992],[21.056391,101.625427],[21.056259,101.62542],[21.055861,101.625381],[21.055531,101.624649],[21.05567,101.624107],[21.05521,101.623482],[21.055071,101.623451],[21.054529,101.623337],[21.053841,101.623421],[21.05345,101.623573],[21.05257,101.623238],[21.052481,101.623108],[21.05212,101.622597],[21.05159,101.622292],[21.05098,101.622124],[21.05027,101.621071],[21.04999,101.617973],[21.050171,101.617203],[21.0518,101.614067],[21.053329,101.611893],[21.05361,101.610832],[21.054119,101.609283],[21.05393,101.608627],[21.05303,101.606812],[21.05307,101.605743],[21.053431,101.604851],[21.05352,101.60408],[21.05327,101.602287],[21.05216,101.599876],[21.052219,101.598587],[21.052691,101.596916],[21.052589,101.596092],[21.051649,101.59243],[21.05213,101.591179],[21.054859,101.588188],[21.055071,101.586418],[21.055019,101.58622],[21.053671,101.583351],[21.053471,101.583023],[21.05316,101.581673],[21.05213,101.580551],[21.05195,101.580467],[21.048651,101.579102],[21.047661,101.577583],[21.047159,101.575447],[21.04752,101.574654],[21.047939,101.574249],[21.047831,101.573502],[21.04771,101.573387],[21.045891,101.571762],[21.04542,101.57132],[21.044941,101.570572],[21.043739,101.569817],[21.043119,101.569893],[21.040911,101.57045],[21.039921,101.570267],[21.03924,101.569939],[21.038771,101.569153],[21.038679,101.568779],[21.03887,101.567871],[21.03911,101.56739],[21.038759,101.56649],[21.03618,101.56472],[21.034491,101.564079],[21.03421,101.563957],[21.033649,101.563393],[21.033291,101.562782],[21.03249,101.562347],[21.03064,101.561867],[21.02869,101.56057],[21.027941,101.558998],[21.028431,101.557823],[21.02883,101.557358],[21.0292,101.556396],[21.02948,101.554993],[21.03001,101.553947],[21.030121,101.553062],[21.03009,101.55275],[21.02957,101.552261],[21.0285,101.551842],[21.02776,101.551918],[21.02747,101.551987],[21.02669,101.551743],[21.025669,101.550957],[21.02426,101.549026],[21.024151,101.548843],[21.02359,101.546783],[21.022961,101.546013],[21.022449,101.545723],[21.02191,101.545181],[21.02103,101.544579],[21.01865,101.544144],[21.01754,101.543259],[21.017481,101.543068],[21.01631,101.540771],[21.01417,101.53756],[21.01343,101.536171],[21.01198,101.534866],[21.01107,101.533409],[21.01088,101.532593],[21.01087,101.53167],[21.01041,101.530777],[21.00898,101.529266],[21.00782,101.526787],[21.00745,101.525253],[21.00626,101.522858],[21.00585,101.522148],[21.005159,101.521637],[21.0049,101.521523],[21.004641,101.520668],[21.00502,101.518944],[21.00486,101.518288],[21.004499,101.517731],[21.003889,101.517303],[21.003651,101.517212],[21.003281,101.516609],[21.00312,101.515732],[21.002621,101.515251],[21.001989,101.514832],[21.00145,101.514183],[21.000019,101.513237],[20.99921,101.513107],[20.99798,101.513229],[20.997299,101.513573],[20.995371,101.514557],[20.99423,101.514267],[20.99411,101.514107],[20.993151,101.51326],[20.99276,101.512451],[20.99169,101.509193],[20.99136,101.508392],[20.99144,101.507004],[20.99139,101.506577],[20.99114,101.505531],[20.990749,101.504936],[20.990391,101.50457],[20.9893,101.504051],[20.988171,101.503937],[20.987301,101.503036],[20.986629,101.502098],[20.986059,101.501862],[20.98563,101.501823],[20.985189,101.501129],[20.98535,101.5009],[20.98554,101.500671],[20.985479,101.499657],[20.985201,101.499428],[20.984381,101.498848],[20.9841,101.4981],[20.98411,101.497597],[20.983919,101.496964],[20.982651,101.493713],[20.982571,101.49353],[20.98209,101.492943],[20.98139,101.492027],[20.98027,101.491493],[20.979931,101.491463],[20.97905,101.490608],[20.978979,101.490211],[20.97872,101.486893],[20.97826,101.484161],[20.977501,101.481491],[20.977671,101.480797],[20.97838,101.479523],[20.978571,101.478737],[20.97826,101.477966],[20.97625,101.475441],[20.975889,101.474953],[20.97571,101.474243],[20.97571,101.473801],[20.975189,101.473083],[20.974569,101.472763],[20.971781,101.472397],[20.971319,101.472343],[20.97085,101.471573],[20.9708,101.470627],[20.970989,101.469879],[20.97171,101.468323],[20.9718,101.46756],[20.97176,101.466614],[20.97085,101.464706],[20.96999,101.464142],[20.96937,101.463982],[20.968889,101.463127],[20.969021,101.462761],[20.96921,101.462219],[20.969311,101.459877],[20.96875,101.458588],[20.96818,101.458328],[20.967899,101.458344],[20.96715,101.457619],[20.966829,101.456596],[20.96603,101.456177],[20.964979,101.456093],[20.964399,101.455673],[20.96394,101.455139],[20.96306,101.454193],[20.96171,101.452744],[20.96068,101.451591],[20.956091,101.446877],[20.95311,101.443123],[20.94928,101.435982],[20.947901,101.432739],[20.947109,101.430893],[20.944679,101.423531],[20.94459,101.423302],[20.94437,101.422813],[20.94393,101.422318],[20.94335,101.421989],[20.940571,101.421303],[20.937679,101.420601],[20.93697,101.42028],[20.934799,101.41803],[20.934759,101.417976],[20.933929,101.41713],[20.931311,101.414238],[20.930401,101.411774],[20.928591,101.406677],[20.92713,101.402611],[20.926319,101.400558],[20.9261,101.400032],[20.92557,101.399147],[20.924749,101.397987],[20.92362,101.397202],[20.92201,101.396652],[20.919701,101.396263],[20.916941,101.396027],[20.91567,101.396103],[20.91518,101.396057],[20.91395,101.395683],[20.912701,101.395607],[20.912001,101.395248],[20.91086,101.393898],[20.91008,101.392738],[20.90941,101.39241],[20.908859,101.392418],[20.908319,101.392258],[20.907619,101.391838],[20.90641,101.391373],[20.90514,101.390343],[20.90481,101.390007],[20.90452,101.389236],[20.904369,101.387253],[20.90424,101.386543],[20.90419,101.385681],[20.904249,101.385193],[20.903959,101.384361],[20.902889,101.383614],[20.902361,101.382896],[20.901699,101.381378],[20.901421,101.38102],[20.90081,101.380478],[20.900419,101.379936],[20.89982,101.378464],[20.89942,101.377693],[20.89913,101.376877],[20.898861,101.375717],[20.89913,101.374657],[20.899389,101.373901],[20.899771,101.373192],[20.900129,101.372658],[20.900181,101.371742],[20.89929,101.370667],[20.899111,101.369743],[20.89933,101.36908],[20.89933,101.368187],[20.89893,101.366798],[20.898621,101.365959],[20.897791,101.364807],[20.89596,101.363327],[20.89566,101.363159],[20.894501,101.362846],[20.893221,101.362282],[20.89233,101.362289],[20.891911,101.362503],[20.89109,101.362419],[20.890869,101.361862],[20.890989,101.361412],[20.891991,101.359993],[20.892191,101.359543],[20.892321,101.359039],[20.892361,101.357803],[20.891979,101.356918],[20.89134,101.356422],[20.89098,101.355713],[20.89085,101.354797],[20.890739,101.354477],[20.890169,101.353882],[20.88908,101.35334],[20.887831,101.352203],[20.887449,101.351532],[20.887051,101.350227],[20.886459,101.347748],[20.88616,101.345627],[20.885771,101.344566],[20.885139,101.343468],[20.88505,101.342644],[20.885099,101.342339],[20.884859,101.341637],[20.88353,101.339973],[20.882351,101.338768],[20.880859,101.3377],[20.87953,101.335678],[20.878099,101.334183],[20.87734,101.333168],[20.876961,101.332138],[20.87657,101.331589],[20.87565,101.330719],[20.875271,101.329689],[20.875191,101.328537],[20.874901,101.327873],[20.87468,101.327583],[20.874399,101.326897],[20.87429,101.325577],[20.87417,101.325081],[20.87361,101.324387],[20.87336,101.323647],[20.87372,101.323196],[20.8745,101.322937],[20.87533,101.322411],[20.876341,101.321587],[20.87653,101.320892],[20.876419,101.320633],[20.87587,101.319832],[20.8755,101.319199],[20.874941,101.31871],[20.8743,101.318604],[20.87339,101.318153],[20.87311,101.317917],[20.872601,101.317039],[20.87215,101.316429],[20.87092,101.316002],[20.87092,101.315643],[20.87122,101.314941],[20.871281,101.314583],[20.871241,101.314484],[20.87109,101.314323],[20.870701,101.314133],[20.87014,101.313477],[20.869671,101.313187],[20.869301,101.312759],[20.86846,101.312218],[20.86771,101.311951],[20.8671,101.311447],[20.86688,101.311409],[20.866301,101.3116],[20.86607,101.311523],[20.865959,101.311409],[20.865801,101.310837],[20.86561,101.31041],[20.865049,101.309357],[20.86484,101.309067],[20.86454,101.308907],[20.86376,101.309387],[20.86334,101.309227],[20.86293,101.308487],[20.862379,101.308144],[20.86187,101.308067],[20.86134,101.307678],[20.86109,101.307343],[20.86058,101.307114],[20.859579,101.306999],[20.859261,101.307022],[20.858521,101.306557],[20.85837,101.306557],[20.85812,101.306839],[20.857849,101.307281],[20.85762,101.307373],[20.85746,101.307266],[20.85737,101.306808],[20.85758,101.304932],[20.85774,101.304482],[20.857809,101.303909],[20.85762,101.303467],[20.857031,101.302849],[20.85684,101.302551],[20.856741,101.301697],[20.85685,101.301376],[20.857031,101.301117],[20.857401,101.300873],[20.8578,101.300407],[20.857809,101.299911],[20.85775,101.299751],[20.85659,101.298553],[20.85626,101.298347],[20.85582,101.297791],[20.8554,101.297028],[20.8552,101.296783],[20.85458,101.296593],[20.854441,101.296631],[20.85359,101.296577],[20.85334,101.296173],[20.853201,101.295738],[20.852631,101.295326],[20.85215,101.295288],[20.85099,101.294746],[20.849661,101.293571],[20.84874,101.292473],[20.84767,101.291672],[20.845869,101.291008],[20.845289,101.290916],[20.84473,101.290749],[20.8437,101.289886],[20.84339,101.289398],[20.842211,101.288437],[20.842039,101.288353],[20.84111,101.288147],[20.839911,101.287758],[20.839411,101.287682],[20.837811,101.286537],[20.836929,101.2864],[20.83576,101.286842],[20.83511,101.28685],[20.834379,101.286758],[20.83363,101.286812],[20.83313,101.286972],[20.832451,101.28698],[20.83209,101.286903],[20.83136,101.286858],[20.8307,101.286659],[20.82987,101.286171],[20.827419,101.284218],[20.82687,101.283821],[20.826639,101.2836],[20.826469,101.282822],[20.827129,101.280853],[20.827259,101.280098],[20.827181,101.279358],[20.827009,101.278397],[20.82641,101.276901],[20.82559,101.276009],[20.823879,101.273521],[20.823151,101.272568],[20.82159,101.269386],[20.82069,101.2687],[20.81974,101.268578],[20.81888,101.268013],[20.818501,101.26712],[20.818159,101.266602],[20.81764,101.265961],[20.8174,101.265213],[20.817101,101.263397],[20.81666,101.26268],[20.81521,101.260689],[20.81455,101.2593],[20.81427,101.257919],[20.813629,101.256981],[20.812321,101.256058],[20.81144,101.255783],[20.81056,101.255829],[20.80987,101.255524],[20.809561,101.254936],[20.809259,101.254532],[20.808781,101.25428],[20.80657,101.253616],[20.8057,101.252892],[20.805111,101.25174],[20.804529,101.251251],[20.804199,101.25116],[20.80361,101.250793],[20.803249,101.25042],[20.802361,101.250076],[20.80204,101.250076],[20.80131,101.249603],[20.801081,101.248833],[20.800421,101.248154],[20.799601,101.24794],[20.79903,101.247581],[20.79871,101.247009],[20.79841,101.246651],[20.798059,101.246368],[20.797729,101.245918],[20.79738,101.245552],[20.796869,101.245453],[20.796061,101.245071],[20.795691,101.244034],[20.79571,101.24337],[20.79591,101.242928],[20.79604,101.242363],[20.79582,101.242012],[20.79541,101.241859],[20.79455,101.241829],[20.79377,101.241577],[20.79318,101.241508],[20.792471,101.241676],[20.791559,101.241417],[20.79118,101.241043],[20.79059,101.240044],[20.79001,101.239571],[20.78912,101.239166],[20.788349,101.238457],[20.78746,101.23822],[20.787109,101.238312],[20.7859,101.238449],[20.78516,101.238167],[20.784611,101.237091],[20.78401,101.236816],[20.783689,101.236809],[20.78311,101.236382],[20.782841,101.235779],[20.78194,101.234947],[20.78125,101.234741],[20.780479,101.234016],[20.780319,101.233017],[20.7799,101.232117],[20.77844,101.230377],[20.778259,101.229301],[20.778521,101.22863],[20.778641,101.228104],[20.77836,101.227226],[20.77755,101.225906],[20.77619,101.222702],[20.775499,101.221542],[20.775351,101.220627],[20.775431,101.219948],[20.775299,101.21936],[20.774981,101.219063],[20.774429,101.218277],[20.77429,101.217552],[20.774059,101.21685],[20.77401,101.21595],[20.7736,101.214958],[20.77289,101.214157],[20.772711,101.213707],[20.77206,101.213028],[20.77157,101.212852],[20.77067,101.212082],[20.769079,101.211403],[20.76856,101.210831],[20.7684,101.210358],[20.76782,101.209717],[20.766581,101.208923],[20.766041,101.208389],[20.76475,101.206596],[20.7642,101.20533],[20.763359,101.204628],[20.76206,101.204338],[20.76133,101.203827],[20.760889,101.203232],[20.76026,101.202133],[20.75979,101.201714],[20.75909,101.201591],[20.758789,101.201103],[20.758659,101.200577],[20.758289,101.199913],[20.756969,101.198578],[20.75625,101.197777],[20.75568,101.197388],[20.754919,101.196739],[20.754379,101.196007],[20.753799,101.194603],[20.753019,101.193871],[20.752131,101.193619],[20.75107,101.192886],[20.75004,101.191017],[20.749201,101.190369],[20.74798,101.190247],[20.747049,101.189789],[20.746679,101.189377],[20.74592,101.18782],[20.744631,101.186089],[20.744249,101.185173],[20.743811,101.18457],[20.742531,101.18351],[20.74172,101.181969],[20.740219,101.179893],[20.739519,101.178558],[20.73938,101.178192],[20.73859,101.177406],[20.73609,101.17572],[20.735571,101.175194],[20.735161,101.174278],[20.734949,101.173271],[20.73436,101.171417],[20.73366,101.16983],[20.733391,101.168877],[20.73332,101.167488],[20.73292,101.166161],[20.732599,101.165382],[20.7318,101.164146],[20.730471,101.162468],[20.729731,101.161346],[20.728519,101.158813],[20.727631,101.157448],[20.727249,101.156227],[20.72673,101.155281],[20.72649,101.154922],[20.72521,101.153793],[20.72459,101.152687],[20.724159,101.150543],[20.723579,101.148811],[20.722309,101.14669],[20.721519,101.145203],[20.72089,101.142311],[20.72014,101.139526],[20.719931,101.138321],[20.71986,101.13755],[20.71986,101.135567],[20.71977,101.135147],[20.71953,101.134521],[20.719139,101.133034],[20.719021,101.131973],[20.71859,101.131027],[20.716841,101.128883],[20.715891,101.127151],[20.71361,101.123306],[20.713131,101.122078],[20.71228,101.120903],[20.71139,101.119331],[20.71073,101.116898],[20.71067,101.116501],[20.71023,101.115593],[20.70933,101.11425],[20.70879,101.112427],[20.70808,101.111382],[20.70723,101.10994],[20.70668,101.108551],[20.706181,101.106972],[20.70561,101.10614],[20.70388,101.104538],[20.70244,101.102783],[20.70118,101.09993],[20.70072,101.09906],[20.6994,101.097847],[20.69784,101.095589],[20.69607,101.093971],[20.69558,101.093132],[20.69499,101.0914],[20.69352,101.089119],[20.689859,101.084457],[20.68833,101.082237],[20.68816,101.081863],[20.68788,101.079727],[20.68796,101.077667],[20.688219,101.076057],[20.688129,101.075287],[20.68651,101.071457],[20.686211,101.070671],[20.68609,101.069862],[20.68597,101.068253],[20.685909,101.066559],[20.68614,101.0644],[20.686119,101.062973],[20.686029,101.062637],[20.685539,101.061783],[20.68491,101.061203],[20.68383,101.060493],[20.68259,101.059792],[20.68153,101.059624],[20.68082,101.059608],[20.67993,101.059982],[20.67845,101.061462],[20.67696,101.063042],[20.676001,101.063911],[20.67528,101.064041],[20.67485,101.063957],[20.674549,101.06398],[20.67375,101.06414],[20.672791,101.063828],[20.67153,101.063164],[20.67119,101.063087],[20.670349,101.06321],[20.66991,101.063431],[20.669331,101.063477],[20.66877,101.063271],[20.66786,101.063087],[20.667271,101.062637],[20.66712,101.06237],[20.666519,101.061897],[20.666201,101.061867],[20.664379,101.061996],[20.663731,101.062233],[20.6633,101.0625],[20.66238,101.0625],[20.662001,101.061981],[20.661909,101.061668],[20.661579,101.061172],[20.66132,101.061043],[20.660379,101.060806],[20.659349,101.060799],[20.658239,101.06041],[20.657511,101.060318],[20.656771,101.060303],[20.656139,101.060768],[20.65538,101.064034],[20.654011,101.066132],[20.653879,101.06678],[20.65395,101.067062],[20.653839,101.067787],[20.65346,101.068527],[20.65251,101.069458],[20.65188,101.069992],[20.65143,101.070847],[20.651449,101.073021],[20.65098,101.073807],[20.650551,101.073967],[20.647909,101.074493],[20.647511,101.07473],[20.647209,101.075127],[20.647039,101.076431],[20.64661,101.077271],[20.646231,101.07766],[20.645269,101.078148],[20.64476,101.078644],[20.644279,101.07943],[20.64299,101.080406],[20.64089,101.081017],[20.640221,101.081093],[20.639441,101.081612],[20.638889,101.082474],[20.63821,101.082863],[20.63739,101.082977],[20.63587,101.08374],[20.63508,101.083847],[20.633369,101.083763],[20.63271,101.083946],[20.632099,101.084244],[20.631451,101.084351],[20.629339,101.083977],[20.628559,101.083351],[20.628071,101.082176],[20.62792,101.081711],[20.627359,101.080887],[20.626101,101.079613],[20.62479,101.078598],[20.622829,101.077782],[20.62022,101.076309],[20.61867,101.07502],[20.617029,101.073868],[20.616859,101.073776],[20.615549,101.073547],[20.614929,101.073242],[20.61466,101.072731],[20.61433,101.071564],[20.61392,101.070877],[20.61338,101.069649],[20.612909,101.069092],[20.611031,101.068062],[20.6094,101.067436],[20.608749,101.067139],[20.607571,101.066399],[20.60638,101.065758],[20.605659,101.065567],[20.604589,101.065857],[20.60412,101.066147],[20.6033,101.0662],[20.602989,101.066032],[20.60177,101.064842],[20.601231,101.064377],[20.60047,101.063942],[20.59808,101.063057],[20.597231,101.062599],[20.596189,101.06221],[20.59548,101.061638],[20.59498,101.060852],[20.59428,101.060387],[20.59376,101.060303],[20.593109,101.059952],[20.591631,101.058723],[20.59132,101.058113],[20.590731,101.055931],[20.589729,101.053772],[20.58914,101.051903],[20.588221,101.050682],[20.586269,101.048897],[20.585609,101.048561],[20.584181,101.048302],[20.58263,101.048203],[20.58144,101.047684],[20.579809,101.047829],[20.578791,101.046982],[20.578609,101.046478],[20.578621,101.045578],[20.578329,101.045082],[20.57781,101.04483],[20.576771,101.043968],[20.575359,101.04261],[20.57526,101.042007],[20.57534,101.041771],[20.5756,101.041321],[20.57601,101.040932],[20.57641,101.04068],[20.57692,101.040031],[20.57786,101.038063],[20.57855,101.037613],[20.57943,101.037949],[20.579651,101.0382],[20.580391,101.039436],[20.58083,101.039673],[20.58103,101.039307],[20.58106,101.03894],[20.58148,101.0383],[20.581739,101.038254],[20.582291,101.037956],[20.58223,101.037659],[20.582001,101.03701],[20.582211,101.036247],[20.582529,101.036034],[20.58309,101.035378],[20.583151,101.034973],[20.58288,101.034416],[20.582211,101.03434],[20.581659,101.03476],[20.58082,101.034737],[20.58021,101.033791],[20.58004,101.033241],[20.58007,101.032333],[20.579781,101.031731],[20.577749,101.029953],[20.57756,101.029602],[20.577141,101.029343],[20.57696,101.029427],[20.57642,101.029877],[20.57612,101.02993],[20.575781,101.0299],[20.57556,101.029831],[20.57505,101.028816],[20.574751,101.028816],[20.57456,101.028908],[20.57383,101.028847],[20.572729,101.028511],[20.57069,101.028091],[20.5688,101.027817],[20.56827,101.027237],[20.568291,101.026779],[20.568439,101.026031],[20.56822,101.025513],[20.567841,101.025352],[20.567329,101.02552],[20.566971,101.025757],[20.56641,101.025757],[20.564489,101.024986],[20.564039,101.02459],[20.56389,101.024231],[20.563801,101.02388],[20.563551,101.023453],[20.563129,101.023178],[20.562531,101.023003],[20.562229,101.022728],[20.56225,101.02198],[20.56193,101.021362],[20.561541,101.021072],[20.56139,101.020493],[20.561449,101.020393],[20.56163,101.019592],[20.561159,101.019112],[20.560499,101.018959],[20.55938,101.019341],[20.558701,101.01915],[20.55862,101.019051],[20.55801,101.018784],[20.5574,101.01857],[20.55698,101.01754],[20.556499,101.01696],[20.55608,101.016747],[20.555599,101.016113],[20.55518,101.014618],[20.554899,101.013847],[20.55479,101.012917],[20.555,101.012421],[20.555349,101.011757],[20.555389,101.011497],[20.55579,101.011002],[20.55604,101.01088],[20.55661,101.01004],[20.556971,101.008743],[20.557289,101.008118],[20.557541,101.007347],[20.55731,101.006798],[20.55694,101.006767],[20.556709,101.006798],[20.55617,101.006683],[20.555639,101.006241],[20.55555,101.005898],[20.555599,101.005508],[20.555901,101.004578],[20.555861,101.00415],[20.555599,101.003983],[20.55525,101.003532],[20.555149,101.003014],[20.55477,101.002808],[20.554411,101.002403],[20.554399,101.002052],[20.55467,101.000832],[20.55497,101.000343],[20.555241,101.000122],[20.5555,100.999748],[20.555519,100.99926],[20.555429,100.996834],[20.554729,100.995697],[20.55479,100.995163],[20.55497,100.994797],[20.55489,100.994133],[20.55426,100.993599],[20.55397,100.993568],[20.55353,100.993156],[20.55308,100.992416],[20.552521,100.992332],[20.55209,100.992523],[20.551741,100.99231],[20.551531,100.991898],[20.55085,100.990868],[20.55032,100.990334],[20.549789,100.990082],[20.549299,100.989761],[20.54896,100.989288],[20.54842,100.988937],[20.547911,100.989052],[20.547541,100.989052],[20.54726,100.988808],[20.547199,100.988564],[20.547291,100.988129],[20.54792,100.987732],[20.548281,100.987221],[20.54855,100.986969],[20.54892,100.98597],[20.549141,100.985703],[20.54917,100.985458],[20.549219,100.984077],[20.548691,100.982964],[20.54842,100.981506],[20.548479,100.980377],[20.5481,100.978722],[20.54752,100.978149],[20.54685,100.977989],[20.54624,100.97744],[20.5457,100.976273],[20.5452,100.975906],[20.544399,100.975807],[20.54377,100.975662],[20.542471,100.975243],[20.54208,100.974892],[20.54159,100.974548],[20.539921,100.973717],[20.53916,100.973557],[20.538691,100.973351],[20.538179,100.973351],[20.5369,100.974091],[20.536739,100.974319],[20.536341,100.974571],[20.535971,100.974487],[20.535299,100.974068],[20.53492,100.973717],[20.534109,100.973328],[20.53293,100.973343],[20.531759,100.97274],[20.53125,100.972107],[20.53051,100.970657],[20.53039,100.969528],[20.5303,100.969162],[20.53018,100.968811],[20.5298,100.968231],[20.52944,100.967308],[20.529369,100.966843],[20.528959,100.966469],[20.528351,100.966072],[20.528219,100.965103],[20.527941,100.963737],[20.527439,100.963303],[20.526911,100.962936],[20.526951,100.962593],[20.526859,100.962067],[20.526461,100.961693],[20.526291,100.961227],[20.526251,100.960648],[20.525999,100.960114],[20.525721,100.959808],[20.525379,100.959648],[20.52515,100.95961],[20.52487,100.959358],[20.524879,100.959],[20.52479,100.958633],[20.524349,100.957977],[20.52438,100.957527],[20.52458,100.956757],[20.524401,100.956306],[20.523899,100.955887],[20.52313,100.955688],[20.521749,100.955513],[20.52129,100.955353],[20.520531,100.955307],[20.519991,100.955101],[20.51984,100.954948],[20.51955,100.954887],[20.51899,100.954674],[20.51889,100.954483],[20.518459,100.954193],[20.517891,100.954369],[20.51753,100.954918],[20.517229,100.955589],[20.516911,100.955673],[20.516781,100.955406],[20.51675,100.955177],[20.516399,100.95488],[20.516001,100.955002],[20.51556,100.954964],[20.515129,100.955009],[20.51465,100.954941],[20.514441,100.954613],[20.514151,100.954613],[20.513359,100.954933],[20.512911,100.955147],[20.512659,100.955383],[20.512381,100.955353],[20.512211,100.955177],[20.511669,100.954857],[20.510799,100.954773],[20.51033,100.95462],[20.509859,100.95462],[20.509159,100.954979],[20.508619,100.95491],[20.508591,100.954819],[20.50824,100.954483],[20.507959,100.954536],[20.50754,100.954376],[20.50742,100.953873],[20.5072,100.953484],[20.506941,100.953117],[20.506491,100.952904],[20.50629,100.95295],[20.50569,100.952927],[20.505541,100.952667],[20.505461,100.95208],[20.505541,100.951523],[20.50552,100.951027],[20.50514,100.95005],[20.504801,100.949707],[20.5047,100.949722],[20.504009,100.949532],[20.50391,100.949249],[20.50391,100.948463],[20.504061,100.94799],[20.50411,100.947418],[20.50355,100.946037],[20.503401,100.945763],[20.503059,100.945679],[20.502661,100.945686],[20.50226,100.945457],[20.501881,100.945129],[20.50157,100.945236],[20.501011,100.945084],[20.500731,100.944633],[20.500641,100.944183],[20.49922,100.941566],[20.499359,100.940933],[20.499519,100.94046],[20.499371,100.940048],[20.499241,100.93988],[20.498859,100.93972],[20.498159,100.939621],[20.4972,100.939293],[20.496759,100.939034],[20.495871,100.938087],[20.49571,100.937851],[20.49563,100.937263],[20.495661,100.93663],[20.495871,100.936119],[20.49629,100.935638],[20.496309,100.935127],[20.496031,100.934868],[20.49571,100.934036],[20.49589,100.933388],[20.495741,100.932892],[20.49498,100.932777],[20.49445,100.932426],[20.49431,100.931923],[20.494341,100.931267],[20.49431,100.931099],[20.494011,100.930893],[20.49321,100.930763],[20.492571,100.930313],[20.49185,100.928413],[20.491751,100.927803],[20.49176,100.927254],[20.49139,100.92659],[20.49098,100.926178],[20.490841,100.925911],[20.490829,100.925552],[20.491171,100.924057],[20.49114,100.923424],[20.49077,100.92276],[20.489731,100.921677],[20.48945,100.921021],[20.489349,100.920464],[20.489,100.919884],[20.4884,100.919647],[20.48777,100.919579],[20.487341,100.919411],[20.487,100.918861],[20.486811,100.918312],[20.485781,100.918266],[20.48568,100.918182],[20.485201,100.917587],[20.48465,100.916412],[20.484159,100.91584],[20.482771,100.914902],[20.4821,100.914253],[20.48135,100.912987],[20.480671,100.912178],[20.480471,100.911392],[20.480471,100.91098],[20.480089,100.910461],[20.479731,100.910301],[20.479071,100.90979],[20.47794,100.909103],[20.477369,100.908531],[20.476601,100.906883],[20.47571,100.90554],[20.474541,100.904732],[20.473881,100.904083],[20.472811,100.903282],[20.47242,100.903183],[20.472,100.903503],[20.471279,100.904449],[20.470301,100.904877],[20.469681,100.904831],[20.46957,100.904793],[20.46909,100.904823],[20.46899,100.9049],[20.468519,100.905083],[20.468321,100.904953],[20.467649,100.904373],[20.46719,100.904243],[20.466841,100.904373],[20.46665,100.904541],[20.4662,100.90477],[20.466,100.904678],[20.46546,100.903999],[20.465309,100.903397],[20.465151,100.902946],[20.464861,100.902763],[20.464399,100.902634],[20.464001,100.902367],[20.463751,100.901993],[20.463631,100.901466],[20.46343,100.901207],[20.463039,100.901466],[20.46282,100.90168],[20.462469,100.901588],[20.46212,100.900787],[20.46162,100.900551],[20.46133,100.900681],[20.46069,100.900719],[20.45845,100.899513],[20.457861,100.899582],[20.45747,100.899841],[20.456659,100.900284],[20.456261,100.900414],[20.455641,100.900398],[20.455151,100.900307],[20.455021,100.900269],[20.454729,100.900047],[20.45451,100.899963],[20.45429,100.899986],[20.45396,100.900497],[20.45385,100.901176],[20.453739,100.90139],[20.453609,100.901497],[20.452829,100.901802],[20.452379,100.902184],[20.452061,100.902313],[20.451651,100.902046],[20.451401,100.902023],[20.451059,100.902046],[20.450279,100.902458],[20.45005,100.902367],[20.449881,100.902206],[20.44982,100.902008],[20.4499,100.901688],[20.45009,100.90136],[20.45014,100.900932],[20.449961,100.900688],[20.449631,100.900429],[20.44912,100.900352],[20.448231,100.900642],[20.447929,100.900574],[20.44776,100.900124],[20.447121,100.899727],[20.446989,100.89901],[20.446911,100.898842],[20.44643,100.898232],[20.44639,100.897873],[20.446119,100.897621],[20.445709,100.897324],[20.44548,100.897087],[20.44516,100.896988],[20.44486,100.896957],[20.44445,100.896759],[20.443979,100.896339],[20.44319,100.89537],[20.44272,100.895103],[20.44248,100.894997],[20.44202,100.894943],[20.441351,100.894531],[20.441059,100.893669],[20.44046,100.892189],[20.43977,100.890793],[20.43943,100.890282],[20.438919,100.889763],[20.43788,100.889023],[20.43775,100.888542],[20.437759,100.888077],[20.43762,100.887833],[20.43714,100.887604],[20.43623,100.887047],[20.43495,100.886482],[20.43429,100.886368],[20.433781,100.886124],[20.433281,100.885551],[20.432489,100.884438],[20.43186,100.883698],[20.431721,100.883377],[20.43148,100.882393],[20.43161,100.881477],[20.431881,100.880569],[20.432011,100.879272],[20.432039,100.878532],[20.4324,100.877853],[20.43273,100.877502],[20.432911,100.877068],[20.43289,100.876793],[20.4321,100.875381],[20.43191,100.874802],[20.43194,100.87458],[20.432581,100.872719],[20.432581,100.872276],[20.43252,100.872063],[20.43162,100.870483],[20.431311,100.870262],[20.430981,100.870163],[20.43005,100.869987],[20.429199,100.869553],[20.428631,100.869164],[20.42746,100.868912],[20.42679,100.868423],[20.425791,100.865967],[20.425171,100.865547],[20.42388,100.865791],[20.42346,100.865646],[20.422541,100.865097],[20.42201,100.865021],[20.42149,100.86512],[20.421021,100.865021],[20.42034,100.864563],[20.41993,100.86441],[20.418819,100.864616],[20.4179,100.864693],[20.417549,100.864601],[20.417191,100.864342],[20.416691,100.863647],[20.41651,100.863052],[20.416361,100.862183],[20.41654,100.86145],[20.417061,100.861153],[20.417681,100.86113],[20.418091,100.860687],[20.41827,100.859192],[20.418051,100.858353],[20.41744,100.857529],[20.41696,100.856644],[20.41647,100.855377],[20.416161,100.854729],[20.41585,100.853371],[20.41531,100.852493],[20.414829,100.851921],[20.41411,100.851807],[20.413851,100.851913],[20.41334,100.851891],[20.41227,100.851173],[20.411011,100.850693],[20.41024,100.850456],[20.409161,100.850647],[20.4083,100.851181],[20.40797,100.851501],[20.407829,100.85173],[20.407471,100.851898],[20.40719,100.851692],[20.406799,100.851608],[20.406441,100.85186],[20.40589,100.851952],[20.405939,100.851692],[20.40617,100.851547],[20.406401,100.851303],[20.406481,100.850723],[20.4063,100.850304],[20.4062,100.849747],[20.406031,100.849426],[20.40575,100.84903],[20.405689,100.848663],[20.405701,100.848289],[20.4056,100.848053],[20.405199,100.847672],[20.404961,100.847282],[20.4039,100.844551],[20.40336,100.84343],[20.40317,100.84256],[20.402519,100.841721],[20.40229,100.841179],[20.402269,100.840698],[20.40242,100.840233],[20.40267,100.839737],[20.402769,100.838913],[20.40255,100.838364],[20.402349,100.838127],[20.401461,100.837593],[20.401011,100.837212],[20.40053,100.836159],[20.400261,100.835037],[20.39954,100.833992],[20.399269,100.83374],[20.398939,100.83287],[20.398991,100.832283],[20.39875,100.83165],[20.398331,100.83136],[20.3974,100.83091],[20.39673,100.83007],[20.396311,100.829826],[20.3958,100.829758],[20.395069,100.82946],[20.39382,100.828629],[20.39279,100.828011],[20.392191,100.827499],[20.391821,100.826736],[20.391741,100.825974],[20.39159,100.8255],[20.391411,100.825127],[20.38825,100.819542],[20.38793,100.819183],[20.387569,100.818626],[20.387489,100.818451],[20.387341,100.817963],[20.38714,100.816818],[20.386801,100.815941],[20.386749,100.815369],[20.38707,100.81385],[20.387199,100.813408],[20.387409,100.813042],[20.387449,100.81279],[20.38743,100.812622],[20.387119,100.812263],[20.386539,100.81205],[20.386061,100.811661],[20.385509,100.811409],[20.38489,100.811539],[20.3846,100.811523],[20.38423,100.811234],[20.383739,100.810417],[20.38348,100.810173],[20.38299,100.809921],[20.382561,100.809387],[20.38196,100.807297],[20.38113,100.805763],[20.380911,100.804916],[20.38061,100.804077],[20.38055,100.803352],[20.38064,100.802711],[20.3804,100.801903],[20.379869,100.801193],[20.3792,100.8004],[20.378929,100.799477],[20.378759,100.798393],[20.37841,100.797707],[20.377251,100.796219],[20.376989,100.795158],[20.376949,100.793961],[20.37689,100.793716],[20.375931,100.79213],[20.37571,100.791107],[20.375681,100.789543],[20.375401,100.788361],[20.374701,100.786774],[20.374371,100.785843],[20.372959,100.782387],[20.372789,100.781883],[20.3727,100.781303],[20.37212,100.780533],[20.37154,100.779892],[20.371189,100.779694],[20.37081,100.779663],[20.37048,100.7798],[20.36981,100.780281],[20.368521,100.780807],[20.368019,100.780952],[20.367649,100.780861],[20.367491,100.780609],[20.367319,100.780083],[20.367041,100.779579],[20.36451,100.776817],[20.364189,100.776627],[20.363819,100.776787],[20.363609,100.777168],[20.3634,100.777367],[20.362921,100.777603],[20.3626,100.777847],[20.36236,100.777977],[20.362089,100.77774],[20.362089,100.777489],[20.362631,100.776283],[20.36305,100.774963],[20.363199,100.7743],[20.36344,100.773872],[20.363831,100.773392],[20.363911,100.77298],[20.363729,100.772507],[20.363569,100.772301],[20.36347,100.771698],[20.363581,100.771027],[20.36319,100.770531],[20.36265,100.769958],[20.36215,100.769112],[20.36161,100.768837],[20.36137,100.768867],[20.36116,100.768822],[20.36088,100.768646],[20.360689,100.768097],[20.360809,100.767242],[20.360649,100.766617],[20.36017,100.765137],[20.36006,100.764549],[20.360109,100.763947],[20.360519,100.763573],[20.36062,100.763557],[20.36084,100.76339],[20.360979,100.762657],[20.361469,100.762306],[20.36165,100.762062],[20.361641,100.761658],[20.361,100.760948],[20.36079,100.760422],[20.36071,100.76001],[20.3608,100.759506],[20.360941,100.759323],[20.361179,100.759109],[20.36128,100.758728],[20.361179,100.758553],[20.36101,100.757988],[20.361059,100.757187],[20.361031,100.756912],[20.36109,100.756393],[20.360991,100.75592],[20.360701,100.755699],[20.360519,100.755363],[20.3605,100.755219],[20.360491,100.754608],[20.3606,100.754219],[20.36092,100.753792],[20.36104,100.752907],[20.360901,100.752434],[20.36084,100.750587],[20.36058,100.749977],[20.360451,100.749313],[20.3603,100.748833],[20.360041,100.748421],[20.359171,100.747307],[20.35895,100.746758],[20.358841,100.745842],[20.358509,100.744392],[20.358709,100.743652],[20.35891,100.743362],[20.35898,100.742538],[20.3589,100.742188],[20.35845,100.741653],[20.357941,100.741547],[20.35754,100.741432],[20.356831,100.740913],[20.356331,100.740807],[20.35593,100.740837],[20.35537,100.740517],[20.355209,100.740196],[20.354429,100.738113],[20.35376,100.736107],[20.353001,100.734627],[20.352421,100.733772],[20.352209,100.733543],[20.351999,100.733192],[20.351879,100.73275],[20.351839,100.732262],[20.351891,100.731537],[20.35169,100.730789],[20.351521,100.730362],[20.35149,100.729736],[20.35153,100.729507],[20.35186,100.729012],[20.353081,100.727547],[20.355471,100.725609],[20.355841,100.724991],[20.35594,100.724503],[20.35598,100.721733],[20.355761,100.721252],[20.354799,100.7202],[20.354271,100.719833],[20.35388,100.719398],[20.35384,100.718674],[20.35331,100.717789],[20.35264,100.717194],[20.35252,100.71669],[20.35284,100.715897],[20.35318,100.715599],[20.353701,100.715561],[20.35397,100.715111],[20.35391,100.714462],[20.354231,100.713768],[20.35479,100.713478],[20.35507,100.71312],[20.355579,100.712921],[20.35626,100.713051],[20.357,100.71286],[20.35745,100.712578],[20.358089,100.711929],[20.35874,100.711441],[20.35887,100.711403],[20.35931,100.711357],[20.35961,100.711456],[20.36083,100.712143],[20.36128,100.71212],[20.36129,100.711639],[20.36125,100.71096],[20.36128,100.710663],[20.361561,100.710159],[20.36167,100.709839],[20.361679,100.709351],[20.36149,100.708809],[20.3615,100.70829],[20.36186,100.707458],[20.361879,100.706818],[20.36179,100.705933],[20.361799,100.704933],[20.361879,100.704659],[20.36215,100.704163],[20.36253,100.703773],[20.36327,100.703308],[20.36344,100.70314],[20.363621,100.702858],[20.363569,100.7024],[20.363199,100.701279],[20.36265,100.700531],[20.362511,100.700272],[20.3627,100.698997],[20.363359,100.69799],[20.363741,100.696861],[20.364189,100.695938],[20.365049,100.694862],[20.36602,100.693771],[20.367121,100.692047],[20.367201,100.691879],[20.36727,100.690613],[20.36672,100.689194],[20.366659,100.688438],[20.366449,100.687683],[20.366079,100.687073],[20.365471,100.686607],[20.36454,100.686203],[20.364031,100.685371],[20.364111,100.684464],[20.36484,100.682533],[20.36484,100.682167],[20.364559,100.680946],[20.364309,100.680222],[20.364389,100.679558],[20.36446,100.679359],[20.364479,100.678917],[20.364429,100.678467],[20.364491,100.678032],[20.364611,100.677727],[20.364639,100.677147],[20.36442,100.676842],[20.36405,100.676666],[20.3631,100.676376],[20.36293,100.676277],[20.362341,100.675774],[20.36183,100.675163],[20.36145,100.674423],[20.361349,100.674026],[20.361389,100.672523],[20.36096,100.670631],[20.36039,100.66877],[20.36035,100.667908],[20.3601,100.667038],[20.359289,100.665192],[20.358999,100.664146],[20.35878,100.663017],[20.35887,100.662514],[20.358971,100.662277],[20.35936,100.661819],[20.359591,100.661163],[20.359501,100.660599],[20.359249,100.659683],[20.35911,100.657623],[20.358919,100.657127],[20.35828,100.656113],[20.358061,100.655678],[20.358009,100.654892],[20.3578,100.65432],[20.356991,100.653603],[20.356319,100.652359],[20.35602,100.651573],[20.355881,100.650909],[20.355579,100.648392],[20.355459,100.647987],[20.355089,100.647163],[20.355061,100.646568],[20.35541,100.646088],[20.3556,100.6455],[20.35557,100.644867],[20.355499,100.644569],[20.35507,100.643646],[20.35486,100.642967],[20.35471,100.642616],[20.354441,100.642212],[20.354469,100.641777],[20.355169,100.641617],[20.35548,100.641289],[20.355471,100.641037],[20.35537,100.640633],[20.35556,100.640099],[20.35564,100.639603],[20.35552,100.639214],[20.35527,100.638763],[20.35511,100.637718],[20.35515,100.637253],[20.355499,100.636238],[20.355551,100.635612],[20.35533,100.634941],[20.355101,100.634422],[20.355089,100.633911],[20.35535,100.633087],[20.355749,100.632797],[20.356001,100.632721],[20.35652,100.632339],[20.35663,100.632118],[20.357059,100.631897],[20.357349,100.632187],[20.35779,100.633057],[20.35833,100.633522],[20.359249,100.633881],[20.35972,100.633789],[20.3606,100.633453],[20.36109,100.63372],[20.36145,100.633698],[20.36198,100.633423],[20.36241,100.6325],[20.36285,100.631653],[20.36348,100.631264],[20.36356,100.630981],[20.36334,100.629883],[20.363649,100.629463],[20.363951,100.629417],[20.364241,100.629646],[20.36475,100.630089],[20.366261,100.630089],[20.36676,100.630257],[20.36722,100.630241],[20.367359,100.630096],[20.367661,100.62915],[20.36801,100.628601],[20.36879,100.628143],[20.369249,100.627342],[20.36919,100.6269],[20.368679,100.626373],[20.36817,100.624977],[20.36775,100.62352],[20.36764,100.622238],[20.36821,100.621208],[20.368561,100.620399],[20.36894,100.617233],[20.36931,100.615646],[20.369789,100.614014],[20.370131,100.613327],[20.37133,100.612297],[20.371679,100.611603],[20.37171,100.611191],[20.371889,100.610779],[20.37208,100.610573],[20.372219,100.610008],[20.371969,100.609047],[20.372511,100.607971],[20.374069,100.606483],[20.374969,100.605927],[20.376051,100.606056],[20.38036,100.602577],[20.38096,100.601677],[20.381519,100.600143],[20.38242,100.598907],[20.382891,100.596527],[20.383659,100.594353],[20.385059,100.59182],[20.38669,100.590233],[20.387131,100.587471],[20.387171,100.586563],[20.38603,100.583878],[20.380939,100.576797],[20.380171,100.575996],[20.36994,100.571991],[20.36841,100.570488],[20.3664,100.568863],[20.36528,100.567017],[20.364679,100.564987],[20.360701,100.554718],[20.358471,100.553917],[20.35429,100.54924],[20.35074,100.543022],[20.349541,100.541199],[20.348101,100.539291],[20.347191,100.538368],[20.342621,100.534698],[20.341419,100.533577],[20.340731,100.532547],[20.338511,100.530228],[20.337061,100.528732],[20.336281,100.528328],[20.33316,100.527657],[20.33197,100.526894],[20.33049,100.525299],[20.329559,100.524841],[20.32822,100.524857],[20.32708,100.524368],[20.32666,100.523468],[20.326349,100.5215],[20.325621,100.518784],[20.324909,100.518204],[20.324181,100.518158],[20.323641,100.518646],[20.321939,100.520767],[20.321239,100.521683],[20.320419,100.522118],[20.319901,100.522209],[20.318251,100.522148],[20.317381,100.522507],[20.316191,100.523354],[20.31547,100.523369],[20.31489,100.522926],[20.314529,100.52272],[20.313761,100.522552],[20.311609,100.520554],[20.310949,100.519928],[20.30965,100.518463],[20.30732,100.516968],[20.306,100.516747],[20.30275,100.517471],[20.300171,100.516441],[20.29899,100.51564],[20.29772,100.514442],[20.29727,100.512657],[20.297359,100.511261],[20.29715,100.510277],[20.296301,100.509506],[20.29497,100.509071],[20.29368,100.509033],[20.29195,100.506844],[20.2903,100.50457],[20.285521,100.502708],[20.283449,100.498299],[20.283251,100.496407],[20.280399,100.493027],[20.27717,100.491127],[20.27722,100.485771],[20.27581,100.479683],[20.274639,100.478523],[20.276501,100.473183],[20.27618,100.469414],[20.274891,100.467171],[20.273279,100.463387],[20.26845,100.46254],[20.26667,100.463539],[20.264891,100.464142],[20.263081,100.463921],[20.261669,100.464081],[20.26067,100.463333],[20.25362,100.451843],[20.251631,100.44397],[20.249929,100.44194],[20.24954,100.441002],[20.24959,100.439781],[20.249439,100.438667],[20.24979,100.437653],[20.250509,100.43676],[20.251249,100.436211],[20.251579,100.435791],[20.2516,100.434952],[20.25148,100.434082],[20.251381,100.433037],[20.25115,100.432297],[20.250879,100.431953],[20.25086,100.43148],[20.251381,100.430908],[20.25153,100.430489],[20.25128,100.430344],[20.25071,100.430359],[20.25016,100.430138],[20.25004,100.429741],[20.24996,100.428307],[20.25029,100.426987],[20.2505,100.426437],[20.25102,100.425758],[20.251671,100.425217],[20.252331,100.42408],[20.25292,100.42347],[20.25317,100.422729],[20.25334,100.422363],[20.254629,100.420921],[20.25526,100.420212],[20.25573,100.419533],[20.256161,100.418854],[20.2575,100.418037],[20.26022,100.416687],[20.26158,100.416077],[20.26276,100.415337],[20.263371,100.415131],[20.264509,100.415283],[20.26535,100.415337],[20.26556,100.415237],[20.26605,100.414757],[20.26685,100.414177],[20.267191,100.414017],[20.26763,100.413971],[20.26852,100.413879],[20.269581,100.413933],[20.270361,100.413727],[20.27227,100.413208],[20.27359,100.412773],[20.274349,100.412514],[20.27471,100.412376],[20.27606,100.411873],[20.276831,100.411552],[20.276409,100.410561],[20.276279,100.410294],[20.27615,100.409988],[20.27606,100.409683],[20.27594,100.409302],[20.275141,100.406822],[20.27511,100.40654],[20.275169,100.406197],[20.275311,100.406013],[20.275841,100.405251],[20.27589,100.404793],[20.275749,100.404839],[20.27441,100.405243],[20.27425,100.403351],[20.27413,100.402611],[20.27413,100.401932],[20.27434,100.401443],[20.274639,100.401062],[20.274851,100.400742],[20.274929,100.400337],[20.27487,100.399857],[20.27471,100.399567],[20.27459,100.399223],[20.274679,100.398827],[20.27494,100.398552],[20.27527,100.398163],[20.275551,100.397858],[20.275881,100.397522],[20.276079,100.397163],[20.276199,100.396843],[20.27632,100.396652],[20.27663,100.396622],[20.276911,100.396667],[20.27717,100.396584],[20.277411,100.396347],[20.27774,100.396149],[20.278099,100.39595],[20.27853,100.395973],[20.27895,100.396049],[20.279409,100.396217],[20.279831,100.396118],[20.280199,100.395813],[20.28047,100.3955],[20.280781,100.395203],[20.281601,100.394882],[20.282761,100.394447],[20.28368,100.394043],[20.28441,100.393593],[20.28524,100.393028],[20.28595,100.392647],[20.28698,100.391853],[20.28813,100.390877],[20.288759,100.390312],[20.289141,100.390083],[20.289619,100.389954],[20.289841,100.389992],[20.290581,100.390106],[20.291149,100.390129],[20.291599,100.390091],[20.29217,100.389877],[20.292589,100.389542],[20.292999,100.389359],[20.293369,100.389374],[20.293961,100.389542],[20.29447,100.389641],[20.294821,100.38961],[20.295271,100.38929],[20.295679,100.388977],[20.296261,100.388687],[20.296801,100.388641],[20.29731,100.388573],[20.29837,100.388542],[20.30019,100.388527],[20.30183,100.388512],[20.302429,100.388474],[20.30319,100.38829],[20.303801,100.388153],[20.3043,100.388008],[20.304621,100.387787],[20.304831,100.387444],[20.30509,100.386993],[20.30526,100.386574],[20.305479,100.386139],[20.30575,100.385818],[20.30608,100.385567],[20.306459,100.385223],[20.30687,100.38485],[20.307541,100.384323],[20.308189,100.383972],[20.30883,100.383537],[20.309139,100.383232],[20.309401,100.382782],[20.309681,100.382477],[20.31003,100.382294],[20.31057,100.382057],[20.31098,100.381866],[20.31156,100.381599],[20.31197,100.381378],[20.3123,100.381279],[20.312639,100.381027],[20.312889,100.380707],[20.313,100.380417],[20.313311,100.380112],[20.313641,100.379959],[20.31443,100.380043],[20.314791,100.380081],[20.315161,100.380127],[20.315491,100.379982],[20.31592,100.379784],[20.31637,100.379608],[20.31674,100.379433],[20.317169,100.379242],[20.3176,100.379158],[20.318119,100.379059],[20.31848,100.378937],[20.31889,100.37886],[20.319321,100.37886],[20.319889,100.37899],[20.3204,100.379143],[20.3209,100.379341],[20.321369,100.379547],[20.3218,100.379631],[20.322241,100.379623],[20.322611,100.379562],[20.32299,100.379532],[20.323339,100.379608],[20.323641,100.379692],[20.32411,100.379707],[20.32449,100.379662],[20.324921,100.379608],[20.32535,100.379517],[20.325729,100.379341],[20.326059,100.379143],[20.326441,100.379028],[20.32682,100.378967],[20.327221,100.37899],[20.32765,100.37886],[20.328011,100.378616],[20.32826,100.378326],[20.32863,100.377823],[20.328859,100.377487],[20.329109,100.377243],[20.32934,100.37706],[20.32963,100.376953],[20.329941,100.37664],[20.330299,100.376266],[20.330561,100.376167],[20.330811,100.376137],[20.331169,100.37616],[20.33145,100.376137],[20.331779,100.37606],[20.33213,100.375977],[20.332411,100.375961],[20.33263,100.376106],[20.332979,100.376221],[20.33329,100.376259],[20.33354,100.376228],[20.3339,100.37606],[20.3342,100.375877],[20.334539,100.375771],[20.334829,100.375763],[20.335251,100.37574],[20.335541,100.375763],[20.336029,100.375687],[20.33626,100.375671],[20.33643,100.375603],[20.3367,100.375473],[20.33703,100.37532],[20.337179,100.375252],[20.33742,100.375221],[20.337721,100.375191],[20.33802,100.375168],[20.338261,100.375038],[20.3384,100.37484],[20.33847,100.374542],[20.338579,100.374367],[20.33876,100.374283],[20.33905,100.374123],[20.339331,100.37397],[20.33963,100.373917],[20.33988,100.373917],[20.340219,100.37394],[20.34067,100.374039],[20.34096,100.374138],[20.34128,100.374191],[20.341631,100.374268],[20.34194,100.374222],[20.342171,100.374153],[20.34252,100.373993],[20.342779,100.373787],[20.342979,100.373619],[20.343149,100.37355],[20.343321,100.373573],[20.343439,100.373718],[20.343571,100.373993],[20.343639,100.374237],[20.343809,100.374451],[20.343969,100.374527],[20.3442,100.374588],[20.34449,100.374496],[20.34466,100.374367],[20.34499,100.374252],[20.345261,100.374168],[20.34564,100.373993],[20.3459,100.373756],[20.346201,100.373489],[20.346491,100.373222],[20.346901,100.372871],[20.34734,100.372421],[20.347401,100.372139],[20.347389,100.371803],[20.34742,100.371429],[20.34758,100.371147],[20.347691,100.370857],[20.347719,100.370499],[20.34775,100.370102],[20.34761,100.369751],[20.34746,100.369431],[20.347361,100.369164],[20.347429,100.368942],[20.34758,100.368767],[20.347799,100.368683],[20.348209,100.368736],[20.34856,100.368912],[20.34897,100.36911],[20.34931,100.369164],[20.349791,100.369118],[20.349871,100.368912],[20.34984,100.368584],[20.349751,100.368134],[20.34972,100.367828],[20.349819,100.367561],[20.35001,100.367409],[20.35022,100.367233],[20.3503,100.367058],[20.35021,100.366707],[20.34993,100.366386],[20.349001,100.365578],[20.34866,100.365158],[20.34852,100.364922],[20.34848,100.364563],[20.348579,100.364326],[20.34877,100.36412],[20.34897,100.363853],[20.348961,100.363533],[20.348801,100.363327],[20.348669,100.362938],[20.34873,100.362701],[20.348989,100.362427],[20.349251,100.362289],[20.34955,100.362137],[20.349911,100.362083],[20.35025,100.362068],[20.350719,100.361977],[20.351009,100.361893],[20.35121,100.361671],[20.35161,100.361397],[20.35191,100.361214],[20.35211,100.360901],[20.352079,100.360527],[20.35183,100.360138],[20.35158,100.359779],[20.35137,100.359253],[20.351299,100.358719],[20.351219,100.358002],[20.351151,100.357384],[20.35108,100.356857],[20.35088,100.356483],[20.3505,100.35611],[20.350109,100.355629],[20.349871,100.355217],[20.349701,100.354683],[20.349489,100.353912],[20.3491,100.352753],[20.348801,100.351936],[20.347561,100.350304],[20.346901,100.349297],[20.34656,100.348129],[20.34656,100.346901],[20.34639,100.345123],[20.34589,100.342987],[20.34516,100.339973],[20.344601,100.337914],[20.34466,100.335854],[20.344879,100.334167],[20.345329,100.333328],[20.34606,100.332893],[20.346901,100.333107],[20.34745,100.332718],[20.34734,100.3321],[20.34667,100.3321],[20.34568,100.33152],[20.34479,100.33123],[20.344589,100.330742],[20.34436,100.330368],[20.3437,100.330139],[20.34333,100.329803],[20.343019,100.32917],[20.342899,100.328369],[20.342899,100.32785],[20.343189,100.327393],[20.34322,100.326973],[20.34284,100.326714],[20.341669,100.326073],[20.341101,100.325531],[20.34067,100.325218],[20.339979,100.325218],[20.33952,100.325363],[20.338831,100.325241],[20.337999,100.324783],[20.33737,100.324211],[20.336769,100.323593],[20.335369,100.321274],[20.33522,100.320747],[20.334881,100.320259],[20.334339,100.319633],[20.334311,100.319199],[20.334391,100.318741],[20.33345,100.317093],[20.33288,100.317253],[20.332331,100.317337],[20.332081,100.317047],[20.33202,100.316566],[20.331619,100.316277],[20.32967,100.315422],[20.328091,100.314957],[20.32715,100.314362],[20.32658,100.313927],[20.326229,100.313393],[20.32612,100.312607],[20.32629,100.311546],[20.326151,100.310982],[20.325741,100.310516],[20.325371,100.310013],[20.325371,100.30941],[20.325689,100.307892],[20.32563,100.307426],[20.32514,100.306969],[20.324711,100.306427],[20.324051,100.305222],[20.323879,100.304573],[20.32357,100.303909],[20.32328,100.302879],[20.32291,100.301643],[20.322769,100.299751],[20.322571,100.298439],[20.32239,100.298073],[20.32202,100.297722],[20.32185,100.297348],[20.32165,100.296204],[20.321079,100.29483],[20.32073,100.293877],[20.32056,100.293022],[20.320789,100.290817],[20.320669,100.290329],[20.32053,100.289558],[20.31967,100.287437],[20.319361,100.287117],[20.31864,100.287163],[20.31818,100.28672],[20.31793,100.286179],[20.317381,100.284973],[20.31695,100.284317],[20.31624,100.283859],[20.31472,100.282997],[20.31423,100.2826],[20.313431,100.281357],[20.311621,100.277206],[20.31111,100.275887],[20.31082,100.275146],[20.30908,100.273827],[20.308451,100.273232],[20.307671,100.27137],[20.306641,100.269279],[20.306499,100.268623],[20.306499,100.265617],[20.306391,100.264183],[20.306129,100.263184],[20.305241,100.259972],[20.304871,100.258171],[20.304581,100.256622],[20.304291,100.253304],[20.30401,100.252586],[20.30341,100.252007],[20.302691,100.251839],[20.30192,100.251839],[20.301399,100.251747],[20.301121,100.251442],[20.300911,100.250214],[20.301001,100.247398],[20.30077,100.24614],[20.30043,100.245506],[20.29974,100.243019],[20.29954,100.240044],[20.29954,100.239563],[20.2992,100.239067],[20.29874,100.23864],[20.29825,100.238319],[20.29814,100.238037],[20.298161,100.234253],[20.29882,100.231483],[20.29908,100.229813],[20.299391,100.228607],[20.29949,100.227859],[20.299549,100.227211],[20.299721,100.226501],[20.299419,100.226082],[20.29817,100.224533],[20.29698,100.223846],[20.29533,100.22316],[20.29389,100.222473],[20.29315,100.222061],[20.292789,100.22155],[20.29199,100.221207],[20.29141,100.220932],[20.29093,100.220421],[20.29035,100.220078],[20.289249,100.219971],[20.288321,100.219727],[20.28706,100.219116],[20.28581,100.218048],[20.28484,100.217056],[20.283461,100.215637],[20.28233,100.214523],[20.280979,100.213013],[20.280149,100.211906],[20.27915,100.210457],[20.27844,100.209396],[20.278021,100.208717],[20.27783,100.207817],[20.27783,100.206902],[20.277571,100.205872],[20.27689,100.204773],[20.27615,100.203918],[20.27496,100.202103],[20.27429,100.200829],[20.27364,100.199516],[20.27281,100.19873],[20.271811,100.197639],[20.27062,100.196159],[20.27001,100.195267],[20.26927,100.194267],[20.26849,100.193413],[20.266081,100.191048],[20.265209,100.190262],[20.264339,100.189812],[20.26322,100.188988],[20.262699,100.188507],[20.26235,100.187859],[20.26174,100.186447],[20.260771,100.184647],[20.26021,100.182938],[20.26037,100.181908],[20.260679,100.180908],[20.2579,100.180527],[20.25491,100.17997],[20.253241,100.179314],[20.25135,100.179642],[20.249689,100.178421],[20.24847,100.17775],[20.247311,100.177437],[20.24621,100.177254],[20.2451,100.176331],[20.2435,100.174347],[20.242241,100.171883],[20.24194,100.171043],[20.24098,100.169128],[20.240601,100.167412],[20.24003,100.166458],[20.23889,100.165314],[20.238159,100.16391],[20.2374,100.161568],[20.237129,100.160439],[20.23694,100.157692],[20.23774,100.155632],[20.240351,100.150452],[20.24041,100.149551],[20.24004,100.149002],[20.238899,100.148613],[20.230089,100.145058],[20.227119,100.143799],[20.2234,100.144203],[20.22238,100.144028],[20.22163,100.14357],[20.22163,100.142311],[20.221689,100.136833],[20.22123,100.135452],[20.220779,100.134201],[20.2202,100.133003],[20.22032,100.132187],[20.220551,100.131569],[20.220949,100.130943],[20.22146,100.130539],[20.22238,100.130081],[20.2234,100.130028],[20.22426,100.130081],[20.225401,100.12957],[20.226839,100.128822],[20.228889,100.127907],[20.231239,100.126938],[20.232719,100.126312],[20.234501,100.125633],[20.235689,100.125282],[20.236549,100.125282],[20.23838,100.125557],[20.238951,100.125633],[20.239269,100.125359],[20.24003,100.124641],[20.24082,100.124222],[20.24209,100.123596],[20.24258,100.123177],[20.24321,100.122581],[20.24362,100.121933],[20.244169,100.120911],[20.244329,100.11969],[20.244141,100.114143],[20.244221,100.112823],[20.24461,100.111748],[20.24552,100.107658],[20.245569,100.105873],[20.246019,100.10495],[20.247499,100.102898],[20.248671,100.102791],[20.24914,100.102608],[20.25177,100.100777],[20.25688,100.097267],[20.258829,100.095711],[20.260731,100.093811],[20.259911,100.086281],[20.26025,100.084396],[20.261,100.082962],[20.262091,100.08181],[20.26926,100.076973],[20.26903,100.076843],[20.26845,100.076431],[20.26779,100.075684],[20.267691,100.075569],[20.2675,100.075333],[20.26725,100.074577],[20.267429,100.073776],[20.267599,100.073517],[20.267969,100.073036],[20.26873,100.072037],[20.268869,100.071808],[20.26894,100.071388],[20.268921,100.071098],[20.268801,100.069023],[20.26877,100.068626],[20.268709,100.067993],[20.26874,100.06781],[20.268801,100.067451],[20.269529,100.065788],[20.269621,100.065353],[20.26969,100.058792],[20.269739,100.057213],[20.269831,100.05687],[20.269979,100.056557],[20.27109,100.05513],[20.27137,100.054642],[20.27169,100.053932],[20.271879,100.053352],[20.2719,100.053291],[20.27212,100.051521],[20.27227,100.050903],[20.272511,100.050468],[20.272829,100.050049],[20.27322,100.049713],[20.27532,100.048187],[20.27696,100.046913],[20.278509,100.045799],[20.27902,100.04528],[20.279329,100.045052],[20.28196,100.043381],[20.28227,100.042969],[20.28232,100.042664],[20.28199,100.039772],[20.28216,100.037811],[20.28245,100.036713],[20.28249,100.03656],[20.283291,100.033943],[20.283461,100.032356],[20.28355,100.031937],[20.284889,100.027328],[20.28492,100.027069],[20.284889,100.026711],[20.284451,100.025642],[20.283649,100.02253],[20.282631,100.019608],[20.282459,100.019379],[20.2822,100.019218],[20.281549,100.018822],[20.281281,100.018517],[20.28104,100.017998],[20.28096,100.01783],[20.28046,100.016228],[20.280319,100.015823],[20.27994,100.014809],[20.27947,100.013863],[20.27894,100.012939],[20.278629,100.01239],[20.278191,100.011948],[20.277611,100.011673],[20.276871,100.011414],[20.276529,100.011253],[20.27626,100.010933],[20.2761,100.010567],[20.276011,100.009956],[20.276039,100.008537],[20.276131,100.008118],[20.276381,100.007423],[20.27643,100.007057],[20.27619,100.006447],[20.27611,100.005913],[20.276131,100.005661],[20.276541,100.004341],[20.27739,100.002243],[20.277519,100.001602],[20.27751,100.00135],[20.27717,100.000137],[20.27632,99.99839],[20.27622,99.997864],[20.27598,99.995117],[20.27578,99.994469],[20.2752,99.993393],[20.27483,99.992889],[20.274389,99.992393],[20.273899,99.991982],[20.2733,99.991608],[20.272711,99.991333],[20.27207,99.991112],[20.271151,99.990799],[20.26943,99.990196],[20.267929,99.989693],[20.26746,99.989517],[20.265051,99.98867],[20.260799,99.986908],[20.26021,99.986603],[20.25956,99.986122],[20.258579,99.98526],[20.25312,99.980637],[20.250441,99.978249],[20.249901,99.977707],[20.24902,99.976723],[20.24851,99.976128],[20.24799,99.975517],[20.243361,99.969711],[20.24229,99.968307],[20.23768,99.961952],[20.237089,99.961243],[20.23678,99.960907],[20.236469,99.960709],[20.23546,99.960403],[20.235189,99.960258],[20.235001,99.960167],[20.23457,99.959831],[20.23427,99.959534],[20.231171,99.955971],[20.23019,99.954781],[20.229759,99.954353],[20.22612,99.950317],[20.225361,99.949493],[20.223261,99.947304],[20.22253,99.946472],[20.22105,99.944946],[20.2173,99.940514],[20.21426,99.936852],[20.213909,99.936417],[20.210979,99.933022],[20.20336,99.924316],[20.20289,99.923752],[20.20256,99.923363],[20.20229,99.922813],[20.20085,99.919243],[20.200251,99.917732],[20.199671,99.916267],[20.199181,99.915077],[20.19784,99.911629],[20.19697,99.90963],[20.19672,99.908997],[20.196461,99.908287],[20.19632,99.907944],[20.19614,99.907539],[20.195181,99.905983],[20.19488,99.905342],[20.19462,99.904213],[20.19449,99.903137],[20.194229,99.901459],[20.19413,99.900963],[20.193979,99.90033],[20.19376,99.899719],[20.19334,99.898857],[20.192921,99.898331],[20.192261,99.897476],[20.1915,99.896606],[20.190639,99.895409],[20.187269,99.891022],[20.18634,99.889763],[20.185221,99.888191],[20.18457,99.887154],[20.18409,99.886269],[20.18368,99.885536],[20.18329,99.884857],[20.182751,99.883904],[20.18235,99.883186],[20.181841,99.882294],[20.181511,99.881844],[20.18092,99.881378],[20.18082,99.881287],[20.180349,99.880959],[20.179501,99.880363],[20.17819,99.879387],[20.176781,99.878387],[20.174061,99.87645],[20.17366,99.876106],[20.17345,99.875771],[20.1723,99.87352],[20.17215,99.873253],[20.17174,99.872673],[20.17095,99.872009],[20.169439,99.871193],[20.169069,99.87088],[20.16851,99.870308],[20.1668,99.869034],[20.16614,99.868408],[20.164459,99.866531],[20.163719,99.866043],[20.162889,99.865593],[20.160891,99.86451],[20.160801,99.864464],[20.16007,99.864059],[20.15867,99.863297],[20.157801,99.862694],[20.156269,99.861603],[20.156019,99.861389],[20.15589,99.861023],[20.15583,99.860527],[20.15589,99.860184],[20.155491,99.860199],[20.1551,99.860184],[20.1548,99.860092],[20.154181,99.859833],[20.154079,99.859734],[20.153299,99.8591],[20.152769,99.858704],[20.15164,99.858276],[20.147631,99.857521],[20.14694,99.857384],[20.14674,99.857361],[20.145821,99.857262],[20.14502,99.85717],[20.144711,99.85714],[20.143869,99.85704],[20.143379,99.856987],[20.142599,99.856903],[20.139759,99.856598],[20.13909,99.856613],[20.13855,99.856728],[20.137991,99.856918],[20.137341,99.85746],[20.13419,99.860947],[20.13195,99.862442],[20.13092,99.863426],[20.130289,99.863953],[20.12956,99.864464],[20.12685,99.867111],[20.12649,99.867317],[20.126051,99.867447],[20.12459,99.867813],[20.122669,99.868134],[20.12114,99.868584],[20.119909,99.869034],[20.119301,99.869392],[20.118059,99.87043],[20.11643,99.872063],[20.11577,99.87249],[20.11545,99.872627],[20.114981,99.872757],[20.09539,99.874527],[20.09425,99.874573],[20.090561,99.874893],[20.08865,99.874657],[20.08559,99.874527],[20.08499,99.87455],[20.080891,99.874908],[20.079241,99.875107],[20.07443,99.875717],[20.07328,99.875687],[20.06992,99.875542],[20.064859,99.875557],[20.06189,99.875443],[20.05637,99.875359],[20.05394,99.875443],[20.05282,99.875542],[20.049891,99.875992],[20.046709,99.876244],[20.0462,99.876266],[20.04603,99.876282],[20.045691,99.876312],[20.04425,99.876404],[20.04303,99.876297],[20.041679,99.876137],[20.04003,99.875839],[20.03854,99.875542],[20.03141,99.874046],[20.028919,99.873497],[20.026489,99.872787],[20.02272,99.87146],[20.01881,99.870377],[20.014919,99.86937],[20.01181,99.868759],[20.00489,99.867264],[20.004431,99.867188],[20.001101,99.866623],[19.99958,99.866287],[19.998461,99.865959],[19.994511,99.864754],[19.993469,99.864433],[19.991541,99.86377],[19.987789,99.862572],[19.983509,99.861198],[19.977421,99.859497],[19.9772,99.859444],[19.973289,99.858208],[19.969009,99.856873],[19.968769,99.856796],[19.967291,99.856339],[19.962219,99.854317],[19.96102,99.853737],[19.95957,99.853073],[19.956461,99.851562],[19.950371,99.848991],[19.95006,99.848846],[19.94776,99.848],[19.94174,99.8461],[19.941191,99.845947],[19.940399,99.845627],[19.939939,99.845512],[19.939461,99.845451],[19.93458,99.844978],[19.93329,99.844856],[19.9328,99.844833],[19.932329,99.844788],[19.93128,99.844658],[19.930479,99.844559],[19.92926,99.844452],[19.928101,99.844383],[19.927031,99.844254],[19.926519,99.844254],[19.9261,99.844322],[19.925659,99.844429],[19.924841,99.844704],[19.92466,99.844772],[19.92452,99.844833],[19.92285,99.84539],[19.91926,99.84671],[19.919029,99.846786],[19.9188,99.846863],[19.91856,99.846893],[19.918301,99.846916],[19.918011,99.846939],[19.9177,99.846916],[19.91733,99.846863],[19.91716,99.846832],[19.91688,99.846786],[19.91614,99.846657],[19.91597,99.846603],[19.915791,99.846542],[19.915649,99.846451],[19.9156,99.846413],[19.915449,99.846298],[19.91519,99.8461],[19.91506,99.845932],[19.914909,99.845734],[19.91482,99.845551],[19.9144,99.844727],[19.914,99.843964],[19.9137,99.843246],[19.913469,99.842857],[19.9133,99.842613],[19.913071,99.842331],[19.912821,99.842087],[19.91238,99.841667],[19.912121,99.841469],[19.911831,99.841248],[19.911221,99.840927],[19.9109,99.840782],[19.910589,99.840668],[19.910259,99.840652],[19.909861,99.840714],[19.90881,99.840759],[19.908581,99.840767],[19.90823,99.840813],[19.907591,99.840927],[19.907049,99.840973],[19.90662,99.840919],[19.906231,99.840958],[19.90579,99.840981],[19.90518,99.840973],[19.904579,99.840897],[19.903761,99.840767],[19.90309,99.840523],[19.9025,99.840378],[19.901751,99.840179],[19.901529,99.840134],[19.89817,99.839073],[19.896799,99.838638],[19.895309,99.838242],[19.89484,99.838097],[19.89209,99.837196],[19.89089,99.836861],[19.88945,99.836433],[19.879311,99.833359],[19.878031,99.832413],[19.87665,99.831192],[19.872709,99.827423],[19.862711,99.821381],[19.84935,99.809143],[19.836611,99.787727],[19.82707,99.775383],[19.824829,99.766403],[19.82202,99.763603],[19.80855,99.75489],[19.800699,99.753487],[19.78414,99.743393],[19.76815,99.736092],[19.7572,99.733566],[19.746201,99.726852],[19.74276,99.724037],[19.73921,99.722839],[19.72596,99.716492],[19.72014,99.716148],[19.716591,99.71666],[19.71174,99.720444],[19.708179,99.720268],[19.70447,99.719063],[19.688629,99.723358],[19.68475,99.727127],[19.679899,99.727821],[19.67149,99.731598],[19.6681,99.734169],[19.664539,99.734337],[19.65662,99.735718],[19.653709,99.736923],[19.64983,99.737259],[19.644501,99.738632],[19.637711,99.743103],[19.620081,99.743271],[19.61006,99.747726],[19.600519,99.749619],[19.595181,99.748589],[19.591459,99.746529],[19.582239,99.744987],[19.57626,99.746529],[19.57011,99.751678],[19.56736,99.752197],[19.550541,99.747391],[19.541479,99.742073],[19.51705,99.745667],[19.504271,99.746872],[19.50135,99.746696],[19.49699,99.748589],[19.48016,99.751678],[19.472389,99.753738],[19.469641,99.754082],[19.467211,99.755112],[19.462839,99.75563],[19.45928,99.755798],[19.453939,99.757172],[19.44973,99.758034],[19.44228,99.758202],[19.432249,99.761978],[19.42415,99.766098],[19.410549,99.770393],[19.37849,99.78756],[19.357759,99.799057],[19.339621,99.811943],[19.3218,99.838371],[19.310631,99.845917],[19.30415,99.852272],[19.29945,99.853127],[19.290051,99.855881],[19.275141,99.856392],[19.268181,99.857773],[19.255369,99.857422],[19.24938,99.858627],[19.240629,99.860863],[19.23674,99.862923],[19.229931,99.863426],[19.227011,99.863953],[19.20772,99.871498],[19.2001,99.872528],[19.19735,99.874763],[19.188431,99.889008],[19.178049,99.901016],[19.17128,99.906563],[19.16725,99.909927],[19.161579,99.914177],[19.158171,99.914436],[19.152809,99.912689],[19.141399,99.910896],[19.12985,99.910072],[19.115681,99.90567],[19.106331,99.908417],[19.095181,99.912193],[19.09145,99.913727],[19.082689,99.92231],[19.075069,99.927979],[19.069059,99.92746],[19.05657,99.932098],[19.05316,99.933472],[19.050079,99.935867],[19.04554,99.935532],[19.043261,99.934669],[19.04018,99.931236],[19.038719,99.931068],[19.03775,99.930382],[19.02947,99.927116],[19.02639,99.923523],[19.019899,99.920433],[19.019251,99.919052],[19.01503,99.911163],[19.00983,99.906013],[19.00659,99.902573],[19.005449,99.899307],[19.00334,99.898109],[19.00042,99.899483],[18.99782,99.901367],[18.994419,99.903259],[18.991011,99.904289],[18.988569,99.906174],[18.985979,99.906349],[18.98127,99.907204],[18.977051,99.91098],[18.976231,99.912872],[18.97364,99.914413],[18.9699,99.915283],[18.96796,99.918709],[18.96455,99.920937],[18.95822,99.920593],[18.95627,99.922829],[18.95075,99.923523],[18.93889,99.929008],[18.934999,99.931923],[18.93354,99.932793],[18.929319,99.931763],[18.924931,99.933983],[18.922171,99.935013],[18.91876,99.937424],[18.905769,99.943771],[18.902519,99.944633],[18.89814,99.946342],[18.893259,99.946693],[18.887251,99.944633],[18.88319,99.945312],[18.8741,99.947548],[18.867599,99.948402],[18.858829,99.948921],[18.851681,99.948059],[18.846161,99.947891],[18.834141,99.949432],[18.82406,99.949089],[18.821791,99.949608],[18.807159,99.958527],[18.804079,99.960587],[18.78701,99.964371],[18.78587,99.965233],[18.781969,99.969177],[18.776609,99.970032],[18.76491,99.97364],[18.76214,99.973457],[18.757429,99.970032],[18.753201,99.970032],[18.7428,99.975014],[18.74004,99.975357],[18.73597,99.973984],[18.733049,99.971237],[18.73012,99.971237],[18.72703,99.968491],[18.72541,99.968491],[18.72323,99.967339],[18.72118,99.966263],[18.719721,99.966263],[18.718901,99.964706],[18.71516,99.960938],[18.71386,99.958527],[18.71175,99.957161],[18.7085,99.958023],[18.706869,99.957497],[18.7059,99.956131],[18.70134,99.954758],[18.699551,99.952698],[18.69809,99.948753],[18.696951,99.947548],[18.68996,99.944283],[18.687691,99.944801],[18.68573,99.943604],[18.68037,99.934502],[18.674021,99.928673],[18.6724,99.927803],[18.66736,99.92643],[18.661659,99.924202],[18.65711,99.921967],[18.655649,99.92025],[18.65044,99.920433],[18.64784,99.920593],[18.645069,99.918709],[18.641821,99.91819],[18.635799,99.914589],[18.63434,99.911667],[18.626699,99.909103],[18.62442,99.90892],[18.618561,99.907722],[18.61824,99.906349],[18.614981,99.908234],[18.61091,99.907043],[18.6075,99.9048],[18.6049,99.904289],[18.60343,99.903603],[18.601971,99.902397],[18.598881,99.900681],[18.596109,99.898453],[18.592529,99.898621],[18.589769,99.896744],[18.588461,99.89502],[18.58684,99.89399],[18.58391,99.893471],[18.582609,99.89296],[18.58082,99.89193],[18.57691,99.886597],[18.575769,99.886093],[18.575121,99.886597],[18.57398,99.88575],[18.57333,99.88472],[18.572029,99.883858],[18.571541,99.882141],[18.56975,99.881287],[18.568291,99.879051],[18.5665,99.878883],[18.56373,99.875618],[18.56324,99.872871],[18.56275,99.87133],[18.56292,99.86927],[18.560801,99.866348],[18.55966,99.865997],[18.55966,99.864288],[18.558359,99.861198],[18.55673,99.859657],[18.555269,99.854507],[18.55348,99.853821],[18.5525,99.852448],[18.550871,99.851418],[18.54925,99.849182],[18.547291,99.848328],[18.543711,99.840767],[18.540131,99.839912],[18.53964,99.838707],[18.537849,99.838203],[18.53558,99.835617],[18.530531,99.832191],[18.529881,99.830299],[18.52581,99.828934],[18.51783,99.82412],[18.513769,99.820862],[18.5149,99.81897],[18.499439,99.812279],[18.47893,99.807472],[18.47648,99.806099],[18.47323,99.805237],[18.47225,99.80558],[18.466881,99.804207],[18.466709,99.802673],[18.463301,99.804382],[18.462971,99.803703],[18.459061,99.801292],[18.455641,99.797684],[18.45402,99.797173],[18.45385,99.795113],[18.451571,99.793404],[18.452061,99.790131],[18.45125,99.788589],[18.448311,99.786697],[18.448311,99.783607],[18.44245,99.776047],[18.44066,99.775017],[18.43952,99.772797],[18.43692,99.772453],[18.434799,99.769867],[18.42487,99.754601],[18.42519,99.752022],[18.42161,99.749107],[18.42128,99.747902],[18.4221,99.743103],[18.42112,99.741547],[18.420309,99.739487],[18.41995,99.737396],[18.42004,99.735573],[18.42008,99.733253],[18.41995,99.732552],[18.41889,99.730331],[18.41873,99.729698],[18.418711,99.72905],[18.418791,99.728363],[18.4195,99.727074],[18.419979,99.726349],[18.420231,99.726128],[18.421,99.7258],[18.424561,99.724602],[18.425671,99.724037],[18.426571,99.723328],[18.427401,99.722572],[18.428101,99.721451],[18.42823,99.720734],[18.42827,99.719788],[18.42893,99.718018],[18.429291,99.716713],[18.42931,99.715942],[18.429251,99.714172],[18.42909,99.71257],[18.42915,99.711746],[18.429159,99.710548],[18.42911,99.709961],[18.42881,99.709312],[18.42832,99.708794],[18.42795,99.708214],[18.427919,99.707649],[18.42795,99.706039],[18.42767,99.704086],[18.427589,99.702888],[18.427589,99.70208],[18.426929,99.700233],[18.426741,99.699043],[18.426781,99.698059],[18.42658,99.697319],[18.42609,99.696053],[18.42481,99.694153],[18.424101,99.693573],[18.423691,99.692886],[18.42347,99.69194],[18.423491,99.689323],[18.423241,99.688538],[18.423031,99.68734],[18.42272,99.686203],[18.422131,99.684937],[18.422041,99.684174],[18.42222,99.683647],[18.422501,99.683128],[18.422661,99.682358],[18.42264,99.680542],[18.422541,99.679131],[18.42197,99.675194],[18.42194,99.67244],[18.42174,99.671631],[18.421301,99.670486],[18.420971,99.669319],[18.42094,99.665627],[18.42099,99.663811],[18.42087,99.663017],[18.42053,99.66185],[18.417959,99.653954],[18.4172,99.651909],[18.41601,99.649818],[18.412809,99.644562],[18.406851,99.639587],[18.40027,99.634438],[18.392811,99.624962],[18.385281,99.615044],[18.37586,99.599113],[18.36557,99.581909],[18.355709,99.565353],[18.34586,99.548767],[18.33902,99.541557],[18.31636,99.528687],[18.310011,99.528687],[18.305771,99.527657],[18.285431,99.512939],[18.2847,99.512192],[18.284321,99.511879],[18.28384,99.511429],[18.283501,99.511009],[18.28231,99.50872],[18.282021,99.506973],[18.281969,99.506752],[18.281931,99.506447],[18.28183,99.504372],[18.281799,99.503326],[18.2817,99.501801],[18.28154,99.498703],[18.281389,99.496017],[18.28134,99.495178],[18.281179,99.492928],[18.28109,99.491997],[18.28097,99.491493],[18.280741,99.490639],[18.280491,99.490067],[18.280251,99.489571],[18.276279,99.484016],[18.275089,99.482361],[18.271931,99.477943],[18.26992,99.475143],[18.265791,99.469559],[18.264151,99.467949],[18.263901,99.467728],[18.259399,99.462921],[18.254829,99.457451],[18.25322,99.45546],[18.25285,99.455002],[18.252251,99.454407],[18.251181,99.453377],[18.248911,99.451523],[18.24684,99.449829],[18.246321,99.449249],[18.246229,99.449158],[18.24357,99.446136],[18.240339,99.442268],[18.240231,99.442131],[18.23794,99.439133],[18.237009,99.43779],[18.234949,99.434761],[18.234051,99.433434],[18.233271,99.432281],[18.232941,99.431862],[18.23254,99.431396],[18.231871,99.43087],[18.23115,99.430443],[18.23048,99.430099],[18.223049,99.426353],[18.219999,99.42485],[18.214729,99.422234],[18.2141,99.421783],[18.213449,99.421173],[18.21044,99.417763],[18.20784,99.414848],[18.206091,99.41288],[18.20507,99.411789],[18.2041,99.410851],[18.203369,99.410233],[18.202881,99.409859],[18.202271,99.409431],[18.20149,99.408997],[18.20116,99.408768],[18.20055,99.408447],[18.199909,99.408142],[18.198891,99.40773],[18.19791,99.407379],[18.19705,99.407158],[18.19627,99.40699],[18.195271,99.406807],[18.194441,99.406723],[18.193081,99.406639],[18.19174,99.406708],[18.190941,99.406807],[18.190041,99.406929],[18.18878,99.407204],[18.186609,99.407761],[18.184031,99.408447],[18.182199,99.408928],[18.18095,99.409187],[18.180309,99.409233],[18.17975,99.409233],[18.179211,99.409149],[18.17749,99.408699],[18.17017,99.406662],[18.166981,99.405777],[18.163481,99.404831],[18.15963,99.403793],[18.158501,99.403519],[18.157089,99.403229],[18.15344,99.402649],[18.150881,99.402184],[18.15004,99.402046],[18.149481,99.401962],[18.149,99.401863],[18.148581,99.401703],[18.147989,99.401352],[18.14753,99.400978],[18.14703,99.40033],[18.1467,99.399567],[18.14559,99.395081],[18.1453,99.394173],[18.144859,99.393402],[18.144341,99.3927],[18.14374,99.392097],[18.142941,99.391563],[18.14249,99.391312],[18.14209,99.391144],[18.141621,99.390961],[18.14101,99.390823],[18.14044,99.390778],[18.139891,99.390747],[18.13619,99.390709],[18.13114,99.390762],[18.128851,99.391121],[18.124069,99.392548],[18.10453,99.398163],[18.10178,99.398788],[18.099609,99.398727],[18.096781,99.398109],[18.094761,99.397583],[18.092661,99.397118],[18.091841,99.396919],[18.0884,99.396072],[18.085541,99.395348],[18.083891,99.394974],[18.075769,99.392998],[18.070539,99.391769],[18.066629,99.390846],[18.062481,99.390266],[18.05871,99.389839],[18.05596,99.389267],[18.054411,99.388397],[18.051821,99.386383],[18.050211,99.38546],[18.045561,99.383141],[18.043961,99.381851],[18.04265,99.380638],[18.041,99.379402],[18.036779,99.376457],[18.036421,99.376259],[18.034201,99.375107],[18.033239,99.374786],[18.032431,99.374603],[18.031601,99.374496],[18.030519,99.37442],[18.024441,99.373947],[18.0229,99.373329],[18.02154,99.37207],[18.012831,99.358124],[18.01133,99.357002],[18.009991,99.356583],[17.99893,99.355247],[17.98905,99.357224],[17.982321,99.356018],[17.979931,99.355743],[17.97489,99.356071],[17.973339,99.355614],[17.970539,99.353241],[17.969101,99.352692],[17.96756,99.352707],[17.962151,99.354393],[17.961781,99.354492],[17.96125,99.354637],[17.961029,99.35466],[17.96056,99.35466],[17.95981,99.354637],[17.959379,99.354561],[17.95863,99.354279],[17.95808,99.353981],[17.95723,99.353378],[17.95643,99.352737],[17.95587,99.352371],[17.955059,99.351822],[17.95433,99.351357],[17.95396,99.351189],[17.95359,99.351044],[17.953091,99.350883],[17.95245,99.350838],[17.951981,99.350853],[17.951429,99.350929],[17.95067,99.351082],[17.95013,99.351196],[17.94813,99.351593],[17.946581,99.351837],[17.946051,99.351921],[17.945681,99.351936],[17.945511,99.351929],[17.945129,99.351883],[17.944559,99.351707],[17.94421,99.351593],[17.943859,99.351433],[17.94348,99.351257],[17.94228,99.350517],[17.941111,99.349838],[17.93996,99.349243],[17.93936,99.348953],[17.93882,99.348679],[17.93819,99.348473],[17.9373,99.348289],[17.93652,99.348137],[17.934759,99.347778],[17.93421,99.347687],[17.932699,99.347427],[17.93189,99.347298],[17.92786,99.346573],[17.92705,99.346413],[17.92444,99.34594],[17.92285,99.345657],[17.92038,99.345207],[17.9198,99.345093],[17.91939,99.345001],[17.91836,99.344711],[17.91785,99.344589],[17.917351,99.344429],[17.917009,99.344269],[17.9163,99.343849],[17.915291,99.343246],[17.915051,99.343117],[17.91415,99.342613],[17.913731,99.342377],[17.913441,99.342216],[17.91333,99.342163],[17.913191,99.342133],[17.9125,99.342003],[17.91172,99.341957],[17.91118,99.341927],[17.910681,99.341873],[17.90926,99.341827],[17.908791,99.341797],[17.90661,99.341667],[17.904579,99.341522],[17.9039,99.341476],[17.903549,99.341469],[17.902691,99.341431],[17.902109,99.3414],[17.90139,99.341362],[17.900949,99.341331],[17.899851,99.341217],[17.899229,99.341133],[17.89868,99.341026],[17.898109,99.340927],[17.89765,99.340851],[17.89702,99.340736],[17.89642,99.340637],[17.895901,99.340553],[17.89366,99.340157],[17.89069,99.33963],[17.88946,99.339417],[17.888769,99.33931],[17.88637,99.338882],[17.88438,99.338531],[17.882891,99.33828],[17.881689,99.338081],[17.88026,99.337822],[17.87919,99.337646],[17.87808,99.337471],[17.87718,99.337318],[17.8766,99.337257],[17.87611,99.337181],[17.87467,99.337128],[17.874229,99.337143],[17.87361,99.337143],[17.871771,99.337196],[17.87114,99.337242],[17.870489,99.337273],[17.870131,99.337273],[17.86964,99.337196],[17.869011,99.337082],[17.8687,99.337013],[17.868401,99.336838],[17.86796,99.336563],[17.86767,99.336349],[17.86746,99.336197],[17.86726,99.336014],[17.86688,99.33551],[17.86599,99.334396],[17.865061,99.333237],[17.864401,99.332397],[17.863991,99.331802],[17.86343,99.331001],[17.86311,99.33049],[17.862749,99.32975],[17.86245,99.328903],[17.862289,99.328217],[17.86224,99.327454],[17.862181,99.326714],[17.862129,99.32605],[17.86191,99.322456],[17.861759,99.319107],[17.861549,99.315567],[17.86153,99.315292],[17.861521,99.31517],[17.861481,99.315033],[17.86117,99.313766],[17.8608,99.312477],[17.860331,99.310944],[17.86005,99.310051],[17.859909,99.309601],[17.859859,99.309486],[17.85973,99.309273],[17.85928,99.308662],[17.85885,99.308243],[17.858391,99.307747],[17.85741,99.306763],[17.85648,99.305923],[17.855591,99.305107],[17.85523,99.304764],[17.854839,99.304314],[17.854601,99.304031],[17.85445,99.303741],[17.85433,99.303513],[17.85412,99.303017],[17.85392,99.302223],[17.85384,99.30159],[17.85371,99.300491],[17.8533,99.296638],[17.853251,99.296318],[17.85321,99.296013],[17.853029,99.295303],[17.852871,99.2948],[17.852711,99.29451],[17.85252,99.294228],[17.852261,99.293854],[17.852079,99.293587],[17.85186,99.293404],[17.851761,99.293297],[17.85161,99.293198],[17.851259,99.292953],[17.850969,99.29277],[17.850731,99.292641],[17.85043,99.292542],[17.85,99.292397],[17.8496,99.29232],[17.84923,99.29229],[17.84869,99.29232],[17.84779,99.292458],[17.847481,99.292511],[17.844879,99.293228],[17.843941,99.293472],[17.843321,99.293587],[17.842369,99.293701],[17.841961,99.293739],[17.84166,99.293732],[17.84104,99.293709],[17.840599,99.293633],[17.840219,99.293533],[17.839899,99.293449],[17.83931,99.293243],[17.83873,99.292923],[17.83827,99.29261],[17.83799,99.292389],[17.836639,99.2911],[17.836531,99.291023],[17.836411,99.290932],[17.836281,99.290848],[17.835911,99.290672],[17.8354,99.290413],[17.83526,99.290337],[17.83514,99.290298],[17.834579,99.290268],[17.83226,99.290161],[17.831779,99.290154],[17.831591,99.290154],[17.831499,99.290138],[17.830999,99.289932],[17.83036,99.289597],[17.83024,99.28952],[17.83003,99.289322],[17.82963,99.288872],[17.82939,99.288643],[17.829281,99.28849],[17.82917,99.288239],[17.828871,99.287407],[17.82847,99.286018],[17.82832,99.285347],[17.828159,99.284813],[17.82811,99.284683],[17.82798,99.284462],[17.82766,99.284058],[17.82745,99.283836],[17.82724,99.2836],[17.827101,99.28347],[17.826941,99.283363],[17.826679,99.283234],[17.826389,99.283081],[17.82618,99.282997],[17.82585,99.282921],[17.825569,99.282867],[17.825081,99.282806],[17.824591,99.282799],[17.821569,99.28289],[17.82082,99.282898],[17.820551,99.282898],[17.81995,99.28286],[17.8197,99.282852],[17.819,99.282806],[17.818501,99.282753],[17.81819,99.282692],[17.8179,99.282547],[17.817579,99.282333],[17.817209,99.282066],[17.816971,99.281822],[17.816771,99.281609],[17.816601,99.281326],[17.81636,99.280884],[17.816179,99.280487],[17.816031,99.280083],[17.81386,99.273483],[17.81365,99.272911],[17.81352,99.272583],[17.813181,99.271957],[17.81295,99.271584],[17.8127,99.27124],[17.81225,99.270798],[17.81126,99.269852],[17.810381,99.269119],[17.80974,99.26857],[17.80872,99.267761],[17.80821,99.267357],[17.807859,99.267128],[17.80744,99.266907],[17.806999,99.266693],[17.80674,99.266617],[17.80644,99.266571],[17.80608,99.266533],[17.805759,99.266533],[17.805401,99.266533],[17.80504,99.266617],[17.80337,99.266998],[17.802469,99.267174],[17.802071,99.267227],[17.801889,99.267227],[17.801689,99.267227],[17.80142,99.267174],[17.8009,99.267036],[17.800541,99.266937],[17.80023,99.266861],[17.800051,99.266777],[17.798241,99.266006],[17.79715,99.265556],[17.79257,99.263641],[17.791861,99.263344],[17.78828,99.26181],[17.78756,99.261513],[17.78669,99.261124],[17.7859,99.260757],[17.78512,99.260429],[17.78488,99.260292],[17.784559,99.260033],[17.7843,99.259827],[17.783911,99.259506],[17.783489,99.259117],[17.78289,99.258347],[17.781799,99.257004],[17.78129,99.256287],[17.77948,99.254051],[17.7777,99.251877],[17.77697,99.251038],[17.77673,99.250763],[17.776421,99.250481],[17.77618,99.250313],[17.7756,99.250031],[17.775,99.249786],[17.773529,99.249382],[17.773161,99.249283],[17.770929,99.248657],[17.769039,99.248009],[17.768499,99.247833],[17.768101,99.247627],[17.7679,99.247437],[17.76725,99.246834],[17.76651,99.246017],[17.76532,99.244629],[17.76475,99.243988],[17.764339,99.243607],[17.763969,99.243401],[17.763491,99.243141],[17.76297,99.242897],[17.76252,99.242783],[17.761299,99.24247],[17.76108,99.242416],[17.76034,99.242218],[17.759871,99.242073],[17.759029,99.241737],[17.75853,99.241524],[17.758101,99.241241],[17.757481,99.240791],[17.756941,99.240318],[17.75658,99.239883],[17.754259,99.236938],[17.75318,99.235573],[17.752991,99.235367],[17.75267,99.235062],[17.752399,99.234879],[17.75209,99.234688],[17.751051,99.234238],[17.750351,99.234001],[17.7498,99.233772],[17.748859,99.233276],[17.748581,99.233093],[17.747829,99.232452],[17.746889,99.231583],[17.746691,99.231377],[17.74646,99.231194],[17.74609,99.230972],[17.74564,99.230827],[17.745159,99.230682],[17.744881,99.230637],[17.744419,99.230629],[17.743931,99.23069],[17.74349,99.230782],[17.743191,99.230873],[17.74276,99.231102],[17.74197,99.231628],[17.74017,99.232971],[17.73991,99.233147],[17.739531,99.233292],[17.73864,99.233566],[17.73842,99.233589],[17.73773,99.233589],[17.73707,99.233582],[17.736509,99.233513],[17.73584,99.233383],[17.73542,99.233292],[17.734819,99.233177],[17.73427,99.23304],[17.733521,99.232773],[17.732241,99.232307],[17.730801,99.231644],[17.730061,99.231293],[17.728479,99.230621],[17.727859,99.230362],[17.72703,99.230057],[17.726549,99.229881],[17.726231,99.229767],[17.725981,99.229721],[17.724819,99.229462],[17.72401,99.229309],[17.723749,99.229263],[17.723499,99.229233],[17.72278,99.229134],[17.72213,99.22905],[17.72184,99.229019],[17.72105,99.228928],[17.720671,99.228889],[17.720409,99.228859],[17.720261,99.228859],[17.720039,99.228882],[17.71792,99.229012],[17.71751,99.229027],[17.7131,99.229362],[17.71036,99.229683],[17.709999,99.229729],[17.709591,99.229782],[17.709379,99.229797],[17.70927,99.22982],[17.709061,99.229874],[17.708929,99.229912],[17.70859,99.230003],[17.703871,99.231422],[17.6992,99.232727],[17.69821,99.233017],[17.69763,99.233177],[17.697451,99.233223],[17.69726,99.233238],[17.696751,99.233276],[17.696369,99.233292],[17.69614,99.233307],[17.69598,99.233299],[17.69591,99.233292],[17.69561,99.233223],[17.69491,99.23304],[17.694389,99.23291],[17.694099,99.232841],[17.69388,99.232811],[17.69368,99.232803],[17.693279,99.23275],[17.692961,99.232727],[17.692671,99.232697],[17.69244,99.232697],[17.692301,99.232697],[17.692169,99.232727],[17.691891,99.232803],[17.69169,99.232857],[17.691191,99.233093],[17.691019,99.233177],[17.69067,99.233437],[17.690411,99.233658],[17.690121,99.233994],[17.689871,99.234283],[17.689671,99.234543],[17.689461,99.234879],[17.688641,99.236259],[17.68808,99.23719],[17.68734,99.238152],[17.68705,99.238503],[17.686781,99.238724],[17.6863,99.239014],[17.68573,99.239311],[17.68515,99.239563],[17.68358,99.24015],[17.679119,99.241768],[17.67421,99.243568],[17.670959,99.244667],[17.669821,99.24501],[17.66951,99.245102],[17.669319,99.245163],[17.669201,99.245171],[17.669081,99.245171],[17.66873,99.245163],[17.667709,99.245064],[17.66604,99.244743],[17.66552,99.244629],[17.66523,99.244583],[17.66506,99.24456],[17.664921,99.24456],[17.66469,99.244583],[17.6644,99.244614],[17.664009,99.244637],[17.663759,99.24469],[17.66358,99.244743],[17.663389,99.244812],[17.663219,99.244904],[17.662809,99.245117],[17.66263,99.245247],[17.662331,99.245453],[17.66197,99.245811],[17.660839,99.247223],[17.660061,99.248207],[17.659401,99.2491],[17.65922,99.249313],[17.659121,99.249413],[17.65889,99.249588],[17.658171,99.25016],[17.657921,99.250343],[17.657669,99.250473],[17.65728,99.250641],[17.656561,99.250893],[17.656309,99.250961],[17.655861,99.25103],[17.655359,99.251091],[17.654989,99.251106],[17.65469,99.251106],[17.654181,99.251038],[17.653561,99.25087],[17.653231,99.250763],[17.652941,99.250641],[17.652571,99.250427],[17.652439,99.250351],[17.652189,99.250183],[17.651711,99.249847],[17.65132,99.249489],[17.650909,99.249039],[17.650351,99.248322],[17.649651,99.247177],[17.64868,99.245667],[17.64819,99.244987],[17.647699,99.244331],[17.64736,99.243896],[17.647091,99.243652],[17.646799,99.243439],[17.646021,99.24292],[17.644899,99.242287],[17.643909,99.241737],[17.64311,99.24131],[17.641239,99.240349],[17.640791,99.240097],[17.640671,99.240044],[17.64039,99.239937],[17.640221,99.239883],[17.63924,99.239662],[17.639059,99.239616],[17.63826,99.239517],[17.63669,99.239388],[17.635361,99.23925],[17.63233,99.238876],[17.63176,99.238823],[17.631161,99.238739],[17.630199,99.238609],[17.63006,99.238586],[17.629971,99.238579],[17.62962,99.238541],[17.629141,99.238472],[17.62866,99.238403],[17.628309,99.23835],[17.627979,99.238281],[17.62742,99.238197],[17.62673,99.238037],[17.62583,99.237892],[17.625059,99.237633],[17.622801,99.236839],[17.621441,99.236008],[17.61692,99.232162],[17.61537,99.230904],[17.61335,99.229797],[17.60886,99.227928],[17.602249,99.22522],[17.597521,99.223282],[17.59412,99.222054],[17.587271,99.220108],[17.58593,99.219467],[17.584789,99.218277],[17.5783,99.208618],[17.57519,99.203941],[17.574329,99.203087],[17.573111,99.202309],[17.57239,99.202087],[17.57156,99.201981],[17.57074,99.202003],[17.564529,99.203102],[17.56094,99.203789],[17.559891,99.203529],[17.559389,99.203369],[17.55278,99.200447],[17.545259,99.197067],[17.537621,99.193703],[17.52972,99.190163],[17.522421,99.186867],[17.517151,99.184593],[17.511311,99.183838],[17.50985,99.183296],[17.508881,99.182648],[17.503361,99.178322],[17.499451,99.175423],[17.499241,99.175041],[17.48904,99.167084],[17.47415,99.162407],[17.469481,99.161247],[17.423571,99.157494],[17.41935,99.157249],[17.41753,99.156578],[17.411221,99.151299],[17.40942,99.150032],[17.40662,99.149208],[17.39879,99.149406],[17.39036,99.148537],[17.38191,99.147797],[17.377081,99.149017],[17.37434,99.149094],[17.36429,99.146599],[17.3626,99.146698],[17.354561,99.148918],[17.35183,99.149513],[17.34754,99.14946],[17.34433,99.149437],[17.34161,99.149643],[17.33868,99.151382],[17.335911,99.153374],[17.33367,99.154083],[17.33156,99.153992],[17.30291,99.147034],[17.295,99.142593],[17.28458,99.141388],[17.28159,99.140633],[17.25828,99.132843],[17.24894,99.128304],[17.23995,99.123833],[17.238461,99.122993],[17.237061,99.122704],[17.207069,99.123238],[17.20488,99.123596],[17.20418,99.123947],[17.2031,99.12455],[17.19191,99.130913],[17.179131,99.138077],[17.17695,99.138298],[17.17457,99.137848],[17.16736,99.135223],[17.15797,99.131851],[17.15015,99.129463],[17.147699,99.128029],[17.13851,99.112953],[17.13471,99.106644],[17.132629,99.104424],[17.126169,99.098793],[17.115339,99.091873],[17.113079,99.08847],[17.111059,99.084801],[17.109261,99.080406],[17.10791,99.077362],[17.105841,99.075607],[17.103371,99.074699],[17.089741,99.072487],[17.074369,99.06559],[17.07151,99.06543],[17.069031,99.066544],[17.06661,99.06781],[17.05814,99.072273],[17.047461,99.078308],[17.03545,99.087624],[17.023211,99.097221],[17.00762,99.108757],[16.997351,99.112717],[16.988581,99.117897],[16.980551,99.122093],[16.979561,99.122704],[16.978951,99.12368],[16.976191,99.128593],[16.97452,99.130058],[16.97257,99.130501],[16.968321,99.13092],[16.96356,99.131462],[16.96092,99.13134],[16.920919,99.115631],[16.919189,99.11586],[16.91795,99.11602],[16.91305,99.118767],[16.90901,99.121246],[16.9007,99.126984],[16.89715,99.128098],[16.893391,99.129143],[16.89175,99.129051],[16.885201,99.127052],[16.88372,99.126694],[16.881399,99.127083],[16.876499,99.130058],[16.87117,99.133377],[16.863501,99.13826],[16.85927,99.12957],[16.856239,99.123466],[16.855671,99.12233],[16.85342,99.117859],[16.85202,99.115067],[16.85084,99.113182],[16.84898,99.111923],[16.84684,99.111504],[16.84412,99.112358],[16.8416,99.11367],[16.84152,99.113724],[16.837959,99.115807],[16.835329,99.117531],[16.821699,99.130074],[16.801649,99.148598],[16.799669,99.150833],[16.798031,99.15358],[16.795401,99.157867],[16.79244,99.162163],[16.78866,99.166969],[16.76845,99.18911],[16.76483,99.192543],[16.7096,99.240257],[16.68836,99.258202],[16.679461,99.264771],[16.67762,99.266113],[16.677481,99.266212],[16.6754,99.267906],[16.67342,99.269623],[16.67309,99.270317],[16.67288,99.271057],[16.672859,99.271423],[16.67281,99.272797],[16.672779,99.273537],[16.672729,99.27478],[16.672661,99.275673],[16.672489,99.276649],[16.672251,99.277786],[16.67214,99.278313],[16.67173,99.280197],[16.671499,99.281181],[16.6712,99.283028],[16.671181,99.283287],[16.671249,99.285454],[16.671789,99.288597],[16.671829,99.288857],[16.672001,99.289909],[16.67218,99.290947],[16.672421,99.292236],[16.6726,99.293266],[16.67338,99.298218],[16.673161,99.300034],[16.672979,99.300537],[16.672041,99.302116],[16.66967,99.304527],[16.666189,99.308037],[16.665819,99.308411],[16.663031,99.31118],[16.66287,99.311348],[16.66259,99.31163],[16.6623,99.311943],[16.66151,99.312729],[16.6612,99.313026],[16.66095,99.313278],[16.66025,99.314003],[16.659611,99.314667],[16.659439,99.314842],[16.658159,99.316139],[16.65443,99.319923],[16.65276,99.321609],[16.652571,99.3218],[16.649229,99.325203],[16.647921,99.326508],[16.646601,99.32785],[16.64641,99.328041],[16.64311,99.331429],[16.64192,99.332878],[16.64097,99.334152],[16.64082,99.334373],[16.637951,99.338142],[16.63311,99.344543],[16.630091,99.348587],[16.629789,99.348991],[16.629169,99.349792],[16.628531,99.350601],[16.62711,99.352493],[16.62414,99.356438],[16.62381,99.35685],[16.62253,99.358543],[16.62108,99.360443],[16.618429,99.363991],[16.61496,99.368683],[16.61392,99.370857],[16.613609,99.37159],[16.61319,99.372566],[16.613079,99.37281],[16.61297,99.373062],[16.612749,99.373558],[16.611071,99.377563],[16.610439,99.379044],[16.60939,99.381523],[16.60792,99.384987],[16.60771,99.385483],[16.607599,99.385727],[16.607189,99.386703],[16.60689,99.387444],[16.606569,99.388168],[16.606159,99.389153],[16.605419,99.390877],[16.605009,99.391869],[16.603491,99.395462],[16.603121,99.396317],[16.60302,99.396568],[16.602591,99.397552],[16.600929,99.401466],[16.60062,99.402206],[16.600519,99.402458],[16.59807,99.408287],[16.596411,99.412201],[16.596001,99.41317],[16.595791,99.413658],[16.595591,99.414146],[16.594521,99.416603],[16.594311,99.417084],[16.594101,99.41758],[16.594,99.417831],[16.59269,99.420998],[16.591021,99.424927],[16.588301,99.431328],[16.586519,99.435532],[16.58543,99.437042],[16.584,99.438202],[16.58209,99.439056],[16.580641,99.439629],[16.580151,99.439812],[16.578939,99.440331],[16.57461,99.442101],[16.57412,99.442299],[16.57338,99.442596],[16.57313,99.442703],[16.571659,99.443283],[16.57023,99.443893],[16.567341,99.44503],[16.566139,99.445511],[16.563231,99.446663],[16.56251,99.446953],[16.55891,99.448486],[16.55868,99.448608],[16.558229,99.448868],[16.556589,99.45018],[16.554319,99.4524],[16.55036,99.456284],[16.548071,99.458511],[16.54731,99.459251],[16.544491,99.461937],[16.544331,99.462097],[16.543751,99.462677],[16.543159,99.463272],[16.54306,99.463379],[16.542561,99.463837],[16.5424,99.463989],[16.542191,99.464241],[16.542009,99.464417],[16.541679,99.464737],[16.541269,99.465134],[16.540661,99.465729],[16.540331,99.466057],[16.53981,99.466583],[16.539049,99.4673],[16.538851,99.467484],[16.53808,99.468224],[16.53751,99.468781],[16.536751,99.469521],[16.53598,99.470268],[16.53504,99.471191],[16.534849,99.471367],[16.53429,99.471931],[16.53392,99.472313],[16.533001,99.473228],[16.53264,99.473587],[16.530359,99.475601],[16.528509,99.47641],[16.52446,99.477753],[16.52404,99.47789],[16.52319,99.478142],[16.52297,99.47821],[16.522091,99.478523],[16.52186,99.478592],[16.521629,99.478683],[16.521151,99.478859],[16.51795,99.479942],[16.516251,99.480507],[16.51479,99.481003],[16.51083,99.482323],[16.50983,99.482658],[16.509581,99.482742],[16.508089,99.483253],[16.507589,99.483414],[16.507099,99.483589],[16.506849,99.483673],[16.50609,99.483887],[16.504271,99.484047],[16.502211,99.483627],[16.501431,99.483429],[16.50091,99.483299],[16.498619,99.482689],[16.497601,99.482422],[16.497089,99.482277],[16.49658,99.48214],[16.49402,99.481621],[16.492479,99.481903],[16.491171,99.482773],[16.48962,99.484154],[16.48595,99.487839],[16.485571,99.488213],[16.48538,99.488403],[16.483351,99.490791],[16.482929,99.491463],[16.48209,99.49276],[16.48167,99.493408],[16.481529,99.493629],[16.481239,99.494072],[16.481091,99.494301],[16.480101,99.495537],[16.479,99.496292],[16.47747,99.496696],[16.47649,99.496689],[16.476089,99.496658],[16.47576,99.496643],[16.475479,99.496613],[16.47537,99.496597],[16.47506,99.496567],[16.474609,99.496552],[16.472771,99.496483],[16.471889,99.496407],[16.471439,99.496384],[16.470751,99.496323],[16.470169,99.496246],[16.469761,99.496193],[16.468161,99.496147],[16.467911,99.496132],[16.46665,99.496063],[16.465639,99.495987],[16.464371,99.495918],[16.46105,99.495689],[16.460541,99.495644],[16.4568,99.495323],[16.455311,99.495621],[16.453951,99.496407],[16.45089,99.498993],[16.4485,99.500977],[16.447519,99.501823],[16.44635,99.5028],[16.445999,99.503113],[16.44545,99.503563],[16.44314,99.505539],[16.439569,99.508553],[16.438971,99.509071],[16.436991,99.51075],[16.43314,99.513939],[16.428801,99.517578],[16.424419,99.521103],[16.422661,99.521637],[16.421869,99.521713],[16.42108,99.521698],[16.4182,99.521629],[16.415039,99.521561],[16.414009,99.521538],[16.412491,99.5215],[16.411449,99.521492],[16.409679,99.521538],[16.409161,99.521561],[16.40608,99.521568],[16.405041,99.521561],[16.400579,99.521568],[16.40032,99.521568],[16.397169,99.521553],[16.395321,99.521553],[16.393999,99.521561],[16.39348,99.521561],[16.393221,99.521561],[16.391121,99.521568],[16.390341,99.521584],[16.38854,99.521942],[16.3883,99.522041],[16.38677,99.523033],[16.38658,99.523209],[16.385611,99.524483],[16.38533,99.52494],[16.38464,99.5261],[16.384501,99.526337],[16.38258,99.529541],[16.382441,99.529778],[16.382299,99.529999],[16.38088,99.53231],[16.380739,99.532539],[16.380051,99.53373],[16.37991,99.533958],[16.37948,99.53466],[16.377069,99.538559],[16.374229,99.543198],[16.37394,99.543663],[16.37365,99.544144],[16.370649,99.549042],[16.370359,99.549507],[16.36949,99.550911],[16.366779,99.555702],[16.365179,99.558617],[16.364639,99.559593],[16.36409,99.560547],[16.363819,99.561043],[16.363279,99.562012],[16.36249,99.563469],[16.360201,99.567574],[16.357809,99.572144],[16.354179,99.579102],[16.3515,99.584412],[16.35004,99.587318],[16.34803,99.591476],[16.345989,99.595329],[16.343031,99.599533],[16.341009,99.602783],[16.340269,99.605164],[16.338449,99.611328],[16.33709,99.614616],[16.33412,99.621323],[16.33148,99.627182],[16.331369,99.627449],[16.331261,99.627708],[16.330481,99.629509],[16.330259,99.630028],[16.327971,99.635368],[16.325199,99.641823],[16.32476,99.642838],[16.32181,99.649696],[16.319851,99.654007],[16.318529,99.655403],[16.31654,99.656693],[16.314871,99.657768],[16.312389,99.659416],[16.306021,99.663673],[16.305111,99.664284],[16.304211,99.664886],[16.303789,99.665169],[16.3034,99.665428],[16.30304,99.665657],[16.30287,99.665779],[16.30233,99.666168],[16.301941,99.666451],[16.3013,99.666878],[16.299049,99.668381],[16.29727,99.669563],[16.29705,99.669693],[16.2957,99.670593],[16.291679,99.673317],[16.28627,99.676964],[16.281839,99.679993],[16.279289,99.681396],[16.27492,99.682663],[16.27183,99.68354],[16.27051,99.683891],[16.269991,99.684036],[16.26354,99.685898],[16.26153,99.686478],[16.261141,99.6866],[16.260651,99.68676],[16.26017,99.686951],[16.25979,99.687103],[16.25938,99.687233],[16.258711,99.687469],[16.257021,99.688049],[16.252399,99.689629],[16.24692,99.691513],[16.2456,99.691933],[16.239849,99.693893],[16.238029,99.694511],[16.23308,99.696198],[16.23126,99.696831],[16.225599,99.698792],[16.218821,99.701103],[16.212601,99.703194],[16.20962,99.704193],[16.20705,99.70507],[16.206079,99.705429],[16.20174,99.706932],[16.19735,99.708397],[16.191231,99.710533],[16.188431,99.711472],[16.18173,99.713753],[16.18017,99.714302],[16.173941,99.716423],[16.16938,99.717972],[16.168091,99.718399],[16.16556,99.719292],[16.16477,99.719543],[16.16378,99.719856],[16.161659,99.720573],[16.16049,99.720901],[16.15974,99.721077],[16.159121,99.721191],[16.158421,99.721283],[16.157591,99.721336],[16.156981,99.721367],[16.15621,99.721359],[16.15048,99.721077],[16.14863,99.721024],[16.14603,99.720886],[16.13858,99.720573],[16.131781,99.720222],[16.12528,99.719902],[16.12373,99.719841],[16.122801,99.719818],[16.1194,99.719658],[16.118521,99.719597],[16.113729,99.719383],[16.11319,99.719353],[16.1068,99.719032],[16.105841,99.718987],[16.105129,99.719032],[16.10462,99.719116],[16.104019,99.719231],[16.10347,99.71936],[16.10277,99.719597],[16.10154,99.720123],[16.100809,99.720444],[16.099581,99.72094],[16.09844,99.72142],[16.09675,99.722153],[16.094219,99.723213],[16.09005,99.724953],[16.08955,99.725159],[16.084841,99.727127],[16.083389,99.72776],[16.077311,99.730301],[16.073151,99.732063],[16.07266,99.732262],[16.069929,99.733414],[16.06741,99.734489],[16.066401,99.73497],[16.065611,99.735367],[16.064939,99.735817],[16.06447,99.736214],[16.063801,99.73674],[16.06336,99.737137],[16.06078,99.739899],[16.056009,99.745132],[16.05513,99.746132],[16.05422,99.747093],[16.051439,99.750137],[16.050329,99.75135],[16.04903,99.752762],[16.04497,99.757187],[16.04143,99.761009],[16.041059,99.761414],[16.039579,99.763023],[16.037701,99.765007],[16.03714,99.76561],[16.036949,99.765823],[16.033899,99.769058],[16.03371,99.769257],[16.032,99.771072],[16.030279,99.772903],[16.03009,99.773102],[16.02557,99.777908],[16.02293,99.780693],[16.022169,99.781502],[16.02067,99.783081],[16.017441,99.786484],[16.016199,99.787788],[16.01602,99.787971],[16.01585,99.788147],[16.01568,99.788322],[16.015511,99.788498],[16.012739,99.791367],[16.011209,99.792999],[16.009171,99.795059],[16.00786,99.796494],[16.00614,99.798203],[16.0058,99.798553],[16.00466,99.799652],[16.003059,99.801308],[16.002541,99.801842],[16.00178,99.802597],[16.00106,99.803329],[15.99995,99.804489],[15.99944,99.805008],[15.99893,99.805519],[15.99852,99.805931],[15.99809,99.806351],[15.99742,99.807022],[15.99617,99.80825],[15.9937,99.810783],[15.98944,99.815048],[15.98454,99.819893],[15.97968,99.824661],[15.97439,99.829727],[15.97032,99.833603],[15.96583,99.83783],[15.96129,99.842163],[15.95713,99.846077],[15.95294,99.849953],[15.94795,99.854523],[15.9424,99.859627],[15.93697,99.864578],[15.93211,99.868973],[15.92862,99.872124],[15.9278,99.872879],[15.9247,99.875671],[15.92328,99.876953],[15.91854,99.880997],[15.91306,99.885612],[15.9105,99.887657],[15.90986,99.888168],[15.9086,99.889183],[15.90651,99.890747],[15.90628,99.890923],[15.90516,99.891769],[15.90126,99.894272],[15.89934,99.895317],[15.89693,99.896713],[15.8955,99.897507],[15.89383,99.898468],[15.89143,99.899841],[15.89,99.900673],[15.88886,99.90136],[15.88588,99.903069],[15.88534,99.903381],[15.88477,99.903732],[15.88452,99.903877],[15.8836,99.904411],[15.88287,99.904839],[15.8822,99.90519],[15.88194,99.905327],[15.88062,99.906067],[15.87939,99.906723],[15.87742,99.907837],[15.87723,99.907944],[15.87684,99.908173],[15.87643,99.908409],[15.87577,99.908791],[15.87485,99.909317],[15.87437,99.909599],[15.87366,99.910019],[15.86913,99.912613],[15.86472,99.915161],[15.86172,99.916901],[15.85842,99.918762],[15.8563,99.919983],[15.85584,99.920273],[15.85352,99.921623],[15.84915,99.924141],[15.848,99.924797],[15.84266,99.927872],[15.8408,99.92894],[15.83893,99.929993],[15.83869,99.930107],[15.83772,99.930634],[15.83604,99.931587],[15.83532,99.932007],[15.83225,99.933769],[15.83179,99.934036],[15.83115,99.934402],[15.83021,99.934952],[15.82925,99.935547],[15.82839,99.93605],[15.82702,99.936836],[15.82609,99.93734],[15.82586,99.937469],[15.82543,99.937714],[15.82486,99.938042],[15.82453,99.938217],[15.82423,99.938393],[15.82276,99.939194],[15.82242,99.939377],[15.82224,99.939491],[15.82184,99.939728],[15.81962,99.941002],[15.81839,99.941757],[15.81794,99.942009],[15.81565,99.943443],[15.81245,99.946007],[15.80879,99.949387],[15.80795,99.95015],[15.80672,99.951286],[15.80631,99.95166],[15.8061,99.951851],[15.80549,99.952423],[15.80023,99.957314],[15.79641,99.960907],[15.79151,99.965446],[15.79109,99.96582],[15.79089,99.966019],[15.79047,99.966408],[15.78922,99.967567],[15.78465,99.971817],[15.78341,99.972961],[15.77872,99.977364],[15.77314,99.98259],[15.77137,99.984322],[15.77118,99.984497],[15.771,99.98468],[15.7703,99.985336],[15.76963,99.985992],[15.76806,99.98748],[15.76747,99.988037],[15.76677,99.988701],[15.76587,99.989563],[15.76536,99.990021],[15.76506,99.990311],[15.76447,99.990868],[15.76404,99.99128],[15.76343,99.991859],[15.76275,99.9925],[15.76078,99.99437],[15.75662,99.99836],[15.75542,99.999496],[15.75523,99.99968],[15.75283,100.001961],[15.75206,100.002693],[15.75028,100.004356],[15.7501,100.004539],[15.74955,100.005058],[15.74901,100.005569],[15.74865,100.005913],[15.74847,100.006073],[15.74829,100.006241],[15.74811,100.006409],[15.74671,100.007736],[15.74604,100.008377],[15.74588,100.008537],[15.74571,100.00869],[15.74555,100.00885],[15.74347,100.010841],[15.74286,100.011513],[15.74271,100.011703],[15.74197,100.012627],[15.74139,100.013474],[15.74012,100.015778],[15.73951,100.017059],[15.73938,100.017326],[15.73767,100.020683],[15.73662,100.022697],[15.73636,100.023193],[15.73404,100.027718],[15.7334,100.028908],[15.73182,100.031929],[15.73156,100.03244],[15.73129,100.032944],[15.73064,100.034187],[15.72901,100.037308],[15.72816,100.038933],[15.72779,100.039627],[15.72742,100.040352],[15.72717,100.040833],[15.72655,100.042023],[15.7244,100.04612],[15.72409,100.046707],[15.72305,100.048714],[15.72204,100.050598],[15.72073,100.053078],[15.72005,100.054352],[15.71917,100.056023],[15.71907,100.05619],[15.71891,100.056511],[15.71863,100.057007],[15.71828,100.057648],[15.71801,100.058121],[15.71785,100.058388],[15.71766,100.058548],[15.71751,100.058578],[15.71732,100.058617],[15.71702,100.058617],[15.71687,100.058578],[15.71626,100.058357],[15.71531,100.058052],[15.71488,100.057907],[15.71418,100.057663],[15.71319,100.057289],[15.70982,100.056313],[15.70848,100.056099],[15.70526,100.055977],[15.70499,100.055977],[15.70418,100.055969],[15.69769,100.055939],[15.69256,100.055923],[15.68718,100.05587],[15.68639,100.055878],[15.68184,100.055962],[15.67809,100.056519],[15.67601,100.057114],[15.67575,100.05719],[15.67549,100.057281],[15.67423,100.05777],[15.67133,100.059227],[15.67039,100.059776],[15.66859,100.06102],[15.66796,100.061508],[15.66775,100.061684],[15.66653,100.062759],[15.66613,100.063141],[15.66593,100.063339],[15.66535,100.063927],[15.66513,100.064194],[15.66399,100.065514],[15.66335,100.066238],[15.6628,100.066879],[15.66244,100.067307],[15.65813,100.072357],[15.65441,100.076736],[15.65335,100.07798],[15.64987,100.082092],[15.64952,100.082497],[15.64579,100.086853],[15.64386,100.089127],[15.64161,100.091782],[15.63819,100.095734],[15.63676,100.097382],[15.63577,100.098457],[15.63527,100.099083],[15.63476,100.099693],[15.63253,100.10228],[15.63229,100.102562],[15.6313,100.103737],[15.63024,100.105003],[15.62668,100.109123],[15.6219,100.114677],[15.62155,100.115082],[15.62043,100.116333],[15.61751,100.119652],[15.61555,100.121933],[15.61525,100.122299],[15.61512,100.122459],[15.61465,100.122726],[15.61421,100.12278],[15.61356,100.12236],[15.61316,100.121872],[15.61283,100.121582],[15.6123,100.121407],[15.61209,100.121422],[15.61115,100.121536],[15.6109,100.121559],[15.61037,100.121597],[15.60577,100.122017],[15.60203,100.122414],[15.60097,100.122528],[15.59964,100.122673],[15.59883,100.122726],[15.59727,100.122887],[15.594,100.123238],[15.59322,100.123322],[15.59139,100.123497],[15.59112,100.123528],[15.58641,100.124046],[15.58456,100.12426],[15.58217,100.124512],[15.57952,100.124786],[15.57741,100.125023],[15.57477,100.125313],[15.57104,100.12571],[15.5673,100.126099],[15.56677,100.126152],[15.56257,100.126587],[15.55892,100.126907],[15.55866,100.126938],[15.55732,100.127083],[15.55625,100.12719],[15.55572,100.127258],[15.55546,100.127289],[15.55467,100.127388],[15.54787,100.128113],[15.54605,100.128242],[15.54499,100.128197],[15.54446,100.128113],[15.54343,100.127853],[15.5396,100.126534],[15.53935,100.126427],[15.53479,100.124977],[15.53266,100.124817],[15.53055,100.125191],[15.52954,100.125526],[15.52501,100.127136],[15.52288,100.127296],[15.52028,100.126984],[15.51816,100.126678],[15.51471,100.126213],[15.5098,100.125504],[15.50955,100.125473],[15.50904,100.125397],[15.50748,100.125252],[15.50665,100.125229],[15.50425,100.125526],[15.50321,100.125801],[15.50295,100.125893],[15.50144,100.126472],[15.49994,100.127098],[15.49968,100.127197],[15.4979,100.127907],[15.49206,100.130219],[15.49181,100.130333],[15.48732,100.132233],[15.48482,100.133888],[15.48358,100.134918],[15.48048,100.137543],[15.47986,100.138069],[15.47966,100.138237],[15.47863,100.139107],[15.4778,100.139793],[15.47758,100.139954],[15.4769,100.140404],[15.47667,100.140549],[15.4762,100.140823],[15.47547,100.141182],[15.47293,100.142067],[15.47161,100.142403],[15.46452,100.144142],[15.46318,100.144463],[15.46139,100.144882],[15.46078,100.145027],[15.45703,100.145958],[15.45379,100.14653],[15.45133,100.146538],[15.44864,100.146118],[15.44813,100.145958],[15.44761,100.145798],[15.44397,100.144928],[15.44036,100.144043],[15.43984,100.143913],[15.43825,100.143509],[15.43669,100.143097],[15.43405,100.142403],[15.43217,100.142311],[15.43031,100.142761],[15.42954,100.143051],[15.42879,100.143341],[15.42844,100.143471],[15.42729,100.143898],[15.42502,100.144737],[15.41997,100.146683],[15.41895,100.147003],[15.41788,100.147179],[15.41599,100.147247],[15.41572,100.147247],[15.41438,100.147217],[15.41276,100.147232],[15.41113,100.147217],[15.40869,100.147186],[15.40271,100.147087],[15.40135,100.147087],[15.40056,100.147079],[15.39872,100.147141],[15.39752,100.147209],[15.39729,100.147232],[15.39668,100.147301],[15.39601,100.147377],[15.39561,100.147438],[15.39551,100.147453],[15.3949,100.14756],[15.39478,100.147583],[15.39407,100.14772],[15.39362,100.147827],[15.393,100.148003],[15.39124,100.148438],[15.39037,100.148712],[15.39014,100.148788],[15.38919,100.149109],[15.38869,100.149261],[15.38818,100.149422],[15.38664,100.14994],[15.38307,100.151154],[15.38178,100.151604],[15.38048,100.152039],[15.38021,100.15213],[15.37995,100.152222],[15.37785,100.152931],[15.37759,100.153023],[15.37479,100.153976],[15.3707,100.155373],[15.36592,100.157043],[15.36289,100.158073],[15.35931,100.159286],[15.35477,100.16095],[15.35355,100.161484],[15.34929,100.163544],[15.34725,100.164627],[15.34634,100.165154],[15.34216,100.16748],[15.341,100.168121],[15.33988,100.168739],[15.3395,100.168953],[15.33886,100.169312],[15.33798,100.1698],[15.33737,100.170143],[15.33693,100.170387],[15.33648,100.170631],[15.33251,100.172836],[15.33088,100.173737],[15.32901,100.174782],[15.32783,100.17543],[15.32526,100.176849],[15.32505,100.176971],[15.32421,100.177437],[15.32274,100.178253],[15.32159,100.178886],[15.32127,100.17907],[15.31896,100.180351],[15.31723,100.18132],[15.3147,100.182716],[15.31442,100.182877],[15.31256,100.183907],[15.31003,100.185318],[15.30866,100.186073],[15.30612,100.187477],[15.30554,100.187843],[15.30511,100.18808],[15.30416,100.188568],[15.30307,100.189117],[15.30274,100.189278],[15.30025,100.190407],[15.2999,100.190559],[15.29957,100.190697],[15.2993,100.190811],[15.29896,100.190964],[15.29851,100.191147],[15.29838,100.1912],[15.29825,100.191261],[15.29813,100.191307],[15.29798,100.191368],[15.29782,100.191437],[15.2976,100.191521],[15.29703,100.191742],[15.29618,100.192047],[15.29541,100.192329],[15.29437,100.19268],[15.29415,100.192757],[15.29393,100.192833],[15.29348,100.192978],[15.29326,100.193047],[15.28926,100.194153],[15.28852,100.194344],[15.28729,100.194672],[15.28608,100.195],[15.28584,100.195061],[15.28535,100.19519],[15.28036,100.196571],[15.27729,100.197403],[15.27612,100.197723],[15.2747,100.198097],[15.27351,100.198418],[15.27231,100.198738],[15.26826,100.199837],[15.26282,100.201271],[15.26071,100.201843],[15.26047,100.20192],[15.25882,100.202377],[15.2581,100.202583],[15.25691,100.202904],[15.25644,100.203018],[15.25549,100.203247],[15.25526,100.2033],[15.2548,100.203407],[15.25265,100.203819],[15.24998,100.204338],[15.24949,100.20443],[15.24851,100.204643],[15.24778,100.204781],[15.24681,100.204987],[15.24633,100.205078],[15.24512,100.205307],[15.24278,100.20578],[15.24127,100.206078],[15.24049,100.20623],[15.23587,100.207352],[15.23538,100.207481],[15.23346,100.208],[15.23133,100.208572],[15.22951,100.209053],[15.22351,100.210709],[15.2228,100.210907],[15.22038,100.211639],[15.22014,100.211723],[15.21967,100.211884],[15.21848,100.212288],[15.21754,100.212608],[15.21614,100.21312],[15.21521,100.213493],[15.21316,100.214401],[15.20888,100.216461],[15.20757,100.217171],[15.20649,100.217796],[15.20231,100.220222],[15.19877,100.222237],[15.19429,100.224808],[15.19122,100.226486],[15.18906,100.227707],[15.18715,100.228844],[15.18267,100.231468],[15.18014,100.233093],[15.17931,100.23365],[15.17829,100.23436],[15.17748,100.234932],[15.17647,100.235672],[15.17547,100.236397],[15.17467,100.237],[15.17427,100.237297],[15.17085,100.239853],[15.16943,100.240891],[15.16743,100.242371],[15.16702,100.242668],[15.16662,100.242973],[15.1636,100.245178],[15.16119,100.246941],[15.15867,100.248703],[15.15807,100.249092],[15.1566,100.249992],[15.15618,100.250237],[15.1529,100.251968],[15.15093,100.25296],[15.14985,100.25354],[15.14877,100.254128],[15.14688,100.255127],[15.14652,100.25531],[15.14462,100.256218],[15.14441,100.25631],[15.14381,100.256569],[15.14345,100.256737],[15.14328,100.256813],[15.14258,100.257141],[15.1424,100.257233],[15.13979,100.258553],[15.13638,100.260277],[15.13618,100.260384],[15.13599,100.260468],[15.13366,100.261642],[15.13288,100.262032],[15.13269,100.262131],[15.13211,100.262428],[15.13091,100.263031],[15.13071,100.26313],[15.13028,100.263344],[15.13006,100.263458],[15.12984,100.263573],[15.12871,100.26413],[15.12803,100.26445],[15.12519,100.265984],[15.12263,100.267998],[15.12059,100.270264],[15.12029,100.270668],[15.11829,100.273659],[15.11704,100.275551],[15.11691,100.275757],[15.11476,100.279121],[15.11189,100.283524],[15.1103,100.286003],[15.10981,100.286713],[15.10929,100.287376],[15.107,100.289864],[15.1045,100.291901],[15.10075,100.294456],[15.09984,100.29509],[15.09925,100.295486],[15.09802,100.296333],[15.09573,100.29789],[15.09328,100.299507],[15.08991,100.301826],[15.08797,100.303169],[15.08675,100.304001],[15.08506,100.305168],[15.08359,100.306198],[15.08292,100.306671],[15.08214,100.307297],[15.08133,100.307953],[15.07951,100.30954],[15.07753,100.31144],[15.07606,100.312767],[15.07379,100.315063],[15.07118,100.317436],[15.06834,100.319649],[15.06525,100.32151],[15.05924,100.324608],[15.05301,100.327957],[15.04762,100.330757],[15.04751,100.330833],[15.04493,100.332314],[15.04151,100.334091],[15.0373,100.335579],[15.03228,100.336708],[15.02009,100.339088],[15.01539,100.340363],[15.01103,100.342216],[14.99827,100.348938],[14.98775,100.3545],[14.97862,100.359711],[14.94595,100.385002],[14.93855,100.390968],[14.93602,100.392723],[14.93327,100.394218],[14.9229,100.399612],[14.9125,100.405006],[14.90917,100.406914],[14.90763,100.408119],[14.90623,100.409462],[14.90454,100.411537],[14.90295,100.413712],[14.89979,100.418411],[14.89884,100.419594],[14.89781,100.420708],[14.89672,100.421722],[14.89556,100.422684],[14.88987,100.426567],[14.88409,100.430473],[14.87735,100.435089],[14.87514,100.43644],[14.87249,100.437813],[14.87109,100.438423],[14.86971,100.43895],[14.86837,100.439407],[14.86738,100.439743],[14.84928,100.445084],[14.84726,100.445663],[14.84332,100.446716],[14.83894,100.447487],[14.83473,100.44767],[14.82958,100.44735],[14.82374,100.446953],[14.81974,100.446632],[14.81552,100.447098],[14.81223,100.448128],[14.80827,100.450729],[14.80396,100.454041],[14.7992,100.45681],[14.79534,100.458],[14.79177,100.458366],[14.78836,100.457741],[14.78346,100.455803],[14.77892,100.453453],[14.77537,100.451897],[14.77126,100.450951],[14.76771,100.450951],[14.76466,100.451317],[14.76021,100.452454],[14.75194,100.45343],[14.74029,100.454597],[14.72864,100.454987],[14.71756,100.455673],[14.71203,100.455742],[14.70655,100.455513],[14.70081,100.456139],[14.69838,100.456802],[14.69604,100.457611],[14.69409,100.458519],[14.69224,100.459549],[14.68872,100.461807],[14.68175,100.466316],[14.67903,100.468048],[14.67772,100.468758],[14.67635,100.469383],[14.6747,100.470032],[14.6729,100.470589],[14.67138,100.470947],[14.6698,100.471199],[14.66144,100.472649],[14.65078,100.474442],[14.64606,100.474808],[14.6414,100.474693],[14.63213,100.473251],[14.61383,100.469772],[14.60978,100.468941],[14.60526,100.469658],[14.60155,100.470863],[14.596,100.473961],[14.58557,100.480904],[14.5814,100.483727],[14.57584,100.487503],[14.57241,100.489838],[14.56537,100.493813],[14.55793,100.497063],[14.5467,100.500923],[14.53397,100.504532],[14.52399,100.507629],[14.51725,100.512268],[14.51076,100.517433],[14.50352,100.520782],[14.48903,100.526711],[14.48318,100.529457],[14.47226,100.534416],[14.46707,100.536926],[14.46552,100.537682],[14.46439,100.538063],[14.4626,100.538567],[14.45988,100.539131],[14.45759,100.539543],[14.45528,100.540001],[14.45267,100.540497],[14.45009,100.540977],[14.44627,100.541733],[14.44432,100.542099],[14.4423,100.542282],[14.43974,100.54303],[14.43799,100.543922],[14.43635,100.545029],[14.43472,100.546593],[14.4333,100.548424],[14.42962,100.553459],[14.42807,100.555634],[14.42727,100.556686],[14.42557,100.558952],[14.41425,100.574028],[14.40527,100.584137],[14.40375,100.585831],[14.40259,100.587097],[14.40093,100.588966],[14.39634,100.594048],[14.39526,100.595238],[14.39514,100.595383],[14.39509,100.595413],[14.39261,100.597809],[14.38907,100.600853],[14.38355,100.604683],[14.38173,100.605766],[14.37816,100.607613],[14.37716,100.608047],[14.37459,100.609138],[14.37241,100.609978],[14.36911,100.610939],[14.36623,100.611748],[14.36269,100.612419],[14.35971,100.613007],[14.35777,100.613167],[14.35565,100.613297],[14.35309,100.613327],[14.34958,100.613258],[14.34487,100.613213],[14.332,100.613342],[14.32856,100.613327],[14.31873,100.613327],[14.30838,100.613342],[14.3044,100.613373],[14.30383,100.613373],[14.30248,100.613388],[14.28388,100.613457],[14.26434,100.613449],[14.26224,100.613487],[14.25709,100.613564],[14.2519,100.613564],[14.24813,100.613564],[14.24431,100.613411],[14.24005,100.612999],[14.23393,100.612228],[14.23293,100.612091],[14.23122,100.61187],[14.21575,100.609734],[14.21111,100.609123],[14.21052,100.609062],[14.20943,100.608963],[14.20799,100.60891],[14.20694,100.608932],[14.2055,100.608994],[14.2024,100.609047],[14.20071,100.609154],[14.19831,100.609467],[14.19601,100.609779],[14.19276,100.610519],[14.18953,100.61145],[14.18302,100.613777],[14.17835,100.61557],[14.17814,100.615677],[14.17804,100.615761],[14.17794,100.615837],[14.17783,100.615936],[14.17773,100.616058],[14.17759,100.616257],[14.17754,100.616348],[14.17745,100.616524],[14.17739,100.616699],[14.17736,100.616814],[14.17734,100.616943],[14.17734,100.617081],[14.17737,100.617218],[14.17741,100.617348],[14.17747,100.61747],[14.17755,100.617599],[14.17835,100.618568],[14.17858,100.618782],[14.17868,100.618927],[14.17905,100.619164],[14.17952,100.619453],[14.17988,100.619713],[14.18023,100.620003],[14.18057,100.620293],[14.18088,100.620598],[14.18122,100.620956],[14.18154,100.621353],[14.18183,100.621742],[14.1821,100.622139],[14.18238,100.622627],[14.18266,100.623169],[14.18351,100.624786],[14.18394,100.625603],[14.1876,100.6325],[14.18777,100.632629],[14.18804,100.632973],[14.18819,100.633118],[14.18844,100.633324],[14.1886,100.633423],[14.18879,100.633507],[14.18898,100.633583],[14.18944,100.633728],[14.18958,100.633781],[14.18973,100.633858],[14.18985,100.633949],[14.18996,100.634079],[14.19003,100.634178],[14.1901,100.6343],[14.19017,100.634453],[14.19021,100.634598],[14.19024,100.634697],[14.19024,100.634773],[14.19026,100.634903],[14.19025,100.635078],[14.19024,100.635193],[14.19022,100.635292],[14.1902,100.635384],[14.19014,100.635567],[14.19004,100.635803],[14.18993,100.636009],[14.18973,100.636276],[14.18955,100.636513],[14.18934,100.636711],[14.18917,100.636848],[14.18869,100.637123],[14.18505,100.63929],[14.18225,100.640869],[14.16198,100.65229],[14.15898,100.653976],[14.14369,100.662613],[14.14085,100.664207],[14.12254,100.67453],[14.11993,100.676003],[14.1014,100.686447],[14.09778,100.688477],[14.08837,100.693787],[14.08782,100.694069],[14.08718,100.694328],[14.08655,100.694542],[14.08592,100.694717],[14.08521,100.694847],[14.08467,100.694923],[14.0686,100.696533],[14.06346,100.697052],[14.05247,100.698151],[14.05158,100.698227],[14.05068,100.698273],[14.02581,100.698288],[14.02536,100.698311],[14.02491,100.698341],[14.02444,100.698387],[14.02399,100.698463],[14.0235,100.698547],[14.02317,100.698624],[14.02292,100.698692],[14.0224,100.698837],[14.02195,100.698982],[14.02148,100.69915],[14.02108,100.699318],[14.02067,100.699501],[14.01956,100.699989],[14.00956,100.704399],[13.99926,100.708946],[13.99298,100.711723],[13.99042,100.712837],[13.98989,100.713013],[13.98935,100.713173],[13.98881,100.713287],[13.98828,100.713371],[13.98776,100.713417],[13.98726,100.713463],[13.98675,100.713448],[13.9863,100.713417],[13.98523,100.713333],[13.98473,100.713333],[13.9826,100.713287],[13.95215,100.71286],[13.95173,100.712837],[13.95132,100.712822],[13.95075,100.712784],[13.9502,100.712723],[13.94955,100.712624],[13.94912,100.712547],[13.94865,100.712463],[13.94311,100.710999],[13.93615,100.709167],[13.93011,100.707581],[13.92421,100.706032],[13.92266,100.705643],[13.92128,100.705261],[13.92036,100.704964],[13.91983,100.704773],[13.91909,100.704483],[13.9177,100.703888],[13.91276,100.701317],[13.90788,100.698799],[13.90705,100.698357],[13.89609,100.692703],[13.89326,100.691231],[13.88801,100.688507],[13.88746,100.688217],[13.87732,100.682983],[13.87618,100.682381],[13.86972,100.679039],[13.86879,100.678574],[13.86822,100.678307],[13.86793,100.6782],[13.86763,100.678101],[13.86725,100.677994],[13.86686,100.677887],[13.8578,100.675797],[13.8572,100.675636],[13.85666,100.675484],[13.85623,100.675323],[13.85546,100.675003],[13.8538,100.674316],[13.85204,100.673592],[13.85131,100.673302],[13.85097,100.67318],[13.85063,100.67308],[13.85029,100.672997],[13.84993,100.672928],[13.84957,100.672882],[13.84612,100.672638],[13.84541,100.672592],[13.84291,100.672417],[13.84251,100.672401],[13.84197,100.672401],[13.84152,100.672432],[13.84111,100.672478],[13.84064,100.672546],[13.84026,100.672623],[13.83963,100.672783],[13.83788,100.673233],[13.83672,100.673523],[13.83597,100.673721],[13.83529,100.673866],[13.83487,100.673943],[13.83439,100.674011],[13.83402,100.674049],[13.83295,100.674118],[13.83175,100.674179],[13.82532,100.67453],[13.8245,100.674606],[13.82378,100.674713],[13.8232,100.674828],[13.82128,100.675308],[13.81476,100.677017],[13.79887,100.681221],[13.79574,100.682037],[13.78257,100.685516],[13.78209,100.685669],[13.78161,100.685822],[13.7809,100.686073],[13.78006,100.686363],[13.77943,100.686623],[13.77875,100.68692],[13.77829,100.687134],[13.77761,100.687462],[13.77604,100.688309],[13.77088,100.691109],[13.76983,100.691681],[13.76765,100.692863],[13.76654,100.693466],[13.76069,100.696648],[13.75988,100.69709],[13.75691,100.6987],[13.75131,100.701736],[13.75102,100.701881],[13.75072,100.702011],[13.75036,100.702148],[13.7501,100.70224],[13.74983,100.702316],[13.74956,100.7024],[13.74928,100.702469],[13.74898,100.70253],[13.7487,100.702583],[13.7481,100.70266],[13.74738,100.702713],[13.74684,100.702713],[13.74257,100.702789],[13.74221,100.70298],[13.73885,100.703033],[13.73849,100.703217],[13.73729,100.703247],[13.73711,100.703346],[13.7362,100.70343],[13.73587,100.703499],[13.73561,100.703598],[13.73523,100.70388],[13.73436,100.704857],[13.73386,100.705383],[13.73325,100.705803],[13.73292,100.706093],[13.73268,100.706451],[13.73245,100.707199],[13.73227,100.70813],[13.7322,100.708519],[13.73188,100.710297],[13.7304,100.723747],[13.73037,100.724022],[13.72961,100.73085],[13.72959,100.731033],[13.72935,100.73317],[13.72933,100.733917],[13.72933,100.734703],[13.72949,100.740051],[13.72953,100.741081],[13.72953,100.741257],[13.7296,100.744133],[13.7297,100.748718],[13.72977,100.751572],[13.72991,100.757378],[13.72997,100.757896],[13.7309,100.761551],[13.73172,100.764793],[13.7318,100.765182],[13.73183,100.765602],[13.73191,100.76786],[13.73211,100.771118],[13.73215,100.773232],[13.73228,100.783249],[13.73232,100.784142],[13.73249,100.785889],[13.73291,100.79023],[13.73429,100.803726],[13.73383,100.805557],[13.73315,100.807281],[13.73138,100.809334],[13.72858,100.811081],[13.72721,100.81176],[13.7256,100.812553],[13.71357,100.818466],[13.71015,100.820236],[13.67427,100.838043],[13.67241,100.840233],[13.66908,100.845444],[13.60214,100.949783],[13.59885,100.954903],[13.59275,100.964043],[13.57161,100.981888],[13.55248,100.997871],[13.5509,100.999191],[13.5466,101.002937],[13.54299,101.005966],[13.53928,101.009087],[13.5367,101.011261],[13.49601,101.045448],[13.4933,101.046761],[13.49057,101.04705],[13.47329,101.04612],[13.4541,101.046257],[13.44076,101.046288],[13.42756,101.046783],[13.39933,101.047531],[13.39226,101.047073],[13.38711,101.046272],[13.36243,101.038658],[13.35742,101.036041],[13.35643,101.035423],[13.35091,101.031921],[13.34394,101.027634],[13.32626,101.016411],[13.31824,101.010399],[13.303,100.998978],[13.30144,100.997482],[13.30042,100.99649],[13.29915,100.99559],[13.29733,100.994743],[13.29551,100.993729],[13.29331,100.992599],[13.29079,100.991959],[13.28824,100.991524],[13.2831,100.991096],[13.27806,100.990791],[13.27206,100.990356],[13.26595,100.989998],[13.26406,100.989861],[13.26223,100.989769],[13.26119,100.98983],[13.26009,100.98996],[13.25884,100.990173],[13.25766,100.990509],[13.25655,100.990868],[13.25397,100.991837],[13.25177,100.992706],[13.24063,100.996986],[13.23351,100.99971],[13.22734,101.002083],[13.22418,101.003311],[13.22106,101.004509],[13.21955,101.005058],[13.21801,101.005463],[13.21637,101.005692],[13.21487,101.005783],[13.21191,101.005524],[13.20789,101.004379],[13.20639,101.003883],[13.19684,101.00074],[13.19001,100.99852],[13.18317,100.996277],[13.17575,100.993828],[13.16839,100.99144],[13.16099,100.989037],[13.15633,100.987556],[13.15439,100.986961],[13.15364,100.986717],[13.15228,100.986397],[13.15062,100.986153],[13.14806,100.986031],[13.14536,100.985947],[13.14282,100.985809],[13.13809,100.985718],[13.13165,100.985413],[13.12547,100.985199],[13.12188,100.985008],[13.12003,100.985031],[13.11832,100.985123],[13.11127,100.986557],[13.10656,100.987534],[13.10132,100.988663],[13.09598,100.989754],[13.09082,100.990791],[13.08545,100.99192],[13.07498,100.994072],[13.06974,100.995102],[13.06474,100.996117],[13.05745,100.996262],[13.05021,100.996323],[13.03819,100.996429],[13.025,100.996498],[13.01834,100.996536],[13.01381,100.996597],[13.01173,100.996452],[13.00731,100.995232],[12.99751,100.991707],[12.99483,100.990753],[12.98278,100.986504],[12.97491,100.983803],[12.97186,100.982681],[12.96919,100.981857],[12.96762,100.981293],[12.96685,100.981194],[12.9663,100.981056],[12.96574,100.98101],[12.96515,100.981056],[12.96462,100.981377],[12.96341,100.982033],[12.96096,100.98378],[12.95902,100.984718],[12.95468,100.98716],[12.95261,100.988342],[12.94143,100.994949],[12.93028,101.001678],[12.92805,101.003357],[12.92681,101.00486],[12.92379,101.009621],[12.92007,101.015747],[12.91659,101.0214],[12.91547,101.022774],[12.9151,101.023117],[12.91215,101.025848],[12.90933,101.028763],[12.90849,101.029533],[12.90795,101.03009],[12.90274,101.035248],[12.90131,101.036652],[12.90082,101.03714],[12.89481,101.043053],[12.88653,101.051193],[12.88284,101.05481],[12.87155,101.065903],[12.86993,101.067871],[12.86114,101.083557],[12.85287,101.098701],[12.84665,101.109756],[12.84072,101.120407],[12.83925,101.121857],[12.83811,101.12278],[12.83599,101.12429],[12.83082,101.127808],[12.82666,101.130661],[12.82239,101.133537],[12.81921,101.135651],[12.81603,101.137787],[12.80908,101.142593],[12.80223,101.147209],[12.79566,101.151749],[12.78903,101.15638],[12.78129,101.163872],[12.77738,101.167793],[12.77337,101.171707],[12.76987,101.175087],[12.76591,101.179092],[12.76228,101.182678],[12.75869,101.186302],[12.75254,101.192291],[12.7495,101.195259],[12.74631,101.198151],[12.73827,101.20517],[12.73008,101.212349],[12.72737,101.214783],[12.72482,101.217682],[12.72087,101.222397],[12.71684,101.227226],[12.70798,101.237846],[12.70502,101.241524],[12.7044,101.242378],[12.7039,101.243347],[12.70129,101.250237],[12.69903,101.256577],[12.69825,101.264671],[12.69778,101.270447],[12.69759,101.273117],[12.69682,101.279663],[12.69649,101.282837],[12.69607,101.285477],[12.69359,101.291321],[12.69267,101.293213],[12.69164,101.294777],[12.69023,101.29615],[12.68867,101.297241],[12.68297,101.299988],[12.67723,101.302818],[12.66358,101.309792],[12.66238,101.311333],[12.66135,101.316528],[12.66116,101.317993],[12.65854,101.326317],[12.65777,101.328644],[12.65398,101.336578],[12.6483,101.344757],[12.64673,101.348091],[12.64639,101.348824],[12.64616,101.349297],[12.64595,101.349747],[12.64557,101.350563],[12.64334,101.355293],[12.64314,101.355721],[12.63985,101.362717],[12.63967,101.363518],[12.63899,101.372093],[12.64012,101.388603],[12.64075,101.398293],[12.64155,101.408882],[12.64237,101.422127],[12.64219,101.424332],[12.64124,101.42881],[12.64327,101.435623],[12.65019,101.447891],[12.65435,101.455276],[12.6613,101.472076],[12.66057,101.488861],[12.66082,101.495087],[12.66561,101.511528],[12.67204,101.521507],[12.68008,101.523369],[12.68229,101.525742],[12.68671,101.534187],[12.70008,101.541809],[12.70731,101.54882],[12.71304,101.560768],[12.71314,101.563553],[12.71917,101.568703],[12.72148,101.574471],[12.72651,101.577766],[12.73162,101.587303],[12.73595,101.595383],[12.75103,101.609909],[12.75394,101.613403],[12.7559,101.615753],[12.76348,101.624847],[12.77363,101.639168],[12.77632,101.64283],[12.78186,101.646896],[12.78272,101.650703],[12.78339,101.653229],[12.78356,101.653877],[12.78415,101.656662],[12.78494,101.6586],[12.7862,101.661133],[12.78678,101.662407],[12.78695,101.663277],[12.78691,101.664818],[12.78645,101.669197],[12.78565,101.679581],[12.78532,101.681557],[12.78398,101.68602],[12.78172,101.693832],[12.77642,101.711746],[12.77624,101.712372],[12.77546,101.715767],[12.77636,101.718887],[12.77753,101.722893],[12.78054,101.732933],[12.78879,101.760483],[12.78925,101.762283],[12.78942,101.766441],[12.78921,101.76889],[12.78892,101.772278],[12.78788,101.785912],[12.78737,101.788971],[12.78692,101.789993],[12.7862,101.791634],[12.78431,101.79554],[12.78356,101.796959],[12.78314,101.798241],[12.78285,101.800392],[12.78164,101.810562],[12.78092,101.815964],[12.78046,101.819359],[12.77996,101.821373],[12.77896,101.824249],[12.77678,101.830948],[12.77469,101.837212],[12.7741,101.838966],[12.77222,101.842232],[12.77109,101.843819],[12.76665,101.850388],[12.76581,101.851372],[12.76473,101.852402],[12.76247,101.854286],[12.76138,101.855186],[12.7597,101.857162],[12.75732,101.859947],[12.75564,101.861931],[12.75476,101.863258],[12.75255,101.867813],[12.74983,101.873299],[12.7466,101.880547],[12.74455,101.885017],[12.74267,101.889313],[12.74187,101.890121],[12.7407,101.8909],[12.73957,101.89167],[12.73878,101.892616],[12.73798,101.894157],[12.73551,101.899353],[12.73346,101.904243],[12.73224,101.907806],[12.73099,101.911499],[12.73091,101.912956],[12.73053,101.91626],[12.72299,101.941582],[12.72316,101.953247],[12.72295,101.954933],[12.72217,101.957153],[12.72216,101.958961],[12.72146,101.971413],[12.7209,101.972687],[12.72015,101.973846],[12.71939,101.975357],[12.71882,101.976128],[12.71659,101.978317],[12.71395,101.980293],[12.71165,101.981361],[12.70043,101.986168],[12.69917,101.986771],[12.69767,101.988274],[12.69088,101.995911],[12.68599,102.001244],[12.68335,102.00415],[12.6823,102.005096],[12.68121,102.005569],[12.67991,102.005608],[12.67862,102.005386],[12.67744,102.00518],[12.67636,102.005051],[12.67552,102.005013],[12.67451,102.00518],[12.65326,102.011581],[12.65151,102.012482],[12.65004,102.016434],[12.64939,102.018707],[12.64882,102.021049],[12.64871,102.021553],[12.64862,102.021927],[12.64854,102.022362],[12.6485,102.02282],[12.64855,102.023499],[12.64883,102.025787],[12.64942,102.03067],[12.65019,102.040031],[12.65722,102.058571],[12.66028,102.066811],[12.66145,102.071777],[12.66534,102.088951],[12.66677,102.0914],[12.66697,102.091743],[12.66748,102.092644],[12.6629,102.119957],[12.6499,102.129128],[12.64373,102.130623],[12.64176,102.131866],[12.63252,102.142036],[12.62387,102.151543],[12.62117,102.148933],[12.61644,102.141602],[12.61577,102.140556],[12.60959,102.134377],[12.60811,102.133591],[12.60534,102.133743],[12.60309,102.135002],[12.60275,102.1353],[12.60235,102.135674],[12.60058,102.137268],[12.59573,102.143303],[12.58852,102.155151],[12.57278,102.162529],[12.56758,102.162529],[12.55827,102.157852],[12.54606,102.155487],[12.54006,102.157417],[12.53078,102.157288],[12.53014,102.157707],[12.52137,102.163589],[12.51361,102.168503],[12.50319,102.170288],[12.50093,102.170937],[12.48798,102.174721],[12.48346,102.179352],[12.48312,102.181931],[12.47407,102.190857],[12.46938,102.195831],[12.46737,102.199783],[12.46502,102.206131],[12.4658,102.220001],[12.45995,102.230057],[12.45079,102.245682],[12.4543,102.258827],[12.45664,102.262444],[12.45698,102.269478],[12.45161,102.284752],[12.44726,102.288696],[12.4439,102.297287],[12.44038,102.300537],[12.43006,102.313637],[12.42664,102.318916],[12.41257,102.330421],[12.39741,102.350517],[12.39663,102.354973],[12.39218,102.364067],[12.38945,102.368896],[12.38737,102.370117],[12.38571,102.37117],[12.38241,102.373177],[12.381,102.374153],[12.37111,102.388428],[12.36611,102.395821],[12.36796,102.410751],[12.36292,102.425003],[12.34096,102.4468],[12.33492,102.456932],[12.32819,102.45916],[12.32289,102.459846],[12.31658,102.465607],[12.31094,102.468086],[12.30272,102.475471],[12.29473,102.480309],[12.28444,102.484909],[12.27337,102.493149],[12.25648,102.507713],[12.25171,102.509537],[12.25944,102.518356],[12.26459,102.532806],[12.26085,102.543793],[12.25926,102.553307],[12.25758,102.555817],[12.2537,102.560799],[12.25156,102.568703],[12.25103,102.578362],[12.25093,102.587677],[12.25035,102.608727],[12.25054,102.611641],[12.24529,102.625427],[12.23383,102.627869],[12.23004,102.632057],[12.22525,102.645149],[12.20238,102.657333],[12.19404,102.659683],[12.18628,102.665611],[12.16334,102.679649],[12.15023,102.683006],[12.13089,102.691048],[12.1194,102.694992],[12.11467,102.697151],[12.1053,102.700394],[12.09618,102.705383],[12.08143,102.718521],[12.07709,102.725151],[12.06748,102.731934],[12.06485,102.73616],[12.06065,102.739113],[12.05058,102.75132],[12.04662,102.753799],[12.04233,102.758507],[12.01981,102.769608],[12.01509,102.77037],[12.00404,102.770599],[11.98184,102.776588],[11.96461,102.783089],[11.92141,102.80452],[11.90769,102.808289],[11.90115,102.811401],[11.88415,102.814987],[11.87684,102.818672],[11.86838,102.820839],[11.84824,102.831734],[11.84367,102.837181],[11.81262,102.853706],[11.80578,102.860786],[11.78507,102.874878],[11.7791,102.883461],[11.77862,102.884491],[11.77812,102.886162],[11.77667,102.886948],[11.77323,102.888817],[11.77145,102.888847],[11.7708,102.889069],[11.76782,102.890984],[11.76454,102.894508],[11.75899,102.896049],[11.75711,102.896729],[11.75476,102.896507],[11.75231,102.897057],[11.75154,102.897423],[11.7498,102.897713],[11.74754,102.898857],[11.74599,102.899002],[11.74284,102.900726],[11.74084,102.901321],[11.73924,102.902321],[11.73823,102.902657],[11.73688,102.904053],[11.73105,102.906174],[11.72379,102.905197],[11.71887,102.907021],[11.71666,102.907227],[11.7156,102.907669],[11.71261,102.907578],[11.71073,102.907593],[11.70928,102.906769],[11.70047,102.906502],[11.69846,102.904984],[11.69535,102.904503],[11.69275,102.904793],[11.68926,102.903084],[11.68662,102.902481],[11.68326,102.903008],[11.68151,102.903816],[11.67983,102.904114],[11.67867,102.904861],[11.67712,102.905067],[11.67607,102.905533],[11.67155,102.904831],[11.6703,102.905792],[11.66651,102.906242],[11.66574,102.906036],[11.66491,102.906464],[11.66189,102.906693],[11.65979,102.907532],[11.65812,102.906967],[11.65571,102.907349],[11.65356,102.908577],[11.65165,102.908836],[11.64946,102.911377],[11.64477,102.916077],[11.6429,102.918373],[11.64362,102.923988],[11.64301,102.928268],[11.64347,102.933006],[11.63845,102.941254],[11.63771,102.943657],[11.63596,102.946564],[11.63056,102.94841],[11.62356,102.949257],[11.62305,102.959099],[11.61957,102.962143],[11.61888,102.962822],[11.6163,102.979683],[11.61549,102.983543],[11.6144,102.988731],[11.60786,102.99955],[11.602,103.010292],[11.60196,103.01226],[11.60207,103.013702],[11.60248,103.015457],[11.60349,103.018707],[11.60551,103.024986],[11.60552,103.025497],[11.60557,103.02755],[11.6056,103.030159],[11.60596,103.035187],[11.60501,103.03965],[11.60492,103.040741],[11.60497,103.043221],[11.60483,103.045799],[11.60459,103.051231],[11.60384,103.054947],[11.60387,103.055687],[11.60395,103.056992],[11.60426,103.060738],[11.60432,103.061996],[11.60429,103.062576],[11.60388,103.063538],[11.60186,103.065804],[11.60169,103.06633],[11.60166,103.066963],[11.60207,103.070351],[11.60197,103.071091],[11.60167,103.071609],[11.6012,103.072037],[11.60047,103.072578],[11.59986,103.072983],[11.59913,103.073311],[11.59821,103.073441],[11.59735,103.073799],[11.59625,103.074707],[11.59593,103.075119],[11.59537,103.076553],[11.59405,103.079643],[11.59234,103.082916],[11.59217,103.085197],[11.59172,103.085518],[11.58763,103.08609],[11.58631,103.087021],[11.58491,103.087578],[11.58245,103.087196],[11.58056,103.086647],[11.57998,103.08696],[11.57799,103.089256],[11.57315,103.091026],[11.5725,103.091621],[11.57233,103.091957],[11.57225,103.092667],[11.57285,103.094414],[11.57348,103.095551],[11.57386,103.096298],[11.5736,103.098068],[11.5731,103.099411],[11.57245,103.100128],[11.57032,103.103363],[11.57003,103.104584],[11.56918,103.108437],[11.56847,103.11319],[11.56842,103.117027],[11.56869,103.118782],[11.56872,103.119423],[11.56863,103.120323],[11.56853,103.121597],[11.56842,103.12207],[11.56795,103.122673],[11.5659,103.12368],[11.56546,103.124168],[11.56533,103.124733],[11.56502,103.128433],[11.5649,103.12986],[11.5649,103.130928],[11.56522,103.131577],[11.5656,103.131882],[11.56614,103.132057],[11.56714,103.132141],[11.56756,103.132301],[11.56791,103.132591],[11.56859,103.13308],[11.56917,103.133186],[11.57056,103.133148],[11.57129,103.133347],[11.57193,103.133659],[11.57353,103.135071],[11.57457,103.135872],[11.57491,103.136261],[11.57502,103.136902],[11.57487,103.137917],[11.57441,103.140404],[11.57429,103.141327],[11.57433,103.142113],[11.57444,103.142891],[11.57476,103.144463],[11.57497,103.144943],[11.57528,103.145447],[11.57682,103.146919],[11.57742,103.147034],[11.57778,103.147011],[11.57831,103.147133],[11.57866,103.147537],[11.57868,103.148178],[11.57848,103.148842],[11.57848,103.150169],[11.57856,103.15094],[11.57885,103.151627],[11.57896,103.152298],[11.57817,103.156929],[11.57748,103.15934],[11.57724,103.160477],[11.57753,103.162361],[11.57745,103.163803],[11.57709,103.165443],[11.57664,103.168533],[11.57636,103.172096],[11.57614,103.175041],[11.57617,103.176277],[11.5766,103.177353],[11.57753,103.179581],[11.57851,103.181953],[11.57915,103.183578],[11.57981,103.185051],[11.5804,103.185829],[11.58186,103.187073],[11.58236,103.187508],[11.58281,103.188171],[11.58325,103.188911],[11.58361,103.189934],[11.58373,103.193459],[11.58285,103.196899],[11.58268,103.199982],[11.58339,103.202049],[11.58439,103.203133],[11.58479,103.204308],[11.58481,103.206703],[11.58574,103.20929],[11.58657,103.21035],[11.58873,103.212334],[11.59018,103.213943],[11.5904,103.214432],[11.5906,103.21769],[11.59058,103.217781],[11.59035,103.218803],[11.5882,103.220268],[11.58678,103.221764],[11.58348,103.22261],[11.57834,103.220749],[11.57638,103.221848],[11.57541,103.223122],[11.57472,103.22464],[11.57318,103.228439],[11.57241,103.229523],[11.57052,103.231133],[11.56974,103.232101],[11.56895,103.233109],[11.5683,103.234047],[11.56771,103.234581],[11.56548,103.235992],[11.56257,103.237617],[11.56186,103.237663],[11.56118,103.237488],[11.5604,103.237297],[11.55926,103.237343],[11.55846,103.236687],[11.55735,103.234642],[11.55677,103.233994],[11.55431,103.233093],[11.55359,103.232971],[11.55289,103.233101],[11.55138,103.233681],[11.54972,103.234703],[11.54917,103.235039],[11.5485,103.235313],[11.54473,103.23539],[11.54185,103.236504],[11.54024,103.237099],[11.53936,103.237282],[11.53716,103.237579],[11.53528,103.237],[11.534,103.236366],[11.53277,103.235626],[11.53164,103.234917],[11.53099,103.234749],[11.52984,103.23455],[11.52888,103.234177],[11.52735,103.233299],[11.52659,103.232536],[11.5262,103.23188],[11.5253,103.230614],[11.52429,103.229973],[11.52392,103.229927],[11.52121,103.229973],[11.51972,103.229561],[11.51893,103.229263],[11.5182,103.229317],[11.51399,103.23159],[11.51297,103.231812],[11.51194,103.231857],[11.51011,103.23188],[11.50902,103.232224],[11.50693,103.233429],[11.50576,103.233551],[11.50494,103.233231],[11.50325,103.23259],[11.50252,103.232422],[11.50093,103.232712],[11.50011,103.232773],[11.49915,103.232857],[11.49806,103.232651],[11.49561,103.231987],[11.49041,103.228378],[11.48962,103.227768],[11.48887,103.227501],[11.48762,103.227386],[11.48165,103.227951],[11.47617,103.227783],[11.47501,103.227638],[11.47367,103.226982],[11.47107,103.225647],[11.46887,103.224922],[11.46673,103.224213],[11.46596,103.224083],[11.46513,103.224503],[11.46288,103.22673],[11.45861,103.229118],[11.45768,103.229927],[11.45594,103.235283],[11.45535,103.235847],[11.45436,103.235909],[11.45231,103.23494],[11.45074,103.234207],[11.44935,103.233437],[11.44882,103.232803],[11.4481,103.231903],[11.44777,103.231461],[11.44646,103.23069],[11.44483,103.229797],[11.44376,103.228737],[11.44315,103.22834],[11.44296,103.228027],[11.44312,103.227257],[11.44294,103.226593],[11.44219,103.225899],[11.44182,103.225731],[11.44121,103.225906],[11.44061,103.226013],[11.43851,103.225807],[11.43649,103.225662],[11.43577,103.225906],[11.43484,103.226486],[11.43371,103.22715],[11.43153,103.228653],[11.43091,103.228668],[11.43053,103.228401],[11.43026,103.22805],[11.42979,103.227699],[11.42935,103.227997],[11.42913,103.228737],[11.42871,103.229958],[11.42834,103.230888],[11.42772,103.232048],[11.42666,103.232628],[11.42512,103.231987],[11.42317,103.23111],[11.41956,103.229424],[11.41809,103.229721],[11.41689,103.230324],[11.41594,103.231331],[11.41515,103.232651],[11.41403,103.233566],[11.41247,103.233757],[11.41083,103.233849],[11.4076,103.234238],[11.40635,103.23497],[11.40458,103.235901],[11.40382,103.23703],[11.40074,103.243408],[11.39951,103.246849],[11.39861,103.247864],[11.39231,103.250717],[11.38318,103.25174],[11.38208,103.252617],[11.38027,103.256081],[11.37877,103.259323],[11.37654,103.260857],[11.37606,103.261749],[11.37449,103.264359],[11.37389,103.264664],[11.3691,103.264771],[11.36836,103.265198],[11.36669,103.267418],[11.35941,103.271683],[11.35284,103.28212],[11.34847,103.285744],[11.34724,103.286469],[11.34553,103.287643],[11.34518,103.288109],[11.34536,103.288788],[11.34643,103.289711],[11.34668,103.290863],[11.34588,103.292938],[11.34509,103.293678],[11.33875,103.295464],[11.33796,103.296097],[11.33729,103.297028],[11.33656,103.297882],[11.33186,103.300552],[11.33066,103.30188],[11.3304,103.302391],[11.33031,103.303093],[11.33047,103.305153],[11.33047,103.306183],[11.32961,103.30854],[11.32908,103.309013],[11.32749,103.309433],[11.32654,103.310249],[11.3261,103.311157],[11.32575,103.312737],[11.32507,103.31424],[11.32294,103.317398],[11.32109,103.320778],[11.32049,103.321167],[11.31987,103.321289],[11.31806,103.321457],[11.31508,103.321899],[11.31325,103.322609],[11.31258,103.322662],[11.3116,103.322113],[11.3109,103.321907],[11.30992,103.321991],[11.30893,103.32225],[11.30779,103.322746],[11.30688,103.323372],[11.3058,103.324211],[11.30497,103.324944],[11.30449,103.325333],[11.30392,103.325691],[11.30293,103.325844],[11.30268,103.325783],[11.29959,103.324966],[11.29905,103.324928],[11.2979,103.324837],[11.29723,103.324654],[11.29601,103.323753],[11.29476,103.323433],[11.29397,103.323624],[11.2925,103.324753],[11.29014,103.325653],[11.28738,103.326508],[11.28699,103.327026],[11.28605,103.32917],[11.28512,103.330017],[11.28327,103.330742],[11.28231,103.330727],[11.27854,103.329353],[11.27771,103.329453],[11.27648,103.330269],[11.27562,103.330856],[11.27447,103.331558],[11.27372,103.332024],[11.27274,103.332283],[11.27011,103.332947],[11.26775,103.333687],[11.26709,103.334099],[11.26572,103.335281],[11.26541,103.335876],[11.26491,103.337448],[11.26399,103.339478],[11.26304,103.341507],[11.26191,103.343407],[11.2606,103.345131],[11.25998,103.345482],[11.25803,103.345978],[11.25598,103.346603],[11.2535,103.347031],[11.25327,103.347191],[11.25276,103.34761],[11.25099,103.351044],[11.24909,103.354622],[11.24879,103.355293],[11.24842,103.355789],[11.24748,103.356209],[11.24567,103.356209],[11.24308,103.356209],[11.24239,103.356491],[11.24009,103.358109],[11.23948,103.358612],[11.23888,103.359482],[11.23785,103.361458],[11.23727,103.361908],[11.23649,103.362137],[11.23424,103.362457],[11.23186,103.36274],[11.23022,103.363487],[11.22925,103.363747],[11.22569,103.364067],[11.22477,103.364693],[11.22408,103.365273],[11.22289,103.366341],[11.22187,103.367439],[11.22114,103.36763],[11.22042,103.367523],[11.22021,103.367577],[11.21984,103.367989],[11.21934,103.368477],[11.21889,103.368767],[11.21749,103.369614],[11.21565,103.371063],[11.21389,103.37262],[11.21215,103.37439],[11.21129,103.375877],[11.21071,103.37722],[11.21017,103.377876],[11.20754,103.379547],[11.20646,103.380302],[11.20535,103.381142],[11.20467,103.382057],[11.20402,103.383331],[11.20299,103.385292],[11.20158,103.387016],[11.20094,103.387779],[11.19945,103.388924],[11.19743,103.390358],[11.19607,103.390877],[11.19556,103.390968],[11.19516,103.391029],[11.19458,103.391098],[11.19393,103.390984],[11.19326,103.390533],[11.19254,103.390106],[11.19202,103.389648],[11.19145,103.388702],[11.19104,103.388496],[11.19063,103.388634],[11.19037,103.389236],[11.19007,103.389633],[11.18963,103.389832],[11.1892,103.389771],[11.18897,103.389664],[11.18855,103.389473],[11.18803,103.389282],[11.1875,103.389397],[11.18686,103.390068],[11.18626,103.390823],[11.18613,103.391403],[11.18627,103.391899],[11.18647,103.392479],[11.18649,103.392998],[11.1864,103.393242],[11.18608,103.393578],[11.18541,103.393738],[11.1844,103.393951],[11.184,103.394127],[11.18359,103.394417],[11.18341,103.394943],[11.18338,103.395569],[11.18366,103.396118],[11.18396,103.396408],[11.18422,103.396881],[11.18416,103.397163],[11.18315,103.398163],[11.18271,103.399933],[11.18287,103.401947],[11.18255,103.403778],[11.18269,103.404312],[11.18305,103.404793],[11.18307,103.405411],[11.18288,103.407066],[11.183,103.407387],[11.18321,103.407898],[11.18416,103.408882],[11.18428,103.409531],[11.18365,103.410843],[11.18349,103.411758],[11.18326,103.414078],[11.18286,103.416344],[11.18285,103.420883],[11.18364,103.424301],[11.1816,103.43045],[11.18061,103.4356],[11.17133,103.445473],[11.17097,103.446518],[11.17128,103.447769],[11.17192,103.449387],[11.17298,103.450996],[11.17648,103.454811],[11.18074,103.458771],[11.18119,103.459801],[11.18182,103.464951],[11.18233,103.465736],[11.18585,103.468758],[11.18979,103.471992],[11.19473,103.474182],[11.19598,103.474953],[11.19772,103.476303],[11.19857,103.476929],[11.19942,103.477669],[11.20113,103.478958],[11.20304,103.480507],[11.20471,103.481773],[11.20656,103.483238],[11.20854,103.484772],[11.20998,103.486183],[11.21027,103.486923],[11.21045,103.487823],[11.21039,103.489372],[11.21008,103.49366],[11.20821,103.51046],[11.20727,103.51165],[11.20585,103.513023],[11.20319,103.515953],[11.20203,103.519188],[11.20101,103.522598],[11.19859,103.532829],[11.19582,103.539001],[11.19552,103.544373],[11.19414,103.549026],[11.19365,103.553429],[11.19193,103.557022],[11.19208,103.559959],[11.19363,103.562714],[11.19476,103.56871],[11.19292,103.574707],[11.19234,103.575996],[11.19049,103.579964],[11.19004,103.581207],[11.18869,103.585373],[11.18686,103.587471],[11.18619,103.589417],[11.18608,103.590813],[11.18591,103.594711],[11.18573,103.595322],[11.1852,103.595947],[11.1827,103.597633],[11.18065,103.598991],[11.1801,103.5998],[11.17972,103.600929],[11.17936,103.602127],[11.17823,103.604088],[11.1776,103.605919],[11.17711,103.607857],[11.17699,103.608253],[11.17684,103.608704],[11.17675,103.609093],[11.17663,103.609612],[11.176,103.611229],[11.17401,103.615463],[11.17314,103.619499],[11.17309,103.620338],[11.17312,103.621239],[11.17308,103.624657],[11.1727,103.631561],[11.17279,103.632179],[11.17314,103.632736],[11.17592,103.635521],[11.17691,103.636276],[11.17731,103.636833],[11.17748,103.637352],[11.1775,103.638008],[11.17767,103.639717],[11.17787,103.640297],[11.17843,103.640999],[11.17895,103.641747],[11.17928,103.642517],[11.17927,103.643646],[11.17883,103.645798],[11.17867,103.646828],[11.17881,103.648117],[11.17961,103.651459],[11.17982,103.652237],[11.18029,103.653122],[11.18186,103.654266],[11.1829,103.655678],[11.1831,103.657021],[11.18229,103.659958],[11.18197,103.661087],[11.18152,103.662033],[11.17997,103.663933],[11.17963,103.66465],[11.17872,103.666634],[11.17818,103.667557],[11.1777,103.668221],[11.17682,103.668671],[11.17575,103.669441],[11.17496,103.670227],[11.17445,103.671227],[11.17418,103.671707],[11.1741,103.673157],[11.17405,103.674454],[11.17397,103.67588],[11.17366,103.676682],[11.17308,103.677841],[11.17065,103.682823],[11.17009,103.686668],[11.16957,103.690979],[11.16915,103.692131],[11.16804,103.693398],[11.16752,103.694008],[11.16648,103.695183],[11.16421,103.697701],[11.15985,103.702187],[11.15614,103.711243],[11.15262,103.720367],[11.15229,103.72171],[11.15202,103.723969],[11.1517,103.726891],[11.15096,103.732788],[11.15073,103.733566],[11.15039,103.734428],[11.14969,103.735809],[11.1481,103.738739],[11.14768,103.74202],[11.14836,103.743347],[11.14942,103.744827],[11.15026,103.745934],[11.15069,103.74662],[11.15106,103.747192],[11.15114,103.747833],[11.15095,103.748703],[11.14987,103.750328],[11.14856,103.752373],[11.14835,103.753464],[11.14851,103.754333],[11.14922,103.756638],[11.14941,103.757294],[11.14952,103.757881],[11.14919,103.758911],[11.14651,103.76133],[11.1442,103.763733],[11.14196,103.766197],[11.13964,103.768623],[11.13886,103.769012],[11.1381,103.76931],[11.13718,103.769592],[11.13477,103.770317],[11.13238,103.771004],[11.13146,103.771141],[11.13038,103.771156],[11.12787,103.771088],[11.12668,103.77153],[11.12241,103.773743],[11.12171,103.773857],[11.12084,103.773911],[11.12001,103.773933],[11.11721,103.773972],[11.10998,103.775299],[11.10607,103.774773],[11.1045,103.775162],[11.10346,103.775337],[11.10286,103.775177],[11.1018,103.774887],[11.09952,103.775078],[11.09706,103.775284],[11.09649,103.775337],[11.09577,103.775627],[11.09525,103.776192],[11.0947,103.777184],[11.09453,103.779541],[11.09447,103.781898],[11.09466,103.783058],[11.09488,103.784233],[11.09502,103.78524],[11.09505,103.785767],[11.09496,103.786369],[11.09466,103.787041],[11.09433,103.787537],[11.09375,103.788277],[11.09328,103.789017],[11.09195,103.791183],[11.09117,103.792397],[11.09022,103.79364],[11.08845,103.796211],[11.08748,103.798477],[11.08641,103.7995],[11.08534,103.79982],[11.08406,103.799927],[11.08297,103.799973],[11.08174,103.799881],[11.07517,103.796448],[11.07028,103.795197],[11.06735,103.795021],[11.06615,103.794579],[11.06494,103.794243],[11.0645,103.794113],[11.06399,103.794029],[11.0629,103.793983],[11.06133,103.793953],[11.06056,103.793938],[11.06005,103.793953],[11.05928,103.794083],[11.05789,103.794296],[11.05707,103.794327],[11.05632,103.793892],[11.0545,103.79258],[11.05322,103.792236],[11.05209,103.792221],[11.05152,103.792267],[11.05095,103.79245],[11.04974,103.793556],[11.04763,103.795731],[11.04724,103.796448],[11.04712,103.797119],[11.04707,103.797707],[11.04714,103.798843],[11.04714,103.800903],[11.04725,103.802391],[11.04753,103.803543],[11.05113,103.81208],[11.05209,103.814003],[11.05402,103.816803],[11.05514,103.818604],[11.05573,103.820747],[11.05638,103.82383],[11.057,103.825287],[11.05763,103.826073],[11.06003,103.828537],[11.06042,103.83004],[11.06021,103.83284],[11.06045,103.833878],[11.06309,103.839684],[11.06362,103.840446],[11.07223,103.848389],[11.07265,103.849403],[11.07273,103.850739],[11.07205,103.852127],[11.07038,103.854652],[11.07001,103.856651],[11.07053,103.858231],[11.0738,103.861671],[11.07438,103.863029],[11.07604,103.867943],[11.08074,103.876663],[11.08276,103.883034],[11.08504,103.887573],[11.08747,103.891853],[11.09351,103.902863],[11.09626,103.907677],[11.09797,103.910271],[11.09986,103.912628],[11.10172,103.914497],[11.11719,103.928207],[11.12314,103.933548],[11.12609,103.937073],[11.12849,103.940979],[11.13351,103.950737],[11.13833,103.960007],[11.14351,103.970093],[11.14877,103.980263],[11.15045,103.983887],[11.15166,103.987389],[11.15335,103.990837],[11.15434,103.992569],[11.16036,104.000847],[11.1649,104.007309],[11.16648,104.00956],[11.17444,104.020821],[11.17617,104.023148],[11.17744,104.024361],[11.1804,104.026291],[11.18675,104.032623],[11.18853,104.034492],[11.18943,104.035606],[11.1903,104.037193],[11.19067,104.038139],[11.19143,104.040947],[11.19232,104.044868],[11.19301,104.049026],[11.19386,104.055923],[11.19406,104.057426],[11.19365,104.060654],[11.19418,104.071198],[11.19437,104.073151],[11.19465,104.074532],[11.19516,104.07576],[11.20094,104.086983],[11.20212,104.08889],[11.20234,104.089523],[11.20257,104.090561],[11.20284,104.091293],[11.20358,104.092796],[11.20381,104.093384],[11.20417,104.094589],[11.20428,104.095154],[11.20439,104.09597],[11.20459,104.096642],[11.20479,104.097198],[11.20496,104.097893],[11.20516,104.099487],[11.20535,104.100258],[11.20553,104.100502],[11.20604,104.10096],[11.20737,104.101891],[11.20792,104.102623],[11.20809,104.103104],[11.20937,104.108627],[11.21023,104.112587],[11.2122,104.117897],[11.21319,104.120369],[11.21763,104.127892],[11.22001,104.131653],[11.22482,104.137657],[11.2308,104.146797],[11.24009,104.161209],[11.24535,104.16938],[11.25656,104.18306],[11.26132,104.188797],[11.26612,104.195312],[11.26954,104.199753],[11.27281,104.205101],[11.27728,104.212517],[11.27887,104.215157],[11.28602,104.227188],[11.29414,104.241119],[11.30092,104.252647],[11.30841,104.265282],[11.31258,104.272278],[11.31552,104.278542],[11.31805,104.282516],[11.32065,104.286133],[11.32409,104.291763],[11.32748,104.297836],[11.33257,104.305969],[11.34071,104.319382],[11.34404,104.324768],[11.34898,104.329353],[11.35067,104.331482],[11.35595,104.340073],[11.35931,104.34671],[11.36522,104.355904],[11.36764,104.358238],[11.37237,104.362923],[11.37664,104.368263],[11.37729,104.369011],[11.38512,104.374298],[11.39029,104.38002],[11.39617,104.38681],[11.3989,104.392479],[11.4047,104.399544],[11.40971,104.409241],[11.41611,104.424797],[11.41866,104.42984],[11.42282,104.446877],[11.4267,104.457939],[11.43018,104.46505],[11.43874,104.476578],[11.44111,104.480171],[11.44412,104.485619],[11.44534,104.487007],[11.44653,104.488136],[11.4482,104.48912],[11.45309,104.491272],[11.45469,104.492531],[11.45604,104.495033],[11.4585,104.504662],[11.45999,104.51059],[11.46157,104.517471],[11.4626,104.521729],[11.46297,104.522919],[11.46348,104.523781],[11.46505,104.525787],[11.46582,104.527733],[11.46739,104.531898],[11.47216,104.544884],[11.47508,104.553177],[11.47558,104.566727],[11.47516,104.57859],[11.47593,104.584923],[11.47684,104.58889],[11.47796,104.591553],[11.4827,104.61026],[11.48373,104.615677],[11.48535,104.624268],[11.48672,104.630508],[11.48914,104.63916],[11.4909,104.647552],[11.49224,104.652893],[11.49312,104.657547],[11.49447,104.66188],[11.49498,104.663223],[11.49638,104.66687],[11.49774,104.670662],[11.49856,104.672638],[11.49964,104.676613],[11.50056,104.679749],[11.50305,104.686951],[11.50356,104.694168],[11.50428,104.699677],[11.50513,104.704674],[11.50695,104.712051],[11.50716,104.715637],[11.5071,104.724953],[11.50695,104.728851],[11.50735,104.733101],[11.50765,104.734657],[11.5088,104.738792],[11.51005,104.744072],[11.51144,104.750343],[11.51393,104.763412],[11.51486,104.767693],[11.51789,104.77317],[11.51962,104.776314],[11.52081,104.778954],[11.52391,104.790916],[11.52485,104.794319],[11.52508,104.794853],[11.52576,104.796127],[11.526,104.796539],[11.5275,104.799171],[11.52917,104.80204],[11.5295,104.802589],[11.52975,104.803032],[11.53017,104.803993],[11.53039,104.804741],[11.53051,104.805389],[11.53062,104.805977],[11.53119,104.809479],[11.53182,104.813492],[11.53254,104.81739],[11.53259,104.817734],[11.53285,104.819397],[11.53309,104.820824],[11.5333,104.822166],[11.53381,104.825127],[11.53402,104.826477],[11.53435,104.828453],[11.53438,104.828537],[11.53437,104.828773],[11.53431,104.829033],[11.5342,104.829201],[11.53414,104.829323],[11.53413,104.829643],[11.53463,104.830093],[11.53414,104.830704],[11.53351,104.831467],[11.53081,104.834793],[11.52835,104.837891],[11.52877,104.841797],[11.52904,104.844307],[11.52908,104.844551],[11.53072,104.855827],[11.53079,104.856331],[11.53114,104.858963],[11.53308,104.873177],[11.53473,104.885193],[11.53474,104.885353],[11.53458,104.885536],[11.53447,104.885757],[11.53425,104.885963],[11.53221,104.886429],[11.53208,104.886452],[11.52989,104.886871],[11.52962,104.886932],[11.52785,104.887291],[11.52576,104.887718],[11.52572,104.888298],[11.52556,104.889893],[11.52537,104.890633],[11.52427,104.894363],[11.52349,104.897171],[11.5231,104.898407],[11.52284,104.899269],[11.52256,104.9002],[11.52215,104.901703],[11.52156,104.903717],[11.52088,104.906128],[11.52042,104.907951],[11.5193,104.913322],[11.51897,104.915192],[11.51894,104.915604],[11.51896,104.916061],[11.51903,104.916496],[11.51917,104.916962],[11.51975,104.91864],[11.51983,104.918854],[11.52025,104.919617],[11.5207,104.920212],[11.52108,104.920509],[11.52147,104.920723],[11.52208,104.920898],[11.52358,104.920998],[11.52505,104.921097],[11.52677,104.921227],[11.527,104.92186],[11.52883,104.926086],[11.52992,104.928574],[11.5299,104.92897],[11.53005,104.929619],[11.5302,104.930206],[11.53026,104.930496],[11.53027,104.930717],[11.53014,104.930946],[11.5296,104.931168],[11.52902,104.931396],[11.52877,104.931587],[11.52823,104.931801],[11.52758,104.931999],[11.52638,104.932114],[11.5239,104.93235],[11.51604,104.935379],[11.51338,104.935677],[11.51252,104.935997],[11.50867,104.937866],[11.50674,104.938766],[11.50388,104.939621],[11.50249,104.940048],[11.49697,104.942436],[11.49289,104.94355],[11.49186,104.94355],[11.49092,104.943123],[11.48942,104.942436],[11.48809,104.941818],[11.48757,104.94165],[11.48726,104.941727],[11.48513,104.942841],[11.48492,104.942963],[11.48385,104.943527],[11.48288,104.944061],[11.48157,104.944771],[11.48138,104.944633],[11.48112,104.944733],[11.48108,104.945053],[11.47857,104.946381],[11.47776,104.946823],[11.47264,104.949509],[11.47149,104.950127],[11.46992,104.950981],[11.46587,104.953209],[11.46406,104.954208],[11.46098,104.955994],[11.46003,104.956543],[11.45616,104.958847],[11.45244,104.961067],[11.45039,104.962288],[11.44289,104.966873],[11.44102,104.968018],[11.43993,104.968681],[11.43116,104.973999],[11.42561,104.977943],[11.4193,104.985237],[11.40634,104.999748],[11.40146,105.004936],[11.40073,105.005623],[11.39999,105.005829],[11.39922,105.005791],[11.39655,105.005074],[11.39496,105.004761],[11.3919,105.00444],[11.38985,105.004044],[11.38363,105.001984],[11.37883,105.001343],[11.37475,105.001892],[11.37105,105.003014],[11.36419,105.000473],[11.35815,105.001381],[11.35153,105.004639],[11.34709,105.007607],[11.34363,105.010948],[11.34161,105.013443],[11.33983,105.016502],[11.33843,105.019676],[11.33641,105.022873],[11.33367,105.025948],[11.32995,105.028282]]; \ No newline at end of file diff --git a/debug/vector/touchzoomemu.html b/debug/vector/touchzoomemu.html deleted file mode 100644 index 5030f81118b..00000000000 --- a/debug/vector/touchzoomemu.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - -
            -
            Hack1Touch
            -
            Hack2Touch
            -
            Hack3Touch
            -
            Hack4Touch
            -
            Print Buffer
            - - - - diff --git a/debug/vector/us-states.js b/debug/vector/us-states.js deleted file mode 100644 index 7f6af2fb34b..00000000000 --- a/debug/vector/us-states.js +++ /dev/null @@ -1,54 +0,0 @@ -var statesData = {"type":"FeatureCollection","features":[ -{"type":"Feature","id":"01","properties":{"name":"Alabama","density":94.65},"geometry":{"type":"Polygon","coordinates":[[[-87.359296,35.00118],[-85.606675,34.984749],[-85.431413,34.124869],[-85.184951,32.859696],[-85.069935,32.580372],[-84.960397,32.421541],[-85.004212,32.322956],[-84.889196,32.262709],[-85.058981,32.13674],[-85.053504,32.01077],[-85.141136,31.840985],[-85.042551,31.539753],[-85.113751,31.27686],[-85.004212,31.003013],[-85.497137,30.997536],[-87.600282,30.997536],[-87.633143,30.86609],[-87.408589,30.674397],[-87.446927,30.510088],[-87.37025,30.427934],[-87.518128,30.280057],[-87.655051,30.247195],[-87.90699,30.411504],[-87.934375,30.657966],[-88.011052,30.685351],[-88.10416,30.499135],[-88.137022,30.318396],[-88.394438,30.367688],[-88.471115,31.895754],[-88.241084,33.796253],[-88.098683,34.891641],[-88.202745,34.995703],[-87.359296,35.00118]]]}}, -{"type":"Feature","id":"02","properties":{"name":"Alaska","density":1.264},"geometry":{"type":"MultiPolygon","coordinates":[[[[-131.602021,55.117982],[-131.569159,55.28229],[-131.355558,55.183705],[-131.38842,55.01392],[-131.645836,55.035827],[-131.602021,55.117982]]],[[[-131.832052,55.42469],[-131.645836,55.304197],[-131.749898,55.128935],[-131.832052,55.189182],[-131.832052,55.42469]]],[[[-132.976733,56.437924],[-132.735747,56.459832],[-132.631685,56.421493],[-132.664547,56.273616],[-132.878148,56.240754],[-133.069841,56.333862],[-132.976733,56.437924]]],[[[-133.595627,56.350293],[-133.162949,56.317431],[-133.05341,56.125739],[-132.620732,55.912138],[-132.472854,55.780691],[-132.4619,55.671152],[-132.357838,55.649245],[-132.341408,55.506844],[-132.166146,55.364444],[-132.144238,55.238474],[-132.029222,55.276813],[-131.97993,55.178228],[-131.958022,54.789365],[-132.029222,54.701734],[-132.308546,54.718165],[-132.385223,54.915335],[-132.483808,54.898904],[-132.686455,55.046781],[-132.746701,54.997489],[-132.916486,55.046781],[-132.889102,54.898904],[-132.73027,54.937242],[-132.626209,54.882473],[-132.675501,54.679826],[-132.867194,54.701734],[-133.157472,54.95915],[-133.239626,55.090597],[-133.223195,55.22752],[-133.453227,55.216566],[-133.453227,55.320628],[-133.277964,55.331582],[-133.102702,55.42469],[-133.17938,55.588998],[-133.387503,55.62186],[-133.420365,55.884753],[-133.497042,56.0162],[-133.639442,55.923092],[-133.694212,56.070969],[-133.546335,56.142169],[-133.666827,56.311955],[-133.595627,56.350293]]],[[[-133.738027,55.556137],[-133.546335,55.490413],[-133.414888,55.572568],[-133.283441,55.534229],[-133.420365,55.386352],[-133.633966,55.430167],[-133.738027,55.556137]]],[[[-133.907813,56.930849],[-134.050213,57.029434],[-133.885905,57.095157],[-133.343688,57.002049],[-133.102702,57.007526],[-132.932917,56.82131],[-132.620732,56.667956],[-132.653593,56.55294],[-132.817901,56.492694],[-133.042456,56.520078],[-133.201287,56.448878],[-133.420365,56.492694],[-133.66135,56.448878],[-133.710643,56.684386],[-133.688735,56.837741],[-133.869474,56.843218],[-133.907813,56.930849]]],[[[-134.115936,56.48174],[-134.25286,56.558417],[-134.400737,56.722725],[-134.417168,56.848695],[-134.296675,56.908941],[-134.170706,56.848695],[-134.143321,56.952757],[-133.748981,56.772017],[-133.710643,56.596755],[-133.847566,56.574848],[-133.935197,56.377678],[-133.836612,56.322908],[-133.957105,56.092877],[-134.110459,56.142169],[-134.132367,55.999769],[-134.230952,56.070969],[-134.291198,56.350293],[-134.115936,56.48174]]],[[[-134.636246,56.28457],[-134.669107,56.169554],[-134.806031,56.235277],[-135.178463,56.67891],[-135.413971,56.810356],[-135.331817,56.914418],[-135.424925,57.166357],[-135.687818,57.369004],[-135.419448,57.566174],[-135.298955,57.48402],[-135.063447,57.418296],[-134.849846,57.407343],[-134.844369,57.248511],[-134.636246,56.728202],[-134.636246,56.28457]]],[[[-134.712923,58.223407],[-134.373353,58.14673],[-134.176183,58.157683],[-134.187137,58.081006],[-133.902336,57.807159],[-134.099505,57.850975],[-134.148798,57.757867],[-133.935197,57.615466],[-133.869474,57.363527],[-134.083075,57.297804],[-134.154275,57.210173],[-134.499322,57.029434],[-134.603384,57.034911],[-134.6472,57.226604],[-134.575999,57.341619],[-134.608861,57.511404],[-134.729354,57.719528],[-134.707446,57.829067],[-134.784123,58.097437],[-134.91557,58.212453],[-134.953908,58.409623],[-134.712923,58.223407]]],[[[-135.857603,57.330665],[-135.715203,57.330665],[-135.567326,57.149926],[-135.633049,57.023957],[-135.857603,56.996572],[-135.824742,57.193742],[-135.857603,57.330665]]],[[[-136.279328,58.206976],[-135.978096,58.201499],[-135.780926,58.28913],[-135.496125,58.168637],[-135.64948,58.037191],[-135.59471,57.987898],[-135.45231,58.135776],[-135.107263,58.086483],[-134.91557,57.976944],[-135.025108,57.779775],[-134.937477,57.763344],[-134.822462,57.500451],[-135.085355,57.462112],[-135.572802,57.675713],[-135.556372,57.456635],[-135.709726,57.369004],[-135.890465,57.407343],[-136.000004,57.544266],[-136.208128,57.637374],[-136.366959,57.829067],[-136.569606,57.916698],[-136.558652,58.075529],[-136.421728,58.130299],[-136.377913,58.267222],[-136.279328,58.206976]]],[[[-147.079854,60.200582],[-147.501579,59.948643],[-147.53444,59.850058],[-147.874011,59.784335],[-147.80281,59.937689],[-147.435855,60.09652],[-147.205824,60.271782],[-147.079854,60.200582]]],[[[-147.561825,60.578491],[-147.616594,60.370367],[-147.758995,60.156767],[-147.956165,60.227967],[-147.791856,60.474429],[-147.561825,60.578491]]],[[[-147.786379,70.245291],[-147.682318,70.201475],[-147.162008,70.15766],[-146.888161,70.185044],[-146.510252,70.185044],[-146.099482,70.146706],[-145.858496,70.168614],[-145.622988,70.08646],[-145.195787,69.993352],[-144.620708,69.971444],[-144.461877,70.026213],[-144.078491,70.059075],[-143.914183,70.130275],[-143.497935,70.141229],[-143.503412,70.091936],[-143.25695,70.119321],[-142.747594,70.042644],[-142.402547,69.916674],[-142.079408,69.856428],[-142.008207,69.801659],[-141.712453,69.790705],[-141.433129,69.697597],[-141.378359,69.63735],[-141.208574,69.686643],[-141.00045,69.648304],[-141.00045,60.304644],[-140.53491,60.22249],[-140.474664,60.310121],[-139.987216,60.184151],[-139.696939,60.342983],[-139.088998,60.359413],[-139.198537,60.091043],[-139.045183,59.997935],[-138.700135,59.910304],[-138.623458,59.767904],[-137.604747,59.242118],[-137.445916,58.908024],[-137.265177,59.001132],[-136.827022,59.159963],[-136.580559,59.16544],[-136.465544,59.285933],[-136.476498,59.466672],[-136.301236,59.466672],[-136.25742,59.625503],[-135.945234,59.663842],[-135.479694,59.800766],[-135.025108,59.565257],[-135.068924,59.422857],[-134.959385,59.280456],[-134.701969,59.247595],[-134.378829,59.033994],[-134.400737,58.973748],[-134.25286,58.858732],[-133.842089,58.727285],[-133.173903,58.152206],[-133.075318,57.998852],[-132.867194,57.845498],[-132.560485,57.505928],[-132.253777,57.21565],[-132.368792,57.095157],[-132.05113,57.051341],[-132.127807,56.876079],[-131.870391,56.804879],[-131.837529,56.602232],[-131.580113,56.613186],[-131.087188,56.405062],[-130.78048,56.366724],[-130.621648,56.268139],[-130.468294,56.240754],[-130.424478,56.142169],[-130.101339,56.114785],[-130.002754,55.994292],[-130.150631,55.769737],[-130.128724,55.583521],[-129.986323,55.276813],[-130.095862,55.200136],[-130.336847,54.920812],[-130.687372,54.718165],[-130.785957,54.822227],[-130.917403,54.789365],[-131.010511,54.997489],[-130.983126,55.08512],[-131.092665,55.189182],[-130.862634,55.298721],[-130.928357,55.337059],[-131.158389,55.200136],[-131.284358,55.287767],[-131.426759,55.238474],[-131.843006,55.457552],[-131.700606,55.698537],[-131.963499,55.616383],[-131.974453,55.49589],[-132.182576,55.588998],[-132.226392,55.704014],[-132.083991,55.829984],[-132.127807,55.955953],[-132.324977,55.851892],[-132.522147,56.076446],[-132.642639,56.032631],[-132.719317,56.218847],[-132.527624,56.339339],[-132.341408,56.339339],[-132.396177,56.487217],[-132.297592,56.67891],[-132.450946,56.673433],[-132.768609,56.837741],[-132.993164,57.034911],[-133.51895,57.177311],[-133.507996,57.577128],[-133.677781,57.62642],[-133.639442,57.790728],[-133.814705,57.834544],[-134.072121,58.053622],[-134.143321,58.168637],[-134.586953,58.206976],[-135.074401,58.502731],[-135.282525,59.192825],[-135.38111,59.033994],[-135.337294,58.891593],[-135.140124,58.617746],[-135.189417,58.573931],[-135.05797,58.349376],[-135.085355,58.201499],[-135.277048,58.234361],[-135.430402,58.398669],[-135.633049,58.426053],[-135.91785,58.382238],[-135.912373,58.617746],[-136.087635,58.814916],[-136.246466,58.75467],[-136.876314,58.962794],[-136.931084,58.902547],[-136.586036,58.836824],[-136.317666,58.672516],[-136.213604,58.667039],[-136.180743,58.535592],[-136.043819,58.382238],[-136.388867,58.294607],[-136.591513,58.349376],[-136.59699,58.212453],[-136.859883,58.316515],[-136.947514,58.393192],[-137.111823,58.393192],[-137.566409,58.590362],[-137.900502,58.765624],[-137.933364,58.869686],[-138.11958,59.02304],[-138.634412,59.132579],[-138.919213,59.247595],[-139.417615,59.379041],[-139.746231,59.505011],[-139.718846,59.641934],[-139.625738,59.598119],[-139.5162,59.68575],[-139.625738,59.88292],[-139.488815,59.992458],[-139.554538,60.041751],[-139.801,59.833627],[-140.315833,59.696704],[-140.92925,59.745996],[-141.444083,59.871966],[-141.46599,59.970551],[-141.706976,59.948643],[-141.964392,60.019843],[-142.539471,60.085566],[-142.873564,60.091043],[-143.623905,60.036274],[-143.892275,59.997935],[-144.231845,60.140336],[-144.65357,60.206059],[-144.785016,60.29369],[-144.834309,60.441568],[-145.124586,60.430614],[-145.223171,60.299167],[-145.738004,60.474429],[-145.820158,60.551106],[-146.351421,60.408706],[-146.608837,60.238921],[-146.718376,60.397752],[-146.608837,60.485383],[-146.455483,60.463475],[-145.951604,60.578491],[-146.017328,60.666122],[-146.252836,60.622307],[-146.345944,60.737322],[-146.565022,60.753753],[-146.784099,61.044031],[-146.866253,60.972831],[-147.172962,60.934492],[-147.271547,60.972831],[-147.375609,60.879723],[-147.758995,60.912584],[-147.775426,60.808523],[-148.032842,60.781138],[-148.153334,60.819476],[-148.065703,61.005692],[-148.175242,61.000215],[-148.350504,60.803046],[-148.109519,60.737322],[-148.087611,60.594922],[-147.939734,60.441568],[-148.027365,60.277259],[-148.219058,60.332029],[-148.273827,60.249875],[-148.087611,60.217013],[-147.983549,59.997935],[-148.251919,59.95412],[-148.399797,59.997935],[-148.635305,59.937689],[-148.755798,59.986981],[-149.067984,59.981505],[-149.05703,60.063659],[-149.204907,60.008889],[-149.287061,59.904827],[-149.418508,59.997935],[-149.582816,59.866489],[-149.511616,59.806242],[-149.741647,59.729565],[-149.949771,59.718611],[-150.031925,59.61455],[-150.25648,59.521442],[-150.409834,59.554303],[-150.579619,59.444764],[-150.716543,59.450241],[-151.001343,59.225687],[-151.308052,59.209256],[-151.406637,59.280456],[-151.592853,59.159963],[-151.976239,59.253071],[-151.888608,59.422857],[-151.636669,59.483103],[-151.47236,59.472149],[-151.423068,59.537872],[-151.127313,59.669319],[-151.116359,59.778858],[-151.505222,59.63098],[-151.828361,59.718611],[-151.8667,59.778858],[-151.702392,60.030797],[-151.423068,60.211536],[-151.379252,60.359413],[-151.297098,60.386798],[-151.264237,60.545629],[-151.406637,60.720892],[-151.06159,60.786615],[-150.404357,61.038554],[-150.245526,60.939969],[-150.042879,60.912584],[-149.741647,61.016646],[-150.075741,61.15357],[-150.207187,61.257632],[-150.47008,61.246678],[-150.656296,61.29597],[-150.711066,61.252155],[-151.023251,61.180954],[-151.165652,61.044031],[-151.477837,61.011169],[-151.800977,60.852338],[-151.833838,60.748276],[-152.080301,60.693507],[-152.13507,60.578491],[-152.310332,60.507291],[-152.392486,60.304644],[-152.732057,60.173197],[-152.567748,60.069136],[-152.704672,59.915781],[-153.022334,59.888397],[-153.049719,59.691227],[-153.345474,59.620026],[-153.438582,59.702181],[-153.586459,59.548826],[-153.761721,59.543349],[-153.72886,59.433811],[-154.117723,59.368087],[-154.1944,59.066856],[-153.750768,59.050425],[-153.400243,58.968271],[-153.301658,58.869686],[-153.444059,58.710854],[-153.679567,58.612269],[-153.898645,58.606793],[-153.920553,58.519161],[-154.062953,58.4863],[-153.99723,58.376761],[-154.145107,58.212453],[-154.46277,58.059098],[-154.643509,58.059098],[-154.818771,58.004329],[-154.988556,58.015283],[-155.120003,57.955037],[-155.081664,57.872883],[-155.328126,57.829067],[-155.377419,57.708574],[-155.547204,57.785251],[-155.73342,57.549743],[-156.045606,57.566174],[-156.023698,57.440204],[-156.209914,57.473066],[-156.34136,57.418296],[-156.34136,57.248511],[-156.549484,56.985618],[-156.883577,56.952757],[-157.157424,56.832264],[-157.20124,56.766541],[-157.376502,56.859649],[-157.672257,56.607709],[-157.754411,56.67891],[-157.918719,56.657002],[-157.957058,56.514601],[-158.126843,56.459832],[-158.32949,56.48174],[-158.488321,56.339339],[-158.208997,56.295524],[-158.510229,55.977861],[-159.375585,55.873799],[-159.616571,55.594475],[-159.676817,55.654722],[-159.643955,55.829984],[-159.813741,55.857368],[-160.027341,55.791645],[-160.060203,55.720445],[-160.394296,55.605429],[-160.536697,55.473983],[-160.580512,55.567091],[-160.668143,55.457552],[-160.865313,55.528752],[-161.232268,55.358967],[-161.506115,55.364444],[-161.467776,55.49589],[-161.588269,55.62186],[-161.697808,55.517798],[-161.686854,55.408259],[-162.053809,55.074166],[-162.179779,55.15632],[-162.218117,55.03035],[-162.470057,55.052258],[-162.508395,55.249428],[-162.661749,55.293244],[-162.716519,55.222043],[-162.579595,55.134412],[-162.645319,54.997489],[-162.847965,54.926289],[-163.00132,55.079643],[-163.187536,55.090597],[-163.220397,55.03035],[-163.034181,54.942719],[-163.373752,54.800319],[-163.14372,54.76198],[-163.138243,54.696257],[-163.329936,54.74555],[-163.587352,54.614103],[-164.085754,54.61958],[-164.332216,54.531949],[-164.354124,54.466226],[-164.638925,54.389548],[-164.847049,54.416933],[-164.918249,54.603149],[-164.710125,54.663395],[-164.551294,54.88795],[-164.34317,54.893427],[-163.894061,55.041304],[-163.532583,55.046781],[-163.39566,54.904381],[-163.291598,55.008443],[-163.313505,55.128935],[-163.105382,55.183705],[-162.880827,55.183705],[-162.579595,55.446598],[-162.245502,55.682106],[-161.807347,55.89023],[-161.292514,55.983338],[-161.078914,55.939523],[-160.87079,55.999769],[-160.816021,55.912138],[-160.931036,55.813553],[-160.805067,55.736876],[-160.766728,55.857368],[-160.509312,55.868322],[-160.438112,55.791645],[-160.27928,55.76426],[-160.273803,55.857368],[-160.536697,55.939523],[-160.558604,55.994292],[-160.383342,56.251708],[-160.147834,56.399586],[-159.830171,56.541986],[-159.326293,56.667956],[-158.959338,56.848695],[-158.784076,56.782971],[-158.641675,56.810356],[-158.701922,56.925372],[-158.658106,57.034911],[-158.378782,57.264942],[-157.995396,57.41282],[-157.688688,57.609989],[-157.705118,57.719528],[-157.458656,58.497254],[-157.07527,58.705377],[-157.119086,58.869686],[-158.039212,58.634177],[-158.32949,58.661562],[-158.40069,58.760147],[-158.564998,58.803962],[-158.619768,58.913501],[-158.767645,58.864209],[-158.860753,58.694424],[-158.701922,58.480823],[-158.893615,58.387715],[-159.0634,58.420577],[-159.392016,58.760147],[-159.616571,58.929932],[-159.731586,58.929932],[-159.808264,58.803962],[-159.906848,58.782055],[-160.054726,58.886116],[-160.235465,58.902547],[-160.317619,59.072332],[-160.854359,58.88064],[-161.33633,58.743716],[-161.374669,58.667039],[-161.752577,58.552023],[-161.938793,58.656085],[-161.769008,58.776578],[-161.829255,59.061379],[-161.955224,59.36261],[-161.703285,59.48858],[-161.911409,59.740519],[-162.092148,59.88292],[-162.234548,60.091043],[-162.448149,60.178674],[-162.502918,59.997935],[-162.760334,59.959597],[-163.171105,59.844581],[-163.66403,59.795289],[-163.9324,59.806242],[-164.162431,59.866489],[-164.189816,60.02532],[-164.386986,60.074613],[-164.699171,60.29369],[-164.962064,60.337506],[-165.268773,60.578491],[-165.060649,60.68803],[-165.016834,60.890677],[-165.175665,60.846861],[-165.197573,60.972831],[-165.120896,61.076893],[-165.323543,61.170001],[-165.34545,61.071416],[-165.591913,61.109754],[-165.624774,61.279539],[-165.816467,61.301447],[-165.920529,61.416463],[-165.915052,61.558863],[-166.106745,61.49314],[-166.139607,61.630064],[-165.904098,61.662925],[-166.095791,61.81628],[-165.756221,61.827233],[-165.756221,62.013449],[-165.674067,62.139419],[-165.044219,62.539236],[-164.912772,62.659728],[-164.819664,62.637821],[-164.874433,62.807606],[-164.633448,63.097884],[-164.425324,63.212899],[-164.036462,63.262192],[-163.73523,63.212899],[-163.313505,63.037637],[-163.039658,63.059545],[-162.661749,63.22933],[-162.272887,63.486746],[-162.075717,63.514131],[-162.026424,63.448408],[-161.555408,63.448408],[-161.13916,63.503177],[-160.766728,63.771547],[-160.766728,63.837271],[-160.952944,64.08921],[-160.974852,64.237087],[-161.26513,64.395918],[-161.374669,64.532842],[-161.078914,64.494503],[-160.79959,64.609519],[-160.783159,64.719058],[-161.144637,64.921705],[-161.413007,64.762873],[-161.664946,64.790258],[-161.900455,64.702627],[-162.168825,64.680719],[-162.234548,64.620473],[-162.541257,64.532842],[-162.634365,64.384965],[-162.787719,64.324718],[-162.858919,64.49998],[-163.045135,64.538319],[-163.176582,64.401395],[-163.253259,64.467119],[-163.598306,64.565704],[-164.304832,64.560227],[-164.80871,64.450688],[-165.000403,64.434257],[-165.411174,64.49998],[-166.188899,64.576658],[-166.391546,64.636904],[-166.484654,64.735489],[-166.413454,64.872412],[-166.692778,64.987428],[-166.638008,65.113398],[-166.462746,65.179121],[-166.517516,65.337952],[-166.796839,65.337952],[-167.026871,65.381768],[-167.47598,65.414629],[-167.711489,65.496784],[-168.072967,65.578938],[-168.105828,65.682999],[-167.541703,65.819923],[-166.829701,66.049954],[-166.3313,66.186878],[-166.046499,66.110201],[-165.756221,66.09377],[-165.690498,66.203309],[-165.86576,66.21974],[-165.88219,66.312848],[-165.186619,66.466202],[-164.403417,66.581218],[-163.981692,66.592172],[-163.751661,66.553833],[-163.872153,66.389525],[-163.828338,66.274509],[-163.915969,66.192355],[-163.768091,66.060908],[-163.494244,66.082816],[-163.149197,66.060908],[-162.749381,66.088293],[-162.634365,66.039001],[-162.371472,66.028047],[-162.14144,66.077339],[-161.840208,66.02257],[-161.549931,66.241647],[-161.341807,66.252601],[-161.199406,66.208786],[-161.128206,66.334755],[-161.528023,66.395002],[-161.911409,66.345709],[-161.87307,66.510017],[-162.174302,66.68528],[-162.502918,66.740049],[-162.601503,66.89888],[-162.344087,66.937219],[-162.015471,66.778388],[-162.075717,66.652418],[-161.916886,66.553833],[-161.571838,66.438817],[-161.489684,66.55931],[-161.884024,66.718141],[-161.714239,67.002942],[-161.851162,67.052235],[-162.240025,66.991988],[-162.639842,67.008419],[-162.700088,67.057712],[-162.902735,67.008419],[-163.740707,67.128912],[-163.757138,67.254881],[-164.009077,67.534205],[-164.211724,67.638267],[-164.534863,67.725898],[-165.192096,67.966884],[-165.493328,68.059992],[-165.794559,68.081899],[-166.243668,68.246208],[-166.681824,68.339316],[-166.703731,68.372177],[-166.375115,68.42147],[-166.227238,68.574824],[-166.216284,68.881533],[-165.329019,68.859625],[-164.255539,68.930825],[-163.976215,68.985595],[-163.532583,69.138949],[-163.110859,69.374457],[-163.023228,69.609966],[-162.842489,69.812613],[-162.470057,69.982398],[-162.311225,70.108367],[-161.851162,70.311014],[-161.779962,70.256245],[-161.396576,70.239814],[-160.837928,70.343876],[-160.487404,70.453415],[-159.649432,70.792985],[-159.33177,70.809416],[-159.298908,70.760123],[-158.975769,70.798462],[-158.658106,70.787508],[-158.033735,70.831323],[-157.420318,70.979201],[-156.812377,71.285909],[-156.565915,71.351633],[-156.522099,71.296863],[-155.585543,71.170894],[-155.508865,71.083263],[-155.832005,70.968247],[-155.979882,70.96277],[-155.974405,70.809416],[-155.503388,70.858708],[-155.476004,70.940862],[-155.262403,71.017539],[-155.191203,70.973724],[-155.032372,71.148986],[-154.566832,70.990155],[-154.643509,70.869662],[-154.353231,70.8368],[-154.183446,70.7656],[-153.931507,70.880616],[-153.487874,70.886093],[-153.235935,70.924431],[-152.589656,70.886093],[-152.26104,70.842277],[-152.419871,70.606769],[-151.817408,70.546523],[-151.773592,70.486276],[-151.187559,70.382214],[-151.182082,70.431507],[-150.760358,70.49723],[-150.355064,70.491753],[-150.349588,70.436984],[-150.114079,70.431507],[-149.867617,70.508184],[-149.462323,70.519138],[-149.177522,70.486276],[-148.78866,70.404122],[-148.607921,70.420553],[-148.350504,70.305537],[-148.202627,70.349353],[-147.961642,70.316491],[-147.786379,70.245291]]],[[[-152.94018,58.026237],[-152.945657,57.982421],[-153.290705,58.048145],[-153.044242,58.305561],[-152.819688,58.327469],[-152.666333,58.562977],[-152.496548,58.354853],[-152.354148,58.426053],[-152.080301,58.311038],[-152.080301,58.152206],[-152.480117,58.130299],[-152.655379,58.059098],[-152.94018,58.026237]]],[[[-153.958891,57.538789],[-153.67409,57.670236],[-153.931507,57.69762],[-153.936983,57.812636],[-153.723383,57.889313],[-153.570028,57.834544],[-153.548121,57.719528],[-153.46049,57.796205],[-153.455013,57.96599],[-153.268797,57.889313],[-153.235935,57.998852],[-153.071627,57.933129],[-152.874457,57.933129],[-152.721103,57.993375],[-152.469163,57.889313],[-152.469163,57.599035],[-152.151501,57.620943],[-152.359625,57.42925],[-152.74301,57.505928],[-152.60061,57.379958],[-152.710149,57.275896],[-152.907319,57.325188],[-152.912796,57.128019],[-153.214027,57.073249],[-153.312612,56.991095],[-153.498828,57.067772],[-153.695998,56.859649],[-153.849352,56.837741],[-154.013661,56.744633],[-154.073907,56.969187],[-154.303938,56.848695],[-154.314892,56.919895],[-154.523016,56.991095],[-154.539447,57.193742],[-154.742094,57.275896],[-154.627078,57.511404],[-154.227261,57.659282],[-153.980799,57.648328],[-153.958891,57.538789]]],[[[-154.53397,56.602232],[-154.742094,56.399586],[-154.807817,56.432447],[-154.53397,56.602232]]],[[[-155.634835,55.923092],[-155.476004,55.912138],[-155.530773,55.704014],[-155.793666,55.731399],[-155.837482,55.802599],[-155.634835,55.923092]]],[[[-159.890418,55.28229],[-159.950664,55.068689],[-160.257373,54.893427],[-160.109495,55.161797],[-160.005433,55.134412],[-159.890418,55.28229]]],[[[-160.520266,55.358967],[-160.33405,55.358967],[-160.339527,55.249428],[-160.525743,55.128935],[-160.690051,55.211089],[-160.794113,55.134412],[-160.854359,55.320628],[-160.79959,55.380875],[-160.520266,55.358967]]],[[[-162.256456,54.981058],[-162.234548,54.893427],[-162.349564,54.838658],[-162.437195,54.931766],[-162.256456,54.981058]]],[[[-162.415287,63.634624],[-162.563165,63.536039],[-162.612457,63.62367],[-162.415287,63.634624]]],[[[-162.80415,54.488133],[-162.590549,54.449795],[-162.612457,54.367641],[-162.782242,54.373118],[-162.80415,54.488133]]],[[[-165.548097,54.29644],[-165.476897,54.181425],[-165.630251,54.132132],[-165.685021,54.252625],[-165.548097,54.29644]]],[[[-165.73979,54.15404],[-166.046499,54.044501],[-166.112222,54.121178],[-165.980775,54.219763],[-165.73979,54.15404]]],[[[-166.364161,60.359413],[-166.13413,60.397752],[-166.084837,60.326552],[-165.88219,60.342983],[-165.685021,60.277259],[-165.646682,59.992458],[-165.750744,59.89935],[-166.00816,59.844581],[-166.062929,59.745996],[-166.440838,59.855535],[-166.6161,59.850058],[-166.994009,59.992458],[-167.125456,59.992458],[-167.344534,60.074613],[-167.421211,60.206059],[-167.311672,60.238921],[-166.93924,60.206059],[-166.763978,60.310121],[-166.577762,60.321075],[-166.495608,60.392275],[-166.364161,60.359413]]],[[[-166.375115,54.01164],[-166.210807,53.934962],[-166.5449,53.748746],[-166.539423,53.715885],[-166.117699,53.852808],[-166.112222,53.776131],[-166.282007,53.683023],[-166.555854,53.622777],[-166.583239,53.529669],[-166.878994,53.431084],[-167.13641,53.425607],[-167.306195,53.332499],[-167.623857,53.250345],[-167.793643,53.337976],[-167.459549,53.442038],[-167.355487,53.425607],[-167.103548,53.513238],[-167.163794,53.611823],[-167.021394,53.715885],[-166.807793,53.666592],[-166.785886,53.732316],[-167.015917,53.754223],[-167.141887,53.825424],[-167.032348,53.945916],[-166.643485,54.017116],[-166.561331,53.880193],[-166.375115,54.01164]]],[[[-168.790446,53.157237],[-168.40706,53.34893],[-168.385152,53.431084],[-168.237275,53.524192],[-168.007243,53.568007],[-167.886751,53.518715],[-167.842935,53.387268],[-168.270136,53.244868],[-168.500168,53.036744],[-168.686384,52.965544],[-168.790446,53.157237]]],[[[-169.74891,52.894344],[-169.705095,52.795759],[-169.962511,52.790282],[-169.989896,52.856005],[-169.74891,52.894344]]],[[[-170.148727,57.221127],[-170.28565,57.128019],[-170.313035,57.221127],[-170.148727,57.221127]]],[[[-170.669036,52.697174],[-170.603313,52.604066],[-170.789529,52.538343],[-170.816914,52.636928],[-170.669036,52.697174]]],[[[-171.742517,63.716778],[-170.94836,63.5689],[-170.488297,63.69487],[-170.280174,63.683916],[-170.093958,63.612716],[-170.044665,63.492223],[-169.644848,63.4265],[-169.518879,63.366254],[-168.99857,63.338869],[-168.686384,63.295053],[-168.856169,63.147176],[-169.108108,63.180038],[-169.376478,63.152653],[-169.513402,63.08693],[-169.639372,62.939052],[-169.831064,63.075976],[-170.055619,63.169084],[-170.263743,63.180038],[-170.362328,63.2841],[-170.866206,63.415546],[-171.101715,63.421023],[-171.463193,63.306007],[-171.73704,63.366254],[-171.852055,63.486746],[-171.742517,63.716778]]],[[[-172.432611,52.390465],[-172.41618,52.275449],[-172.607873,52.253542],[-172.569535,52.352127],[-172.432611,52.390465]]],[[[-173.626584,52.14948],[-173.495138,52.105664],[-173.122706,52.111141],[-173.106275,52.07828],[-173.549907,52.028987],[-173.626584,52.14948]]],[[[-174.322156,52.280926],[-174.327632,52.379511],[-174.185232,52.41785],[-173.982585,52.319265],[-174.059262,52.226157],[-174.179755,52.231634],[-174.141417,52.127572],[-174.333109,52.116618],[-174.738403,52.007079],[-174.968435,52.039941],[-174.902711,52.116618],[-174.656249,52.105664],[-174.322156,52.280926]]],[[[-176.469116,51.853725],[-176.288377,51.870156],[-176.288377,51.744186],[-176.518409,51.760617],[-176.80321,51.61274],[-176.912748,51.80991],[-176.792256,51.815386],[-176.775825,51.963264],[-176.627947,51.968741],[-176.627947,51.859202],[-176.469116,51.853725]]],[[[-177.153734,51.946833],[-177.044195,51.897541],[-177.120872,51.727755],[-177.274226,51.678463],[-177.279703,51.782525],[-177.153734,51.946833]]],[[[-178.123152,51.919448],[-177.953367,51.913971],[-177.800013,51.793479],[-177.964321,51.651078],[-178.123152,51.919448]]],[[[-187.107557,52.992929],[-187.293773,52.927205],[-187.304726,52.823143],[-188.90491,52.762897],[-188.642017,52.927205],[-188.642017,53.003883],[-187.107557,52.992929]]]]}}, -{"type":"Feature","id":"04","properties":{"name":"Arizona","density":57.05},"geometry":{"type":"Polygon","coordinates":[[[-109.042503,37.000263],[-109.04798,31.331629],[-111.074448,31.331629],[-112.246513,31.704061],[-114.815198,32.492741],[-114.72209,32.717295],[-114.524921,32.755634],[-114.470151,32.843265],[-114.524921,33.029481],[-114.661844,33.034958],[-114.727567,33.40739],[-114.524921,33.54979],[-114.497536,33.697668],[-114.535874,33.933176],[-114.415382,34.108438],[-114.256551,34.174162],[-114.136058,34.305608],[-114.333228,34.448009],[-114.470151,34.710902],[-114.634459,34.87521],[-114.634459,35.00118],[-114.574213,35.138103],[-114.596121,35.324319],[-114.678275,35.516012],[-114.738521,36.102045],[-114.371566,36.140383],[-114.251074,36.01989],[-114.152489,36.025367],[-114.048427,36.195153],[-114.048427,37.000263],[-110.499369,37.00574],[-109.042503,37.000263]]]}}, -{"type":"Feature","id":"05","properties":{"name":"Arkansas","density":56.43},"geometry":{"type":"Polygon","coordinates":[[[-94.473842,36.501861],[-90.152536,36.496384],[-90.064905,36.304691],[-90.218259,36.184199],[-90.377091,35.997983],[-89.730812,35.997983],[-89.763673,35.811767],[-89.911551,35.756997],[-89.944412,35.603643],[-90.130628,35.439335],[-90.114197,35.198349],[-90.212782,35.023087],[-90.311367,34.995703],[-90.251121,34.908072],[-90.409952,34.831394],[-90.481152,34.661609],[-90.585214,34.617794],[-90.568783,34.420624],[-90.749522,34.365854],[-90.744046,34.300131],[-90.952169,34.135823],[-90.891923,34.026284],[-91.072662,33.867453],[-91.231493,33.560744],[-91.056231,33.429298],[-91.143862,33.347144],[-91.089093,33.13902],[-91.16577,33.002096],[-93.608485,33.018527],[-94.041164,33.018527],[-94.041164,33.54979],[-94.183564,33.593606],[-94.380734,33.544313],[-94.484796,33.637421],[-94.430026,35.395519],[-94.616242,36.501861],[-94.473842,36.501861]]]}}, -{"type":"Feature","id":"06","properties":{"name":"California","density":241.7},"geometry":{"type":"Polygon","coordinates":[[[-123.233256,42.006186],[-122.378853,42.011663],[-121.037003,41.995232],[-120.001861,41.995232],[-119.996384,40.264519],[-120.001861,38.999346],[-118.71478,38.101128],[-117.498899,37.21934],[-116.540435,36.501861],[-115.85034,35.970598],[-114.634459,35.00118],[-114.634459,34.87521],[-114.470151,34.710902],[-114.333228,34.448009],[-114.136058,34.305608],[-114.256551,34.174162],[-114.415382,34.108438],[-114.535874,33.933176],[-114.497536,33.697668],[-114.524921,33.54979],[-114.727567,33.40739],[-114.661844,33.034958],[-114.524921,33.029481],[-114.470151,32.843265],[-114.524921,32.755634],[-114.72209,32.717295],[-116.04751,32.624187],[-117.126467,32.536556],[-117.24696,32.668003],[-117.252437,32.876127],[-117.329114,33.122589],[-117.471515,33.297851],[-117.7837,33.538836],[-118.183517,33.763391],[-118.260194,33.703145],[-118.413548,33.741483],[-118.391641,33.840068],[-118.566903,34.042715],[-118.802411,33.998899],[-119.218659,34.146777],[-119.278905,34.26727],[-119.558229,34.415147],[-119.875891,34.40967],[-120.138784,34.475393],[-120.472878,34.448009],[-120.64814,34.579455],[-120.609801,34.858779],[-120.670048,34.902595],[-120.631709,35.099764],[-120.894602,35.247642],[-120.905556,35.450289],[-121.004141,35.461243],[-121.168449,35.636505],[-121.283465,35.674843],[-121.332757,35.784382],[-121.716143,36.195153],[-121.896882,36.315645],[-121.935221,36.638785],[-121.858544,36.6114],[-121.787344,36.803093],[-121.929744,36.978355],[-122.105006,36.956447],[-122.335038,37.115279],[-122.417192,37.241248],[-122.400761,37.361741],[-122.515777,37.520572],[-122.515777,37.783465],[-122.329561,37.783465],[-122.406238,38.15042],[-122.488392,38.112082],[-122.504823,37.931343],[-122.701993,37.893004],[-122.937501,38.029928],[-122.97584,38.265436],[-123.129194,38.451652],[-123.331841,38.566668],[-123.44138,38.698114],[-123.737134,38.95553],[-123.687842,39.032208],[-123.824765,39.366301],[-123.764519,39.552517],[-123.85215,39.831841],[-124.109566,40.105688],[-124.361506,40.259042],[-124.410798,40.439781],[-124.158859,40.877937],[-124.109566,41.025814],[-124.158859,41.14083],[-124.065751,41.442061],[-124.147905,41.715908],[-124.257444,41.781632],[-124.213628,42.000709],[-123.233256,42.006186]]]}}, -{"type":"Feature","id":"08","properties":{"name":"Colorado","density":49.33},"geometry":{"type":"Polygon","coordinates":[[[-107.919731,41.003906],[-105.728954,40.998429],[-104.053011,41.003906],[-102.053927,41.003906],[-102.053927,40.001626],[-102.042974,36.994786],[-103.001438,37.000263],[-104.337812,36.994786],[-106.868158,36.994786],[-107.421329,37.000263],[-109.042503,37.000263],[-109.042503,38.166851],[-109.058934,38.27639],[-109.053457,39.125316],[-109.04798,40.998429],[-107.919731,41.003906]]]}}, -{"type":"Feature","id":"09","properties":{"name":"Connecticut","density":739.1},"geometry":{"type":"Polygon","coordinates":[[[-73.053528,42.039048],[-71.799309,42.022617],[-71.799309,42.006186],[-71.799309,41.414677],[-71.859555,41.321569],[-71.947186,41.338],[-72.385341,41.261322],[-72.905651,41.28323],[-73.130205,41.146307],[-73.371191,41.102491],[-73.655992,40.987475],[-73.727192,41.102491],[-73.48073,41.21203],[-73.55193,41.294184],[-73.486206,42.050002],[-73.053528,42.039048]]]}}, -{"type":"Feature","id":"10","properties":{"name":"Delaware","density":464.3},"geometry":{"type":"Polygon","coordinates":[[[-75.414089,39.804456],[-75.507197,39.683964],[-75.611259,39.61824],[-75.589352,39.459409],[-75.441474,39.311532],[-75.403136,39.065069],[-75.189535,38.807653],[-75.09095,38.796699],[-75.047134,38.451652],[-75.693413,38.462606],[-75.786521,39.722302],[-75.616736,39.831841],[-75.414089,39.804456]]]}}, -{"type":"Feature","id":"11","properties":{"name":"District of Columbia","density":10065},"geometry":{"type":"Polygon","coordinates":[[[-77.035264,38.993869],[-76.909294,38.895284],[-77.040741,38.791222],[-77.117418,38.933623],[-77.035264,38.993869]]]}}, -{"type":"Feature","id":"12","properties":{"name":"Florida","density":353.4},"geometry":{"type":"Polygon","coordinates":[[[-85.497137,30.997536],[-85.004212,31.003013],[-84.867289,30.712735],[-83.498053,30.647012],[-82.216449,30.570335],[-82.167157,30.356734],[-82.046664,30.362211],[-82.002849,30.564858],[-82.041187,30.751074],[-81.948079,30.827751],[-81.718048,30.745597],[-81.444201,30.707258],[-81.383954,30.27458],[-81.257985,29.787132],[-80.967707,29.14633],[-80.524075,28.461713],[-80.589798,28.41242],[-80.56789,28.094758],[-80.381674,27.738757],[-80.091397,27.021277],[-80.03115,26.796723],[-80.036627,26.566691],[-80.146166,25.739673],[-80.239274,25.723243],[-80.337859,25.465826],[-80.304997,25.383672],[-80.49669,25.197456],[-80.573367,25.241272],[-80.759583,25.164595],[-81.077246,25.120779],[-81.170354,25.224841],[-81.126538,25.378195],[-81.351093,25.821827],[-81.526355,25.903982],[-81.679709,25.843735],[-81.800202,26.090198],[-81.833064,26.292844],[-82.041187,26.517399],[-82.09048,26.665276],[-82.057618,26.878877],[-82.172634,26.917216],[-82.145249,26.791246],[-82.249311,26.758384],[-82.566974,27.300601],[-82.692943,27.437525],[-82.391711,27.837342],[-82.588881,27.815434],[-82.720328,27.689464],[-82.851774,27.886634],[-82.676512,28.434328],[-82.643651,28.888914],[-82.764143,28.998453],[-82.802482,29.14633],[-82.994175,29.179192],[-83.218729,29.420177],[-83.399469,29.518762],[-83.410422,29.66664],[-83.536392,29.721409],[-83.640454,29.885717],[-84.02384,30.104795],[-84.357933,30.055502],[-84.341502,29.902148],[-84.451041,29.929533],[-84.867289,29.743317],[-85.310921,29.699501],[-85.299967,29.80904],[-85.404029,29.940487],[-85.924338,30.236241],[-86.29677,30.362211],[-86.630863,30.395073],[-86.910187,30.373165],[-87.518128,30.280057],[-87.37025,30.427934],[-87.446927,30.510088],[-87.408589,30.674397],[-87.633143,30.86609],[-87.600282,30.997536],[-85.497137,30.997536]]]}}, -{"type":"Feature","id":"13","properties":{"name":"Georgia","density":169.5},"geometry":{"type":"Polygon","coordinates":[[[-83.109191,35.00118],[-83.322791,34.787579],[-83.339222,34.683517],[-83.005129,34.469916],[-82.901067,34.486347],[-82.747713,34.26727],[-82.714851,34.152254],[-82.55602,33.94413],[-82.325988,33.81816],[-82.194542,33.631944],[-81.926172,33.462159],[-81.937125,33.347144],[-81.761863,33.160928],[-81.493493,33.007573],[-81.42777,32.843265],[-81.416816,32.629664],[-81.279893,32.558464],[-81.121061,32.290094],[-81.115584,32.120309],[-80.885553,32.032678],[-81.132015,31.693108],[-81.175831,31.517845],[-81.279893,31.364491],[-81.290846,31.20566],[-81.400385,31.13446],[-81.444201,30.707258],[-81.718048,30.745597],[-81.948079,30.827751],[-82.041187,30.751074],[-82.002849,30.564858],[-82.046664,30.362211],[-82.167157,30.356734],[-82.216449,30.570335],[-83.498053,30.647012],[-84.867289,30.712735],[-85.004212,31.003013],[-85.113751,31.27686],[-85.042551,31.539753],[-85.141136,31.840985],[-85.053504,32.01077],[-85.058981,32.13674],[-84.889196,32.262709],[-85.004212,32.322956],[-84.960397,32.421541],[-85.069935,32.580372],[-85.184951,32.859696],[-85.431413,34.124869],[-85.606675,34.984749],[-84.319594,34.990226],[-83.618546,34.984749],[-83.109191,35.00118]]]}}, -{"type":"Feature","id":"15","properties":{"name":"Hawaii","density":214.1},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.634835,18.948267],[-155.881297,19.035898],[-155.919636,19.123529],[-155.886774,19.348084],[-156.062036,19.73147],[-155.925113,19.857439],[-155.826528,20.032702],[-155.897728,20.147717],[-155.87582,20.26821],[-155.596496,20.12581],[-155.284311,20.021748],[-155.092618,19.868393],[-155.092618,19.736947],[-154.807817,19.523346],[-154.983079,19.348084],[-155.295265,19.26593],[-155.514342,19.134483],[-155.634835,18.948267]]],[[[-156.587823,21.029505],[-156.472807,20.892581],[-156.324929,20.952827],[-156.00179,20.793996],[-156.051082,20.651596],[-156.379699,20.580396],[-156.445422,20.60778],[-156.461853,20.783042],[-156.631638,20.821381],[-156.697361,20.919966],[-156.587823,21.029505]]],[[[-156.982162,21.210244],[-157.080747,21.106182],[-157.310779,21.106182],[-157.239579,21.221198],[-156.982162,21.210244]]],[[[-157.951581,21.697691],[-157.842042,21.462183],[-157.896811,21.325259],[-158.110412,21.303352],[-158.252813,21.582676],[-158.126843,21.588153],[-157.951581,21.697691]]],[[[-159.468693,22.228955],[-159.353678,22.218001],[-159.298908,22.113939],[-159.33177,21.966061],[-159.446786,21.872953],[-159.764448,21.987969],[-159.726109,22.152277],[-159.468693,22.228955]]]]}}, -{"type":"Feature","id":"16","properties":{"name":"Idaho","density":19.15},"geometry":{"type":"Polygon","coordinates":[[[-116.04751,49.000239],[-116.04751,47.976051],[-115.724371,47.696727],[-115.718894,47.42288],[-115.527201,47.302388],[-115.324554,47.258572],[-115.302646,47.187372],[-114.930214,46.919002],[-114.886399,46.809463],[-114.623506,46.705401],[-114.612552,46.639678],[-114.322274,46.645155],[-114.464674,46.272723],[-114.492059,46.037214],[-114.387997,45.88386],[-114.568736,45.774321],[-114.497536,45.670259],[-114.546828,45.560721],[-114.333228,45.456659],[-114.086765,45.593582],[-113.98818,45.703121],[-113.807441,45.604536],[-113.834826,45.522382],[-113.736241,45.330689],[-113.571933,45.128042],[-113.45144,45.056842],[-113.456917,44.865149],[-113.341901,44.782995],[-113.133778,44.772041],[-113.002331,44.448902],[-112.887315,44.394132],[-112.783254,44.48724],[-112.471068,44.481763],[-112.241036,44.569394],[-112.104113,44.520102],[-111.868605,44.563917],[-111.819312,44.509148],[-111.616665,44.547487],[-111.386634,44.75561],[-111.227803,44.580348],[-111.047063,44.476286],[-111.047063,42.000709],[-112.164359,41.995232],[-114.04295,41.995232],[-117.027882,42.000709],[-117.027882,43.830007],[-116.896436,44.158624],[-116.97859,44.240778],[-117.170283,44.257209],[-117.241483,44.394132],[-117.038836,44.750133],[-116.934774,44.782995],[-116.830713,44.930872],[-116.847143,45.02398],[-116.732128,45.144473],[-116.671881,45.319735],[-116.463758,45.61549],[-116.545912,45.752413],[-116.78142,45.823614],[-116.918344,45.993399],[-116.92382,46.168661],[-117.055267,46.343923],[-117.038836,46.426077],[-117.044313,47.762451],[-117.033359,49.000239],[-116.04751,49.000239]]]}}, -{"type":"Feature","id":"17","properties":{"name":"Illinois","density":231.5},"geometry":{"type":"Polygon","coordinates":[[[-90.639984,42.510065],[-88.788778,42.493634],[-87.802929,42.493634],[-87.83579,42.301941],[-87.682436,42.077386],[-87.523605,41.710431],[-87.529082,39.34987],[-87.63862,39.169131],[-87.512651,38.95553],[-87.49622,38.780268],[-87.62219,38.637868],[-87.655051,38.506421],[-87.83579,38.292821],[-87.950806,38.27639],[-87.923421,38.15042],[-88.000098,38.101128],[-88.060345,37.865619],[-88.027483,37.799896],[-88.15893,37.657496],[-88.065822,37.482234],[-88.476592,37.389126],[-88.514931,37.285064],[-88.421823,37.153617],[-88.547792,37.071463],[-88.914747,37.224817],[-89.029763,37.213863],[-89.183118,37.038601],[-89.133825,36.983832],[-89.292656,36.994786],[-89.517211,37.279587],[-89.435057,37.34531],[-89.517211,37.537003],[-89.517211,37.690357],[-89.84035,37.903958],[-89.949889,37.88205],[-90.059428,38.013497],[-90.355183,38.216144],[-90.349706,38.374975],[-90.179921,38.632391],[-90.207305,38.725499],[-90.10872,38.845992],[-90.251121,38.917192],[-90.470199,38.961007],[-90.585214,38.867899],[-90.661891,38.928146],[-90.727615,39.256762],[-91.061708,39.470363],[-91.368417,39.727779],[-91.494386,40.034488],[-91.50534,40.237135],[-91.417709,40.379535],[-91.401278,40.560274],[-91.121954,40.669813],[-91.09457,40.823167],[-90.963123,40.921752],[-90.946692,41.097014],[-91.111001,41.239415],[-91.045277,41.414677],[-90.656414,41.463969],[-90.344229,41.589939],[-90.311367,41.743293],[-90.179921,41.809016],[-90.141582,42.000709],[-90.168967,42.126679],[-90.393521,42.225264],[-90.420906,42.329326],[-90.639984,42.510065]]]}}, -{"type":"Feature","id":"18","properties":{"name":"Indiana","density":181.7},"geometry":{"type":"Polygon","coordinates":[[[-85.990061,41.759724],[-84.807042,41.759724],[-84.807042,41.694001],[-84.801565,40.500028],[-84.817996,39.103408],[-84.894673,39.059592],[-84.812519,38.785745],[-84.987781,38.780268],[-85.173997,38.68716],[-85.431413,38.730976],[-85.42046,38.533806],[-85.590245,38.451652],[-85.655968,38.325682],[-85.83123,38.27639],[-85.924338,38.024451],[-86.039354,37.958727],[-86.263908,38.051835],[-86.302247,38.166851],[-86.521325,38.040881],[-86.504894,37.931343],[-86.729448,37.893004],[-86.795172,37.991589],[-87.047111,37.893004],[-87.129265,37.788942],[-87.381204,37.93682],[-87.512651,37.903958],[-87.600282,37.975158],[-87.682436,37.903958],[-87.934375,37.893004],[-88.027483,37.799896],[-88.060345,37.865619],[-88.000098,38.101128],[-87.923421,38.15042],[-87.950806,38.27639],[-87.83579,38.292821],[-87.655051,38.506421],[-87.62219,38.637868],[-87.49622,38.780268],[-87.512651,38.95553],[-87.63862,39.169131],[-87.529082,39.34987],[-87.523605,41.710431],[-87.42502,41.644708],[-87.118311,41.644708],[-86.822556,41.759724],[-85.990061,41.759724]]]}}, -{"type":"Feature","id":"19","properties":{"name":"Iowa","density":54.81},"geometry":{"type":"Polygon","coordinates":[[[-91.368417,43.501391],[-91.215062,43.501391],[-91.204109,43.353514],[-91.056231,43.254929],[-91.176724,43.134436],[-91.143862,42.909881],[-91.067185,42.75105],[-90.711184,42.636034],[-90.639984,42.510065],[-90.420906,42.329326],[-90.393521,42.225264],[-90.168967,42.126679],[-90.141582,42.000709],[-90.179921,41.809016],[-90.311367,41.743293],[-90.344229,41.589939],[-90.656414,41.463969],[-91.045277,41.414677],[-91.111001,41.239415],[-90.946692,41.097014],[-90.963123,40.921752],[-91.09457,40.823167],[-91.121954,40.669813],[-91.401278,40.560274],[-91.417709,40.379535],[-91.527248,40.412397],[-91.729895,40.615043],[-91.833957,40.609566],[-93.257961,40.582182],[-94.632673,40.571228],[-95.7664,40.587659],[-95.881416,40.719105],[-95.826646,40.976521],[-95.925231,41.201076],[-95.919754,41.453015],[-96.095016,41.540646],[-96.122401,41.67757],[-96.062155,41.798063],[-96.127878,41.973325],[-96.264801,42.039048],[-96.44554,42.488157],[-96.631756,42.707235],[-96.544125,42.855112],[-96.511264,43.052282],[-96.434587,43.123482],[-96.560556,43.222067],[-96.527695,43.397329],[-96.582464,43.479483],[-96.451017,43.501391],[-91.368417,43.501391]]]}}, -{"type":"Feature","id":"20","properties":{"name":"Kansas","density":35.09},"geometry":{"type":"Polygon","coordinates":[[[-101.90605,40.001626],[-95.306337,40.001626],[-95.207752,39.908518],[-94.884612,39.831841],[-95.109167,39.541563],[-94.983197,39.442978],[-94.824366,39.20747],[-94.610765,39.158177],[-94.616242,37.000263],[-100.087706,37.000263],[-102.042974,36.994786],[-102.053927,40.001626],[-101.90605,40.001626]]]}}, -{"type":"Feature","id":"21","properties":{"name":"Kentucky","density":110},"geometry":{"type":"Polygon","coordinates":[[[-83.903347,38.769315],[-83.678792,38.632391],[-83.519961,38.703591],[-83.142052,38.626914],[-83.032514,38.725499],[-82.890113,38.758361],[-82.846298,38.588575],[-82.731282,38.561191],[-82.594358,38.424267],[-82.621743,38.123036],[-82.50125,37.931343],[-82.342419,37.783465],[-82.293127,37.668449],[-82.101434,37.553434],[-81.969987,37.537003],[-82.353373,37.268633],[-82.720328,37.120755],[-82.720328,37.044078],[-82.868205,36.978355],[-82.879159,36.890724],[-83.070852,36.852385],[-83.136575,36.742847],[-83.673316,36.600446],[-83.689746,36.584015],[-84.544149,36.594969],[-85.289013,36.627831],[-85.486183,36.616877],[-86.592525,36.655216],[-87.852221,36.633308],[-88.071299,36.677123],[-88.054868,36.496384],[-89.298133,36.507338],[-89.418626,36.496384],[-89.363857,36.622354],[-89.215979,36.578538],[-89.133825,36.983832],[-89.183118,37.038601],[-89.029763,37.213863],[-88.914747,37.224817],[-88.547792,37.071463],[-88.421823,37.153617],[-88.514931,37.285064],[-88.476592,37.389126],[-88.065822,37.482234],[-88.15893,37.657496],[-88.027483,37.799896],[-87.934375,37.893004],[-87.682436,37.903958],[-87.600282,37.975158],[-87.512651,37.903958],[-87.381204,37.93682],[-87.129265,37.788942],[-87.047111,37.893004],[-86.795172,37.991589],[-86.729448,37.893004],[-86.504894,37.931343],[-86.521325,38.040881],[-86.302247,38.166851],[-86.263908,38.051835],[-86.039354,37.958727],[-85.924338,38.024451],[-85.83123,38.27639],[-85.655968,38.325682],[-85.590245,38.451652],[-85.42046,38.533806],[-85.431413,38.730976],[-85.173997,38.68716],[-84.987781,38.780268],[-84.812519,38.785745],[-84.894673,39.059592],[-84.817996,39.103408],[-84.43461,39.103408],[-84.231963,38.895284],[-84.215533,38.807653],[-83.903347,38.769315]]]}}, -{"type":"Feature","id":"22","properties":{"name":"Louisiana","density":105},"geometry":{"type":"Polygon","coordinates":[[[-93.608485,33.018527],[-91.16577,33.002096],[-91.072662,32.887081],[-91.143862,32.843265],[-91.154816,32.640618],[-91.006939,32.514649],[-90.985031,32.218894],[-91.105524,31.988862],[-91.341032,31.846462],[-91.401278,31.621907],[-91.499863,31.643815],[-91.516294,31.27686],[-91.636787,31.265906],[-91.565587,31.068736],[-91.636787,30.997536],[-89.747242,30.997536],[-89.845827,30.66892],[-89.681519,30.449842],[-89.643181,30.285534],[-89.522688,30.181472],[-89.818443,30.044549],[-89.84035,29.945964],[-89.599365,29.88024],[-89.495303,30.039072],[-89.287179,29.88024],[-89.30361,29.754271],[-89.424103,29.699501],[-89.648657,29.748794],[-89.621273,29.655686],[-89.69795,29.513285],[-89.506257,29.387316],[-89.199548,29.348977],[-89.09001,29.2011],[-89.002379,29.179192],[-89.16121,29.009407],[-89.336472,29.042268],[-89.484349,29.217531],[-89.851304,29.310638],[-89.851304,29.480424],[-90.032043,29.425654],[-90.021089,29.283254],[-90.103244,29.151807],[-90.23469,29.129899],[-90.333275,29.277777],[-90.563307,29.283254],[-90.645461,29.129899],[-90.798815,29.086084],[-90.963123,29.179192],[-91.09457,29.190146],[-91.220539,29.436608],[-91.445094,29.546147],[-91.532725,29.529716],[-91.620356,29.73784],[-91.883249,29.710455],[-91.888726,29.836425],[-92.146142,29.715932],[-92.113281,29.622824],[-92.31045,29.535193],[-92.617159,29.579009],[-92.97316,29.715932],[-93.2251,29.776178],[-93.767317,29.726886],[-93.838517,29.688547],[-93.926148,29.787132],[-93.690639,30.143133],[-93.767317,30.334826],[-93.696116,30.438888],[-93.728978,30.575812],[-93.630393,30.679874],[-93.526331,30.93729],[-93.542762,31.15089],[-93.816609,31.556184],[-93.822086,31.775262],[-94.041164,31.994339],[-94.041164,33.018527],[-93.608485,33.018527]]]}}, -{"type":"Feature","id":"23","properties":{"name":"Maine","density":43.04},"geometry":{"type":"Polygon","coordinates":[[[-70.703921,43.057759],[-70.824413,43.128959],[-70.807983,43.227544],[-70.966814,43.34256],[-71.032537,44.657025],[-71.08183,45.303304],[-70.649151,45.440228],[-70.720352,45.511428],[-70.556043,45.664782],[-70.386258,45.735983],[-70.41912,45.796229],[-70.260289,45.889337],[-70.309581,46.064599],[-70.210996,46.327492],[-70.057642,46.415123],[-69.997395,46.694447],[-69.225147,47.461219],[-69.044408,47.428357],[-69.033454,47.242141],[-68.902007,47.176418],[-68.578868,47.285957],[-68.376221,47.285957],[-68.233821,47.357157],[-67.954497,47.198326],[-67.790188,47.066879],[-67.779235,45.944106],[-67.801142,45.675736],[-67.456095,45.604536],[-67.505388,45.48952],[-67.417757,45.379982],[-67.488957,45.281397],[-67.346556,45.128042],[-67.16034,45.160904],[-66.979601,44.804903],[-67.187725,44.646072],[-67.308218,44.706318],[-67.406803,44.596779],[-67.549203,44.624164],[-67.565634,44.531056],[-67.75185,44.54201],[-68.047605,44.328409],[-68.118805,44.476286],[-68.222867,44.48724],[-68.173574,44.328409],[-68.403606,44.251732],[-68.458375,44.377701],[-68.567914,44.311978],[-68.82533,44.311978],[-68.830807,44.459856],[-68.984161,44.426994],[-68.956777,44.322932],[-69.099177,44.103854],[-69.071793,44.043608],[-69.258008,43.923115],[-69.444224,43.966931],[-69.553763,43.840961],[-69.707118,43.82453],[-69.833087,43.720469],[-69.986442,43.742376],[-70.030257,43.851915],[-70.254812,43.676653],[-70.194565,43.567114],[-70.358873,43.528776],[-70.369827,43.435668],[-70.556043,43.320652],[-70.703921,43.057759]]]}}, -{"type":"Feature","id":"24","properties":{"name":"Maryland","density":596.3},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.994645,37.95325],[-76.016553,37.95325],[-76.043938,37.95325],[-75.994645,37.95325]]],[[[-79.477979,39.722302],[-75.786521,39.722302],[-75.693413,38.462606],[-75.047134,38.451652],[-75.244304,38.029928],[-75.397659,38.013497],[-75.671506,37.95325],[-75.885106,37.909435],[-75.879629,38.073743],[-75.961783,38.139466],[-75.846768,38.210667],[-76.000122,38.374975],[-76.049415,38.303775],[-76.257538,38.320205],[-76.328738,38.500944],[-76.263015,38.500944],[-76.257538,38.736453],[-76.191815,38.829561],[-76.279446,39.147223],[-76.169907,39.333439],[-76.000122,39.366301],[-75.972737,39.557994],[-76.098707,39.536086],[-76.104184,39.437501],[-76.367077,39.311532],[-76.443754,39.196516],[-76.460185,38.906238],[-76.55877,38.769315],[-76.514954,38.539283],[-76.383508,38.380452],[-76.399939,38.259959],[-76.317785,38.139466],[-76.3616,38.057312],[-76.591632,38.216144],[-76.920248,38.292821],[-77.018833,38.446175],[-77.205049,38.358544],[-77.276249,38.479037],[-77.128372,38.632391],[-77.040741,38.791222],[-76.909294,38.895284],[-77.035264,38.993869],[-77.117418,38.933623],[-77.248864,39.026731],[-77.456988,39.076023],[-77.456988,39.223901],[-77.566527,39.306055],[-77.719881,39.322485],[-77.834897,39.601809],[-78.004682,39.601809],[-78.174467,39.694917],[-78.267575,39.61824],[-78.431884,39.623717],[-78.470222,39.514178],[-78.765977,39.585379],[-78.963147,39.437501],[-79.094593,39.470363],[-79.291763,39.300578],[-79.488933,39.20747],[-79.477979,39.722302]]]]}}, -{"type":"Feature","id":"25","properties":{"name":"Massachusetts","density":840.2},"geometry":{"type":"Polygon","coordinates":[[[-70.917521,42.887974],[-70.818936,42.871543],[-70.780598,42.696281],[-70.824413,42.55388],[-70.983245,42.422434],[-70.988722,42.269079],[-70.769644,42.247172],[-70.638197,42.08834],[-70.660105,41.962371],[-70.550566,41.929509],[-70.539613,41.814493],[-70.260289,41.715908],[-69.937149,41.809016],[-70.008349,41.672093],[-70.484843,41.5516],[-70.660105,41.546123],[-70.764167,41.639231],[-70.928475,41.611847],[-70.933952,41.540646],[-71.120168,41.496831],[-71.196845,41.67757],[-71.22423,41.710431],[-71.328292,41.781632],[-71.383061,42.01714],[-71.530939,42.01714],[-71.799309,42.006186],[-71.799309,42.022617],[-73.053528,42.039048],[-73.486206,42.050002],[-73.508114,42.08834],[-73.267129,42.745573],[-72.456542,42.729142],[-71.29543,42.696281],[-71.185891,42.789389],[-70.917521,42.887974]]]}}, -{"type":"Feature","id":"26","properties":{"name":"Michigan","density":173.9},"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.454238,41.732339],[-84.807042,41.694001],[-84.807042,41.759724],[-85.990061,41.759724],[-86.822556,41.759724],[-86.619909,41.891171],[-86.482986,42.115725],[-86.357016,42.252649],[-86.263908,42.444341],[-86.209139,42.718189],[-86.231047,43.013943],[-86.526801,43.594499],[-86.433693,43.813577],[-86.499417,44.07647],[-86.269385,44.34484],[-86.220093,44.569394],[-86.252954,44.689887],[-86.088646,44.73918],[-86.066738,44.903488],[-85.809322,44.947303],[-85.612152,45.128042],[-85.628583,44.766564],[-85.524521,44.750133],[-85.393075,44.930872],[-85.387598,45.237581],[-85.305444,45.314258],[-85.031597,45.363551],[-85.119228,45.577151],[-84.938489,45.75789],[-84.713934,45.768844],[-84.461995,45.653829],[-84.215533,45.637398],[-84.09504,45.494997],[-83.908824,45.484043],[-83.596638,45.352597],[-83.4871,45.358074],[-83.317314,45.144473],[-83.454238,45.029457],[-83.322791,44.88158],[-83.273499,44.711795],[-83.333745,44.339363],[-83.536392,44.246255],[-83.585684,44.054562],[-83.82667,43.988839],[-83.958116,43.758807],[-83.908824,43.671176],[-83.667839,43.589022],[-83.481623,43.714992],[-83.262545,43.972408],[-82.917498,44.070993],[-82.747713,43.994316],[-82.643651,43.851915],[-82.539589,43.435668],[-82.523158,43.227544],[-82.413619,42.975605],[-82.517681,42.614127],[-82.681989,42.559357],[-82.687466,42.690804],[-82.797005,42.652465],[-82.922975,42.351234],[-83.125621,42.236218],[-83.185868,42.006186],[-83.437807,41.814493],[-83.454238,41.732339]]],[[[-85.508091,45.730506],[-85.49166,45.610013],[-85.623106,45.588105],[-85.568337,45.75789],[-85.508091,45.730506]]],[[[-87.589328,45.095181],[-87.742682,45.199243],[-87.649574,45.341643],[-87.885083,45.363551],[-87.791975,45.500474],[-87.781021,45.675736],[-87.989145,45.796229],[-88.10416,45.922199],[-88.531362,46.020784],[-88.662808,45.987922],[-89.09001,46.135799],[-90.119674,46.338446],[-90.229213,46.508231],[-90.415429,46.568478],[-90.026566,46.672539],[-89.851304,46.793032],[-89.413149,46.842325],[-89.128348,46.990202],[-88.996902,46.995679],[-88.887363,47.099741],[-88.575177,47.247618],[-88.416346,47.373588],[-88.180837,47.455742],[-87.956283,47.384542],[-88.350623,47.077833],[-88.443731,46.973771],[-88.438254,46.787555],[-88.246561,46.929956],[-87.901513,46.908048],[-87.633143,46.809463],[-87.392158,46.535616],[-87.260711,46.486323],[-87.008772,46.530139],[-86.948526,46.469893],[-86.696587,46.437031],[-86.159846,46.667063],[-85.880522,46.68897],[-85.508091,46.678016],[-85.256151,46.754694],[-85.064458,46.760171],[-85.02612,46.480847],[-84.82895,46.442508],[-84.63178,46.486323],[-84.549626,46.4206],[-84.418179,46.502754],[-84.127902,46.530139],[-84.122425,46.179615],[-83.990978,46.031737],[-83.793808,45.993399],[-83.7719,46.091984],[-83.580208,46.091984],[-83.476146,45.987922],[-83.563777,45.911245],[-84.111471,45.976968],[-84.374364,45.933153],[-84.659165,46.053645],[-84.741319,45.944106],[-84.70298,45.850998],[-84.82895,45.872906],[-85.015166,46.00983],[-85.338305,46.091984],[-85.502614,46.097461],[-85.661445,45.966014],[-85.924338,45.933153],[-86.209139,45.960537],[-86.324155,45.905768],[-86.351539,45.796229],[-86.663725,45.703121],[-86.647294,45.834568],[-86.784218,45.861952],[-86.838987,45.725029],[-87.069019,45.719552],[-87.17308,45.659305],[-87.326435,45.423797],[-87.611236,45.122565],[-87.589328,45.095181]]],[[[-88.805209,47.976051],[-89.057148,47.850082],[-89.188594,47.833651],[-89.177641,47.937713],[-88.547792,48.173221],[-88.668285,48.008913],[-88.805209,47.976051]]]]}}, -{"type":"Feature","id":"27","properties":{"name":"Minnesota","density":67.14},"geometry":{"type":"Polygon","coordinates":[[[-92.014696,46.705401],[-92.091373,46.749217],[-92.29402,46.667063],[-92.29402,46.075553],[-92.354266,46.015307],[-92.639067,45.933153],[-92.869098,45.719552],[-92.885529,45.577151],[-92.770513,45.566198],[-92.644544,45.440228],[-92.75956,45.286874],[-92.737652,45.117088],[-92.808852,44.750133],[-92.545959,44.569394],[-92.337835,44.552964],[-92.233773,44.443425],[-91.927065,44.333886],[-91.877772,44.202439],[-91.592971,44.032654],[-91.43414,43.994316],[-91.242447,43.775238],[-91.269832,43.616407],[-91.215062,43.501391],[-91.368417,43.501391],[-96.451017,43.501391],[-96.451017,45.297827],[-96.681049,45.412843],[-96.856311,45.604536],[-96.582464,45.818137],[-96.560556,45.933153],[-96.598895,46.332969],[-96.719387,46.437031],[-96.801542,46.656109],[-96.785111,46.924479],[-96.823449,46.968294],[-96.856311,47.609096],[-97.053481,47.948667],[-97.130158,48.140359],[-97.16302,48.545653],[-97.097296,48.682577],[-97.228743,49.000239],[-95.152983,49.000239],[-95.152983,49.383625],[-94.955813,49.372671],[-94.824366,49.295994],[-94.69292,48.775685],[-94.588858,48.715438],[-94.260241,48.699007],[-94.221903,48.649715],[-93.838517,48.627807],[-93.794701,48.518268],[-93.466085,48.545653],[-93.466085,48.589469],[-93.208669,48.644238],[-92.984114,48.62233],[-92.726698,48.540176],[-92.655498,48.436114],[-92.50762,48.447068],[-92.370697,48.222514],[-92.304974,48.315622],[-92.053034,48.359437],[-92.009219,48.266329],[-91.713464,48.200606],[-91.713464,48.112975],[-91.565587,48.041775],[-91.264355,48.080113],[-91.083616,48.178698],[-90.837154,48.238944],[-90.749522,48.091067],[-90.579737,48.123929],[-90.377091,48.091067],[-90.141582,48.112975],[-89.873212,47.987005],[-89.615796,48.008913],[-89.637704,47.954144],[-89.971797,47.828174],[-90.437337,47.729589],[-90.738569,47.625527],[-91.171247,47.368111],[-91.357463,47.20928],[-91.642264,47.028541],[-92.091373,46.787555],[-92.014696,46.705401]]]}}, -{"type":"Feature","id":"28","properties":{"name":"Mississippi","density":63.50},"geometry":{"type":"Polygon","coordinates":[[[-88.471115,34.995703],[-88.202745,34.995703],[-88.098683,34.891641],[-88.241084,33.796253],[-88.471115,31.895754],[-88.394438,30.367688],[-88.503977,30.323872],[-88.744962,30.34578],[-88.843547,30.411504],[-89.084533,30.367688],[-89.418626,30.252672],[-89.522688,30.181472],[-89.643181,30.285534],[-89.681519,30.449842],[-89.845827,30.66892],[-89.747242,30.997536],[-91.636787,30.997536],[-91.565587,31.068736],[-91.636787,31.265906],[-91.516294,31.27686],[-91.499863,31.643815],[-91.401278,31.621907],[-91.341032,31.846462],[-91.105524,31.988862],[-90.985031,32.218894],[-91.006939,32.514649],[-91.154816,32.640618],[-91.143862,32.843265],[-91.072662,32.887081],[-91.16577,33.002096],[-91.089093,33.13902],[-91.143862,33.347144],[-91.056231,33.429298],[-91.231493,33.560744],[-91.072662,33.867453],[-90.891923,34.026284],[-90.952169,34.135823],[-90.744046,34.300131],[-90.749522,34.365854],[-90.568783,34.420624],[-90.585214,34.617794],[-90.481152,34.661609],[-90.409952,34.831394],[-90.251121,34.908072],[-90.311367,34.995703],[-88.471115,34.995703]]]}}, -{"type":"Feature","id":"29","properties":{"name":"Missouri","density":87.26},"geometry":{"type":"Polygon","coordinates":[[[-91.833957,40.609566],[-91.729895,40.615043],[-91.527248,40.412397],[-91.417709,40.379535],[-91.50534,40.237135],[-91.494386,40.034488],[-91.368417,39.727779],[-91.061708,39.470363],[-90.727615,39.256762],[-90.661891,38.928146],[-90.585214,38.867899],[-90.470199,38.961007],[-90.251121,38.917192],[-90.10872,38.845992],[-90.207305,38.725499],[-90.179921,38.632391],[-90.349706,38.374975],[-90.355183,38.216144],[-90.059428,38.013497],[-89.949889,37.88205],[-89.84035,37.903958],[-89.517211,37.690357],[-89.517211,37.537003],[-89.435057,37.34531],[-89.517211,37.279587],[-89.292656,36.994786],[-89.133825,36.983832],[-89.215979,36.578538],[-89.363857,36.622354],[-89.418626,36.496384],[-89.484349,36.496384],[-89.539119,36.496384],[-89.533642,36.249922],[-89.730812,35.997983],[-90.377091,35.997983],[-90.218259,36.184199],[-90.064905,36.304691],[-90.152536,36.496384],[-94.473842,36.501861],[-94.616242,36.501861],[-94.616242,37.000263],[-94.610765,39.158177],[-94.824366,39.20747],[-94.983197,39.442978],[-95.109167,39.541563],[-94.884612,39.831841],[-95.207752,39.908518],[-95.306337,40.001626],[-95.552799,40.264519],[-95.7664,40.587659],[-94.632673,40.571228],[-93.257961,40.582182],[-91.833957,40.609566]]]}}, -{"type":"Feature","id":"30","properties":{"name":"Montana","density":6.858},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,49.000239],[-104.042057,47.861036],[-104.047534,45.944106],[-104.042057,44.996596],[-104.058488,44.996596],[-105.91517,45.002073],[-109.080842,45.002073],[-111.05254,45.002073],[-111.047063,44.476286],[-111.227803,44.580348],[-111.386634,44.75561],[-111.616665,44.547487],[-111.819312,44.509148],[-111.868605,44.563917],[-112.104113,44.520102],[-112.241036,44.569394],[-112.471068,44.481763],[-112.783254,44.48724],[-112.887315,44.394132],[-113.002331,44.448902],[-113.133778,44.772041],[-113.341901,44.782995],[-113.456917,44.865149],[-113.45144,45.056842],[-113.571933,45.128042],[-113.736241,45.330689],[-113.834826,45.522382],[-113.807441,45.604536],[-113.98818,45.703121],[-114.086765,45.593582],[-114.333228,45.456659],[-114.546828,45.560721],[-114.497536,45.670259],[-114.568736,45.774321],[-114.387997,45.88386],[-114.492059,46.037214],[-114.464674,46.272723],[-114.322274,46.645155],[-114.612552,46.639678],[-114.623506,46.705401],[-114.886399,46.809463],[-114.930214,46.919002],[-115.302646,47.187372],[-115.324554,47.258572],[-115.527201,47.302388],[-115.718894,47.42288],[-115.724371,47.696727],[-116.04751,47.976051],[-116.04751,49.000239],[-111.50165,48.994762],[-109.453274,49.000239],[-104.047534,49.000239]]]}}, -{"type":"Feature","id":"31","properties":{"name":"Nebraska","density":23.97},"geometry":{"type":"Polygon","coordinates":[[[-103.324578,43.002989],[-101.626726,42.997512],[-98.499393,42.997512],[-98.466531,42.94822],[-97.951699,42.767481],[-97.831206,42.866066],[-97.688806,42.844158],[-97.217789,42.844158],[-96.692003,42.657942],[-96.626279,42.515542],[-96.44554,42.488157],[-96.264801,42.039048],[-96.127878,41.973325],[-96.062155,41.798063],[-96.122401,41.67757],[-96.095016,41.540646],[-95.919754,41.453015],[-95.925231,41.201076],[-95.826646,40.976521],[-95.881416,40.719105],[-95.7664,40.587659],[-95.552799,40.264519],[-95.306337,40.001626],[-101.90605,40.001626],[-102.053927,40.001626],[-102.053927,41.003906],[-104.053011,41.003906],[-104.053011,43.002989],[-103.324578,43.002989]]]}}, -{"type":"Feature","id":"32","properties":{"name":"Nevada","density":24.80},"geometry":{"type":"Polygon","coordinates":[[[-117.027882,42.000709],[-114.04295,41.995232],[-114.048427,37.000263],[-114.048427,36.195153],[-114.152489,36.025367],[-114.251074,36.01989],[-114.371566,36.140383],[-114.738521,36.102045],[-114.678275,35.516012],[-114.596121,35.324319],[-114.574213,35.138103],[-114.634459,35.00118],[-115.85034,35.970598],[-116.540435,36.501861],[-117.498899,37.21934],[-118.71478,38.101128],[-120.001861,38.999346],[-119.996384,40.264519],[-120.001861,41.995232],[-118.698349,41.989755],[-117.027882,42.000709]]]}}, -{"type":"Feature","id":"33","properties":{"name":"New Hampshire","density":147},"geometry":{"type":"Polygon","coordinates":[[[-71.08183,45.303304],[-71.032537,44.657025],[-70.966814,43.34256],[-70.807983,43.227544],[-70.824413,43.128959],[-70.703921,43.057759],[-70.818936,42.871543],[-70.917521,42.887974],[-71.185891,42.789389],[-71.29543,42.696281],[-72.456542,42.729142],[-72.544173,42.80582],[-72.533219,42.953697],[-72.445588,43.008466],[-72.456542,43.150867],[-72.379864,43.572591],[-72.204602,43.769761],[-72.116971,43.994316],[-72.02934,44.07647],[-72.034817,44.322932],[-71.700724,44.41604],[-71.536416,44.585825],[-71.629524,44.750133],[-71.4926,44.914442],[-71.503554,45.013027],[-71.361154,45.270443],[-71.131122,45.243058],[-71.08183,45.303304]]]}}, -{"type":"Feature","id":"34","properties":{"name":"New Jersey","density":1189 },"geometry":{"type":"Polygon","coordinates":[[[-74.236547,41.14083],[-73.902454,40.998429],[-74.022947,40.708151],[-74.187255,40.642428],[-74.274886,40.489074],[-74.001039,40.412397],[-73.979131,40.297381],[-74.099624,39.760641],[-74.411809,39.360824],[-74.614456,39.245808],[-74.795195,38.993869],[-74.888303,39.158177],[-75.178581,39.240331],[-75.534582,39.459409],[-75.55649,39.607286],[-75.561967,39.629194],[-75.507197,39.683964],[-75.414089,39.804456],[-75.145719,39.88661],[-75.129289,39.963288],[-74.82258,40.127596],[-74.773287,40.215227],[-75.058088,40.417874],[-75.069042,40.543843],[-75.195012,40.576705],[-75.205966,40.691721],[-75.052611,40.866983],[-75.134765,40.971045],[-74.882826,41.179168],[-74.828057,41.288707],[-74.69661,41.359907],[-74.236547,41.14083]]]}}, -{"type":"Feature","id":"35","properties":{"name":"New Mexico","density":17.16},"geometry":{"type":"Polygon","coordinates":[[[-107.421329,37.000263],[-106.868158,36.994786],[-104.337812,36.994786],[-103.001438,37.000263],[-103.001438,36.501861],[-103.039777,36.501861],[-103.045254,34.01533],[-103.067161,33.002096],[-103.067161,31.999816],[-106.616219,31.999816],[-106.643603,31.901231],[-106.528588,31.786216],[-108.210008,31.786216],[-108.210008,31.331629],[-109.04798,31.331629],[-109.042503,37.000263],[-107.421329,37.000263]]]}}, -{"type":"Feature","id":"36","properties":{"name":"New York","density":412.3},"geometry":{"type":"Polygon","coordinates":[[[-73.343806,45.013027],[-73.332852,44.804903],[-73.387622,44.618687],[-73.294514,44.437948],[-73.321898,44.246255],[-73.436914,44.043608],[-73.349283,43.769761],[-73.404052,43.687607],[-73.245221,43.523299],[-73.278083,42.833204],[-73.267129,42.745573],[-73.508114,42.08834],[-73.486206,42.050002],[-73.55193,41.294184],[-73.48073,41.21203],[-73.727192,41.102491],[-73.655992,40.987475],[-73.22879,40.905321],[-73.141159,40.965568],[-72.774204,40.965568],[-72.587988,40.998429],[-72.28128,41.157261],[-72.259372,41.042245],[-72.100541,40.992952],[-72.467496,40.845075],[-73.239744,40.625997],[-73.562884,40.582182],[-73.776484,40.593136],[-73.935316,40.543843],[-74.022947,40.708151],[-73.902454,40.998429],[-74.236547,41.14083],[-74.69661,41.359907],[-74.740426,41.431108],[-74.89378,41.436584],[-75.074519,41.60637],[-75.052611,41.754247],[-75.173104,41.869263],[-75.249781,41.863786],[-75.35932,42.000709],[-79.76278,42.000709],[-79.76278,42.252649],[-79.76278,42.269079],[-79.149363,42.55388],[-79.050778,42.690804],[-78.853608,42.783912],[-78.930285,42.953697],[-79.012439,42.986559],[-79.072686,43.260406],[-78.486653,43.375421],[-77.966344,43.369944],[-77.75822,43.34256],[-77.533665,43.233021],[-77.391265,43.276836],[-76.958587,43.271359],[-76.695693,43.34256],[-76.41637,43.523299],[-76.235631,43.528776],[-76.230154,43.802623],[-76.137046,43.961454],[-76.3616,44.070993],[-76.312308,44.196962],[-75.912491,44.366748],[-75.764614,44.514625],[-75.282643,44.848718],[-74.828057,45.018503],[-74.148916,44.991119],[-73.343806,45.013027]]]}}, -{"type":"Feature","id":"37","properties":{"name":"North Carolina","density":198.2},"geometry":{"type":"Polygon","coordinates":[[[-80.978661,36.562108],[-80.294043,36.545677],[-79.510841,36.5402],[-75.868676,36.551154],[-75.75366,36.151337],[-76.032984,36.189676],[-76.071322,36.140383],[-76.410893,36.080137],[-76.460185,36.025367],[-76.68474,36.008937],[-76.673786,35.937736],[-76.399939,35.987029],[-76.3616,35.943213],[-76.060368,35.992506],[-75.961783,35.899398],[-75.781044,35.937736],[-75.715321,35.696751],[-75.775568,35.581735],[-75.89606,35.570781],[-76.147999,35.324319],[-76.482093,35.313365],[-76.536862,35.14358],[-76.394462,34.973795],[-76.279446,34.940933],[-76.493047,34.661609],[-76.673786,34.694471],[-76.991448,34.667086],[-77.210526,34.60684],[-77.555573,34.415147],[-77.82942,34.163208],[-77.971821,33.845545],[-78.179944,33.916745],[-78.541422,33.851022],[-79.675149,34.80401],[-80.797922,34.820441],[-80.781491,34.935456],[-80.934845,35.105241],[-81.038907,35.044995],[-81.044384,35.149057],[-82.276696,35.198349],[-82.550543,35.160011],[-82.764143,35.066903],[-83.109191,35.00118],[-83.618546,34.984749],[-84.319594,34.990226],[-84.29221,35.225734],[-84.09504,35.247642],[-84.018363,35.41195],[-83.7719,35.559827],[-83.498053,35.565304],[-83.251591,35.718659],[-82.994175,35.773428],[-82.775097,35.997983],[-82.638174,36.063706],[-82.610789,35.965121],[-82.216449,36.156814],[-82.03571,36.118475],[-81.909741,36.304691],[-81.723525,36.353984],[-81.679709,36.589492],[-80.978661,36.562108]]]}}, -{"type":"Feature","id":"38","properties":{"name":"North Dakota","density":9.916},"geometry":{"type":"Polygon","coordinates":[[[-97.228743,49.000239],[-97.097296,48.682577],[-97.16302,48.545653],[-97.130158,48.140359],[-97.053481,47.948667],[-96.856311,47.609096],[-96.823449,46.968294],[-96.785111,46.924479],[-96.801542,46.656109],[-96.719387,46.437031],[-96.598895,46.332969],[-96.560556,45.933153],[-104.047534,45.944106],[-104.042057,47.861036],[-104.047534,49.000239],[-97.228743,49.000239]]]}}, -{"type":"Feature","id":"39","properties":{"name":"Ohio","density":281.9},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,41.978802],[-80.518598,40.636951],[-80.666475,40.582182],[-80.595275,40.472643],[-80.600752,40.319289],[-80.737675,40.078303],[-80.830783,39.711348],[-81.219646,39.388209],[-81.345616,39.344393],[-81.455155,39.410117],[-81.57017,39.267716],[-81.685186,39.273193],[-81.811156,39.0815],[-81.783771,38.966484],[-81.887833,38.873376],[-82.03571,39.026731],[-82.221926,38.785745],[-82.172634,38.632391],[-82.293127,38.577622],[-82.331465,38.446175],[-82.594358,38.424267],[-82.731282,38.561191],[-82.846298,38.588575],[-82.890113,38.758361],[-83.032514,38.725499],[-83.142052,38.626914],[-83.519961,38.703591],[-83.678792,38.632391],[-83.903347,38.769315],[-84.215533,38.807653],[-84.231963,38.895284],[-84.43461,39.103408],[-84.817996,39.103408],[-84.801565,40.500028],[-84.807042,41.694001],[-83.454238,41.732339],[-83.065375,41.595416],[-82.933929,41.513262],[-82.835344,41.589939],[-82.616266,41.431108],[-82.479343,41.381815],[-82.013803,41.513262],[-81.739956,41.485877],[-81.444201,41.672093],[-81.011523,41.852832],[-80.518598,41.978802],[-80.518598,41.978802]]]}}, -{"type":"Feature","id":"40","properties":{"name":"Oklahoma","density":55.22},"geometry":{"type":"Polygon","coordinates":[[[-100.087706,37.000263],[-94.616242,37.000263],[-94.616242,36.501861],[-94.430026,35.395519],[-94.484796,33.637421],[-94.868182,33.74696],[-94.966767,33.861976],[-95.224183,33.960561],[-95.289906,33.87293],[-95.547322,33.878407],[-95.602092,33.933176],[-95.8376,33.834591],[-95.936185,33.889361],[-96.149786,33.840068],[-96.346956,33.686714],[-96.423633,33.774345],[-96.631756,33.845545],[-96.850834,33.845545],[-96.922034,33.960561],[-97.173974,33.736006],[-97.256128,33.861976],[-97.371143,33.823637],[-97.458774,33.905791],[-97.694283,33.982469],[-97.869545,33.851022],[-97.946222,33.987946],[-98.088623,34.004376],[-98.170777,34.113915],[-98.36247,34.157731],[-98.488439,34.064623],[-98.570593,34.146777],[-98.767763,34.135823],[-98.986841,34.223454],[-99.189488,34.2125],[-99.260688,34.404193],[-99.57835,34.415147],[-99.698843,34.382285],[-99.923398,34.573978],[-100.000075,34.563024],[-100.000075,36.501861],[-101.812942,36.501861],[-103.001438,36.501861],[-103.001438,37.000263],[-102.042974,36.994786],[-100.087706,37.000263]]]}}, -{"type":"Feature","id":"41","properties":{"name":"Oregon","density":40.33},"geometry":{"type":"Polygon","coordinates":[[[-123.211348,46.174138],[-123.11824,46.185092],[-122.904639,46.08103],[-122.811531,45.960537],[-122.762239,45.659305],[-122.247407,45.549767],[-121.809251,45.708598],[-121.535404,45.725029],[-121.217742,45.670259],[-121.18488,45.604536],[-120.637186,45.746937],[-120.505739,45.697644],[-120.209985,45.725029],[-119.963522,45.823614],[-119.525367,45.911245],[-119.125551,45.933153],[-118.988627,45.998876],[-116.918344,45.993399],[-116.78142,45.823614],[-116.545912,45.752413],[-116.463758,45.61549],[-116.671881,45.319735],[-116.732128,45.144473],[-116.847143,45.02398],[-116.830713,44.930872],[-116.934774,44.782995],[-117.038836,44.750133],[-117.241483,44.394132],[-117.170283,44.257209],[-116.97859,44.240778],[-116.896436,44.158624],[-117.027882,43.830007],[-117.027882,42.000709],[-118.698349,41.989755],[-120.001861,41.995232],[-121.037003,41.995232],[-122.378853,42.011663],[-123.233256,42.006186],[-124.213628,42.000709],[-124.356029,42.115725],[-124.432706,42.438865],[-124.416275,42.663419],[-124.553198,42.838681],[-124.454613,43.002989],[-124.383413,43.271359],[-124.235536,43.55616],[-124.169813,43.8081],[-124.060274,44.657025],[-124.076705,44.772041],[-123.97812,45.144473],[-123.939781,45.659305],[-123.994551,45.944106],[-123.945258,46.113892],[-123.545441,46.261769],[-123.370179,46.146753],[-123.211348,46.174138]]]}}, -{"type":"Feature","id":"42","properties":{"name":"Pennsylvania","density":284.3},"geometry":{"type":"Polygon","coordinates":[[[-79.76278,42.252649],[-79.76278,42.000709],[-75.35932,42.000709],[-75.249781,41.863786],[-75.173104,41.869263],[-75.052611,41.754247],[-75.074519,41.60637],[-74.89378,41.436584],[-74.740426,41.431108],[-74.69661,41.359907],[-74.828057,41.288707],[-74.882826,41.179168],[-75.134765,40.971045],[-75.052611,40.866983],[-75.205966,40.691721],[-75.195012,40.576705],[-75.069042,40.543843],[-75.058088,40.417874],[-74.773287,40.215227],[-74.82258,40.127596],[-75.129289,39.963288],[-75.145719,39.88661],[-75.414089,39.804456],[-75.616736,39.831841],[-75.786521,39.722302],[-79.477979,39.722302],[-80.518598,39.722302],[-80.518598,40.636951],[-80.518598,41.978802],[-80.518598,41.978802],[-80.332382,42.033571],[-79.76278,42.269079],[-79.76278,42.252649]]]}}, -{"type":"Feature","id":"44","properties":{"name":"Rhode Island","density":1006 },"geometry":{"type":"MultiPolygon","coordinates":[[[[-71.196845,41.67757],[-71.120168,41.496831],[-71.317338,41.474923],[-71.196845,41.67757]]],[[[-71.530939,42.01714],[-71.383061,42.01714],[-71.328292,41.781632],[-71.22423,41.710431],[-71.344723,41.726862],[-71.448785,41.578985],[-71.481646,41.370861],[-71.859555,41.321569],[-71.799309,41.414677],[-71.799309,42.006186],[-71.530939,42.01714]]]]}}, -{"type":"Feature","id":"45","properties":{"name":"South Carolina","density":155.4},"geometry":{"type":"Polygon","coordinates":[[[-82.764143,35.066903],[-82.550543,35.160011],[-82.276696,35.198349],[-81.044384,35.149057],[-81.038907,35.044995],[-80.934845,35.105241],[-80.781491,34.935456],[-80.797922,34.820441],[-79.675149,34.80401],[-78.541422,33.851022],[-78.716684,33.80173],[-78.935762,33.637421],[-79.149363,33.380005],[-79.187701,33.171881],[-79.357487,33.007573],[-79.582041,33.007573],[-79.631334,32.887081],[-79.866842,32.755634],[-79.998289,32.613234],[-80.206412,32.552987],[-80.430967,32.399633],[-80.452875,32.328433],[-80.660998,32.246279],[-80.885553,32.032678],[-81.115584,32.120309],[-81.121061,32.290094],[-81.279893,32.558464],[-81.416816,32.629664],[-81.42777,32.843265],[-81.493493,33.007573],[-81.761863,33.160928],[-81.937125,33.347144],[-81.926172,33.462159],[-82.194542,33.631944],[-82.325988,33.81816],[-82.55602,33.94413],[-82.714851,34.152254],[-82.747713,34.26727],[-82.901067,34.486347],[-83.005129,34.469916],[-83.339222,34.683517],[-83.322791,34.787579],[-83.109191,35.00118],[-82.764143,35.066903]]]}}, -{"type":"Feature","id":"46","properties":{"name":"South Dakota","density":98.07},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,45.944106],[-96.560556,45.933153],[-96.582464,45.818137],[-96.856311,45.604536],[-96.681049,45.412843],[-96.451017,45.297827],[-96.451017,43.501391],[-96.582464,43.479483],[-96.527695,43.397329],[-96.560556,43.222067],[-96.434587,43.123482],[-96.511264,43.052282],[-96.544125,42.855112],[-96.631756,42.707235],[-96.44554,42.488157],[-96.626279,42.515542],[-96.692003,42.657942],[-97.217789,42.844158],[-97.688806,42.844158],[-97.831206,42.866066],[-97.951699,42.767481],[-98.466531,42.94822],[-98.499393,42.997512],[-101.626726,42.997512],[-103.324578,43.002989],[-104.053011,43.002989],[-104.058488,44.996596],[-104.042057,44.996596],[-104.047534,45.944106]]]}}, -{"type":"Feature","id":"47","properties":{"name":"Tennessee","density":88.08},"geometry":{"type":"Polygon","coordinates":[[[-88.054868,36.496384],[-88.071299,36.677123],[-87.852221,36.633308],[-86.592525,36.655216],[-85.486183,36.616877],[-85.289013,36.627831],[-84.544149,36.594969],[-83.689746,36.584015],[-83.673316,36.600446],[-81.679709,36.589492],[-81.723525,36.353984],[-81.909741,36.304691],[-82.03571,36.118475],[-82.216449,36.156814],[-82.610789,35.965121],[-82.638174,36.063706],[-82.775097,35.997983],[-82.994175,35.773428],[-83.251591,35.718659],[-83.498053,35.565304],[-83.7719,35.559827],[-84.018363,35.41195],[-84.09504,35.247642],[-84.29221,35.225734],[-84.319594,34.990226],[-85.606675,34.984749],[-87.359296,35.00118],[-88.202745,34.995703],[-88.471115,34.995703],[-90.311367,34.995703],[-90.212782,35.023087],[-90.114197,35.198349],[-90.130628,35.439335],[-89.944412,35.603643],[-89.911551,35.756997],[-89.763673,35.811767],[-89.730812,35.997983],[-89.533642,36.249922],[-89.539119,36.496384],[-89.484349,36.496384],[-89.418626,36.496384],[-89.298133,36.507338],[-88.054868,36.496384]]]}}, -{"type":"Feature","id":"48","properties":{"name":"Texas","density":98.07},"geometry":{"type":"Polygon","coordinates":[[[-101.812942,36.501861],[-100.000075,36.501861],[-100.000075,34.563024],[-99.923398,34.573978],[-99.698843,34.382285],[-99.57835,34.415147],[-99.260688,34.404193],[-99.189488,34.2125],[-98.986841,34.223454],[-98.767763,34.135823],[-98.570593,34.146777],[-98.488439,34.064623],[-98.36247,34.157731],[-98.170777,34.113915],[-98.088623,34.004376],[-97.946222,33.987946],[-97.869545,33.851022],[-97.694283,33.982469],[-97.458774,33.905791],[-97.371143,33.823637],[-97.256128,33.861976],[-97.173974,33.736006],[-96.922034,33.960561],[-96.850834,33.845545],[-96.631756,33.845545],[-96.423633,33.774345],[-96.346956,33.686714],[-96.149786,33.840068],[-95.936185,33.889361],[-95.8376,33.834591],[-95.602092,33.933176],[-95.547322,33.878407],[-95.289906,33.87293],[-95.224183,33.960561],[-94.966767,33.861976],[-94.868182,33.74696],[-94.484796,33.637421],[-94.380734,33.544313],[-94.183564,33.593606],[-94.041164,33.54979],[-94.041164,33.018527],[-94.041164,31.994339],[-93.822086,31.775262],[-93.816609,31.556184],[-93.542762,31.15089],[-93.526331,30.93729],[-93.630393,30.679874],[-93.728978,30.575812],[-93.696116,30.438888],[-93.767317,30.334826],[-93.690639,30.143133],[-93.926148,29.787132],[-93.838517,29.688547],[-94.002825,29.68307],[-94.523134,29.546147],[-94.70935,29.622824],[-94.742212,29.787132],[-94.873659,29.672117],[-94.966767,29.699501],[-95.016059,29.557101],[-94.911997,29.496854],[-94.895566,29.310638],[-95.081782,29.113469],[-95.383014,28.867006],[-95.985477,28.604113],[-96.045724,28.647929],[-96.226463,28.582205],[-96.23194,28.642452],[-96.478402,28.598636],[-96.593418,28.724606],[-96.664618,28.697221],[-96.401725,28.439805],[-96.593418,28.357651],[-96.774157,28.406943],[-96.801542,28.226204],[-97.026096,28.039988],[-97.256128,27.694941],[-97.404005,27.333463],[-97.513544,27.360848],[-97.540929,27.229401],[-97.425913,27.262263],[-97.480682,26.99937],[-97.557359,26.988416],[-97.562836,26.840538],[-97.469728,26.758384],[-97.442344,26.457153],[-97.332805,26.353091],[-97.30542,26.161398],[-97.217789,25.991613],[-97.524498,25.887551],[-97.650467,26.018997],[-97.885976,26.06829],[-98.198161,26.057336],[-98.466531,26.221644],[-98.669178,26.238075],[-98.822533,26.369522],[-99.030656,26.413337],[-99.173057,26.539307],[-99.266165,26.840538],[-99.446904,27.021277],[-99.424996,27.174632],[-99.50715,27.33894],[-99.479765,27.48134],[-99.605735,27.640172],[-99.709797,27.656603],[-99.879582,27.799003],[-99.934351,27.979742],[-100.082229,28.14405],[-100.29583,28.280974],[-100.399891,28.582205],[-100.498476,28.66436],[-100.629923,28.905345],[-100.673738,29.102515],[-100.799708,29.244915],[-101.013309,29.370885],[-101.062601,29.458516],[-101.259771,29.535193],[-101.413125,29.754271],[-101.851281,29.803563],[-102.114174,29.792609],[-102.338728,29.869286],[-102.388021,29.765225],[-102.629006,29.732363],[-102.809745,29.524239],[-102.919284,29.190146],[-102.97953,29.184669],[-103.116454,28.987499],[-103.280762,28.982022],[-103.527224,29.135376],[-104.146119,29.381839],[-104.266611,29.513285],[-104.507597,29.639255],[-104.677382,29.924056],[-104.688336,30.181472],[-104.858121,30.389596],[-104.896459,30.570335],[-105.005998,30.685351],[-105.394861,30.855136],[-105.602985,31.085167],[-105.77277,31.167321],[-105.953509,31.364491],[-106.205448,31.468553],[-106.38071,31.731446],[-106.528588,31.786216],[-106.643603,31.901231],[-106.616219,31.999816],[-103.067161,31.999816],[-103.067161,33.002096],[-103.045254,34.01533],[-103.039777,36.501861],[-103.001438,36.501861],[-101.812942,36.501861]]]}}, -{"type":"Feature","id":"49","properties":{"name":"Utah","density":34.30},"geometry":{"type":"Polygon","coordinates":[[[-112.164359,41.995232],[-111.047063,42.000709],[-111.047063,40.998429],[-109.04798,40.998429],[-109.053457,39.125316],[-109.058934,38.27639],[-109.042503,38.166851],[-109.042503,37.000263],[-110.499369,37.00574],[-114.048427,37.000263],[-114.04295,41.995232],[-112.164359,41.995232]]]}}, -{"type":"Feature","id":"50","properties":{"name":"Vermont","density":67.73},"geometry":{"type":"Polygon","coordinates":[[[-71.503554,45.013027],[-71.4926,44.914442],[-71.629524,44.750133],[-71.536416,44.585825],[-71.700724,44.41604],[-72.034817,44.322932],[-72.02934,44.07647],[-72.116971,43.994316],[-72.204602,43.769761],[-72.379864,43.572591],[-72.456542,43.150867],[-72.445588,43.008466],[-72.533219,42.953697],[-72.544173,42.80582],[-72.456542,42.729142],[-73.267129,42.745573],[-73.278083,42.833204],[-73.245221,43.523299],[-73.404052,43.687607],[-73.349283,43.769761],[-73.436914,44.043608],[-73.321898,44.246255],[-73.294514,44.437948],[-73.387622,44.618687],[-73.332852,44.804903],[-73.343806,45.013027],[-72.308664,45.002073],[-71.503554,45.013027]]]}}, -{"type":"Feature","id":"51","properties":{"name":"Virginia","density":204.5},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.397659,38.013497],[-75.244304,38.029928],[-75.375751,37.860142],[-75.512674,37.799896],[-75.594828,37.569865],[-75.802952,37.197433],[-75.972737,37.120755],[-76.027507,37.257679],[-75.939876,37.564388],[-75.671506,37.95325],[-75.397659,38.013497]]],[[[-76.016553,37.95325],[-75.994645,37.95325],[-76.043938,37.95325],[-76.016553,37.95325]]],[[[-78.349729,39.464886],[-77.82942,39.130793],[-77.719881,39.322485],[-77.566527,39.306055],[-77.456988,39.223901],[-77.456988,39.076023],[-77.248864,39.026731],[-77.117418,38.933623],[-77.040741,38.791222],[-77.128372,38.632391],[-77.248864,38.588575],[-77.325542,38.446175],[-77.281726,38.342113],[-77.013356,38.374975],[-76.964064,38.216144],[-76.613539,38.15042],[-76.514954,38.024451],[-76.235631,37.887527],[-76.3616,37.608203],[-76.246584,37.389126],[-76.383508,37.285064],[-76.399939,37.159094],[-76.273969,37.082417],[-76.410893,36.961924],[-76.619016,37.120755],[-76.668309,37.065986],[-76.48757,36.95097],[-75.994645,36.923586],[-75.868676,36.551154],[-79.510841,36.5402],[-80.294043,36.545677],[-80.978661,36.562108],[-81.679709,36.589492],[-83.673316,36.600446],[-83.136575,36.742847],[-83.070852,36.852385],[-82.879159,36.890724],[-82.868205,36.978355],[-82.720328,37.044078],[-82.720328,37.120755],[-82.353373,37.268633],[-81.969987,37.537003],[-81.986418,37.454849],[-81.849494,37.285064],[-81.679709,37.20291],[-81.55374,37.208387],[-81.362047,37.339833],[-81.225123,37.235771],[-80.967707,37.290541],[-80.513121,37.482234],[-80.474782,37.421987],[-80.29952,37.509618],[-80.294043,37.690357],[-80.184505,37.849189],[-79.998289,37.997066],[-79.921611,38.177805],[-79.724442,38.364021],[-79.647764,38.594052],[-79.477979,38.457129],[-79.313671,38.413313],[-79.209609,38.495467],[-78.996008,38.851469],[-78.870039,38.763838],[-78.404499,39.169131],[-78.349729,39.464886]]]]}}, -{"type":"Feature","id":"53","properties":{"name":"Washington","density":102.6},"geometry":{"type":"MultiPolygon","coordinates":[[[[-117.033359,49.000239],[-117.044313,47.762451],[-117.038836,46.426077],[-117.055267,46.343923],[-116.92382,46.168661],[-116.918344,45.993399],[-118.988627,45.998876],[-119.125551,45.933153],[-119.525367,45.911245],[-119.963522,45.823614],[-120.209985,45.725029],[-120.505739,45.697644],[-120.637186,45.746937],[-121.18488,45.604536],[-121.217742,45.670259],[-121.535404,45.725029],[-121.809251,45.708598],[-122.247407,45.549767],[-122.762239,45.659305],[-122.811531,45.960537],[-122.904639,46.08103],[-123.11824,46.185092],[-123.211348,46.174138],[-123.370179,46.146753],[-123.545441,46.261769],[-123.72618,46.300108],[-123.874058,46.239861],[-124.065751,46.327492],[-124.027412,46.464416],[-123.895966,46.535616],[-124.098612,46.74374],[-124.235536,47.285957],[-124.31769,47.357157],[-124.427229,47.740543],[-124.624399,47.88842],[-124.706553,48.184175],[-124.597014,48.381345],[-124.394367,48.288237],[-123.983597,48.162267],[-123.704273,48.167744],[-123.424949,48.118452],[-123.162056,48.167744],[-123.036086,48.080113],[-122.800578,48.08559],[-122.636269,47.866512],[-122.515777,47.882943],[-122.493869,47.587189],[-122.422669,47.318818],[-122.324084,47.346203],[-122.422669,47.576235],[-122.395284,47.800789],[-122.230976,48.030821],[-122.362422,48.123929],[-122.373376,48.288237],[-122.471961,48.468976],[-122.422669,48.600422],[-122.488392,48.753777],[-122.647223,48.775685],[-122.795101,48.8907],[-122.756762,49.000239],[-117.033359,49.000239]]],[[[-122.718423,48.310145],[-122.586977,48.35396],[-122.608885,48.151313],[-122.767716,48.227991],[-122.718423,48.310145]]],[[[-123.025132,48.583992],[-122.915593,48.715438],[-122.767716,48.556607],[-122.811531,48.419683],[-123.041563,48.458022],[-123.025132,48.583992]]]]}}, -{"type":"Feature","id":"54","properties":{"name":"West Virginia","density":77.06},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,40.636951],[-80.518598,39.722302],[-79.477979,39.722302],[-79.488933,39.20747],[-79.291763,39.300578],[-79.094593,39.470363],[-78.963147,39.437501],[-78.765977,39.585379],[-78.470222,39.514178],[-78.431884,39.623717],[-78.267575,39.61824],[-78.174467,39.694917],[-78.004682,39.601809],[-77.834897,39.601809],[-77.719881,39.322485],[-77.82942,39.130793],[-78.349729,39.464886],[-78.404499,39.169131],[-78.870039,38.763838],[-78.996008,38.851469],[-79.209609,38.495467],[-79.313671,38.413313],[-79.477979,38.457129],[-79.647764,38.594052],[-79.724442,38.364021],[-79.921611,38.177805],[-79.998289,37.997066],[-80.184505,37.849189],[-80.294043,37.690357],[-80.29952,37.509618],[-80.474782,37.421987],[-80.513121,37.482234],[-80.967707,37.290541],[-81.225123,37.235771],[-81.362047,37.339833],[-81.55374,37.208387],[-81.679709,37.20291],[-81.849494,37.285064],[-81.986418,37.454849],[-81.969987,37.537003],[-82.101434,37.553434],[-82.293127,37.668449],[-82.342419,37.783465],[-82.50125,37.931343],[-82.621743,38.123036],[-82.594358,38.424267],[-82.331465,38.446175],[-82.293127,38.577622],[-82.172634,38.632391],[-82.221926,38.785745],[-82.03571,39.026731],[-81.887833,38.873376],[-81.783771,38.966484],[-81.811156,39.0815],[-81.685186,39.273193],[-81.57017,39.267716],[-81.455155,39.410117],[-81.345616,39.344393],[-81.219646,39.388209],[-80.830783,39.711348],[-80.737675,40.078303],[-80.600752,40.319289],[-80.595275,40.472643],[-80.666475,40.582182],[-80.518598,40.636951]]]}}, -{"type":"Feature","id":"55","properties":{"name":"Wisconsin","density":105.2},"geometry":{"type":"Polygon","coordinates":[[[-90.415429,46.568478],[-90.229213,46.508231],[-90.119674,46.338446],[-89.09001,46.135799],[-88.662808,45.987922],[-88.531362,46.020784],[-88.10416,45.922199],[-87.989145,45.796229],[-87.781021,45.675736],[-87.791975,45.500474],[-87.885083,45.363551],[-87.649574,45.341643],[-87.742682,45.199243],[-87.589328,45.095181],[-87.627666,44.974688],[-87.819359,44.95278],[-87.983668,44.722749],[-88.043914,44.563917],[-87.928898,44.536533],[-87.775544,44.640595],[-87.611236,44.837764],[-87.403112,44.914442],[-87.238804,45.166381],[-87.03068,45.22115],[-87.047111,45.089704],[-87.189511,44.969211],[-87.468835,44.552964],[-87.545512,44.322932],[-87.540035,44.158624],[-87.644097,44.103854],[-87.737205,43.8793],[-87.704344,43.687607],[-87.791975,43.561637],[-87.912467,43.249452],[-87.885083,43.002989],[-87.76459,42.783912],[-87.802929,42.493634],[-88.788778,42.493634],[-90.639984,42.510065],[-90.711184,42.636034],[-91.067185,42.75105],[-91.143862,42.909881],[-91.176724,43.134436],[-91.056231,43.254929],[-91.204109,43.353514],[-91.215062,43.501391],[-91.269832,43.616407],[-91.242447,43.775238],[-91.43414,43.994316],[-91.592971,44.032654],[-91.877772,44.202439],[-91.927065,44.333886],[-92.233773,44.443425],[-92.337835,44.552964],[-92.545959,44.569394],[-92.808852,44.750133],[-92.737652,45.117088],[-92.75956,45.286874],[-92.644544,45.440228],[-92.770513,45.566198],[-92.885529,45.577151],[-92.869098,45.719552],[-92.639067,45.933153],[-92.354266,46.015307],[-92.29402,46.075553],[-92.29402,46.667063],[-92.091373,46.749217],[-92.014696,46.705401],[-91.790141,46.694447],[-91.09457,46.864232],[-90.837154,46.95734],[-90.749522,46.88614],[-90.886446,46.754694],[-90.55783,46.584908],[-90.415429,46.568478]]]}}, -{"type":"Feature","id":"56","properties":{"name":"Wyoming","density":5.851},"geometry":{"type":"Polygon","coordinates":[[[-109.080842,45.002073],[-105.91517,45.002073],[-104.058488,44.996596],[-104.053011,43.002989],[-104.053011,41.003906],[-105.728954,40.998429],[-107.919731,41.003906],[-109.04798,40.998429],[-111.047063,40.998429],[-111.047063,42.000709],[-111.047063,44.476286],[-111.05254,45.002073],[-109.080842,45.002073]]]}}, -{"type":"Feature","id":"72","properties":{"name":"Puerto Rico","density":1082 },"geometry":{"type":"Polygon","coordinates":[[[-66.448338,17.984326],[-66.771478,18.006234],[-66.924832,17.929556],[-66.985078,17.973372],[-67.209633,17.956941],[-67.154863,18.19245],[-67.269879,18.362235],[-67.094617,18.515589],[-66.957694,18.488204],[-66.409999,18.488204],[-65.840398,18.433435],[-65.632274,18.367712],[-65.626797,18.203403],[-65.730859,18.186973],[-65.834921,18.017187],[-66.234737,17.929556],[-66.448338,17.984326]]]}} -]}; diff --git a/debug/vector/vector-bounds.html b/debug/vector/vector-bounds.html deleted file mode 100644 index ba0839eead8..00000000000 --- a/debug/vector/vector-bounds.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - -
            - - - - - - diff --git a/debug/vector/vector-canvas.html b/debug/vector/vector-canvas.html deleted file mode 100644 index 932912a0dd8..00000000000 --- a/debug/vector/vector-canvas.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - -
            - - - - - - - - - - diff --git a/debug/vector/vector-mobile.html b/debug/vector/vector-mobile.html deleted file mode 100644 index db531407bb9..00000000000 --- a/debug/vector/vector-mobile.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - -
            - - - - - diff --git a/debug/vector/vector-simple.html b/debug/vector/vector-simple.html deleted file mode 100644 index 527831f520b..00000000000 --- a/debug/vector/vector-simple.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - Leaflet debug page - - - - - - - - - - - -
            - - - - diff --git a/debug/vector/vector.html b/debug/vector/vector.html deleted file mode 100644 index f39b830fd72..00000000000 --- a/debug/vector/vector.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - Leaflet debug page - - - - - - - - -
            - - - - - diff --git a/dist/images/layers-2x.png b/dist/images/layers-2x.png deleted file mode 100644 index a2cf7f9efef65d2e021f382f47ef50d51d51a0df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/dist/images/marker-shadow.png b/dist/images/marker-shadow.png deleted file mode 100644 index d1e773c715a9b508ebea055c4bb4b0a2ad7f6e52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 797 zcmV+&1LFLNP)oNwbRQ6Eq$4M3RDU@$ z<4cV9zWLV=bA&uX9wCpA{{f^4$D#k>GcX53-UQqf>_LzMU@frMz|MwbfQGbY0?ccG zBj_wh0?6Tv;HWR0`x;m^Bm<;sCm_85SGspFBn6|A!tDh$nR`wGorGkyL7j?F3#OJq zIswLIz;iF7f|LMnF(pXPAY*GYpsw%&e_WjlnV`C$6@#Q7GZu1$Q8>&p8=(iJj8o|T~0u%hM*Yg_d(Av{WS$h&pM%nlEAonVL0;DkN|xc zn)9F+aMDk#VtAMb0c=kIb1pU-$e4$3pwo&qVh(Umlw3_IU_dFcFe(In6*x}D4LHLhFZ4N=V2ZR+>XHU5D&uY$npJ7Eu?{iAK>UxC?4uyg4+iD z!nst**H%2zhOBxc7C7Tv{f^`%hqT1KpU@Vf6+C2|bGaR(1~TU5D-1;&HXT~PMc2Lu z{Q%^i6vvox&EMFT7I_)R$xq1779I8kE@?|D*cLWnP0a@a)xJA`o*^$^V(yN)b`kV7 z=o@jbFF4j{KeuQh - var sources = Array.prototype.slice.call(arguments, 1), - i, j, len, src; - - for (j = 0, len = sources.length; j < len; j++) { - src = sources[j] || {}; - for (i in src) { - if (src.hasOwnProperty(i)) { - dest[i] = src[i]; - } - } - } - return dest; - }, - - bind: function (fn, obj) { // (Function, Object) -> Function - var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; - return function () { - return fn.apply(obj, args || arguments); - }; - }, - - stamp: (function () { - var lastId = 0, - key = '_leaflet_id'; - return function (obj) { - obj[key] = obj[key] || ++lastId; - return obj[key]; - }; - }()), - - invokeEach: function (obj, method, context) { - var i, args; - - if (typeof obj === 'object') { - args = Array.prototype.slice.call(arguments, 3); - - for (i in obj) { - method.apply(context, [i, obj[i]].concat(args)); - } - return true; - } - - return false; - }, - - limitExecByInterval: function (fn, time, context) { - var lock, execOnUnlock; - - return function wrapperFn() { - var args = arguments; - - if (lock) { - execOnUnlock = true; - return; - } - - lock = true; - - setTimeout(function () { - lock = false; - - if (execOnUnlock) { - wrapperFn.apply(context, args); - execOnUnlock = false; - } - }, time); - - fn.apply(context, args); - }; - }, - - falseFn: function () { - return false; - }, - - formatNum: function (num, digits) { - var pow = Math.pow(10, digits || 5); - return Math.round(num * pow) / pow; - }, - - trim: function (str) { - return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); - }, - - splitWords: function (str) { - return L.Util.trim(str).split(/\s+/); - }, - - setOptions: function (obj, options) { - obj.options = L.extend({}, obj.options, options); - return obj.options; - }, - - getParamString: function (obj, existingUrl, uppercase) { - var params = []; - for (var i in obj) { - params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); - } - return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); - }, - template: function (str, data) { - return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { - var value = data[key]; - if (value === undefined) { - throw new Error('No value provided for variable ' + str); - } else if (typeof value === 'function') { - value = value(data); - } - return value; - }); - }, - - isArray: Array.isArray || function (obj) { - return (Object.prototype.toString.call(obj) === '[object Array]'); - }, - - emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' -}; - -(function () { - - // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - - function getPrefixed(name) { - var i, fn, - prefixes = ['webkit', 'moz', 'o', 'ms']; - - for (i = 0; i < prefixes.length && !fn; i++) { - fn = window[prefixes[i] + name]; - } - - return fn; - } - - var lastTime = 0; - - function timeoutDefer(fn) { - var time = +new Date(), - timeToCall = Math.max(0, 16 - (time - lastTime)); - - lastTime = time + timeToCall; - return window.setTimeout(fn, timeToCall); - } - - var requestFn = window.requestAnimationFrame || - getPrefixed('RequestAnimationFrame') || timeoutDefer; - - var cancelFn = window.cancelAnimationFrame || - getPrefixed('CancelAnimationFrame') || - getPrefixed('CancelRequestAnimationFrame') || - function (id) { window.clearTimeout(id); }; - - - L.Util.requestAnimFrame = function (fn, context, immediate, element) { - fn = L.bind(fn, context); - - if (immediate && requestFn === timeoutDefer) { - fn(); - } else { - return requestFn.call(window, fn, element); - } - }; - - L.Util.cancelAnimFrame = function (id) { - if (id) { - cancelFn.call(window, id); - } - }; - -}()); - -// shortcuts for most used utility functions -L.extend = L.Util.extend; -L.bind = L.Util.bind; -L.stamp = L.Util.stamp; -L.setOptions = L.Util.setOptions; - - -/* - * L.Class powers the OOP facilities of the library. - * Thanks to John Resig and Dean Edwards for inspiration! - */ - -L.Class = function () {}; - -L.Class.extend = function (props) { - - // extended class with the new prototype - var NewClass = function () { - - // call the constructor - if (this.initialize) { - this.initialize.apply(this, arguments); - } - - // call all constructor hooks - if (this._initHooks) { - this.callInitHooks(); - } - }; - - // instantiate class without calling constructor - var F = function () {}; - F.prototype = this.prototype; - - var proto = new F(); - proto.constructor = NewClass; - - NewClass.prototype = proto; - - //inherit parent's statics - for (var i in this) { - if (this.hasOwnProperty(i) && i !== 'prototype') { - NewClass[i] = this[i]; - } - } - - // mix static properties into the class - if (props.statics) { - L.extend(NewClass, props.statics); - delete props.statics; - } - - // mix includes into the prototype - if (props.includes) { - L.Util.extend.apply(null, [proto].concat(props.includes)); - delete props.includes; - } - - // merge options - if (props.options && proto.options) { - props.options = L.extend({}, proto.options, props.options); - } - - // mix given properties into the prototype - L.extend(proto, props); - - proto._initHooks = []; - - var parent = this; - // jshint camelcase: false - NewClass.__super__ = parent.prototype; - - // add method for calling all hooks - proto.callInitHooks = function () { - - if (this._initHooksCalled) { return; } - - if (parent.prototype.callInitHooks) { - parent.prototype.callInitHooks.call(this); - } - - this._initHooksCalled = true; - - for (var i = 0, len = proto._initHooks.length; i < len; i++) { - proto._initHooks[i].call(this); - } - }; - - return NewClass; -}; - - -// method for adding properties to prototype -L.Class.include = function (props) { - L.extend(this.prototype, props); -}; - -// merge new default options to the Class -L.Class.mergeOptions = function (options) { - L.extend(this.prototype.options, options); -}; - -// add a constructor hook -L.Class.addInitHook = function (fn) { // (Function) || (String, args...) - var args = Array.prototype.slice.call(arguments, 1); - - var init = typeof fn === 'function' ? fn : function () { - this[fn].apply(this, args); - }; - - this.prototype._initHooks = this.prototype._initHooks || []; - this.prototype._initHooks.push(init); -}; - - -/* - * L.Mixin.Events is used to add custom events functionality to Leaflet classes. - */ - -var eventsKey = '_leaflet_events'; - -L.Mixin = {}; - -L.Mixin.Events = { - - addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) - - // types can be a map of types/handlers - if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey] = this[eventsKey] || {}, - contextId = context && context !== this && L.stamp(context), - i, len, event, type, indexKey, indexLenKey, typeIndex; - - // types can be a string of space-separated words - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - event = { - action: fn, - context: context || this - }; - type = types[i]; - - if (contextId) { - // store listeners of a particular context in a separate hash (if it has an id) - // gives a major performance boost when removing thousands of map layers - - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; - - typeIndex = events[indexKey] = events[indexKey] || {}; - - if (!typeIndex[contextId]) { - typeIndex[contextId] = []; - - // keep track of the number of keys in the index to quickly check if it's empty - events[indexLenKey] = (events[indexLenKey] || 0) + 1; - } - - typeIndex[contextId].push(event); - - - } else { - events[type] = events[type] || []; - events[type].push(event); - } - } - - return this; - }, - - hasEventListeners: function (type) { // (String) -> Boolean - var events = this[eventsKey]; - return !!events && ((type in events && events[type].length > 0) || - (type + '_idx' in events && events[type + '_idx_len'] > 0)); - }, - - removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object]) - - if (!this[eventsKey]) { - return this; - } - - if (!types) { - return this.clearAllEventListeners(); - } - - if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey], - contextId = context && context !== this && L.stamp(context), - i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed; - - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - type = types[i]; - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; - - typeIndex = events[indexKey]; - - if (!fn) { - // clear all listeners for a type if function isn't specified - delete events[type]; - delete events[indexKey]; - delete events[indexLenKey]; - - } else { - listeners = contextId && typeIndex ? typeIndex[contextId] : events[type]; - - if (listeners) { - for (j = listeners.length - 1; j >= 0; j--) { - if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) { - removed = listeners.splice(j, 1); - // set the old action to a no-op, because it is possible - // that the listener is being iterated over as part of a dispatch - removed[0].action = L.Util.falseFn; - } - } - - if (context && typeIndex && (listeners.length === 0)) { - delete typeIndex[contextId]; - events[indexLenKey]--; - } - } - } - } - - return this; - }, - - clearAllEventListeners: function () { - delete this[eventsKey]; - return this; - }, - - fireEvent: function (type, data) { // (String[, Object]) - if (!this.hasEventListeners(type)) { - return this; - } - - var event = L.Util.extend({}, data, { type: type, target: this }); - - var events = this[eventsKey], - listeners, i, len, typeIndex, contextId; - - if (events[type]) { - // make sure adding/removing listeners inside other listeners won't cause infinite loop - listeners = events[type].slice(); - - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context, event); - } - } - - // fire event for the context-indexed listeners as well - typeIndex = events[type + '_idx']; - - for (contextId in typeIndex) { - listeners = typeIndex[contextId].slice(); - - if (listeners) { - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context, event); - } - } - } - - return this; - }, - - addOneTimeEventListener: function (types, fn, context) { - - if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; } - - var handler = L.bind(function () { - this - .removeEventListener(types, fn, context) - .removeEventListener(types, handler, context); - }, this); - - return this - .addEventListener(types, fn, context) - .addEventListener(types, handler, context); - } -}; - -L.Mixin.Events.on = L.Mixin.Events.addEventListener; -L.Mixin.Events.off = L.Mixin.Events.removeEventListener; -L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener; -L.Mixin.Events.fire = L.Mixin.Events.fireEvent; - - -/* - * L.Browser handles different browser and feature detections for internal Leaflet use. - */ - -(function () { - - var ie = 'ActiveXObject' in window, - ielt9 = ie && !document.addEventListener, - - // terrible browser detection to work around Safari / iOS / Android browser bugs - ua = navigator.userAgent.toLowerCase(), - webkit = ua.indexOf('webkit') !== -1, - chrome = ua.indexOf('chrome') !== -1, - phantomjs = ua.indexOf('phantom') !== -1, - android = ua.indexOf('android') !== -1, - android23 = ua.search('android [23]') !== -1, - gecko = ua.indexOf('gecko') !== -1, - - mobile = typeof orientation !== undefined + '', - msPointer = !window.PointerEvent && window.MSPointerEvent, - pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || - msPointer, - retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || - ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && - window.matchMedia('(min-resolution:144dpi)').matches), - - doc = document.documentElement, - ie3d = ie && ('transition' in doc.style), - webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, - gecko3d = 'MozPerspective' in doc.style, - opera3d = 'OTransition' in doc.style, - any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; - - var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window || - (window.DocumentTouch && document instanceof window.DocumentTouch)); - - L.Browser = { - ie: ie, - ielt9: ielt9, - webkit: webkit, - gecko: gecko && !webkit && !window.opera && !ie, - - android: android, - android23: android23, - - chrome: chrome, - - ie3d: ie3d, - webkit3d: webkit3d, - gecko3d: gecko3d, - opera3d: opera3d, - any3d: any3d, - - mobile: mobile, - mobileWebkit: mobile && webkit, - mobileWebkit3d: mobile && webkit3d, - mobileOpera: mobile && window.opera, - - touch: touch, - msPointer: msPointer, - pointer: pointer, - - retina: retina - }; - -}()); - - -/* - * L.Point represents a point with x and y coordinates. - */ - -L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { - this.x = (round ? Math.round(x) : x); - this.y = (round ? Math.round(y) : y); -}; - -L.Point.prototype = { - - clone: function () { - return new L.Point(this.x, this.y); - }, - - // non-destructive, returns a new point - add: function (point) { - return this.clone()._add(L.point(point)); - }, - - // destructive, used directly for performance in situations where it's safe to modify existing point - _add: function (point) { - this.x += point.x; - this.y += point.y; - return this; - }, - - subtract: function (point) { - return this.clone()._subtract(L.point(point)); - }, - - _subtract: function (point) { - this.x -= point.x; - this.y -= point.y; - return this; - }, - - divideBy: function (num) { - return this.clone()._divideBy(num); - }, - - _divideBy: function (num) { - this.x /= num; - this.y /= num; - return this; - }, - - multiplyBy: function (num) { - return this.clone()._multiplyBy(num); - }, - - _multiplyBy: function (num) { - this.x *= num; - this.y *= num; - return this; - }, - - round: function () { - return this.clone()._round(); - }, - - _round: function () { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - }, - - floor: function () { - return this.clone()._floor(); - }, - - _floor: function () { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - return this; - }, - - distanceTo: function (point) { - point = L.point(point); - - var x = point.x - this.x, - y = point.y - this.y; - - return Math.sqrt(x * x + y * y); - }, - - equals: function (point) { - point = L.point(point); - - return point.x === this.x && - point.y === this.y; - }, - - contains: function (point) { - point = L.point(point); - - return Math.abs(point.x) <= Math.abs(this.x) && - Math.abs(point.y) <= Math.abs(this.y); - }, - - toString: function () { - return 'Point(' + - L.Util.formatNum(this.x) + ', ' + - L.Util.formatNum(this.y) + ')'; - } -}; - -L.point = function (x, y, round) { - if (x instanceof L.Point) { - return x; - } - if (L.Util.isArray(x)) { - return new L.Point(x[0], x[1]); - } - if (x === undefined || x === null) { - return x; - } - return new L.Point(x, y, round); -}; - - -/* - * L.Bounds represents a rectangular area on the screen in pixel coordinates. - */ - -L.Bounds = function (a, b) { //(Point, Point) or Point[] - if (!a) { return; } - - var points = b ? [a, b] : a; - - for (var i = 0, len = points.length; i < len; i++) { - this.extend(points[i]); - } -}; - -L.Bounds.prototype = { - // extend the bounds to contain the given point - extend: function (point) { // (Point) - point = L.point(point); - - if (!this.min && !this.max) { - this.min = point.clone(); - this.max = point.clone(); - } else { - this.min.x = Math.min(point.x, this.min.x); - this.max.x = Math.max(point.x, this.max.x); - this.min.y = Math.min(point.y, this.min.y); - this.max.y = Math.max(point.y, this.max.y); - } - return this; - }, - - getCenter: function (round) { // (Boolean) -> Point - return new L.Point( - (this.min.x + this.max.x) / 2, - (this.min.y + this.max.y) / 2, round); - }, - - getBottomLeft: function () { // -> Point - return new L.Point(this.min.x, this.max.y); - }, - - getTopRight: function () { // -> Point - return new L.Point(this.max.x, this.min.y); - }, - - getSize: function () { - return this.max.subtract(this.min); - }, - - contains: function (obj) { // (Bounds) or (Point) -> Boolean - var min, max; - - if (typeof obj[0] === 'number' || obj instanceof L.Point) { - obj = L.point(obj); - } else { - obj = L.bounds(obj); - } - - if (obj instanceof L.Bounds) { - min = obj.min; - max = obj.max; - } else { - min = max = obj; - } - - return (min.x >= this.min.x) && - (max.x <= this.max.x) && - (min.y >= this.min.y) && - (max.y <= this.max.y); - }, - - intersects: function (bounds) { // (Bounds) -> Boolean - bounds = L.bounds(bounds); - - var min = this.min, - max = this.max, - min2 = bounds.min, - max2 = bounds.max, - xIntersects = (max2.x >= min.x) && (min2.x <= max.x), - yIntersects = (max2.y >= min.y) && (min2.y <= max.y); - - return xIntersects && yIntersects; - }, - - isValid: function () { - return !!(this.min && this.max); - } -}; - -L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) - if (!a || a instanceof L.Bounds) { - return a; - } - return new L.Bounds(a, b); -}; - - -/* - * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix. - */ - -L.Transformation = function (a, b, c, d) { - this._a = a; - this._b = b; - this._c = c; - this._d = d; -}; - -L.Transformation.prototype = { - transform: function (point, scale) { // (Point, Number) -> Point - return this._transform(point.clone(), scale); - }, - - // destructive transform (faster) - _transform: function (point, scale) { - scale = scale || 1; - point.x = scale * (this._a * point.x + this._b); - point.y = scale * (this._c * point.y + this._d); - return point; - }, - - untransform: function (point, scale) { - scale = scale || 1; - return new L.Point( - (point.x / scale - this._b) / this._a, - (point.y / scale - this._d) / this._c); - } -}; - - -/* - * L.DomUtil contains various utility functions for working with DOM. - */ - -L.DomUtil = { - get: function (id) { - return (typeof id === 'string' ? document.getElementById(id) : id); - }, - - getStyle: function (el, style) { - - var value = el.style[style]; - - if (!value && el.currentStyle) { - value = el.currentStyle[style]; - } - - if ((!value || value === 'auto') && document.defaultView) { - var css = document.defaultView.getComputedStyle(el, null); - value = css ? css[style] : null; - } - - return value === 'auto' ? null : value; - }, - - getViewportOffset: function (element) { - - var top = 0, - left = 0, - el = element, - docBody = document.body, - docEl = document.documentElement, - pos; - - do { - top += el.offsetTop || 0; - left += el.offsetLeft || 0; - - //add borders - top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0; - left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0; - - pos = L.DomUtil.getStyle(el, 'position'); - - if (el.offsetParent === docBody && pos === 'absolute') { break; } - - if (pos === 'fixed') { - top += docBody.scrollTop || docEl.scrollTop || 0; - left += docBody.scrollLeft || docEl.scrollLeft || 0; - break; - } - - if (pos === 'relative' && !el.offsetLeft) { - var width = L.DomUtil.getStyle(el, 'width'), - maxWidth = L.DomUtil.getStyle(el, 'max-width'), - r = el.getBoundingClientRect(); - - if (width !== 'none' || maxWidth !== 'none') { - left += r.left + el.clientLeft; - } - - //calculate full y offset since we're breaking out of the loop - top += r.top + (docBody.scrollTop || docEl.scrollTop || 0); - - break; - } - - el = el.offsetParent; - - } while (el); - - el = element; - - do { - if (el === docBody) { break; } - - top -= el.scrollTop || 0; - left -= el.scrollLeft || 0; - - el = el.parentNode; - } while (el); - - return new L.Point(left, top); - }, - - documentIsLtr: function () { - if (!L.DomUtil._docIsLtrCached) { - L.DomUtil._docIsLtrCached = true; - L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; - } - return L.DomUtil._docIsLtr; - }, - - create: function (tagName, className, container) { - - var el = document.createElement(tagName); - el.className = className; - - if (container) { - container.appendChild(el); - } - - return el; - }, - - hasClass: function (el, name) { - if (el.classList !== undefined) { - return el.classList.contains(name); - } - var className = L.DomUtil._getClass(el); - return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); - }, - - addClass: function (el, name) { - if (el.classList !== undefined) { - var classes = L.Util.splitWords(name); - for (var i = 0, len = classes.length; i < len; i++) { - el.classList.add(classes[i]); - } - } else if (!L.DomUtil.hasClass(el, name)) { - var className = L.DomUtil._getClass(el); - L.DomUtil._setClass(el, (className ? className + ' ' : '') + name); - } - }, - - removeClass: function (el, name) { - if (el.classList !== undefined) { - el.classList.remove(name); - } else { - L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' '))); - } - }, - - _setClass: function (el, name) { - if (el.className.baseVal === undefined) { - el.className = name; - } else { - // in case of SVG element - el.className.baseVal = name; - } - }, - - _getClass: function (el) { - return el.className.baseVal === undefined ? el.className : el.className.baseVal; - }, - - setOpacity: function (el, value) { - - if ('opacity' in el.style) { - el.style.opacity = value; - - } else if ('filter' in el.style) { - - var filter = false, - filterName = 'DXImageTransform.Microsoft.Alpha'; - - // filters collection throws an error if we try to retrieve a filter that doesn't exist - try { - filter = el.filters.item(filterName); - } catch (e) { - // don't set opacity to 1 if we haven't already set an opacity, - // it isn't needed and breaks transparent pngs. - if (value === 1) { return; } - } - - value = Math.round(value * 100); - - if (filter) { - filter.Enabled = (value !== 100); - filter.Opacity = value; - } else { - el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; - } - } - }, - - testProp: function (props) { - - var style = document.documentElement.style; - - for (var i = 0; i < props.length; i++) { - if (props[i] in style) { - return props[i]; - } - } - return false; - }, - - getTranslateString: function (point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - - var is3d = L.Browser.webkit3d, - open = 'translate' + (is3d ? '3d' : '') + '(', - close = (is3d ? ',0' : '') + ')'; - - return open + point.x + 'px,' + point.y + 'px' + close; - }, - - getScaleString: function (scale, origin) { - - var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), - scaleStr = ' scale(' + scale + ') '; - - return preTranslateStr + scaleStr; - }, - - setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) - - // jshint camelcase: false - el._leaflet_pos = point; - - if (!disable3D && L.Browser.any3d) { - el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); - } else { - el.style.left = point.x + 'px'; - el.style.top = point.y + 'px'; - } - }, - - getPosition: function (el) { - // this method is only used for elements previously positioned using setPosition, - // so it's safe to cache the position for performance - - // jshint camelcase: false - return el._leaflet_pos; - } -}; - - -// prefix style property names - -L.DomUtil.TRANSFORM = L.DomUtil.testProp( - ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); - -// webkitTransition comes first because some browser versions that drop vendor prefix don't do -// the same for the transitionend event, in particular the Android 4.1 stock browser - -L.DomUtil.TRANSITION = L.DomUtil.testProp( - ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); - -L.DomUtil.TRANSITION_END = - L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? - L.DomUtil.TRANSITION + 'End' : 'transitionend'; - -(function () { - if ('onselectstart' in document) { - L.extend(L.DomUtil, { - disableTextSelection: function () { - L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); - }, - - enableTextSelection: function () { - L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); - } - }); - } else { - var userSelectProperty = L.DomUtil.testProp( - ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); - - L.extend(L.DomUtil, { - disableTextSelection: function () { - if (userSelectProperty) { - var style = document.documentElement.style; - this._userSelect = style[userSelectProperty]; - style[userSelectProperty] = 'none'; - } - }, - - enableTextSelection: function () { - if (userSelectProperty) { - document.documentElement.style[userSelectProperty] = this._userSelect; - delete this._userSelect; - } - } - }); - } - - L.extend(L.DomUtil, { - disableImageDrag: function () { - L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); - }, - - enableImageDrag: function () { - L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); - } - }); -})(); - - -/* - * L.LatLng represents a geographical point with latitude and longitude coordinates. - */ - -L.LatLng = function (lat, lng, alt) { // (Number, Number, Number) - lat = parseFloat(lat); - lng = parseFloat(lng); - - if (isNaN(lat) || isNaN(lng)) { - throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); - } - - this.lat = lat; - this.lng = lng; - - if (alt !== undefined) { - this.alt = parseFloat(alt); - } -}; - -L.extend(L.LatLng, { - DEG_TO_RAD: Math.PI / 180, - RAD_TO_DEG: 180 / Math.PI, - MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check -}); - -L.LatLng.prototype = { - equals: function (obj) { // (LatLng) -> Boolean - if (!obj) { return false; } - - obj = L.latLng(obj); - - var margin = Math.max( - Math.abs(this.lat - obj.lat), - Math.abs(this.lng - obj.lng)); - - return margin <= L.LatLng.MAX_MARGIN; - }, - - toString: function (precision) { // (Number) -> String - return 'LatLng(' + - L.Util.formatNum(this.lat, precision) + ', ' + - L.Util.formatNum(this.lng, precision) + ')'; - }, - - // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula - // TODO move to projection code, LatLng shouldn't know about Earth - distanceTo: function (other) { // (LatLng) -> Number - other = L.latLng(other); - - var R = 6378137, // earth radius in meters - d2r = L.LatLng.DEG_TO_RAD, - dLat = (other.lat - this.lat) * d2r, - dLon = (other.lng - this.lng) * d2r, - lat1 = this.lat * d2r, - lat2 = other.lat * d2r, - sin1 = Math.sin(dLat / 2), - sin2 = Math.sin(dLon / 2); - - var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2); - - return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - }, - - wrap: function (a, b) { // (Number, Number) -> LatLng - var lng = this.lng; - - a = a || -180; - b = b || 180; - - lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a); - - return new L.LatLng(this.lat, lng); - } -}; - -L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number) - if (a instanceof L.LatLng) { - return a; - } - if (L.Util.isArray(a)) { - if (typeof a[0] === 'number' || typeof a[0] === 'string') { - return new L.LatLng(a[0], a[1], a[2]); - } else { - return null; - } - } - if (a === undefined || a === null) { - return a; - } - if (typeof a === 'object' && 'lat' in a) { - return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); - } - if (b === undefined) { - return null; - } - return new L.LatLng(a, b); -}; - - - -/* - * L.LatLngBounds represents a rectangular area on the map in geographical coordinates. - */ - -L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[]) - if (!southWest) { return; } - - var latlngs = northEast ? [southWest, northEast] : southWest; - - for (var i = 0, len = latlngs.length; i < len; i++) { - this.extend(latlngs[i]); - } -}; - -L.LatLngBounds.prototype = { - // extend the bounds to contain the given point or bounds - extend: function (obj) { // (LatLng) or (LatLngBounds) - if (!obj) { return this; } - - var latLng = L.latLng(obj); - if (latLng !== null) { - obj = latLng; - } else { - obj = L.latLngBounds(obj); - } - - if (obj instanceof L.LatLng) { - if (!this._southWest && !this._northEast) { - this._southWest = new L.LatLng(obj.lat, obj.lng); - this._northEast = new L.LatLng(obj.lat, obj.lng); - } else { - this._southWest.lat = Math.min(obj.lat, this._southWest.lat); - this._southWest.lng = Math.min(obj.lng, this._southWest.lng); - - this._northEast.lat = Math.max(obj.lat, this._northEast.lat); - this._northEast.lng = Math.max(obj.lng, this._northEast.lng); - } - } else if (obj instanceof L.LatLngBounds) { - this.extend(obj._southWest); - this.extend(obj._northEast); - } - return this; - }, - - // extend the bounds by a percentage - pad: function (bufferRatio) { // (Number) -> LatLngBounds - var sw = this._southWest, - ne = this._northEast, - heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, - widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; - - return new L.LatLngBounds( - new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), - new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); - }, - - getCenter: function () { // -> LatLng - return new L.LatLng( - (this._southWest.lat + this._northEast.lat) / 2, - (this._southWest.lng + this._northEast.lng) / 2); - }, - - getSouthWest: function () { - return this._southWest; - }, - - getNorthEast: function () { - return this._northEast; - }, - - getNorthWest: function () { - return new L.LatLng(this.getNorth(), this.getWest()); - }, - - getSouthEast: function () { - return new L.LatLng(this.getSouth(), this.getEast()); - }, - - getWest: function () { - return this._southWest.lng; - }, - - getSouth: function () { - return this._southWest.lat; - }, - - getEast: function () { - return this._northEast.lng; - }, - - getNorth: function () { - return this._northEast.lat; - }, - - contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean - if (typeof obj[0] === 'number' || obj instanceof L.LatLng) { - obj = L.latLng(obj); - } else { - obj = L.latLngBounds(obj); - } - - var sw = this._southWest, - ne = this._northEast, - sw2, ne2; - - if (obj instanceof L.LatLngBounds) { - sw2 = obj.getSouthWest(); - ne2 = obj.getNorthEast(); - } else { - sw2 = ne2 = obj; - } - - return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && - (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); - }, - - intersects: function (bounds) { // (LatLngBounds) - bounds = L.latLngBounds(bounds); - - var sw = this._southWest, - ne = this._northEast, - sw2 = bounds.getSouthWest(), - ne2 = bounds.getNorthEast(), - - latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), - lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); - - return latIntersects && lngIntersects; - }, - - toBBoxString: function () { - return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); - }, - - equals: function (bounds) { // (LatLngBounds) - if (!bounds) { return false; } - - bounds = L.latLngBounds(bounds); - - return this._southWest.equals(bounds.getSouthWest()) && - this._northEast.equals(bounds.getNorthEast()); - }, - - isValid: function () { - return !!(this._southWest && this._northEast); - } -}; - -//TODO International date line? - -L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) - if (!a || a instanceof L.LatLngBounds) { - return a; - } - return new L.LatLngBounds(a, b); -}; - - -/* - * L.Projection contains various geographical projections used by CRS classes. - */ - -L.Projection = {}; - - -/* - * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default. - */ - -L.Projection.SphericalMercator = { - MAX_LATITUDE: 85.0511287798, - - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - x = latlng.lng * d, - y = lat * d; - - y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - lng = point.x * d, - lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; - - return new L.LatLng(lat, lng); - } -}; - - -/* - * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple. - */ - -L.Projection.LonLat = { - project: function (latlng) { - return new L.Point(latlng.lng, latlng.lat); - }, - - unproject: function (point) { - return new L.LatLng(point.y, point.x); - } -}; - - -/* - * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet. - */ - -L.CRS = { - latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point - var projectedPoint = this.projection.project(latlng), - scale = this.scale(zoom); - - return this.transformation._transform(projectedPoint, scale); - }, - - pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng - var scale = this.scale(zoom), - untransformedPoint = this.transformation.untransform(point, scale); - - return this.projection.unproject(untransformedPoint); - }, - - project: function (latlng) { - return this.projection.project(latlng); - }, - - scale: function (zoom) { - return 256 * Math.pow(2, zoom); - }, - - getSize: function (zoom) { - var s = this.scale(zoom); - return L.point(s, s); - } -}; - - -/* - * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps. - */ - -L.CRS.Simple = L.extend({}, L.CRS, { - projection: L.Projection.LonLat, - transformation: new L.Transformation(1, 0, -1, 0), - - scale: function (zoom) { - return Math.pow(2, zoom); - } -}); - - -/* - * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping - * and is used by Leaflet by default. - */ - -L.CRS.EPSG3857 = L.extend({}, L.CRS, { - code: 'EPSG:3857', - - projection: L.Projection.SphericalMercator, - transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), - - project: function (latlng) { // (LatLng) -> Point - var projectedPoint = this.projection.project(latlng), - earthRadius = 6378137; - return projectedPoint.multiplyBy(earthRadius); - } -}); - -L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { - code: 'EPSG:900913' -}); - - -/* - * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists. - */ - -L.CRS.EPSG4326 = L.extend({}, L.CRS, { - code: 'EPSG:4326', - - projection: L.Projection.LonLat, - transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5) -}); - - -/* - * L.Map is the central class of the API - it is used to create a map. - */ - -L.Map = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - crs: L.CRS.EPSG3857, - - /* - center: LatLng, - zoom: Number, - layers: Array, - */ - - fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, - trackResize: true, - markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d - }, - - initialize: function (id, options) { // (HTMLElement or String, Object) - options = L.setOptions(this, options); - - - this._initContainer(id); - this._initLayout(); - - // hack for https://github.com/Leaflet/Leaflet/issues/1980 - this._onResize = L.bind(this._onResize, this); - - this._initEvents(); - - if (options.maxBounds) { - this.setMaxBounds(options.maxBounds); - } - - if (options.center && options.zoom !== undefined) { - this.setView(L.latLng(options.center), options.zoom, {reset: true}); - } - - this._handlers = []; - - this._layers = {}; - this._zoomBoundLayers = {}; - this._tileLayersNum = 0; - - this.callInitHooks(); - - this._addLayers(options.layers); - }, - - - // public methods that modify map state - - // replaced by animation-powered implementation in Map.PanAnimation.js - setView: function (center, zoom) { - zoom = zoom === undefined ? this.getZoom() : zoom; - this._resetView(L.latLng(center), this._limitZoom(zoom)); - return this; - }, - - setZoom: function (zoom, options) { - if (!this._loaded) { - this._zoom = this._limitZoom(zoom); - return this; - } - return this.setView(this.getCenter(), zoom, {zoom: options}); - }, - - zoomIn: function (delta, options) { - return this.setZoom(this._zoom + (delta || 1), options); - }, - - zoomOut: function (delta, options) { - return this.setZoom(this._zoom - (delta || 1), options); - }, - - setZoomAround: function (latlng, zoom, options) { - var scale = this.getZoomScale(zoom), - viewHalf = this.getSize().divideBy(2), - containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng), - - centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), - newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); - - return this.setView(newCenter, zoom, {zoom: options}); - }, - - fitBounds: function (bounds, options) { - - options = options || {}; - bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds); - - var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), - paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), - - zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); - - zoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom; - - var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), - - swPoint = this.project(bounds.getSouthWest(), zoom), - nePoint = this.project(bounds.getNorthEast(), zoom), - center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); - - return this.setView(center, zoom, options); - }, - - fitWorld: function (options) { - return this.fitBounds([[-90, -180], [90, 180]], options); - }, - - panTo: function (center, options) { // (LatLng) - return this.setView(center, this._zoom, {pan: options}); - }, - - panBy: function (offset) { // (Point) - // replaced with animated panBy in Map.PanAnimation.js - this.fire('movestart'); - - this._rawPanBy(L.point(offset)); - - this.fire('move'); - return this.fire('moveend'); - }, - - setMaxBounds: function (bounds) { - bounds = L.latLngBounds(bounds); - - this.options.maxBounds = bounds; - - if (!bounds) { - return this.off('moveend', this._panInsideMaxBounds, this); - } - - if (this._loaded) { - this._panInsideMaxBounds(); - } - - return this.on('moveend', this._panInsideMaxBounds, this); - }, - - panInsideBounds: function (bounds, options) { - var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, bounds); - - if (center.equals(newCenter)) { return this; } - - return this.panTo(newCenter, options); - }, - - addLayer: function (layer) { - // TODO method is too big, refactor - - var id = L.stamp(layer); - - if (this._layers[id]) { return this; } - - this._layers[id] = layer; - - // TODO getMaxZoom, getMinZoom in ILayer (instead of options) - if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { - this._zoomBoundLayers[id] = layer; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor!!! - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum++; - this._tileLayersToLoad++; - layer.on('load', this._onTileLayerLoad, this); - } - - if (this._loaded) { - this._layerAdd(layer); - } - - return this; - }, - - removeLayer: function (layer) { - var id = L.stamp(layer); - - if (!this._layers[id]) { return this; } - - if (this._loaded) { - layer.onRemove(this); - } - - delete this._layers[id]; - - if (this._loaded) { - this.fire('layerremove', {layer: layer}); - } - - if (this._zoomBoundLayers[id]) { - delete this._zoomBoundLayers[id]; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum--; - this._tileLayersToLoad--; - layer.off('load', this._onTileLayerLoad, this); - } - - return this; - }, - - hasLayer: function (layer) { - if (!layer) { return false; } - - return (L.stamp(layer) in this._layers); - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - - invalidateSize: function (options) { - if (!this._loaded) { return this; } - - options = L.extend({ - animate: false, - pan: true - }, options === true ? {animate: true} : options); - - var oldSize = this.getSize(); - this._sizeChanged = true; - this._initialCenter = null; - - var newSize = this.getSize(), - oldCenter = oldSize.divideBy(2).round(), - newCenter = newSize.divideBy(2).round(), - offset = oldCenter.subtract(newCenter); - - if (!offset.x && !offset.y) { return this; } - - if (options.animate && options.pan) { - this.panBy(offset); - - } else { - if (options.pan) { - this._rawPanBy(offset); - } - - this.fire('move'); - - if (options.debounceMoveend) { - clearTimeout(this._sizeTimer); - this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); - } else { - this.fire('moveend'); - } - } - - return this.fire('resize', { - oldSize: oldSize, - newSize: newSize - }); - }, - - // TODO handler.addTo - addHandler: function (name, HandlerClass) { - if (!HandlerClass) { return this; } - - var handler = this[name] = new HandlerClass(this); - - this._handlers.push(handler); - - if (this.options[name]) { - handler.enable(); - } - - return this; - }, - - remove: function () { - if (this._loaded) { - this.fire('unload'); - } - - this._initEvents('off'); - - try { - // throws error in IE6-8 - delete this._container._leaflet; - } catch (e) { - this._container._leaflet = undefined; - } - - this._clearPanes(); - if (this._clearControlPos) { - this._clearControlPos(); - } - - this._clearHandlers(); - - return this; - }, - - - // public methods for getting map state - - getCenter: function () { // (Boolean) -> LatLng - this._checkIfLoaded(); - - if (this._initialCenter && !this._moved()) { - return this._initialCenter; - } - return this.layerPointToLatLng(this._getCenterLayerPoint()); - }, - - getZoom: function () { - return this._zoom; - }, - - getBounds: function () { - var bounds = this.getPixelBounds(), - sw = this.unproject(bounds.getBottomLeft()), - ne = this.unproject(bounds.getTopRight()); - - return new L.LatLngBounds(sw, ne); - }, - - getMinZoom: function () { - return this.options.minZoom === undefined ? - (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) : - this.options.minZoom; - }, - - getMaxZoom: function () { - return this.options.maxZoom === undefined ? - (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : - this.options.maxZoom; - }, - - getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number - bounds = L.latLngBounds(bounds); - - var zoom = this.getMinZoom() - (inside ? 1 : 0), - maxZoom = this.getMaxZoom(), - size = this.getSize(), - - nw = bounds.getNorthWest(), - se = bounds.getSouthEast(), - - zoomNotFound = true, - boundsSize; - - padding = L.point(padding || [0, 0]); - - do { - zoom++; - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); - zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; - - } while (zoomNotFound && zoom <= maxZoom); - - if (zoomNotFound && inside) { - return null; - } - - return inside ? zoom : zoom - 1; - }, - - getSize: function () { - if (!this._size || this._sizeChanged) { - this._size = new L.Point( - this._container.clientWidth, - this._container.clientHeight); - - this._sizeChanged = false; - } - return this._size.clone(); - }, - - getPixelBounds: function () { - var topLeftPoint = this._getTopLeftPoint(); - return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); - }, - - getPixelOrigin: function () { - this._checkIfLoaded(); - return this._initialTopLeftPoint; - }, - - getPanes: function () { - return this._panes; - }, - - getContainer: function () { - return this._container; - }, - - - // TODO replace with universal implementation after refactoring projections - - getZoomScale: function (toZoom) { - var crs = this.options.crs; - return crs.scale(toZoom) / crs.scale(this._zoom); - }, - - getScaleZoom: function (scale) { - return this._zoom + (Math.log(scale) / Math.LN2); - }, - - - // conversion methods - - project: function (latlng, zoom) { // (LatLng[, Number]) -> Point - zoom = zoom === undefined ? this._zoom : zoom; - return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); - }, - - unproject: function (point, zoom) { // (Point[, Number]) -> LatLng - zoom = zoom === undefined ? this._zoom : zoom; - return this.options.crs.pointToLatLng(L.point(point), zoom); - }, - - layerPointToLatLng: function (point) { // (Point) - var projectedPoint = L.point(point).add(this.getPixelOrigin()); - return this.unproject(projectedPoint); - }, - - latLngToLayerPoint: function (latlng) { // (LatLng) - var projectedPoint = this.project(L.latLng(latlng))._round(); - return projectedPoint._subtract(this.getPixelOrigin()); - }, - - containerPointToLayerPoint: function (point) { // (Point) - return L.point(point).subtract(this._getMapPanePos()); - }, - - layerPointToContainerPoint: function (point) { // (Point) - return L.point(point).add(this._getMapPanePos()); - }, - - containerPointToLatLng: function (point) { - var layerPoint = this.containerPointToLayerPoint(L.point(point)); - return this.layerPointToLatLng(layerPoint); - }, - - latLngToContainerPoint: function (latlng) { - return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); - }, - - mouseEventToContainerPoint: function (e) { // (MouseEvent) - return L.DomEvent.getMousePosition(e, this._container); - }, - - mouseEventToLayerPoint: function (e) { // (MouseEvent) - return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); - }, - - mouseEventToLatLng: function (e) { // (MouseEvent) - return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); - }, - - - // map initialization methods - - _initContainer: function (id) { - var container = this._container = L.DomUtil.get(id); - - if (!container) { - throw new Error('Map container not found.'); - } else if (container._leaflet) { - throw new Error('Map container is already initialized.'); - } - - container._leaflet = true; - }, - - _initLayout: function () { - var container = this._container; - - L.DomUtil.addClass(container, 'leaflet-container' + - (L.Browser.touch ? ' leaflet-touch' : '') + - (L.Browser.retina ? ' leaflet-retina' : '') + - (L.Browser.ielt9 ? ' leaflet-oldie' : '') + - (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); - - var position = L.DomUtil.getStyle(container, 'position'); - - if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { - container.style.position = 'relative'; - } - - this._initPanes(); - - if (this._initControlPos) { - this._initControlPos(); - } - }, - - _initPanes: function () { - var panes = this._panes = {}; - - this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container); - - this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane); - panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane); - panes.shadowPane = this._createPane('leaflet-shadow-pane'); - panes.overlayPane = this._createPane('leaflet-overlay-pane'); - panes.markerPane = this._createPane('leaflet-marker-pane'); - panes.popupPane = this._createPane('leaflet-popup-pane'); - - var zoomHide = ' leaflet-zoom-hide'; - - if (!this.options.markerZoomAnimation) { - L.DomUtil.addClass(panes.markerPane, zoomHide); - L.DomUtil.addClass(panes.shadowPane, zoomHide); - L.DomUtil.addClass(panes.popupPane, zoomHide); - } - }, - - _createPane: function (className, container) { - return L.DomUtil.create('div', className, container || this._panes.objectsPane); - }, - - _clearPanes: function () { - this._container.removeChild(this._mapPane); - }, - - _addLayers: function (layers) { - layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; - - for (var i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - }, - - - // private methods that modify map state - - _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { - - var zoomChanged = (this._zoom !== zoom); - - if (!afterZoomAnim) { - this.fire('movestart'); - - if (zoomChanged) { - this.fire('zoomstart'); - } - } - - this._zoom = zoom; - this._initialCenter = center; - - this._initialTopLeftPoint = this._getNewTopLeftPoint(center); - - if (!preserveMapOffset) { - L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - } else { - this._initialTopLeftPoint._add(this._getMapPanePos()); - } - - this._tileLayersToLoad = this._tileLayersNum; - - var loading = !this._loaded; - this._loaded = true; - - this.fire('viewreset', {hard: !preserveMapOffset}); - - if (loading) { - this.fire('load'); - this.eachLayer(this._layerAdd, this); - } - - this.fire('move'); - - if (zoomChanged || afterZoomAnim) { - this.fire('zoomend'); - } - - this.fire('moveend', {hard: !preserveMapOffset}); - }, - - _rawPanBy: function (offset) { - L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); - }, - - _getZoomSpan: function () { - return this.getMaxZoom() - this.getMinZoom(); - }, - - _updateZoomLevels: function () { - var i, - minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); - - for (i in this._zoomBoundLayers) { - var layer = this._zoomBoundLayers[i]; - if (!isNaN(layer.options.minZoom)) { - minZoom = Math.min(minZoom, layer.options.minZoom); - } - if (!isNaN(layer.options.maxZoom)) { - maxZoom = Math.max(maxZoom, layer.options.maxZoom); - } - } - - if (i === undefined) { // we have no tilelayers - this._layersMaxZoom = this._layersMinZoom = undefined; - } else { - this._layersMaxZoom = maxZoom; - this._layersMinZoom = minZoom; - } - - if (oldZoomSpan !== this._getZoomSpan()) { - this.fire('zoomlevelschange'); - } - }, - - _panInsideMaxBounds: function () { - this.panInsideBounds(this.options.maxBounds); - }, - - _checkIfLoaded: function () { - if (!this._loaded) { - throw new Error('Set map center and zoom first.'); - } - }, - - // map events - - _initEvents: function (onOff) { - if (!L.DomEvent) { return; } - - onOff = onOff || 'on'; - - L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', - 'mouseleave', 'mousemove', 'contextmenu'], - i, len; - - for (i = 0, len = events.length; i < len; i++) { - L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this); - } - - if (this.options.trackResize) { - L.DomEvent[onOff](window, 'resize', this._onResize, this); - } - }, - - _onResize: function () { - L.Util.cancelAnimFrame(this._resizeRequest); - this._resizeRequest = L.Util.requestAnimFrame( - function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); - }, - - _onMouseClick: function (e) { - if (!this._loaded || (!e._simulated && - ((this.dragging && this.dragging.moved()) || - (this.boxZoom && this.boxZoom.moved()))) || - L.DomEvent._skipped(e)) { return; } - - this.fire('preclick'); - this._fireMouseEvent(e); - }, - - _fireMouseEvent: function (e) { - if (!this._loaded || L.DomEvent._skipped(e)) { return; } - - var type = e.type; - - type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type)); - - if (!this.hasEventListeners(type)) { return; } - - if (type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - - var containerPoint = this.mouseEventToContainerPoint(e), - layerPoint = this.containerPointToLayerPoint(containerPoint), - latlng = this.layerPointToLatLng(layerPoint); - - this.fire(type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); - }, - - _onTileLayerLoad: function () { - this._tileLayersToLoad--; - if (this._tileLayersNum && !this._tileLayersToLoad) { - this.fire('tilelayersload'); - } - }, - - _clearHandlers: function () { - for (var i = 0, len = this._handlers.length; i < len; i++) { - this._handlers[i].disable(); - } - }, - - whenReady: function (callback, context) { - if (this._loaded) { - callback.call(context || this, this); - } else { - this.on('load', callback, context); - } - return this; - }, - - _layerAdd: function (layer) { - layer.onAdd(this); - this.fire('layeradd', {layer: layer}); - }, - - - // private methods for getting map state - - _getMapPanePos: function () { - return L.DomUtil.getPosition(this._mapPane); - }, - - _moved: function () { - var pos = this._getMapPanePos(); - return pos && !pos.equals([0, 0]); - }, - - _getTopLeftPoint: function () { - return this.getPixelOrigin().subtract(this._getMapPanePos()); - }, - - _getNewTopLeftPoint: function (center, zoom) { - var viewHalf = this.getSize()._divideBy(2); - // TODO round on display, not calculation to increase precision? - return this.project(center, zoom)._subtract(viewHalf)._round(); - }, - - _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) { - var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos()); - return this.project(latlng, newZoom)._subtract(topLeft); - }, - - // layer point of the current center - _getCenterLayerPoint: function () { - return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); - }, - - // offset of the specified place to the current center in pixels - _getCenterOffset: function (latlng) { - return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); - }, - - // adjust center for view to get inside bounds - _limitCenter: function (center, zoom, bounds) { - - if (!bounds) { return center; } - - var centerPoint = this.project(center, zoom), - viewHalf = this.getSize().divideBy(2), - viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), - offset = this._getBoundsOffset(viewBounds, bounds, zoom); - - return this.unproject(centerPoint.add(offset), zoom); - }, - - // adjust offset for view to get inside bounds - _limitOffset: function (offset, bounds) { - if (!bounds) { return offset; } - - var viewBounds = this.getPixelBounds(), - newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset)); - - return offset.add(this._getBoundsOffset(newBounds, bounds)); - }, - - // returns offset needed for pxBounds to get inside maxBounds at a specified zoom - _getBoundsOffset: function (pxBounds, maxBounds, zoom) { - var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min), - seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max), - - dx = this._rebound(nwOffset.x, -seOffset.x), - dy = this._rebound(nwOffset.y, -seOffset.y); - - return new L.Point(dx, dy); - }, - - _rebound: function (left, right) { - return left + right > 0 ? - Math.round(left - right) / 2 : - Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right)); - }, - - _limitZoom: function (zoom) { - var min = this.getMinZoom(), - max = this.getMaxZoom(); - - return Math.max(min, Math.min(max, zoom)); - } -}); - -L.map = function (id, options) { - return new L.Map(id, options); -}; - - -/* - * Mercator projection that takes into account that the Earth is not a perfect sphere. - * Less popular than spherical mercator; used by projections like EPSG:3395. - */ - -L.Projection.Mercator = { - MAX_LATITUDE: 85.0840591556, - - R_MINOR: 6356752.314245179, - R_MAJOR: 6378137, - - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - r = this.R_MAJOR, - r2 = this.R_MINOR, - x = latlng.lng * d * r, - y = lat * d, - tmp = r2 / r, - eccent = Math.sqrt(1.0 - tmp * tmp), - con = eccent * Math.sin(y); - - con = Math.pow((1 - con) / (1 + con), eccent * 0.5); - - var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con; - y = -r * Math.log(ts); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - r = this.R_MAJOR, - r2 = this.R_MINOR, - lng = point.x * d / r, - tmp = r2 / r, - eccent = Math.sqrt(1 - (tmp * tmp)), - ts = Math.exp(- point.y / r), - phi = (Math.PI / 2) - 2 * Math.atan(ts), - numIter = 15, - tol = 1e-7, - i = numIter, - dphi = 0.1, - con; - - while ((Math.abs(dphi) > tol) && (--i > 0)) { - con = eccent * Math.sin(phi); - dphi = (Math.PI / 2) - 2 * Math.atan(ts * - Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi; - phi += dphi; - } - - return new L.LatLng(phi * d, lng); - } -}; - - - -L.CRS.EPSG3395 = L.extend({}, L.CRS, { - code: 'EPSG:3395', - - projection: L.Projection.Mercator, - - transformation: (function () { - var m = L.Projection.Mercator, - r = m.R_MAJOR, - scale = 0.5 / (Math.PI * r); - - return new L.Transformation(scale, 0.5, -scale, 0.5); - }()) -}); - - -/* - * L.TileLayer is used for standard xyz-numbered tile layers. - */ - -L.TileLayer = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - minZoom: 0, - maxZoom: 18, - tileSize: 256, - subdomains: 'abc', - errorTileUrl: '', - attribution: '', - zoomOffset: 0, - opacity: 1, - /* - maxNativeZoom: null, - zIndex: null, - tms: false, - continuousWorld: false, - noWrap: false, - zoomReverse: false, - detectRetina: false, - reuseTiles: false, - bounds: false, - */ - unloadInvisibleTiles: L.Browser.mobile, - updateWhenIdle: L.Browser.mobile - }, - - initialize: function (url, options) { - options = L.setOptions(this, options); - - // detecting retina displays, adjusting tileSize and zoom levels - if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { - - options.tileSize = Math.floor(options.tileSize / 2); - options.zoomOffset++; - - if (options.minZoom > 0) { - options.minZoom--; - } - this.options.maxZoom--; - } - - if (options.bounds) { - options.bounds = L.latLngBounds(options.bounds); - } - - this._url = url; - - var subdomains = this.options.subdomains; - - if (typeof subdomains === 'string') { - this.options.subdomains = subdomains.split(''); - } - }, - - onAdd: function (map) { - this._map = map; - this._animated = map._zoomAnimated; - - // create a container div for tiles - this._initContainer(); - - // set up events - map.on({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.on({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); - map.on('move', this._limitedUpdate, this); - } - - this._reset(); - this._update(); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - this._container.parentNode.removeChild(this._container); - - map.off({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.off({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - map.off('move', this._limitedUpdate, this); - } - - this._container = null; - this._map = null; - }, - - bringToFront: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.appendChild(this._container); - this._setAutoZIndex(pane, Math.max); - } - - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.insertBefore(this._container, pane.firstChild); - this._setAutoZIndex(pane, Math.min); - } - - return this; - }, - - getAttribution: function () { - return this.options.attribution; - }, - - getContainer: function () { - return this._container; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - setZIndex: function (zIndex) { - this.options.zIndex = zIndex; - this._updateZIndex(); - - return this; - }, - - setUrl: function (url, noRedraw) { - this._url = url; - - if (!noRedraw) { - this.redraw(); - } - - return this; - }, - - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - return this; - }, - - _updateZIndex: function () { - if (this._container && this.options.zIndex !== undefined) { - this._container.style.zIndex = this.options.zIndex; - } - }, - - _setAutoZIndex: function (pane, compare) { - - var layers = pane.children, - edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min - zIndex, i, len; - - for (i = 0, len = layers.length; i < len; i++) { - - if (layers[i] !== this._container) { - zIndex = parseInt(layers[i].style.zIndex, 10); - - if (!isNaN(zIndex)) { - edgeZIndex = compare(edgeZIndex, zIndex); - } - } - } - - this.options.zIndex = this._container.style.zIndex = - (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); - }, - - _updateOpacity: function () { - var i, - tiles = this._tiles; - - if (L.Browser.ielt9) { - for (i in tiles) { - L.DomUtil.setOpacity(tiles[i], this.options.opacity); - } - } else { - L.DomUtil.setOpacity(this._container, this.options.opacity); - } - }, - - _initContainer: function () { - var tilePane = this._map._panes.tilePane; - - if (!this._container) { - this._container = L.DomUtil.create('div', 'leaflet-layer'); - - this._updateZIndex(); - - if (this._animated) { - var className = 'leaflet-tile-container'; - - this._bgBuffer = L.DomUtil.create('div', className, this._container); - this._tileContainer = L.DomUtil.create('div', className, this._container); - - } else { - this._tileContainer = this._container; - } - - tilePane.appendChild(this._container); - - if (this.options.opacity < 1) { - this._updateOpacity(); - } - } - }, - - _reset: function (e) { - for (var key in this._tiles) { - this.fire('tileunload', {tile: this._tiles[key]}); - } - - this._tiles = {}; - this._tilesToLoad = 0; - - if (this.options.reuseTiles) { - this._unusedTiles = []; - } - - this._tileContainer.innerHTML = ''; - - if (this._animated && e && e.hard) { - this._clearBgBuffer(); - } - - this._initContainer(); - }, - - _getTileSize: function () { - var map = this._map, - zoom = map.getZoom() + this.options.zoomOffset, - zoomN = this.options.maxNativeZoom, - tileSize = this.options.tileSize; - - if (zoomN && zoom > zoomN) { - tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); - } - - return tileSize; - }, - - _update: function () { - - if (!this._map) { return; } - - var map = this._map, - bounds = map.getPixelBounds(), - zoom = map.getZoom(), - tileSize = this._getTileSize(); - - if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { - return; - } - - var tileBounds = L.bounds( - bounds.min.divideBy(tileSize)._floor(), - bounds.max.divideBy(tileSize)._floor()); - - this._addTilesFromCenterOut(tileBounds); - - if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { - this._removeOtherTiles(tileBounds); - } - }, - - _addTilesFromCenterOut: function (bounds) { - var queue = [], - center = bounds.getCenter(); - - var j, i, point; - - for (j = bounds.min.y; j <= bounds.max.y; j++) { - for (i = bounds.min.x; i <= bounds.max.x; i++) { - point = new L.Point(i, j); - - if (this._tileShouldBeLoaded(point)) { - queue.push(point); - } - } - } - - var tilesToLoad = queue.length; - - if (tilesToLoad === 0) { return; } - - // load tiles in order of their distance to center - queue.sort(function (a, b) { - return a.distanceTo(center) - b.distanceTo(center); - }); - - var fragment = document.createDocumentFragment(); - - // if its the first batch of tiles to load - if (!this._tilesToLoad) { - this.fire('loading'); - } - - this._tilesToLoad += tilesToLoad; - - for (i = 0; i < tilesToLoad; i++) { - this._addTile(queue[i], fragment); - } - - this._tileContainer.appendChild(fragment); - }, - - _tileShouldBeLoaded: function (tilePoint) { - if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { - return false; // already loaded - } - - var options = this.options; - - if (!options.continuousWorld) { - var limit = this._getWrapTileNum(); - - // don't load if exceeds world bounds - if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) || - tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; } - } - - if (options.bounds) { - var tileSize = this._getTileSize(), - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - nw = this._map.unproject(nwPoint), - se = this._map.unproject(sePoint); - - // TODO temporary hack, will be removed after refactoring projections - // https://github.com/Leaflet/Leaflet/issues/1618 - if (!options.continuousWorld && !options.noWrap) { - nw = nw.wrap(); - se = se.wrap(); - } - - if (!options.bounds.intersects([nw, se])) { return false; } - } - - return true; - }, - - _removeOtherTiles: function (bounds) { - var kArr, x, y, key; - - for (key in this._tiles) { - kArr = key.split(':'); - x = parseInt(kArr[0], 10); - y = parseInt(kArr[1], 10); - - // remove tile if it's out of bounds - if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { - this._removeTile(key); - } - } - }, - - _removeTile: function (key) { - var tile = this._tiles[key]; - - this.fire('tileunload', {tile: tile, url: tile.src}); - - if (this.options.reuseTiles) { - L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); - this._unusedTiles.push(tile); - - } else if (tile.parentNode === this._tileContainer) { - this._tileContainer.removeChild(tile); - } - - // for https://github.com/CloudMade/Leaflet/issues/137 - if (!L.Browser.android) { - tile.onload = null; - tile.src = L.Util.emptyImageUrl; - } - - delete this._tiles[key]; - }, - - _addTile: function (tilePoint, container) { - var tilePos = this._getTilePos(tilePoint); - - // get unused tile - or create a new tile - var tile = this._getTile(); - - /* - Chrome 20 layouts much faster with top/left (verify with timeline, frames) - Android 4 browser has display issues with top/left and requires transform instead - (other browsers don't currently care) - see debug/hacks/jitter.html for an example - */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome); - - this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; - - this._loadTile(tile, tilePoint); - - if (tile.parentNode !== this._tileContainer) { - container.appendChild(tile); - } - }, - - _getZoomForUrl: function () { - - var options = this.options, - zoom = this._map.getZoom(); - - if (options.zoomReverse) { - zoom = options.maxZoom - zoom; - } - - zoom += options.zoomOffset; - - return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom; - }, - - _getTilePos: function (tilePoint) { - var origin = this._map.getPixelOrigin(), - tileSize = this._getTileSize(); - - return tilePoint.multiplyBy(tileSize).subtract(origin); - }, - - // image-specific code (override to implement e.g. Canvas or SVG tile layer) - - getTileUrl: function (tilePoint) { - return L.Util.template(this._url, L.extend({ - s: this._getSubdomain(tilePoint), - z: tilePoint.z, - x: tilePoint.x, - y: tilePoint.y - }, this.options)); - }, - - _getWrapTileNum: function () { - var crs = this._map.options.crs, - size = crs.getSize(this._map.getZoom()); - return size.divideBy(this._getTileSize())._floor(); - }, - - _adjustTilePoint: function (tilePoint) { - - var limit = this._getWrapTileNum(); - - // wrap tile coordinates - if (!this.options.continuousWorld && !this.options.noWrap) { - tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x; - } - - if (this.options.tms) { - tilePoint.y = limit.y - tilePoint.y - 1; - } - - tilePoint.z = this._getZoomForUrl(); - }, - - _getSubdomain: function (tilePoint) { - var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; - return this.options.subdomains[index]; - }, - - _getTile: function () { - if (this.options.reuseTiles && this._unusedTiles.length > 0) { - var tile = this._unusedTiles.pop(); - this._resetTile(tile); - return tile; - } - return this._createTile(); - }, - - // Override if data stored on a tile needs to be cleaned up before reuse - _resetTile: function (/*tile*/) {}, - - _createTile: function () { - var tile = L.DomUtil.create('img', 'leaflet-tile'); - tile.style.width = tile.style.height = this._getTileSize() + 'px'; - tile.galleryimg = 'no'; - - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - - if (L.Browser.ielt9 && this.options.opacity !== undefined) { - L.DomUtil.setOpacity(tile, this.options.opacity); - } - // without this hack, tiles disappear after zoom on Chrome for Android - // https://github.com/Leaflet/Leaflet/issues/2078 - if (L.Browser.mobileWebkit3d) { - tile.style.WebkitBackfaceVisibility = 'hidden'; - } - return tile; - }, - - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile.onload = this._tileOnLoad; - tile.onerror = this._tileOnError; - - this._adjustTilePoint(tilePoint); - tile.src = this.getTileUrl(tilePoint); - - this.fire('tileloadstart', { - tile: tile, - url: tile.src - }); - }, - - _tileLoaded: function () { - this._tilesToLoad--; - - if (this._animated) { - L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated'); - } - - if (!this._tilesToLoad) { - this.fire('load'); - - if (this._animated) { - // clear scaled tiles after all new tiles are loaded (for performance) - clearTimeout(this._clearBgBufferTimer); - this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); - } - } - }, - - _tileOnLoad: function () { - var layer = this._layer; - - //Only if we are loading an actual image - if (this.src !== L.Util.emptyImageUrl) { - L.DomUtil.addClass(this, 'leaflet-tile-loaded'); - - layer.fire('tileload', { - tile: this, - url: this.src - }); - } - - layer._tileLoaded(); - }, - - _tileOnError: function () { - var layer = this._layer; - - layer.fire('tileerror', { - tile: this, - url: this.src - }); - - var newUrl = layer.options.errorTileUrl; - if (newUrl) { - this.src = newUrl; - } - - layer._tileLoaded(); - } -}); - -L.tileLayer = function (url, options) { - return new L.TileLayer(url, options); -}; - - -/* - * L.TileLayer.WMS is used for putting WMS tile layers on the map. - */ - -L.TileLayer.WMS = L.TileLayer.extend({ - - defaultWmsParams: { - service: 'WMS', - request: 'GetMap', - version: '1.1.1', - layers: '', - styles: '', - format: 'image/jpeg', - transparent: false - }, - - initialize: function (url, options) { // (String, Object) - - this._url = url; - - var wmsParams = L.extend({}, this.defaultWmsParams), - tileSize = options.tileSize || this.options.tileSize; - - if (options.detectRetina && L.Browser.retina) { - wmsParams.width = wmsParams.height = tileSize * 2; - } else { - wmsParams.width = wmsParams.height = tileSize; - } - - for (var i in options) { - // all keys that are not TileLayer options go to WMS params - if (!this.options.hasOwnProperty(i) && i !== 'crs') { - wmsParams[i] = options[i]; - } - } - - this.wmsParams = wmsParams; - - L.setOptions(this, options); - }, - - onAdd: function (map) { - - this._crs = this.options.crs || map.options.crs; - - this._wmsVersion = parseFloat(this.wmsParams.version); - - var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; - this.wmsParams[projectionKey] = this._crs.code; - - L.TileLayer.prototype.onAdd.call(this, map); - }, - - getTileUrl: function (tilePoint) { // (Point, Number) -> String - - var map = this._map, - tileSize = this.options.tileSize, - - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - - nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)), - se = this._crs.project(map.unproject(sePoint, tilePoint.z)), - bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ? - [se.y, nw.x, nw.y, se.x].join(',') : - [nw.x, se.y, se.x, nw.y].join(','), - - url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); - - return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; - }, - - setParams: function (params, noRedraw) { - - L.extend(this.wmsParams, params); - - if (!noRedraw) { - this.redraw(); - } - - return this; - } -}); - -L.tileLayer.wms = function (url, options) { - return new L.TileLayer.WMS(url, options); -}; - - -/* - * L.TileLayer.Canvas is a class that you can use as a base for creating - * dynamically drawn Canvas-based tile layers. - */ - -L.TileLayer.Canvas = L.TileLayer.extend({ - options: { - async: false - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - - for (var i in this._tiles) { - this._redrawTile(this._tiles[i]); - } - return this; - }, - - _redrawTile: function (tile) { - this.drawTile(tile, tile._tilePoint, this._map._zoom); - }, - - _createTile: function () { - var tile = L.DomUtil.create('canvas', 'leaflet-tile'); - tile.width = tile.height = this.options.tileSize; - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - return tile; - }, - - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile._tilePoint = tilePoint; - - this._redrawTile(tile); - - if (!this.options.async) { - this.tileDrawn(tile); - } - }, - - drawTile: function (/*tile, tilePoint*/) { - // override with rendering code - }, - - tileDrawn: function (tile) { - this._tileOnLoad.call(tile); - } -}); - - -L.tileLayer.canvas = function (options) { - return new L.TileLayer.Canvas(options); -}; - - -/* - * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). - */ - -L.ImageOverlay = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - opacity: 1 - }, - - initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) - this._url = url; - this._bounds = L.latLngBounds(bounds); - - L.setOptions(this, options); - }, - - onAdd: function (map) { - this._map = map; - - if (!this._image) { - this._initImage(); - } - - map._panes.overlayPane.appendChild(this._image); - - map.on('viewreset', this._reset, this); - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - - this._reset(); - }, - - onRemove: function (map) { - map.getPanes().overlayPane.removeChild(this._image); - - map.off('viewreset', this._reset, this); - - if (map.options.zoomAnimation) { - map.off('zoomanim', this._animateZoom, this); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - this._updateOpacity(); - return this; - }, - - // TODO remove bringToFront/bringToBack duplication from TileLayer/Path - bringToFront: function () { - if (this._image) { - this._map._panes.overlayPane.appendChild(this._image); - } - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.overlayPane; - if (this._image) { - pane.insertBefore(this._image, pane.firstChild); - } - return this; - }, - - setUrl: function (url) { - this._url = url; - this._image.src = this._url; - }, - - getAttribution: function () { - return this.options.attribution; - }, - - _initImage: function () { - this._image = L.DomUtil.create('img', 'leaflet-image-layer'); - - if (this._map.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); - } else { - L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); - } - - this._updateOpacity(); - - //TODO createImage util method to remove duplication - L.extend(this._image, { - galleryimg: 'no', - onselectstart: L.Util.falseFn, - onmousemove: L.Util.falseFn, - onload: L.bind(this._onImageLoad, this), - src: this._url - }); - }, - - _animateZoom: function (e) { - var map = this._map, - image = this._image, - scale = map.getZoomScale(e.zoom), - nw = this._bounds.getNorthWest(), - se = this._bounds.getSouthEast(), - - topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), - size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), - origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); - - image.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; - }, - - _reset: function () { - var image = this._image, - topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()), - size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft); - - L.DomUtil.setPosition(image, topLeft); - - image.style.width = size.x + 'px'; - image.style.height = size.y + 'px'; - }, - - _onImageLoad: function () { - this.fire('load'); - }, - - _updateOpacity: function () { - L.DomUtil.setOpacity(this._image, this.options.opacity); - } -}); - -L.imageOverlay = function (url, bounds, options) { - return new L.ImageOverlay(url, bounds, options); -}; - - -/* - * L.Icon is an image-based icon class that you can use with L.Marker for custom markers. - */ - -L.Icon = L.Class.extend({ - options: { - /* - iconUrl: (String) (required) - iconRetinaUrl: (String) (optional, used for retina devices if detected) - iconSize: (Point) (can be set through CSS) - iconAnchor: (Point) (centered by default, can be set in CSS with negative margins) - popupAnchor: (Point) (if not specified, popup opens in the anchor point) - shadowUrl: (String) (no shadow by default) - shadowRetinaUrl: (String) (optional, used for retina devices if detected) - shadowSize: (Point) - shadowAnchor: (Point) - */ - className: '' - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - createIcon: function (oldIcon) { - return this._createIcon('icon', oldIcon); - }, - - createShadow: function (oldIcon) { - return this._createIcon('shadow', oldIcon); - }, - - _createIcon: function (name, oldIcon) { - var src = this._getIconUrl(name); - - if (!src) { - if (name === 'icon') { - throw new Error('iconUrl not set in Icon options (see the docs).'); - } - return null; - } - - var img; - if (!oldIcon || oldIcon.tagName !== 'IMG') { - img = this._createImg(src); - } else { - img = this._createImg(src, oldIcon); - } - this._setIconStyles(img, name); - - return img; - }, - - _setIconStyles: function (img, name) { - var options = this.options, - size = L.point(options[name + 'Size']), - anchor; - - if (name === 'shadow') { - anchor = L.point(options.shadowAnchor || options.iconAnchor); - } else { - anchor = L.point(options.iconAnchor); - } - - if (!anchor && size) { - anchor = size.divideBy(2, true); - } - - img.className = 'leaflet-marker-' + name + ' ' + options.className; - - if (anchor) { - img.style.marginLeft = (-anchor.x) + 'px'; - img.style.marginTop = (-anchor.y) + 'px'; - } - - if (size) { - img.style.width = size.x + 'px'; - img.style.height = size.y + 'px'; - } - }, - - _createImg: function (src, el) { - el = el || document.createElement('img'); - el.src = src; - return el; - }, - - _getIconUrl: function (name) { - if (L.Browser.retina && this.options[name + 'RetinaUrl']) { - return this.options[name + 'RetinaUrl']; - } - return this.options[name + 'Url']; - } -}); - -L.icon = function (options) { - return new L.Icon(options); -}; - - -/* - * L.Icon.Default is the blue marker icon used by default in Leaflet. - */ - -L.Icon.Default = L.Icon.extend({ - - options: { - iconSize: [25, 41], - iconAnchor: [12, 41], - popupAnchor: [1, -34], - - shadowSize: [41, 41] - }, - - _getIconUrl: function (name) { - var key = name + 'Url'; - - if (this.options[key]) { - return this.options[key]; - } - - if (L.Browser.retina && name === 'icon') { - name += '-2x'; - } - - var path = L.Icon.Default.imagePath; - - if (!path) { - throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.'); - } - - return path + '/marker-' + name + '.png'; - } -}); - -L.Icon.Default.imagePath = (function () { - var scripts = document.getElementsByTagName('script'), - leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/; - - var i, len, src, matches, path; - - for (i = 0, len = scripts.length; i < len; i++) { - src = scripts[i].src; - matches = src.match(leafletRe); - - if (matches) { - path = src.split(leafletRe)[0]; - return (path ? path + '/' : '') + 'images'; - } - } -}()); - - -/* - * L.Marker is used to display clickable/draggable icons on the map. - */ - -L.Marker = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - icon: new L.Icon.Default(), - title: '', - alt: '', - clickable: true, - draggable: false, - keyboard: true, - zIndexOffset: 0, - opacity: 1, - riseOnHover: false, - riseOffset: 250 - }, - - initialize: function (latlng, options) { - L.setOptions(this, options); - this._latlng = L.latLng(latlng); - }, - - onAdd: function (map) { - this._map = map; - - map.on('viewreset', this.update, this); - - this._initIcon(); - this.update(); - this.fire('add'); - - if (map.options.zoomAnimation && map.options.markerZoomAnimation) { - map.on('zoomanim', this._animateZoom, this); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - if (this.dragging) { - this.dragging.disable(); - } - - this._removeIcon(); - this._removeShadow(); - - this.fire('remove'); - - map.off({ - 'viewreset': this.update, - 'zoomanim': this._animateZoom - }, this); - - this._map = null; - }, - - getLatLng: function () { - return this._latlng; - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - - this.update(); - - return this.fire('move', { latlng: this._latlng }); - }, - - setZIndexOffset: function (offset) { - this.options.zIndexOffset = offset; - this.update(); - - return this; - }, - - setIcon: function (icon) { - - this.options.icon = icon; - - if (this._map) { - this._initIcon(); - this.update(); - } - - if (this._popup) { - this.bindPopup(this._popup); - } - - return this; - }, - - update: function () { - if (this._icon) { - this._setPos(this._map.latLngToLayerPoint(this._latlng).round()); - } - return this; - }, - - _initIcon: function () { - var options = this.options, - map = this._map, - animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), - classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide'; - - var icon = options.icon.createIcon(this._icon), - addIcon = false; - - // if we're not reusing the icon, remove the old one and init new one - if (icon !== this._icon) { - if (this._icon) { - this._removeIcon(); - } - addIcon = true; - - if (options.title) { - icon.title = options.title; - } - - if (options.alt) { - icon.alt = options.alt; - } - } - - L.DomUtil.addClass(icon, classToAdd); - - if (options.keyboard) { - icon.tabIndex = '0'; - } - - this._icon = icon; - - this._initInteraction(); - - if (options.riseOnHover) { - L.DomEvent - .on(icon, 'mouseover', this._bringToFront, this) - .on(icon, 'mouseout', this._resetZIndex, this); - } - - var newShadow = options.icon.createShadow(this._shadow), - addShadow = false; - - if (newShadow !== this._shadow) { - this._removeShadow(); - addShadow = true; - } - - if (newShadow) { - L.DomUtil.addClass(newShadow, classToAdd); - } - this._shadow = newShadow; - - - if (options.opacity < 1) { - this._updateOpacity(); - } - - - var panes = this._map._panes; - - if (addIcon) { - panes.markerPane.appendChild(this._icon); - } - - if (newShadow && addShadow) { - panes.shadowPane.appendChild(this._shadow); - } - }, - - _removeIcon: function () { - if (this.options.riseOnHover) { - L.DomEvent - .off(this._icon, 'mouseover', this._bringToFront) - .off(this._icon, 'mouseout', this._resetZIndex); - } - - this._map._panes.markerPane.removeChild(this._icon); - - this._icon = null; - }, - - _removeShadow: function () { - if (this._shadow) { - this._map._panes.shadowPane.removeChild(this._shadow); - } - this._shadow = null; - }, - - _setPos: function (pos) { - L.DomUtil.setPosition(this._icon, pos); - - if (this._shadow) { - L.DomUtil.setPosition(this._shadow, pos); - } - - this._zIndex = pos.y + this.options.zIndexOffset; - - this._resetZIndex(); - }, - - _updateZIndex: function (offset) { - this._icon.style.zIndex = this._zIndex + offset; - }, - - _animateZoom: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); - - this._setPos(pos); - }, - - _initInteraction: function () { - - if (!this.options.clickable) { return; } - - // TODO refactor into something shared with Map/Path/etc. to DRY it up - - var icon = this._icon, - events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; - - L.DomUtil.addClass(icon, 'leaflet-clickable'); - L.DomEvent.on(icon, 'click', this._onMouseClick, this); - L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); - - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); - } - - if (L.Handler.MarkerDrag) { - this.dragging = new L.Handler.MarkerDrag(this); - - if (this.options.draggable) { - this.dragging.enable(); - } - } - }, - - _onMouseClick: function (e) { - var wasDragged = this.dragging && this.dragging.moved(); - - if (this.hasEventListeners(e.type) || wasDragged) { - L.DomEvent.stopPropagation(e); - } - - if (wasDragged) { return; } - - if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; } - - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); - }, - - _onKeyPress: function (e) { - if (e.keyCode === 13) { - this.fire('click', { - originalEvent: e, - latlng: this._latlng - }); - } - }, - - _fireMouseEvent: function (e) { - - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); - - // TODO proper custom event propagation - // this line will always be called if marker is in a FeatureGroup - if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousedown') { - L.DomEvent.stopPropagation(e); - } else { - L.DomEvent.preventDefault(e); - } - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - _updateOpacity: function () { - L.DomUtil.setOpacity(this._icon, this.options.opacity); - if (this._shadow) { - L.DomUtil.setOpacity(this._shadow, this.options.opacity); - } - }, - - _bringToFront: function () { - this._updateZIndex(this.options.riseOffset); - }, - - _resetZIndex: function () { - this._updateZIndex(0); - } -}); - -L.marker = function (latlng, options) { - return new L.Marker(latlng, options); -}; - - -/* - * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon) - * to use with L.Marker. - */ - -L.DivIcon = L.Icon.extend({ - options: { - iconSize: [12, 12], // also can be set through CSS - /* - iconAnchor: (Point) - popupAnchor: (Point) - html: (String) - bgPos: (Point) - */ - className: 'leaflet-div-icon', - html: false - }, - - createIcon: function (oldIcon) { - var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), - options = this.options; - - if (options.html !== false) { - div.innerHTML = options.html; - } else { - div.innerHTML = ''; - } - - if (options.bgPos) { - div.style.backgroundPosition = - (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; - } - - this._setIconStyles(div, 'icon'); - return div; - }, - - createShadow: function () { - return null; - } -}); - -L.divIcon = function (options) { - return new L.DivIcon(options); -}; - - -/* - * L.Popup is used for displaying popups on the map. - */ - -L.Map.mergeOptions({ - closePopupOnClick: true -}); - -L.Popup = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - minWidth: 50, - maxWidth: 300, - // maxHeight: null, - autoPan: true, - closeButton: true, - offset: [0, 7], - autoPanPadding: [5, 5], - // autoPanPaddingTopLeft: null, - // autoPanPaddingBottomRight: null, - keepInView: false, - className: '', - zoomAnimation: true - }, - - initialize: function (options, source) { - L.setOptions(this, options); - - this._source = source; - this._animated = L.Browser.any3d && this.options.zoomAnimation; - this._isOpen = false; - }, - - onAdd: function (map) { - this._map = map; - - if (!this._container) { - this._initLayout(); - } - - var animFade = map.options.fadeAnimation; - - if (animFade) { - L.DomUtil.setOpacity(this._container, 0); - } - map._panes.popupPane.appendChild(this._container); - - map.on(this._getEvents(), this); - - this.update(); - - if (animFade) { - L.DomUtil.setOpacity(this._container, 1); - } - - this.fire('open'); - - map.fire('popupopen', {popup: this}); - - if (this._source) { - this._source.fire('popupopen', {popup: this}); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - openOn: function (map) { - map.openPopup(this); - return this; - }, - - onRemove: function (map) { - map._panes.popupPane.removeChild(this._container); - - L.Util.falseFn(this._container.offsetWidth); // force reflow - - map.off(this._getEvents(), this); - - if (map.options.fadeAnimation) { - L.DomUtil.setOpacity(this._container, 0); - } - - this._map = null; - - this.fire('close'); - - map.fire('popupclose', {popup: this}); - - if (this._source) { - this._source.fire('popupclose', {popup: this}); - } - }, - - getLatLng: function () { - return this._latlng; - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - if (this._map) { - this._updatePosition(); - this._adjustPan(); - } - return this; - }, - - getContent: function () { - return this._content; - }, - - setContent: function (content) { - this._content = content; - this.update(); - return this; - }, - - update: function () { - if (!this._map) { return; } - - this._container.style.visibility = 'hidden'; - - this._updateContent(); - this._updateLayout(); - this._updatePosition(); - - this._container.style.visibility = ''; - - this._adjustPan(); - }, - - _getEvents: function () { - var events = { - viewreset: this._updatePosition - }; - - if (this._animated) { - events.zoomanim = this._zoomAnimation; - } - if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { - events.preclick = this._close; - } - if (this.options.keepInView) { - events.moveend = this._adjustPan; - } - - return events; - }, - - _close: function () { - if (this._map) { - this._map.closePopup(this); - } - }, - - _initLayout: function () { - var prefix = 'leaflet-popup', - containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + - (this._animated ? 'animated' : 'hide'), - container = this._container = L.DomUtil.create('div', containerClass), - closeButton; - - if (this.options.closeButton) { - closeButton = this._closeButton = - L.DomUtil.create('a', prefix + '-close-button', container); - closeButton.href = '#close'; - closeButton.innerHTML = '×'; - L.DomEvent.disableClickPropagation(closeButton); - - L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); - } - - var wrapper = this._wrapper = - L.DomUtil.create('div', prefix + '-content-wrapper', container); - L.DomEvent.disableClickPropagation(wrapper); - - this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); - - L.DomEvent.disableScrollPropagation(this._contentNode); - L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); - - this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); - this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); - }, - - _updateContent: function () { - if (!this._content) { return; } - - if (typeof this._content === 'string') { - this._contentNode.innerHTML = this._content; - } else { - while (this._contentNode.hasChildNodes()) { - this._contentNode.removeChild(this._contentNode.firstChild); - } - this._contentNode.appendChild(this._content); - } - this.fire('contentupdate'); - }, - - _updateLayout: function () { - var container = this._contentNode, - style = container.style; - - style.width = ''; - style.whiteSpace = 'nowrap'; - - var width = container.offsetWidth; - width = Math.min(width, this.options.maxWidth); - width = Math.max(width, this.options.minWidth); - - style.width = (width + 1) + 'px'; - style.whiteSpace = ''; - - style.height = ''; - - var height = container.offsetHeight, - maxHeight = this.options.maxHeight, - scrolledClass = 'leaflet-popup-scrolled'; - - if (maxHeight && height > maxHeight) { - style.height = maxHeight + 'px'; - L.DomUtil.addClass(container, scrolledClass); - } else { - L.DomUtil.removeClass(container, scrolledClass); - } - - this._containerWidth = this._container.offsetWidth; - }, - - _updatePosition: function () { - if (!this._map) { return; } - - var pos = this._map.latLngToLayerPoint(this._latlng), - animated = this._animated, - offset = L.point(this.options.offset); - - if (animated) { - L.DomUtil.setPosition(this._container, pos); - } - - this._containerBottom = -offset.y - (animated ? 0 : pos.y); - this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); - - // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = this._containerBottom + 'px'; - this._container.style.left = this._containerLeft + 'px'; - }, - - _zoomAnimation: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); - - L.DomUtil.setPosition(this._container, pos); - }, - - _adjustPan: function () { - if (!this.options.autoPan) { return; } - - var map = this._map, - containerHeight = this._container.offsetHeight, - containerWidth = this._containerWidth, - - layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); - - if (this._animated) { - layerPos._add(L.DomUtil.getPosition(this._container)); - } - - var containerPos = map.layerPointToContainerPoint(layerPos), - padding = L.point(this.options.autoPanPadding), - paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding), - paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding), - size = map.getSize(), - dx = 0, - dy = 0; - - if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right - dx = containerPos.x + containerWidth - size.x + paddingBR.x; - } - if (containerPos.x - dx - paddingTL.x < 0) { // left - dx = containerPos.x - paddingTL.x; - } - if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom - dy = containerPos.y + containerHeight - size.y + paddingBR.y; - } - if (containerPos.y - dy - paddingTL.y < 0) { // top - dy = containerPos.y - paddingTL.y; - } - - if (dx || dy) { - map - .fire('autopanstart') - .panBy([dx, dy]); - } - }, - - _onCloseButtonClick: function (e) { - this._close(); - L.DomEvent.stop(e); - } -}); - -L.popup = function (options, source) { - return new L.Popup(options, source); -}; - - -L.Map.include({ - openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object]) - this.closePopup(); - - if (!(popup instanceof L.Popup)) { - var content = popup; - - popup = new L.Popup(options) - .setLatLng(latlng) - .setContent(content); - } - popup._isOpen = true; - - this._popup = popup; - return this.addLayer(popup); - }, - - closePopup: function (popup) { - if (!popup || popup === this._popup) { - popup = this._popup; - this._popup = null; - } - if (popup) { - this.removeLayer(popup); - popup._isOpen = false; - } - return this; - } -}); - - -/* - * Popup extension to L.Marker, adding popup-related methods. - */ - -L.Marker.include({ - openPopup: function () { - if (this._popup && this._map && !this._map.hasLayer(this._popup)) { - this._popup.setLatLng(this._latlng); - this._map.openPopup(this._popup); - } - - return this; - }, - - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, - - togglePopup: function () { - if (this._popup) { - if (this._popup._isOpen) { - this.closePopup(); - } else { - this.openPopup(); - } - } - return this; - }, - - bindPopup: function (content, options) { - var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]); - - anchor = anchor.add(L.Popup.prototype.options.offset); - - if (options && options.offset) { - anchor = anchor.add(options.offset); - } - - options = L.extend({offset: anchor}, options); - - if (!this._popupHandlersAdded) { - this - .on('click', this.togglePopup, this) - .on('remove', this.closePopup, this) - .on('move', this._movePopup, this); - this._popupHandlersAdded = true; - } - - if (content instanceof L.Popup) { - L.setOptions(content, options); - this._popup = content; - content._source = this; - } else { - this._popup = new L.Popup(options, this) - .setContent(content); - } - - return this; - }, - - setPopupContent: function (content) { - if (this._popup) { - this._popup.setContent(content); - } - return this; - }, - - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this.togglePopup, this) - .off('remove', this.closePopup, this) - .off('move', this._movePopup, this); - this._popupHandlersAdded = false; - } - return this; - }, - - getPopup: function () { - return this._popup; - }, - - _movePopup: function (e) { - this._popup.setLatLng(e.latlng); - } -}); - - -/* - * L.LayerGroup is a class to combine several layers into one so that - * you can manipulate the group (e.g. add/remove it) as one layer. - */ - -L.LayerGroup = L.Class.extend({ - initialize: function (layers) { - this._layers = {}; - - var i, len; - - if (layers) { - for (i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - } - }, - - addLayer: function (layer) { - var id = this.getLayerId(layer); - - this._layers[id] = layer; - - if (this._map) { - this._map.addLayer(layer); - } - - return this; - }, - - removeLayer: function (layer) { - var id = layer in this._layers ? layer : this.getLayerId(layer); - - if (this._map && this._layers[id]) { - this._map.removeLayer(this._layers[id]); - } - - delete this._layers[id]; - - return this; - }, - - hasLayer: function (layer) { - if (!layer) { return false; } - - return (layer in this._layers || this.getLayerId(layer) in this._layers); - }, - - clearLayers: function () { - this.eachLayer(this.removeLayer, this); - return this; - }, - - invoke: function (methodName) { - var args = Array.prototype.slice.call(arguments, 1), - i, layer; - - for (i in this._layers) { - layer = this._layers[i]; - - if (layer[methodName]) { - layer[methodName].apply(layer, args); - } - } - - return this; - }, - - onAdd: function (map) { - this._map = map; - this.eachLayer(map.addLayer, map); - }, - - onRemove: function (map) { - this.eachLayer(map.removeLayer, map); - this._map = null; - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - - getLayer: function (id) { - return this._layers[id]; - }, - - getLayers: function () { - var layers = []; - - for (var i in this._layers) { - layers.push(this._layers[i]); - } - return layers; - }, - - setZIndex: function (zIndex) { - return this.invoke('setZIndex', zIndex); - }, - - getLayerId: function (layer) { - return L.stamp(layer); - } -}); - -L.layerGroup = function (layers) { - return new L.LayerGroup(layers); -}; - - -/* - * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods - * shared between a group of interactive layers (like vectors or markers). - */ - -L.FeatureGroup = L.LayerGroup.extend({ - includes: L.Mixin.Events, - - statics: { - EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose' - }, - - addLayer: function (layer) { - if (this.hasLayer(layer)) { - return this; - } - - if ('on' in layer) { - layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); - } - - L.LayerGroup.prototype.addLayer.call(this, layer); - - if (this._popupContent && layer.bindPopup) { - layer.bindPopup(this._popupContent, this._popupOptions); - } - - return this.fire('layeradd', {layer: layer}); - }, - - removeLayer: function (layer) { - if (!this.hasLayer(layer)) { - return this; - } - if (layer in this._layers) { - layer = this._layers[layer]; - } - - layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this); - - L.LayerGroup.prototype.removeLayer.call(this, layer); - - if (this._popupContent) { - this.invoke('unbindPopup'); - } - - return this.fire('layerremove', {layer: layer}); - }, - - bindPopup: function (content, options) { - this._popupContent = content; - this._popupOptions = options; - return this.invoke('bindPopup', content, options); - }, - - openPopup: function (latlng) { - // open popup on the first layer - for (var id in this._layers) { - this._layers[id].openPopup(latlng); - break; - } - return this; - }, - - setStyle: function (style) { - return this.invoke('setStyle', style); - }, - - bringToFront: function () { - return this.invoke('bringToFront'); - }, - - bringToBack: function () { - return this.invoke('bringToBack'); - }, - - getBounds: function () { - var bounds = new L.LatLngBounds(); - - this.eachLayer(function (layer) { - bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); - }); - - return bounds; - }, - - _propagateEvent: function (e) { - e = L.extend({ - layer: e.target, - target: this - }, e); - this.fire(e.type, e); - } -}); - -L.featureGroup = function (layers) { - return new L.FeatureGroup(layers); -}; - - -/* - * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. - */ - -L.Path = L.Class.extend({ - includes: [L.Mixin.Events], - - statics: { - // how much to extend the clip area around the map view - // (relative to its size, e.g. 0.5 is half the screen in each direction) - // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is) - CLIP_PADDING: (function () { - var max = L.Browser.mobile ? 1280 : 2000, - target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2; - return Math.max(0, Math.min(0.5, target)); - })() - }, - - options: { - stroke: true, - color: '#0033ff', - dashArray: null, - lineCap: null, - lineJoin: null, - weight: 5, - opacity: 0.5, - - fill: false, - fillColor: null, //same as color by default - fillOpacity: 0.2, - - clickable: true - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - onAdd: function (map) { - this._map = map; - - if (!this._container) { - this._initElements(); - this._initEvents(); - } - - this.projectLatlngs(); - this._updatePath(); - - if (this._container) { - this._map._pathRoot.appendChild(this._container); - } - - this.fire('add'); - - map.on({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - map._pathRoot.removeChild(this._container); - - // Need to fire remove event before we set _map to null as the event hooks might need the object - this.fire('remove'); - this._map = null; - - if (L.Browser.vml) { - this._container = null; - this._stroke = null; - this._fill = null; - } - - map.off({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, - - projectLatlngs: function () { - // do all projection stuff here - }, - - setStyle: function (style) { - L.setOptions(this, style); - - if (this._container) { - this._updateStyle(); - } - - return this; - }, - - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._updatePath(); - } - return this; - } -}); - -L.Map.include({ - _updatePathViewport: function () { - var p = L.Path.CLIP_PADDING, - size = this.getSize(), - panePos = L.DomUtil.getPosition(this._mapPane), - min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()), - max = min.add(size.multiplyBy(1 + p * 2)._round()); - - this._pathViewport = new L.Bounds(min, max); - } -}); - - -/* - * Extends L.Path with SVG-specific rendering code. - */ - -L.Path.SVG_NS = 'http://www.w3.org/2000/svg'; - -L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect); - -L.Path = L.Path.extend({ - statics: { - SVG: L.Browser.svg - }, - - bringToFront: function () { - var root = this._map._pathRoot, - path = this._container; - - if (path && root.lastChild !== path) { - root.appendChild(path); - } - return this; - }, - - bringToBack: function () { - var root = this._map._pathRoot, - path = this._container, - first = root.firstChild; - - if (path && first !== path) { - root.insertBefore(path, first); - } - return this; - }, - - getPathString: function () { - // form path string here - }, - - _createElement: function (name) { - return document.createElementNS(L.Path.SVG_NS, name); - }, - - _initElements: function () { - this._map._initPathRoot(); - this._initPath(); - this._initStyle(); - }, - - _initPath: function () { - this._container = this._createElement('g'); - - this._path = this._createElement('path'); - - if (this.options.className) { - L.DomUtil.addClass(this._path, this.options.className); - } - - this._container.appendChild(this._path); - }, - - _initStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke-linejoin', 'round'); - this._path.setAttribute('stroke-linecap', 'round'); - } - if (this.options.fill) { - this._path.setAttribute('fill-rule', 'evenodd'); - } - if (this.options.pointerEvents) { - this._path.setAttribute('pointer-events', this.options.pointerEvents); - } - if (!this.options.clickable && !this.options.pointerEvents) { - this._path.setAttribute('pointer-events', 'none'); - } - this._updateStyle(); - }, - - _updateStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke', this.options.color); - this._path.setAttribute('stroke-opacity', this.options.opacity); - this._path.setAttribute('stroke-width', this.options.weight); - if (this.options.dashArray) { - this._path.setAttribute('stroke-dasharray', this.options.dashArray); - } else { - this._path.removeAttribute('stroke-dasharray'); - } - if (this.options.lineCap) { - this._path.setAttribute('stroke-linecap', this.options.lineCap); - } - if (this.options.lineJoin) { - this._path.setAttribute('stroke-linejoin', this.options.lineJoin); - } - } else { - this._path.setAttribute('stroke', 'none'); - } - if (this.options.fill) { - this._path.setAttribute('fill', this.options.fillColor || this.options.color); - this._path.setAttribute('fill-opacity', this.options.fillOpacity); - } else { - this._path.setAttribute('fill', 'none'); - } - }, - - _updatePath: function () { - var str = this.getPathString(); - if (!str) { - // fix webkit empty string parsing bug - str = 'M0 0'; - } - this._path.setAttribute('d', str); - }, - - // TODO remove duplication with L.Map - _initEvents: function () { - if (this.options.clickable) { - if (L.Browser.svg || !L.Browser.vml) { - L.DomUtil.addClass(this._path, 'leaflet-clickable'); - } - - L.DomEvent.on(this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseover', - 'mouseout', 'mousemove', 'contextmenu']; - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); - } - } - }, - - _onMouseClick: function (e) { - if (this._map.dragging && this._map.dragging.moved()) { return; } - - this._fireMouseEvent(e); - }, - - _fireMouseEvent: function (e) { - if (!this.hasEventListeners(e.type)) { return; } - - var map = this._map, - containerPoint = map.mouseEventToContainerPoint(e), - layerPoint = map.containerPointToLayerPoint(containerPoint), - latlng = map.layerPointToLatLng(layerPoint); - - this.fire(e.type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); - - if (e.type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousemove') { - L.DomEvent.stopPropagation(e); - } - } -}); - -L.Map.include({ - _initPathRoot: function () { - if (!this._pathRoot) { - this._pathRoot = L.Path.prototype._createElement('svg'); - this._panes.overlayPane.appendChild(this._pathRoot); - - if (this.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated'); - - this.on({ - 'zoomanim': this._animatePathZoom, - 'zoomend': this._endPathZoom - }); - } else { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide'); - } - - this.on('moveend', this._updateSvgViewport); - this._updateSvgViewport(); - } - }, - - _animatePathZoom: function (e) { - var scale = this.getZoomScale(e.zoom), - offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min); - - this._pathRoot.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') '; - - this._pathZooming = true; - }, - - _endPathZoom: function () { - this._pathZooming = false; - }, - - _updateSvgViewport: function () { - - if (this._pathZooming) { - // Do not update SVGs while a zoom animation is going on otherwise the animation will break. - // When the zoom animation ends we will be updated again anyway - // This fixes the case where you do a momentum move and zoom while the move is still ongoing. - return; - } - - this._updatePathViewport(); - - var vp = this._pathViewport, - min = vp.min, - max = vp.max, - width = max.x - min.x, - height = max.y - min.y, - root = this._pathRoot, - pane = this._panes.overlayPane; - - // Hack to make flicker on drag end on mobile webkit less irritating - if (L.Browser.mobileWebkit) { - pane.removeChild(root); - } - - L.DomUtil.setPosition(root, min); - root.setAttribute('width', width); - root.setAttribute('height', height); - root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); - - if (L.Browser.mobileWebkit) { - pane.appendChild(root); - } - } -}); - - -/* - * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods. - */ - -L.Path.include({ - - bindPopup: function (content, options) { - - if (content instanceof L.Popup) { - this._popup = content; - } else { - if (!this._popup || options) { - this._popup = new L.Popup(options, this); - } - this._popup.setContent(content); - } - - if (!this._popupHandlersAdded) { - this - .on('click', this._openPopup, this) - .on('remove', this.closePopup, this); - - this._popupHandlersAdded = true; - } - - return this; - }, - - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this._openPopup) - .off('remove', this.closePopup); - - this._popupHandlersAdded = false; - } - return this; - }, - - openPopup: function (latlng) { - - if (this._popup) { - // open the popup from one of the path's points if not specified - latlng = latlng || this._latlng || - this._latlngs[Math.floor(this._latlngs.length / 2)]; - - this._openPopup({latlng: latlng}); - } - - return this; - }, - - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, - - _openPopup: function (e) { - this._popup.setLatLng(e.latlng); - this._map.openPopup(this._popup); - } -}); - - -/* - * Vector rendering for IE6-8 through VML. - * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! - */ - -L.Browser.vml = !L.Browser.svg && (function () { - try { - var div = document.createElement('div'); - div.innerHTML = ''; - - var shape = div.firstChild; - shape.style.behavior = 'url(#default#VML)'; - - return shape && (typeof shape.adj === 'object'); - - } catch (e) { - return false; - } -}()); - -L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ - statics: { - VML: true, - CLIP_PADDING: 0.02 - }, - - _createElement: (function () { - try { - document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); - return function (name) { - return document.createElement(''); - }; - } catch (e) { - return function (name) { - return document.createElement( - '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); - }; - } - }()), - - _initPath: function () { - var container = this._container = this._createElement('shape'); - - L.DomUtil.addClass(container, 'leaflet-vml-shape' + - (this.options.className ? ' ' + this.options.className : '')); - - if (this.options.clickable) { - L.DomUtil.addClass(container, 'leaflet-clickable'); - } - - container.coordsize = '1 1'; - - this._path = this._createElement('path'); - container.appendChild(this._path); - - this._map._pathRoot.appendChild(container); - }, - - _initStyle: function () { - this._updateStyle(); - }, - - _updateStyle: function () { - var stroke = this._stroke, - fill = this._fill, - options = this.options, - container = this._container; - - container.stroked = options.stroke; - container.filled = options.fill; - - if (options.stroke) { - if (!stroke) { - stroke = this._stroke = this._createElement('stroke'); - stroke.endcap = 'round'; - container.appendChild(stroke); - } - stroke.weight = options.weight + 'px'; - stroke.color = options.color; - stroke.opacity = options.opacity; - - if (options.dashArray) { - stroke.dashStyle = L.Util.isArray(options.dashArray) ? - options.dashArray.join(' ') : - options.dashArray.replace(/( *, *)/g, ' '); - } else { - stroke.dashStyle = ''; - } - if (options.lineCap) { - stroke.endcap = options.lineCap.replace('butt', 'flat'); - } - if (options.lineJoin) { - stroke.joinstyle = options.lineJoin; - } - - } else if (stroke) { - container.removeChild(stroke); - this._stroke = null; - } - - if (options.fill) { - if (!fill) { - fill = this._fill = this._createElement('fill'); - container.appendChild(fill); - } - fill.color = options.fillColor || options.color; - fill.opacity = options.fillOpacity; - - } else if (fill) { - container.removeChild(fill); - this._fill = null; - } - }, - - _updatePath: function () { - var style = this._container.style; - - style.display = 'none'; - this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug - style.display = ''; - } -}); - -L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : { - _initPathRoot: function () { - if (this._pathRoot) { return; } - - var root = this._pathRoot = document.createElement('div'); - root.className = 'leaflet-vml-container'; - this._panes.overlayPane.appendChild(root); - - this.on('moveend', this._updatePathViewport); - this._updatePathViewport(); - } -}); - - -/* - * Vector rendering for all browsers that support canvas. - */ - -L.Browser.canvas = (function () { - return !!document.createElement('canvas').getContext; -}()); - -L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({ - statics: { - //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value - CANVAS: true, - SVG: false - }, - - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._requestUpdate(); - } - return this; - }, - - setStyle: function (style) { - L.setOptions(this, style); - - if (this._map) { - this._updateStyle(); - this._requestUpdate(); - } - return this; - }, - - onRemove: function (map) { - map - .off('viewreset', this.projectLatlngs, this) - .off('moveend', this._updatePath, this); - - if (this.options.clickable) { - this._map.off('click', this._onClick, this); - this._map.off('mousemove', this._onMouseMove, this); - } - - this._requestUpdate(); - - this.fire('remove'); - this._map = null; - }, - - _requestUpdate: function () { - if (this._map && !L.Path._updateRequest) { - L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map); - } - }, - - _fireMapMoveEnd: function () { - L.Path._updateRequest = null; - this.fire('moveend'); - }, - - _initElements: function () { - this._map._initPathRoot(); - this._ctx = this._map._canvasCtx; - }, - - _updateStyle: function () { - var options = this.options; - - if (options.stroke) { - this._ctx.lineWidth = options.weight; - this._ctx.strokeStyle = options.color; - } - if (options.fill) { - this._ctx.fillStyle = options.fillColor || options.color; - } - - if (options.lineCap) { - this._ctx.lineCap = options.lineCap; - } - if (options.lineJoin) { - this._ctx.lineJoin = options.lineJoin; - } - }, - - _drawPath: function () { - var i, j, len, len2, point, drawMethod; - - this._ctx.beginPath(); - - for (i = 0, len = this._parts.length; i < len; i++) { - for (j = 0, len2 = this._parts[i].length; j < len2; j++) { - point = this._parts[i][j]; - drawMethod = (j === 0 ? 'move' : 'line') + 'To'; - - this._ctx[drawMethod](point.x, point.y); - } - // TODO refactor ugly hack - if (this instanceof L.Polygon) { - this._ctx.closePath(); - } - } - }, - - _checkIfEmpty: function () { - return !this._parts.length; - }, - - _updatePath: function () { - if (this._checkIfEmpty()) { return; } - - var ctx = this._ctx, - options = this.options; - - this._drawPath(); - ctx.save(); - this._updateStyle(); - - if (options.fill) { - ctx.globalAlpha = options.fillOpacity; - ctx.fill(options.fillRule || 'evenodd'); - } - - if (options.stroke) { - ctx.globalAlpha = options.opacity; - ctx.stroke(); - } - - ctx.restore(); - - // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature - }, - - _initEvents: function () { - if (this.options.clickable) { - this._map.on('mousemove', this._onMouseMove, this); - this._map.on('click dblclick contextmenu', this._fireMouseEvent, this); - } - }, - - _fireMouseEvent: function (e) { - if (this._containsPoint(e.layerPoint)) { - this.fire(e.type, e); - } - }, - - _onMouseMove: function (e) { - if (!this._map || this._map._animatingZoom) { return; } - - // TODO don't do on each move - if (this._containsPoint(e.layerPoint)) { - this._ctx.canvas.style.cursor = 'pointer'; - this._mouseInside = true; - this.fire('mouseover', e); - - } else if (this._mouseInside) { - this._ctx.canvas.style.cursor = ''; - this._mouseInside = false; - this.fire('mouseout', e); - } - } -}); - -L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : { - _initPathRoot: function () { - var root = this._pathRoot, - ctx; - - if (!root) { - root = this._pathRoot = document.createElement('canvas'); - root.style.position = 'absolute'; - ctx = this._canvasCtx = root.getContext('2d'); - - ctx.lineCap = 'round'; - ctx.lineJoin = 'round'; - - this._panes.overlayPane.appendChild(root); - - if (this.options.zoomAnimation) { - this._pathRoot.className = 'leaflet-zoom-animated'; - this.on('zoomanim', this._animatePathZoom); - this.on('zoomend', this._endPathZoom); - } - this.on('moveend', this._updateCanvasViewport); - this._updateCanvasViewport(); - } - }, - - _updateCanvasViewport: function () { - // don't redraw while zooming. See _updateSvgViewport for more details - if (this._pathZooming) { return; } - this._updatePathViewport(); - - var vp = this._pathViewport, - min = vp.min, - size = vp.max.subtract(min), - root = this._pathRoot; - - //TODO check if this works properly on mobile webkit - L.DomUtil.setPosition(root, min); - root.width = size.x; - root.height = size.y; - root.getContext('2d').translate(-min.x, -min.y); - } -}); - - -/* - * L.LineUtil contains different utility functions for line segments - * and polylines (clipping, simplification, distances, etc.) - */ - -/*jshint bitwise:false */ // allow bitwise operations for this file - -L.LineUtil = { - - // Simplify polyline with vertex reduction and Douglas-Peucker simplification. - // Improves rendering performance dramatically by lessening the number of points to draw. - - simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { - if (!tolerance || !points.length) { - return points.slice(); - } - - var sqTolerance = tolerance * tolerance; - - // stage 1: vertex reduction - points = this._reducePoints(points, sqTolerance); - - // stage 2: Douglas-Peucker simplification - points = this._simplifyDP(points, sqTolerance); - - return points; - }, - - // distance from a point to a segment between two points - pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); - }, - - closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return this._sqClosestPointOnSegment(p, p1, p2); - }, - - // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm - _simplifyDP: function (points, sqTolerance) { - - var len = points.length, - ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, - markers = new ArrayConstructor(len); - - markers[0] = markers[len - 1] = 1; - - this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); - - var i, - newPoints = []; - - for (i = 0; i < len; i++) { - if (markers[i]) { - newPoints.push(points[i]); - } - } - - return newPoints; - }, - - _simplifyDPStep: function (points, markers, sqTolerance, first, last) { - - var maxSqDist = 0, - index, i, sqDist; - - for (i = first + 1; i <= last - 1; i++) { - sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); - - if (sqDist > maxSqDist) { - index = i; - maxSqDist = sqDist; - } - } - - if (maxSqDist > sqTolerance) { - markers[index] = 1; - - this._simplifyDPStep(points, markers, sqTolerance, first, index); - this._simplifyDPStep(points, markers, sqTolerance, index, last); - } - }, - - // reduce points that are too close to each other to a single point - _reducePoints: function (points, sqTolerance) { - var reducedPoints = [points[0]]; - - for (var i = 1, prev = 0, len = points.length; i < len; i++) { - if (this._sqDist(points[i], points[prev]) > sqTolerance) { - reducedPoints.push(points[i]); - prev = i; - } - } - if (prev < len - 1) { - reducedPoints.push(points[len - 1]); - } - return reducedPoints; - }, - - // Cohen-Sutherland line clipping algorithm. - // Used to avoid rendering parts of a polyline that are not currently visible. - - clipSegment: function (a, b, bounds, useLastCode) { - var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), - codeB = this._getBitCode(b, bounds), - - codeOut, p, newCode; - - // save 2nd code to avoid calculating it on the next segment - this._lastCode = codeB; - - while (true) { - // if a,b is inside the clip window (trivial accept) - if (!(codeA | codeB)) { - return [a, b]; - // if a,b is outside the clip window (trivial reject) - } else if (codeA & codeB) { - return false; - // other cases - } else { - codeOut = codeA || codeB; - p = this._getEdgeIntersection(a, b, codeOut, bounds); - newCode = this._getBitCode(p, bounds); - - if (codeOut === codeA) { - a = p; - codeA = newCode; - } else { - b = p; - codeB = newCode; - } - } - } - }, - - _getEdgeIntersection: function (a, b, code, bounds) { - var dx = b.x - a.x, - dy = b.y - a.y, - min = bounds.min, - max = bounds.max; - - if (code & 8) { // top - return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y); - } else if (code & 4) { // bottom - return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y); - } else if (code & 2) { // right - return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx); - } else if (code & 1) { // left - return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx); - } - }, - - _getBitCode: function (/*Point*/ p, bounds) { - var code = 0; - - if (p.x < bounds.min.x) { // left - code |= 1; - } else if (p.x > bounds.max.x) { // right - code |= 2; - } - if (p.y < bounds.min.y) { // bottom - code |= 4; - } else if (p.y > bounds.max.y) { // top - code |= 8; - } - - return code; - }, - - // square distance (to avoid unnecessary Math.sqrt calls) - _sqDist: function (p1, p2) { - var dx = p2.x - p1.x, - dy = p2.y - p1.y; - return dx * dx + dy * dy; - }, - - // return closest point on segment or distance to that point - _sqClosestPointOnSegment: function (p, p1, p2, sqDist) { - var x = p1.x, - y = p1.y, - dx = p2.x - x, - dy = p2.y - y, - dot = dx * dx + dy * dy, - t; - - if (dot > 0) { - t = ((p.x - x) * dx + (p.y - y) * dy) / dot; - - if (t > 1) { - x = p2.x; - y = p2.y; - } else if (t > 0) { - x += dx * t; - y += dy * t; - } - } - - dx = p.x - x; - dy = p.y - y; - - return sqDist ? dx * dx + dy * dy : new L.Point(x, y); - } -}; - - -/* - * L.Polyline is used to display polylines on a map. - */ - -L.Polyline = L.Path.extend({ - initialize: function (latlngs, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlngs = this._convertLatLngs(latlngs); - }, - - options: { - // how much to simplify the polyline on each zoom level - // more = better performance and smoother look, less = more accurate - smoothFactor: 1.0, - noClip: false - }, - - projectLatlngs: function () { - this._originalPoints = []; - - for (var i = 0, len = this._latlngs.length; i < len; i++) { - this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); - } - }, - - getPathString: function () { - for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { - str += this._getPathPartStr(this._parts[i]); - } - return str; - }, - - getLatLngs: function () { - return this._latlngs; - }, - - setLatLngs: function (latlngs) { - this._latlngs = this._convertLatLngs(latlngs); - return this.redraw(); - }, - - addLatLng: function (latlng) { - this._latlngs.push(L.latLng(latlng)); - return this.redraw(); - }, - - spliceLatLngs: function () { // (Number index, Number howMany) - var removed = [].splice.apply(this._latlngs, arguments); - this._convertLatLngs(this._latlngs, true); - this.redraw(); - return removed; - }, - - closestLayerPoint: function (p) { - var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; - - for (var j = 0, jLen = parts.length; j < jLen; j++) { - var points = parts[j]; - for (var i = 1, len = points.length; i < len; i++) { - p1 = points[i - 1]; - p2 = points[i]; - var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); - if (sqDist < minDistance) { - minDistance = sqDist; - minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); - } - } - } - if (minPoint) { - minPoint.distance = Math.sqrt(minDistance); - } - return minPoint; - }, - - getBounds: function () { - return new L.LatLngBounds(this.getLatLngs()); - }, - - _convertLatLngs: function (latlngs, overwrite) { - var i, len, target = overwrite ? latlngs : []; - - for (i = 0, len = latlngs.length; i < len; i++) { - if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { - return; - } - target[i] = L.latLng(latlngs[i]); - } - return target; - }, - - _initEvents: function () { - L.Path.prototype._initEvents.call(this); - }, - - _getPathPartStr: function (points) { - var round = L.Path.VML; - - for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { - p = points[j]; - if (round) { - p._round(); - } - str += (j ? 'L' : 'M') + p.x + ' ' + p.y; - } - return str; - }, - - _clipPoints: function () { - var points = this._originalPoints, - len = points.length, - i, k, segment; - - if (this.options.noClip) { - this._parts = [points]; - return; - } - - this._parts = []; - - var parts = this._parts, - vp = this._map._pathViewport, - lu = L.LineUtil; - - for (i = 0, k = 0; i < len - 1; i++) { - segment = lu.clipSegment(points[i], points[i + 1], vp, i); - if (!segment) { - continue; - } - - parts[k] = parts[k] || []; - parts[k].push(segment[0]); - - // if segment goes out of screen, or it's the last one, it's the end of the line part - if ((segment[1] !== points[i + 1]) || (i === len - 2)) { - parts[k].push(segment[1]); - k++; - } - } - }, - - // simplify each clipped part of the polyline - _simplifyPoints: function () { - var parts = this._parts, - lu = L.LineUtil; - - for (var i = 0, len = parts.length; i < len; i++) { - parts[i] = lu.simplify(parts[i], this.options.smoothFactor); - } - }, - - _updatePath: function () { - if (!this._map) { return; } - - this._clipPoints(); - this._simplifyPoints(); - - L.Path.prototype._updatePath.call(this); - } -}); - -L.polyline = function (latlngs, options) { - return new L.Polyline(latlngs, options); -}; - - -/* - * L.PolyUtil contains utility functions for polygons (clipping, etc.). - */ - -/*jshint bitwise:false */ // allow bitwise operations here - -L.PolyUtil = {}; - -/* - * Sutherland-Hodgeman polygon clipping algorithm. - * Used to avoid rendering parts of a polygon that are not currently visible. - */ -L.PolyUtil.clipPolygon = function (points, bounds) { - var clippedPoints, - edges = [1, 4, 2, 8], - i, j, k, - a, b, - len, edge, p, - lu = L.LineUtil; - - for (i = 0, len = points.length; i < len; i++) { - points[i]._code = lu._getBitCode(points[i], bounds); - } - - // for each edge (left, bottom, right, top) - for (k = 0; k < 4; k++) { - edge = edges[k]; - clippedPoints = []; - - for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { - a = points[i]; - b = points[j]; - - // if a is inside the clip window - if (!(a._code & edge)) { - // if b is outside the clip window (a->b goes out of screen) - if (b._code & edge) { - p = lu._getEdgeIntersection(b, a, edge, bounds); - p._code = lu._getBitCode(p, bounds); - clippedPoints.push(p); - } - clippedPoints.push(a); - - // else if b is inside the clip window (a->b enters the screen) - } else if (!(b._code & edge)) { - p = lu._getEdgeIntersection(b, a, edge, bounds); - p._code = lu._getBitCode(p, bounds); - clippedPoints.push(p); - } - } - points = clippedPoints; - } - - return points; -}; - - -/* - * L.Polygon is used to display polygons on a map. - */ - -L.Polygon = L.Polyline.extend({ - options: { - fill: true - }, - - initialize: function (latlngs, options) { - L.Polyline.prototype.initialize.call(this, latlngs, options); - this._initWithHoles(latlngs); - }, - - _initWithHoles: function (latlngs) { - var i, len, hole; - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._latlngs = this._convertLatLngs(latlngs[0]); - this._holes = latlngs.slice(1); - - for (i = 0, len = this._holes.length; i < len; i++) { - hole = this._holes[i] = this._convertLatLngs(this._holes[i]); - if (hole[0].equals(hole[hole.length - 1])) { - hole.pop(); - } - } - } - - // filter out last point if its equal to the first one - latlngs = this._latlngs; - - if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) { - latlngs.pop(); - } - }, - - projectLatlngs: function () { - L.Polyline.prototype.projectLatlngs.call(this); - - // project polygon holes points - // TODO move this logic to Polyline to get rid of duplication - this._holePoints = []; - - if (!this._holes) { return; } - - var i, j, len, len2; - - for (i = 0, len = this._holes.length; i < len; i++) { - this._holePoints[i] = []; - - for (j = 0, len2 = this._holes[i].length; j < len2; j++) { - this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]); - } - } - }, - - setLatLngs: function (latlngs) { - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._initWithHoles(latlngs); - return this.redraw(); - } else { - return L.Polyline.prototype.setLatLngs.call(this, latlngs); - } - }, - - _clipPoints: function () { - var points = this._originalPoints, - newParts = []; - - this._parts = [points].concat(this._holePoints); - - if (this.options.noClip) { return; } - - for (var i = 0, len = this._parts.length; i < len; i++) { - var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); - if (clipped.length) { - newParts.push(clipped); - } - } - - this._parts = newParts; - }, - - _getPathPartStr: function (points) { - var str = L.Polyline.prototype._getPathPartStr.call(this, points); - return str + (L.Browser.svg ? 'z' : 'x'); - } -}); - -L.polygon = function (latlngs, options) { - return new L.Polygon(latlngs, options); -}; - - -/* - * Contains L.MultiPolyline and L.MultiPolygon layers. - */ - -(function () { - function createMulti(Klass) { - - return L.FeatureGroup.extend({ - - initialize: function (latlngs, options) { - this._layers = {}; - this._options = options; - this.setLatLngs(latlngs); - }, - - setLatLngs: function (latlngs) { - var i = 0, - len = latlngs.length; - - this.eachLayer(function (layer) { - if (i < len) { - layer.setLatLngs(latlngs[i++]); - } else { - this.removeLayer(layer); - } - }, this); - - while (i < len) { - this.addLayer(new Klass(latlngs[i++], this._options)); - } - - return this; - }, - - getLatLngs: function () { - var latlngs = []; - - this.eachLayer(function (layer) { - latlngs.push(layer.getLatLngs()); - }); - - return latlngs; - } - }); - } - - L.MultiPolyline = createMulti(L.Polyline); - L.MultiPolygon = createMulti(L.Polygon); - - L.multiPolyline = function (latlngs, options) { - return new L.MultiPolyline(latlngs, options); - }; - - L.multiPolygon = function (latlngs, options) { - return new L.MultiPolygon(latlngs, options); - }; -}()); - - -/* - * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. - */ - -L.Rectangle = L.Polygon.extend({ - initialize: function (latLngBounds, options) { - L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); - }, - - setBounds: function (latLngBounds) { - this.setLatLngs(this._boundsToLatLngs(latLngBounds)); - }, - - _boundsToLatLngs: function (latLngBounds) { - latLngBounds = L.latLngBounds(latLngBounds); - return [ - latLngBounds.getSouthWest(), - latLngBounds.getNorthWest(), - latLngBounds.getNorthEast(), - latLngBounds.getSouthEast() - ]; - } -}); - -L.rectangle = function (latLngBounds, options) { - return new L.Rectangle(latLngBounds, options); -}; - - -/* - * L.Circle is a circle overlay (with a certain radius in meters). - */ - -L.Circle = L.Path.extend({ - initialize: function (latlng, radius, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlng = L.latLng(latlng); - this._mRadius = radius; - }, - - options: { - fill: true - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - return this.redraw(); - }, - - setRadius: function (radius) { - this._mRadius = radius; - return this.redraw(); - }, - - projectLatlngs: function () { - var lngRadius = this._getLngRadius(), - latlng = this._latlng, - pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]); - - this._point = this._map.latLngToLayerPoint(latlng); - this._radius = Math.max(this._point.x - pointLeft.x, 1); - }, - - getBounds: function () { - var lngRadius = this._getLngRadius(), - latRadius = (this._mRadius / 40075017) * 360, - latlng = this._latlng; - - return new L.LatLngBounds( - [latlng.lat - latRadius, latlng.lng - lngRadius], - [latlng.lat + latRadius, latlng.lng + lngRadius]); - }, - - getLatLng: function () { - return this._latlng; - }, - - getPathString: function () { - var p = this._point, - r = this._radius; - - if (this._checkIfEmpty()) { - return ''; - } - - if (L.Browser.svg) { - return 'M' + p.x + ',' + (p.y - r) + - 'A' + r + ',' + r + ',0,1,1,' + - (p.x - 0.1) + ',' + (p.y - r) + ' z'; - } else { - p._round(); - r = Math.round(r); - return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360); - } - }, - - getRadius: function () { - return this._mRadius; - }, - - // TODO Earth hardcoded, move into projection code! - - _getLatRadius: function () { - return (this._mRadius / 40075017) * 360; - }, - - _getLngRadius: function () { - return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); - }, - - _checkIfEmpty: function () { - if (!this._map) { - return false; - } - var vp = this._map._pathViewport, - r = this._radius, - p = this._point; - - return p.x - r > vp.max.x || p.y - r > vp.max.y || - p.x + r < vp.min.x || p.y + r < vp.min.y; - } -}); - -L.circle = function (latlng, radius, options) { - return new L.Circle(latlng, radius, options); -}; - - -/* - * L.CircleMarker is a circle overlay with a permanent pixel radius. - */ - -L.CircleMarker = L.Circle.extend({ - options: { - radius: 10, - weight: 2 - }, - - initialize: function (latlng, options) { - L.Circle.prototype.initialize.call(this, latlng, null, options); - this._radius = this.options.radius; - }, - - projectLatlngs: function () { - this._point = this._map.latLngToLayerPoint(this._latlng); - }, - - _updateStyle : function () { - L.Circle.prototype._updateStyle.call(this); - this.setRadius(this.options.radius); - }, - - setLatLng: function (latlng) { - L.Circle.prototype.setLatLng.call(this, latlng); - if (this._popup && this._popup._isOpen) { - this._popup.setLatLng(latlng); - } - return this; - }, - - setRadius: function (radius) { - this.options.radius = this._radius = radius; - return this.redraw(); - }, - - getRadius: function () { - return this._radius; - } -}); - -L.circleMarker = function (latlng, options) { - return new L.CircleMarker(latlng, options); -}; - - -/* - * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines. - */ - -L.Polyline.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p, closed) { - var i, j, k, len, len2, dist, part, - w = this.options.weight / 2; - - if (L.Browser.touch) { - w += 10; // polyline click tolerance on touch devices - } - - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - if (!closed && (j === 0)) { - continue; - } - - dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]); - - if (dist <= w) { - return true; - } - } - } - return false; - } -}); - - -/* - * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons. - */ - -L.Polygon.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p) { - var inside = false, - part, p1, p2, - i, j, k, - len, len2; - - // TODO optimization: check if within bounds first - - if (L.Polyline.prototype._containsPoint.call(this, p, true)) { - // click on polygon border - return true; - } - - // ray casting algorithm for detecting if point is in polygon - - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - p1 = part[j]; - p2 = part[k]; - - if (((p1.y > p.y) !== (p2.y > p.y)) && - (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { - inside = !inside; - } - } - } - - return inside; - } -}); - - -/* - * Extends L.Circle with Canvas-specific code. - */ - -L.Circle.include(!L.Path.CANVAS ? {} : { - _drawPath: function () { - var p = this._point; - this._ctx.beginPath(); - this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false); - }, - - _containsPoint: function (p) { - var center = this._point, - w2 = this.options.stroke ? this.options.weight / 2 : 0; - - return (p.distanceTo(center) <= this._radius + w2); - } -}); - - -/* - * CircleMarker canvas specific drawing parts. - */ - -L.CircleMarker.include(!L.Path.CANVAS ? {} : { - _updateStyle: function () { - L.Path.prototype._updateStyle.call(this); - } -}); - - -/* - * L.GeoJSON turns any GeoJSON data into a Leaflet layer. - */ - -L.GeoJSON = L.FeatureGroup.extend({ - - initialize: function (geojson, options) { - L.setOptions(this, options); - - this._layers = {}; - - if (geojson) { - this.addData(geojson); - } - }, - - addData: function (geojson) { - var features = L.Util.isArray(geojson) ? geojson : geojson.features, - i, len, feature; - - if (features) { - for (i = 0, len = features.length; i < len; i++) { - // Only add this if geometry or geometries are set and not null - feature = features[i]; - if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { - this.addData(features[i]); - } - } - return this; - } - - var options = this.options; - - if (options.filter && !options.filter(geojson)) { return; } - - var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options); - layer.feature = L.GeoJSON.asFeature(geojson); - - layer.defaultOptions = layer.options; - this.resetStyle(layer); - - if (options.onEachFeature) { - options.onEachFeature(geojson, layer); - } - - return this.addLayer(layer); - }, - - resetStyle: function (layer) { - var style = this.options.style; - if (style) { - // reset any custom styles - L.Util.extend(layer.options, layer.defaultOptions); - - this._setLayerStyle(layer, style); - } - }, - - setStyle: function (style) { - this.eachLayer(function (layer) { - this._setLayerStyle(layer, style); - }, this); - }, - - _setLayerStyle: function (layer, style) { - if (typeof style === 'function') { - style = style(layer.feature); - } - if (layer.setStyle) { - layer.setStyle(style); - } - } -}); - -L.extend(L.GeoJSON, { - geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) { - var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, - coords = geometry.coordinates, - layers = [], - latlng, latlngs, i, len; - - coordsToLatLng = coordsToLatLng || this.coordsToLatLng; - - switch (geometry.type) { - case 'Point': - latlng = coordsToLatLng(coords); - return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); - - case 'MultiPoint': - for (i = 0, len = coords.length; i < len; i++) { - latlng = coordsToLatLng(coords[i]); - layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); - } - return new L.FeatureGroup(layers); - - case 'LineString': - latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); - return new L.Polyline(latlngs, vectorOptions); - - case 'Polygon': - if (coords.length === 2 && !coords[1].length) { - throw new Error('Invalid GeoJSON object.'); - } - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.Polygon(latlngs, vectorOptions); - - case 'MultiLineString': - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.MultiPolyline(latlngs, vectorOptions); - - case 'MultiPolygon': - latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); - return new L.MultiPolygon(latlngs, vectorOptions); - - case 'GeometryCollection': - for (i = 0, len = geometry.geometries.length; i < len; i++) { - - layers.push(this.geometryToLayer({ - geometry: geometry.geometries[i], - type: 'Feature', - properties: geojson.properties - }, pointToLayer, coordsToLatLng, vectorOptions)); - } - return new L.FeatureGroup(layers); - - default: - throw new Error('Invalid GeoJSON object.'); - } - }, - - coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng - return new L.LatLng(coords[1], coords[0], coords[2]); - }, - - coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array - var latlng, i, len, - latlngs = []; - - for (i = 0, len = coords.length; i < len; i++) { - latlng = levelsDeep ? - this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : - (coordsToLatLng || this.coordsToLatLng)(coords[i]); - - latlngs.push(latlng); - } - - return latlngs; - }, - - latLngToCoords: function (latlng) { - var coords = [latlng.lng, latlng.lat]; - - if (latlng.alt !== undefined) { - coords.push(latlng.alt); - } - return coords; - }, - - latLngsToCoords: function (latLngs) { - var coords = []; - - for (var i = 0, len = latLngs.length; i < len; i++) { - coords.push(L.GeoJSON.latLngToCoords(latLngs[i])); - } - - return coords; - }, - - getFeature: function (layer, newGeometry) { - return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry); - }, - - asFeature: function (geoJSON) { - if (geoJSON.type === 'Feature') { - return geoJSON; - } - - return { - type: 'Feature', - properties: {}, - geometry: geoJSON - }; - } -}); - -var PointToGeoJSON = { - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'Point', - coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) - }); - } -}; - -L.Marker.include(PointToGeoJSON); -L.Circle.include(PointToGeoJSON); -L.CircleMarker.include(PointToGeoJSON); - -L.Polyline.include({ - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'LineString', - coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs()) - }); - } -}); - -L.Polygon.include({ - toGeoJSON: function () { - var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())], - i, len, hole; - - coords[0].push(coords[0][0]); - - if (this._holes) { - for (i = 0, len = this._holes.length; i < len; i++) { - hole = L.GeoJSON.latLngsToCoords(this._holes[i]); - hole.push(hole[0]); - coords.push(hole); - } - } - - return L.GeoJSON.getFeature(this, { - type: 'Polygon', - coordinates: coords - }); - } -}); - -(function () { - function multiToGeoJSON(type) { - return function () { - var coords = []; - - this.eachLayer(function (layer) { - coords.push(layer.toGeoJSON().geometry.coordinates); - }); - - return L.GeoJSON.getFeature(this, { - type: type, - coordinates: coords - }); - }; - } - - L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')}); - L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')}); - - L.LayerGroup.include({ - toGeoJSON: function () { - - var geometry = this.feature && this.feature.geometry, - jsons = [], - json; - - if (geometry && geometry.type === 'MultiPoint') { - return multiToGeoJSON('MultiPoint').call(this); - } - - var isGeometryCollection = geometry && geometry.type === 'GeometryCollection'; - - this.eachLayer(function (layer) { - if (layer.toGeoJSON) { - json = layer.toGeoJSON(); - jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json)); - } - }); - - if (isGeometryCollection) { - return L.GeoJSON.getFeature(this, { - geometries: jsons, - type: 'GeometryCollection' - }); - } - - return { - type: 'FeatureCollection', - features: jsons - }; - } - }); -}()); - -L.geoJson = function (geojson, options) { - return new L.GeoJSON(geojson, options); -}; - - -/* - * L.DomEvent contains functions for working with DOM events. - */ - -L.DomEvent = { - /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */ - addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) - - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler, originalHandler, newType; - - if (obj[key]) { return this; } - - handler = function (e) { - return fn.call(context || obj, e || L.DomEvent._getEvent()); - }; - - if (L.Browser.pointer && type.indexOf('touch') === 0) { - return this.addPointerListener(obj, type, handler, id); - } - if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { - this.addDoubleTapListener(obj, handler, id); - } - - if ('addEventListener' in obj) { - - if (type === 'mousewheel') { - obj.addEventListener('DOMMouseScroll', handler, false); - obj.addEventListener(type, handler, false); - - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - - originalHandler = handler; - newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); - - handler = function (e) { - if (!L.DomEvent._checkMouse(obj, e)) { return; } - return originalHandler(e); - }; - - obj.addEventListener(newType, handler, false); - - } else if (type === 'click' && L.Browser.android) { - originalHandler = handler; - handler = function (e) { - return L.DomEvent._filterClick(e, originalHandler); - }; - - obj.addEventListener(type, handler, false); - } else { - obj.addEventListener(type, handler, false); - } - - } else if ('attachEvent' in obj) { - obj.attachEvent('on' + type, handler); - } - - obj[key] = handler; - - return this; - }, - - removeListener: function (obj, type, fn) { // (HTMLElement, String, Function) - - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler = obj[key]; - - if (!handler) { return this; } - - if (L.Browser.pointer && type.indexOf('touch') === 0) { - this.removePointerListener(obj, type, id); - } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { - this.removeDoubleTapListener(obj, id); - - } else if ('removeEventListener' in obj) { - - if (type === 'mousewheel') { - obj.removeEventListener('DOMMouseScroll', handler, false); - obj.removeEventListener(type, handler, false); - - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); - } else { - obj.removeEventListener(type, handler, false); - } - } else if ('detachEvent' in obj) { - obj.detachEvent('on' + type, handler); - } - - obj[key] = null; - - return this; - }, - - stopPropagation: function (e) { - - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - L.DomEvent._skipped(e); - - return this; - }, - - disableScrollPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; - - return L.DomEvent - .on(el, 'mousewheel', stop) - .on(el, 'MozMousePixelScroll', stop); - }, - - disableClickPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(el, L.Draggable.START[i], stop); - } - - return L.DomEvent - .on(el, 'click', L.DomEvent._fakeStop) - .on(el, 'dblclick', stop); - }, - - preventDefault: function (e) { - - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - } - return this; - }, - - stop: function (e) { - return L.DomEvent - .preventDefault(e) - .stopPropagation(e); - }, - - getMousePosition: function (e, container) { - if (!container) { - return new L.Point(e.clientX, e.clientY); - } - - var rect = container.getBoundingClientRect(); - - return new L.Point( - e.clientX - rect.left - container.clientLeft, - e.clientY - rect.top - container.clientTop); - }, - - getWheelDelta: function (e) { - - var delta = 0; - - if (e.wheelDelta) { - delta = e.wheelDelta / 120; - } - if (e.detail) { - delta = -e.detail / 3; - } - return delta; - }, - - _skipEvents: {}, - - _fakeStop: function (e) { - // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) - L.DomEvent._skipEvents[e.type] = true; - }, - - _skipped: function (e) { - var skipped = this._skipEvents[e.type]; - // reset when checking, as it's only used in map container and propagates outside of the map - this._skipEvents[e.type] = false; - return skipped; - }, - - // check if element really left/entered the event target (for mouseenter/mouseleave) - _checkMouse: function (el, e) { - - var related = e.relatedTarget; - - if (!related) { return true; } - - try { - while (related && (related !== el)) { - related = related.parentNode; - } - } catch (err) { - return false; - } - return (related !== el); - }, - - _getEvent: function () { // evil magic for IE - /*jshint noarg:false */ - var e = window.event; - if (!e) { - var caller = arguments.callee.caller; - while (caller) { - e = caller['arguments'][0]; - if (e && window.Event === e.constructor) { - break; - } - caller = caller.caller; - } - } - return e; - }, - - // this is a horrible workaround for a bug in Android where a single touch triggers two click events - _filterClick: function (e, handler) { - var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), - elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); - - // are they closer together than 500ms yet more than 100ms? - // Android typically triggers them ~300ms apart while multiple listeners - // on the same event should be triggered far faster; - // or check if click is simulated on the element, and if it is, reject any non-simulated events - - if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) { - L.DomEvent.stop(e); - return; - } - L.DomEvent._lastClick = timeStamp; - - return handler(e); - } -}; - -L.DomEvent.on = L.DomEvent.addListener; -L.DomEvent.off = L.DomEvent.removeListener; - - -/* - * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too. - */ - -L.Draggable = L.Class.extend({ - includes: L.Mixin.Events, - - statics: { - START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], - END: { - mousedown: 'mouseup', - touchstart: 'touchend', - pointerdown: 'touchend', - MSPointerDown: 'touchend' - }, - MOVE: { - mousedown: 'mousemove', - touchstart: 'touchmove', - pointerdown: 'touchmove', - MSPointerDown: 'touchmove' - } - }, - - initialize: function (element, dragStartTarget) { - this._element = element; - this._dragStartTarget = dragStartTarget || element; - }, - - enable: function () { - if (this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); - } - - this._enabled = true; - }, - - disable: function () { - if (!this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); - } - - this._enabled = false; - this._moved = false; - }, - - _onDown: function (e) { - this._moved = false; - - if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } - - L.DomEvent.stopPropagation(e); - - if (L.Draggable._disabled) { return; } - - L.DomUtil.disableImageDrag(); - L.DomUtil.disableTextSelection(); - - if (this._moving) { return; } - - var first = e.touches ? e.touches[0] : e; - - this._startPoint = new L.Point(first.clientX, first.clientY); - this._startPos = this._newPos = L.DomUtil.getPosition(this._element); - - L.DomEvent - .on(document, L.Draggable.MOVE[e.type], this._onMove, this) - .on(document, L.Draggable.END[e.type], this._onUp, this); - }, - - _onMove: function (e) { - if (e.touches && e.touches.length > 1) { - this._moved = true; - return; - } - - var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), - newPoint = new L.Point(first.clientX, first.clientY), - offset = newPoint.subtract(this._startPoint); - - if (!offset.x && !offset.y) { return; } - if (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; } - - L.DomEvent.preventDefault(e); - - if (!this._moved) { - this.fire('dragstart'); - - this._moved = true; - this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); - - L.DomUtil.addClass(document.body, 'leaflet-dragging'); - this._lastTarget = e.target || e.srcElement; - L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target'); - } - - this._newPos = this._startPos.add(offset); - this._moving = true; - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); - }, - - _updatePosition: function () { - this.fire('predrag'); - L.DomUtil.setPosition(this._element, this._newPos); - this.fire('drag'); - }, - - _onUp: function () { - L.DomUtil.removeClass(document.body, 'leaflet-dragging'); - - if (this._lastTarget) { - L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target'); - this._lastTarget = null; - } - - for (var i in L.Draggable.MOVE) { - L.DomEvent - .off(document, L.Draggable.MOVE[i], this._onMove) - .off(document, L.Draggable.END[i], this._onUp); - } - - L.DomUtil.enableImageDrag(); - L.DomUtil.enableTextSelection(); - - if (this._moved && this._moving) { - // ensure drag is not fired after dragend - L.Util.cancelAnimFrame(this._animRequest); - - this.fire('dragend', { - distance: this._newPos.distanceTo(this._startPos) - }); - } - - this._moving = false; - } -}); - - -/* - L.Handler is a base class for handler classes that are used internally to inject - interaction features like dragging to classes like Map and Marker. -*/ - -L.Handler = L.Class.extend({ - initialize: function (map) { - this._map = map; - }, - - enable: function () { - if (this._enabled) { return; } - - this._enabled = true; - this.addHooks(); - }, - - disable: function () { - if (!this._enabled) { return; } - - this._enabled = false; - this.removeHooks(); - }, - - enabled: function () { - return !!this._enabled; - } -}); - - -/* - * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. - */ - -L.Map.mergeOptions({ - dragging: true, - - inertia: !L.Browser.android23, - inertiaDeceleration: 3400, // px/s^2 - inertiaMaxSpeed: Infinity, // px/s - inertiaThreshold: L.Browser.touch ? 32 : 18, // ms - easeLinearity: 0.25, - - // TODO refactor, move to CRS - worldCopyJump: false -}); - -L.Map.Drag = L.Handler.extend({ - addHooks: function () { - if (!this._draggable) { - var map = this._map; - - this._draggable = new L.Draggable(map._mapPane, map._container); - - this._draggable.on({ - 'dragstart': this._onDragStart, - 'drag': this._onDrag, - 'dragend': this._onDragEnd - }, this); - - if (map.options.worldCopyJump) { - this._draggable.on('predrag', this._onPreDrag, this); - map.on('viewreset', this._onViewReset, this); - - map.whenReady(this._onViewReset, this); - } - } - this._draggable.enable(); - }, - - removeHooks: function () { - this._draggable.disable(); - }, - - moved: function () { - return this._draggable && this._draggable._moved; - }, - - _onDragStart: function () { - var map = this._map; - - if (map._panAnim) { - map._panAnim.stop(); - } - - map - .fire('movestart') - .fire('dragstart'); - - if (map.options.inertia) { - this._positions = []; - this._times = []; - } - }, - - _onDrag: function () { - if (this._map.options.inertia) { - var time = this._lastTime = +new Date(), - pos = this._lastPos = this._draggable._newPos; - - this._positions.push(pos); - this._times.push(time); - - if (time - this._times[0] > 200) { - this._positions.shift(); - this._times.shift(); - } - } - - this._map - .fire('move') - .fire('drag'); - }, - - _onViewReset: function () { - // TODO fix hardcoded Earth values - var pxCenter = this._map.getSize()._divideBy(2), - pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); - - this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; - this._worldWidth = this._map.project([0, 180]).x; - }, - - _onPreDrag: function () { - // TODO refactor to be able to adjust map pane position after zoom - var worldWidth = this._worldWidth, - halfWidth = Math.round(worldWidth / 2), - dx = this._initialWorldOffset, - x = this._draggable._newPos.x, - newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, - newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, - newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; - - this._draggable._newPos.x = newX; - }, - - _onDragEnd: function (e) { - var map = this._map, - options = map.options, - delay = +new Date() - this._lastTime, - - noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; - - map.fire('dragend', e); - - if (noInertia) { - map.fire('moveend'); - - } else { - - var direction = this._lastPos.subtract(this._positions[0]), - duration = (this._lastTime + delay - this._times[0]) / 1000, - ease = options.easeLinearity, - - speedVector = direction.multiplyBy(ease / duration), - speed = speedVector.distanceTo([0, 0]), - - limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), - limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), - - decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), - offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); - - if (!offset.x || !offset.y) { - map.fire('moveend'); - - } else { - offset = map._limitOffset(offset, map.options.maxBounds); - - L.Util.requestAnimFrame(function () { - map.panBy(offset, { - duration: decelerationDuration, - easeLinearity: ease, - noMoveStart: true - }); - }); - } - } - } -}); - -L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); - - -/* - * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. - */ - -L.Map.mergeOptions({ - doubleClickZoom: true -}); - -L.Map.DoubleClickZoom = L.Handler.extend({ - addHooks: function () { - this._map.on('dblclick', this._onDoubleClick, this); - }, - - removeHooks: function () { - this._map.off('dblclick', this._onDoubleClick, this); - }, - - _onDoubleClick: function (e) { - var map = this._map, - zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1); - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); - - -/* - * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. - */ - -L.Map.mergeOptions({ - scrollWheelZoom: true -}); - -L.Map.ScrollWheelZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); - L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - this._delta = 0; - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll); - L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - }, - - _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e); - - this._delta += delta; - this._lastMousePos = this._map.mouseEventToContainerPoint(e); - - if (!this._startTime) { - this._startTime = +new Date(); - } - - var left = Math.max(40 - (+new Date() - this._startTime), 0); - - clearTimeout(this._timer); - this._timer = setTimeout(L.bind(this._performZoom, this), left); - - L.DomEvent.preventDefault(e); - L.DomEvent.stopPropagation(e); - }, - - _performZoom: function () { - var map = this._map, - delta = this._delta, - zoom = map.getZoom(); - - delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); - delta = Math.max(Math.min(delta, 4), -4); - delta = map._limitZoom(zoom + delta) - zoom; - - this._delta = 0; - this._startTime = null; - - if (!delta) { return; } - - if (map.options.scrollWheelZoom === 'center') { - map.setZoom(zoom + delta); - } else { - map.setZoomAround(this._lastMousePos, zoom + delta); - } - } -}); - -L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); - - -/* - * Extends the event handling code with double tap support for mobile browsers. - */ - -L.extend(L.DomEvent, { - - _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', - _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', - - // inspired by Zepto touch code by Thomas Fuchs - addDoubleTapListener: function (obj, handler, id) { - var last, - doubleTap = false, - delay = 250, - touch, - pre = '_leaflet_', - touchstart = this._touchstart, - touchend = this._touchend, - trackedTouches = []; - - function onTouchStart(e) { - var count; - - if (L.Browser.pointer) { - trackedTouches.push(e.pointerId); - count = trackedTouches.length; - } else { - count = e.touches.length; - } - if (count > 1) { - return; - } - - var now = Date.now(), - delta = now - (last || now); - - touch = e.touches ? e.touches[0] : e; - doubleTap = (delta > 0 && delta <= delay); - last = now; - } - - function onTouchEnd(e) { - if (L.Browser.pointer) { - var idx = trackedTouches.indexOf(e.pointerId); - if (idx === -1) { - return; - } - trackedTouches.splice(idx, 1); - } - - if (doubleTap) { - if (L.Browser.pointer) { - // work around .type being readonly with MSPointer* events - var newTouch = { }, - prop; - - // jshint forin:false - for (var i in touch) { - prop = touch[i]; - if (typeof prop === 'function') { - newTouch[i] = prop.bind(touch); - } else { - newTouch[i] = prop; - } - } - touch = newTouch; - } - touch.type = 'dblclick'; - handler(touch); - last = null; - } - } - obj[pre + touchstart + id] = onTouchStart; - obj[pre + touchend + id] = onTouchEnd; - - // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen - // will not come through to us, so we will lose track of how many touches are ongoing - var endElement = L.Browser.pointer ? document.documentElement : obj; - - obj.addEventListener(touchstart, onTouchStart, false); - endElement.addEventListener(touchend, onTouchEnd, false); - - if (L.Browser.pointer) { - endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); - } - - return this; - }, - - removeDoubleTapListener: function (obj, id) { - var pre = '_leaflet_'; - - obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - (L.Browser.pointer ? document.documentElement : obj).removeEventListener( - this._touchend, obj[pre + this._touchend + id], false); - - if (L.Browser.pointer) { - document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], - false); - } - - return this; - } -}); - - -/* - * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. - */ - -L.extend(L.DomEvent, { - - //static - POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', - POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', - POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', - POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', - - _pointers: [], - _pointerDocumentListener: false, - - // Provides a touch events wrapper for (ms)pointer events. - // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 - //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 - - addPointerListener: function (obj, type, handler, id) { - - switch (type) { - case 'touchstart': - return this.addPointerListenerStart(obj, type, handler, id); - case 'touchend': - return this.addPointerListenerEnd(obj, type, handler, id); - case 'touchmove': - return this.addPointerListenerMove(obj, type, handler, id); - default: - throw 'Unknown touch event type'; - } - }, - - addPointerListenerStart: function (obj, type, handler, id) { - var pre = '_leaflet_', - pointers = this._pointers; - - var cb = function (e) { - - L.DomEvent.preventDefault(e); - - var alreadyInArray = false; - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - alreadyInArray = true; - break; - } - } - if (!alreadyInArray) { - pointers.push(e); - } - - e.touches = pointers.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchstart' + id] = cb; - obj.addEventListener(this.POINTER_DOWN, cb, false); - - // need to also listen for end events to keep the _pointers list accurate - // this needs to be on the body and never go away - if (!this._pointerDocumentListener) { - var internalCb = function (e) { - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - pointers.splice(i, 1); - break; - } - } - }; - //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(this.POINTER_UP, internalCb, false); - document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false); - - this._pointerDocumentListener = true; - } - - return this; - }, - - addPointerListenerMove: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; - - function cb(e) { - - // don't fire touch moves when mouse isn't down - if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } - - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches[i] = e; - break; - } - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - } - - obj[pre + 'touchmove' + id] = cb; - obj.addEventListener(this.POINTER_MOVE, cb, false); - - return this; - }, - - addPointerListenerEnd: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; - - var cb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); - break; - } - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchend' + id] = cb; - obj.addEventListener(this.POINTER_UP, cb, false); - obj.addEventListener(this.POINTER_CANCEL, cb, false); - - return this; - }, - - removePointerListener: function (obj, type, id) { - var pre = '_leaflet_', - cb = obj[pre + type + id]; - - switch (type) { - case 'touchstart': - obj.removeEventListener(this.POINTER_DOWN, cb, false); - break; - case 'touchmove': - obj.removeEventListener(this.POINTER_MOVE, cb, false); - break; - case 'touchend': - obj.removeEventListener(this.POINTER_UP, cb, false); - obj.removeEventListener(this.POINTER_CANCEL, cb, false); - break; - } - - return this; - } -}); - - -/* - * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. - */ - -L.Map.mergeOptions({ - touchZoom: L.Browser.touch && !L.Browser.android23, - bounceAtZoomLimits: true -}); - -L.Map.TouchZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - _onTouchStart: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } - - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]), - viewCenter = map._getCenterLayerPoint(); - - this._startCenter = p1.add(p2)._divideBy(2); - this._startDist = p1.distanceTo(p2); - - this._moved = false; - this._zooming = true; - - this._centerOffset = viewCenter.subtract(this._startCenter); - - if (map._panAnim) { - map._panAnim.stop(); - } - - L.DomEvent - .on(document, 'touchmove', this._onTouchMove, this) - .on(document, 'touchend', this._onTouchEnd, this); - - L.DomEvent.preventDefault(e); - }, - - _onTouchMove: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } - - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]); - - this._scale = p1.distanceTo(p2) / this._startDist; - this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); - - if (this._scale === 1) { return; } - - if (!map.options.bounceAtZoomLimits) { - if ((map.getZoom() === map.getMinZoom() && this._scale < 1) || - (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; } - } - - if (!this._moved) { - L.DomUtil.addClass(map._mapPane, 'leaflet-touching'); - - map - .fire('movestart') - .fire('zoomstart'); - - this._moved = true; - } - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame( - this._updateOnMove, this, true, this._map._container); - - L.DomEvent.preventDefault(e); - }, - - _updateOnMove: function () { - var map = this._map, - origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - zoom = map.getScaleZoom(this._scale); - - map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true); - }, - - _onTouchEnd: function () { - if (!this._moved || !this._zooming) { - this._zooming = false; - return; - } - - var map = this._map; - - this._zooming = false; - L.DomUtil.removeClass(map._mapPane, 'leaflet-touching'); - L.Util.cancelAnimFrame(this._animRequest); - - L.DomEvent - .off(document, 'touchmove', this._onTouchMove) - .off(document, 'touchend', this._onTouchEnd); - - var origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - - oldZoom = map.getZoom(), - floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom, - roundZoomDelta = (floatZoomDelta > 0 ? - Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)), - - zoom = map._limitZoom(oldZoom + roundZoomDelta), - scale = map.getZoomScale(zoom) / this._scale; - - map._animateZoom(center, zoom, origin, scale); - }, - - _getScaleOrigin: function () { - var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); - return this._startCenter.add(centerOffset); - } -}); - -L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); - - -/* - * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. - */ - -L.Map.mergeOptions({ - tap: true, - tapTolerance: 15 -}); - -L.Map.Tap = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); - }, - - _onDown: function (e) { - if (!e.touches) { return; } - - L.DomEvent.preventDefault(e); - - this._fireClick = true; - - // don't simulate click or track longpress if more than 1 touch - if (e.touches.length > 1) { - this._fireClick = false; - clearTimeout(this._holdTimeout); - return; - } - - var first = e.touches[0], - el = first.target; - - this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); - - // if touching a link, highlight it - if (el.tagName && el.tagName.toLowerCase() === 'a') { - L.DomUtil.addClass(el, 'leaflet-active'); - } - - // simulate long hold but setting a timeout - this._holdTimeout = setTimeout(L.bind(function () { - if (this._isTapValid()) { - this._fireClick = false; - this._onUp(); - this._simulateEvent('contextmenu', first); - } - }, this), 1000); - - L.DomEvent - .on(document, 'touchmove', this._onMove, this) - .on(document, 'touchend', this._onUp, this); - }, - - _onUp: function (e) { - clearTimeout(this._holdTimeout); - - L.DomEvent - .off(document, 'touchmove', this._onMove, this) - .off(document, 'touchend', this._onUp, this); - - if (this._fireClick && e && e.changedTouches) { - - var first = e.changedTouches[0], - el = first.target; - - if (el && el.tagName && el.tagName.toLowerCase() === 'a') { - L.DomUtil.removeClass(el, 'leaflet-active'); - } - - // simulate click if the touch didn't move too much - if (this._isTapValid()) { - this._simulateEvent('click', first); - } - } - }, - - _isTapValid: function () { - return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; - }, - - _onMove: function (e) { - var first = e.touches[0]; - this._newPos = new L.Point(first.clientX, first.clientY); - }, - - _simulateEvent: function (type, e) { - var simulatedEvent = document.createEvent('MouseEvents'); - - simulatedEvent._simulated = true; - e.target._simulatedClick = true; - - simulatedEvent.initMouseEvent( - type, true, true, window, 1, - e.screenX, e.screenY, - e.clientX, e.clientY, - false, false, false, false, 0, null); - - e.target.dispatchEvent(simulatedEvent); - } -}); - -if (L.Browser.touch && !L.Browser.pointer) { - L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); -} - - -/* - * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map - * (zoom to a selected bounding box), enabled by default. - */ - -L.Map.mergeOptions({ - boxZoom: true -}); - -L.Map.BoxZoom = L.Handler.extend({ - initialize: function (map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._moved = false; - }, - - addHooks: function () { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); - this._moved = false; - }, - - moved: function () { - return this._moved; - }, - - _onMouseDown: function (e) { - this._moved = false; - - if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - - this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - - L.DomEvent - .on(document, 'mousemove', this._onMouseMove, this) - .on(document, 'mouseup', this._onMouseUp, this) - .on(document, 'keydown', this._onKeyDown, this); - }, - - _onMouseMove: function (e) { - if (!this._moved) { - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); - L.DomUtil.setPosition(this._box, this._startLayerPoint); - - //TODO refactor: move cursor to styles - this._container.style.cursor = 'crosshair'; - this._map.fire('boxzoomstart'); - } - - var startPoint = this._startLayerPoint, - box = this._box, - - layerPoint = this._map.mouseEventToLayerPoint(e), - offset = layerPoint.subtract(startPoint), - - newPos = new L.Point( - Math.min(layerPoint.x, startPoint.x), - Math.min(layerPoint.y, startPoint.y)); - - L.DomUtil.setPosition(box, newPos); - - this._moved = true; - - // TODO refactor: remove hardcoded 4 pixels - box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; - box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; - }, - - _finish: function () { - if (this._moved) { - this._pane.removeChild(this._box); - this._container.style.cursor = ''; - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - - L.DomEvent - .off(document, 'mousemove', this._onMouseMove) - .off(document, 'mouseup', this._onMouseUp) - .off(document, 'keydown', this._onKeyDown); - }, - - _onMouseUp: function (e) { - - this._finish(); - - var map = this._map, - layerPoint = map.mouseEventToLayerPoint(e); - - if (this._startLayerPoint.equals(layerPoint)) { return; } - - var bounds = new L.LatLngBounds( - map.layerPointToLatLng(this._startLayerPoint), - map.layerPointToLatLng(layerPoint)); - - map.fitBounds(bounds); - - map.fire('boxzoomend', { - boxZoomBounds: bounds - }); - }, - - _onKeyDown: function (e) { - if (e.keyCode === 27) { - this._finish(); - } - } -}); - -L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); - - -/* - * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. - */ - -L.Map.mergeOptions({ - keyboard: true, - keyboardPanOffset: 80, - keyboardZoomOffset: 1 -}); - -L.Map.Keyboard = L.Handler.extend({ - - keyCodes: { - left: [37], - right: [39], - down: [40], - up: [38], - zoomIn: [187, 107, 61, 171], - zoomOut: [189, 109, 173] - }, - - initialize: function (map) { - this._map = map; - - this._setPanOffset(map.options.keyboardPanOffset); - this._setZoomOffset(map.options.keyboardZoomOffset); - }, - - addHooks: function () { - var container = this._map._container; - - // make the container focusable by tabbing - if (container.tabIndex === -1) { - container.tabIndex = '0'; - } - - L.DomEvent - .on(container, 'focus', this._onFocus, this) - .on(container, 'blur', this._onBlur, this) - .on(container, 'mousedown', this._onMouseDown, this); - - this._map - .on('focus', this._addHooks, this) - .on('blur', this._removeHooks, this); - }, - - removeHooks: function () { - this._removeHooks(); - - var container = this._map._container; - - L.DomEvent - .off(container, 'focus', this._onFocus, this) - .off(container, 'blur', this._onBlur, this) - .off(container, 'mousedown', this._onMouseDown, this); - - this._map - .off('focus', this._addHooks, this) - .off('blur', this._removeHooks, this); - }, - - _onMouseDown: function () { - if (this._focused) { return; } - - var body = document.body, - docEl = document.documentElement, - top = body.scrollTop || docEl.scrollTop, - left = body.scrollLeft || docEl.scrollLeft; - - this._map._container.focus(); - - window.scrollTo(left, top); - }, - - _onFocus: function () { - this._focused = true; - this._map.fire('focus'); - }, - - _onBlur: function () { - this._focused = false; - this._map.fire('blur'); - }, - - _setPanOffset: function (pan) { - var keys = this._panKeys = {}, - codes = this.keyCodes, - i, len; - - for (i = 0, len = codes.left.length; i < len; i++) { - keys[codes.left[i]] = [-1 * pan, 0]; - } - for (i = 0, len = codes.right.length; i < len; i++) { - keys[codes.right[i]] = [pan, 0]; - } - for (i = 0, len = codes.down.length; i < len; i++) { - keys[codes.down[i]] = [0, pan]; - } - for (i = 0, len = codes.up.length; i < len; i++) { - keys[codes.up[i]] = [0, -1 * pan]; - } - }, - - _setZoomOffset: function (zoom) { - var keys = this._zoomKeys = {}, - codes = this.keyCodes, - i, len; - - for (i = 0, len = codes.zoomIn.length; i < len; i++) { - keys[codes.zoomIn[i]] = zoom; - } - for (i = 0, len = codes.zoomOut.length; i < len; i++) { - keys[codes.zoomOut[i]] = -zoom; - } - }, - - _addHooks: function () { - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - }, - - _removeHooks: function () { - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - }, - - _onKeyDown: function (e) { - var key = e.keyCode, - map = this._map; - - if (key in this._panKeys) { - - if (map._panAnim && map._panAnim._inProgress) { return; } - - map.panBy(this._panKeys[key]); - - if (map.options.maxBounds) { - map.panInsideBounds(map.options.maxBounds); - } - - } else if (key in this._zoomKeys) { - map.setZoom(map.getZoom() + this._zoomKeys[key]); - - } else { - return; - } - - L.DomEvent.stop(e); - } -}); - -L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); - - -/* - * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. - */ - -L.Handler.MarkerDrag = L.Handler.extend({ - initialize: function (marker) { - this._marker = marker; - }, - - addHooks: function () { - var icon = this._marker._icon; - if (!this._draggable) { - this._draggable = new L.Draggable(icon, icon); - } - - this._draggable - .on('dragstart', this._onDragStart, this) - .on('drag', this._onDrag, this) - .on('dragend', this._onDragEnd, this); - this._draggable.enable(); - L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable'); - }, - - removeHooks: function () { - this._draggable - .off('dragstart', this._onDragStart, this) - .off('drag', this._onDrag, this) - .off('dragend', this._onDragEnd, this); - - this._draggable.disable(); - L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); - }, - - moved: function () { - return this._draggable && this._draggable._moved; - }, - - _onDragStart: function () { - this._marker - .closePopup() - .fire('movestart') - .fire('dragstart'); - }, - - _onDrag: function () { - var marker = this._marker, - shadow = marker._shadow, - iconPos = L.DomUtil.getPosition(marker._icon), - latlng = marker._map.layerPointToLatLng(iconPos); - - // update shadow position - if (shadow) { - L.DomUtil.setPosition(shadow, iconPos); - } - - marker._latlng = latlng; - - marker - .fire('move', {latlng: latlng}) - .fire('drag'); - }, - - _onDragEnd: function (e) { - this._marker - .fire('moveend') - .fire('dragend', e); - } -}); - - -/* - * L.Control is a base class for implementing map controls. Handles positioning. - * All other controls extend from this class. - */ - -L.Control = L.Class.extend({ - options: { - position: 'topright' - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - getPosition: function () { - return this.options.position; - }, - - setPosition: function (position) { - var map = this._map; - - if (map) { - map.removeControl(this); - } - - this.options.position = position; - - if (map) { - map.addControl(this); - } - - return this; - }, - - getContainer: function () { - return this._container; - }, - - addTo: function (map) { - this._map = map; - - var container = this._container = this.onAdd(map), - pos = this.getPosition(), - corner = map._controlCorners[pos]; - - L.DomUtil.addClass(container, 'leaflet-control'); - - if (pos.indexOf('bottom') !== -1) { - corner.insertBefore(container, corner.firstChild); - } else { - corner.appendChild(container); - } - - return this; - }, - - removeFrom: function (map) { - var pos = this.getPosition(), - corner = map._controlCorners[pos]; - - corner.removeChild(this._container); - this._map = null; - - if (this.onRemove) { - this.onRemove(map); - } - - return this; - }, - - _refocusOnMap: function () { - if (this._map) { - this._map.getContainer().focus(); - } - } -}); - -L.control = function (options) { - return new L.Control(options); -}; - - -// adds control-related methods to L.Map - -L.Map.include({ - addControl: function (control) { - control.addTo(this); - return this; - }, - - removeControl: function (control) { - control.removeFrom(this); - return this; - }, - - _initControlPos: function () { - var corners = this._controlCorners = {}, - l = 'leaflet-', - container = this._controlContainer = - L.DomUtil.create('div', l + 'control-container', this._container); - - function createCorner(vSide, hSide) { - var className = l + vSide + ' ' + l + hSide; - - corners[vSide + hSide] = L.DomUtil.create('div', className, container); - } - - createCorner('top', 'left'); - createCorner('top', 'right'); - createCorner('bottom', 'left'); - createCorner('bottom', 'right'); - }, - - _clearControlPos: function () { - this._container.removeChild(this._controlContainer); - } -}); - - -/* - * L.Control.Zoom is used for the default zoom buttons on the map. - */ - -L.Control.Zoom = L.Control.extend({ - options: { - position: 'topleft', - zoomInText: '+', - zoomInTitle: 'Zoom in', - zoomOutText: '-', - zoomOutTitle: 'Zoom out' - }, - - onAdd: function (map) { - var zoomName = 'leaflet-control-zoom', - container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); - - this._map = map; - - this._zoomInButton = this._createButton( - this.options.zoomInText, this.options.zoomInTitle, - zoomName + '-in', container, this._zoomIn, this); - this._zoomOutButton = this._createButton( - this.options.zoomOutText, this.options.zoomOutTitle, - zoomName + '-out', container, this._zoomOut, this); - - this._updateDisabled(); - map.on('zoomend zoomlevelschange', this._updateDisabled, this); - - return container; - }, - - onRemove: function (map) { - map.off('zoomend zoomlevelschange', this._updateDisabled, this); - }, - - _zoomIn: function (e) { - this._map.zoomIn(e.shiftKey ? 3 : 1); - }, - - _zoomOut: function (e) { - this._map.zoomOut(e.shiftKey ? 3 : 1); - }, - - _createButton: function (html, title, className, container, fn, context) { - var link = L.DomUtil.create('a', className, container); - link.innerHTML = html; - link.href = '#'; - link.title = title; - - var stop = L.DomEvent.stopPropagation; - - L.DomEvent - .on(link, 'click', stop) - .on(link, 'mousedown', stop) - .on(link, 'dblclick', stop) - .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', fn, context) - .on(link, 'click', this._refocusOnMap, context); - - return link; - }, - - _updateDisabled: function () { - var map = this._map, - className = 'leaflet-disabled'; - - L.DomUtil.removeClass(this._zoomInButton, className); - L.DomUtil.removeClass(this._zoomOutButton, className); - - if (map._zoom === map.getMinZoom()) { - L.DomUtil.addClass(this._zoomOutButton, className); - } - if (map._zoom === map.getMaxZoom()) { - L.DomUtil.addClass(this._zoomInButton, className); - } - } -}); - -L.Map.mergeOptions({ - zoomControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.zoomControl) { - this.zoomControl = new L.Control.Zoom(); - this.addControl(this.zoomControl); - } -}); - -L.control.zoom = function (options) { - return new L.Control.Zoom(options); -}; - - - -/* - * L.Control.Attribution is used for displaying attribution on the map (added by default). - */ - -L.Control.Attribution = L.Control.extend({ - options: { - position: 'bottomright', - prefix: 'Leaflet' - }, - - initialize: function (options) { - L.setOptions(this, options); - - this._attributions = {}; - }, - - onAdd: function (map) { - this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); - L.DomEvent.disableClickPropagation(this._container); - - for (var i in map._layers) { - if (map._layers[i].getAttribution) { - this.addAttribution(map._layers[i].getAttribution()); - } - } - - map - .on('layeradd', this._onLayerAdd, this) - .on('layerremove', this._onLayerRemove, this); - - this._update(); - - return this._container; - }, - - onRemove: function (map) { - map - .off('layeradd', this._onLayerAdd) - .off('layerremove', this._onLayerRemove); - - }, - - setPrefix: function (prefix) { - this.options.prefix = prefix; - this._update(); - return this; - }, - - addAttribution: function (text) { - if (!text) { return; } - - if (!this._attributions[text]) { - this._attributions[text] = 0; - } - this._attributions[text]++; - - this._update(); - - return this; - }, - - removeAttribution: function (text) { - if (!text) { return; } - - if (this._attributions[text]) { - this._attributions[text]--; - this._update(); - } - - return this; - }, - - _update: function () { - if (!this._map) { return; } - - var attribs = []; - - for (var i in this._attributions) { - if (this._attributions[i]) { - attribs.push(i); - } - } - - var prefixAndAttribs = []; - - if (this.options.prefix) { - prefixAndAttribs.push(this.options.prefix); - } - if (attribs.length) { - prefixAndAttribs.push(attribs.join(', ')); - } - - this._container.innerHTML = prefixAndAttribs.join(' | '); - }, - - _onLayerAdd: function (e) { - if (e.layer.getAttribution) { - this.addAttribution(e.layer.getAttribution()); - } - }, - - _onLayerRemove: function (e) { - if (e.layer.getAttribution) { - this.removeAttribution(e.layer.getAttribution()); - } - } -}); - -L.Map.mergeOptions({ - attributionControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.attributionControl) { - this.attributionControl = (new L.Control.Attribution()).addTo(this); - } -}); - -L.control.attribution = function (options) { - return new L.Control.Attribution(options); -}; - - -/* - * L.Control.Scale is used for displaying metric/imperial scale on the map. - */ - -L.Control.Scale = L.Control.extend({ - options: { - position: 'bottomleft', - maxWidth: 100, - metric: true, - imperial: true, - updateWhenIdle: false - }, - - onAdd: function (map) { - this._map = map; - - var className = 'leaflet-control-scale', - container = L.DomUtil.create('div', className), - options = this.options; - - this._addScales(options, className, container); - - map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); - map.whenReady(this._update, this); - - return container; - }, - - onRemove: function (map) { - map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); - }, - - _addScales: function (options, className, container) { - if (options.metric) { - this._mScale = L.DomUtil.create('div', className + '-line', container); - } - if (options.imperial) { - this._iScale = L.DomUtil.create('div', className + '-line', container); - } - }, - - _update: function () { - var bounds = this._map.getBounds(), - centerLat = bounds.getCenter().lat, - halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), - dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180, - - size = this._map.getSize(), - options = this.options, - maxMeters = 0; - - if (size.x > 0) { - maxMeters = dist * (options.maxWidth / size.x); - } - - this._updateScales(options, maxMeters); - }, - - _updateScales: function (options, maxMeters) { - if (options.metric && maxMeters) { - this._updateMetric(maxMeters); - } - - if (options.imperial && maxMeters) { - this._updateImperial(maxMeters); - } - }, - - _updateMetric: function (maxMeters) { - var meters = this._getRoundNum(maxMeters); - - this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; - this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; - }, - - _updateImperial: function (maxMeters) { - var maxFeet = maxMeters * 3.2808399, - scale = this._iScale, - maxMiles, miles, feet; - - if (maxFeet > 5280) { - maxMiles = maxFeet / 5280; - miles = this._getRoundNum(maxMiles); - - scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; - scale.innerHTML = miles + ' mi'; - - } else { - feet = this._getRoundNum(maxFeet); - - scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; - scale.innerHTML = feet + ' ft'; - } - }, - - _getScaleWidth: function (ratio) { - return Math.round(this.options.maxWidth * ratio) - 10; - }, - - _getRoundNum: function (num) { - var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), - d = num / pow10; - - d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; - - return pow10 * d; - } -}); - -L.control.scale = function (options) { - return new L.Control.Scale(options); -}; - - -/* - * L.Control.Layers is a control to allow users to switch between different layers on the map. - */ - -L.Control.Layers = L.Control.extend({ - options: { - collapsed: true, - position: 'topright', - autoZIndex: true - }, - - initialize: function (baseLayers, overlays, options) { - L.setOptions(this, options); - - this._layers = {}; - this._lastZIndex = 0; - this._handlingClick = false; - - for (var i in baseLayers) { - this._addLayer(baseLayers[i], i); - } - - for (i in overlays) { - this._addLayer(overlays[i], i, true); - } - }, - - onAdd: function (map) { - this._initLayout(); - this._update(); - - map - .on('layeradd', this._onLayerChange, this) - .on('layerremove', this._onLayerChange, this); - - return this._container; - }, - - onRemove: function (map) { - map - .off('layeradd', this._onLayerChange, this) - .off('layerremove', this._onLayerChange, this); - }, - - addBaseLayer: function (layer, name) { - this._addLayer(layer, name); - this._update(); - return this; - }, - - addOverlay: function (layer, name) { - this._addLayer(layer, name, true); - this._update(); - return this; - }, - - removeLayer: function (layer) { - var id = L.stamp(layer); - delete this._layers[id]; - this._update(); - return this; - }, - - _initLayout: function () { - var className = 'leaflet-control-layers', - container = this._container = L.DomUtil.create('div', className); - - //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released - container.setAttribute('aria-haspopup', true); - - if (!L.Browser.touch) { - L.DomEvent - .disableClickPropagation(container) - .disableScrollPropagation(container); - } else { - L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); - } - - var form = this._form = L.DomUtil.create('form', className + '-list'); - - if (this.options.collapsed) { - if (!L.Browser.android) { - L.DomEvent - .on(container, 'mouseover', this._expand, this) - .on(container, 'mouseout', this._collapse, this); - } - var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); - link.href = '#'; - link.title = 'Layers'; - - if (L.Browser.touch) { - L.DomEvent - .on(link, 'click', L.DomEvent.stop) - .on(link, 'click', this._expand, this); - } - else { - L.DomEvent.on(link, 'focus', this._expand, this); - } - //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033 - L.DomEvent.on(form, 'click', function () { - setTimeout(L.bind(this._onInputClick, this), 0); - }, this); - - this._map.on('click', this._collapse, this); - // TODO keyboard accessibility - } else { - this._expand(); - } - - this._baseLayersList = L.DomUtil.create('div', className + '-base', form); - this._separator = L.DomUtil.create('div', className + '-separator', form); - this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); - - container.appendChild(form); - }, - - _addLayer: function (layer, name, overlay) { - var id = L.stamp(layer); - - this._layers[id] = { - layer: layer, - name: name, - overlay: overlay - }; - - if (this.options.autoZIndex && layer.setZIndex) { - this._lastZIndex++; - layer.setZIndex(this._lastZIndex); - } - }, - - _update: function () { - if (!this._container) { - return; - } - - this._baseLayersList.innerHTML = ''; - this._overlaysList.innerHTML = ''; - - var baseLayersPresent = false, - overlaysPresent = false, - i, obj; - - for (i in this._layers) { - obj = this._layers[i]; - this._addItem(obj); - overlaysPresent = overlaysPresent || obj.overlay; - baseLayersPresent = baseLayersPresent || !obj.overlay; - } - - this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; - }, - - _onLayerChange: function (e) { - var obj = this._layers[L.stamp(e.layer)]; - - if (!obj) { return; } - - if (!this._handlingClick) { - this._update(); - } - - var type = obj.overlay ? - (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') : - (e.type === 'layeradd' ? 'baselayerchange' : null); - - if (type) { - this._map.fire(type, obj); - } - }, - - // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) - _createRadioElement: function (name, checked) { - - var radioHtml = '= 0) { - this._onZoomTransitionEnd(); - } - }, - - _nothingToAnimate: function () { - return !this._container.getElementsByClassName('leaflet-zoom-animated').length; - }, - - _tryAnimatedZoom: function (center, zoom, options) { - - if (this._animatingZoom) { return true; } - - options = options || {}; - - // don't animate if disabled, not supported or zoom difference is too large - if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || - Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } - - // offset is the pixel coords of the zoom origin relative to the current center - var scale = this.getZoomScale(zoom), - offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale), - origin = this._getCenterLayerPoint()._add(offset); - - // don't animate if the zoom origin isn't within one screen from the current center, unless forced - if (options.animate !== true && !this.getSize().contains(offset)) { return false; } - - this - .fire('movestart') - .fire('zoomstart'); - - this._animateZoom(center, zoom, origin, scale, null, true); - - return true; - }, - - _animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) { - - if (!forTouchZoom) { - this._animatingZoom = true; - } - - // put transform transition on all layers with leaflet-zoom-animated class - L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); - - // remember what center/zoom to set after animation - this._animateToCenter = center; - this._animateToZoom = zoom; - - // disable any dragging during animation - if (L.Draggable) { - L.Draggable._disabled = true; - } - - L.Util.requestAnimFrame(function () { - this.fire('zoomanim', { - center: center, - zoom: zoom, - origin: origin, - scale: scale, - delta: delta, - backwards: backwards - }); - // horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689 - setTimeout(L.bind(this._onZoomTransitionEnd, this), 250); - }, this); - }, - - _onZoomTransitionEnd: function () { - if (!this._animatingZoom) { return; } - - this._animatingZoom = false; - - L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - - this._resetView(this._animateToCenter, this._animateToZoom, true, true); - - if (L.Draggable) { - L.Draggable._disabled = false; - } - } -}); - - -/* - Zoom animation logic for L.TileLayer. -*/ - -L.TileLayer.include({ - _animateZoom: function (e) { - if (!this._animating) { - this._animating = true; - this._prepareBgBuffer(); - } - - var bg = this._bgBuffer, - transform = L.DomUtil.TRANSFORM, - initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], - scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); - - bg.style[transform] = e.backwards ? - scaleStr + ' ' + initialTransform : - initialTransform + ' ' + scaleStr; - }, - - _endZoomAnim: function () { - var front = this._tileContainer, - bg = this._bgBuffer; - - front.style.visibility = ''; - front.parentNode.appendChild(front); // Bring to fore - - // force reflow - L.Util.falseFn(bg.offsetWidth); - - var zoom = this._map.getZoom(); - if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { - this._clearBgBuffer(); - } - - this._animating = false; - }, - - _clearBgBuffer: function () { - var map = this._map; - - if (map && !map._animatingZoom && !map.touchZoom._zooming) { - this._bgBuffer.innerHTML = ''; - this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; - } - }, - - _prepareBgBuffer: function () { - - var front = this._tileContainer, - bg = this._bgBuffer; - - // if foreground layer doesn't have many tiles but bg layer does, - // keep the existing bg layer and just zoom it some more - - var bgLoaded = this._getLoadedTilesPercentage(bg), - frontLoaded = this._getLoadedTilesPercentage(front); - - if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { - - front.style.visibility = 'hidden'; - this._stopLoadingImages(front); - return; - } - - // prepare the buffer to become the front tile pane - bg.style.visibility = 'hidden'; - bg.style[L.DomUtil.TRANSFORM] = ''; - - // switch out the current layer to be the new bg layer (and vice-versa) - this._tileContainer = bg; - bg = this._bgBuffer = front; - - this._stopLoadingImages(bg); - - //prevent bg buffer from clearing right after zoom - clearTimeout(this._clearBgBufferTimer); - }, - - _getLoadedTilesPercentage: function (container) { - var tiles = container.getElementsByTagName('img'), - i, len, count = 0; - - for (i = 0, len = tiles.length; i < len; i++) { - if (tiles[i].complete) { - count++; - } - } - return count / len; - }, - - // stops loading all tiles in the background layer - _stopLoadingImages: function (container) { - var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), - i, len, tile; - - for (i = 0, len = tiles.length; i < len; i++) { - tile = tiles[i]; - - if (!tile.complete) { - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; - tile.src = L.Util.emptyImageUrl; - - tile.parentNode.removeChild(tile); - } - } - } -}); - - -/* - * Provides L.Map with convenient shortcuts for using browser geolocation features. - */ - -L.Map.include({ - _defaultLocateOptions: { - watch: false, - setView: false, - maxZoom: Infinity, - timeout: 10000, - maximumAge: 0, - enableHighAccuracy: false - }, - - locate: function (/*Object*/ options) { - - options = this._locateOptions = L.extend(this._defaultLocateOptions, options); - - if (!navigator.geolocation) { - this._handleGeolocationError({ - code: 0, - message: 'Geolocation not supported.' - }); - return this; - } - - var onResponse = L.bind(this._handleGeolocationResponse, this), - onError = L.bind(this._handleGeolocationError, this); - - if (options.watch) { - this._locationWatchId = - navigator.geolocation.watchPosition(onResponse, onError, options); - } else { - navigator.geolocation.getCurrentPosition(onResponse, onError, options); - } - return this; - }, - - stopLocate: function () { - if (navigator.geolocation) { - navigator.geolocation.clearWatch(this._locationWatchId); - } - if (this._locateOptions) { - this._locateOptions.setView = false; - } - return this; - }, - - _handleGeolocationError: function (error) { - var c = error.code, - message = error.message || - (c === 1 ? 'permission denied' : - (c === 2 ? 'position unavailable' : 'timeout')); - - if (this._locateOptions.setView && !this._loaded) { - this.fitWorld(); - } - - this.fire('locationerror', { - code: c, - message: 'Geolocation error: ' + message + '.' - }); - }, - - _handleGeolocationResponse: function (pos) { - var lat = pos.coords.latitude, - lng = pos.coords.longitude, - latlng = new L.LatLng(lat, lng), - - latAccuracy = 180 * pos.coords.accuracy / 40075017, - lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat), - - bounds = L.latLngBounds( - [lat - latAccuracy, lng - lngAccuracy], - [lat + latAccuracy, lng + lngAccuracy]), - - options = this._locateOptions; - - if (options.setView) { - var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); - this.setView(latlng, zoom); - } - - var data = { - latlng: latlng, - bounds: bounds, - timestamp: pos.timestamp - }; - - for (var i in pos.coords) { - if (typeof pos.coords[i] === 'number') { - data[i] = pos.coords[i]; - } - } - - this.fire('locationfound', data); - } -}); - - -}(window, document)); \ No newline at end of file diff --git a/dist/leaflet.css b/dist/leaflet.css deleted file mode 100755 index ac0cd174df7..00000000000 --- a/dist/leaflet.css +++ /dev/null @@ -1,478 +0,0 @@ -/* required styles */ - -.leaflet-map-pane, -.leaflet-tile, -.leaflet-marker-icon, -.leaflet-marker-shadow, -.leaflet-tile-pane, -.leaflet-tile-container, -.leaflet-overlay-pane, -.leaflet-shadow-pane, -.leaflet-marker-pane, -.leaflet-popup-pane, -.leaflet-overlay-pane svg, -.leaflet-zoom-box, -.leaflet-image-layer, -.leaflet-layer { - position: absolute; - left: 0; - top: 0; - } -.leaflet-container { - overflow: hidden; - -ms-touch-action: none; - } -.leaflet-tile, -.leaflet-marker-icon, -.leaflet-marker-shadow { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - -webkit-user-drag: none; - } -.leaflet-marker-icon, -.leaflet-marker-shadow { - display: block; - } -/* map is broken in FF if you have max-width: 100% on tiles */ -.leaflet-container img { - max-width: none !important; - } -/* stupid Android 2 doesn't understand "max-width: none" properly */ -.leaflet-container img.leaflet-image-layer { - max-width: 15000px !important; - } -.leaflet-tile { - filter: inherit; - visibility: hidden; - } -.leaflet-tile-loaded { - visibility: inherit; - } -.leaflet-zoom-box { - width: 0; - height: 0; - } -/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ -.leaflet-overlay-pane svg { - -moz-user-select: none; - } - -.leaflet-tile-pane { z-index: 2; } -.leaflet-objects-pane { z-index: 3; } -.leaflet-overlay-pane { z-index: 4; } -.leaflet-shadow-pane { z-index: 5; } -.leaflet-marker-pane { z-index: 6; } -.leaflet-popup-pane { z-index: 7; } - -.leaflet-vml-shape { - width: 1px; - height: 1px; - } -.lvml { - behavior: url(#default#VML); - display: inline-block; - position: absolute; - } - - -/* control positioning */ - -.leaflet-control { - position: relative; - z-index: 7; - pointer-events: auto; - } -.leaflet-top, -.leaflet-bottom { - position: absolute; - z-index: 1000; - pointer-events: none; - } -.leaflet-top { - top: 0; - } -.leaflet-right { - right: 0; - } -.leaflet-bottom { - bottom: 0; - } -.leaflet-left { - left: 0; - } -.leaflet-control { - float: left; - clear: both; - } -.leaflet-right .leaflet-control { - float: right; - } -.leaflet-top .leaflet-control { - margin-top: 10px; - } -.leaflet-bottom .leaflet-control { - margin-bottom: 10px; - } -.leaflet-left .leaflet-control { - margin-left: 10px; - } -.leaflet-right .leaflet-control { - margin-right: 10px; - } - - -/* zoom and fade animations */ - -.leaflet-fade-anim .leaflet-tile, -.leaflet-fade-anim .leaflet-popup { - opacity: 0; - -webkit-transition: opacity 0.2s linear; - -moz-transition: opacity 0.2s linear; - -o-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; - } -.leaflet-fade-anim .leaflet-tile-loaded, -.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { - opacity: 1; - } - -.leaflet-zoom-anim .leaflet-zoom-animated { - -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); - -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); - -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); - transition: transform 0.25s cubic-bezier(0,0,0.25,1); - } -.leaflet-zoom-anim .leaflet-tile, -.leaflet-pan-anim .leaflet-tile, -.leaflet-touching .leaflet-zoom-animated { - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; - } - -.leaflet-zoom-anim .leaflet-zoom-hide { - visibility: hidden; - } - - -/* cursors */ - -.leaflet-clickable { - cursor: pointer; - } -.leaflet-container { - cursor: -webkit-grab; - cursor: -moz-grab; - } -.leaflet-popup-pane, -.leaflet-control { - cursor: auto; - } -.leaflet-dragging .leaflet-container, -.leaflet-dragging .leaflet-clickable { - cursor: move; - cursor: -webkit-grabbing; - cursor: -moz-grabbing; - } - - -/* visual tweaks */ - -.leaflet-container { - background: #ddd; - outline: 0; - } -.leaflet-container a { - color: #0078A8; - } -.leaflet-container a.leaflet-active { - outline: 2px solid orange; - } -.leaflet-zoom-box { - border: 2px dotted #38f; - background: rgba(255,255,255,0.5); - } - - -/* general typography */ -.leaflet-container { - font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; - } - - -/* general toolbar styles */ - -.leaflet-bar { - box-shadow: 0 1px 5px rgba(0,0,0,0.65); - border-radius: 4px; - } -.leaflet-bar a, -.leaflet-bar a:hover { - background-color: #fff; - border-bottom: 1px solid #ccc; - width: 26px; - height: 26px; - line-height: 26px; - display: block; - text-align: center; - text-decoration: none; - color: black; - } -.leaflet-bar a, -.leaflet-control-layers-toggle { - background-position: 50% 50%; - background-repeat: no-repeat; - display: block; - } -.leaflet-bar a:hover { - background-color: #f4f4f4; - } -.leaflet-bar a:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - } -.leaflet-bar a:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - border-bottom: none; - } -.leaflet-bar a.leaflet-disabled { - cursor: default; - background-color: #f4f4f4; - color: #bbb; - } - -.leaflet-touch .leaflet-bar a { - width: 30px; - height: 30px; - line-height: 30px; - } - - -/* zoom control */ - -.leaflet-control-zoom-in, -.leaflet-control-zoom-out { - font: bold 18px 'Lucida Console', Monaco, monospace; - text-indent: 1px; - } -.leaflet-control-zoom-out { - font-size: 20px; - } - -.leaflet-touch .leaflet-control-zoom-in { - font-size: 22px; - } -.leaflet-touch .leaflet-control-zoom-out { - font-size: 24px; - } - - -/* layers control */ - -.leaflet-control-layers { - box-shadow: 0 1px 5px rgba(0,0,0,0.4); - background: #fff; - border-radius: 5px; - } -.leaflet-control-layers-toggle { - background-image: url(images/layers.png); - width: 36px; - height: 36px; - } -.leaflet-retina .leaflet-control-layers-toggle { - background-image: url(images/layers-2x.png); - background-size: 26px 26px; - } -.leaflet-touch .leaflet-control-layers-toggle { - width: 44px; - height: 44px; - } -.leaflet-control-layers .leaflet-control-layers-list, -.leaflet-control-layers-expanded .leaflet-control-layers-toggle { - display: none; - } -.leaflet-control-layers-expanded .leaflet-control-layers-list { - display: block; - position: relative; - } -.leaflet-control-layers-expanded { - padding: 6px 10px 6px 6px; - color: #333; - background: #fff; - } -.leaflet-control-layers-selector { - margin-top: 2px; - position: relative; - top: 1px; - } -.leaflet-control-layers label { - display: block; - } -.leaflet-control-layers-separator { - height: 0; - border-top: 1px solid #ddd; - margin: 5px -10px 5px -6px; - } - - -/* attribution and scale controls */ - -.leaflet-container .leaflet-control-attribution { - background: #fff; - background: rgba(255, 255, 255, 0.7); - margin: 0; - } -.leaflet-control-attribution, -.leaflet-control-scale-line { - padding: 0 5px; - color: #333; - } -.leaflet-control-attribution a { - text-decoration: none; - } -.leaflet-control-attribution a:hover { - text-decoration: underline; - } -.leaflet-container .leaflet-control-attribution, -.leaflet-container .leaflet-control-scale { - font-size: 11px; - } -.leaflet-left .leaflet-control-scale { - margin-left: 5px; - } -.leaflet-bottom .leaflet-control-scale { - margin-bottom: 5px; - } -.leaflet-control-scale-line { - border: 2px solid #777; - border-top: none; - line-height: 1.1; - padding: 2px 5px 1px; - font-size: 11px; - white-space: nowrap; - overflow: hidden; - -moz-box-sizing: content-box; - box-sizing: content-box; - - background: #fff; - background: rgba(255, 255, 255, 0.5); - } -.leaflet-control-scale-line:not(:first-child) { - border-top: 2px solid #777; - border-bottom: none; - margin-top: -2px; - } -.leaflet-control-scale-line:not(:first-child):not(:last-child) { - border-bottom: 2px solid #777; - } - -.leaflet-touch .leaflet-control-attribution, -.leaflet-touch .leaflet-control-layers, -.leaflet-touch .leaflet-bar { - box-shadow: none; - } -.leaflet-touch .leaflet-control-layers, -.leaflet-touch .leaflet-bar { - border: 2px solid rgba(0,0,0,0.2); - background-clip: padding-box; - } - - -/* popup */ - -.leaflet-popup { - position: absolute; - text-align: center; - } -.leaflet-popup-content-wrapper { - padding: 1px; - text-align: left; - border-radius: 12px; - } -.leaflet-popup-content { - margin: 13px 19px; - line-height: 1.4; - } -.leaflet-popup-content p { - margin: 18px 0; - } -.leaflet-popup-tip-container { - margin: 0 auto; - width: 40px; - height: 20px; - position: relative; - overflow: hidden; - } -.leaflet-popup-tip { - width: 17px; - height: 17px; - padding: 1px; - - margin: -10px auto 0; - - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - } -.leaflet-popup-content-wrapper, -.leaflet-popup-tip { - background: white; - - box-shadow: 0 3px 14px rgba(0,0,0,0.4); - } -.leaflet-container a.leaflet-popup-close-button { - position: absolute; - top: 0; - right: 0; - padding: 4px 4px 0 0; - text-align: center; - width: 18px; - height: 14px; - font: 16px/14px Tahoma, Verdana, sans-serif; - color: #c3c3c3; - text-decoration: none; - font-weight: bold; - background: transparent; - } -.leaflet-container a.leaflet-popup-close-button:hover { - color: #999; - } -.leaflet-popup-scrolled { - overflow: auto; - border-bottom: 1px solid #ddd; - border-top: 1px solid #ddd; - } - -.leaflet-oldie .leaflet-popup-content-wrapper { - zoom: 1; - } -.leaflet-oldie .leaflet-popup-tip { - width: 24px; - margin: 0 auto; - - -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; - filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); - } -.leaflet-oldie .leaflet-popup-tip-container { - margin-top: -1px; - } - -.leaflet-oldie .leaflet-control-zoom, -.leaflet-oldie .leaflet-control-layers, -.leaflet-oldie .leaflet-popup-content-wrapper, -.leaflet-oldie .leaflet-popup-tip { - border: 1px solid #999; - } - - -/* div icon */ - -.leaflet-div-icon { - background: #fff; - border: 1px solid #666; - } diff --git a/dist/leaflet.js b/dist/leaflet.js deleted file mode 100644 index c469495adf5..00000000000 --- a/dist/leaflet.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com - (c) 2010-2013, Vladimir Agafonkin - (c) 2010-2011, CloudMade -*/ -!function(t,e,i){var n=t.L,o={};o.version="0.7.5","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=!t.PointerEvent&&t.MSPointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&(m||"ontouchstart"in t||t.DocumentTouch&&e instanceof t.DocumentTouch);o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n));s=e.maxZoom?Math.min(e.maxZoom,s):s;var a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-(1/0),o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395", -projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-(1/0));for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||in;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=this._getTileSize(),o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+=t.zoomOffset,t.maxNativeZoom?Math.min(e,t.maxNativeZoom):e},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this._getTileSize();return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=o.DomUtil.create("img","leaflet-tile");return t.style.width=t.style.height=this._getTileSize()+"px",t.galleryimg="no",t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;e.detectRetina&&o.Browser.retina?i.width=i.height=2*n:i.width=i.height=n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTile:function(){var t=o.DomUtil.create("canvas","leaflet-tile");return t.width=t.height=this.options.tileSize,t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){return this._icon&&this._setPos(this._map.latLngToLayerPoint(this._latlng).round()),this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t,t._source=this):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,i.dashArray?t.dashStyle=o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):t.dashStyle="",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this.fire("remove"),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color),t.lineCap&&(this._ctx.lineCap=t.lineCap),t.lineJoin&&(this._ctx.lineJoin=t.lineJoin)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill(e.fillRule||"evenodd")),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click dblclick contextmenu",this._fireMouseEvent,this))},_fireMouseEvent:function(t){this._containsPoint(t.layerPoint)&&this.fire(t.type,t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return void(this._parts=[n]);this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&500>n||t.target._simulatedClick&&!t._simulated?void o.DomEvent.stop(t):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return void(this._moved=!0);var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.Browser.touch&&Math.abs(s.x)+Math.abs(s.y)<3||(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,o.DomUtil.addClass(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget)))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.DomUtil.removeClass(e.body,"leaflet-dragging"),this._lastTarget&&(o.DomUtil.removeClass(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null);for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],"function"==typeof n?s[a]=n.bind(h):s[a]=n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n); -case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta,!1,!0)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),void o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this))},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange,this).off("layerremove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,void this.fire("step")):void this._onTransitionEnd()},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a,r){r||(this._animatingZoom=!0),o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),o.Util.requestAnimFrame(function(){this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a}),setTimeout(o.bind(this._onZoomTransitionEnd,this),250)},this)},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1))}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth);var i=this._map.getZoom();(i>this.options.maxZoom||i.5&&.5>n?(t.style.visibility="hidden",void this._stopLoadingImages(t)):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),void clearTimeout(this._clearBgBufferTimer))},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file diff --git a/package.json b/package.json deleted file mode 100644 index 98c8b6fa2db..00000000000 --- a/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "leaflet", - "version": "0.7.2", - "description": "JavaScript library for mobile-friendly interactive maps", - "devDependencies": { - "jake": "~0.7.4", - "jshint": "~2.3.0", - "uglify-js": "~2.4.3", - "mocha": "~1.14.0", - "happen": "~0.1.3", - "karma": "~0.10.4", - "karma-mocha": "~0.1.0" - }, - "main": "dist/leaflet-src.js", - "scripts": { - "test": "jake test", - "prepublish": "jake build" - }, - "repository": { - "type": "git", - "url": "git://github.com/Leaflet/Leaflet.git" - }, - "keywords": [ - "gis", - "map" - ] -} diff --git a/spec/after.js b/spec/after.js deleted file mode 100644 index 94d1dfee480..00000000000 --- a/spec/after.js +++ /dev/null @@ -1,2 +0,0 @@ -// put after Leaflet files as imagePath can't be detected in a PhantomJS env -L.Icon.Default.imagePath = "/base/dist/images"; diff --git a/spec/before.js b/spec/before.js deleted file mode 100644 index ef0ea0f47af..00000000000 --- a/spec/before.js +++ /dev/null @@ -1,3 +0,0 @@ -// set up before Leaflet files to test L#noConflict later -L = 'test'; - diff --git a/spec/expect.js b/spec/expect.js deleted file mode 100644 index 58c7049e0e9..00000000000 --- a/spec/expect.js +++ /dev/null @@ -1,1253 +0,0 @@ - -(function (global, module) { - - if ('undefined' == typeof module) { - var module = { exports: {} } - , exports = module.exports - } - - /** - * Exports. - */ - - module.exports = expect; - expect.Assertion = Assertion; - - /** - * Exports version. - */ - - expect.version = '0.1.2'; - - /** - * Possible assertion flags. - */ - - var flags = { - not: ['to', 'be', 'have', 'include', 'only'] - , to: ['be', 'have', 'include', 'only', 'not'] - , only: ['have'] - , have: ['own'] - , be: ['an'] - }; - - function expect (obj) { - return new Assertion(obj); - } - - /** - * Constructor - * - * @api private - */ - - function Assertion (obj, flag, parent) { - this.obj = obj; - this.flags = {}; - - if (undefined != parent) { - this.flags[flag] = true; - - for (var i in parent.flags) { - if (parent.flags.hasOwnProperty(i)) { - this.flags[i] = true; - } - } - } - - var $flags = flag ? flags[flag] : keys(flags) - , self = this - - if ($flags) { - for (var i = 0, l = $flags.length; i < l; i++) { - // avoid recursion - if (this.flags[$flags[i]]) continue; - - var name = $flags[i] - , assertion = new Assertion(this.obj, name, this) - - if ('function' == typeof Assertion.prototype[name]) { - // clone the function, make sure we dont touch the prot reference - var old = this[name]; - this[name] = function () { - return old.apply(self, arguments); - } - - for (var fn in Assertion.prototype) { - if (Assertion.prototype.hasOwnProperty(fn) && fn != name) { - this[name][fn] = bind(assertion[fn], assertion); - } - } - } else { - this[name] = assertion; - } - } - } - }; - - /** - * Performs an assertion - * - * @api private - */ - - Assertion.prototype.assert = function (truth, msg, error) { - var msg = this.flags.not ? error : msg - , ok = this.flags.not ? !truth : truth; - - if (!ok) { - throw new Error(msg.call(this)); - } - - this.and = new Assertion(this.obj); - }; - - /** - * Check if the value is truthy - * - * @api public - */ - - Assertion.prototype.ok = function () { - this.assert( - !!this.obj - , function(){ return 'expected ' + i(this.obj) + ' to be truthy' } - , function(){ return 'expected ' + i(this.obj) + ' to be falsy' }); - }; - - /** - * Assert that the function throws. - * - * @param {Function|RegExp} callback, or regexp to match error string against - * @api public - */ - - Assertion.prototype.throwError = - Assertion.prototype.throwException = function (fn) { - expect(this.obj).to.be.a('function'); - - var thrown = false - , not = this.flags.not - - try { - this.obj(); - } catch (e) { - if ('function' == typeof fn) { - fn(e); - } else if ('object' == typeof fn) { - var subject = 'string' == typeof e ? e : e.message; - if (not) { - expect(subject).to.not.match(fn); - } else { - expect(subject).to.match(fn); - } - } - thrown = true; - } - - if ('object' == typeof fn && not) { - // in the presence of a matcher, ensure the `not` only applies to - // the matching. - this.flags.not = false; - } - - var name = this.obj.name || 'fn'; - this.assert( - thrown - , function(){ return 'expected ' + name + ' to throw an exception' } - , function(){ return 'expected ' + name + ' not to throw an exception' }); - }; - - /** - * Checks if the array is empty. - * - * @api public - */ - - Assertion.prototype.empty = function () { - var expectation; - - if ('object' == typeof this.obj && null !== this.obj && !isArray(this.obj)) { - if ('number' == typeof this.obj.length) { - expectation = !this.obj.length; - } else { - expectation = !keys(this.obj).length; - } - } else { - if ('string' != typeof this.obj) { - expect(this.obj).to.be.an('object'); - } - - expect(this.obj).to.have.property('length'); - expectation = !this.obj.length; - } - - this.assert( - expectation - , function(){ return 'expected ' + i(this.obj) + ' to be empty' } - , function(){ return 'expected ' + i(this.obj) + ' to not be empty' }); - return this; - }; - - /** - * Checks if the obj exactly equals another. - * - * @api public - */ - - Assertion.prototype.be = - Assertion.prototype.equal = function (obj) { - this.assert( - obj === this.obj - , function(){ return 'expected ' + i(this.obj) + ' to equal ' + i(obj) } - , function(){ return 'expected ' + i(this.obj) + ' to not equal ' + i(obj) }); - return this; - }; - - /** - * Checks if the obj sortof equals another. - * - * @api public - */ - - Assertion.prototype.eql = function (obj) { - this.assert( - expect.eql(obj, this.obj) - , function(){ return 'expected ' + i(this.obj) + ' to sort of equal ' + i(obj) } - , function(){ return 'expected ' + i(this.obj) + ' to sort of not equal ' + i(obj) }); - return this; - }; - - /** - * Assert within start to finish (inclusive). - * - * @param {Number} start - * @param {Number} finish - * @api public - */ - - Assertion.prototype.within = function (start, finish) { - var range = start + '..' + finish; - this.assert( - this.obj >= start && this.obj <= finish - , function(){ return 'expected ' + i(this.obj) + ' to be within ' + range } - , function(){ return 'expected ' + i(this.obj) + ' to not be within ' + range }); - return this; - }; - - /** - * Assert typeof / instance of - * - * @api public - */ - - Assertion.prototype.a = - Assertion.prototype.an = function (type) { - if ('string' == typeof type) { - // proper english in error msg - var n = /^[aeiou]/.test(type) ? 'n' : ''; - - // typeof with support for 'array' - this.assert( - 'array' == type ? isArray(this.obj) : - 'object' == type - ? 'object' == typeof this.obj && null !== this.obj - : type == typeof this.obj - , function(){ return 'expected ' + i(this.obj) + ' to be a' + n + ' ' + type } - , function(){ return 'expected ' + i(this.obj) + ' not to be a' + n + ' ' + type }); - } else { - // instanceof - var name = type.name || 'supplied constructor'; - this.assert( - this.obj instanceof type - , function(){ return 'expected ' + i(this.obj) + ' to be an instance of ' + name } - , function(){ return 'expected ' + i(this.obj) + ' not to be an instance of ' + name }); - } - - return this; - }; - - /** - * Assert numeric value above _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.greaterThan = - Assertion.prototype.above = function (n) { - this.assert( - this.obj > n - , function(){ return 'expected ' + i(this.obj) + ' to be above ' + n } - , function(){ return 'expected ' + i(this.obj) + ' to be below ' + n }); - return this; - }; - - /** - * Assert numeric value below _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.lessThan = - Assertion.prototype.below = function (n) { - this.assert( - this.obj < n - , function(){ return 'expected ' + i(this.obj) + ' to be below ' + n } - , function(){ return 'expected ' + i(this.obj) + ' to be above ' + n }); - return this; - }; - - /** - * Assert string value matches _regexp_. - * - * @param {RegExp} regexp - * @api public - */ - - Assertion.prototype.match = function (regexp) { - this.assert( - regexp.exec(this.obj) - , function(){ return 'expected ' + i(this.obj) + ' to match ' + regexp } - , function(){ return 'expected ' + i(this.obj) + ' not to match ' + regexp }); - return this; - }; - - /** - * Assert property "length" exists and has value of _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.length = function (n) { - expect(this.obj).to.have.property('length'); - var len = this.obj.length; - this.assert( - n == len - , function(){ return 'expected ' + i(this.obj) + ' to have a length of ' + n + ' but got ' + len } - , function(){ return 'expected ' + i(this.obj) + ' to not have a length of ' + len }); - return this; - }; - - /** - * Assert property _name_ exists, with optional _val_. - * - * @param {String} name - * @param {Mixed} val - * @api public - */ - - Assertion.prototype.property = function (name, val) { - if (this.flags.own) { - this.assert( - Object.prototype.hasOwnProperty.call(this.obj, name) - , function(){ return 'expected ' + i(this.obj) + ' to have own property ' + i(name) } - , function(){ return 'expected ' + i(this.obj) + ' to not have own property ' + i(name) }); - return this; - } - - if (this.flags.not && undefined !== val) { - if (undefined === this.obj[name]) { - throw new Error(i(this.obj) + ' has no property ' + i(name)); - } - } else { - var hasProp; - try { - hasProp = name in this.obj - } catch (e) { - hasProp = undefined !== this.obj[name] - } - - this.assert( - hasProp - , function(){ return 'expected ' + i(this.obj) + ' to have a property ' + i(name) } - , function(){ return 'expected ' + i(this.obj) + ' to not have a property ' + i(name) }); - } - - if (undefined !== val) { - this.assert( - val === this.obj[name] - , function(){ return 'expected ' + i(this.obj) + ' to have a property ' + i(name) - + ' of ' + i(val) + ', but got ' + i(this.obj[name]) } - , function(){ return 'expected ' + i(this.obj) + ' to not have a property ' + i(name) - + ' of ' + i(val) }); - } - - this.obj = this.obj[name]; - return this; - }; - - /** - * Assert that the array contains _obj_ or string contains _obj_. - * - * @param {Mixed} obj|string - * @api public - */ - - Assertion.prototype.string = - Assertion.prototype.contain = function (obj) { - if ('string' == typeof this.obj) { - this.assert( - ~this.obj.indexOf(obj) - , function(){ return 'expected ' + i(this.obj) + ' to contain ' + i(obj) } - , function(){ return 'expected ' + i(this.obj) + ' to not contain ' + i(obj) }); - } else { - this.assert( - ~indexOf(this.obj, obj) - , function(){ return 'expected ' + i(this.obj) + ' to contain ' + i(obj) } - , function(){ return 'expected ' + i(this.obj) + ' to not contain ' + i(obj) }); - } - return this; - }; - - /** - * Assert exact keys or inclusion of keys by using - * the `.own` modifier. - * - * @param {Array|String ...} keys - * @api public - */ - - Assertion.prototype.key = - Assertion.prototype.keys = function ($keys) { - var str - , ok = true; - - $keys = isArray($keys) - ? $keys - : Array.prototype.slice.call(arguments); - - if (!$keys.length) throw new Error('keys required'); - - var actual = keys(this.obj) - , len = $keys.length; - - // Inclusion - ok = every($keys, function (key) { - return ~indexOf(actual, key); - }); - - // Strict - if (!this.flags.not && this.flags.only) { - ok = ok && $keys.length == actual.length; - } - - // Key string - if (len > 1) { - $keys = map($keys, function (key) { - return i(key); - }); - var last = $keys.pop(); - str = $keys.join(', ') + ', and ' + last; - } else { - str = i($keys[0]); - } - - // Form - str = (len > 1 ? 'keys ' : 'key ') + str; - - // Have / include - str = (!this.flags.only ? 'include ' : 'only have ') + str; - - // Assertion - this.assert( - ok - , function(){ return 'expected ' + i(this.obj) + ' to ' + str } - , function(){ return 'expected ' + i(this.obj) + ' to not ' + str }); - - return this; - }; - /** - * Assert a failure. - * - * @param {String ...} custom message - * @api public - */ - Assertion.prototype.fail = function (msg) { - msg = msg || "explicit failure"; - this.assert(false, msg, msg); - return this; - }; - - /** - * Function bind implementation. - */ - - function bind (fn, scope) { - return function () { - return fn.apply(scope, arguments); - } - } - - /** - * Array every compatibility - * - * @see bit.ly/5Fq1N2 - * @api public - */ - - function every (arr, fn, thisObj) { - var scope = thisObj || global; - for (var i = 0, j = arr.length; i < j; ++i) { - if (!fn.call(scope, arr[i], i, arr)) { - return false; - } - } - return true; - }; - - /** - * Array indexOf compatibility. - * - * @see bit.ly/a5Dxa2 - * @api public - */ - - function indexOf (arr, o, i) { - if (Array.prototype.indexOf) { - return Array.prototype.indexOf.call(arr, o, i); - } - - if (arr.length === undefined) { - return -1; - } - - for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0 - ; i < j && arr[i] !== o; i++); - - return j <= i ? -1 : i; - }; - - // https://gist.github.com/1044128/ - var getOuterHTML = function(element) { - if ('outerHTML' in element) return element.outerHTML; - var ns = "http://www.w3.org/1999/xhtml"; - var container = document.createElementNS(ns, '_'); - var elemProto = (window.HTMLElement || window.Element).prototype; - var xmlSerializer = new XMLSerializer(); - var html; - if (document.xmlVersion) { - return xmlSerializer.serializeToString(element); - } else { - container.appendChild(element.cloneNode(false)); - html = container.innerHTML.replace('><', '>' + element.innerHTML + '<'); - container.innerHTML = ''; - return html; - } - }; - - // Returns true if object is a DOM element. - var isDOMElement = function (object) { - if (typeof HTMLElement === 'object') { - return object instanceof HTMLElement; - } else { - return object && - typeof object === 'object' && - object.nodeType === 1 && - typeof object.nodeName === 'string'; - } - }; - - /** - * Inspects an object. - * - * @see taken from node.js `util` module (copyright Joyent, MIT license) - * @api private - */ - - function i (obj, showHidden, depth) { - var seen = []; - - function stylize (str) { - return str; - }; - - function format (value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (value && typeof value.inspect === 'function' && - // Filter out the util module, it's inspect function is special - value !== exports && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - return value.inspect(recurseTimes); - } - - // Primitive types cannot have properties - switch (typeof value) { - case 'undefined': - return stylize('undefined', 'undefined'); - - case 'string': - var simple = '\'' + json.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return stylize(simple, 'string'); - - case 'number': - return stylize('' + value, 'number'); - - case 'boolean': - return stylize('' + value, 'boolean'); - } - // For some reason typeof null is "object", so special case here. - if (value === null) { - return stylize('null', 'null'); - } - - if (isDOMElement(value)) { - return getOuterHTML(value); - } - - // Look up the keys of the object. - var visible_keys = keys(value); - var $keys = showHidden ? Object.getOwnPropertyNames(value) : visible_keys; - - // Functions without properties can be shortcutted. - if (typeof value === 'function' && $keys.length === 0) { - if (isRegExp(value)) { - return stylize('' + value, 'regexp'); - } else { - var name = value.name ? ': ' + value.name : ''; - return stylize('[Function' + name + ']', 'special'); - } - } - - // Dates without properties can be shortcutted - if (isDate(value) && $keys.length === 0) { - return stylize(value.toUTCString(), 'date'); - } - - var base, type, braces; - // Determine the object type - if (isArray(value)) { - type = 'Array'; - braces = ['[', ']']; - } else { - type = 'Object'; - braces = ['{', '}']; - } - - // Make functions say that they are functions - if (typeof value === 'function') { - var n = value.name ? ': ' + value.name : ''; - base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']'; - } else { - base = ''; - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + value.toUTCString(); - } - - if ($keys.length === 0) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return stylize('' + value, 'regexp'); - } else { - return stylize('[Object]', 'special'); - } - } - - seen.push(value); - - var output = map($keys, function (key) { - var name, str; - if (value.__lookupGetter__) { - if (value.__lookupGetter__(key)) { - if (value.__lookupSetter__(key)) { - str = stylize('[Getter/Setter]', 'special'); - } else { - str = stylize('[Getter]', 'special'); - } - } else { - if (value.__lookupSetter__(key)) { - str = stylize('[Setter]', 'special'); - } - } - } - if (indexOf(visible_keys, key) < 0) { - name = '[' + key + ']'; - } - if (!str) { - if (indexOf(seen, value[key]) < 0) { - if (recurseTimes === null) { - str = format(value[key]); - } else { - str = format(value[key], recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (isArray(value)) { - str = map(str.split('\n'), function (line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + map(str.split('\n'), function (line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = stylize('[Circular]', 'special'); - } - } - if (typeof name === 'undefined') { - if (type === 'Array' && key.match(/^\d+$/)) { - return str; - } - name = json.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = stylize(name, 'string'); - } - } - - return name + ': ' + str; - }); - - seen.pop(); - - var numLinesEst = 0; - var length = reduce(output, function (prev, cur) { - numLinesEst++; - if (indexOf(cur, '\n') >= 0) numLinesEst++; - return prev + cur.length + 1; - }, 0); - - if (length > 50) { - output = braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - - } else { - output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; - } - - return output; - } - return format(obj, (typeof depth === 'undefined' ? 2 : depth)); - }; - - function isArray (ar) { - return Object.prototype.toString.call(ar) == '[object Array]'; - }; - - function isRegExp(re) { - var s; - try { - s = '' + re; - } catch (e) { - return false; - } - - return re instanceof RegExp || // easy case - // duck-type for context-switching evalcx case - typeof(re) === 'function' && - re.constructor.name === 'RegExp' && - re.compile && - re.test && - re.exec && - s.match(/^\/.*\/[gim]{0,3}$/); - }; - - function isDate(d) { - if (d instanceof Date) return true; - return false; - }; - - function keys (obj) { - if (Object.keys) { - return Object.keys(obj); - } - - var keys = []; - - for (var i in obj) { - if (Object.prototype.hasOwnProperty.call(obj, i)) { - keys.push(i); - } - } - - return keys; - } - - function map (arr, mapper, that) { - if (Array.prototype.map) { - return Array.prototype.map.call(arr, mapper, that); - } - - var other= new Array(arr.length); - - for (var i= 0, n = arr.length; i= 2) { - var rv = arguments[1]; - } else { - do { - if (i in this) { - rv = this[i++]; - break; - } - - // if array contains no values, no initial value to return - if (++i >= len) - throw new TypeError(); - } while (true); - } - - for (; i < len; i++) { - if (i in this) - rv = fun.call(null, rv, this[i], i, this); - } - - return rv; - }; - - /** - * Asserts deep equality - * - * @see taken from node.js `assert` module (copyright Joyent, MIT license) - * @api private - */ - - expect.eql = function eql (actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if ('undefined' != typeof Buffer - && Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - - return true; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } - } - - function isUndefinedOrNull (value) { - return value === null || value === undefined; - } - - function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; - } - - function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return expect.eql(a, b); - } - try{ - var ka = keys(a), - kb = keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!expect.eql(a[key], b[key])) - return false; - } - return true; - } - - var json = (function () { - "use strict"; - - if ('object' == typeof JSON && JSON.parse && JSON.stringify) { - return { - parse: nativeJSON.parse - , stringify: nativeJSON.stringify - } - } - - var JSON = {}; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - function date(d, key) { - return isFinite(d.valueOf()) ? - d.getUTCFullYear() + '-' + - f(d.getUTCMonth() + 1) + '-' + - f(d.getUTCDate()) + 'T' + - f(d.getUTCHours()) + ':' + - f(d.getUTCMinutes()) + ':' + - f(d.getUTCSeconds()) + 'Z' : null; - }; - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : '"' + string + '"'; - } - - - function str(key, holder) { - - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if (value instanceof Date) { - value = date(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case 'object': - - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return 'null'; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = partial.length === 0 ? '[]' : gap ? - '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - if (typeof rep[i] === 'string') { - k = rep[i]; - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = partial.length === 0 ? '{}' : gap ? - '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : - '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - JSON.stringify = function (value, replacer, space) { - - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - - // If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str('', {'': value}); - }; - - // If the JSON object does not yet have a parse method, give it one. - - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ - .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') - .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') - .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - - return JSON; - })(); - - if ('undefined' != typeof window) { - window.expect = module.exports; - } - -})( - this - , 'undefined' != typeof module ? module : {} - , 'undefined' != typeof exports ? exports : {} -); diff --git a/spec/index.html b/spec/index.html deleted file mode 100644 index f1201a8fc8a..00000000000 --- a/spec/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - Leaflet Spec Runner - - - -
            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spec/karma.conf.js b/spec/karma.conf.js deleted file mode 100644 index 76f717b54b0..00000000000 --- a/spec/karma.conf.js +++ /dev/null @@ -1,65 +0,0 @@ -// Karma configuration -module.exports = function (config) { - - var libSources = require(__dirname+'/../build/build.js').getFiles(); - - var files = [ - "spec/before.js", - "spec/sinon.js", - "spec/expect.js" - ].concat(libSources, [ - "spec/after.js", - "node_modules/happen/happen.js", - "spec/suites/SpecHelper.js", - "spec/suites/**/*.js", - {pattern: "dist/images/*.png", included: false} - ]); - - config.set({ - // base path, that will be used to resolve files and exclude - basePath: '../', - - plugins: ['karma-mocha', 'karma-phantomjs-launcher', 'karma-chrome-launcher'], - - // frameworks to use - frameworks: ['mocha'], - - // list of files / patterns to load in the browser - files: files, - exclude: [], - - // test results reporter to use - // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' - reporters: ['dots'], - - // web server port - port: 9876, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_WARN, - - // enable / disable colors in the output (reporters and logs) - colors: true, - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: false, - - // Start these browsers, currently available: - // - Chrome - // - ChromeCanary - // - Firefox - // - Opera - // - Safari (only Mac) - // - PhantomJS - // - IE (only Windows) - browsers: ['PhantomJS'], - - // If browser does not capture in given timeout [ms], kill it - captureTimeout: 5000, - - // Continuous Integration mode - // if true, it capture browsers, run tests and exit - singleRun: true - }); -}; diff --git a/spec/sinon.js b/spec/sinon.js deleted file mode 100644 index d08a0e08238..00000000000 --- a/spec/sinon.js +++ /dev/null @@ -1,4223 +0,0 @@ -/** - * Sinon.JS 1.6.0, 2013/02/18 - * - * @author Christian Johansen (christian@cjohansen.no) - * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS - * - * (The BSD License) - * - * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Christian Johansen nor the names of his contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -var sinon = (function () { -"use strict"; - -var buster = (function (setTimeout, B) { - var isNode = typeof require == "function" && typeof module == "object"; - var div = typeof document != "undefined" && document.createElement("div"); - var F = function () {}; - - var buster = { - bind: function bind(obj, methOrProp) { - var method = typeof methOrProp == "string" ? obj[methOrProp] : methOrProp; - var args = Array.prototype.slice.call(arguments, 2); - return function () { - var allArgs = args.concat(Array.prototype.slice.call(arguments)); - return method.apply(obj, allArgs); - }; - }, - - partial: function partial(fn) { - var args = [].slice.call(arguments, 1); - return function () { - return fn.apply(this, args.concat([].slice.call(arguments))); - }; - }, - - create: function create(object) { - F.prototype = object; - return new F(); - }, - - extend: function extend(target) { - if (!target) { return; } - for (var i = 1, l = arguments.length, prop; i < l; ++i) { - for (prop in arguments[i]) { - target[prop] = arguments[i][prop]; - } - } - return target; - }, - - nextTick: function nextTick(callback) { - if (typeof process != "undefined" && process.nextTick) { - return process.nextTick(callback); - } - setTimeout(callback, 0); - }, - - functionName: function functionName(func) { - if (!func) return ""; - if (func.displayName) return func.displayName; - if (func.name) return func.name; - var matches = func.toString().match(/function\s+([^\(]+)/m); - return matches && matches[1] || ""; - }, - - isNode: function isNode(obj) { - if (!div) return false; - try { - obj.appendChild(div); - obj.removeChild(div); - } catch (e) { - return false; - } - return true; - }, - - isElement: function isElement(obj) { - return obj && obj.nodeType === 1 && buster.isNode(obj); - }, - - isArray: function isArray(arr) { - return Object.prototype.toString.call(arr) == "[object Array]"; - }, - - flatten: function flatten(arr) { - var result = [], arr = arr || []; - for (var i = 0, l = arr.length; i < l; ++i) { - result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]); - } - return result; - }, - - each: function each(arr, callback) { - for (var i = 0, l = arr.length; i < l; ++i) { - callback(arr[i]); - } - }, - - map: function map(arr, callback) { - var results = []; - for (var i = 0, l = arr.length; i < l; ++i) { - results.push(callback(arr[i])); - } - return results; - }, - - parallel: function parallel(fns, callback) { - function cb(err, res) { - if (typeof callback == "function") { - callback(err, res); - callback = null; - } - } - if (fns.length == 0) { return cb(null, []); } - var remaining = fns.length, results = []; - function makeDone(num) { - return function done(err, result) { - if (err) { return cb(err); } - results[num] = result; - if (--remaining == 0) { cb(null, results); } - }; - } - for (var i = 0, l = fns.length; i < l; ++i) { - fns[i](makeDone(i)); - } - }, - - series: function series(fns, callback) { - function cb(err, res) { - if (typeof callback == "function") { - callback(err, res); - } - } - var remaining = fns.slice(); - var results = []; - function callNext() { - if (remaining.length == 0) return cb(null, results); - var promise = remaining.shift()(next); - if (promise && typeof promise.then == "function") { - promise.then(buster.partial(next, null), next); - } - } - function next(err, result) { - if (err) return cb(err); - results.push(result); - callNext(); - } - callNext(); - }, - - countdown: function countdown(num, done) { - return function () { - if (--num == 0) done(); - }; - } - }; - - if (typeof process === "object" && - typeof require === "function" && typeof module === "object") { - var crypto = require("crypto"); - var path = require("path"); - - buster.tmpFile = function (fileName) { - var hashed = crypto.createHash("sha1"); - hashed.update(fileName); - var tmpfileName = hashed.digest("hex"); - - if (process.platform == "win32") { - return path.join(process.env["TEMP"], tmpfileName); - } else { - return path.join("/tmp", tmpfileName); - } - }; - } - - if (Array.prototype.some) { - buster.some = function (arr, fn, thisp) { - return arr.some(fn, thisp); - }; - } else { - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some - buster.some = function (arr, fun, thisp) { - if (arr == null) { throw new TypeError(); } - arr = Object(arr); - var len = arr.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } - - for (var i = 0; i < len; i++) { - if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) { - return true; - } - } - - return false; - }; - } - - if (Array.prototype.filter) { - buster.filter = function (arr, fn, thisp) { - return arr.filter(fn, thisp); - }; - } else { - // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter - buster.filter = function (fn, thisp) { - if (this == null) { throw new TypeError(); } - - var t = Object(this); - var len = t.length >>> 0; - if (typeof fn != "function") { throw new TypeError(); } - - var res = []; - for (var i = 0; i < len; i++) { - if (i in t) { - var val = t[i]; // in case fun mutates this - if (fn.call(thisp, val, i, t)) { res.push(val); } - } - } - - return res; - }; - } - - if (isNode) { - module.exports = buster; - buster.eventEmitter = require("./buster-event-emitter"); - Object.defineProperty(buster, "defineVersionGetter", { - get: function () { - return require("./define-version-getter"); - } - }); - } - - return buster.extend(B || {}, buster); -}(setTimeout, buster)); -if (typeof buster === "undefined") { - var buster = {}; -} - -if (typeof module === "object" && typeof require === "function") { - buster = require("buster-core"); -} - -buster.format = buster.format || {}; -buster.format.excludeConstructors = ["Object", /^.$/]; -buster.format.quoteStrings = true; - -buster.format.ascii = (function () { - - var hasOwn = Object.prototype.hasOwnProperty; - - var specialObjects = []; - if (typeof global != "undefined") { - specialObjects.push({ obj: global, value: "[object global]" }); - } - if (typeof document != "undefined") { - specialObjects.push({ obj: document, value: "[object HTMLDocument]" }); - } - if (typeof window != "undefined") { - specialObjects.push({ obj: window, value: "[object Window]" }); - } - - function keys(object) { - var k = Object.keys && Object.keys(object) || []; - - if (k.length == 0) { - for (var prop in object) { - if (hasOwn.call(object, prop)) { - k.push(prop); - } - } - } - - return k.sort(); - } - - function isCircular(object, objects) { - if (typeof object != "object") { - return false; - } - - for (var i = 0, l = objects.length; i < l; ++i) { - if (objects[i] === object) { - return true; - } - } - - return false; - } - - function ascii(object, processed, indent) { - if (typeof object == "string") { - var quote = typeof this.quoteStrings != "boolean" || this.quoteStrings; - return processed || quote ? '"' + object + '"' : object; - } - - if (typeof object == "function" && !(object instanceof RegExp)) { - return ascii.func(object); - } - - processed = processed || []; - - if (isCircular(object, processed)) { - return "[Circular]"; - } - - if (Object.prototype.toString.call(object) == "[object Array]") { - return ascii.array.call(this, object, processed); - } - - if (!object) { - return "" + object; - } - - if (buster.isElement(object)) { - return ascii.element(object); - } - - if (typeof object.toString == "function" && - object.toString !== Object.prototype.toString) { - return object.toString(); - } - - for (var i = 0, l = specialObjects.length; i < l; i++) { - if (object === specialObjects[i].obj) { - return specialObjects[i].value; - } - } - - return ascii.object.call(this, object, processed, indent); - } - - ascii.func = function (func) { - return "function " + buster.functionName(func) + "() {}"; - }; - - ascii.array = function (array, processed) { - processed = processed || []; - processed.push(array); - var pieces = []; - - for (var i = 0, l = array.length; i < l; ++i) { - pieces.push(ascii.call(this, array[i], processed)); - } - - return "[" + pieces.join(", ") + "]"; - }; - - ascii.object = function (object, processed, indent) { - processed = processed || []; - processed.push(object); - indent = indent || 0; - var pieces = [], properties = keys(object), prop, str, obj; - var is = ""; - var length = 3; - - for (var i = 0, l = indent; i < l; ++i) { - is += " "; - } - - for (i = 0, l = properties.length; i < l; ++i) { - prop = properties[i]; - obj = object[prop]; - - if (isCircular(obj, processed)) { - str = "[Circular]"; - } else { - str = ascii.call(this, obj, processed, indent + 2); - } - - str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str; - length += str.length; - pieces.push(str); - } - - var cons = ascii.constructorName.call(this, object); - var prefix = cons ? "[" + cons + "] " : "" - - return (length + indent) > 80 ? - prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" + is + "}" : - prefix + "{ " + pieces.join(", ") + " }"; - }; - - ascii.element = function (element) { - var tagName = element.tagName.toLowerCase(); - var attrs = element.attributes, attribute, pairs = [], attrName; - - for (var i = 0, l = attrs.length; i < l; ++i) { - attribute = attrs.item(i); - attrName = attribute.nodeName.toLowerCase().replace("html:", ""); - - if (attrName == "contenteditable" && attribute.nodeValue == "inherit") { - continue; - } - - if (!!attribute.nodeValue) { - pairs.push(attrName + "=\"" + attribute.nodeValue + "\""); - } - } - - var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); - var content = element.innerHTML; - - if (content.length > 20) { - content = content.substr(0, 20) + "[...]"; - } - - var res = formatted + pairs.join(" ") + ">" + content + ""; - - return res.replace(/ contentEditable="inherit"/, ""); - }; - - ascii.constructorName = function (object) { - var name = buster.functionName(object && object.constructor); - var excludes = this.excludeConstructors || buster.format.excludeConstructors || []; - - for (var i = 0, l = excludes.length; i < l; ++i) { - if (typeof excludes[i] == "string" && excludes[i] == name) { - return ""; - } else if (excludes[i].test && excludes[i].test(name)) { - return ""; - } - } - - return name; - }; - - return ascii; -}()); - -if (typeof module != "undefined") { - module.exports = buster.format; -} -/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/ -/*global module, require, __dirname, document*/ -/** - * Sinon core utilities. For internal use only. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -var sinon = (function (buster) { - var div = typeof document != "undefined" && document.createElement("div"); - var hasOwn = Object.prototype.hasOwnProperty; - - function isDOMNode(obj) { - var success = false; - - try { - obj.appendChild(div); - success = div.parentNode == obj; - } catch (e) { - return false; - } finally { - try { - obj.removeChild(div); - } catch (e) { - // Remove failed, not much we can do about that - } - } - - return success; - } - - function isElement(obj) { - return div && obj && obj.nodeType === 1 && isDOMNode(obj); - } - - function isFunction(obj) { - return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply); - } - - function mirrorProperties(target, source) { - for (var prop in source) { - if (!hasOwn.call(target, prop)) { - target[prop] = source[prop]; - } - } - } - - var sinon = { - wrapMethod: function wrapMethod(object, property, method) { - if (!object) { - throw new TypeError("Should wrap property of object"); - } - - if (typeof method != "function") { - throw new TypeError("Method wrapper should be function"); - } - - var wrappedMethod = object[property]; - - if (!isFunction(wrappedMethod)) { - throw new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " + - property + " as function"); - } - - if (wrappedMethod.restore && wrappedMethod.restore.sinon) { - throw new TypeError("Attempted to wrap " + property + " which is already wrapped"); - } - - if (wrappedMethod.calledBefore) { - var verb = !!wrappedMethod.returns ? "stubbed" : "spied on"; - throw new TypeError("Attempted to wrap " + property + " which is already " + verb); - } - - // IE 8 does not support hasOwnProperty on the window object. - var owned = hasOwn.call(object, property); - object[property] = method; - method.displayName = property; - - method.restore = function () { - // For prototype properties try to reset by delete first. - // If this fails (ex: localStorage on mobile safari) then force a reset - // via direct assignment. - if (!owned) { - delete object[property]; - } - if (object[property] === method) { - object[property] = wrappedMethod; - } - }; - - method.restore.sinon = true; - mirrorProperties(method, wrappedMethod); - - return method; - }, - - extend: function extend(target) { - for (var i = 1, l = arguments.length; i < l; i += 1) { - for (var prop in arguments[i]) { - if (arguments[i].hasOwnProperty(prop)) { - target[prop] = arguments[i][prop]; - } - - // DONT ENUM bug, only care about toString - if (arguments[i].hasOwnProperty("toString") && - arguments[i].toString != target.toString) { - target.toString = arguments[i].toString; - } - } - } - - return target; - }, - - create: function create(proto) { - var F = function () {}; - F.prototype = proto; - return new F(); - }, - - deepEqual: function deepEqual(a, b) { - if (sinon.match && sinon.match.isMatcher(a)) { - return a.test(b); - } - if (typeof a != "object" || typeof b != "object") { - return a === b; - } - - if (isElement(a) || isElement(b)) { - return a === b; - } - - if (a === b) { - return true; - } - - if ((a === null && b !== null) || (a !== null && b === null)) { - return false; - } - - var aString = Object.prototype.toString.call(a); - if (aString != Object.prototype.toString.call(b)) { - return false; - } - - if (aString == "[object Array]") { - if (a.length !== b.length) { - return false; - } - - for (var i = 0, l = a.length; i < l; i += 1) { - if (!deepEqual(a[i], b[i])) { - return false; - } - } - - return true; - } - - var prop, aLength = 0, bLength = 0; - - for (prop in a) { - aLength += 1; - - if (!deepEqual(a[prop], b[prop])) { - return false; - } - } - - for (prop in b) { - bLength += 1; - } - - if (aLength != bLength) { - return false; - } - - return true; - }, - - functionName: function functionName(func) { - var name = func.displayName || func.name; - - // Use function decomposition as a last resort to get function - // name. Does not rely on function decomposition to work - if it - // doesn't debugging will be slightly less informative - // (i.e. toString will say 'spy' rather than 'myFunc'). - if (!name) { - var matches = func.toString().match(/function ([^\s\(]+)/); - name = matches && matches[1]; - } - - return name; - }, - - functionToString: function toString() { - if (this.getCall && this.callCount) { - var thisValue, prop, i = this.callCount; - - while (i--) { - thisValue = this.getCall(i).thisValue; - - for (prop in thisValue) { - if (thisValue[prop] === this) { - return prop; - } - } - } - } - - return this.displayName || "sinon fake"; - }, - - getConfig: function (custom) { - var config = {}; - custom = custom || {}; - var defaults = sinon.defaultConfig; - - for (var prop in defaults) { - if (defaults.hasOwnProperty(prop)) { - config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop]; - } - } - - return config; - }, - - format: function (val) { - return "" + val; - }, - - defaultConfig: { - injectIntoThis: true, - injectInto: null, - properties: ["spy", "stub", "mock", "clock", "server", "requests"], - useFakeTimers: true, - useFakeServer: true - }, - - timesInWords: function timesInWords(count) { - return count == 1 && "once" || - count == 2 && "twice" || - count == 3 && "thrice" || - (count || 0) + " times"; - }, - - calledInOrder: function (spies) { - for (var i = 1, l = spies.length; i < l; i++) { - if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) { - return false; - } - } - - return true; - }, - - orderByFirstCall: function (spies) { - return spies.sort(function (a, b) { - // uuid, won't ever be equal - var aCall = a.getCall(0); - var bCall = b.getCall(0); - var aId = aCall && aCall.callId || -1; - var bId = bCall && bCall.callId || -1; - - return aId < bId ? -1 : 1; - }); - }, - - log: function () {}, - - logError: function (label, err) { - var msg = label + " threw exception: " - sinon.log(msg + "[" + err.name + "] " + err.message); - if (err.stack) { sinon.log(err.stack); } - - setTimeout(function () { - err.message = msg + err.message; - throw err; - }, 0); - }, - - typeOf: function (value) { - if (value === null) { - return "null"; - } - else if (value === undefined) { - return "undefined"; - } - var string = Object.prototype.toString.call(value); - return string.substring(8, string.length - 1).toLowerCase(); - }, - - createStubInstance: function (constructor) { - if (typeof constructor !== "function") { - throw new TypeError("The constructor should be a function."); - } - return sinon.stub(sinon.create(constructor.prototype)); - } - }; - - var isNode = typeof module == "object" && typeof require == "function"; - - if (isNode) { - try { - buster = { format: require("buster-format") }; - } catch (e) {} - module.exports = sinon; - module.exports.spy = require("./sinon/spy"); - module.exports.stub = require("./sinon/stub"); - module.exports.mock = require("./sinon/mock"); - module.exports.collection = require("./sinon/collection"); - module.exports.assert = require("./sinon/assert"); - module.exports.sandbox = require("./sinon/sandbox"); - module.exports.test = require("./sinon/test"); - module.exports.testCase = require("./sinon/test_case"); - module.exports.assert = require("./sinon/assert"); - module.exports.match = require("./sinon/match"); - } - - if (buster) { - var formatter = sinon.create(buster.format); - formatter.quoteStrings = false; - sinon.format = function () { - return formatter.ascii.apply(formatter, arguments); - }; - } else if (isNode) { - try { - var util = require("util"); - sinon.format = function (value) { - return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value; - }; - } catch (e) { - /* Node, but no util module - would be very old, but better safe than - sorry */ - } - } - - return sinon; -}(typeof buster == "object" && buster)); - -/* @depend ../sinon.js */ -/*jslint eqeqeq: false, onevar: false, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Match functions - * - * @author Maximilian Antoni (mail@maxantoni.de) - * @license BSD - * - * Copyright (c) 2012 Maximilian Antoni - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function assertType(value, type, name) { - var actual = sinon.typeOf(value); - if (actual !== type) { - throw new TypeError("Expected type of " + name + " to be " + - type + ", but was " + actual); - } - } - - var matcher = { - toString: function () { - return this.message; - } - }; - - function isMatcher(object) { - return matcher.isPrototypeOf(object); - } - - function matchObject(expectation, actual) { - if (actual === null || actual === undefined) { - return false; - } - for (var key in expectation) { - if (expectation.hasOwnProperty(key)) { - var exp = expectation[key]; - var act = actual[key]; - if (match.isMatcher(exp)) { - if (!exp.test(act)) { - return false; - } - } else if (sinon.typeOf(exp) === "object") { - if (!matchObject(exp, act)) { - return false; - } - } else if (!sinon.deepEqual(exp, act)) { - return false; - } - } - } - return true; - } - - matcher.or = function (m2) { - if (!isMatcher(m2)) { - throw new TypeError("Matcher expected"); - } - var m1 = this; - var or = sinon.create(matcher); - or.test = function (actual) { - return m1.test(actual) || m2.test(actual); - }; - or.message = m1.message + ".or(" + m2.message + ")"; - return or; - }; - - matcher.and = function (m2) { - if (!isMatcher(m2)) { - throw new TypeError("Matcher expected"); - } - var m1 = this; - var and = sinon.create(matcher); - and.test = function (actual) { - return m1.test(actual) && m2.test(actual); - }; - and.message = m1.message + ".and(" + m2.message + ")"; - return and; - }; - - var match = function (expectation, message) { - var m = sinon.create(matcher); - var type = sinon.typeOf(expectation); - switch (type) { - case "object": - if (typeof expectation.test === "function") { - m.test = function (actual) { - return expectation.test(actual) === true; - }; - m.message = "match(" + sinon.functionName(expectation.test) + ")"; - return m; - } - var str = []; - for (var key in expectation) { - if (expectation.hasOwnProperty(key)) { - str.push(key + ": " + expectation[key]); - } - } - m.test = function (actual) { - return matchObject(expectation, actual); - }; - m.message = "match(" + str.join(", ") + ")"; - break; - case "number": - m.test = function (actual) { - return expectation == actual; - }; - break; - case "string": - m.test = function (actual) { - if (typeof actual !== "string") { - return false; - } - return actual.indexOf(expectation) !== -1; - }; - m.message = "match(\"" + expectation + "\")"; - break; - case "regexp": - m.test = function (actual) { - if (typeof actual !== "string") { - return false; - } - return expectation.test(actual); - }; - break; - case "function": - m.test = expectation; - if (message) { - m.message = message; - } else { - m.message = "match(" + sinon.functionName(expectation) + ")"; - } - break; - default: - m.test = function (actual) { - return sinon.deepEqual(expectation, actual); - }; - } - if (!m.message) { - m.message = "match(" + expectation + ")"; - } - return m; - }; - - match.isMatcher = isMatcher; - - match.any = match(function () { - return true; - }, "any"); - - match.defined = match(function (actual) { - return actual !== null && actual !== undefined; - }, "defined"); - - match.truthy = match(function (actual) { - return !!actual; - }, "truthy"); - - match.falsy = match(function (actual) { - return !actual; - }, "falsy"); - - match.same = function (expectation) { - return match(function (actual) { - return expectation === actual; - }, "same(" + expectation + ")"); - }; - - match.typeOf = function (type) { - assertType(type, "string", "type"); - return match(function (actual) { - return sinon.typeOf(actual) === type; - }, "typeOf(\"" + type + "\")"); - }; - - match.instanceOf = function (type) { - assertType(type, "function", "type"); - return match(function (actual) { - return actual instanceof type; - }, "instanceOf(" + sinon.functionName(type) + ")"); - }; - - function createPropertyMatcher(propertyTest, messagePrefix) { - return function (property, value) { - assertType(property, "string", "property"); - var onlyProperty = arguments.length === 1; - var message = messagePrefix + "(\"" + property + "\""; - if (!onlyProperty) { - message += ", " + value; - } - message += ")"; - return match(function (actual) { - if (actual === undefined || actual === null || - !propertyTest(actual, property)) { - return false; - } - return onlyProperty || sinon.deepEqual(value, actual[property]); - }, message); - }; - } - - match.has = createPropertyMatcher(function (actual, property) { - if (typeof actual === "object") { - return property in actual; - } - return actual[property] !== undefined; - }, "has"); - - match.hasOwn = createPropertyMatcher(function (actual, property) { - return actual.hasOwnProperty(property); - }, "hasOwn"); - - match.bool = match.typeOf("boolean"); - match.number = match.typeOf("number"); - match.string = match.typeOf("string"); - match.object = match.typeOf("object"); - match.func = match.typeOf("function"); - match.array = match.typeOf("array"); - match.regexp = match.typeOf("regexp"); - match.date = match.typeOf("date"); - - if (commonJSModule) { - module.exports = match; - } else { - sinon.match = match; - } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend match.js - */ -/*jslint eqeqeq: false, onevar: false, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Spy functions - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - var spyCall; - var callId = 0; - var push = [].push; - var slice = Array.prototype.slice; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function spy(object, property) { - if (!property && typeof object == "function") { - return spy.create(object); - } - - if (!object && !property) { - return spy.create(function () { }); - } - - var method = object[property]; - return sinon.wrapMethod(object, property, spy.create(method)); - } - - sinon.extend(spy, (function () { - - function delegateToCalls(api, method, matchAny, actual, notCalled) { - api[method] = function () { - if (!this.called) { - if (notCalled) { - return notCalled.apply(this, arguments); - } - return false; - } - - var currentCall; - var matches = 0; - - for (var i = 0, l = this.callCount; i < l; i += 1) { - currentCall = this.getCall(i); - - if (currentCall[actual || method].apply(currentCall, arguments)) { - matches += 1; - - if (matchAny) { - return true; - } - } - } - - return matches === this.callCount; - }; - } - - function matchingFake(fakes, args, strict) { - if (!fakes) { - return; - } - - var alen = args.length; - - for (var i = 0, l = fakes.length; i < l; i++) { - if (fakes[i].matches(args, strict)) { - return fakes[i]; - } - } - } - - function incrementCallCount() { - this.called = true; - this.callCount += 1; - this.notCalled = false; - this.calledOnce = this.callCount == 1; - this.calledTwice = this.callCount == 2; - this.calledThrice = this.callCount == 3; - } - - function createCallProperties() { - this.firstCall = this.getCall(0); - this.secondCall = this.getCall(1); - this.thirdCall = this.getCall(2); - this.lastCall = this.getCall(this.callCount - 1); - } - - var vars = "a,b,c,d,e,f,g,h,i,j,k,l"; - function createProxy(func) { - // Retain the function length: - var p; - if (func.length) { - eval("p = (function proxy(" + vars.substring(0, func.length * 2 - 1) + - ") { return p.invoke(func, this, slice.call(arguments)); });"); - } - else { - p = function proxy() { - return p.invoke(func, this, slice.call(arguments)); - }; - } - return p; - } - - var uuid = 0; - - // Public API - var spyApi = { - reset: function () { - this.called = false; - this.notCalled = true; - this.calledOnce = false; - this.calledTwice = false; - this.calledThrice = false; - this.callCount = 0; - this.firstCall = null; - this.secondCall = null; - this.thirdCall = null; - this.lastCall = null; - this.args = []; - this.returnValues = []; - this.thisValues = []; - this.exceptions = []; - this.callIds = []; - if (this.fakes) { - for (var i = 0; i < this.fakes.length; i++) { - this.fakes[i].reset(); - } - } - }, - - create: function create(func) { - var name; - - if (typeof func != "function") { - func = function () { }; - } else { - name = sinon.functionName(func); - } - - var proxy = createProxy(func); - - sinon.extend(proxy, spy); - delete proxy.create; - sinon.extend(proxy, func); - - proxy.reset(); - proxy.prototype = func.prototype; - proxy.displayName = name || "spy"; - proxy.toString = sinon.functionToString; - proxy._create = sinon.spy.create; - proxy.id = "spy#" + uuid++; - - return proxy; - }, - - invoke: function invoke(func, thisValue, args) { - var matching = matchingFake(this.fakes, args); - var exception, returnValue; - - incrementCallCount.call(this); - push.call(this.thisValues, thisValue); - push.call(this.args, args); - push.call(this.callIds, callId++); - - try { - if (matching) { - returnValue = matching.invoke(func, thisValue, args); - } else { - returnValue = (this.func || func).apply(thisValue, args); - } - } catch (e) { - push.call(this.returnValues, undefined); - exception = e; - throw e; - } finally { - push.call(this.exceptions, exception); - } - - push.call(this.returnValues, returnValue); - - createCallProperties.call(this); - - return returnValue; - }, - - getCall: function getCall(i) { - if (i < 0 || i >= this.callCount) { - return null; - } - - return spyCall.create(this, this.thisValues[i], this.args[i], - this.returnValues[i], this.exceptions[i], - this.callIds[i]); - }, - - calledBefore: function calledBefore(spyFn) { - if (!this.called) { - return false; - } - - if (!spyFn.called) { - return true; - } - - return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1]; - }, - - calledAfter: function calledAfter(spyFn) { - if (!this.called || !spyFn.called) { - return false; - } - - return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1]; - }, - - withArgs: function () { - var args = slice.call(arguments); - - if (this.fakes) { - var match = matchingFake(this.fakes, args, true); - - if (match) { - return match; - } - } else { - this.fakes = []; - } - - var original = this; - var fake = this._create(); - fake.matchingAguments = args; - push.call(this.fakes, fake); - - fake.withArgs = function () { - return original.withArgs.apply(original, arguments); - }; - - for (var i = 0; i < this.args.length; i++) { - if (fake.matches(this.args[i])) { - incrementCallCount.call(fake); - push.call(fake.thisValues, this.thisValues[i]); - push.call(fake.args, this.args[i]); - push.call(fake.returnValues, this.returnValues[i]); - push.call(fake.exceptions, this.exceptions[i]); - push.call(fake.callIds, this.callIds[i]); - } - } - createCallProperties.call(fake); - - return fake; - }, - - matches: function (args, strict) { - var margs = this.matchingAguments; - - if (margs.length <= args.length && - sinon.deepEqual(margs, args.slice(0, margs.length))) { - return !strict || margs.length == args.length; - } - }, - - printf: function (format) { - var spy = this; - var args = slice.call(arguments, 1); - var formatter; - - return (format || "").replace(/%(.)/g, function (match, specifyer) { - formatter = spyApi.formatters[specifyer]; - - if (typeof formatter == "function") { - return formatter.call(null, spy, args); - } else if (!isNaN(parseInt(specifyer), 10)) { - return sinon.format(args[specifyer - 1]); - } - - return "%" + specifyer; - }); - } - }; - - delegateToCalls(spyApi, "calledOn", true); - delegateToCalls(spyApi, "alwaysCalledOn", false, "calledOn"); - delegateToCalls(spyApi, "calledWith", true); - delegateToCalls(spyApi, "calledWithMatch", true); - delegateToCalls(spyApi, "alwaysCalledWith", false, "calledWith"); - delegateToCalls(spyApi, "alwaysCalledWithMatch", false, "calledWithMatch"); - delegateToCalls(spyApi, "calledWithExactly", true); - delegateToCalls(spyApi, "alwaysCalledWithExactly", false, "calledWithExactly"); - delegateToCalls(spyApi, "neverCalledWith", false, "notCalledWith", - function () { return true; }); - delegateToCalls(spyApi, "neverCalledWithMatch", false, "notCalledWithMatch", - function () { return true; }); - delegateToCalls(spyApi, "threw", true); - delegateToCalls(spyApi, "alwaysThrew", false, "threw"); - delegateToCalls(spyApi, "returned", true); - delegateToCalls(spyApi, "alwaysReturned", false, "returned"); - delegateToCalls(spyApi, "calledWithNew", true); - delegateToCalls(spyApi, "alwaysCalledWithNew", false, "calledWithNew"); - delegateToCalls(spyApi, "callArg", false, "callArgWith", function () { - throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); - }); - spyApi.callArgWith = spyApi.callArg; - delegateToCalls(spyApi, "callArgOn", false, "callArgOnWith", function () { - throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); - }); - spyApi.callArgOnWith = spyApi.callArgOn; - delegateToCalls(spyApi, "yield", false, "yield", function () { - throw new Error(this.toString() + " cannot yield since it was not yet invoked."); - }); - // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode. - spyApi.invokeCallback = spyApi.yield; - delegateToCalls(spyApi, "yieldOn", false, "yieldOn", function () { - throw new Error(this.toString() + " cannot yield since it was not yet invoked."); - }); - delegateToCalls(spyApi, "yieldTo", false, "yieldTo", function (property) { - throw new Error(this.toString() + " cannot yield to '" + property + - "' since it was not yet invoked."); - }); - delegateToCalls(spyApi, "yieldToOn", false, "yieldToOn", function (property) { - throw new Error(this.toString() + " cannot yield to '" + property + - "' since it was not yet invoked."); - }); - - spyApi.formatters = { - "c": function (spy) { - return sinon.timesInWords(spy.callCount); - }, - - "n": function (spy) { - return spy.toString(); - }, - - "C": function (spy) { - var calls = []; - - for (var i = 0, l = spy.callCount; i < l; ++i) { - var stringifiedCall = " " + spy.getCall(i).toString(); - if (/\n/.test(calls[i - 1])) { - stringifiedCall = "\n" + stringifiedCall; - } - push.call(calls, stringifiedCall); - } - - return calls.length > 0 ? "\n" + calls.join("\n") : ""; - }, - - "t": function (spy) { - var objects = []; - - for (var i = 0, l = spy.callCount; i < l; ++i) { - push.call(objects, sinon.format(spy.thisValues[i])); - } - - return objects.join(", "); - }, - - "*": function (spy, args) { - var formatted = []; - - for (var i = 0, l = args.length; i < l; ++i) { - push.call(formatted, sinon.format(args[i])); - } - - return formatted.join(", "); - } - }; - - return spyApi; - }())); - - spyCall = (function () { - - function throwYieldError(proxy, text, args) { - var msg = sinon.functionName(proxy) + text; - if (args.length) { - msg += " Received [" + slice.call(args).join(", ") + "]"; - } - throw new Error(msg); - } - - var callApi = { - create: function create(spy, thisValue, args, returnValue, exception, id) { - var proxyCall = sinon.create(spyCall); - delete proxyCall.create; - proxyCall.proxy = spy; - proxyCall.thisValue = thisValue; - proxyCall.args = args; - proxyCall.returnValue = returnValue; - proxyCall.exception = exception; - proxyCall.callId = typeof id == "number" && id || callId++; - - return proxyCall; - }, - - calledOn: function calledOn(thisValue) { - if (sinon.match && sinon.match.isMatcher(thisValue)) { - return thisValue.test(this.thisValue); - } - return this.thisValue === thisValue; - }, - - calledWith: function calledWith() { - for (var i = 0, l = arguments.length; i < l; i += 1) { - if (!sinon.deepEqual(arguments[i], this.args[i])) { - return false; - } - } - - return true; - }, - - calledWithMatch: function calledWithMatch() { - for (var i = 0, l = arguments.length; i < l; i += 1) { - var actual = this.args[i]; - var expectation = arguments[i]; - if (!sinon.match || !sinon.match(expectation).test(actual)) { - return false; - } - } - return true; - }, - - calledWithExactly: function calledWithExactly() { - return arguments.length == this.args.length && - this.calledWith.apply(this, arguments); - }, - - notCalledWith: function notCalledWith() { - return !this.calledWith.apply(this, arguments); - }, - - notCalledWithMatch: function notCalledWithMatch() { - return !this.calledWithMatch.apply(this, arguments); - }, - - returned: function returned(value) { - return sinon.deepEqual(value, this.returnValue); - }, - - threw: function threw(error) { - if (typeof error == "undefined" || !this.exception) { - return !!this.exception; - } - - if (typeof error == "string") { - return this.exception.name == error; - } - - return this.exception === error; - }, - - calledWithNew: function calledWithNew(thisValue) { - return this.thisValue instanceof this.proxy; - }, - - calledBefore: function (other) { - return this.callId < other.callId; - }, - - calledAfter: function (other) { - return this.callId > other.callId; - }, - - callArg: function (pos) { - this.args[pos](); - }, - - callArgOn: function (pos, thisValue) { - this.args[pos].apply(thisValue); - }, - - callArgWith: function (pos) { - this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1))); - }, - - callArgOnWith: function (pos, thisValue) { - var args = slice.call(arguments, 2); - this.args[pos].apply(thisValue, args); - }, - - "yield": function () { - this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0))); - }, - - yieldOn: function (thisValue) { - var args = this.args; - for (var i = 0, l = args.length; i < l; ++i) { - if (typeof args[i] === "function") { - args[i].apply(thisValue, slice.call(arguments, 1)); - return; - } - } - throwYieldError(this.proxy, " cannot yield since no callback was passed.", args); - }, - - yieldTo: function (prop) { - this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1))); - }, - - yieldToOn: function (prop, thisValue) { - var args = this.args; - for (var i = 0, l = args.length; i < l; ++i) { - if (args[i] && typeof args[i][prop] === "function") { - args[i][prop].apply(thisValue, slice.call(arguments, 2)); - return; - } - } - throwYieldError(this.proxy, " cannot yield to '" + prop + - "' since no callback was passed.", args); - }, - - toString: function () { - var callStr = this.proxy.toString() + "("; - var args = []; - - for (var i = 0, l = this.args.length; i < l; ++i) { - push.call(args, sinon.format(this.args[i])); - } - - callStr = callStr + args.join(", ") + ")"; - - if (typeof this.returnValue != "undefined") { - callStr += " => " + sinon.format(this.returnValue); - } - - if (this.exception) { - callStr += " !" + this.exception.name; - - if (this.exception.message) { - callStr += "(" + this.exception.message + ")"; - } - } - - return callStr; - } - }; - callApi.invokeCallback = callApi.yield; - return callApi; - }()); - - spy.spyCall = spyCall; - - // This steps outside the module sandbox and will be removed - sinon.spyCall = spyCall; - - if (commonJSModule) { - module.exports = spy; - } else { - sinon.spy = spy; - } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend spy.js - */ -/*jslint eqeqeq: false, onevar: false*/ -/*global module, require, sinon*/ -/** - * Stub functions - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function stub(object, property, func) { - if (!!func && typeof func != "function") { - throw new TypeError("Custom stub should be function"); - } - - var wrapper; - - if (func) { - wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func; - } else { - wrapper = stub.create(); - } - - if (!object && !property) { - return sinon.stub.create(); - } - - if (!property && !!object && typeof object == "object") { - for (var prop in object) { - if (typeof object[prop] === "function") { - stub(object, prop); - } - } - - return object; - } - - return sinon.wrapMethod(object, property, wrapper); - } - - function getChangingValue(stub, property) { - var index = stub.callCount - 1; - var values = stub[property]; - var prop = index in values ? values[index] : values[values.length - 1]; - stub[property + "Last"] = prop; - - return prop; - } - - function getCallback(stub, args) { - var callArgAt = getChangingValue(stub, "callArgAts"); - - if (callArgAt < 0) { - var callArgProp = getChangingValue(stub, "callArgProps"); - - for (var i = 0, l = args.length; i < l; ++i) { - if (!callArgProp && typeof args[i] == "function") { - return args[i]; - } - - if (callArgProp && args[i] && - typeof args[i][callArgProp] == "function") { - return args[i][callArgProp]; - } - } - - return null; - } - - return args[callArgAt]; - } - - var join = Array.prototype.join; - - function getCallbackError(stub, func, args) { - if (stub.callArgAtsLast < 0) { - var msg; - - if (stub.callArgPropsLast) { - msg = sinon.functionName(stub) + - " expected to yield to '" + stub.callArgPropsLast + - "', but no object with such a property was passed." - } else { - msg = sinon.functionName(stub) + - " expected to yield, but no callback was passed." - } - - if (args.length > 0) { - msg += " Received [" + join.call(args, ", ") + "]"; - } - - return msg; - } - - return "argument at index " + stub.callArgAtsLast + " is not a function: " + func; - } - - var nextTick = (function () { - if (typeof process === "object" && typeof process.nextTick === "function") { - return process.nextTick; - } else if (typeof setImmediate === "function") { - return setImmediate; - } else { - return function (callback) { - setTimeout(callback, 0); - }; - } - })(); - - function callCallback(stub, args) { - if (stub.callArgAts.length > 0) { - var func = getCallback(stub, args); - - if (typeof func != "function") { - throw new TypeError(getCallbackError(stub, func, args)); - } - - var callbackArguments = getChangingValue(stub, "callbackArguments"); - var callbackContext = getChangingValue(stub, "callbackContexts"); - - if (stub.callbackAsync) { - nextTick(function() { - func.apply(callbackContext, callbackArguments); - }); - } else { - func.apply(callbackContext, callbackArguments); - } - } - } - - var uuid = 0; - - sinon.extend(stub, (function () { - var slice = Array.prototype.slice, proto; - - function throwsException(error, message) { - if (typeof error == "string") { - this.exception = new Error(message || ""); - this.exception.name = error; - } else if (!error) { - this.exception = new Error("Error"); - } else { - this.exception = error; - } - - return this; - } - - proto = { - create: function create() { - var functionStub = function () { - - callCallback(functionStub, arguments); - - if (functionStub.exception) { - throw functionStub.exception; - } else if (typeof functionStub.returnArgAt == 'number') { - return arguments[functionStub.returnArgAt]; - } else if (functionStub.returnThis) { - return this; - } - return functionStub.returnValue; - }; - - functionStub.id = "stub#" + uuid++; - var orig = functionStub; - functionStub = sinon.spy.create(functionStub); - functionStub.func = orig; - - functionStub.callArgAts = []; - functionStub.callbackArguments = []; - functionStub.callbackContexts = []; - functionStub.callArgProps = []; - - sinon.extend(functionStub, stub); - functionStub._create = sinon.stub.create; - functionStub.displayName = "stub"; - functionStub.toString = sinon.functionToString; - - return functionStub; - }, - - resetBehavior: function () { - var i; - - this.callArgAts = []; - this.callbackArguments = []; - this.callbackContexts = []; - this.callArgProps = []; - - delete this.returnValue; - delete this.returnArgAt; - this.returnThis = false; - - if (this.fakes) { - for (i = 0; i < this.fakes.length; i++) { - this.fakes[i].resetBehavior(); - } - } - }, - - returns: function returns(value) { - this.returnValue = value; - - return this; - }, - - returnsArg: function returnsArg(pos) { - if (typeof pos != "number") { - throw new TypeError("argument index is not number"); - } - - this.returnArgAt = pos; - - return this; - }, - - returnsThis: function returnsThis() { - this.returnThis = true; - - return this; - }, - - "throws": throwsException, - throwsException: throwsException, - - callsArg: function callsArg(pos) { - if (typeof pos != "number") { - throw new TypeError("argument index is not number"); - } - - this.callArgAts.push(pos); - this.callbackArguments.push([]); - this.callbackContexts.push(undefined); - this.callArgProps.push(undefined); - - return this; - }, - - callsArgOn: function callsArgOn(pos, context) { - if (typeof pos != "number") { - throw new TypeError("argument index is not number"); - } - if (typeof context != "object") { - throw new TypeError("argument context is not an object"); - } - - this.callArgAts.push(pos); - this.callbackArguments.push([]); - this.callbackContexts.push(context); - this.callArgProps.push(undefined); - - return this; - }, - - callsArgWith: function callsArgWith(pos) { - if (typeof pos != "number") { - throw new TypeError("argument index is not number"); - } - - this.callArgAts.push(pos); - this.callbackArguments.push(slice.call(arguments, 1)); - this.callbackContexts.push(undefined); - this.callArgProps.push(undefined); - - return this; - }, - - callsArgOnWith: function callsArgWith(pos, context) { - if (typeof pos != "number") { - throw new TypeError("argument index is not number"); - } - if (typeof context != "object") { - throw new TypeError("argument context is not an object"); - } - - this.callArgAts.push(pos); - this.callbackArguments.push(slice.call(arguments, 2)); - this.callbackContexts.push(context); - this.callArgProps.push(undefined); - - return this; - }, - - yields: function () { - this.callArgAts.push(-1); - this.callbackArguments.push(slice.call(arguments, 0)); - this.callbackContexts.push(undefined); - this.callArgProps.push(undefined); - - return this; - }, - - yieldsOn: function (context) { - if (typeof context != "object") { - throw new TypeError("argument context is not an object"); - } - - this.callArgAts.push(-1); - this.callbackArguments.push(slice.call(arguments, 1)); - this.callbackContexts.push(context); - this.callArgProps.push(undefined); - - return this; - }, - - yieldsTo: function (prop) { - this.callArgAts.push(-1); - this.callbackArguments.push(slice.call(arguments, 1)); - this.callbackContexts.push(undefined); - this.callArgProps.push(prop); - - return this; - }, - - yieldsToOn: function (prop, context) { - if (typeof context != "object") { - throw new TypeError("argument context is not an object"); - } - - this.callArgAts.push(-1); - this.callbackArguments.push(slice.call(arguments, 2)); - this.callbackContexts.push(context); - this.callArgProps.push(prop); - - return this; - } - }; - - // create asynchronous versions of callsArg* and yields* methods - for (var method in proto) { - // need to avoid creating anotherasync versions of the newly added async methods - if (proto.hasOwnProperty(method) && - method.match(/^(callsArg|yields|thenYields$)/) && - !method.match(/Async/)) { - proto[method + 'Async'] = (function (syncFnName) { - return function () { - this.callbackAsync = true; - return this[syncFnName].apply(this, arguments); - }; - })(method); - } - } - - return proto; - - }())); - - if (commonJSModule) { - module.exports = stub; - } else { - sinon.stub = stub; - } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend stub.js - */ -/*jslint eqeqeq: false, onevar: false, nomen: false*/ -/*global module, require, sinon*/ -/** - * Mock functions. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - var push = [].push; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function mock(object) { - if (!object) { - return sinon.expectation.create("Anonymous mock"); - } - - return mock.create(object); - } - - sinon.mock = mock; - - sinon.extend(mock, (function () { - function each(collection, callback) { - if (!collection) { - return; - } - - for (var i = 0, l = collection.length; i < l; i += 1) { - callback(collection[i]); - } - } - - return { - create: function create(object) { - if (!object) { - throw new TypeError("object is null"); - } - - var mockObject = sinon.extend({}, mock); - mockObject.object = object; - delete mockObject.create; - - return mockObject; - }, - - expects: function expects(method) { - if (!method) { - throw new TypeError("method is falsy"); - } - - if (!this.expectations) { - this.expectations = {}; - this.proxies = []; - } - - if (!this.expectations[method]) { - this.expectations[method] = []; - var mockObject = this; - - sinon.wrapMethod(this.object, method, function () { - return mockObject.invokeMethod(method, this, arguments); - }); - - push.call(this.proxies, method); - } - - var expectation = sinon.expectation.create(method); - push.call(this.expectations[method], expectation); - - return expectation; - }, - - restore: function restore() { - var object = this.object; - - each(this.proxies, function (proxy) { - if (typeof object[proxy].restore == "function") { - object[proxy].restore(); - } - }); - }, - - verify: function verify() { - var expectations = this.expectations || {}; - var messages = [], met = []; - - each(this.proxies, function (proxy) { - each(expectations[proxy], function (expectation) { - if (!expectation.met()) { - push.call(messages, expectation.toString()); - } else { - push.call(met, expectation.toString()); - } - }); - }); - - this.restore(); - - if (messages.length > 0) { - sinon.expectation.fail(messages.concat(met).join("\n")); - } else { - sinon.expectation.pass(messages.concat(met).join("\n")); - } - - return true; - }, - - invokeMethod: function invokeMethod(method, thisValue, args) { - var expectations = this.expectations && this.expectations[method]; - var length = expectations && expectations.length || 0, i; - - for (i = 0; i < length; i += 1) { - if (!expectations[i].met() && - expectations[i].allowsCall(thisValue, args)) { - return expectations[i].apply(thisValue, args); - } - } - - var messages = [], available, exhausted = 0; - - for (i = 0; i < length; i += 1) { - if (expectations[i].allowsCall(thisValue, args)) { - available = available || expectations[i]; - } else { - exhausted += 1; - } - push.call(messages, " " + expectations[i].toString()); - } - - if (exhausted === 0) { - return available.apply(thisValue, args); - } - - messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({ - proxy: method, - args: args - })); - - sinon.expectation.fail(messages.join("\n")); - } - }; - }())); - - var times = sinon.timesInWords; - - sinon.expectation = (function () { - var slice = Array.prototype.slice; - var _invoke = sinon.spy.invoke; - - function callCountInWords(callCount) { - if (callCount == 0) { - return "never called"; - } else { - return "called " + times(callCount); - } - } - - function expectedCallCountInWords(expectation) { - var min = expectation.minCalls; - var max = expectation.maxCalls; - - if (typeof min == "number" && typeof max == "number") { - var str = times(min); - - if (min != max) { - str = "at least " + str + " and at most " + times(max); - } - - return str; - } - - if (typeof min == "number") { - return "at least " + times(min); - } - - return "at most " + times(max); - } - - function receivedMinCalls(expectation) { - var hasMinLimit = typeof expectation.minCalls == "number"; - return !hasMinLimit || expectation.callCount >= expectation.minCalls; - } - - function receivedMaxCalls(expectation) { - if (typeof expectation.maxCalls != "number") { - return false; - } - - return expectation.callCount == expectation.maxCalls; - } - - return { - minCalls: 1, - maxCalls: 1, - - create: function create(methodName) { - var expectation = sinon.extend(sinon.stub.create(), sinon.expectation); - delete expectation.create; - expectation.method = methodName; - - return expectation; - }, - - invoke: function invoke(func, thisValue, args) { - this.verifyCallAllowed(thisValue, args); - - return _invoke.apply(this, arguments); - }, - - atLeast: function atLeast(num) { - if (typeof num != "number") { - throw new TypeError("'" + num + "' is not number"); - } - - if (!this.limitsSet) { - this.maxCalls = null; - this.limitsSet = true; - } - - this.minCalls = num; - - return this; - }, - - atMost: function atMost(num) { - if (typeof num != "number") { - throw new TypeError("'" + num + "' is not number"); - } - - if (!this.limitsSet) { - this.minCalls = null; - this.limitsSet = true; - } - - this.maxCalls = num; - - return this; - }, - - never: function never() { - return this.exactly(0); - }, - - once: function once() { - return this.exactly(1); - }, - - twice: function twice() { - return this.exactly(2); - }, - - thrice: function thrice() { - return this.exactly(3); - }, - - exactly: function exactly(num) { - if (typeof num != "number") { - throw new TypeError("'" + num + "' is not a number"); - } - - this.atLeast(num); - return this.atMost(num); - }, - - met: function met() { - return !this.failed && receivedMinCalls(this); - }, - - verifyCallAllowed: function verifyCallAllowed(thisValue, args) { - if (receivedMaxCalls(this)) { - this.failed = true; - sinon.expectation.fail(this.method + " already called " + times(this.maxCalls)); - } - - if ("expectedThis" in this && this.expectedThis !== thisValue) { - sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " + - this.expectedThis); - } - - if (!("expectedArguments" in this)) { - return; - } - - if (!args) { - sinon.expectation.fail(this.method + " received no arguments, expected " + - sinon.format(this.expectedArguments)); - } - - if (args.length < this.expectedArguments.length) { - sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) + - "), expected " + sinon.format(this.expectedArguments)); - } - - if (this.expectsExactArgCount && - args.length != this.expectedArguments.length) { - sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) + - "), expected " + sinon.format(this.expectedArguments)); - } - - for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) { - if (!sinon.deepEqual(this.expectedArguments[i], args[i])) { - sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) + - ", expected " + sinon.format(this.expectedArguments)); - } - } - }, - - allowsCall: function allowsCall(thisValue, args) { - if (this.met() && receivedMaxCalls(this)) { - return false; - } - - if ("expectedThis" in this && this.expectedThis !== thisValue) { - return false; - } - - if (!("expectedArguments" in this)) { - return true; - } - - args = args || []; - - if (args.length < this.expectedArguments.length) { - return false; - } - - if (this.expectsExactArgCount && - args.length != this.expectedArguments.length) { - return false; - } - - for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) { - if (!sinon.deepEqual(this.expectedArguments[i], args[i])) { - return false; - } - } - - return true; - }, - - withArgs: function withArgs() { - this.expectedArguments = slice.call(arguments); - return this; - }, - - withExactArgs: function withExactArgs() { - this.withArgs.apply(this, arguments); - this.expectsExactArgCount = true; - return this; - }, - - on: function on(thisValue) { - this.expectedThis = thisValue; - return this; - }, - - toString: function () { - var args = (this.expectedArguments || []).slice(); - - if (!this.expectsExactArgCount) { - push.call(args, "[...]"); - } - - var callStr = sinon.spyCall.toString.call({ - proxy: this.method || "anonymous mock expectation", - args: args - }); - - var message = callStr.replace(", [...", "[, ...") + " " + - expectedCallCountInWords(this); - - if (this.met()) { - return "Expectation met: " + message; - } - - return "Expected " + message + " (" + - callCountInWords(this.callCount) + ")"; - }, - - verify: function verify() { - if (!this.met()) { - sinon.expectation.fail(this.toString()); - } else { - sinon.expectation.pass(this.toString()); - } - - return true; - }, - - pass: function(message) { - sinon.assert.pass(message); - }, - fail: function (message) { - var exception = new Error(message); - exception.name = "ExpectationError"; - - throw exception; - } - }; - }()); - - if (commonJSModule) { - module.exports = mock; - } else { - sinon.mock = mock; - } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend stub.js - * @depend mock.js - */ -/*jslint eqeqeq: false, onevar: false, forin: true*/ -/*global module, require, sinon*/ -/** - * Collections of stubs, spies and mocks. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - var push = [].push; - var hasOwnProperty = Object.prototype.hasOwnProperty; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function getFakes(fakeCollection) { - if (!fakeCollection.fakes) { - fakeCollection.fakes = []; - } - - return fakeCollection.fakes; - } - - function each(fakeCollection, method) { - var fakes = getFakes(fakeCollection); - - for (var i = 0, l = fakes.length; i < l; i += 1) { - if (typeof fakes[i][method] == "function") { - fakes[i][method](); - } - } - } - - function compact(fakeCollection) { - var fakes = getFakes(fakeCollection); - var i = 0; - while (i < fakes.length) { - fakes.splice(i, 1); - } - } - - var collection = { - verify: function resolve() { - each(this, "verify"); - }, - - restore: function restore() { - each(this, "restore"); - compact(this); - }, - - verifyAndRestore: function verifyAndRestore() { - var exception; - - try { - this.verify(); - } catch (e) { - exception = e; - } - - this.restore(); - - if (exception) { - throw exception; - } - }, - - add: function add(fake) { - push.call(getFakes(this), fake); - return fake; - }, - - spy: function spy() { - return this.add(sinon.spy.apply(sinon, arguments)); - }, - - stub: function stub(object, property, value) { - if (property) { - var original = object[property]; - - if (typeof original != "function") { - if (!hasOwnProperty.call(object, property)) { - throw new TypeError("Cannot stub non-existent own property " + property); - } - - object[property] = value; - - return this.add({ - restore: function () { - object[property] = original; - } - }); - } - } - if (!property && !!object && typeof object == "object") { - var stubbedObj = sinon.stub.apply(sinon, arguments); - - for (var prop in stubbedObj) { - if (typeof stubbedObj[prop] === "function") { - this.add(stubbedObj[prop]); - } - } - - return stubbedObj; - } - - return this.add(sinon.stub.apply(sinon, arguments)); - }, - - mock: function mock() { - return this.add(sinon.mock.apply(sinon, arguments)); - }, - - inject: function inject(obj) { - var col = this; - - obj.spy = function () { - return col.spy.apply(col, arguments); - }; - - obj.stub = function () { - return col.stub.apply(col, arguments); - }; - - obj.mock = function () { - return col.mock.apply(col, arguments); - }; - - return obj; - } - }; - - if (commonJSModule) { - module.exports = collection; - } else { - sinon.collection = collection; - } -}(typeof sinon == "object" && sinon || null)); - -/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/ -/*global module, require, window*/ -/** - * Fake timer API - * setTimeout - * setInterval - * clearTimeout - * clearInterval - * tick - * reset - * Date - * - * Inspired by jsUnitMockTimeOut from JsUnit - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -if (typeof sinon == "undefined") { - var sinon = {}; -} - -(function (global) { - var id = 1; - - function addTimer(args, recurring) { - if (args.length === 0) { - throw new Error("Function requires at least 1 parameter"); - } - - var toId = id++; - var delay = args[1] || 0; - - if (!this.timeouts) { - this.timeouts = {}; - } - - this.timeouts[toId] = { - id: toId, - func: args[0], - callAt: this.now + delay, - invokeArgs: Array.prototype.slice.call(args, 2) - }; - - if (recurring === true) { - this.timeouts[toId].interval = delay; - } - - return toId; - } - - function parseTime(str) { - if (!str) { - return 0; - } - - var strings = str.split(":"); - var l = strings.length, i = l; - var ms = 0, parsed; - - if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { - throw new Error("tick only understands numbers and 'h:m:s'"); - } - - while (i--) { - parsed = parseInt(strings[i], 10); - - if (parsed >= 60) { - throw new Error("Invalid time " + str); - } - - ms += parsed * Math.pow(60, (l - i - 1)); - } - - return ms * 1000; - } - - function createObject(object) { - var newObject; - - if (Object.create) { - newObject = Object.create(object); - } else { - var F = function () {}; - F.prototype = object; - newObject = new F(); - } - - newObject.Date.clock = newObject; - return newObject; - } - - sinon.clock = { - now: 0, - - create: function create(now) { - var clock = createObject(this); - - if (typeof now == "number") { - clock.now = now; - } - - if (!!now && typeof now == "object") { - throw new TypeError("now should be milliseconds since UNIX epoch"); - } - - return clock; - }, - - setTimeout: function setTimeout(callback, timeout) { - return addTimer.call(this, arguments, false); - }, - - clearTimeout: function clearTimeout(timerId) { - if (!this.timeouts) { - this.timeouts = []; - } - - if (timerId in this.timeouts) { - delete this.timeouts[timerId]; - } - }, - - setInterval: function setInterval(callback, timeout) { - return addTimer.call(this, arguments, true); - }, - - clearInterval: function clearInterval(timerId) { - this.clearTimeout(timerId); - }, - - tick: function tick(ms) { - ms = typeof ms == "number" ? ms : parseTime(ms); - var tickFrom = this.now, tickTo = this.now + ms, previous = this.now; - var timer = this.firstTimerInRange(tickFrom, tickTo); - - var firstException; - while (timer && tickFrom <= tickTo) { - if (this.timeouts[timer.id]) { - tickFrom = this.now = timer.callAt; - try { - this.callTimer(timer); - } catch (e) { - firstException = firstException || e; - } - } - - timer = this.firstTimerInRange(previous, tickTo); - previous = tickFrom; - } - - this.now = tickTo; - - if (firstException) { - throw firstException; - } - - return this.now; - }, - - firstTimerInRange: function (from, to) { - var timer, smallest, originalTimer; - - for (var id in this.timeouts) { - if (this.timeouts.hasOwnProperty(id)) { - if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) { - continue; - } - - if (!smallest || this.timeouts[id].callAt < smallest) { - originalTimer = this.timeouts[id]; - smallest = this.timeouts[id].callAt; - - timer = { - func: this.timeouts[id].func, - callAt: this.timeouts[id].callAt, - interval: this.timeouts[id].interval, - id: this.timeouts[id].id, - invokeArgs: this.timeouts[id].invokeArgs - }; - } - } - } - - return timer || null; - }, - - callTimer: function (timer) { - if (typeof timer.interval == "number") { - this.timeouts[timer.id].callAt += timer.interval; - } else { - delete this.timeouts[timer.id]; - } - - try { - if (typeof timer.func == "function") { - timer.func.apply(null, timer.invokeArgs); - } else { - eval(timer.func); - } - } catch (e) { - var exception = e; - } - - if (!this.timeouts[timer.id]) { - if (exception) { - throw exception; - } - return; - } - - if (exception) { - throw exception; - } - }, - - reset: function reset() { - this.timeouts = {}; - }, - - Date: (function () { - var NativeDate = Date; - - function ClockDate(year, month, date, hour, minute, second, ms) { - // Defensive and verbose to avoid potential harm in passing - // explicit undefined when user does not pass argument - switch (arguments.length) { - case 0: - return new NativeDate(ClockDate.clock.now); - case 1: - return new NativeDate(year); - case 2: - return new NativeDate(year, month); - case 3: - return new NativeDate(year, month, date); - case 4: - return new NativeDate(year, month, date, hour); - case 5: - return new NativeDate(year, month, date, hour, minute); - case 6: - return new NativeDate(year, month, date, hour, minute, second); - default: - return new NativeDate(year, month, date, hour, minute, second, ms); - } - } - - return mirrorDateProperties(ClockDate, NativeDate); - }()) - }; - - function mirrorDateProperties(target, source) { - if (source.now) { - target.now = function now() { - return target.clock.now; - }; - } else { - delete target.now; - } - - if (source.toSource) { - target.toSource = function toSource() { - return source.toSource(); - }; - } else { - delete target.toSource; - } - - target.toString = function toString() { - return source.toString(); - }; - - target.prototype = source.prototype; - target.parse = source.parse; - target.UTC = source.UTC; - target.prototype.toUTCString = source.prototype.toUTCString; - return target; - } - - var methods = ["Date", "setTimeout", "setInterval", - "clearTimeout", "clearInterval"]; - - function restore() { - var method; - - for (var i = 0, l = this.methods.length; i < l; i++) { - method = this.methods[i]; - if (global[method].hadOwnProperty) { - global[method] = this["_" + method]; - } else { - delete global[method]; - } - } - - // Prevent multiple executions which will completely remove these props - this.methods = []; - } - - function stubGlobal(method, clock) { - clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method); - clock["_" + method] = global[method]; - - if (method == "Date") { - var date = mirrorDateProperties(clock[method], global[method]); - global[method] = date; - } else { - global[method] = function () { - return clock[method].apply(clock, arguments); - }; - - for (var prop in clock[method]) { - if (clock[method].hasOwnProperty(prop)) { - global[method][prop] = clock[method][prop]; - } - } - } - - global[method].clock = clock; - } - - sinon.useFakeTimers = function useFakeTimers(now) { - var clock = sinon.clock.create(now); - clock.restore = restore; - clock.methods = Array.prototype.slice.call(arguments, - typeof now == "number" ? 1 : 0); - - if (clock.methods.length === 0) { - clock.methods = methods; - } - - for (var i = 0, l = clock.methods.length; i < l; i++) { - stubGlobal(clock.methods[i], clock); - } - - return clock; - }; -}(typeof global != "undefined" && typeof global !== "function" ? global : this)); - -sinon.timers = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setInterval: setInterval, - clearInterval: clearInterval, - Date: Date -}; - -if (typeof module == "object" && typeof require == "function") { - module.exports = sinon; -} - -/*jslint eqeqeq: false, onevar: false*/ -/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/ -/** - * Minimal Event interface implementation - * - * Original implementation by Sven Fuchs: https://gist.github.com/995028 - * Modifications and tests by Christian Johansen. - * - * @author Sven Fuchs (svenfuchs@artweb-design.de) - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2011 Sven Fuchs, Christian Johansen - */ - -if (typeof sinon == "undefined") { - this.sinon = {}; -} - -(function () { - var push = [].push; - - sinon.Event = function Event(type, bubbles, cancelable) { - this.initEvent(type, bubbles, cancelable); - }; - - sinon.Event.prototype = { - initEvent: function(type, bubbles, cancelable) { - this.type = type; - this.bubbles = bubbles; - this.cancelable = cancelable; - }, - - stopPropagation: function () {}, - - preventDefault: function () { - this.defaultPrevented = true; - } - }; - - sinon.EventTarget = { - addEventListener: function addEventListener(event, listener, useCapture) { - this.eventListeners = this.eventListeners || {}; - this.eventListeners[event] = this.eventListeners[event] || []; - push.call(this.eventListeners[event], listener); - }, - - removeEventListener: function removeEventListener(event, listener, useCapture) { - var listeners = this.eventListeners && this.eventListeners[event] || []; - - for (var i = 0, l = listeners.length; i < l; ++i) { - if (listeners[i] == listener) { - return listeners.splice(i, 1); - } - } - }, - - dispatchEvent: function dispatchEvent(event) { - var type = event.type; - var listeners = this.eventListeners && this.eventListeners[type] || []; - - for (var i = 0; i < listeners.length; i++) { - if (typeof listeners[i] == "function") { - listeners[i].call(this, event); - } else { - listeners[i].handleEvent(event); - } - } - - return !!event.defaultPrevented; - } - }; -}()); - -/** - * @depend ../../sinon.js - * @depend event.js - */ -/*jslint eqeqeq: false, onevar: false*/ -/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/ -/** - * Fake XMLHttpRequest object - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -if (typeof sinon == "undefined") { - this.sinon = {}; -} -sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest }; - -// wrapper for global -(function(global) { - var xhr = sinon.xhr; - xhr.GlobalXMLHttpRequest = global.XMLHttpRequest; - xhr.GlobalActiveXObject = global.ActiveXObject; - xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined"; - xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined"; - xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX - ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false; - - /*jsl:ignore*/ - var unsafeHeaders = { - "Accept-Charset": true, - "Accept-Encoding": true, - "Connection": true, - "Content-Length": true, - "Cookie": true, - "Cookie2": true, - "Content-Transfer-Encoding": true, - "Date": true, - "Expect": true, - "Host": true, - "Keep-Alive": true, - "Referer": true, - "TE": true, - "Trailer": true, - "Transfer-Encoding": true, - "Upgrade": true, - "User-Agent": true, - "Via": true - }; - /*jsl:end*/ - - function FakeXMLHttpRequest() { - this.readyState = FakeXMLHttpRequest.UNSENT; - this.requestHeaders = {}; - this.requestBody = null; - this.status = 0; - this.statusText = ""; - - if (typeof FakeXMLHttpRequest.onCreate == "function") { - FakeXMLHttpRequest.onCreate(this); - } - } - - function verifyState(xhr) { - if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { - throw new Error("INVALID_STATE_ERR"); - } - - if (xhr.sendFlag) { - throw new Error("INVALID_STATE_ERR"); - } - } - - // filtering to enable a white-list version of Sinon FakeXhr, - // where whitelisted requests are passed through to real XHR - function each(collection, callback) { - if (!collection) return; - for (var i = 0, l = collection.length; i < l; i += 1) { - callback(collection[i]); - } - } - function some(collection, callback) { - for (var index = 0; index < collection.length; index++) { - if(callback(collection[index]) === true) return true; - }; - return false; - } - // largest arity in XHR is 5 - XHR#open - var apply = function(obj,method,args) { - switch(args.length) { - case 0: return obj[method](); - case 1: return obj[method](args[0]); - case 2: return obj[method](args[0],args[1]); - case 3: return obj[method](args[0],args[1],args[2]); - case 4: return obj[method](args[0],args[1],args[2],args[3]); - case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]); - }; - }; - - FakeXMLHttpRequest.filters = []; - FakeXMLHttpRequest.addFilter = function(fn) { - this.filters.push(fn) - }; - var IE6Re = /MSIE 6/; - FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) { - var xhr = new sinon.xhr.workingXHR(); - each(["open","setRequestHeader","send","abort","getResponseHeader", - "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"], - function(method) { - fakeXhr[method] = function() { - return apply(xhr,method,arguments); - }; - }); - - var copyAttrs = function(args) { - each(args, function(attr) { - try { - fakeXhr[attr] = xhr[attr] - } catch(e) { - if(!IE6Re.test(navigator.userAgent)) throw e; - } - }); - }; - - var stateChange = function() { - fakeXhr.readyState = xhr.readyState; - if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) { - copyAttrs(["status","statusText"]); - } - if(xhr.readyState >= FakeXMLHttpRequest.LOADING) { - copyAttrs(["responseText"]); - } - if(xhr.readyState === FakeXMLHttpRequest.DONE) { - copyAttrs(["responseXML"]); - } - if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr); - }; - if(xhr.addEventListener) { - for(var event in fakeXhr.eventListeners) { - if(fakeXhr.eventListeners.hasOwnProperty(event)) { - each(fakeXhr.eventListeners[event],function(handler) { - xhr.addEventListener(event, handler); - }); - } - } - xhr.addEventListener("readystatechange",stateChange); - } else { - xhr.onreadystatechange = stateChange; - } - apply(xhr,"open",xhrArgs); - }; - FakeXMLHttpRequest.useFilters = false; - - function verifyRequestSent(xhr) { - if (xhr.readyState == FakeXMLHttpRequest.DONE) { - throw new Error("Request done"); - } - } - - function verifyHeadersReceived(xhr) { - if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) { - throw new Error("No headers received"); - } - } - - function verifyResponseBodyType(body) { - if (typeof body != "string") { - var error = new Error("Attempted to respond to fake XMLHttpRequest with " + - body + ", which is not a string."); - error.name = "InvalidBodyException"; - throw error; - } - } - - sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, { - async: true, - - open: function open(method, url, async, username, password) { - this.method = method; - this.url = url; - this.async = typeof async == "boolean" ? async : true; - this.username = username; - this.password = password; - this.responseText = null; - this.responseXML = null; - this.requestHeaders = {}; - this.sendFlag = false; - if(sinon.FakeXMLHttpRequest.useFilters === true) { - var xhrArgs = arguments; - var defake = some(FakeXMLHttpRequest.filters,function(filter) { - return filter.apply(this,xhrArgs) - }); - if (defake) { - return sinon.FakeXMLHttpRequest.defake(this,arguments); - } - } - this.readyStateChange(FakeXMLHttpRequest.OPENED); - }, - - readyStateChange: function readyStateChange(state) { - this.readyState = state; - - if (typeof this.onreadystatechange == "function") { - try { - this.onreadystatechange(); - } catch (e) { - sinon.logError("Fake XHR onreadystatechange handler", e); - } - } - - this.dispatchEvent(new sinon.Event("readystatechange")); - }, - - setRequestHeader: function setRequestHeader(header, value) { - verifyState(this); - - if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) { - throw new Error("Refused to set unsafe header \"" + header + "\""); - } - - if (this.requestHeaders[header]) { - this.requestHeaders[header] += "," + value; - } else { - this.requestHeaders[header] = value; - } - }, - - // Helps testing - setResponseHeaders: function setResponseHeaders(headers) { - this.responseHeaders = {}; - - for (var header in headers) { - if (headers.hasOwnProperty(header)) { - this.responseHeaders[header] = headers[header]; - } - } - - if (this.async) { - this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED); - } else { - this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED; - } - }, - - // Currently treats ALL data as a DOMString (i.e. no Document) - send: function send(data) { - verifyState(this); - - if (!/^(get|head)$/i.test(this.method)) { - if (this.requestHeaders["Content-Type"]) { - var value = this.requestHeaders["Content-Type"].split(";"); - this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8"; - } else { - this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8"; - } - - this.requestBody = data; - } - - this.errorFlag = false; - this.sendFlag = this.async; - this.readyStateChange(FakeXMLHttpRequest.OPENED); - - if (typeof this.onSend == "function") { - this.onSend(this); - } - }, - - abort: function abort() { - this.aborted = true; - this.responseText = null; - this.errorFlag = true; - this.requestHeaders = {}; - - if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) { - this.readyStateChange(sinon.FakeXMLHttpRequest.DONE); - this.sendFlag = false; - } - - this.readyState = sinon.FakeXMLHttpRequest.UNSENT; - }, - - getResponseHeader: function getResponseHeader(header) { - if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { - return null; - } - - if (/^Set-Cookie2?$/i.test(header)) { - return null; - } - - header = header.toLowerCase(); - - for (var h in this.responseHeaders) { - if (h.toLowerCase() == header) { - return this.responseHeaders[h]; - } - } - - return null; - }, - - getAllResponseHeaders: function getAllResponseHeaders() { - if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { - return ""; - } - - var headers = ""; - - for (var header in this.responseHeaders) { - if (this.responseHeaders.hasOwnProperty(header) && - !/^Set-Cookie2?$/i.test(header)) { - headers += header + ": " + this.responseHeaders[header] + "\r\n"; - } - } - - return headers; - }, - - setResponseBody: function setResponseBody(body) { - verifyRequestSent(this); - verifyHeadersReceived(this); - verifyResponseBodyType(body); - - var chunkSize = this.chunkSize || 10; - var index = 0; - this.responseText = ""; - - do { - if (this.async) { - this.readyStateChange(FakeXMLHttpRequest.LOADING); - } - - this.responseText += body.substring(index, index + chunkSize); - index += chunkSize; - } while (index < body.length); - - var type = this.getResponseHeader("Content-Type"); - - if (this.responseText && - (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) { - try { - this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText); - } catch (e) { - // Unable to parse XML - no biggie - } - } - - if (this.async) { - this.readyStateChange(FakeXMLHttpRequest.DONE); - } else { - this.readyState = FakeXMLHttpRequest.DONE; - } - }, - - respond: function respond(status, headers, body) { - this.setResponseHeaders(headers || {}); - this.status = typeof status == "number" ? status : 200; - this.statusText = FakeXMLHttpRequest.statusCodes[this.status]; - this.setResponseBody(body || ""); - } - }); - - sinon.extend(FakeXMLHttpRequest, { - UNSENT: 0, - OPENED: 1, - HEADERS_RECEIVED: 2, - LOADING: 3, - DONE: 4 - }); - - // Borrowed from JSpec - FakeXMLHttpRequest.parseXML = function parseXML(text) { - var xmlDoc; - - if (typeof DOMParser != "undefined") { - var parser = new DOMParser(); - xmlDoc = parser.parseFromString(text, "text/xml"); - } else { - xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.async = "false"; - xmlDoc.loadXML(text); - } - - return xmlDoc; - }; - - FakeXMLHttpRequest.statusCodes = { - 100: "Continue", - 101: "Switching Protocols", - 200: "OK", - 201: "Created", - 202: "Accepted", - 203: "Non-Authoritative Information", - 204: "No Content", - 205: "Reset Content", - 206: "Partial Content", - 300: "Multiple Choice", - 301: "Moved Permanently", - 302: "Found", - 303: "See Other", - 304: "Not Modified", - 305: "Use Proxy", - 307: "Temporary Redirect", - 400: "Bad Request", - 401: "Unauthorized", - 402: "Payment Required", - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 406: "Not Acceptable", - 407: "Proxy Authentication Required", - 408: "Request Timeout", - 409: "Conflict", - 410: "Gone", - 411: "Length Required", - 412: "Precondition Failed", - 413: "Request Entity Too Large", - 414: "Request-URI Too Long", - 415: "Unsupported Media Type", - 416: "Requested Range Not Satisfiable", - 417: "Expectation Failed", - 422: "Unprocessable Entity", - 500: "Internal Server Error", - 501: "Not Implemented", - 502: "Bad Gateway", - 503: "Service Unavailable", - 504: "Gateway Timeout", - 505: "HTTP Version Not Supported" - }; - - sinon.useFakeXMLHttpRequest = function () { - sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) { - if (xhr.supportsXHR) { - global.XMLHttpRequest = xhr.GlobalXMLHttpRequest; - } - - if (xhr.supportsActiveX) { - global.ActiveXObject = xhr.GlobalActiveXObject; - } - - delete sinon.FakeXMLHttpRequest.restore; - - if (keepOnCreate !== true) { - delete sinon.FakeXMLHttpRequest.onCreate; - } - }; - if (xhr.supportsXHR) { - global.XMLHttpRequest = sinon.FakeXMLHttpRequest; - } - - if (xhr.supportsActiveX) { - global.ActiveXObject = function ActiveXObject(objId) { - if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) { - - return new sinon.FakeXMLHttpRequest(); - } - - return new xhr.GlobalActiveXObject(objId); - }; - } - - return sinon.FakeXMLHttpRequest; - }; - - sinon.FakeXMLHttpRequest = FakeXMLHttpRequest; -})(this); - -if (typeof module == "object" && typeof require == "function") { - module.exports = sinon; -} - -/** - * @depend fake_xml_http_request.js - */ -/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/ -/*global module, require, window*/ -/** - * The Sinon "server" mimics a web server that receives requests from - * sinon.FakeXMLHttpRequest and provides an API to respond to those requests, - * both synchronously and asynchronously. To respond synchronuously, canned - * answers have to be provided upfront. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -if (typeof sinon == "undefined") { - var sinon = {}; -} - -sinon.fakeServer = (function () { - var push = [].push; - function F() {} - - function create(proto) { - F.prototype = proto; - return new F(); - } - - function responseArray(handler) { - var response = handler; - - if (Object.prototype.toString.call(handler) != "[object Array]") { - response = [200, {}, handler]; - } - - if (typeof response[2] != "string") { - throw new TypeError("Fake server response body should be string, but was " + - typeof response[2]); - } - - return response; - } - - var wloc = typeof window !== "undefined" ? window.location : {}; - var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host); - - function matchOne(response, reqMethod, reqUrl) { - var rmeth = response.method; - var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase(); - var url = response.url; - var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl)); - - return matchMethod && matchUrl; - } - - function match(response, request) { - var requestMethod = this.getHTTPMethod(request); - var requestUrl = request.url; - - if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) { - requestUrl = requestUrl.replace(rCurrLoc, ""); - } - - if (matchOne(response, this.getHTTPMethod(request), requestUrl)) { - if (typeof response.response == "function") { - var ru = response.url; - var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1)); - return response.response.apply(response, args); - } - - return true; - } - - return false; - } - - function log(response, request) { - var str; - - str = "Request:\n" + sinon.format(request) + "\n\n"; - str += "Response:\n" + sinon.format(response) + "\n\n"; - - sinon.log(str); - } - - return { - create: function () { - var server = create(this); - this.xhr = sinon.useFakeXMLHttpRequest(); - server.requests = []; - - this.xhr.onCreate = function (xhrObj) { - server.addRequest(xhrObj); - }; - - return server; - }, - - addRequest: function addRequest(xhrObj) { - var server = this; - push.call(this.requests, xhrObj); - - xhrObj.onSend = function () { - server.handleRequest(this); - }; - - if (this.autoRespond && !this.responding) { - setTimeout(function () { - server.responding = false; - server.respond(); - }, this.autoRespondAfter || 10); - - this.responding = true; - } - }, - - getHTTPMethod: function getHTTPMethod(request) { - if (this.fakeHTTPMethods && /post/i.test(request.method)) { - var matches = (request.requestBody || "").match(/_method=([^\b;]+)/); - return !!matches ? matches[1] : request.method; - } - - return request.method; - }, - - handleRequest: function handleRequest(xhr) { - if (xhr.async) { - if (!this.queue) { - this.queue = []; - } - - push.call(this.queue, xhr); - } else { - this.processRequest(xhr); - } - }, - - respondWith: function respondWith(method, url, body) { - if (arguments.length == 1 && typeof method != "function") { - this.response = responseArray(method); - return; - } - - if (!this.responses) { this.responses = []; } - - if (arguments.length == 1) { - body = method; - url = method = null; - } - - if (arguments.length == 2) { - body = url; - url = method; - method = null; - } - - push.call(this.responses, { - method: method, - url: url, - response: typeof body == "function" ? body : responseArray(body) - }); - }, - - respond: function respond() { - if (arguments.length > 0) this.respondWith.apply(this, arguments); - var queue = this.queue || []; - var request; - - while(request = queue.shift()) { - this.processRequest(request); - } - }, - - processRequest: function processRequest(request) { - try { - if (request.aborted) { - return; - } - - var response = this.response || [404, {}, ""]; - - if (this.responses) { - for (var i = 0, l = this.responses.length; i < l; i++) { - if (match.call(this, this.responses[i], request)) { - response = this.responses[i].response; - break; - } - } - } - - if (request.readyState != 4) { - log(response, request); - - request.respond(response[0], response[1], response[2]); - } - } catch (e) { - sinon.logError("Fake server request processing", e); - } - }, - - restore: function restore() { - return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments); - } - }; -}()); - -if (typeof module == "object" && typeof require == "function") { - module.exports = sinon; -} - -/** - * @depend fake_server.js - * @depend fake_timers.js - */ -/*jslint browser: true, eqeqeq: false, onevar: false*/ -/*global sinon*/ -/** - * Add-on for sinon.fakeServer that automatically handles a fake timer along with - * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery - * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead, - * it polls the object for completion with setInterval. Dispite the direct - * motivation, there is nothing jQuery-specific in this file, so it can be used - * in any environment where the ajax implementation depends on setInterval or - * setTimeout. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function () { - function Server() {} - Server.prototype = sinon.fakeServer; - - sinon.fakeServerWithClock = new Server(); - - sinon.fakeServerWithClock.addRequest = function addRequest(xhr) { - if (xhr.async) { - if (typeof setTimeout.clock == "object") { - this.clock = setTimeout.clock; - } else { - this.clock = sinon.useFakeTimers(); - this.resetClock = true; - } - - if (!this.longestTimeout) { - var clockSetTimeout = this.clock.setTimeout; - var clockSetInterval = this.clock.setInterval; - var server = this; - - this.clock.setTimeout = function (fn, timeout) { - server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); - - return clockSetTimeout.apply(this, arguments); - }; - - this.clock.setInterval = function (fn, timeout) { - server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); - - return clockSetInterval.apply(this, arguments); - }; - } - } - - return sinon.fakeServer.addRequest.call(this, xhr); - }; - - sinon.fakeServerWithClock.respond = function respond() { - var returnVal = sinon.fakeServer.respond.apply(this, arguments); - - if (this.clock) { - this.clock.tick(this.longestTimeout || 0); - this.longestTimeout = 0; - - if (this.resetClock) { - this.clock.restore(); - this.resetClock = false; - } - } - - return returnVal; - }; - - sinon.fakeServerWithClock.restore = function restore() { - if (this.clock) { - this.clock.restore(); - } - - return sinon.fakeServer.restore.apply(this, arguments); - }; -}()); - -/** - * @depend ../sinon.js - * @depend collection.js - * @depend util/fake_timers.js - * @depend util/fake_server_with_clock.js - */ -/*jslint eqeqeq: false, onevar: false, plusplus: false*/ -/*global require, module*/ -/** - * Manages fake collections as well as fake utilities such as Sinon's - * timers and fake XHR implementation in one convenient object. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -if (typeof module == "object" && typeof require == "function") { - var sinon = require("../sinon"); - sinon.extend(sinon, require("./util/fake_timers")); -} - -(function () { - var push = [].push; - - function exposeValue(sandbox, config, key, value) { - if (!value) { - return; - } - - if (config.injectInto) { - config.injectInto[key] = value; - } else { - push.call(sandbox.args, value); - } - } - - function prepareSandboxFromConfig(config) { - var sandbox = sinon.create(sinon.sandbox); - - if (config.useFakeServer) { - if (typeof config.useFakeServer == "object") { - sandbox.serverPrototype = config.useFakeServer; - } - - sandbox.useFakeServer(); - } - - if (config.useFakeTimers) { - if (typeof config.useFakeTimers == "object") { - sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers); - } else { - sandbox.useFakeTimers(); - } - } - - return sandbox; - } - - sinon.sandbox = sinon.extend(sinon.create(sinon.collection), { - useFakeTimers: function useFakeTimers() { - this.clock = sinon.useFakeTimers.apply(sinon, arguments); - - return this.add(this.clock); - }, - - serverPrototype: sinon.fakeServer, - - useFakeServer: function useFakeServer() { - var proto = this.serverPrototype || sinon.fakeServer; - - if (!proto || !proto.create) { - return null; - } - - this.server = proto.create(); - return this.add(this.server); - }, - - inject: function (obj) { - sinon.collection.inject.call(this, obj); - - if (this.clock) { - obj.clock = this.clock; - } - - if (this.server) { - obj.server = this.server; - obj.requests = this.server.requests; - } - - return obj; - }, - - create: function (config) { - if (!config) { - return sinon.create(sinon.sandbox); - } - - var sandbox = prepareSandboxFromConfig(config); - sandbox.args = sandbox.args || []; - var prop, value, exposed = sandbox.inject({}); - - if (config.properties) { - for (var i = 0, l = config.properties.length; i < l; i++) { - prop = config.properties[i]; - value = exposed[prop] || prop == "sandbox" && sandbox; - exposeValue(sandbox, config, prop, value); - } - } else { - exposeValue(sandbox, config, "sandbox", value); - } - - return sandbox; - } - }); - - sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer; - - if (typeof module == "object" && typeof require == "function") { - module.exports = sinon.sandbox; - } -}()); - -/** - * @depend ../sinon.js - * @depend stub.js - * @depend mock.js - * @depend sandbox.js - */ -/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Test function, sandboxes fakes - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function test(callback) { - var type = typeof callback; - - if (type != "function") { - throw new TypeError("sinon.test needs to wrap a test function, got " + type); - } - - return function () { - var config = sinon.getConfig(sinon.config); - config.injectInto = config.injectIntoThis && this || config.injectInto; - var sandbox = sinon.sandbox.create(config); - var exception, result; - var args = Array.prototype.slice.call(arguments).concat(sandbox.args); - - try { - result = callback.apply(this, args); - } catch (e) { - exception = e; - } - - if (typeof exception !== "undefined") { - sandbox.restore(); - throw exception; - } - else { - sandbox.verifyAndRestore(); - } - - return result; - }; - } - - test.config = { - injectIntoThis: true, - injectInto: null, - properties: ["spy", "stub", "mock", "clock", "server", "requests"], - useFakeTimers: true, - useFakeServer: true - }; - - if (commonJSModule) { - module.exports = test; - } else { - sinon.test = test; - } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend test.js - */ -/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/ -/*global module, require, sinon*/ -/** - * Test case, sandboxes all test functions - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon || !Object.prototype.hasOwnProperty) { - return; - } - - function createTest(property, setUp, tearDown) { - return function () { - if (setUp) { - setUp.apply(this, arguments); - } - - var exception, result; - - try { - result = property.apply(this, arguments); - } catch (e) { - exception = e; - } - - if (tearDown) { - tearDown.apply(this, arguments); - } - - if (exception) { - throw exception; - } - - return result; - }; - } - - function testCase(tests, prefix) { - /*jsl:ignore*/ - if (!tests || typeof tests != "object") { - throw new TypeError("sinon.testCase needs an object with test functions"); - } - /*jsl:end*/ - - prefix = prefix || "test"; - var rPrefix = new RegExp("^" + prefix); - var methods = {}, testName, property, method; - var setUp = tests.setUp; - var tearDown = tests.tearDown; - - for (testName in tests) { - if (tests.hasOwnProperty(testName)) { - property = tests[testName]; - - if (/^(setUp|tearDown)$/.test(testName)) { - continue; - } - - if (typeof property == "function" && rPrefix.test(testName)) { - method = property; - - if (setUp || tearDown) { - method = createTest(property, setUp, tearDown); - } - - methods[testName] = sinon.test(method); - } else { - methods[testName] = tests[testName]; - } - } - } - - return methods; - } - - if (commonJSModule) { - module.exports = testCase; - } else { - sinon.testCase = testCase; - } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend stub.js - */ -/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Assertions matching the test spy retrieval interface. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2013 Christian Johansen - */ - -(function (sinon, global) { - var commonJSModule = typeof module == "object" && typeof require == "function"; - var slice = Array.prototype.slice; - var assert; - - if (!sinon && commonJSModule) { - sinon = require("../sinon"); - } - - if (!sinon) { - return; - } - - function verifyIsStub() { - var method; - - for (var i = 0, l = arguments.length; i < l; ++i) { - method = arguments[i]; - - if (!method) { - assert.fail("fake is not a spy"); - } - - if (typeof method != "function") { - assert.fail(method + " is not a function"); - } - - if (typeof method.getCall != "function") { - assert.fail(method + " is not stubbed"); - } - } - } - - function failAssertion(object, msg) { - object = object || global; - var failMethod = object.fail || assert.fail; - failMethod.call(object, msg); - } - - function mirrorPropAsAssertion(name, method, message) { - if (arguments.length == 2) { - message = method; - method = name; - } - - assert[name] = function (fake) { - verifyIsStub(fake); - - var args = slice.call(arguments, 1); - var failed = false; - - if (typeof method == "function") { - failed = !method(fake); - } else { - failed = typeof fake[method] == "function" ? - !fake[method].apply(fake, args) : !fake[method]; - } - - if (failed) { - failAssertion(this, fake.printf.apply(fake, [message].concat(args))); - } else { - assert.pass(name); - } - }; - } - - function exposedName(prefix, prop) { - return !prefix || /^fail/.test(prop) ? prop : - prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1); - }; - - assert = { - failException: "AssertError", - - fail: function fail(message) { - var error = new Error(message); - error.name = this.failException || assert.failException; - - throw error; - }, - - pass: function pass(assertion) {}, - - callOrder: function assertCallOrder() { - verifyIsStub.apply(null, arguments); - var expected = "", actual = ""; - - if (!sinon.calledInOrder(arguments)) { - try { - expected = [].join.call(arguments, ", "); - actual = sinon.orderByFirstCall(slice.call(arguments)).join(", "); - } catch (e) { - // If this fails, we'll just fall back to the blank string - } - - failAssertion(this, "expected " + expected + " to be " + - "called in order but were called as " + actual); - } else { - assert.pass("callOrder"); - } - }, - - callCount: function assertCallCount(method, count) { - verifyIsStub(method); - - if (method.callCount != count) { - var msg = "expected %n to be called " + sinon.timesInWords(count) + - " but was called %c%C"; - failAssertion(this, method.printf(msg)); - } else { - assert.pass("callCount"); - } - }, - - expose: function expose(target, options) { - if (!target) { - throw new TypeError("target is null or undefined"); - } - - var o = options || {}; - var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix; - var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail; - - for (var method in this) { - if (method != "export" && (includeFail || !/^(fail)/.test(method))) { - target[exposedName(prefix, method)] = this[method]; - } - } - - return target; - } - }; - - mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called"); - mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; }, - "expected %n to not have been called but was called %c%C"); - mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C"); - mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C"); - mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C"); - mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t"); - mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t"); - mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new"); - mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new"); - mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C"); - mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C"); - mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C"); - mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C"); - mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C"); - mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C"); - mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C"); - mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C"); - mirrorPropAsAssertion("threw", "%n did not throw exception%C"); - mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C"); - - if (commonJSModule) { - module.exports = assert; - } else { - sinon.assert = assert; - } -}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : global)); - -return sinon;}.call(typeof window != 'undefined' && window || {})); diff --git a/spec/spec.hintrc.js b/spec/spec.hintrc.js deleted file mode 100644 index 3dc6f04421f..00000000000 --- a/spec/spec.hintrc.js +++ /dev/null @@ -1,25 +0,0 @@ -{ - "browser": true, - "node": true, - "predef": ["define", "L", "expect", "describe", "it", "sinon", "happen", "beforeEach", "afterEach"], - "strict": false, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "forin": false, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "undef": true, - // "unused": true, - // "quotmark": "single", - "indent": 4, - "trailing": true, - "white": true, - "smarttabs": true - // "maxlen": 120 -} diff --git a/spec/suites/LeafletSpec.js b/spec/suites/LeafletSpec.js deleted file mode 100644 index 3fe80572568..00000000000 --- a/spec/suites/LeafletSpec.js +++ /dev/null @@ -1,13 +0,0 @@ -describe('L#noConflict', function () { - it('restores the previous L value and returns Leaflet namespace', function () { - - expect(L.version).to.be.ok(); - - var L2 = L.noConflict(); - - expect(L).to.eql('test'); - expect(L2.version).to.be.ok(); - - window.L = L2; - }); -}); diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js deleted file mode 100644 index cabff4b2d31..00000000000 --- a/spec/suites/SpecHelper.js +++ /dev/null @@ -1,42 +0,0 @@ -if (!Array.prototype.map) { - Array.prototype.map = function (fun /*, thisp */) { - "use strict"; - - if (this === void 0 || this === null) { - throw new TypeError(); - } - - var t = Object(this); - // jshint bitwise: false - var len = t.length >>> 0; - if (typeof fun !== "function") { - throw new TypeError(); - } - - var res = new Array(len); - var thisp = arguments[1]; - for (var i = 0; i < len; i++) { - if (i in t) { - res[i] = fun.call(thisp, t[i], i, t); - } - } - - return res; - }; -} - -expect.Assertion.prototype.near = function (expected, delta) { - delta = delta || 1; - expect(this.obj.x).to - .be.within(expected.x - delta, expected.x + delta); - expect(this.obj.y).to - .be.within(expected.y - delta, expected.y + delta); -}; - -expect.Assertion.prototype.nearLatLng = function (expected, delta) { - delta = delta || 1e-4; - expect(this.obj.lat).to - .be.within(expected.lat - delta, expected.lat + delta); - expect(this.obj.lng).to - .be.within(expected.lng - delta, expected.lng + delta); -}; diff --git a/spec/suites/control/Control.AttributionSpec.js b/spec/suites/control/Control.AttributionSpec.js deleted file mode 100644 index 2f969e3b58e..00000000000 --- a/spec/suites/control/Control.AttributionSpec.js +++ /dev/null @@ -1,68 +0,0 @@ -describe("Control.Attribution", function () { - - var map, control, container; - - beforeEach(function () { - map = L.map(document.createElement('div')); - control = new L.Control.Attribution({ - prefix: 'prefix' - }).addTo(map); - container = control.getContainer(); - }); - - it("contains just prefix if no attributions added", function () { - expect(container.innerHTML).to.eql('prefix'); - }); - - describe('#addAttribution', function () { - it('adds one attribution correctly', function () { - control.addAttribution('foo'); - expect(container.innerHTML).to.eql('prefix | foo'); - }); - - it('adds no duplicate attributions', function () { - control.addAttribution('foo'); - control.addAttribution('foo'); - expect(container.innerHTML).to.eql('prefix | foo'); - }); - - it('adds several attributions listed with comma', function () { - control.addAttribution('foo'); - control.addAttribution('bar'); - expect(container.innerHTML).to.eql('prefix | foo, bar'); - }); - }); - - describe('#removeAttribution', function () { - it('removes attribution correctly', function () { - control.addAttribution('foo'); - control.addAttribution('bar'); - control.removeAttribution('foo'); - expect(container.innerHTML).to.eql('prefix | bar'); - }); - it('does nothing if removing attribution that was not present', function () { - control.addAttribution('foo'); - control.addAttribution('baz'); - control.removeAttribution('bar'); - control.removeAttribution('baz'); - control.removeAttribution('baz'); - control.removeAttribution(''); - expect(container.innerHTML).to.eql('prefix | foo'); - }); - }); - - describe('#setPrefix', function () { - it('changes prefix', function () { - control.setPrefix('bla'); - expect(container.innerHTML).to.eql('bla'); - }); - }); - - describe('control.attribution factory', function () { - it('creates Control.Attribution instance', function () { - var options = {prefix: 'prefix'}; - expect(L.control.attribution(options)).to.eql(new L.Control.Attribution(options)); - }); - }); - -}); diff --git a/spec/suites/control/Control.LayersSpec.js b/spec/suites/control/Control.LayersSpec.js deleted file mode 100644 index 8a7e1fe037c..00000000000 --- a/spec/suites/control/Control.LayersSpec.js +++ /dev/null @@ -1,67 +0,0 @@ -describe("Control.Layers", function () { - var map; - - beforeEach(function () { - map = L.map(document.createElement('div')); - }); - - describe("baselayerchange event", function () { - it("is fired on input that changes the base layer", function () { - var baseLayers = {"Layer 1": L.tileLayer(), "Layer 2": L.tileLayer()}, - layers = L.control.layers(baseLayers).addTo(map), - spy = sinon.spy(); - - map.on('baselayerchange', spy) - .whenReady(function () { - happen.click(layers._baseLayersList.getElementsByTagName("input")[0]); - - expect(spy.called).to.be.ok(); - expect(spy.mostRecentCall.args[0].layer).to.be(baseLayers["Layer 1"]); - }); - }); - - it("is not fired on input that doesn't change the base layer", function () { - var overlays = {"Marker 1": L.marker([0, 0]), "Marker 2": L.marker([0, 0])}, - layers = L.control.layers({}, overlays).addTo(map), - spy = sinon.spy(); - - map.on('baselayerchange', spy); - happen.click(layers._overlaysList.getElementsByTagName("input")[0]); - - expect(spy.called).to.not.be.ok(); - }); - }); - - describe("updates", function () { - beforeEach(function () { - map.setView([0, 0], 14); - }); - - it("when an included layer is addded or removed", function () { - var baseLayer = L.tileLayer(), - overlay = L.marker([0, 0]), - layers = L.control.layers({"Base": baseLayer}, {"Overlay": overlay}).addTo(map); - - var spy = sinon.spy(layers, '_update'); - - map.addLayer(overlay); - map.removeLayer(overlay); - - expect(spy.called).to.be.ok(); - expect(spy.callCount).to.eql(2); - }); - - it("not when a non-included layer is added or removed", function () { - var baseLayer = L.tileLayer(), - overlay = L.marker([0, 0]), - layers = L.control.layers({"Base": baseLayer}).addTo(map); - - var spy = sinon.spy(layers, '_update'); - - map.addLayer(overlay); - map.removeLayer(overlay); - - expect(spy.called).to.not.be.ok(); - }); - }); -}); diff --git a/spec/suites/control/Control.ScaleSpec.js b/spec/suites/control/Control.ScaleSpec.js deleted file mode 100644 index 0981700fe88..00000000000 --- a/spec/suites/control/Control.ScaleSpec.js +++ /dev/null @@ -1,6 +0,0 @@ -describe("Control.Scale", function () { - it("can be added to an unloaded map", function () { - var map = L.map(document.createElement('div')); - new L.Control.Scale().addTo(map); - }); -}); diff --git a/spec/suites/core/ClassSpec.js b/spec/suites/core/ClassSpec.js deleted file mode 100644 index 81673e3f2bd..00000000000 --- a/spec/suites/core/ClassSpec.js +++ /dev/null @@ -1,156 +0,0 @@ -describe("Class", function () { - - describe("#extend", function () { - var Klass, - constructor, - method; - - beforeEach(function () { - constructor = sinon.spy(); - method = sinon.spy(); - - Klass = L.Class.extend({ - statics: {bla: 1}, - includes: {mixin: true}, - - initialize: constructor, - foo: 5, - bar: method - }); - }); - - it("creates a class with the given constructor & properties", function () { - var a = new Klass(); - - expect(constructor.called).to.be.ok(); - expect(a.foo).to.eql(5); - - a.bar(); - - expect(method.called).to.be.ok(); - }); - - it("inherits parent classes' constructor & properties", function () { - var Klass2 = Klass.extend({baz: 2}); - - var b = new Klass2(); - - expect(b instanceof Klass).to.be.ok(); - expect(b instanceof Klass2).to.be.ok(); - - expect(constructor.called).to.be.ok(); - expect(b.baz).to.eql(2); - - b.bar(); - - expect(method.called).to.be.ok(); - }); - - it("supports static properties", function () { - expect(Klass.bla).to.eql(1); - }); - - it("inherits parent static properties", function () { - var Klass2 = Klass.extend({}); - - expect(Klass2.bla).to.eql(1); - }); - - it("overrides parent static properties", function () { - var Klass2 = Klass.extend({statics: {bla: 2}}); - - expect(Klass2.bla).to.eql(2); - }); - - it("includes the given mixin", function () { - var a = new Klass(); - expect(a.mixin).to.be.ok(); - }); - - it("includes multiple mixins", function () { - var Klass2 = L.Class.extend({ - includes: [{mixin: true}, {mixin2: true}] - }); - var a = new Klass2(); - - expect(a.mixin).to.be.ok(); - expect(a.mixin2).to.be.ok(); - }); - - it("grants the ability to include the given mixin", function () { - Klass.include({mixin2: true}); - - var a = new Klass(); - expect(a.mixin2).to.be.ok(); - }); - - it("merges options instead of replacing them", function () { - var KlassWithOptions1 = L.Class.extend({ - options: { - foo1: 1, - foo2: 2 - } - }); - var KlassWithOptions2 = KlassWithOptions1.extend({ - options: { - foo2: 3, - foo3: 4 - } - }); - - var a = new KlassWithOptions2(); - - expect(a.options).to.eql({ - foo1: 1, - foo2: 3, - foo3: 4 - }); - }); - - it("adds constructor hooks correctly", function () { - var spy1 = sinon.spy(); - - Klass.addInitHook(spy1); - Klass.addInitHook('bar', 1, 2, 3); - - var a = new Klass(); - - expect(spy1.called).to.be.ok(); - expect(method.calledWith(1, 2, 3)); - }); - - it("inherits constructor hooks", function () { - var spy1 = sinon.spy(), - spy2 = sinon.spy(); - - var Klass2 = Klass.extend({}); - - Klass.addInitHook(spy1); - Klass2.addInitHook(spy2); - - var a = new Klass2(); - - expect(spy1.called).to.be.ok(); - expect(spy2.called).to.be.ok(); - }); - - it("does not call child constructor hooks", function () { - var spy1 = sinon.spy(), - spy2 = sinon.spy(); - - var Klass2 = Klass.extend({}); - - Klass.addInitHook(spy1); - Klass2.addInitHook(spy2); - - var a = new Klass(); - - expect(spy1.called).to.be.ok(); - expect(spy2.called).to.eql(false); - }); - }); - - // TODO Class.include - - // TODO Class.mergeOptions -}); diff --git a/spec/suites/core/EventsSpec.js b/spec/suites/core/EventsSpec.js deleted file mode 100644 index 69b130e0e0d..00000000000 --- a/spec/suites/core/EventsSpec.js +++ /dev/null @@ -1,392 +0,0 @@ -describe('Events', function () { - var Klass; - - beforeEach(function () { - Klass = L.Class.extend({ - includes: L.Mixin.Events - }); - }); - - describe('#fireEvent', function () { - - it('fires all listeners added through #addEventListener', function () { - var obj = new Klass(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(), - spy4 = sinon.spy(), - spy5 = sinon.spy(), - spy6 = sinon.spy(); - - obj.addEventListener('test', spy1); - obj.addEventListener('test', spy2); - obj.addEventListener('other', spy3); - obj.addEventListener({ test: spy4, other: spy5 }); - obj.addEventListener({'test other': spy6 }); - - expect(spy1.called).to.be(false); - expect(spy2.called).to.be(false); - expect(spy3.called).to.be(false); - expect(spy4.called).to.be(false); - expect(spy5.called).to.be(false); - expect(spy6.called).to.be(false); - - obj.fireEvent('test'); - - expect(spy1.called).to.be(true); - expect(spy2.called).to.be(true); - expect(spy3.called).to.be(false); - expect(spy4.called).to.be(true); - expect(spy5.called).to.be(false); - expect(spy6.called).to.be(true); - expect(spy6.callCount).to.be(1); - }); - - it('provides event object to listeners and executes them in the right context', function () { - var obj = new Klass(), - obj2 = new Klass(), - obj3 = new Klass(), - obj4 = new Klass(), - foo = {}; - - function listener1(e) { - expect(e.type).to.eql('test'); - expect(e.target).to.eql(obj); - expect(this).to.eql(obj); - expect(e.baz).to.eql(1); - } - - function listener2(e) { - expect(e.type).to.eql('test'); - expect(e.target).to.eql(obj2); - expect(this).to.eql(foo); - expect(e.baz).to.eql(2); - } - - function listener3(e) { - expect(e.type).to.eql('test'); - expect(e.target).to.eql(obj3); - expect(this).to.eql(obj3); - expect(e.baz).to.eql(3); - } - - function listener4(e) { - expect(e.type).to.eql('test'); - expect(e.target).to.eql(obj4); - expect(this).to.eql(foo); - expect(e.baz).to.eql(4); - } - - obj.addEventListener('test', listener1); - obj2.addEventListener('test', listener2, foo); - obj3.addEventListener({ test: listener3 }); - obj4.addEventListener({ test: listener4 }, foo); - - obj.fireEvent('test', {baz: 1}); - obj2.fireEvent('test', {baz: 2}); - obj3.fireEvent('test', {baz: 3}); - obj4.fireEvent('test', {baz: 4}); - }); - - it('calls no listeners removed through #removeEventListener', function () { - var obj = new Klass(), - spy = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(), - spy4 = sinon.spy(), - spy5 = sinon.spy(); - - obj.addEventListener('test', spy); - obj.removeEventListener('test', spy); - - obj.fireEvent('test'); - - expect(spy.called).to.be(false); - - obj.addEventListener('test2', spy2); - obj.addEventListener('test2', spy3); - obj.removeEventListener('test2'); - - obj.fireEvent('test2'); - - expect(spy2.called).to.be(false); - expect(spy3.called).to.be(false); - - obj.addEventListener('test3', spy4); - obj.addEventListener('test4', spy5); - obj.removeEventListener({ - test3: spy4, - test4: spy5 - }); - - obj.fireEvent('test3'); - obj.fireEvent('test4'); - - expect(spy4.called).to.be(false); - expect(spy5.called).to.be(false); - }); - - it('can handle calls to #removeEventListener on objects with no registered event listeners', function () { - var obj = new Klass(); - var removeNonExistentListener = function () { - obj.removeEventListener('test'); - }; - expect(removeNonExistentListener).to.not.throwException(); - }); - - // added due to context-sensitive removeListener optimization - it('fires multiple listeners with the same context with id', function () { - var obj = new Klass(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - foo = {}; - - L.Util.stamp(foo); - - obj.addEventListener('test', spy1, foo); - obj.addEventListener('test', spy2, foo); - - obj.fireEvent('test'); - - expect(spy1.called).to.be(true); - expect(spy2.called).to.be(true); - }); - - it('removes listeners with stamped contexts', function () { - var obj = new Klass(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - foo = {}; - - L.Util.stamp(foo); - - obj.addEventListener('test', spy1, foo); - obj.addEventListener('test', spy2, foo); - - obj.removeEventListener('test', spy1, foo); - - obj.fireEvent('test'); - - expect(spy1.called).to.be(false); - expect(spy2.called).to.be(true); - }); - - it('removes listeners with a stamp originally added without one', function () { - var obj = new Klass(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - foo = {}; - - obj.addEventListener('test', spy1, foo); - L.Util.stamp(foo); - obj.addEventListener('test', spy2, foo); - - obj.removeEventListener('test', spy1, foo); - obj.removeEventListener('test', spy2, foo); - - obj.fireEvent('test'); - - expect(spy1.called).to.be(false); - expect(spy2.called).to.be(false); - }); - - it('removes listeners with context == this and a stamp originally added without one', function () { - var obj = new Klass(), - obj2 = new Klass(), - spy1 = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(); - - obj.addEventListener('test', spy1, obj); - L.Util.stamp(obj); - obj.addEventListener('test', spy2, obj); - obj.addEventListener('test', spy3, obj2); // So that there is a contextId based listener, otherwise removeEventListener will do correct behaviour anyway - - obj.removeEventListener('test', spy1, obj); - obj.removeEventListener('test', spy2, obj); - obj.removeEventListener('test', spy3, obj2); - - obj.fireEvent('test'); - - expect(spy1.called).to.be(false); - expect(spy2.called).to.be(false); - expect(spy3.called).to.be(false); - }); - - it('doesnt lose track of listeners when removing non existent ones', function () { - var obj = new Klass(), - spy = sinon.spy(), - spy2 = sinon.spy(), - foo = {}, - foo2 = {}; - - L.Util.stamp(foo); - L.Util.stamp(foo2); - - obj.addEventListener('test', spy, foo2); - - obj.removeEventListener('test', spy, foo); // Decrements test_idx to 0, even though event listener isn't registered with foo's _leaflet_id - obj.removeEventListener('test', spy, foo2); // Doesn't get removed - - obj.addEventListener('test', spy2, foo); - - obj.fireEvent('test'); - - expect(spy.called).to.be(false); - }); - - it('correctly removes all listeners if given no fn', function () { - var obj = new Klass(), - spy = sinon.spy(), - foo = {}, - foo2 = {}, - foo3 = {}; - - obj.addEventListener('test', spy, foo2); - obj.addEventListener('test', spy, foo3); - - obj.removeEventListener('test'); // Removes both of the above listeners - - expect(obj.hasEventListeners('test')).to.be(false); - - //Add and remove a listener - obj.addEventListener('test', spy, foo2); - obj.removeEventListener('test', spy, foo2); - - expect(obj.hasEventListeners('test')).to.be(false); - }); - - it('makes sure an event is not triggered if a listener is removed during dispatch', function () { - var obj = new Klass(), - spy = sinon.spy(); - - obj.addEventListener('test', function () { obj.removeEventListener('test', spy); }); - obj.addEventListener('test', spy); - obj.fireEvent('test'); - - expect(spy.called).to.be(false); - }); - }); - - describe('#on, #off & #fire', function () { - - it('works like #addEventListener && #removeEventListener', function () { - var obj = new Klass(), - spy = sinon.spy(); - - obj.on('test', spy); - obj.fire('test'); - - expect(spy.called).to.be(true); - - obj.off('test', spy); - obj.fireEvent('test'); - - expect(spy.callCount).to.be.lessThan(2); - }); - - it('does not override existing methods with the same name', function () { - var spy1 = sinon.spy(), - spy2 = sinon.spy(), - spy3 = sinon.spy(); - - var Klass2 = L.Class.extend({ - includes: L.Mixin.Events, - on: spy1, - off: spy2, - fire: spy3 - }); - - var obj = new Klass2(); - - obj.on(); - expect(spy1.called).to.be(true); - - obj.off(); - expect(spy2.called).to.be(true); - - obj.fire(); - expect(spy3.called).to.be(true); - }); - }); - - describe("#clearEventListeners", function () { - it("clears all registered listeners on an object", function () { - var spy = sinon.spy(), - obj = new Klass(), - otherObj = new Klass(); - - obj.on('test', spy, obj); - obj.on('testTwo', spy); - obj.on('test', spy, otherObj); - obj.off(); - - obj.fire('test'); - - expect(spy.called).to.be(false); - }); - }); - - describe('#once', function () { - it('removes event listeners after first trigger', function () { - var obj = new Klass(), - spy = sinon.spy(); - - obj.once('test', spy, obj); - obj.fire('test'); - - expect(spy.called).to.be(true); - - obj.fire('test'); - - expect(spy.callCount).to.be.lessThan(2); - }); - - it('works with an object hash', function () { - var obj = new Klass(), - spy = sinon.spy(), - otherSpy = sinon.spy(); - - obj.once({ - 'test': spy, - otherTest: otherSpy - }, obj); - - obj.fire('test'); - obj.fire('otherTest'); - - expect(spy.called).to.be(true); - expect(otherSpy.called).to.be(true); - - obj.fire('test'); - obj.fire('otherTest'); - - expect(spy.callCount).to.be.lessThan(2); - expect(otherSpy.callCount).to.be.lessThan(2); - }); - - it("doesn't call listeners to events that have been removed", function () { - var obj = new Klass(), - spy = sinon.spy(); - - obj.once('test', spy, obj); - obj.off('test', spy, obj); - - obj.fire('test'); - - expect(spy.called).to.be(false); - }); - - it('works if called from a context that doesnt implement #Events', function () { - var obj = new Klass(), - spy = sinon.spy(), - foo = {}; - - obj.once('test', spy, foo); - - obj.fire('test'); - - expect(spy.called).to.be(true); - }); - }); -}); diff --git a/spec/suites/core/UtilSpec.js b/spec/suites/core/UtilSpec.js deleted file mode 100644 index 3e7d3ec027b..00000000000 --- a/spec/suites/core/UtilSpec.js +++ /dev/null @@ -1,223 +0,0 @@ -describe('Util', function () { - - describe('#extend', function () { - var a; - - beforeEach(function () { - a = { - foo: 5, - bar: 'asd' - }; - }); - - it('extends the first argument with the properties of the second', function () { - L.Util.extend(a, { - bar: 7, - baz: 3 - }); - - expect(a).to.eql({ - foo: 5, - bar: 7, - baz: 3 - }); - }); - - it('accepts more than 2 arguments', function () { - L.Util.extend(a, {bar: 7}, {baz: 3}); - - expect(a).to.eql({ - foo: 5, - bar: 7, - baz: 3 - }); - }); - }); - - describe('#bind', function () { - it('returns the given function with the given context', function () { - var fn = function () { - return this; - }; - - var fn2 = L.Util.bind(fn, { foo: 'bar' }); - - expect(fn2()).to.eql({ foo: 'bar' }); - }); - - it('passes additional arguments to the bound function', function () { - var fn = sinon.spy(), - foo = {}, - a = {}, - b = {}; - - var fn2 = L.Util.bind(fn, foo, a, b); - - fn2(); - - expect(fn.calledWith(a, b)).to.be.ok(); - }); - }); - - describe('#stamp', function () { - it('sets a unique id on the given object and returns it', function () { - var a = {}, - id = L.Util.stamp(a); - - expect(typeof id).to.eql('number'); - expect(L.Util.stamp(a)).to.eql(id); - - var b = {}, - id2 = L.Util.stamp(b); - - expect(id2).not.to.eql(id); - }); - }); - - describe('#invokeEach', function () { - it('calls the given method/context with each key/value and additional arguments', function () { - var spy = sinon.spy(), - ctx = {}; - - var result = L.Util.invokeEach({ - foo: 'bar', - yo: 'hey' - }, spy, ctx, 1, 2, 3); - - expect(spy.firstCall.calledWith('foo', 'bar', 1, 2, 3)).to.be.ok(); - expect(spy.secondCall.calledWith('yo', 'hey', 1, 2, 3)).to.be.ok(); - - expect(spy.firstCall.calledOn(ctx)).to.be.ok(); - expect(spy.secondCall.calledOn(ctx)).to.be.ok(); - - expect(result).to.be(true); - }); - - it('returns false if the given agument is not object', function () { - var spy = sinon.spy(); - - expect(L.Util.invokeEach('foo', spy)).to.be(false); - expect(spy.called).to.be(false); - }); - }); - - describe('#falseFn', function () { - it('returns false', function () { - expect(L.Util.falseFn()).to.be(false); - }); - }); - - describe('#formatNum', function () { - it('formats numbers with a given precision', function () { - expect(L.Util.formatNum(13.12325555, 3)).to.eql(13.123); - expect(L.Util.formatNum(13.12325555)).to.eql(13.12326); - }); - }); - - - describe('#getParamString', function () { - it('creates a valid query string for appending depending on url input', function () { - var a = { - url: 'http://example.com/get', - obj: {bar: 7, baz: 3}, - result: '?bar=7&baz=3' - }; - - expect(L.Util.getParamString(a.obj, a.url)).to.eql(a.result); - - var b = { - url: 'http://example.com/get?justone=qs', - obj: {bar: 7, baz: 3}, - result: '&bar=7&baz=3' - }; - - expect(L.Util.getParamString(b.obj, b.url)).to.eql(b.result); - - var c = { - url: undefined, - obj: {bar: 7, baz: 3}, - result: '?bar=7&baz=3' - }; - - expect(L.Util.getParamString(c.obj, c.url)).to.eql(c.result); - }); - }); - - describe('#requestAnimFrame', function () { - it('calles a function on next frame, unless canceled', function (done) { - var spy = sinon.spy(), - foo = {}; - - L.Util.requestAnimFrame(spy); - - L.Util.requestAnimFrame(function () { - expect(this).to.eql(foo); - done(); - }, foo); - - L.Util.cancelAnimFrame(spy); - }); - }); - - describe('#limitExecByInterval', function () { - it('limits execution to not more often than specified time interval', function (done) { - var spy = sinon.spy(); - - var fn = L.Util.limitExecByInterval(spy, 20); - - fn(); - fn(); - fn(); - - expect(spy.callCount).to.eql(1); - - setTimeout(function () { - expect(spy.callCount).to.eql(2); - done(); - }, 30); - }); - }); - - describe('#splitWords', function () { - it('splits words into an array', function () { - expect(L.Util.splitWords('foo bar baz')).to.eql(['foo', 'bar', 'baz']); - }); - }); - - // TODO setOptions - - describe('#template', function () { - it('evaluates templates with a given data object', function () { - var tpl = 'Hello {foo} and {bar}!'; - - var str = L.Util.template(tpl, { - foo: 'Vlad', - bar: 'Dave' - }); - - expect(str).to.eql('Hello Vlad and Dave!'); - }); - it('does not modify text without a token variable', function () { - expect(L.Util.template('foo', {})).to.eql('foo'); - }); - - it('supports templates with double quotes', function () { - expect(L.Util.template('He said: "{foo}"!', { - foo: 'Hello' - })).to.eql('He said: "Hello"!'); - }); - - it('throws when a template token is not given', function () { - expect(function () { - L.Util.template(undefined, {foo: 'bar'}); - }).to.throwError(); - }); - }); - - describe('#isArray', function () { - expect(L.Util.isArray([1, 2, 3])).to.be(true); - expect(L.Util.isArray(new Array(1, 2, 3))).to.be(true); - expect(L.Util.isArray('blabla')).to.be(false); - expect(L.Util.isArray({0: 1, 1: 2})).to.be(false); - }); -}); diff --git a/spec/suites/dom/DomEventSpec.js b/spec/suites/dom/DomEventSpec.js deleted file mode 100644 index 97d586fe861..00000000000 --- a/spec/suites/dom/DomEventSpec.js +++ /dev/null @@ -1,102 +0,0 @@ -describe('DomEvent', function () { - var el; - - function simulateClick(el) { - if (document.createEvent) { - var e = document.createEvent('MouseEvents'); - e.initMouseEvent('click', true, true, window, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); - return el.dispatchEvent(e); - } else if (el.fireEvent) { - return el.fireEvent('onclick'); - } - } - - beforeEach(function () { - el = document.createElement('div'); - el.style.position = 'absolute'; - el.style.top = el.style.left = '-10000px'; - document.body.appendChild(el); - }); - - afterEach(function () { - document.body.removeChild(el); - }); - - describe('#addListener', function () { - it('adds a listener and calls it on event', function () { - var listener1 = sinon.spy(), - listener2 = sinon.spy(); - - L.DomEvent.addListener(el, 'click', listener1); - L.DomEvent.addListener(el, 'click', listener2); - - simulateClick(el); - - expect(listener1.called).to.be.ok(); - expect(listener2.called).to.be.ok(); - }); - - it('binds "this" to the given context', function () { - var obj = {foo: 'bar'}, - result; - - L.DomEvent.addListener(el, 'click', function () { - result = this; - }, obj); - - simulateClick(el); - - expect(result).to.eql(obj); - }); - - it('passes an event object to the listener', function () { - var type; - - L.DomEvent.addListener(el, 'click', function (e) { - type = e && e.type; - }); - simulateClick(el); - - expect(type).to.eql('click'); - }); - }); - - describe('#removeListener', function () { - it('removes a previously added listener', function () { - var listener = sinon.spy(); - - L.DomEvent.addListener(el, 'click', listener); - L.DomEvent.removeListener(el, 'click', listener); - - simulateClick(el); - - expect(listener.called).to.not.be.ok(); - }); - }); - - describe('#stopPropagation', function () { - it('stops propagation of the given event', function () { - var child = document.createElement('div'), - listener = sinon.spy(); - - el.appendChild(child); - - L.DomEvent.addListener(child, 'click', L.DomEvent.stopPropagation); - L.DomEvent.addListener(el, 'click', listener); - - simulateClick(child); - - expect(listener.called).to.not.be.ok(); - - el.removeChild(child); - }); - }); - describe('#preventDefault', function () { - it('prevents the default action of event', function () { - L.DomEvent.addListener(el, 'click', L.DomEvent.preventDefault); - - expect(simulateClick(el)).to.be(false); - }); - }); -}); diff --git a/spec/suites/dom/DomUtilSpec.js b/spec/suites/dom/DomUtilSpec.js deleted file mode 100644 index c6ffc825368..00000000000 --- a/spec/suites/dom/DomUtilSpec.js +++ /dev/null @@ -1,82 +0,0 @@ -describe('DomUtil', function () { - var el; - - beforeEach(function () { - el = document.createElement('div'); - el.style.position = 'absolute'; - el.style.top = el.style.left = '-10000px'; - document.body.appendChild(el); - }); - - afterEach(function () { - document.body.removeChild(el); - }); - - describe('#get', function () { - it('gets element by id if the given argument is string', function () { - el.id = 'testId'; - expect(L.DomUtil.get(el.id)).to.eql(el); - }); - - it('returns the element if it is given as an argument', function () { - expect(L.DomUtil.get(el)).to.eql(el); - }); - }); - - describe('#addClass, #removeClass, #hasClass', function () { - it('has defined class for test element', function () { - el.className = 'bar foo baz '; - expect(L.DomUtil.hasClass(el, 'foo')).to.be.ok(); - expect(L.DomUtil.hasClass(el, 'bar')).to.be.ok(); - expect(L.DomUtil.hasClass(el, 'baz')).to.be.ok(); - expect(L.DomUtil.hasClass(el, 'boo')).to.not.be.ok(); - }); - - it('adds or removes the class', function () { - el.className = ''; - L.DomUtil.addClass(el, 'foo'); - - expect(el.className).to.eql('foo'); - expect(L.DomUtil.hasClass(el, 'foo')).to.be.ok(); - - L.DomUtil.addClass(el, 'bar'); - expect(el.className).to.eql('foo bar'); - expect(L.DomUtil.hasClass(el, 'foo')).to.be.ok(); - - L.DomUtil.removeClass(el, 'foo'); - expect(el.className).to.eql('bar'); - expect(L.DomUtil.hasClass(el, 'foo')).to.not.be.ok(); - - el.className = 'foo bar barz'; - L.DomUtil.removeClass(el, 'bar'); - expect(el.className).to.eql('foo barz'); - }); - }); - - describe('#getViewportOffset', function () { - it('calculates the viewport offset of an element', function () { - var div = document.createElement('div'); - div.style.position = 'absolute'; - div.style.top = '100px'; - div.style.left = '200px'; - div.style.border = '10px solid black'; - div.style.padding = '50px'; - div.style.visibility = 'hidden'; - - var div2 = document.createElement('div'); - div.style.marginTop = '100px'; - - div.appendChild(div2); - - document.body.appendChild(div); - - expect(L.DomUtil.getViewportOffset(div2)).to.eql(new L.Point(260, 260)); - - document.body.removeChild(div); - }); - }); - - // describe('#setPosition', noSpecs); - - // describe('#getStyle', noSpecs); -}); diff --git a/spec/suites/dom/PosAnimationSpec.js b/spec/suites/dom/PosAnimationSpec.js deleted file mode 100644 index 9b4ebfeba48..00000000000 --- a/spec/suites/dom/PosAnimationSpec.js +++ /dev/null @@ -1,27 +0,0 @@ -describe('PosAnimation', function () { - var el; - - beforeEach(function () { - el = document.createElement('div'); - this.subject = new L.PosAnimation(); - this.subject._el = el; - }); - - describe('#_onStep', function () { - it("sets element position and fires step event if it is able to get current position", function () { - var point = new L.Point(5, 5, true); - sinon.stub(this.subject, '_getPos').returns(point); - this.subject.fire = sinon.stub(); - this.subject._onStep(); - expect(this.subject.fire.withArgs('step').calledOnce).to.be(true); - expect(L.DomUtil.getPosition(this.subject._el)).to.be(point); - }); - - it('stops transition if a position returned', function () { - sinon.stub(this.subject, '_onTransitionEnd'); - sinon.stub(this.subject, '_getPos').returns(undefined); - this.subject._onStep(); - expect(this.subject._onTransitionEnd.calledOnce).to.be(true); - }); - }); -}); diff --git a/spec/suites/geo/CRSSpec.js b/spec/suites/geo/CRSSpec.js deleted file mode 100644 index 5a7aee3c2c1..00000000000 --- a/spec/suites/geo/CRSSpec.js +++ /dev/null @@ -1,47 +0,0 @@ -describe("CRS.EPSG3395", function () { - var crs = L.CRS.EPSG3395; - - describe("#latLngToPoint", function () { - it("projects a center point", function () { - expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near(new L.Point(128, 128), 0.01); - }); - - it("projects the northeast corner of the world", function () { - expect(crs.latLngToPoint(L.latLng(85.0840591556, 180), 0)).near(new L.Point(256, 0)); - }); - }); - - describe("#pointToLatLng", function () { - it("reprojects a center point", function () { - expect(crs.pointToLatLng(new L.Point(128, 128), 0)).nearLatLng(L.latLng(0, 0), 0.01); - }); - - it("reprojects the northeast corner of the world", function () { - expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng(L.latLng(85.0840591556, 180)); - }); - }); -}); - -describe("CRS.EPSG3857", function () { - var crs = L.CRS.EPSG3857; - - describe("#latLngToPoint", function () { - it("projects a center point", function () { - expect(crs.latLngToPoint(L.latLng(0, 0), 0)).near(new L.Point(128, 128), 0.01); - }); - - it("projects the northeast corner of the world", function () { - expect(crs.latLngToPoint(L.latLng(85.0511287798, 180), 0)).near(new L.Point(256, 0)); - }); - }); - - describe("#pointToLatLng", function () { - it("reprojects a center point", function () { - expect(crs.pointToLatLng(new L.Point(128, 128), 0)).nearLatLng(L.latLng(0, 0), 0.01); - }); - - it("reprojects the northeast corner of the world", function () { - expect(crs.pointToLatLng(new L.Point(256, 0), 0)).nearLatLng(L.latLng(85.0511287798, 180)); - }); - }); -}); diff --git a/spec/suites/geo/LatLngBoundsSpec.js b/spec/suites/geo/LatLngBoundsSpec.js deleted file mode 100644 index ef01699dc3c..00000000000 --- a/spec/suites/geo/LatLngBoundsSpec.js +++ /dev/null @@ -1,144 +0,0 @@ -describe('LatLngBounds', function () { - var a, c; - - beforeEach(function () { - a = new L.LatLngBounds( - new L.LatLng(14, 12), - new L.LatLng(30, 40)); - c = new L.LatLngBounds(); - }); - - describe('constructor', function () { - it('instantiates either passing two latlngs or an array of latlngs', function () { - var b = new L.LatLngBounds([ - new L.LatLng(14, 12), - new L.LatLng(30, 40) - ]); - expect(b).to.eql(a); - expect(b.getNorthWest()).to.eql(new L.LatLng(30, 12)); - }); - }); - - describe('#extend', function () { - it('extends the bounds by a given point', function () { - a.extend(new L.LatLng(20, 50)); - expect(a.getNorthEast()).to.eql(new L.LatLng(30, 50)); - }); - - it('extends the bounds by given bounds', function () { - a.extend([[20, 50], [8, 40]]); - expect(a.getSouthEast()).to.eql(new L.LatLng(8, 50)); - }); - - it('extends the bounds by undefined', function () { - expect(a.extend()).to.eql(a); - }); - - it('extends the bounds by raw object', function () { - a.extend({lat: 20, lng: 50}); - expect(a.getNorthEast()).to.eql(new L.LatLng(30, 50)); - }); - }); - - describe('#getCenter', function () { - it('returns the bounds center', function () { - expect(a.getCenter()).to.eql(new L.LatLng(22, 26)); - }); - }); - - describe('#pad', function () { - it('pads the bounds by a given ratio', function () { - var b = a.pad(0.5); - - expect(b).to.eql(L.latLngBounds([[6, -2], [38, 54]])); - }); - }); - - describe('#equals', function () { - it('returns true if bounds equal', function () { - expect(a.equals([[14, 12], [30, 40]])).to.eql(true); - expect(a.equals([[14, 13], [30, 40]])).to.eql(false); - expect(a.equals(null)).to.eql(false); - }); - }); - - describe('#isValid', function () { - it('returns true if properly set up', function () { - expect(a.isValid()).to.be.ok(); - }); - it('returns false if is invalid', function () { - expect(c.isValid()).to.not.be.ok(); - }); - it('returns true if extended', function () { - c.extend([0, 0]); - expect(c.isValid()).to.be.ok(); - }); - }); - - describe('#getWest', function () { - it('returns a proper bbox west value', function () { - expect(a.getWest()).to.eql(12); - }); - }); - - describe('#getSouth', function () { - it('returns a proper bbox south value', function () { - expect(a.getSouth()).to.eql(14); - }); - - }); - - describe('#getEast', function () { - it('returns a proper bbox east value', function () { - expect(a.getEast()).to.eql(40); - }); - - }); - - describe('#getNorth', function () { - it('returns a proper bbox north value', function () { - expect(a.getNorth()).to.eql(30); - }); - - }); - - describe('#toBBoxString', function () { - it('returns a proper left,bottom,right,top bbox', function () { - expect(a.toBBoxString()).to.eql("12,14,40,30"); - }); - - }); - - describe('#getNorthWest', function () { - it('returns a proper north-west LatLng', function () { - expect(a.getNorthWest()).to.eql(new L.LatLng(a.getNorth(), a.getWest())); - }); - - }); - - describe('#getSouthEast', function () { - it('returns a proper south-east LatLng', function () { - expect(a.getSouthEast()).to.eql(new L.LatLng(a.getSouth(), a.getEast())); - }); - }); - - describe('#contains', function () { - it('returns true if contains latlng point', function () { - expect(a.contains([16, 20])).to.eql(true); - expect(L.latLngBounds(a).contains([5, 20])).to.eql(false); - }); - - it('returns true if contains bounds', function () { - expect(a.contains([[16, 20], [20, 40]])).to.eql(true); - expect(a.contains([[16, 50], [8, 40]])).to.eql(false); - }); - }); - - describe('#intersects', function () { - it('returns true if intersects the given bounds', function () { - expect(a.intersects([[16, 20], [50, 60]])).to.eql(true); - expect(a.contains([[40, 50], [50, 60]])).to.eql(false); - }); - }); - -}); diff --git a/spec/suites/geo/LatLngSpec.js b/spec/suites/geo/LatLngSpec.js deleted file mode 100644 index bc7c1a80567..00000000000 --- a/spec/suites/geo/LatLngSpec.js +++ /dev/null @@ -1,132 +0,0 @@ -describe('LatLng', function () { - describe('constructor', function () { - it("sets lat and lng", function () { - var a = new L.LatLng(25, 74); - expect(a.lat).to.eql(25); - expect(a.lng).to.eql(74); - - var b = new L.LatLng(-25, -74); - expect(b.lat).to.eql(-25); - expect(b.lng).to.eql(-74); - }); - - it('throws an error if invalid lat or lng', function () { - expect(function () { - var a = new L.LatLng(NaN, NaN); - }).to.throwError(); - }); - - it('does not set altitude if undefined', function () { - var a = new L.LatLng(25, 74); - expect(typeof a.alt).to.eql('undefined'); - }); - - it('sets altitude', function () { - var a = new L.LatLng(25, 74, 50); - expect(a.alt).to.eql(50); - - var b = new L.LatLng(-25, -74, -50); - expect(b.alt).to.eql(-50); - }); - - }); - - describe('#equals', function () { - it("returns true if compared objects are equal within a certain margin", function () { - var a = new L.LatLng(10, 20); - var b = new L.LatLng(10 + 1.0E-10, 20 - 1.0E-10); - expect(a.equals(b)).to.eql(true); - }); - - it("returns false if compared objects are not equal within a certain margin", function () { - var a = new L.LatLng(10, 20); - var b = new L.LatLng(10, 23.3); - expect(a.equals(b)).to.eql(false); - }); - - it('returns false if passed non-valid object', function () { - var a = new L.LatLng(10, 20); - expect(a.equals(null)).to.eql(false); - }); - }); - - describe('#wrap', function () { - it("wraps longitude to lie between -180 and 180 by default", function () { - var a = new L.LatLng(0, 190).wrap().lng; - expect(a).to.eql(-170); - - var b = new L.LatLng(0, 360).wrap().lng; - expect(b).to.eql(0); - - var c = new L.LatLng(0, 380).wrap().lng; - expect(c).to.eql(20); - - var d = new L.LatLng(0, -190).wrap().lng; - expect(d).to.eql(170); - - var e = new L.LatLng(0, -360).wrap().lng; - expect(e).to.eql(0); - - var f = new L.LatLng(0, -380).wrap().lng; - expect(f).to.eql(-20); - - var g = new L.LatLng(0, 90).wrap().lng; - expect(g).to.eql(90); - - var h = new L.LatLng(0, 180).wrap().lng; - expect(h).to.eql(180); - }); - - it("wraps longitude within the given range", function () { - var a = new L.LatLng(0, 190).wrap(-100, 100).lng; - expect(a).to.eql(-10); - }); - - }); - - describe('#toString', function () { - it('formats a string', function () { - var a = new L.LatLng(10.333333333, 20.2222222); - expect(a.toString(3)).to.eql('LatLng(10.333, 20.222)'); - }); - }); - - describe('#distanceTo', function () { - it('calculates distance in meters', function () { - var a = new L.LatLng(50.5, 30.5); - var b = new L.LatLng(50, 1); - - expect(Math.abs(Math.round(a.distanceTo(b) / 1000) - 2084) < 5).to.eql(true); - }); - }); - - describe('L.latLng factory', function () { - it('returns LatLng instance as is', function () { - var a = new L.LatLng(50, 30); - - expect(L.latLng(a)).to.eql(a); - }); - - it('accepts an array of coordinates', function () { - expect(L.latLng([50, 30])).to.eql(new L.LatLng(50, 30)); - }); - - it('passes null or undefined as is', function () { - expect(L.latLng(undefined)).to.eql(undefined); - expect(L.latLng(null)).to.eql(null); - }); - - it('creates a LatLng object from two coordinates', function () { - expect(L.latLng(50, 30)).to.eql(new L.LatLng(50, 30)); - }); - - it('accepts an object with lat/lng', function () { - expect(L.latLng({lat: 50, lng: 30})).to.eql(new L.LatLng(50, 30)); - }); - - it('accepts an object with lat/lon', function () { - expect(L.latLng({lat: 50, lon: 30})).to.eql(new L.LatLng(50, 30)); - }); - }); -}); - diff --git a/spec/suites/geo/ProjectionSpec.js b/spec/suites/geo/ProjectionSpec.js deleted file mode 100644 index 41c469d701f..00000000000 --- a/spec/suites/geo/ProjectionSpec.js +++ /dev/null @@ -1,48 +0,0 @@ -describe("Projection.Mercator", function () { - var p = L.Projection.Mercator; - - describe("#project", function () { - it("projects a center point", function () { - //edge cases - expect(p.project(new L.LatLng(0, 0))).near(new L.Point(0, 0)); - }); - - it("projects the northeast corner of the world", function () { - expect(p.project(new L.LatLng(90, 180))).near(new L.Point(20037508, 20037508)); - }); - - it("projects the southwest corner of the world", function () { - expect(p.project(new L.LatLng(-90, -180))).near(new L.Point(-20037508, -20037508)); - }); - - it("projects other points", function () { - expect(p.project(new L.LatLng(50, 30))).near(new L.Point(3339584, 6413524)); - - // from https://github.com/Leaflet/Leaflet/issues/1578 - expect(p.project(new L.LatLng(51.9371170300465, 80.11230468750001))) - .near(new L.Point(8918060.964088084, 6755099.410887127)); - }); - }); - - describe("#unproject", function () { - function pr(point) { - return p.project(p.unproject(point)); - } - - it("unprojects a center point", function () { - expect(pr(new L.Point(0, 0))).near(new L.Point(0, 0)); - }); - - it("unprojects pi points", function () { - expect(pr(new L.Point(-Math.PI, Math.PI))).near(new L.Point(-Math.PI, Math.PI)); - expect(pr(new L.Point(-Math.PI, -Math.PI))).near(new L.Point(-Math.PI, -Math.PI)); - - expect(pr(new L.Point(0.523598775598, 1.010683188683))).near(new L.Point(0.523598775598, 1.010683188683)); - }); - - it('unprojects other points', function () { - // from https://github.com/Leaflet/Leaflet/issues/1578 - expect(pr(new L.Point(8918060.964088084, 6755099.410887127))); - }); - }); -}); diff --git a/spec/suites/geometry/BoundsSpec.js b/spec/suites/geometry/BoundsSpec.js deleted file mode 100644 index 7a048f3c8a5..00000000000 --- a/spec/suites/geometry/BoundsSpec.js +++ /dev/null @@ -1,87 +0,0 @@ -describe('Bounds', function () { - var a, b, c; - - beforeEach(function () { - a = new L.Bounds( - new L.Point(14, 12), - new L.Point(30, 40)); - b = new L.Bounds([ - new L.Point(20, 12), - new L.Point(14, 20), - new L.Point(30, 40) - ]); - c = new L.Bounds(); - }); - - describe('constructor', function () { - it('creates bounds with proper min & max on (Point, Point)', function () { - expect(a.min).to.eql(new L.Point(14, 12)); - expect(a.max).to.eql(new L.Point(30, 40)); - }); - it('creates bounds with proper min & max on (Point[])', function () { - expect(b.min).to.eql(new L.Point(14, 12)); - expect(b.max).to.eql(new L.Point(30, 40)); - }); - }); - - describe('#extend', function () { - it('extends the bounds to contain the given point', function () { - a.extend(new L.Point(50, 20)); - expect(a.min).to.eql(new L.Point(14, 12)); - expect(a.max).to.eql(new L.Point(50, 40)); - - b.extend(new L.Point(25, 50)); - expect(b.min).to.eql(new L.Point(14, 12)); - expect(b.max).to.eql(new L.Point(30, 50)); - }); - }); - - describe('#getCenter', function () { - it('returns the center point', function () { - expect(a.getCenter()).to.eql(new L.Point(22, 26)); - }); - }); - - describe('#contains', function () { - it('contains other bounds or point', function () { - a.extend(new L.Point(50, 10)); - expect(a.contains(b)).to.be.ok(); - expect(b.contains(a)).to.not.be.ok(); - expect(a.contains(new L.Point(24, 25))).to.be.ok(); - expect(a.contains(new L.Point(54, 65))).to.not.be.ok(); - }); - }); - - describe('#isValid', function () { - it('returns true if properly set up', function () { - expect(a.isValid()).to.be.ok(); - }); - it('returns false if is invalid', function () { - expect(c.isValid()).to.not.be.ok(); - }); - it('returns true if extended', function () { - c.extend([0, 0]); - expect(c.isValid()).to.be.ok(); - }); - }); - - describe('#getSize', function () { - it('returns the size of the bounds as point', function () { - expect(a.getSize()).to.eql(new L.Point(16, 28)); - }); - }); - - describe('#intersects', function () { - it('returns true if bounds intersect', function () { - expect(a.intersects(b)).to.be(true); - expect(a.intersects(new L.Bounds(new L.Point(100, 100), new L.Point(120, 120)))).to.eql(false); - }); - }); - - describe('L.bounds factory', function () { - it('creates bounds from array of number arrays', function () { - var bounds = L.bounds([[14, 12], [30, 40]]); - expect(bounds).to.eql(a); - }); - }); -}); diff --git a/spec/suites/geometry/LineUtilSpec.js b/spec/suites/geometry/LineUtilSpec.js deleted file mode 100644 index b7251a0f8e0..00000000000 --- a/spec/suites/geometry/LineUtilSpec.js +++ /dev/null @@ -1,75 +0,0 @@ -describe('LineUtil', function () { - - describe('#clipSegment', function () { - - var bounds; - - beforeEach(function () { - bounds = L.bounds([5, 0], [15, 10]); - }); - - it('clips a segment by bounds', function () { - var a = new L.Point(0, 0); - var b = new L.Point(15, 15); - - var segment = L.LineUtil.clipSegment(a, b, bounds); - - expect(segment[0]).to.eql(new L.Point(5, 5)); - expect(segment[1]).to.eql(new L.Point(10, 10)); - - var c = new L.Point(5, -5); - var d = new L.Point(20, 10); - - var segment2 = L.LineUtil.clipSegment(c, d, bounds); - - expect(segment2[0]).to.eql(new L.Point(10, 0)); - expect(segment2[1]).to.eql(new L.Point(15, 5)); - }); - - it('uses last bit code and reject segments out of bounds', function () { - var a = new L.Point(15, 15); - var b = new L.Point(25, 20); - var segment = L.LineUtil.clipSegment(a, b, bounds, true); - - expect(segment).to.be(false); - }); - }); - - describe('#pointToSegmentDistance & #closestPointOnSegment', function () { - - var p1 = new L.Point(0, 10); - var p2 = new L.Point(10, 0); - var p = new L.Point(0, 0); - - it('calculates distance from point to segment', function () { - expect(L.LineUtil.pointToSegmentDistance(p, p1, p2)).to.eql(Math.sqrt(200) / 2); - }); - - it('calculates point closest to segment', function () { - expect(L.LineUtil.closestPointOnSegment(p, p1, p2)).to.eql(new L.Point(5, 5)); - }); - }); - - describe('#simplify', function () { - it('simplifies polylines according to tolerance', function () { - var points = [ - new L.Point(0, 0), - new L.Point(0.01, 0), - new L.Point(0.5, 0.01), - new L.Point(0.7, 0), - new L.Point(1, 0), - new L.Point(1.999, 0.999), - new L.Point(2, 1) - ]; - - var simplified = L.LineUtil.simplify(points, 0.1); - - expect(simplified).to.eql([ - new L.Point(0, 0), - new L.Point(1, 0), - new L.Point(2, 1) - ]); - }); - }); - -}); diff --git a/spec/suites/geometry/PointSpec.js b/spec/suites/geometry/PointSpec.js deleted file mode 100644 index f11180b1648..00000000000 --- a/spec/suites/geometry/PointSpec.js +++ /dev/null @@ -1,104 +0,0 @@ -describe("Point", function () { - - describe('constructor', function () { - - it("creates a point with the given x and y", function () { - var p = new L.Point(1.5, 2.5); - expect(p.x).to.eql(1.5); - expect(p.y).to.eql(2.5); - }); - - it("rounds the given x and y if the third argument is true", function () { - var p = new L.Point(1.3, 2.7, true); - expect(p.x).to.eql(1); - expect(p.y).to.eql(3); - }); - }); - - describe('#subtract', function () { - it('subtracts the given point from this one', function () { - var a = new L.Point(50, 30), - b = new L.Point(20, 10); - expect(a.subtract(b)).to.eql(new L.Point(30, 20)); - }); - }); - - describe('#add', function () { - it('adds given point to this one', function () { - expect(new L.Point(50, 30).add(new L.Point(20, 10))).to.eql(new L.Point(70, 40)); - }); - }); - - describe('#divideBy', function () { - it('divides this point by the given amount', function () { - expect(new L.Point(50, 30).divideBy(5)).to.eql(new L.Point(10, 6)); - }); - }); - - describe('#multiplyBy', function () { - it('multiplies this point by the given amount', function () { - expect(new L.Point(50, 30).multiplyBy(2)).to.eql(new L.Point(100, 60)); - }); - }); - - describe('#floor', function () { - it('returns a new point with floored coordinates', function () { - expect(new L.Point(50.56, 30.123).floor()).to.eql(new L.Point(50, 30)); - }); - }); - - describe('#distanceTo', function () { - it('calculates distance between two points', function () { - var p1 = new L.Point(0, 30); - var p2 = new L.Point(40, 0); - expect(p1.distanceTo(p2)).to.eql(50.0); - }); - }); - - describe('#equals', function () { - it('returns true if points are equal', function () { - var p1 = new L.Point(20.4, 50.12); - var p2 = new L.Point(20.4, 50.12); - var p3 = new L.Point(20.5, 50.13); - - expect(p1.equals(p2)).to.be(true); - expect(p1.equals(p3)).to.be(false); - }); - }); - - describe('#contains', function () { - it('returns true if the point is bigger in absolute dimensions than the passed one', function () { - var p1 = new L.Point(50, 30), - p2 = new L.Point(-40, 20), - p3 = new L.Point(60, -20), - p4 = new L.Point(-40, -40); - - expect(p1.contains(p2)).to.be(true); - expect(p1.contains(p3)).to.be(false); - expect(p1.contains(p4)).to.be(false); - }); - }); - - describe('#toString', function () { - it('formats a string out of point coordinates', function () { - expect(new L.Point(50, 30) + '').to.eql('Point(50, 30)'); - }); - }); - - describe('L.point factory', function () { - it('leaves L.Point instances as is', function () { - var p = new L.Point(50, 30); - expect(L.point(p)).to.be(p); - }); - it('creates a point out of three arguments', function () { - expect(L.point(50.1, 30.1, true)).to.eql(new L.Point(50, 30)); - }); - it('creates a point from an array of coordinates', function () { - expect(L.point([50, 30])).to.eql(new L.Point(50, 30)); - }); - it('does not fail on invalid arguments', function () { - expect(L.point(undefined)).to.be(undefined); - expect(L.point(null)).to.be(null); - }); - }); -}); diff --git a/spec/suites/geometry/PolyUtilSpec.js b/spec/suites/geometry/PolyUtilSpec.js deleted file mode 100644 index a6d0aeff197..00000000000 --- a/spec/suites/geometry/PolyUtilSpec.js +++ /dev/null @@ -1,27 +0,0 @@ -describe('PolyUtil', function () { - - describe('#clipPolygon', function () { - it('clips polygon by bounds', function () { - var bounds = L.bounds([0, 0], [10, 10]); - - var points = [ - new L.Point(5, 5), - new L.Point(15, 10), - new L.Point(10, 15) - ]; - - var clipped = L.PolyUtil.clipPolygon(points, bounds); - - for (var i = 0, len = clipped.length; i < len; i++) { - delete clipped[i]._code; - } - - expect(clipped).to.eql([ - new L.Point(7.5, 10), - new L.Point(5, 5), - new L.Point(10, 7.5), - new L.Point(10, 10) - ]); - }); - }); -}); diff --git a/spec/suites/geometry/TransformationSpec.js b/spec/suites/geometry/TransformationSpec.js deleted file mode 100644 index c244459a899..00000000000 --- a/spec/suites/geometry/TransformationSpec.js +++ /dev/null @@ -1,31 +0,0 @@ -describe("Transformation", function () { - var t, p; - - beforeEach(function () { - t = new L.Transformation(1, 2, 3, 4); - p = new L.Point(10, 20); - }); - - describe('#transform', function () { - it("performs a transformation", function () { - var p2 = t.transform(p, 2); - expect(p2).to.eql(new L.Point(24, 128)); - }); - it('assumes a scale of 1 if not specified', function () { - var p2 = t.transform(p); - expect(p2).to.eql(new L.Point(12, 64)); - }); - }); - - describe('#untransform', function () { - it("performs a reverse transformation", function () { - var p2 = t.transform(p, 2); - var p3 = t.untransform(p2, 2); - expect(p3).to.eql(p); - }); - it('assumes a scale of 1 if not specified', function () { - var p2 = t.transform(p); - expect(t.untransform(new L.Point(12, 64))).to.eql(new L.Point(10, 20)); - }); - }); -}); diff --git a/spec/suites/layer/FeatureGroupSpec.js b/spec/suites/layer/FeatureGroupSpec.js deleted file mode 100644 index b6a735d838b..00000000000 --- a/spec/suites/layer/FeatureGroupSpec.js +++ /dev/null @@ -1,86 +0,0 @@ -describe('FeatureGroup', function () { - var map; - beforeEach(function () { - map = L.map(document.createElement('div')); - map.setView([0, 0], 1); - }); - describe("#_propagateEvent", function () { - var marker; - beforeEach(function () { - marker = L.marker([0, 0]); - }); - describe("when a Marker is added to multiple FeatureGroups ", function () { - it("e.layer should be the Marker", function () { - var fg1 = L.featureGroup(), - fg2 = L.featureGroup(); - - fg1.addLayer(marker); - fg2.addLayer(marker); - - var wasClicked1, - wasClicked2; - - fg2.on('click', function (e) { - expect(e.layer).to.be(marker); - expect(e.target).to.be(fg2); - wasClicked2 = true; - }); - - fg1.on('click', function (e) { - expect(e.layer).to.be(marker); - expect(e.target).to.be(fg1); - wasClicked1 = true; - }); - - marker.fire('click', { type: 'click' }); - - expect(wasClicked1).to.be(true); - expect(wasClicked2).to.be(true); - }); - }); - }); - describe('addLayer', function () { - it('adds the layer', function () { - var fg = L.featureGroup(), - marker = L.marker([0, 0]); - - expect(fg.hasLayer(marker)).to.be(false); - - fg.addLayer(marker); - - expect(fg.hasLayer(marker)).to.be(true); - }); - it('supports non-evented layers', function () { - var fg = L.featureGroup(), - g = L.layerGroup(); - - expect(fg.hasLayer(g)).to.be(false); - - fg.addLayer(g); - - expect(fg.hasLayer(g)).to.be(true); - }); - }); - describe('removeLayer', function () { - it('removes the layer passed to it', function () { - var fg = L.featureGroup(), - marker = L.marker([0, 0]); - - fg.addLayer(marker); - expect(fg.hasLayer(marker)).to.be(true); - - fg.removeLayer(marker); - expect(fg.hasLayer(marker)).to.be(false); - }); - it('removes the layer passed to it by id', function () { - var fg = L.featureGroup(), - marker = L.marker([0, 0]); - - fg.addLayer(marker); - expect(fg.hasLayer(marker)).to.be(true); - - fg.removeLayer(L.stamp(marker)); - expect(fg.hasLayer(marker)).to.be(false); - }); - }); -}); diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js deleted file mode 100644 index 0f326dd8889..00000000000 --- a/spec/suites/layer/GeoJSONSpec.js +++ /dev/null @@ -1,282 +0,0 @@ -describe("L.GeoJSON", function () { - describe("addData", function () { - var geoJSON = { - type: 'Feature', - properties: {}, - geometry: { - type: 'Point', - coordinates: [20, 10, 5] - } - }; - - it("sets feature property on member layers", function () { - var layer = new L.GeoJSON(); - layer.addData(geoJSON); - expect(layer.getLayers()[0].feature).to.eql(geoJSON); - }); - - it("normalizes a geometry to a Feature", function () { - var layer = new L.GeoJSON(); - layer.addData(geoJSON.geometry); - expect(layer.getLayers()[0].feature).to.eql(geoJSON); - }); - }); -}); - -describe("L.Marker#toGeoJSON", function () { - it("returns a 2D Point object", function () { - var marker = new L.Marker([10, 20]); - expect(marker.toGeoJSON().geometry).to.eql({ - type: 'Point', - coordinates: [20, 10] - }); - }); - - it("returns a 3D Point object", function () { - var marker = new L.Marker([10, 20, 30]); - expect(marker.toGeoJSON().geometry).to.eql({ - type: 'Point', - coordinates: [20, 10, 30] - }); - }); -}); - -describe("L.Circle#toGeoJSON", function () { - it("returns a 2D Point object", function () { - var circle = new L.Circle([10, 20], 100); - expect(circle.toGeoJSON().geometry).to.eql({ - type: 'Point', - coordinates: [20, 10] - }); - }); - - it("returns a 3D Point object", function () { - var circle = new L.Circle([10, 20, 30], 100); - expect(circle.toGeoJSON().geometry).to.eql({ - type: 'Point', - coordinates: [20, 10, 30] - }); - }); -}); - -describe("L.CircleMarker#toGeoJSON", function () { - it("returns a 2D Point object", function () { - var marker = new L.CircleMarker([10, 20]); - expect(marker.toGeoJSON().geometry).to.eql({ - type: 'Point', - coordinates: [20, 10] - }); - }); - - it("returns a 3D Point object", function () { - var marker = new L.CircleMarker([10, 20, 30]); - expect(marker.toGeoJSON().geometry).to.eql({ - type: 'Point', - coordinates: [20, 10, 30] - }); - }); -}); - -describe("L.Polyline#toGeoJSON", function () { - it("returns a 2D LineString object", function () { - var polyline = new L.Polyline([[10, 20], [2, 5]]); - expect(polyline.toGeoJSON().geometry).to.eql({ - type: 'LineString', - coordinates: [[20, 10], [5, 2]] - }); - }); - - it("returns a 3D LineString object", function () { - var polyline = new L.Polyline([[10, 20, 30], [2, 5, 10]]); - expect(polyline.toGeoJSON().geometry).to.eql({ - type: 'LineString', - coordinates: [[20, 10, 30], [5, 2, 10]] - }); - }); -}); - -describe("L.MultiPolyline#toGeoJSON", function () { - it("returns a 2D MultiLineString object", function () { - var multiPolyline = new L.MultiPolyline([[[10, 20], [2, 5]], [[1, 2], [3, 4]]]); - expect(multiPolyline.toGeoJSON().geometry).to.eql({ - type: 'MultiLineString', - coordinates: [ - [[20, 10], [5, 2]], - [[2, 1], [4, 3]] - ] - }); - }); - - it("returns a 3D MultiLineString object", function () { - var multiPolyline = new L.MultiPolyline([[[10, 20, 30], [2, 5, 10]], [[1, 2, 3], [4, 5, 6]]]); - expect(multiPolyline.toGeoJSON().geometry).to.eql({ - type: 'MultiLineString', - coordinates: [ - [[20, 10, 30], [5, 2, 10]], - [[2, 1, 3], [5, 4, 6]] - ] - }); - }); -}); - -describe("L.Polygon#toGeoJSON", function () { - it("returns a 2D Polygon object (no holes)", function () { - var polygon = new L.Polygon([[1, 2], [3, 4], [5, 6]]); - expect(polygon.toGeoJSON().geometry).to.eql({ - type: 'Polygon', - coordinates: [[[2, 1], [4, 3], [6, 5], [2, 1]]] - }); - }); - - it("returns a 3D Polygon object (no holes)", function () { - var polygon = new L.Polygon([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); - expect(polygon.toGeoJSON().geometry).to.eql({ - type: 'Polygon', - coordinates: [[[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]]] - }); - }); - - it("returns a 2D Polygon object (with holes)", function () { - var polygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]); - expect(polygon.toGeoJSON().geometry).to.eql({ - type: 'Polygon', - coordinates: [ - [[2, 1], [4, 3], [6, 5], [2, 1]], - [[8, 7], [10, 9], [12, 11], [8, 7]] - ] - }); - }); - - it("returns a 3D Polygon object (with holes)", function () { - var polygon = new L.Polygon([[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]]); - expect(polygon.toGeoJSON().geometry).to.eql({ - type: 'Polygon', - coordinates: [ - [[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]], - [[11, 10, 12], [14, 13, 15], [17, 16, 18], [11, 10, 12]] - ] - }); - }); -}); - -describe("L.MultiPolygon#toGeoJSON", function () { - it("returns a 2D MultiPolygon object", function () { - var multiPolygon = new L.MultiPolygon([[[1, 2], [3, 4], [5, 6]]]); - expect(multiPolygon.toGeoJSON().geometry).to.eql({ - type: 'MultiPolygon', - coordinates: [ - [[[2, 1], [4, 3], [6, 5], [2, 1]]] - ] - }); - }); - - it("returns a 3D MultiPolygon object", function () { - var multiPolygon = new L.MultiPolygon([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]); - expect(multiPolygon.toGeoJSON().geometry).to.eql({ - type: 'MultiPolygon', - coordinates: [ - [[[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]]] - ] - }); - }); -}); - -describe("L.LayerGroup#toGeoJSON", function () { - it("returns a 2D FeatureCollection object", function () { - var marker = new L.Marker([10, 20]), - polyline = new L.Polyline([[10, 20], [2, 5]]), - layerGroup = new L.LayerGroup([marker, polyline]); - expect(layerGroup.toGeoJSON()).to.eql({ - type: 'FeatureCollection', - features: [marker.toGeoJSON(), polyline.toGeoJSON()] - }); - }); - - it("returns a 3D FeatureCollection object", function () { - var marker = new L.Marker([10, 20, 30]), - polyline = new L.Polyline([[10, 20, 30], [2, 5, 10]]), - layerGroup = new L.LayerGroup([marker, polyline]); - expect(layerGroup.toGeoJSON()).to.eql({ - type: 'FeatureCollection', - features: [marker.toGeoJSON(), polyline.toGeoJSON()] - }); - }); - - it("ensures that every member is a Feature", function () { - var tileLayer = new L.TileLayer(), - layerGroup = new L.LayerGroup([tileLayer]); - - tileLayer.toGeoJSON = function () { - return { - type: 'Point', - coordinates: [20, 10] - }; - }; - - expect(layerGroup.toGeoJSON()).to.eql({ - type: 'FeatureCollection', - features: [{ - type: 'Feature', - properties: {}, - geometry: { - type: 'Point', - coordinates: [20, 10] - } - }] - }); - }); - - it('roundtrips GeometryCollection features', function () { - var json = { - "type": "FeatureCollection", - "features": [{ - "type": "Feature", - "geometry": { - "type": "GeometryCollection", - "geometries": [{ - "type": "LineString", - "coordinates": [[-122.4425587930444, 37.80666418607323], [-122.4428379594768, 37.80663578323093]] - }, { - "type": "LineString", - "coordinates": [ - [-122.4425509770566, 37.80662588061205], - [-122.4428340530617, 37.8065999493009] - ] - }] - }, - "properties": { - "name": "SF Marina Harbor Master" - } - }] - }; - - expect(L.geoJson(json).toGeoJSON()).to.eql(json); - }); - - it('roundtrips MiltiPoint features', function () { - var json = { - "type": "FeatureCollection", - "features": [{ - "type": "Feature", - "geometry": { - "type": "MultiPoint", - "coordinates": [[-122.4425587930444, 37.80666418607323], [-122.4428379594768, 37.80663578323093]] - }, - "properties": { - "name": "Test MultiPoints" - } - }] - }; - - expect(L.geoJson(json).toGeoJSON()).to.eql(json); - }); - - it("omits layers which do not implement toGeoJSON", function () { - var tileLayer = new L.TileLayer(), - layerGroup = new L.LayerGroup([tileLayer]); - expect(layerGroup.toGeoJSON()).to.eql({ - type: 'FeatureCollection', - features: [] - }); - }); -}); diff --git a/spec/suites/layer/LayerGroupSpec.js b/spec/suites/layer/LayerGroupSpec.js deleted file mode 100644 index 98ce5e2b511..00000000000 --- a/spec/suites/layer/LayerGroupSpec.js +++ /dev/null @@ -1,58 +0,0 @@ -describe('LayerGroup', function () { - describe("#addLayer", function () { - it('adds a layer', function () { - var lg = L.layerGroup(), - marker = L.marker([0, 0]); - - expect(lg.addLayer(marker)).to.eql(lg); - - expect(lg.hasLayer(marker)).to.be(true); - }); - }); - describe("#removeLayer", function () { - it('removes a layer', function () { - var lg = L.layerGroup(), - marker = L.marker([0, 0]); - - lg.addLayer(marker); - expect(lg.removeLayer(marker)).to.eql(lg); - - expect(lg.hasLayer(marker)).to.be(false); - }); - }); - describe("#clearLayers", function () { - it('removes all layers', function () { - var lg = L.layerGroup(), - marker = L.marker([0, 0]); - - lg.addLayer(marker); - expect(lg.clearLayers()).to.eql(lg); - - expect(lg.hasLayer(marker)).to.be(false); - }); - }); - describe("#getLayers", function () { - it('gets all layers', function () { - var lg = L.layerGroup(), - marker = L.marker([0, 0]); - - lg.addLayer(marker); - - expect(lg.getLayers()).to.eql([marker]); - }); - }); - describe("#eachLayer", function () { - it('iterates over all layers', function () { - var lg = L.layerGroup(), - marker = L.marker([0, 0]), - ctx = { foo: 'bar' }; - - lg.addLayer(marker); - - lg.eachLayer(function (layer) { - expect(layer).to.eql(marker); - expect(this).to.eql(ctx); - }, ctx); - }); - }); -}); diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js deleted file mode 100644 index cef554f6cb8..00000000000 --- a/spec/suites/layer/PopupSpec.js +++ /dev/null @@ -1,119 +0,0 @@ -describe('Popup', function () { - - var c, map; - - beforeEach(function () { - c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - }); - - it("closes on map click when map has closePopupOnClick option", function () { - map.options.closePopupOnClick = true; - - var popup = new L.Popup() - .setLatLng(new L.LatLng(55.8, 37.6)) - .openOn(map); - - happen.click(c); - - expect(map.hasLayer(popup)).to.be(false); - }); - - it("closes on map click when popup has closeOnClick option", function () { - map.options.closePopupOnClick = false; - - var popup = new L.Popup({closeOnClick: true}) - .setLatLng(new L.LatLng(55.8, 37.6)) - .openOn(map); - - happen.click(c); - - expect(map.hasLayer(popup)).to.be(false); - }); - - it("does not close on map click when popup has closeOnClick: false option", function () { - map.options.closePopupOnClick = true; - - var popup = new L.Popup({closeOnClick: false}) - .setLatLng(new L.LatLng(55.8, 37.6)) - .openOn(map); - - happen.click(c); - - expect(map.hasLayer(popup)).to.be(true); - }); - - it("toggles its visibility when marker is clicked", function () { - var marker = new L.Marker(new L.LatLng(55.8, 37.6)); - map.addLayer(marker); - - marker.bindPopup('Popup1').openPopup(); - - map.options.closePopupOnClick = true; - happen.click(c); - - // toggle open popup - sinon.spy(marker, "openPopup"); - marker.fire('click'); - expect(marker.openPopup.calledOnce).to.be(true); - expect(map.hasLayer(marker._popup)).to.be(true); - marker.openPopup.restore(); - - // toggle close popup - sinon.spy(marker, "closePopup"); - marker.fire('click'); - expect(marker.closePopup.calledOnce).to.be(true); - expect(map.hasLayer(marker._popup)).to.be(false); - marker.closePopup.restore(); - }); - - it("should trigger popupopen on marker when popup opens", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); - var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); - - map.addLayer(marker1); - map.addLayer(marker2); - - marker1.bindPopup('Popup1'); - marker2.bindPopup('Popup2'); - - var spy = sinon.spy(); - - marker1.on('popupopen', spy); - - expect(spy.called).to.be(false); - marker2.openPopup(); - expect(spy.called).to.be(false); - marker1.openPopup(); - expect(spy.called).to.be(true); - }); - - it("should trigger popupclose on marker when popup closes", function () { - var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); - var marker2 = new L.Marker(new L.LatLng(57.123076977278, 44.861962891635)); - - map.addLayer(marker1); - map.addLayer(marker2); - - marker1.bindPopup('Popup1'); - marker2.bindPopup('Popup2'); - - var spy = sinon.spy(); - - marker1.on('popupclose', spy); - - expect(spy.called).to.be(false); - marker2.openPopup(); - expect(spy.called).to.be(false); - marker1.openPopup(); - expect(spy.called).to.be(false); - marker2.openPopup(); - expect(spy.called).to.be(true); - marker1.openPopup(); - marker1.closePopup(); - expect(spy.callCount).to.be(2); - }); -}); diff --git a/spec/suites/layer/TileLayerSpec.js b/spec/suites/layer/TileLayerSpec.js deleted file mode 100644 index ab00e92067f..00000000000 --- a/spec/suites/layer/TileLayerSpec.js +++ /dev/null @@ -1,88 +0,0 @@ - -describe('TileLayer', function () { - var tileUrl = ''; - - describe("#getMaxZoom, #getMinZoom", function () { - var map; - beforeEach(function () { - map = L.map(document.createElement('div')); - }); - describe("when a tilelayer is added to a map with no other layers", function () { - it("has the same zoomlevels as the tilelayer", function () { - var maxZoom = 10, - minZoom = 5; - - map.setView([0, 0], 1); - - L.tileLayer(tileUrl, { - maxZoom: maxZoom, - minZoom: minZoom - }).addTo(map); - - expect(map.getMaxZoom()).to.be(maxZoom); - expect(map.getMinZoom()).to.be(minZoom); - }); - }); - - describe("accessing a tilelayer's properties", function () { - it('provides a container', function () { - map.setView([0, 0], 1); - - var layer = L.tileLayer(tileUrl).addTo(map); - expect(layer.getContainer()).to.be.ok(); - }); - }); - - describe("when a tilelayer is added to a map that already has a tilelayer", function () { - it("has its zoomlevels updated to fit the new layer", function () { - map.setView([0, 0], 1); - - L.tileLayer(tileUrl, {minZoom: 10, maxZoom: 15}).addTo(map); - expect(map.getMinZoom()).to.be(10); - expect(map.getMaxZoom()).to.be(15); - - L.tileLayer(tileUrl, {minZoom: 5, maxZoom: 10}).addTo(map); - expect(map.getMinZoom()).to.be(5); // changed - expect(map.getMaxZoom()).to.be(15); // unchanged - - L.tileLayer(tileUrl, {minZoom: 10, maxZoom: 20}).addTo(map); - expect(map.getMinZoom()).to.be(5); // unchanged - expect(map.getMaxZoom()).to.be(20); // changed - - - L.tileLayer(tileUrl, {minZoom: 0, maxZoom: 25}).addTo(map); - expect(map.getMinZoom()).to.be(0); // changed - expect(map.getMaxZoom()).to.be(25); // changed - }); - }); - describe("when a tilelayer is removed from a map", function () { - it("has its zoomlevels updated to only fit the layers it currently has", function () { - var tiles = [ L.tileLayer(tileUrl, {minZoom: 10, maxZoom: 15}).addTo(map), - L.tileLayer(tileUrl, {minZoom: 5, maxZoom: 10}).addTo(map), - L.tileLayer(tileUrl, {minZoom: 10, maxZoom: 20}).addTo(map), - L.tileLayer(tileUrl, {minZoom: 0, maxZoom: 25}).addTo(map) - ]; - map.whenReady(function () { - expect(map.getMinZoom()).to.be(0); - expect(map.getMaxZoom()).to.be(25); - - map.removeLayer(tiles[0]); - expect(map.getMinZoom()).to.be(0); - expect(map.getMaxZoom()).to.be(25); - - map.removeLayer(tiles[3]); - expect(map.getMinZoom()).to.be(5); - expect(map.getMaxZoom()).to.be(20); - - map.removeLayer(tiles[2]); - expect(map.getMinZoom()).to.be(5); - expect(map.getMaxZoom()).to.be(10); - - map.removeLayer(tiles[1]); - expect(map.getMinZoom()).to.be(0); - expect(map.getMaxZoom()).to.be(Infinity); - }); - }); - }); - }); -}); diff --git a/spec/suites/layer/marker/MarkerSpec.js b/spec/suites/layer/marker/MarkerSpec.js deleted file mode 100644 index 86117c9f59d..00000000000 --- a/spec/suites/layer/marker/MarkerSpec.js +++ /dev/null @@ -1,94 +0,0 @@ -describe("Marker", function () { - var map, - spy, - icon1, - icon2; - - beforeEach(function () { - map = L.map(document.createElement('div')).setView([0, 0], 0); - icon1 = new L.Icon.Default(); - icon2 = new L.Icon.Default({ - iconUrl: icon1._getIconUrl('icon') + '?2', - shadowUrl: icon1._getIconUrl('shadow') + '?2' - }); - }); - - describe("#setIcon", function () { - it("changes the icon to another image", function () { - var marker = new L.Marker([0, 0], {icon: icon1}); - map.addLayer(marker); - - var beforeIcon = marker._icon; - marker.setIcon(icon2); - var afterIcon = marker._icon; - - expect(beforeIcon).to.be(afterIcon); - expect(afterIcon.src).to.contain(icon2._getIconUrl('icon')); - }); - - it("changes the icon to another DivIcon", function () { - var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); - map.addLayer(marker); - - var beforeIcon = marker._icon; - marker.setIcon(new L.DivIcon({html: 'Inner2Text' })); - var afterIcon = marker._icon; - - expect(beforeIcon).to.be(afterIcon); - expect(afterIcon.innerHTML).to.contain('Inner2Text'); - }); - - it("removes text when changing to a blank DivIcon", function () { - var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); - map.addLayer(marker); - - marker.setIcon(new L.DivIcon()); - var afterIcon = marker._icon; - - expect(marker._icon.innerHTML).to.not.contain('Inner1Text'); - }); - - it("changes a DivIcon to an image", function () { - var marker = new L.Marker([0, 0], {icon: new L.DivIcon({html: 'Inner1Text' }) }); - map.addLayer(marker); - var oldIcon = marker._icon; - - marker.setIcon(icon1); - - expect(oldIcon).to.not.be(marker._icon); - expect(oldIcon.parentNode).to.be(null); - - expect(marker._icon.src).to.contain('marker-icon.png'); - expect(marker._icon.parentNode).to.be(map._panes.markerPane); - }); - - it("changes an image to a DivIcon", function () { - var marker = new L.Marker([0, 0], {icon: icon1}); - map.addLayer(marker); - var oldIcon = marker._icon; - - marker.setIcon(new L.DivIcon({html: 'Inner1Text' })); - - expect(oldIcon).to.not.be(marker._icon); - expect(oldIcon.parentNode).to.be(null); - - expect(marker._icon.innerHTML).to.contain('Inner1Text'); - expect(marker._icon.parentNode).to.be(map._panes.markerPane); - }); - - it("reuses the icon/shadow when changing icon", function () { - var marker = new L.Marker([0, 0], { icon: icon1}); - map.addLayer(marker); - var oldIcon = marker._icon; - var oldShadow = marker._shadow; - - marker.setIcon(icon2); - - expect(oldIcon).to.be(marker._icon); - expect(oldShadow).to.be(marker._shadow); - - expect(marker._icon.parentNode).to.be(map._panes.markerPane); - expect(marker._shadow.parentNode).to.be(map._panes.shadowPane); - }); - }); -}); diff --git a/spec/suites/layer/vector/CircleMarkerSpec.js b/spec/suites/layer/vector/CircleMarkerSpec.js deleted file mode 100644 index 81a712eda87..00000000000 --- a/spec/suites/layer/vector/CircleMarkerSpec.js +++ /dev/null @@ -1,53 +0,0 @@ -describe('CircleMarker', function () { - describe("#_radius", function () { - var map; - beforeEach(function () { - map = L.map(document.createElement('div')); - map.setView([0, 0], 1); - }); - describe("when a CircleMarker is added to the map ", function () { - describe("with a radius set as an option", function () { - it("takes that radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }).addTo(map); - - expect(marker._radius).to.be(20); - }); - }); - - describe("and radius is set before adding it", function () { - it("takes that radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); - marker.setRadius(15); - marker.addTo(map); - expect(marker._radius).to.be(15); - }); - }); - - describe("and radius is set after adding it", function () { - it("takes that radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); - marker.addTo(map); - marker.setRadius(15); - expect(marker._radius).to.be(15); - }); - }); - - describe("and setStyle is used to change the radius after adding", function () { - it("takes the given radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); - marker.addTo(map); - marker.setStyle({ radius: 15 }); - expect(marker._radius).to.be(15); - }); - }); - describe("and setStyle is used to change the radius before adding", function () { - it("takes the given radius", function () { - var marker = L.circleMarker([0, 0], { radius: 20 }); - marker.setStyle({ radius: 15 }); - marker.addTo(map); - expect(marker._radius).to.be(15); - }); - }); - }); - }); -}); diff --git a/spec/suites/layer/vector/CircleSpec.js b/spec/suites/layer/vector/CircleSpec.js deleted file mode 100644 index c9ebb6e1857..00000000000 --- a/spec/suites/layer/vector/CircleSpec.js +++ /dev/null @@ -1,17 +0,0 @@ -describe('Circle', function () { - describe('#getBounds', function () { - - var circle; - - beforeEach(function () { - circle = L.circle([50, 30], 200); - }); - - it('returns bounds', function () { - var bounds = circle.getBounds(); - - expect(bounds.getSouthWest().equals([49.998203369, 29.997204939])).to.be.ok(); - expect(bounds.getNorthEast().equals([50.001796631, 30.002795061])).to.be.ok(); - }); - }); -}); diff --git a/spec/suites/layer/vector/PolygonSpec.js b/spec/suites/layer/vector/PolygonSpec.js deleted file mode 100644 index 7014838f195..00000000000 --- a/spec/suites/layer/vector/PolygonSpec.js +++ /dev/null @@ -1,91 +0,0 @@ -describe('Polygon', function () { - - var c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - var map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - - describe("#initialize", function () { - it("doesn't overwrite the given latlng array", function () { - var originalLatLngs = [ - [1, 2], - [3, 4] - ]; - var sourceLatLngs = originalLatLngs.slice(); - - var polygon = new L.Polygon(sourceLatLngs); - - expect(sourceLatLngs).to.eql(originalLatLngs); - expect(polygon._latlngs).to.not.eql(sourceLatLngs); - }); - - it("can be called with an empty array", function () { - var polygon = new L.Polygon([]); - expect(polygon.getLatLngs()).to.eql([]); - }); - - it("can be initialized with holes", function () { - var originalLatLngs = [ - [ //external rink - [0, 10], [10, 10], [10, 0] - ], [ //hole - [2, 3], [2, 4], [3, 4] - ] - ]; - - var polygon = new L.Polygon(originalLatLngs); - - //getLatLngs() returns only external ring - expect(polygon.getLatLngs()).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); - }); - }); - - describe("#setLatLngs", function () { - it("doesn't overwrite the given latlng array", function () { - var originalLatLngs = [ - [1, 2], - [3, 4] - ]; - var sourceLatLngs = originalLatLngs.slice(); - - var polygon = new L.Polygon(sourceLatLngs); - - polygon.setLatLngs(sourceLatLngs); - - expect(sourceLatLngs).to.eql(originalLatLngs); - }); - - it("can be set external ring and holes", function () { - var latLngs = [ - [ //external rink - [0, 10], [10, 10], [10, 0] - ], [ //hole - [2, 3], [2, 4], [3, 4] - ] - ]; - - var polygon = new L.Polygon([]); - polygon.setLatLngs(latLngs); - - //getLatLngs() returns only external ring - expect(polygon.getLatLngs()).to.eql([L.latLng([0, 10]), L.latLng([10, 10]), L.latLng([10, 0])]); - }); - }); - - describe("#spliceLatLngs", function () { - it("splices the internal latLngs", function () { - var latLngs = [ - [1, 2], - [3, 4], - [5, 6] - ]; - - var polygon = new L.Polygon(latLngs); - - polygon.spliceLatLngs(1, 1, [7, 8]); - - expect(polygon._latlngs).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); - }); - }); -}); diff --git a/spec/suites/layer/vector/PolylineGeometrySpec.js b/spec/suites/layer/vector/PolylineGeometrySpec.js deleted file mode 100644 index 86a9e46321e..00000000000 --- a/spec/suites/layer/vector/PolylineGeometrySpec.js +++ /dev/null @@ -1,35 +0,0 @@ -describe('PolylineGeometry', function () { - - var c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - var map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - - describe("#distanceTo", function () { - it("calculates distances to points", function () { - var p1 = map.latLngToLayerPoint(new L.LatLng(55.8, 37.6)); - var p2 = map.latLngToLayerPoint(new L.LatLng(57.123076977278, 44.861962891635)); - var latlngs = [[56.485503424111, 35.545556640339], [55.972522915346, 36.116845702918], [55.502459116923, 34.930322265253], [55.31534617509, 38.973291015816]] - .map(function (ll) { - return new L.LatLng(ll[0], ll[1]); - }); - var polyline = new L.Polyline([], { - 'noClip': true - }); - map.addLayer(polyline); - - expect(polyline.closestLayerPoint(p1)).to.be(null); - - polyline.setLatLngs(latlngs); - var point = polyline.closestLayerPoint(p1); - expect(point).not.to.be(null); - expect(point.distance).to.not.be(Infinity); - expect(point.distance).to.not.be(NaN); - - var point2 = polyline.closestLayerPoint(p2); - - expect(point.distance).to.be.lessThan(point2.distance); - }); - }); -}); diff --git a/spec/suites/layer/vector/PolylineSpec.js b/spec/suites/layer/vector/PolylineSpec.js deleted file mode 100644 index 176543e6828..00000000000 --- a/spec/suites/layer/vector/PolylineSpec.js +++ /dev/null @@ -1,55 +0,0 @@ -describe('Polyline', function () { - - var c = document.createElement('div'); - c.style.width = '400px'; - c.style.height = '400px'; - var map = new L.Map(c); - map.setView(new L.LatLng(55.8, 37.6), 6); - - describe("#initialize", function () { - it("doesn't overwrite the given latlng array", function () { - var originalLatLngs = [ - [1, 2], - [3, 4] - ]; - var sourceLatLngs = originalLatLngs.slice(); - - var polyline = new L.Polyline(sourceLatLngs); - - expect(sourceLatLngs).to.eql(originalLatLngs); - expect(polyline._latlngs).to.not.eql(sourceLatLngs); - }); - }); - - describe("#setLatLngs", function () { - it("doesn't overwrite the given latlng array", function () { - var originalLatLngs = [ - [1, 2], - [3, 4] - ]; - var sourceLatLngs = originalLatLngs.slice(); - - var polyline = new L.Polyline(sourceLatLngs); - - polyline.setLatLngs(sourceLatLngs); - - expect(sourceLatLngs).to.eql(originalLatLngs); - }); - }); - - describe("#spliceLatLngs", function () { - it("splices the internal latLngs", function () { - var latLngs = [ - [1, 2], - [3, 4], - [5, 6] - ]; - - var polyline = new L.Polyline(latLngs); - - polyline.spliceLatLngs(1, 1, [7, 8]); - - expect(polyline._latlngs).to.eql([L.latLng([1, 2]), L.latLng([7, 8]), L.latLng([5, 6])]); - }); - }); -}); diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js deleted file mode 100644 index 122bba96e0c..00000000000 --- a/spec/suites/map/MapSpec.js +++ /dev/null @@ -1,536 +0,0 @@ -describe("Map", function () { - var map, - spy; - beforeEach(function () { - map = L.map(document.createElement('div')); - }); - - describe("#remove", function () { - it("fires an unload event if loaded", function () { - var container = document.createElement('div'), - map = new L.Map(container).setView([0, 0], 0), - spy = sinon.spy(); - map.on('unload', spy); - map.remove(); - expect(spy.called).to.be.ok(); - }); - - it("fires no unload event if not loaded", function () { - var container = document.createElement('div'), - map = new L.Map(container), - spy = sinon.spy(); - map.on('unload', spy); - map.remove(); - expect(spy.called).not.to.be.ok(); - }); - - describe("corner case checking", function () { - it("throws an exception upon reinitialization", function () { - var container = document.createElement('div'), - map = new L.Map(container); - expect(function () { - L.map(container); - }).to.throwException(function (e) { - expect(e.message).to.eql("Map container is already initialized."); - }); - map.remove(); - }); - - it("throws an exception if a container is not found", function () { - expect(function () { - L.map('nonexistentdivelement'); - }).to.throwException(function (e) { - expect(e.message).to.eql("Map container not found."); - }); - map.remove(); - }); - }); - - it("undefines container._leaflet", function () { - var container = document.createElement('div'), - map = new L.Map(container); - map.remove(); - expect(container._leaflet).to.be(undefined); - }); - - it("unbinds events", function () { - var container = document.createElement('div'), - map = new L.Map(container).setView([0, 0], 1), - spy = sinon.spy(); - - map.on('click dblclick mousedown mouseup mousemove', spy); - map.remove(); - - happen.click(container); - happen.dblclick(container); - happen.mousedown(container); - happen.mouseup(container); - happen.mousemove(container); - - expect(spy.called).to.not.be.ok(); - }); - }); - - describe('#getCenter', function () { - it('throws if not set before', function () { - expect(function () { - map.getCenter(); - }).to.throwError(); - }); - - it('returns a precise center when zoomed in after being set (#426)', function () { - var center = L.latLng(10, 10); - map.setView(center, 1); - map.setZoom(19); - expect(map.getCenter()).to.eql(center); - }); - - it('returns correct center after invalidateSize (#1919)', function () { - map.setView(L.latLng(10, 10), 1); - map.invalidateSize(); - expect(map.getCenter()).not.to.eql(L.latLng(10, 10)); - }); - }); - - describe("#whenReady", function () { - describe("when the map has not yet been loaded", function () { - it("calls the callback when the map is loaded", function () { - var spy = sinon.spy(); - map.whenReady(spy); - expect(spy.called).to.not.be.ok(); - - map.setView([0, 0], 1); - expect(spy.called).to.be.ok(); - }); - }); - - describe("when the map has already been loaded", function () { - it("calls the callback immediately", function () { - var spy = sinon.spy(); - map.setView([0, 0], 1); - map.whenReady(spy); - - expect(spy.called).to.be.ok(); - }); - }); - }); - - describe("#setView", function () { - it("sets the view of the map", function () { - expect(map.setView([51.505, -0.09], 13)).to.be(map); - expect(map.getZoom()).to.be(13); - expect(map.getCenter().distanceTo([51.505, -0.09])).to.be.lessThan(5); - }); - it("can be passed without a zoom specified", function () { - map.setZoom(13); - expect(map.setView([51.605, -0.11])).to.be(map); - expect(map.getZoom()).to.be(13); - expect(map.getCenter().distanceTo([51.605, -0.11])).to.be.lessThan(5); - }); - }); - - describe("#getBounds", function () { - it("is safe to call from within a moveend callback during initial load (#1027)", function () { - map.on("moveend", function () { - map.getBounds(); - }); - - map.setView([51.505, -0.09], 13); - }); - }); - - describe('#setMaxBounds', function () { - it("aligns pixel-wise map view center with maxBounds center if it cannot move view bounds inside maxBounds (#1908)", function () { - var container = map.getContainer(); - // large view, cannot fit within maxBounds - container.style.width = container.style.height = "1000px"; - document.body.appendChild(container); - // maxBounds - var bounds = L.latLngBounds([51.5, -0.05], [51.55, 0.05]); - map.setMaxBounds(bounds, {animate: false}); - // set view outside - map.setView(L.latLng([53.0, 0.15]), 12, {animate: false}); - // get center of bounds in pixels - var boundsCenter = map.project(bounds.getCenter()).round(); - expect(map.project(map.getCenter()).round()).to.eql(boundsCenter); - document.body.removeChild(container); - }); - it("moves map view within maxBounds by changing one coordinate", function () { - var container = map.getContainer(); - // small view, can fit within maxBounds - container.style.width = container.style.height = "200px"; - document.body.appendChild(container); - // maxBounds - var bounds = L.latLngBounds([51, -0.2], [52, 0.2]); - map.setMaxBounds(bounds, {animate: false}); - // set view outside maxBounds on one direction only - // leaves untouched the other coordinate (that is not already centered) - var initCenter = [53.0, 0.1]; - map.setView(L.latLng(initCenter), 16, {animate: false}); - // one pixel coordinate hasn't changed, the other has - var pixelCenter = map.project(map.getCenter()).round(); - var pixelInit = map.project(initCenter).round(); - expect(pixelCenter.x).to.eql(pixelInit.x); - expect(pixelCenter.y).not.to.eql(pixelInit.y); - // the view is inside the bounds - expect(bounds.contains(map.getBounds())).to.be(true); - document.body.removeChild(container); - }); - }); - - describe("#getMinZoom and #getMaxZoom", function () { - describe('#getMinZoom', function () { - it('returns 0 if not set by Map options or TileLayer options', function () { - var map = L.map(document.createElement('div')); - expect(map.getMinZoom()).to.be(0); - }); - }); - - it("minZoom and maxZoom options overrides any minZoom and maxZoom set on layers", function () { - - var map = L.map(document.createElement('div'), {minZoom: 2, maxZoom: 20}); - - L.tileLayer("{z}{x}{y}", {minZoom: 4, maxZoom: 10}).addTo(map); - L.tileLayer("{z}{x}{y}", {minZoom: 6, maxZoom: 17}).addTo(map); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 22}).addTo(map); - - expect(map.getMinZoom()).to.be(2); - expect(map.getMaxZoom()).to.be(20); - }); - }); - - describe("#addLayer", function () { - it("calls layer.onAdd immediately if the map is ready", function () { - var layer = { onAdd: sinon.spy() }; - map.setView([0, 0], 0); - map.addLayer(layer); - expect(layer.onAdd.called).to.be.ok(); - }); - - it("calls layer.onAdd when the map becomes ready", function () { - var layer = { onAdd: sinon.spy() }; - map.addLayer(layer); - expect(layer.onAdd.called).not.to.be.ok(); - map.setView([0, 0], 0); - expect(layer.onAdd.called).to.be.ok(); - }); - - it("does not call layer.onAdd if the layer is removed before the map becomes ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; - map.addLayer(layer); - map.removeLayer(layer); - map.setView([0, 0], 0); - expect(layer.onAdd.called).not.to.be.ok(); - }); - - it("fires a layeradd event immediately if the map is ready", function () { - var layer = { onAdd: sinon.spy() }, - spy = sinon.spy(); - map.on('layeradd', spy); - map.setView([0, 0], 0); - map.addLayer(layer); - expect(spy.called).to.be.ok(); - }); - - it("fires a layeradd event when the map becomes ready", function () { - var layer = { onAdd: sinon.spy() }, - spy = sinon.spy(); - map.on('layeradd', spy); - map.addLayer(layer); - expect(spy.called).not.to.be.ok(); - map.setView([0, 0], 0); - expect(spy.called).to.be.ok(); - }); - - it("does not fire a layeradd event if the layer is removed before the map becomes ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, - spy = sinon.spy(); - map.on('layeradd', spy); - map.addLayer(layer); - map.removeLayer(layer); - map.setView([0, 0], 0); - expect(spy.called).not.to.be.ok(); - }); - - it("adds the layer before firing layeradd", function (done) { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; - map.on('layeradd', function () { - expect(map.hasLayer(layer)).to.be.ok(); - done(); - }); - map.setView([0, 0], 0); - map.addLayer(layer); - }); - - describe("When the first layer is added to a map", function () { - it("fires a zoomlevelschange event", function () { - var spy = sinon.spy(); - map.on("zoomlevelschange", spy); - expect(spy.called).not.to.be.ok(); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); - expect(spy.called).to.be.ok(); - }); - }); - - describe("when a new layer with greater zoomlevel coverage than the current layer is added to a map", function () { - it("fires a zoomlevelschange event", function () { - var spy = sinon.spy(); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); - map.on("zoomlevelschange", spy); - expect(spy.called).not.to.be.ok(); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 15}).addTo(map); - expect(spy.called).to.be.ok(); - }); - }); - - describe("when a new layer with the same or lower zoomlevel coverage as the current layer is added to a map", function () { - it("fires no zoomlevelschange event", function () { - var spy = sinon.spy(); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); - map.on("zoomlevelschange", spy); - expect(spy.called).not.to.be.ok(); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); - expect(spy.called).not.to.be.ok(); - L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 5}).addTo(map); - expect(spy.called).not.to.be.ok(); - }); - }); - }); - - describe("#removeLayer", function () { - it("calls layer.onRemove if the map is ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; - map.setView([0, 0], 0); - map.addLayer(layer); - map.removeLayer(layer); - expect(layer.onRemove.called).to.be.ok(); - }); - - it("does not call layer.onRemove if the layer was not added", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; - map.setView([0, 0], 0); - map.removeLayer(layer); - expect(layer.onRemove.called).not.to.be.ok(); - }); - - it("does not call layer.onRemove if the map is not ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; - map.addLayer(layer); - map.removeLayer(layer); - expect(layer.onRemove.called).not.to.be.ok(); - }); - - it("fires a layerremove event if the map is ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, - spy = sinon.spy(); - map.on('layerremove', spy); - map.setView([0, 0], 0); - map.addLayer(layer); - map.removeLayer(layer); - expect(spy.called).to.be.ok(); - }); - - it("does not fire a layerremove if the layer was not added", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, - spy = sinon.spy(); - map.on('layerremove', spy); - map.setView([0, 0], 0); - map.removeLayer(layer); - expect(spy.called).not.to.be.ok(); - }); - - it("does not fire a layerremove if the map is not ready", function () { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }, - spy = sinon.spy(); - map.on('layerremove', spy); - map.addLayer(layer); - map.removeLayer(layer); - expect(spy.called).not.to.be.ok(); - }); - - it("removes the layer before firing layerremove", function (done) { - var layer = { onAdd: sinon.spy(), onRemove: sinon.spy() }; - map.on('layerremove', function () { - expect(map.hasLayer(layer)).not.to.be.ok(); - done(); - }); - map.setView([0, 0], 0); - map.addLayer(layer); - map.removeLayer(layer); - }); - - describe("when the last tile layer on a map is removed", function () { - it("fires a zoomlevelschange event", function () { - map.whenReady(function () { - var spy = sinon.spy(); - var tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map); - - map.on("zoomlevelschange", spy); - expect(spy.called).not.to.be.ok(); - map.removeLayer(tl); - expect(spy.called).to.be.ok(); - }); - }); - }); - - describe("when a tile layer is removed from a map and it had greater zoom level coverage than the remainding layer", function () { - it("fires a zoomlevelschange event", function () { - map.whenReady(function () { - var spy = sinon.spy(), - tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), - t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 15}).addTo(map); - - map.on("zoomlevelschange", spy); - expect(spy.called).to.not.be.ok(); - map.removeLayer(t2); - expect(spy.called).to.be.ok(); - }); - }); - }); - - describe("when a tile layer is removed from a map it and it had lesser or the sa,e zoom level coverage as the remainding layer(s)", function () { - it("fires no zoomlevelschange event", function () { - map.whenReady(function () { - var tl = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), - t2 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 10}).addTo(map), - t3 = L.tileLayer("{z}{x}{y}", {minZoom: 0, maxZoom: 5}).addTo(map); - - map.on("zoomlevelschange", spy); - expect(spy).not.toHaveBeenCalled(); - map.removeLayer(t2); - expect(spy).not.toHaveBeenCalled(); - map.removeLayer(t3); - expect(spy).not.toHaveBeenCalled(); - }); - }); - }); - }); - - describe("#eachLayer", function () { - it("returns self", function () { - expect(map.eachLayer(function () {})).to.be(map); - }); - - it("calls the provided function for each layer", function () { - var t1 = L.tileLayer("{z}{x}{y}").addTo(map), - t2 = L.tileLayer("{z}{x}{y}").addTo(map), - spy = sinon.spy(); - - map.eachLayer(spy); - - expect(spy.callCount).to.eql(2); - expect(spy.firstCall.args).to.eql([t1]); - expect(spy.secondCall.args).to.eql([t2]); - }); - - it("calls the provided function with the provided context", function () { - var t1 = L.tileLayer("{z}{x}{y}").addTo(map), - spy = sinon.spy(); - - map.eachLayer(spy, map); - - expect(spy.thisValues[0]).to.eql(map); - }); - }); - - describe("#invalidateSize", function () { - var container, - origWidth = 100, - clock; - - beforeEach(function () { - container = map.getContainer(); - container.style.width = origWidth + "px"; - document.body.appendChild(container); - map.setView([0, 0], 0); - map.invalidateSize({pan: false}); - clock = sinon.useFakeTimers(); - }); - - afterEach(function () { - document.body.removeChild(container); - clock.restore(); - }); - - it("pans by the right amount when growing in 1px increments", function () { - container.style.width = (origWidth + 1) + "px"; - map.invalidateSize(); - expect(map._getMapPanePos().x).to.be(1); - - container.style.width = (origWidth + 2) + "px"; - map.invalidateSize(); - expect(map._getMapPanePos().x).to.be(1); - - container.style.width = (origWidth + 3) + "px"; - map.invalidateSize(); - expect(map._getMapPanePos().x).to.be(2); - }); - - it("pans by the right amount when shrinking in 1px increments", function () { - container.style.width = (origWidth - 1) + "px"; - map.invalidateSize(); - expect(map._getMapPanePos().x).to.be(0); - - container.style.width = (origWidth - 2) + "px"; - map.invalidateSize(); - expect(map._getMapPanePos().x).to.be(-1); - - container.style.width = (origWidth - 3) + "px"; - map.invalidateSize(); - expect(map._getMapPanePos().x).to.be(-1); - }); - - it("pans back to the original position after growing by an odd size and back", function () { - container.style.width = (origWidth + 5) + "px"; - map.invalidateSize(); - - container.style.width = origWidth + "px"; - map.invalidateSize(); - - expect(map._getMapPanePos().x).to.be(0); - }); - - it("emits no move event if the size has not changed", function () { - var spy = sinon.spy(); - map.on("move", spy); - - map.invalidateSize(); - - expect(spy.called).not.to.be.ok(); - }); - - it("emits a move event if the size has changed", function () { - var spy = sinon.spy(); - map.on("move", spy); - - container.style.width = (origWidth + 5) + "px"; - map.invalidateSize(); - - expect(spy.called).to.be.ok(); - }); - - it("emits a moveend event if the size has changed", function () { - var spy = sinon.spy(); - map.on("moveend", spy); - - container.style.width = (origWidth + 5) + "px"; - map.invalidateSize(); - - expect(spy.called).to.be.ok(); - }); - - it("debounces the moveend event if the debounceMoveend option is given", function () { - var spy = sinon.spy(); - map.on("moveend", spy); - - container.style.width = (origWidth + 5) + "px"; - map.invalidateSize({debounceMoveend: true}); - - expect(spy.called).not.to.be.ok(); - - clock.tick(200); - - expect(spy.called).to.be.ok(); - }); - }); -}); diff --git a/spec/suites/map/handler/Map.DragSpec.js b/spec/suites/map/handler/Map.DragSpec.js deleted file mode 100644 index 189b9192f1f..00000000000 --- a/spec/suites/map/handler/Map.DragSpec.js +++ /dev/null @@ -1,38 +0,0 @@ -describe("Map.Drag", function () { - describe("#addHook", function () { - it("calls the map with dragging enabled", function () { - var container = document.createElement('div'), - map = new L.Map(container, { - dragging: true - }); - - expect(map.dragging.enabled()).to.be(true); - map.setView([0, 0], 0); - expect(map.dragging.enabled()).to.be(true); - }); - it("calls the map with dragging and worldCopyJump enabled", function () { - var container = document.createElement('div'), - map = new L.Map(container, { - dragging: true, - worldCopyJump: true - }); - - expect(map.dragging.enabled()).to.be(true); - map.setView([0, 0], 0); - expect(map.dragging.enabled()).to.be(true); - }); - it("calls the map with dragging disabled and worldCopyJump enabled; " + - "enables dragging after setting center and zoom", function () { - var container = document.createElement('div'), - map = new L.Map(container, { - dragging: false, - worldCopyJump: true - }); - - expect(map.dragging.enabled()).to.be(false); - map.setView([0, 0], 0); - map.dragging.enable(); - expect(map.dragging.enabled()).to.be(true); - }); - }); -}); diff --git a/src/Leaflet.js b/src/Leaflet.js deleted file mode 100644 index e15e8bd6d00..00000000000 --- a/src/Leaflet.js +++ /dev/null @@ -1,23 +0,0 @@ - -var oldL = window.L, - L = {}; - -L.version = '0.7.2'; - -// define Leaflet for Node module pattern loaders, including Browserify -if (typeof module === 'object' && typeof module.exports === 'object') { - module.exports = L; - -// define Leaflet as an AMD module -} else if (typeof define === 'function' && define.amd) { - define(L); -} - -// define Leaflet as a global L variable, saving the original L to restore later if needed - -L.noConflict = function () { - window.L = oldL; - return this; -}; - -window.L = L; diff --git a/src/control/Control.Attribution.js b/src/control/Control.Attribution.js deleted file mode 100644 index 21eb1c5f105..00000000000 --- a/src/control/Control.Attribution.js +++ /dev/null @@ -1,121 +0,0 @@ -/* - * L.Control.Attribution is used for displaying attribution on the map (added by default). - */ - -L.Control.Attribution = L.Control.extend({ - options: { - position: 'bottomright', - prefix: 'Leaflet' - }, - - initialize: function (options) { - L.setOptions(this, options); - - this._attributions = {}; - }, - - onAdd: function (map) { - this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); - L.DomEvent.disableClickPropagation(this._container); - - for (var i in map._layers) { - if (map._layers[i].getAttribution) { - this.addAttribution(map._layers[i].getAttribution()); - } - } - - map - .on('layeradd', this._onLayerAdd, this) - .on('layerremove', this._onLayerRemove, this); - - this._update(); - - return this._container; - }, - - onRemove: function (map) { - map - .off('layeradd', this._onLayerAdd) - .off('layerremove', this._onLayerRemove); - - }, - - setPrefix: function (prefix) { - this.options.prefix = prefix; - this._update(); - return this; - }, - - addAttribution: function (text) { - if (!text) { return; } - - if (!this._attributions[text]) { - this._attributions[text] = 0; - } - this._attributions[text]++; - - this._update(); - - return this; - }, - - removeAttribution: function (text) { - if (!text) { return; } - - if (this._attributions[text]) { - this._attributions[text]--; - this._update(); - } - - return this; - }, - - _update: function () { - if (!this._map) { return; } - - var attribs = []; - - for (var i in this._attributions) { - if (this._attributions[i]) { - attribs.push(i); - } - } - - var prefixAndAttribs = []; - - if (this.options.prefix) { - prefixAndAttribs.push(this.options.prefix); - } - if (attribs.length) { - prefixAndAttribs.push(attribs.join(', ')); - } - - this._container.innerHTML = prefixAndAttribs.join(' | '); - }, - - _onLayerAdd: function (e) { - if (e.layer.getAttribution) { - this.addAttribution(e.layer.getAttribution()); - } - }, - - _onLayerRemove: function (e) { - if (e.layer.getAttribution) { - this.removeAttribution(e.layer.getAttribution()); - } - } -}); - -L.Map.mergeOptions({ - attributionControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.attributionControl) { - this.attributionControl = (new L.Control.Attribution()).addTo(this); - } -}); - -L.control.attribution = function (options) { - return new L.Control.Attribution(options); -}; diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js deleted file mode 100644 index 6fc2cbcbeb7..00000000000 --- a/src/control/Control.Layers.js +++ /dev/null @@ -1,252 +0,0 @@ -/* - * L.Control.Layers is a control to allow users to switch between different layers on the map. - */ - -L.Control.Layers = L.Control.extend({ - options: { - collapsed: true, - position: 'topright', - autoZIndex: true - }, - - initialize: function (baseLayers, overlays, options) { - L.setOptions(this, options); - - this._layers = {}; - this._lastZIndex = 0; - this._handlingClick = false; - - for (var i in baseLayers) { - this._addLayer(baseLayers[i], i); - } - - for (i in overlays) { - this._addLayer(overlays[i], i, true); - } - }, - - onAdd: function (map) { - this._initLayout(); - this._update(); - - map - .on('layeradd', this._onLayerChange, this) - .on('layerremove', this._onLayerChange, this); - - return this._container; - }, - - onRemove: function (map) { - map - .off('layeradd', this._onLayerChange) - .off('layerremove', this._onLayerChange); - }, - - addBaseLayer: function (layer, name) { - this._addLayer(layer, name); - this._update(); - return this; - }, - - addOverlay: function (layer, name) { - this._addLayer(layer, name, true); - this._update(); - return this; - }, - - removeLayer: function (layer) { - var id = L.stamp(layer); - delete this._layers[id]; - this._update(); - return this; - }, - - _initLayout: function () { - var className = 'leaflet-control-layers', - container = this._container = L.DomUtil.create('div', className); - - //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released - container.setAttribute('aria-haspopup', true); - - if (!L.Browser.touch) { - L.DomEvent - .disableClickPropagation(container) - .disableScrollPropagation(container); - } else { - L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); - } - - var form = this._form = L.DomUtil.create('form', className + '-list'); - - if (this.options.collapsed) { - if (!L.Browser.android) { - L.DomEvent - .on(container, 'mouseover', this._expand, this) - .on(container, 'mouseout', this._collapse, this); - } - var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container); - link.href = '#'; - link.title = 'Layers'; - - if (L.Browser.touch) { - L.DomEvent - .on(link, 'click', L.DomEvent.stop) - .on(link, 'click', this._expand, this); - } - else { - L.DomEvent.on(link, 'focus', this._expand, this); - } - //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033 - L.DomEvent.on(form, 'click', function () { - setTimeout(L.bind(this._onInputClick, this), 0); - }, this); - - this._map.on('click', this._collapse, this); - // TODO keyboard accessibility - } else { - this._expand(); - } - - this._baseLayersList = L.DomUtil.create('div', className + '-base', form); - this._separator = L.DomUtil.create('div', className + '-separator', form); - this._overlaysList = L.DomUtil.create('div', className + '-overlays', form); - - container.appendChild(form); - }, - - _addLayer: function (layer, name, overlay) { - var id = L.stamp(layer); - - this._layers[id] = { - layer: layer, - name: name, - overlay: overlay - }; - - if (this.options.autoZIndex && layer.setZIndex) { - this._lastZIndex++; - layer.setZIndex(this._lastZIndex); - } - }, - - _update: function () { - if (!this._container) { - return; - } - - this._baseLayersList.innerHTML = ''; - this._overlaysList.innerHTML = ''; - - var baseLayersPresent = false, - overlaysPresent = false, - i, obj; - - for (i in this._layers) { - obj = this._layers[i]; - this._addItem(obj); - overlaysPresent = overlaysPresent || obj.overlay; - baseLayersPresent = baseLayersPresent || !obj.overlay; - } - - this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; - }, - - _onLayerChange: function (e) { - var obj = this._layers[L.stamp(e.layer)]; - - if (!obj) { return; } - - if (!this._handlingClick) { - this._update(); - } - - var type = obj.overlay ? - (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') : - (e.type === 'layeradd' ? 'baselayerchange' : null); - - if (type) { - this._map.fire(type, obj); - } - }, - - // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) - _createRadioElement: function (name, checked) { - - var radioHtml = ' 0) { - maxMeters = dist * (options.maxWidth / size.x); - } - - this._updateScales(options, maxMeters); - }, - - _updateScales: function (options, maxMeters) { - if (options.metric && maxMeters) { - this._updateMetric(maxMeters); - } - - if (options.imperial && maxMeters) { - this._updateImperial(maxMeters); - } - }, - - _updateMetric: function (maxMeters) { - var meters = this._getRoundNum(maxMeters); - - this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px'; - this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; - }, - - _updateImperial: function (maxMeters) { - var maxFeet = maxMeters * 3.2808399, - scale = this._iScale, - maxMiles, miles, feet; - - if (maxFeet > 5280) { - maxMiles = maxFeet / 5280; - miles = this._getRoundNum(maxMiles); - - scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px'; - scale.innerHTML = miles + ' mi'; - - } else { - feet = this._getRoundNum(maxFeet); - - scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px'; - scale.innerHTML = feet + ' ft'; - } - }, - - _getScaleWidth: function (ratio) { - return Math.round(this.options.maxWidth * ratio) - 10; - }, - - _getRoundNum: function (num) { - var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), - d = num / pow10; - - d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; - - return pow10 * d; - } -}); - -L.control.scale = function (options) { - return new L.Control.Scale(options); -}; diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js deleted file mode 100644 index 5acfc560e49..00000000000 --- a/src/control/Control.Zoom.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * L.Control.Zoom is used for the default zoom buttons on the map. - */ - -L.Control.Zoom = L.Control.extend({ - options: { - position: 'topleft', - zoomInText: '+', - zoomInTitle: 'Zoom in', - zoomOutText: '-', - zoomOutTitle: 'Zoom out' - }, - - onAdd: function (map) { - var zoomName = 'leaflet-control-zoom', - container = L.DomUtil.create('div', zoomName + ' leaflet-bar'); - - this._map = map; - - this._zoomInButton = this._createButton( - this.options.zoomInText, this.options.zoomInTitle, - zoomName + '-in', container, this._zoomIn, this); - this._zoomOutButton = this._createButton( - this.options.zoomOutText, this.options.zoomOutTitle, - zoomName + '-out', container, this._zoomOut, this); - - this._updateDisabled(); - map.on('zoomend zoomlevelschange', this._updateDisabled, this); - - return container; - }, - - onRemove: function (map) { - map.off('zoomend zoomlevelschange', this._updateDisabled, this); - }, - - _zoomIn: function (e) { - this._map.zoomIn(e.shiftKey ? 3 : 1); - }, - - _zoomOut: function (e) { - this._map.zoomOut(e.shiftKey ? 3 : 1); - }, - - _createButton: function (html, title, className, container, fn, context) { - var link = L.DomUtil.create('a', className, container); - link.innerHTML = html; - link.href = '#'; - link.title = title; - - var stop = L.DomEvent.stopPropagation; - - L.DomEvent - .on(link, 'click', stop) - .on(link, 'mousedown', stop) - .on(link, 'dblclick', stop) - .on(link, 'click', L.DomEvent.preventDefault) - .on(link, 'click', fn, context) - .on(link, 'click', this._refocusOnMap, context); - - return link; - }, - - _updateDisabled: function () { - var map = this._map, - className = 'leaflet-disabled'; - - L.DomUtil.removeClass(this._zoomInButton, className); - L.DomUtil.removeClass(this._zoomOutButton, className); - - if (map._zoom === map.getMinZoom()) { - L.DomUtil.addClass(this._zoomOutButton, className); - } - if (map._zoom === map.getMaxZoom()) { - L.DomUtil.addClass(this._zoomInButton, className); - } - } -}); - -L.Map.mergeOptions({ - zoomControl: true -}); - -L.Map.addInitHook(function () { - if (this.options.zoomControl) { - this.zoomControl = new L.Control.Zoom(); - this.addControl(this.zoomControl); - } -}); - -L.control.zoom = function (options) { - return new L.Control.Zoom(options); -}; - diff --git a/src/control/Control.js b/src/control/Control.js deleted file mode 100644 index 0e65cf50e2f..00000000000 --- a/src/control/Control.js +++ /dev/null @@ -1,117 +0,0 @@ -/* - * L.Control is a base class for implementing map controls. Handles positioning. - * All other controls extend from this class. - */ - -L.Control = L.Class.extend({ - options: { - position: 'topright' - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - getPosition: function () { - return this.options.position; - }, - - setPosition: function (position) { - var map = this._map; - - if (map) { - map.removeControl(this); - } - - this.options.position = position; - - if (map) { - map.addControl(this); - } - - return this; - }, - - getContainer: function () { - return this._container; - }, - - addTo: function (map) { - this._map = map; - - var container = this._container = this.onAdd(map), - pos = this.getPosition(), - corner = map._controlCorners[pos]; - - L.DomUtil.addClass(container, 'leaflet-control'); - - if (pos.indexOf('bottom') !== -1) { - corner.insertBefore(container, corner.firstChild); - } else { - corner.appendChild(container); - } - - return this; - }, - - removeFrom: function (map) { - var pos = this.getPosition(), - corner = map._controlCorners[pos]; - - corner.removeChild(this._container); - this._map = null; - - if (this.onRemove) { - this.onRemove(map); - } - - return this; - }, - - _refocusOnMap: function () { - if (this._map) { - this._map.getContainer().focus(); - } - } -}); - -L.control = function (options) { - return new L.Control(options); -}; - - -// adds control-related methods to L.Map - -L.Map.include({ - addControl: function (control) { - control.addTo(this); - return this; - }, - - removeControl: function (control) { - control.removeFrom(this); - return this; - }, - - _initControlPos: function () { - var corners = this._controlCorners = {}, - l = 'leaflet-', - container = this._controlContainer = - L.DomUtil.create('div', l + 'control-container', this._container); - - function createCorner(vSide, hSide) { - var className = l + vSide + ' ' + l + hSide; - - corners[vSide + hSide] = L.DomUtil.create('div', className, container); - } - - createCorner('top', 'left'); - createCorner('top', 'right'); - createCorner('bottom', 'left'); - createCorner('bottom', 'right'); - }, - - _clearControlPos: function () { - this._container.removeChild(this._controlContainer); - } -}); diff --git a/src/copyright.js b/src/copyright.js deleted file mode 100644 index 375cccab0a0..00000000000 --- a/src/copyright.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com - (c) 2010-2013, Vladimir Agafonkin - (c) 2010-2011, CloudMade -*/ diff --git a/src/core/Browser.js b/src/core/Browser.js deleted file mode 100644 index 7b0c8adad5c..00000000000 --- a/src/core/Browser.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * L.Browser handles different browser and feature detections for internal Leaflet use. - */ - -(function () { - - var ie = 'ActiveXObject' in window, - ielt9 = ie && !document.addEventListener, - - // terrible browser detection to work around Safari / iOS / Android browser bugs - ua = navigator.userAgent.toLowerCase(), - webkit = ua.indexOf('webkit') !== -1, - chrome = ua.indexOf('chrome') !== -1, - phantomjs = ua.indexOf('phantom') !== -1, - android = ua.indexOf('android') !== -1, - android23 = ua.search('android [23]') !== -1, - gecko = ua.indexOf('gecko') !== -1, - - mobile = typeof orientation !== undefined + '', - msPointer = window.navigator && window.navigator.msPointerEnabled && - window.navigator.msMaxTouchPoints && !window.PointerEvent, - pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || - msPointer, - retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) || - ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') && - window.matchMedia('(min-resolution:144dpi)').matches), - - doc = document.documentElement, - ie3d = ie && ('transition' in doc.style), - webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23, - gecko3d = 'MozPerspective' in doc.style, - opera3d = 'OTransition' in doc.style, - any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs; - - - // PhantomJS has 'ontouchstart' in document.documentElement, but doesn't actually support touch. - // https://github.com/Leaflet/Leaflet/pull/1434#issuecomment-13843151 - - var touch = !window.L_NO_TOUCH && !phantomjs && (function () { - - var startName = 'ontouchstart'; - - // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc. - if (pointer || (startName in doc)) { - return true; - } - - // Firefox/Gecko - var div = document.createElement('div'), - supported = false; - - if (!div.setAttribute) { - return false; - } - div.setAttribute(startName, 'return;'); - - if (typeof div[startName] === 'function') { - supported = true; - } - - div.removeAttribute(startName); - div = null; - - return supported; - }()); - - - L.Browser = { - ie: ie, - ielt9: ielt9, - webkit: webkit, - gecko: gecko && !webkit && !window.opera && !ie, - - android: android, - android23: android23, - - chrome: chrome, - - ie3d: ie3d, - webkit3d: webkit3d, - gecko3d: gecko3d, - opera3d: opera3d, - any3d: any3d, - - mobile: mobile, - mobileWebkit: mobile && webkit, - mobileWebkit3d: mobile && webkit3d, - mobileOpera: mobile && window.opera, - - touch: touch, - msPointer: msPointer, - pointer: pointer, - - retina: retina - }; - -}()); diff --git a/src/core/Class.js b/src/core/Class.js deleted file mode 100644 index e5fc37844ef..00000000000 --- a/src/core/Class.js +++ /dev/null @@ -1,106 +0,0 @@ -/* - * L.Class powers the OOP facilities of the library. - * Thanks to John Resig and Dean Edwards for inspiration! - */ - -L.Class = function () {}; - -L.Class.extend = function (props) { - - // extended class with the new prototype - var NewClass = function () { - - // call the constructor - if (this.initialize) { - this.initialize.apply(this, arguments); - } - - // call all constructor hooks - if (this._initHooks) { - this.callInitHooks(); - } - }; - - // instantiate class without calling constructor - var F = function () {}; - F.prototype = this.prototype; - - var proto = new F(); - proto.constructor = NewClass; - - NewClass.prototype = proto; - - //inherit parent's statics - for (var i in this) { - if (this.hasOwnProperty(i) && i !== 'prototype') { - NewClass[i] = this[i]; - } - } - - // mix static properties into the class - if (props.statics) { - L.extend(NewClass, props.statics); - delete props.statics; - } - - // mix includes into the prototype - if (props.includes) { - L.Util.extend.apply(null, [proto].concat(props.includes)); - delete props.includes; - } - - // merge options - if (props.options && proto.options) { - props.options = L.extend({}, proto.options, props.options); - } - - // mix given properties into the prototype - L.extend(proto, props); - - proto._initHooks = []; - - var parent = this; - // jshint camelcase: false - NewClass.__super__ = parent.prototype; - - // add method for calling all hooks - proto.callInitHooks = function () { - - if (this._initHooksCalled) { return; } - - if (parent.prototype.callInitHooks) { - parent.prototype.callInitHooks.call(this); - } - - this._initHooksCalled = true; - - for (var i = 0, len = proto._initHooks.length; i < len; i++) { - proto._initHooks[i].call(this); - } - }; - - return NewClass; -}; - - -// method for adding properties to prototype -L.Class.include = function (props) { - L.extend(this.prototype, props); -}; - -// merge new default options to the Class -L.Class.mergeOptions = function (options) { - L.extend(this.prototype.options, options); -}; - -// add a constructor hook -L.Class.addInitHook = function (fn) { // (Function) || (String, args...) - var args = Array.prototype.slice.call(arguments, 1); - - var init = typeof fn === 'function' ? fn : function () { - this[fn].apply(this, args); - }; - - this.prototype._initHooks = this.prototype._initHooks || []; - this.prototype._initHooks.push(init); -}; diff --git a/src/core/Events.js b/src/core/Events.js deleted file mode 100644 index cd8b17af964..00000000000 --- a/src/core/Events.js +++ /dev/null @@ -1,178 +0,0 @@ -/* - * L.Mixin.Events is used to add custom events functionality to Leaflet classes. - */ - -var eventsKey = '_leaflet_events'; - -L.Mixin = {}; - -L.Mixin.Events = { - - addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) - - // types can be a map of types/handlers - if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey] = this[eventsKey] || {}, - contextId = context && context !== this && L.stamp(context), - i, len, event, type, indexKey, indexLenKey, typeIndex; - - // types can be a string of space-separated words - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - event = { - action: fn, - context: context || this - }; - type = types[i]; - - if (contextId) { - // store listeners of a particular context in a separate hash (if it has an id) - // gives a major performance boost when removing thousands of map layers - - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; - - typeIndex = events[indexKey] = events[indexKey] || {}; - - if (!typeIndex[contextId]) { - typeIndex[contextId] = []; - - // keep track of the number of keys in the index to quickly check if it's empty - events[indexLenKey] = (events[indexLenKey] || 0) + 1; - } - - typeIndex[contextId].push(event); - - - } else { - events[type] = events[type] || []; - events[type].push(event); - } - } - - return this; - }, - - hasEventListeners: function (type) { // (String) -> Boolean - var events = this[eventsKey]; - return !!events && ((type in events && events[type].length > 0) || - (type + '_idx' in events && events[type + '_idx_len'] > 0)); - }, - - removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object]) - - if (!this[eventsKey]) { - return this; - } - - if (!types) { - return this.clearAllEventListeners(); - } - - if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; } - - var events = this[eventsKey], - contextId = context && context !== this && L.stamp(context), - i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed; - - types = L.Util.splitWords(types); - - for (i = 0, len = types.length; i < len; i++) { - type = types[i]; - indexKey = type + '_idx'; - indexLenKey = indexKey + '_len'; - - typeIndex = events[indexKey]; - - if (!fn) { - // clear all listeners for a type if function isn't specified - delete events[type]; - delete events[indexKey]; - delete events[indexLenKey]; - - } else { - listeners = contextId && typeIndex ? typeIndex[contextId] : events[type]; - - if (listeners) { - for (j = listeners.length - 1; j >= 0; j--) { - if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) { - removed = listeners.splice(j, 1); - // set the old action to a no-op, because it is possible - // that the listener is being iterated over as part of a dispatch - removed[0].action = L.Util.falseFn; - } - } - - if (context && typeIndex && (listeners.length === 0)) { - delete typeIndex[contextId]; - events[indexLenKey]--; - } - } - } - } - - return this; - }, - - clearAllEventListeners: function () { - delete this[eventsKey]; - return this; - }, - - fireEvent: function (type, data) { // (String[, Object]) - if (!this.hasEventListeners(type)) { - return this; - } - - var event = L.Util.extend({}, data, { type: type, target: this }); - - var events = this[eventsKey], - listeners, i, len, typeIndex, contextId; - - if (events[type]) { - // make sure adding/removing listeners inside other listeners won't cause infinite loop - listeners = events[type].slice(); - - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context, event); - } - } - - // fire event for the context-indexed listeners as well - typeIndex = events[type + '_idx']; - - for (contextId in typeIndex) { - listeners = typeIndex[contextId].slice(); - - if (listeners) { - for (i = 0, len = listeners.length; i < len; i++) { - listeners[i].action.call(listeners[i].context, event); - } - } - } - - return this; - }, - - addOneTimeEventListener: function (types, fn, context) { - - if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; } - - var handler = L.bind(function () { - this - .removeEventListener(types, fn, context) - .removeEventListener(types, handler, context); - }, this); - - return this - .addEventListener(types, fn, context) - .addEventListener(types, handler, context); - } -}; - -L.Mixin.Events.on = L.Mixin.Events.addEventListener; -L.Mixin.Events.off = L.Mixin.Events.removeEventListener; -L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener; -L.Mixin.Events.fire = L.Mixin.Events.fireEvent; diff --git a/src/core/Handler.js b/src/core/Handler.js deleted file mode 100644 index 9b121123261..00000000000 --- a/src/core/Handler.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - L.Handler is a base class for handler classes that are used internally to inject - interaction features like dragging to classes like Map and Marker. -*/ - -L.Handler = L.Class.extend({ - initialize: function (map) { - this._map = map; - }, - - enable: function () { - if (this._enabled) { return; } - - this._enabled = true; - this.addHooks(); - }, - - disable: function () { - if (!this._enabled) { return; } - - this._enabled = false; - this.removeHooks(); - }, - - enabled: function () { - return !!this._enabled; - } -}); diff --git a/src/core/Util.js b/src/core/Util.js deleted file mode 100644 index b903098930c..00000000000 --- a/src/core/Util.js +++ /dev/null @@ -1,182 +0,0 @@ -/* - * L.Util contains various utility functions used throughout Leaflet code. - */ - -L.Util = { - extend: function (dest) { // (Object[, Object, ...]) -> - var sources = Array.prototype.slice.call(arguments, 1), - i, j, len, src; - - for (j = 0, len = sources.length; j < len; j++) { - src = sources[j] || {}; - for (i in src) { - if (src.hasOwnProperty(i)) { - dest[i] = src[i]; - } - } - } - return dest; - }, - - bind: function (fn, obj) { // (Function, Object) -> Function - var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null; - return function () { - return fn.apply(obj, args || arguments); - }; - }, - - stamp: (function () { - var lastId = 0, - key = '_leaflet_id'; - return function (obj) { - obj[key] = obj[key] || ++lastId; - return obj[key]; - }; - }()), - - invokeEach: function (obj, method, context) { - var i, args; - - if (typeof obj === 'object') { - args = Array.prototype.slice.call(arguments, 3); - - for (i in obj) { - method.apply(context, [i, obj[i]].concat(args)); - } - return true; - } - - return false; - }, - - limitExecByInterval: function (fn, time, context) { - var lock, execOnUnlock; - - return function wrapperFn() { - var args = arguments; - - if (lock) { - execOnUnlock = true; - return; - } - - lock = true; - - setTimeout(function () { - lock = false; - - if (execOnUnlock) { - wrapperFn.apply(context, args); - execOnUnlock = false; - } - }, time); - - fn.apply(context, args); - }; - }, - - falseFn: function () { - return false; - }, - - formatNum: function (num, digits) { - var pow = Math.pow(10, digits || 5); - return Math.round(num * pow) / pow; - }, - - trim: function (str) { - return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); - }, - - splitWords: function (str) { - return L.Util.trim(str).split(/\s+/); - }, - - setOptions: function (obj, options) { - obj.options = L.extend({}, obj.options, options); - return obj.options; - }, - - getParamString: function (obj, existingUrl, uppercase) { - var params = []; - for (var i in obj) { - params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); - } - return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); - }, - template: function (str, data) { - return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { - var value = data[key]; - if (value === undefined) { - throw new Error('No value provided for variable ' + str); - } else if (typeof value === 'function') { - value = value(data); - } - return value; - }); - }, - - isArray: Array.isArray || function (obj) { - return (Object.prototype.toString.call(obj) === '[object Array]'); - }, - - emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' -}; - -(function () { - - // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - - function getPrefixed(name) { - var i, fn, - prefixes = ['webkit', 'moz', 'o', 'ms']; - - for (i = 0; i < prefixes.length && !fn; i++) { - fn = window[prefixes[i] + name]; - } - - return fn; - } - - var lastTime = 0; - - function timeoutDefer(fn) { - var time = +new Date(), - timeToCall = Math.max(0, 16 - (time - lastTime)); - - lastTime = time + timeToCall; - return window.setTimeout(fn, timeToCall); - } - - var requestFn = window.requestAnimationFrame || - getPrefixed('RequestAnimationFrame') || timeoutDefer; - - var cancelFn = window.cancelAnimationFrame || - getPrefixed('CancelAnimationFrame') || - getPrefixed('CancelRequestAnimationFrame') || - function (id) { window.clearTimeout(id); }; - - - L.Util.requestAnimFrame = function (fn, context, immediate, element) { - fn = L.bind(fn, context); - - if (immediate && requestFn === timeoutDefer) { - fn(); - } else { - return requestFn.call(window, fn, element); - } - }; - - L.Util.cancelAnimFrame = function (id) { - if (id) { - cancelFn.call(window, id); - } - }; - -}()); - -// shortcuts for most used utility functions -L.extend = L.Util.extend; -L.bind = L.Util.bind; -L.stamp = L.Util.stamp; -L.setOptions = L.Util.setOptions; diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js deleted file mode 100644 index 50d9bbac2fa..00000000000 --- a/src/dom/DomEvent.DoubleTap.js +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Extends the event handling code with double tap support for mobile browsers. - */ - -L.extend(L.DomEvent, { - - _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', - _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend', - - // inspired by Zepto touch code by Thomas Fuchs - addDoubleTapListener: function (obj, handler, id) { - var last, - doubleTap = false, - delay = 250, - touch, - pre = '_leaflet_', - touchstart = this._touchstart, - touchend = this._touchend, - trackedTouches = []; - - function onTouchStart(e) { - var count; - - if (L.Browser.pointer) { - trackedTouches.push(e.pointerId); - count = trackedTouches.length; - } else { - count = e.touches.length; - } - if (count > 1) { - return; - } - - var now = Date.now(), - delta = now - (last || now); - - touch = e.touches ? e.touches[0] : e; - doubleTap = (delta > 0 && delta <= delay); - last = now; - } - - function onTouchEnd(e) { - if (L.Browser.pointer) { - var idx = trackedTouches.indexOf(e.pointerId); - if (idx === -1) { - return; - } - trackedTouches.splice(idx, 1); - } - - if (doubleTap) { - if (L.Browser.pointer) { - // work around .type being readonly with MSPointer* events - var newTouch = { }, - prop; - - // jshint forin:false - for (var i in touch) { - prop = touch[i]; - if (typeof prop === 'function') { - newTouch[i] = prop.bind(touch); - } else { - newTouch[i] = prop; - } - } - touch = newTouch; - } - touch.type = 'dblclick'; - handler(touch); - last = null; - } - } - obj[pre + touchstart + id] = onTouchStart; - obj[pre + touchend + id] = onTouchEnd; - - // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen - // will not come through to us, so we will lose track of how many touches are ongoing - var endElement = L.Browser.pointer ? document.documentElement : obj; - - obj.addEventListener(touchstart, onTouchStart, false); - endElement.addEventListener(touchend, onTouchEnd, false); - - if (L.Browser.pointer) { - endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false); - } - - return this; - }, - - removeDoubleTapListener: function (obj, id) { - var pre = '_leaflet_'; - - obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); - (L.Browser.pointer ? document.documentElement : obj).removeEventListener( - this._touchend, obj[pre + this._touchend + id], false); - - if (L.Browser.pointer) { - document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], - false); - } - - return this; - } -}); diff --git a/src/dom/DomEvent.Pointer.js b/src/dom/DomEvent.Pointer.js deleted file mode 100644 index 4957fcd10e8..00000000000 --- a/src/dom/DomEvent.Pointer.js +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. - */ - -L.extend(L.DomEvent, { - - //static - POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown', - POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove', - POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup', - POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel', - - _pointers: [], - _pointerDocumentListener: false, - - // Provides a touch events wrapper for (ms)pointer events. - // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019 - //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 - - addPointerListener: function (obj, type, handler, id) { - - switch (type) { - case 'touchstart': - return this.addPointerListenerStart(obj, type, handler, id); - case 'touchend': - return this.addPointerListenerEnd(obj, type, handler, id); - case 'touchmove': - return this.addPointerListenerMove(obj, type, handler, id); - default: - throw 'Unknown touch event type'; - } - }, - - addPointerListenerStart: function (obj, type, handler, id) { - var pre = '_leaflet_', - pointers = this._pointers; - - var cb = function (e) { - - L.DomEvent.preventDefault(e); - - var alreadyInArray = false; - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - alreadyInArray = true; - break; - } - } - if (!alreadyInArray) { - pointers.push(e); - } - - e.touches = pointers.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchstart' + id] = cb; - obj.addEventListener(this.POINTER_DOWN, cb, false); - - // need to also listen for end events to keep the _pointers list accurate - // this needs to be on the body and never go away - if (!this._pointerDocumentListener) { - var internalCb = function (e) { - for (var i = 0; i < pointers.length; i++) { - if (pointers[i].pointerId === e.pointerId) { - pointers.splice(i, 1); - break; - } - } - }; - //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there - document.documentElement.addEventListener(this.POINTER_UP, internalCb, false); - document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false); - - this._pointerDocumentListener = true; - } - - return this; - }, - - addPointerListenerMove: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; - - function cb(e) { - - // don't fire touch moves when mouse isn't down - if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; } - - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches[i] = e; - break; - } - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - } - - obj[pre + 'touchmove' + id] = cb; - obj.addEventListener(this.POINTER_MOVE, cb, false); - - return this; - }, - - addPointerListenerEnd: function (obj, type, handler, id) { - var pre = '_leaflet_', - touches = this._pointers; - - var cb = function (e) { - for (var i = 0; i < touches.length; i++) { - if (touches[i].pointerId === e.pointerId) { - touches.splice(i, 1); - break; - } - } - - e.touches = touches.slice(); - e.changedTouches = [e]; - - handler(e); - }; - - obj[pre + 'touchend' + id] = cb; - obj.addEventListener(this.POINTER_UP, cb, false); - obj.addEventListener(this.POINTER_CANCEL, cb, false); - - return this; - }, - - removePointerListener: function (obj, type, id) { - var pre = '_leaflet_', - cb = obj[pre + type + id]; - - switch (type) { - case 'touchstart': - obj.removeEventListener(this.POINTER_DOWN, cb, false); - break; - case 'touchmove': - obj.removeEventListener(this.POINTER_MOVE, cb, false); - break; - case 'touchend': - obj.removeEventListener(this.POINTER_UP, cb, false); - obj.removeEventListener(this.POINTER_CANCEL, cb, false); - break; - } - - return this; - } -}); diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js deleted file mode 100644 index 950077d4624..00000000000 --- a/src/dom/DomEvent.js +++ /dev/null @@ -1,238 +0,0 @@ -/* - * L.DomEvent contains functions for working with DOM events. - */ - -L.DomEvent = { - /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */ - addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object]) - - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler, originalHandler, newType; - - if (obj[key]) { return this; } - - handler = function (e) { - return fn.call(context || obj, e || L.DomEvent._getEvent()); - }; - - if (L.Browser.pointer && type.indexOf('touch') === 0) { - return this.addPointerListener(obj, type, handler, id); - } - if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { - this.addDoubleTapListener(obj, handler, id); - } - - if ('addEventListener' in obj) { - - if (type === 'mousewheel') { - obj.addEventListener('DOMMouseScroll', handler, false); - obj.addEventListener(type, handler, false); - - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - - originalHandler = handler; - newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); - - handler = function (e) { - if (!L.DomEvent._checkMouse(obj, e)) { return; } - return originalHandler(e); - }; - - obj.addEventListener(newType, handler, false); - - } else if (type === 'click' && L.Browser.android) { - originalHandler = handler; - handler = function (e) { - return L.DomEvent._filterClick(e, originalHandler); - }; - - obj.addEventListener(type, handler, false); - } else { - obj.addEventListener(type, handler, false); - } - - } else if ('attachEvent' in obj) { - obj.attachEvent('on' + type, handler); - } - - obj[key] = handler; - - return this; - }, - - removeListener: function (obj, type, fn) { // (HTMLElement, String, Function) - - var id = L.stamp(fn), - key = '_leaflet_' + type + id, - handler = obj[key]; - - if (!handler) { return this; } - - if (L.Browser.pointer && type.indexOf('touch') === 0) { - this.removePointerListener(obj, type, id); - } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { - this.removeDoubleTapListener(obj, id); - - } else if ('removeEventListener' in obj) { - - if (type === 'mousewheel') { - obj.removeEventListener('DOMMouseScroll', handler, false); - obj.removeEventListener(type, handler, false); - - } else if ((type === 'mouseenter') || (type === 'mouseleave')) { - obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); - } else { - obj.removeEventListener(type, handler, false); - } - } else if ('detachEvent' in obj) { - obj.detachEvent('on' + type, handler); - } - - obj[key] = null; - - return this; - }, - - stopPropagation: function (e) { - - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - L.DomEvent._skipped(e); - - return this; - }, - - disableScrollPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; - - return L.DomEvent - .on(el, 'mousewheel', stop) - .on(el, 'MozMousePixelScroll', stop); - }, - - disableClickPropagation: function (el) { - var stop = L.DomEvent.stopPropagation; - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(el, L.Draggable.START[i], stop); - } - - return L.DomEvent - .on(el, 'click', L.DomEvent._fakeStop) - .on(el, 'dblclick', stop); - }, - - preventDefault: function (e) { - - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - } - return this; - }, - - stop: function (e) { - return L.DomEvent - .preventDefault(e) - .stopPropagation(e); - }, - - getMousePosition: function (e, container) { - if (!container) { - return new L.Point(e.clientX, e.clientY); - } - - var rect = container.getBoundingClientRect(); - - return new L.Point( - e.clientX - rect.left - container.clientLeft, - e.clientY - rect.top - container.clientTop); - }, - - getWheelDelta: function (e) { - - var delta = 0; - - if (e.wheelDelta) { - delta = e.wheelDelta / 120; - } - if (e.detail) { - delta = -e.detail / 3; - } - return delta; - }, - - _skipEvents: {}, - - _fakeStop: function (e) { - // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e) - L.DomEvent._skipEvents[e.type] = true; - }, - - _skipped: function (e) { - var skipped = this._skipEvents[e.type]; - // reset when checking, as it's only used in map container and propagates outside of the map - this._skipEvents[e.type] = false; - return skipped; - }, - - // check if element really left/entered the event target (for mouseenter/mouseleave) - _checkMouse: function (el, e) { - - var related = e.relatedTarget; - - if (!related) { return true; } - - try { - while (related && (related !== el)) { - related = related.parentNode; - } - } catch (err) { - return false; - } - return (related !== el); - }, - - _getEvent: function () { // evil magic for IE - /*jshint noarg:false */ - var e = window.event; - if (!e) { - var caller = arguments.callee.caller; - while (caller) { - e = caller['arguments'][0]; - if (e && window.Event === e.constructor) { - break; - } - caller = caller.caller; - } - } - return e; - }, - - // this is a horrible workaround for a bug in Android where a single touch triggers two click events - _filterClick: function (e, handler) { - var timeStamp = (e.timeStamp || e.originalEvent.timeStamp), - elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick); - - // are they closer together than 1000ms yet more than 100ms? - // Android typically triggers them ~300ms apart while multiple listeners - // on the same event should be triggered far faster; - // or check if click is simulated on the element, and if it is, reject any non-simulated events - - if ((elapsed && elapsed > 100 && elapsed < 1000) || (e.target._simulatedClick && !e._simulated)) { - L.DomEvent.stop(e); - return; - } - L.DomEvent._lastClick = timeStamp; - - return handler(e); - } -}; - -L.DomEvent.on = L.DomEvent.addListener; -L.DomEvent.off = L.DomEvent.removeListener; diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js deleted file mode 100644 index d9c6bf278e1..00000000000 --- a/src/dom/DomUtil.js +++ /dev/null @@ -1,289 +0,0 @@ -/* - * L.DomUtil contains various utility functions for working with DOM. - */ - -L.DomUtil = { - get: function (id) { - return (typeof id === 'string' ? document.getElementById(id) : id); - }, - - getStyle: function (el, style) { - - var value = el.style[style]; - - if (!value && el.currentStyle) { - value = el.currentStyle[style]; - } - - if ((!value || value === 'auto') && document.defaultView) { - var css = document.defaultView.getComputedStyle(el, null); - value = css ? css[style] : null; - } - - return value === 'auto' ? null : value; - }, - - getViewportOffset: function (element) { - - var top = 0, - left = 0, - el = element, - docBody = document.body, - docEl = document.documentElement, - pos; - - do { - top += el.offsetTop || 0; - left += el.offsetLeft || 0; - - //add borders - top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0; - left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0; - - pos = L.DomUtil.getStyle(el, 'position'); - - if (el.offsetParent === docBody && pos === 'absolute') { break; } - - if (pos === 'fixed') { - top += docBody.scrollTop || docEl.scrollTop || 0; - left += docBody.scrollLeft || docEl.scrollLeft || 0; - break; - } - - if (pos === 'relative' && !el.offsetLeft) { - var width = L.DomUtil.getStyle(el, 'width'), - maxWidth = L.DomUtil.getStyle(el, 'max-width'), - r = el.getBoundingClientRect(); - - if (width !== 'none' || maxWidth !== 'none') { - left += r.left + el.clientLeft; - } - - //calculate full y offset since we're breaking out of the loop - top += r.top + (docBody.scrollTop || docEl.scrollTop || 0); - - break; - } - - el = el.offsetParent; - - } while (el); - - el = element; - - do { - if (el === docBody) { break; } - - top -= el.scrollTop || 0; - left -= el.scrollLeft || 0; - - el = el.parentNode; - } while (el); - - return new L.Point(left, top); - }, - - documentIsLtr: function () { - if (!L.DomUtil._docIsLtrCached) { - L.DomUtil._docIsLtrCached = true; - L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr'; - } - return L.DomUtil._docIsLtr; - }, - - create: function (tagName, className, container) { - - var el = document.createElement(tagName); - el.className = className; - - if (container) { - container.appendChild(el); - } - - return el; - }, - - hasClass: function (el, name) { - if (el.classList !== undefined) { - return el.classList.contains(name); - } - var className = L.DomUtil._getClass(el); - return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); - }, - - addClass: function (el, name) { - if (el.classList !== undefined) { - var classes = L.Util.splitWords(name); - for (var i = 0, len = classes.length; i < len; i++) { - el.classList.add(classes[i]); - } - } else if (!L.DomUtil.hasClass(el, name)) { - var className = L.DomUtil._getClass(el); - L.DomUtil._setClass(el, (className ? className + ' ' : '') + name); - } - }, - - removeClass: function (el, name) { - if (el.classList !== undefined) { - el.classList.remove(name); - } else { - L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' '))); - } - }, - - _setClass: function (el, name) { - if (el.className.baseVal === undefined) { - el.className = name; - } else { - // in case of SVG element - el.className.baseVal = name; - } - }, - - _getClass: function (el) { - return el.className.baseVal === undefined ? el.className : el.className.baseVal; - }, - - setOpacity: function (el, value) { - - if ('opacity' in el.style) { - el.style.opacity = value; - - } else if ('filter' in el.style) { - - var filter = false, - filterName = 'DXImageTransform.Microsoft.Alpha'; - - // filters collection throws an error if we try to retrieve a filter that doesn't exist - try { - filter = el.filters.item(filterName); - } catch (e) { - // don't set opacity to 1 if we haven't already set an opacity, - // it isn't needed and breaks transparent pngs. - if (value === 1) { return; } - } - - value = Math.round(value * 100); - - if (filter) { - filter.Enabled = (value !== 100); - filter.Opacity = value; - } else { - el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; - } - } - }, - - testProp: function (props) { - - var style = document.documentElement.style; - - for (var i = 0; i < props.length; i++) { - if (props[i] in style) { - return props[i]; - } - } - return false; - }, - - getTranslateString: function (point) { - // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate - // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care - // (same speed either way), Opera 12 doesn't support translate3d - - var is3d = L.Browser.webkit3d, - open = 'translate' + (is3d ? '3d' : '') + '(', - close = (is3d ? ',0' : '') + ')'; - - return open + point.x + 'px,' + point.y + 'px' + close; - }, - - getScaleString: function (scale, origin) { - - var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))), - scaleStr = ' scale(' + scale + ') '; - - return preTranslateStr + scaleStr; - }, - - setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean]) - - // jshint camelcase: false - el._leaflet_pos = point; - - if (!disable3D && L.Browser.any3d) { - el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point); - } else { - el.style.left = point.x + 'px'; - el.style.top = point.y + 'px'; - } - }, - - getPosition: function (el) { - // this method is only used for elements previously positioned using setPosition, - // so it's safe to cache the position for performance - - // jshint camelcase: false - return el._leaflet_pos; - } -}; - - -// prefix style property names - -L.DomUtil.TRANSFORM = L.DomUtil.testProp( - ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']); - -// webkitTransition comes first because some browser versions that drop vendor prefix don't do -// the same for the transitionend event, in particular the Android 4.1 stock browser - -L.DomUtil.TRANSITION = L.DomUtil.testProp( - ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); - -L.DomUtil.TRANSITION_END = - L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ? - L.DomUtil.TRANSITION + 'End' : 'transitionend'; - -(function () { - if ('onselectstart' in document) { - L.extend(L.DomUtil, { - disableTextSelection: function () { - L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault); - }, - - enableTextSelection: function () { - L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault); - } - }); - } else { - var userSelectProperty = L.DomUtil.testProp( - ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); - - L.extend(L.DomUtil, { - disableTextSelection: function () { - if (userSelectProperty) { - var style = document.documentElement.style; - this._userSelect = style[userSelectProperty]; - style[userSelectProperty] = 'none'; - } - }, - - enableTextSelection: function () { - if (userSelectProperty) { - document.documentElement.style[userSelectProperty] = this._userSelect; - delete this._userSelect; - } - } - }); - } - - L.extend(L.DomUtil, { - disableImageDrag: function () { - L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault); - }, - - enableImageDrag: function () { - L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault); - } - }); -})(); diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js deleted file mode 100644 index d81790e80b5..00000000000 --- a/src/dom/Draggable.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too. - */ - -L.Draggable = L.Class.extend({ - includes: L.Mixin.Events, - - statics: { - START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'], - END: { - mousedown: 'mouseup', - touchstart: 'touchend', - pointerdown: 'touchend', - MSPointerDown: 'touchend' - }, - MOVE: { - mousedown: 'mousemove', - touchstart: 'touchmove', - pointerdown: 'touchmove', - MSPointerDown: 'touchmove' - } - }, - - initialize: function (element, dragStartTarget) { - this._element = element; - this._dragStartTarget = dragStartTarget || element; - }, - - enable: function () { - if (this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); - } - - this._enabled = true; - }, - - disable: function () { - if (!this._enabled) { return; } - - for (var i = L.Draggable.START.length - 1; i >= 0; i--) { - L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this); - } - - this._enabled = false; - this._moved = false; - }, - - _onDown: function (e) { - this._moved = false; - - if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } - - L.DomEvent.stopPropagation(e); - - if (L.Draggable._disabled) { return; } - - L.DomUtil.disableImageDrag(); - L.DomUtil.disableTextSelection(); - - if (this._moving) { return; } - - var first = e.touches ? e.touches[0] : e; - - this._startPoint = new L.Point(first.clientX, first.clientY); - this._startPos = this._newPos = L.DomUtil.getPosition(this._element); - - L.DomEvent - .on(document, L.Draggable.MOVE[e.type], this._onMove, this) - .on(document, L.Draggable.END[e.type], this._onUp, this); - }, - - _onMove: function (e) { - if (e.touches && e.touches.length > 1) { - this._moved = true; - return; - } - - var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), - newPoint = new L.Point(first.clientX, first.clientY), - offset = newPoint.subtract(this._startPoint); - - if (!offset.x && !offset.y) { return; } - - L.DomEvent.preventDefault(e); - - if (!this._moved) { - this.fire('dragstart'); - - this._moved = true; - this._startPos = L.DomUtil.getPosition(this._element).subtract(offset); - - L.DomUtil.addClass(document.body, 'leaflet-dragging'); - L.DomUtil.addClass((e.target || e.srcElement), 'leaflet-drag-target'); - } - - this._newPos = this._startPos.add(offset); - this._moving = true; - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget); - }, - - _updatePosition: function () { - this.fire('predrag'); - L.DomUtil.setPosition(this._element, this._newPos); - this.fire('drag'); - }, - - _onUp: function (e) { - L.DomUtil.removeClass(document.body, 'leaflet-dragging'); - L.DomUtil.removeClass((e.target || e.srcElement), 'leaflet-drag-target'); - - for (var i in L.Draggable.MOVE) { - L.DomEvent - .off(document, L.Draggable.MOVE[i], this._onMove) - .off(document, L.Draggable.END[i], this._onUp); - } - - L.DomUtil.enableImageDrag(); - L.DomUtil.enableTextSelection(); - - if (this._moved && this._moving) { - // ensure drag is not fired after dragend - L.Util.cancelAnimFrame(this._animRequest); - - this.fire('dragend', { - distance: this._newPos.distanceTo(this._startPos) - }); - } - - this._moving = false; - } -}); diff --git a/src/dom/PosAnimation.Timer.js b/src/dom/PosAnimation.Timer.js deleted file mode 100644 index 52faf981b41..00000000000 --- a/src/dom/PosAnimation.Timer.js +++ /dev/null @@ -1,67 +0,0 @@ -/* - * L.PosAnimation fallback implementation that powers Leaflet pan animations - * in browsers that don't support CSS3 Transitions. - */ - -L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({ - - run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) - this.stop(); - - this._el = el; - this._inProgress = true; - this._duration = duration || 0.25; - this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); - - this._startPos = L.DomUtil.getPosition(el); - this._offset = newPos.subtract(this._startPos); - this._startTime = +new Date(); - - this.fire('start'); - - this._animate(); - }, - - stop: function () { - if (!this._inProgress) { return; } - - this._step(); - this._complete(); - }, - - _animate: function () { - // animation loop - this._animId = L.Util.requestAnimFrame(this._animate, this); - this._step(); - }, - - _step: function () { - var elapsed = (+new Date()) - this._startTime, - duration = this._duration * 1000; - - if (elapsed < duration) { - this._runFrame(this._easeOut(elapsed / duration)); - } else { - this._runFrame(1); - this._complete(); - } - }, - - _runFrame: function (progress) { - var pos = this._startPos.add(this._offset.multiplyBy(progress)); - L.DomUtil.setPosition(this._el, pos); - - this.fire('step'); - }, - - _complete: function () { - L.Util.cancelAnimFrame(this._animId); - - this._inProgress = false; - this.fire('end'); - }, - - _easeOut: function (t) { - return 1 - Math.pow(1 - t, this._easeOutPower); - } -}); diff --git a/src/dom/PosAnimation.js b/src/dom/PosAnimation.js deleted file mode 100644 index 4dddda27757..00000000000 --- a/src/dom/PosAnimation.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * L.PosAnimation is used by Leaflet internally for pan animations. - */ - -L.PosAnimation = L.Class.extend({ - includes: L.Mixin.Events, - - run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) - this.stop(); - - this._el = el; - this._inProgress = true; - this._newPos = newPos; - - this.fire('start'); - - el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) + - 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)'; - - L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); - L.DomUtil.setPosition(el, newPos); - - // toggle reflow, Chrome flickers for some reason if you don't do this - L.Util.falseFn(el.offsetWidth); - - // there's no native way to track value updates of transitioned properties, so we imitate this - this._stepTimer = setInterval(L.bind(this._onStep, this), 50); - }, - - stop: function () { - if (!this._inProgress) { return; } - - // if we just removed the transition property, the element would jump to its final position, - // so we need to make it stay at the current position - - L.DomUtil.setPosition(this._el, this._getPos()); - this._onTransitionEnd(); - L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation - }, - - _onStep: function () { - var stepPos = this._getPos(); - if (!stepPos) { - this._onTransitionEnd(); - return; - } - // jshint camelcase: false - // make L.DomUtil.getPosition return intermediate position value during animation - this._el._leaflet_pos = stepPos; - - this.fire('step'); - }, - - // you can't easily get intermediate values of properties animated with CSS3 Transitions, - // we need to parse computed style (in case of transform it returns matrix string) - - _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/, - - _getPos: function () { - var left, top, matches, - el = this._el, - style = window.getComputedStyle(el); - - if (L.Browser.any3d) { - matches = style[L.DomUtil.TRANSFORM].match(this._transformRe); - if (!matches) { return; } - left = parseFloat(matches[1]); - top = parseFloat(matches[2]); - } else { - left = parseFloat(style.left); - top = parseFloat(style.top); - } - - return new L.Point(left, top, true); - }, - - _onTransitionEnd: function () { - L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); - - if (!this._inProgress) { return; } - this._inProgress = false; - - this._el.style[L.DomUtil.TRANSITION] = ''; - - // jshint camelcase: false - // make sure L.DomUtil.getPosition returns the final position value after animation - this._el._leaflet_pos = this._newPos; - - clearInterval(this._stepTimer); - - this.fire('step').fire('end'); - } - -}); diff --git a/src/geo/LatLng.js b/src/geo/LatLng.js deleted file mode 100644 index 9b0e9c50033..00000000000 --- a/src/geo/LatLng.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * L.LatLng represents a geographical point with latitude and longitude coordinates. - */ - -L.LatLng = function (lat, lng, alt) { // (Number, Number, Number) - lat = parseFloat(lat); - lng = parseFloat(lng); - - if (isNaN(lat) || isNaN(lng)) { - throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); - } - - this.lat = lat; - this.lng = lng; - - if (alt !== undefined) { - this.alt = parseFloat(alt); - } -}; - -L.extend(L.LatLng, { - DEG_TO_RAD: Math.PI / 180, - RAD_TO_DEG: 180 / Math.PI, - MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check -}); - -L.LatLng.prototype = { - equals: function (obj) { // (LatLng) -> Boolean - if (!obj) { return false; } - - obj = L.latLng(obj); - - var margin = Math.max( - Math.abs(this.lat - obj.lat), - Math.abs(this.lng - obj.lng)); - - return margin <= L.LatLng.MAX_MARGIN; - }, - - toString: function (precision) { // (Number) -> String - return 'LatLng(' + - L.Util.formatNum(this.lat, precision) + ', ' + - L.Util.formatNum(this.lng, precision) + ')'; - }, - - // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula - // TODO move to projection code, LatLng shouldn't know about Earth - distanceTo: function (other) { // (LatLng) -> Number - other = L.latLng(other); - - var R = 6378137, // earth radius in meters - d2r = L.LatLng.DEG_TO_RAD, - dLat = (other.lat - this.lat) * d2r, - dLon = (other.lng - this.lng) * d2r, - lat1 = this.lat * d2r, - lat2 = other.lat * d2r, - sin1 = Math.sin(dLat / 2), - sin2 = Math.sin(dLon / 2); - - var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2); - - return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - }, - - wrap: function (a, b) { // (Number, Number) -> LatLng - var lng = this.lng; - - a = a || -180; - b = b || 180; - - lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a); - - return new L.LatLng(this.lat, lng); - } -}; - -L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number) - if (a instanceof L.LatLng) { - return a; - } - if (L.Util.isArray(a)) { - if (typeof a[0] === 'number' || typeof a[0] === 'string') { - return new L.LatLng(a[0], a[1], a[2]); - } else { - return null; - } - } - if (a === undefined || a === null) { - return a; - } - if (typeof a === 'object' && 'lat' in a) { - return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon); - } - if (b === undefined) { - return null; - } - return new L.LatLng(a, b); -}; - diff --git a/src/geo/LatLngBounds.js b/src/geo/LatLngBounds.js deleted file mode 100644 index 6fda3a883ef..00000000000 --- a/src/geo/LatLngBounds.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * L.LatLngBounds represents a rectangular area on the map in geographical coordinates. - */ - -L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[]) - if (!southWest) { return; } - - var latlngs = northEast ? [southWest, northEast] : southWest; - - for (var i = 0, len = latlngs.length; i < len; i++) { - this.extend(latlngs[i]); - } -}; - -L.LatLngBounds.prototype = { - // extend the bounds to contain the given point or bounds - extend: function (obj) { // (LatLng) or (LatLngBounds) - if (!obj) { return this; } - - var latLng = L.latLng(obj); - if (latLng !== null) { - obj = latLng; - } else { - obj = L.latLngBounds(obj); - } - - if (obj instanceof L.LatLng) { - if (!this._southWest && !this._northEast) { - this._southWest = new L.LatLng(obj.lat, obj.lng); - this._northEast = new L.LatLng(obj.lat, obj.lng); - } else { - this._southWest.lat = Math.min(obj.lat, this._southWest.lat); - this._southWest.lng = Math.min(obj.lng, this._southWest.lng); - - this._northEast.lat = Math.max(obj.lat, this._northEast.lat); - this._northEast.lng = Math.max(obj.lng, this._northEast.lng); - } - } else if (obj instanceof L.LatLngBounds) { - this.extend(obj._southWest); - this.extend(obj._northEast); - } - return this; - }, - - // extend the bounds by a percentage - pad: function (bufferRatio) { // (Number) -> LatLngBounds - var sw = this._southWest, - ne = this._northEast, - heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, - widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; - - return new L.LatLngBounds( - new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), - new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); - }, - - getCenter: function () { // -> LatLng - return new L.LatLng( - (this._southWest.lat + this._northEast.lat) / 2, - (this._southWest.lng + this._northEast.lng) / 2); - }, - - getSouthWest: function () { - return this._southWest; - }, - - getNorthEast: function () { - return this._northEast; - }, - - getNorthWest: function () { - return new L.LatLng(this.getNorth(), this.getWest()); - }, - - getSouthEast: function () { - return new L.LatLng(this.getSouth(), this.getEast()); - }, - - getWest: function () { - return this._southWest.lng; - }, - - getSouth: function () { - return this._southWest.lat; - }, - - getEast: function () { - return this._northEast.lng; - }, - - getNorth: function () { - return this._northEast.lat; - }, - - contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean - if (typeof obj[0] === 'number' || obj instanceof L.LatLng) { - obj = L.latLng(obj); - } else { - obj = L.latLngBounds(obj); - } - - var sw = this._southWest, - ne = this._northEast, - sw2, ne2; - - if (obj instanceof L.LatLngBounds) { - sw2 = obj.getSouthWest(); - ne2 = obj.getNorthEast(); - } else { - sw2 = ne2 = obj; - } - - return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && - (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); - }, - - intersects: function (bounds) { // (LatLngBounds) - bounds = L.latLngBounds(bounds); - - var sw = this._southWest, - ne = this._northEast, - sw2 = bounds.getSouthWest(), - ne2 = bounds.getNorthEast(), - - latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), - lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); - - return latIntersects && lngIntersects; - }, - - toBBoxString: function () { - return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); - }, - - equals: function (bounds) { // (LatLngBounds) - if (!bounds) { return false; } - - bounds = L.latLngBounds(bounds); - - return this._southWest.equals(bounds.getSouthWest()) && - this._northEast.equals(bounds.getNorthEast()); - }, - - isValid: function () { - return !!(this._southWest && this._northEast); - } -}; - -//TODO International date line? - -L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng) - if (!a || a instanceof L.LatLngBounds) { - return a; - } - return new L.LatLngBounds(a, b); -}; diff --git a/src/geo/crs/CRS.EPSG3395.js b/src/geo/crs/CRS.EPSG3395.js deleted file mode 100644 index 786dec91f2f..00000000000 --- a/src/geo/crs/CRS.EPSG3395.js +++ /dev/null @@ -1,14 +0,0 @@ - -L.CRS.EPSG3395 = L.extend({}, L.CRS, { - code: 'EPSG:3395', - - projection: L.Projection.Mercator, - - transformation: (function () { - var m = L.Projection.Mercator, - r = m.R_MAJOR, - scale = 0.5 / (Math.PI * r); - - return new L.Transformation(scale, 0.5, -scale, 0.5); - }()) -}); diff --git a/src/geo/crs/CRS.EPSG3857.js b/src/geo/crs/CRS.EPSG3857.js deleted file mode 100644 index 23551a14c22..00000000000 --- a/src/geo/crs/CRS.EPSG3857.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping - * and is used by Leaflet by default. - */ - -L.CRS.EPSG3857 = L.extend({}, L.CRS, { - code: 'EPSG:3857', - - projection: L.Projection.SphericalMercator, - transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5), - - project: function (latlng) { // (LatLng) -> Point - var projectedPoint = this.projection.project(latlng), - earthRadius = 6378137; - return projectedPoint.multiplyBy(earthRadius); - } -}); - -L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, { - code: 'EPSG:900913' -}); diff --git a/src/geo/crs/CRS.EPSG4326.js b/src/geo/crs/CRS.EPSG4326.js deleted file mode 100644 index bcd33bdaf37..00000000000 --- a/src/geo/crs/CRS.EPSG4326.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists. - */ - -L.CRS.EPSG4326 = L.extend({}, L.CRS, { - code: 'EPSG:4326', - - projection: L.Projection.LonLat, - transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5) -}); diff --git a/src/geo/crs/CRS.Simple.js b/src/geo/crs/CRS.Simple.js deleted file mode 100644 index a492492563f..00000000000 --- a/src/geo/crs/CRS.Simple.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps. - */ - -L.CRS.Simple = L.extend({}, L.CRS, { - projection: L.Projection.LonLat, - transformation: new L.Transformation(1, 0, -1, 0), - - scale: function (zoom) { - return Math.pow(2, zoom); - } -}); diff --git a/src/geo/crs/CRS.js b/src/geo/crs/CRS.js deleted file mode 100644 index e577d8f42b0..00000000000 --- a/src/geo/crs/CRS.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet. - */ - -L.CRS = { - latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point - var projectedPoint = this.projection.project(latlng), - scale = this.scale(zoom); - - return this.transformation._transform(projectedPoint, scale); - }, - - pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng - var scale = this.scale(zoom), - untransformedPoint = this.transformation.untransform(point, scale); - - return this.projection.unproject(untransformedPoint); - }, - - project: function (latlng) { - return this.projection.project(latlng); - }, - - scale: function (zoom) { - return 256 * Math.pow(2, zoom); - }, - - getSize: function (zoom) { - var s = this.scale(zoom); - return L.point(s, s); - } -}; diff --git a/src/geo/projection/Projection.LonLat.js b/src/geo/projection/Projection.LonLat.js deleted file mode 100644 index 449dabae75f..00000000000 --- a/src/geo/projection/Projection.LonLat.js +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple. - */ - -L.Projection.LonLat = { - project: function (latlng) { - return new L.Point(latlng.lng, latlng.lat); - }, - - unproject: function (point) { - return new L.LatLng(point.y, point.x); - } -}; diff --git a/src/geo/projection/Projection.Mercator.js b/src/geo/projection/Projection.Mercator.js deleted file mode 100644 index 550c0da14e4..00000000000 --- a/src/geo/projection/Projection.Mercator.js +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Mercator projection that takes into account that the Earth is not a perfect sphere. - * Less popular than spherical mercator; used by projections like EPSG:3395. - */ - -L.Projection.Mercator = { - MAX_LATITUDE: 85.0840591556, - - R_MINOR: 6356752.314245179, - R_MAJOR: 6378137, - - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - r = this.R_MAJOR, - r2 = this.R_MINOR, - x = latlng.lng * d * r, - y = lat * d, - tmp = r2 / r, - eccent = Math.sqrt(1.0 - tmp * tmp), - con = eccent * Math.sin(y); - - con = Math.pow((1 - con) / (1 + con), eccent * 0.5); - - var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con; - y = -r * Math.log(ts); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - r = this.R_MAJOR, - r2 = this.R_MINOR, - lng = point.x * d / r, - tmp = r2 / r, - eccent = Math.sqrt(1 - (tmp * tmp)), - ts = Math.exp(- point.y / r), - phi = (Math.PI / 2) - 2 * Math.atan(ts), - numIter = 15, - tol = 1e-7, - i = numIter, - dphi = 0.1, - con; - - while ((Math.abs(dphi) > tol) && (--i > 0)) { - con = eccent * Math.sin(phi); - dphi = (Math.PI / 2) - 2 * Math.atan(ts * - Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi; - phi += dphi; - } - - return new L.LatLng(phi * d, lng); - } -}; diff --git a/src/geo/projection/Projection.SphericalMercator.js b/src/geo/projection/Projection.SphericalMercator.js deleted file mode 100644 index 0cf969f8d72..00000000000 --- a/src/geo/projection/Projection.SphericalMercator.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default. - */ - -L.Projection.SphericalMercator = { - MAX_LATITUDE: 85.0511287798, - - project: function (latlng) { // (LatLng) -> Point - var d = L.LatLng.DEG_TO_RAD, - max = this.MAX_LATITUDE, - lat = Math.max(Math.min(max, latlng.lat), -max), - x = latlng.lng * d, - y = lat * d; - - y = Math.log(Math.tan((Math.PI / 4) + (y / 2))); - - return new L.Point(x, y); - }, - - unproject: function (point) { // (Point, Boolean) -> LatLng - var d = L.LatLng.RAD_TO_DEG, - lng = point.x * d, - lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d; - - return new L.LatLng(lat, lng); - } -}; diff --git a/src/geo/projection/Projection.js b/src/geo/projection/Projection.js deleted file mode 100644 index 84316b3067d..00000000000 --- a/src/geo/projection/Projection.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - * L.Projection contains various geographical projections used by CRS classes. - */ - -L.Projection = {}; diff --git a/src/geometry/Bounds.js b/src/geometry/Bounds.js deleted file mode 100644 index 78ddc25c0e1..00000000000 --- a/src/geometry/Bounds.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * L.Bounds represents a rectangular area on the screen in pixel coordinates. - */ - -L.Bounds = function (a, b) { //(Point, Point) or Point[] - if (!a) { return; } - - var points = b ? [a, b] : a; - - for (var i = 0, len = points.length; i < len; i++) { - this.extend(points[i]); - } -}; - -L.Bounds.prototype = { - // extend the bounds to contain the given point - extend: function (point) { // (Point) - point = L.point(point); - - if (!this.min && !this.max) { - this.min = point.clone(); - this.max = point.clone(); - } else { - this.min.x = Math.min(point.x, this.min.x); - this.max.x = Math.max(point.x, this.max.x); - this.min.y = Math.min(point.y, this.min.y); - this.max.y = Math.max(point.y, this.max.y); - } - return this; - }, - - getCenter: function (round) { // (Boolean) -> Point - return new L.Point( - (this.min.x + this.max.x) / 2, - (this.min.y + this.max.y) / 2, round); - }, - - getBottomLeft: function () { // -> Point - return new L.Point(this.min.x, this.max.y); - }, - - getTopRight: function () { // -> Point - return new L.Point(this.max.x, this.min.y); - }, - - getSize: function () { - return this.max.subtract(this.min); - }, - - contains: function (obj) { // (Bounds) or (Point) -> Boolean - var min, max; - - if (typeof obj[0] === 'number' || obj instanceof L.Point) { - obj = L.point(obj); - } else { - obj = L.bounds(obj); - } - - if (obj instanceof L.Bounds) { - min = obj.min; - max = obj.max; - } else { - min = max = obj; - } - - return (min.x >= this.min.x) && - (max.x <= this.max.x) && - (min.y >= this.min.y) && - (max.y <= this.max.y); - }, - - intersects: function (bounds) { // (Bounds) -> Boolean - bounds = L.bounds(bounds); - - var min = this.min, - max = this.max, - min2 = bounds.min, - max2 = bounds.max, - xIntersects = (max2.x >= min.x) && (min2.x <= max.x), - yIntersects = (max2.y >= min.y) && (min2.y <= max.y); - - return xIntersects && yIntersects; - }, - - isValid: function () { - return !!(this.min && this.max); - } -}; - -L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[]) - if (!a || a instanceof L.Bounds) { - return a; - } - return new L.Bounds(a, b); -}; diff --git a/src/geometry/LineUtil.js b/src/geometry/LineUtil.js deleted file mode 100644 index 5b0631c94a1..00000000000 --- a/src/geometry/LineUtil.js +++ /dev/null @@ -1,202 +0,0 @@ -/* - * L.LineUtil contains different utility functions for line segments - * and polylines (clipping, simplification, distances, etc.) - */ - -/*jshint bitwise:false */ // allow bitwise operations for this file - -L.LineUtil = { - - // Simplify polyline with vertex reduction and Douglas-Peucker simplification. - // Improves rendering performance dramatically by lessening the number of points to draw. - - simplify: function (/*Point[]*/ points, /*Number*/ tolerance) { - if (!tolerance || !points.length) { - return points.slice(); - } - - var sqTolerance = tolerance * tolerance; - - // stage 1: vertex reduction - points = this._reducePoints(points, sqTolerance); - - // stage 2: Douglas-Peucker simplification - points = this._simplifyDP(points, sqTolerance); - - return points; - }, - - // distance from a point to a segment between two points - pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true)); - }, - - closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) { - return this._sqClosestPointOnSegment(p, p1, p2); - }, - - // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm - _simplifyDP: function (points, sqTolerance) { - - var len = points.length, - ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, - markers = new ArrayConstructor(len); - - markers[0] = markers[len - 1] = 1; - - this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1); - - var i, - newPoints = []; - - for (i = 0; i < len; i++) { - if (markers[i]) { - newPoints.push(points[i]); - } - } - - return newPoints; - }, - - _simplifyDPStep: function (points, markers, sqTolerance, first, last) { - - var maxSqDist = 0, - index, i, sqDist; - - for (i = first + 1; i <= last - 1; i++) { - sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true); - - if (sqDist > maxSqDist) { - index = i; - maxSqDist = sqDist; - } - } - - if (maxSqDist > sqTolerance) { - markers[index] = 1; - - this._simplifyDPStep(points, markers, sqTolerance, first, index); - this._simplifyDPStep(points, markers, sqTolerance, index, last); - } - }, - - // reduce points that are too close to each other to a single point - _reducePoints: function (points, sqTolerance) { - var reducedPoints = [points[0]]; - - for (var i = 1, prev = 0, len = points.length; i < len; i++) { - if (this._sqDist(points[i], points[prev]) > sqTolerance) { - reducedPoints.push(points[i]); - prev = i; - } - } - if (prev < len - 1) { - reducedPoints.push(points[len - 1]); - } - return reducedPoints; - }, - - // Cohen-Sutherland line clipping algorithm. - // Used to avoid rendering parts of a polyline that are not currently visible. - - clipSegment: function (a, b, bounds, useLastCode) { - var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds), - codeB = this._getBitCode(b, bounds), - - codeOut, p, newCode; - - // save 2nd code to avoid calculating it on the next segment - this._lastCode = codeB; - - while (true) { - // if a,b is inside the clip window (trivial accept) - if (!(codeA | codeB)) { - return [a, b]; - // if a,b is outside the clip window (trivial reject) - } else if (codeA & codeB) { - return false; - // other cases - } else { - codeOut = codeA || codeB; - p = this._getEdgeIntersection(a, b, codeOut, bounds); - newCode = this._getBitCode(p, bounds); - - if (codeOut === codeA) { - a = p; - codeA = newCode; - } else { - b = p; - codeB = newCode; - } - } - } - }, - - _getEdgeIntersection: function (a, b, code, bounds) { - var dx = b.x - a.x, - dy = b.y - a.y, - min = bounds.min, - max = bounds.max; - - if (code & 8) { // top - return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y); - } else if (code & 4) { // bottom - return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y); - } else if (code & 2) { // right - return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx); - } else if (code & 1) { // left - return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx); - } - }, - - _getBitCode: function (/*Point*/ p, bounds) { - var code = 0; - - if (p.x < bounds.min.x) { // left - code |= 1; - } else if (p.x > bounds.max.x) { // right - code |= 2; - } - if (p.y < bounds.min.y) { // bottom - code |= 4; - } else if (p.y > bounds.max.y) { // top - code |= 8; - } - - return code; - }, - - // square distance (to avoid unnecessary Math.sqrt calls) - _sqDist: function (p1, p2) { - var dx = p2.x - p1.x, - dy = p2.y - p1.y; - return dx * dx + dy * dy; - }, - - // return closest point on segment or distance to that point - _sqClosestPointOnSegment: function (p, p1, p2, sqDist) { - var x = p1.x, - y = p1.y, - dx = p2.x - x, - dy = p2.y - y, - dot = dx * dx + dy * dy, - t; - - if (dot > 0) { - t = ((p.x - x) * dx + (p.y - y) * dy) / dot; - - if (t > 1) { - x = p2.x; - y = p2.y; - } else if (t > 0) { - x += dx * t; - y += dy * t; - } - } - - dx = p.x - x; - dy = p.y - y; - - return sqDist ? dx * dx + dy * dy : new L.Point(x, y); - } -}; diff --git a/src/geometry/Point.js b/src/geometry/Point.js deleted file mode 100644 index 11fefe73fe4..00000000000 --- a/src/geometry/Point.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * L.Point represents a point with x and y coordinates. - */ - -L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) { - this.x = (round ? Math.round(x) : x); - this.y = (round ? Math.round(y) : y); -}; - -L.Point.prototype = { - - clone: function () { - return new L.Point(this.x, this.y); - }, - - // non-destructive, returns a new point - add: function (point) { - return this.clone()._add(L.point(point)); - }, - - // destructive, used directly for performance in situations where it's safe to modify existing point - _add: function (point) { - this.x += point.x; - this.y += point.y; - return this; - }, - - subtract: function (point) { - return this.clone()._subtract(L.point(point)); - }, - - _subtract: function (point) { - this.x -= point.x; - this.y -= point.y; - return this; - }, - - divideBy: function (num) { - return this.clone()._divideBy(num); - }, - - _divideBy: function (num) { - this.x /= num; - this.y /= num; - return this; - }, - - multiplyBy: function (num) { - return this.clone()._multiplyBy(num); - }, - - _multiplyBy: function (num) { - this.x *= num; - this.y *= num; - return this; - }, - - round: function () { - return this.clone()._round(); - }, - - _round: function () { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - }, - - floor: function () { - return this.clone()._floor(); - }, - - _floor: function () { - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); - return this; - }, - - distanceTo: function (point) { - point = L.point(point); - - var x = point.x - this.x, - y = point.y - this.y; - - return Math.sqrt(x * x + y * y); - }, - - equals: function (point) { - point = L.point(point); - - return point.x === this.x && - point.y === this.y; - }, - - contains: function (point) { - point = L.point(point); - - return Math.abs(point.x) <= Math.abs(this.x) && - Math.abs(point.y) <= Math.abs(this.y); - }, - - toString: function () { - return 'Point(' + - L.Util.formatNum(this.x) + ', ' + - L.Util.formatNum(this.y) + ')'; - } -}; - -L.point = function (x, y, round) { - if (x instanceof L.Point) { - return x; - } - if (L.Util.isArray(x)) { - return new L.Point(x[0], x[1]); - } - if (x === undefined || x === null) { - return x; - } - return new L.Point(x, y, round); -}; diff --git a/src/geometry/PolyUtil.js b/src/geometry/PolyUtil.js deleted file mode 100644 index 68aa36d8102..00000000000 --- a/src/geometry/PolyUtil.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * L.PolyUtil contains utility functions for polygons (clipping, etc.). - */ - -/*jshint bitwise:false */ // allow bitwise operations here - -L.PolyUtil = {}; - -/* - * Sutherland-Hodgeman polygon clipping algorithm. - * Used to avoid rendering parts of a polygon that are not currently visible. - */ -L.PolyUtil.clipPolygon = function (points, bounds) { - var clippedPoints, - edges = [1, 4, 2, 8], - i, j, k, - a, b, - len, edge, p, - lu = L.LineUtil; - - for (i = 0, len = points.length; i < len; i++) { - points[i]._code = lu._getBitCode(points[i], bounds); - } - - // for each edge (left, bottom, right, top) - for (k = 0; k < 4; k++) { - edge = edges[k]; - clippedPoints = []; - - for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { - a = points[i]; - b = points[j]; - - // if a is inside the clip window - if (!(a._code & edge)) { - // if b is outside the clip window (a->b goes out of screen) - if (b._code & edge) { - p = lu._getEdgeIntersection(b, a, edge, bounds); - p._code = lu._getBitCode(p, bounds); - clippedPoints.push(p); - } - clippedPoints.push(a); - - // else if b is inside the clip window (a->b enters the screen) - } else if (!(b._code & edge)) { - p = lu._getEdgeIntersection(b, a, edge, bounds); - p._code = lu._getBitCode(p, bounds); - clippedPoints.push(p); - } - } - points = clippedPoints; - } - - return points; -}; diff --git a/src/geometry/Transformation.js b/src/geometry/Transformation.js deleted file mode 100644 index df5c6ef574e..00000000000 --- a/src/geometry/Transformation.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix. - */ - -L.Transformation = function (a, b, c, d) { - this._a = a; - this._b = b; - this._c = c; - this._d = d; -}; - -L.Transformation.prototype = { - transform: function (point, scale) { // (Point, Number) -> Point - return this._transform(point.clone(), scale); - }, - - // destructive transform (faster) - _transform: function (point, scale) { - scale = scale || 1; - point.x = scale * (this._a * point.x + this._b); - point.y = scale * (this._c * point.y + this._d); - return point; - }, - - untransform: function (point, scale) { - scale = scale || 1; - return new L.Point( - (point.x / scale - this._b) / this._a, - (point.y / scale - this._d) / this._c); - } -}; diff --git a/src/images/layers.svg b/src/images/layers.svg deleted file mode 100644 index 1ee6ac16015..00000000000 --- a/src/images/layers.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/images/marker.svg b/src/images/marker.svg deleted file mode 100644 index 1b246fca030..00000000000 --- a/src/images/marker.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Use this one. - - - Select it and the area around with box select. - - - should be exactly 25x41 at 90dpi - - - - - How to do the inset border: - - - Delete the existing inset border. Select the background, duplicate. - - - Path, Dynamic offset. - - - Fill: None, Stroke Paint: RGBA #ffffff1f - - - Zoom down to the top and grab the diamond, drag it down and fiddle it untill it looks in line - - - with the main color layers border. - - - - diff --git a/src/layer/FeatureGroup.js b/src/layer/FeatureGroup.js deleted file mode 100644 index dbff15de04c..00000000000 --- a/src/layer/FeatureGroup.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods - * shared between a group of interactive layers (like vectors or markers). - */ - -L.FeatureGroup = L.LayerGroup.extend({ - includes: L.Mixin.Events, - - statics: { - EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose' - }, - - addLayer: function (layer) { - if (this.hasLayer(layer)) { - return this; - } - - if ('on' in layer) { - layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this); - } - - L.LayerGroup.prototype.addLayer.call(this, layer); - - if (this._popupContent && layer.bindPopup) { - layer.bindPopup(this._popupContent, this._popupOptions); - } - - return this.fire('layeradd', {layer: layer}); - }, - - removeLayer: function (layer) { - if (!this.hasLayer(layer)) { - return this; - } - if (layer in this._layers) { - layer = this._layers[layer]; - } - - layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this); - - L.LayerGroup.prototype.removeLayer.call(this, layer); - - if (this._popupContent) { - this.invoke('unbindPopup'); - } - - return this.fire('layerremove', {layer: layer}); - }, - - bindPopup: function (content, options) { - this._popupContent = content; - this._popupOptions = options; - return this.invoke('bindPopup', content, options); - }, - - openPopup: function (latlng) { - // open popup on the first layer - for (var id in this._layers) { - this._layers[id].openPopup(latlng); - break; - } - return this; - }, - - setStyle: function (style) { - return this.invoke('setStyle', style); - }, - - bringToFront: function () { - return this.invoke('bringToFront'); - }, - - bringToBack: function () { - return this.invoke('bringToBack'); - }, - - getBounds: function () { - var bounds = new L.LatLngBounds(); - - this.eachLayer(function (layer) { - bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds()); - }); - - return bounds; - }, - - _propagateEvent: function (e) { - e = L.extend({ - layer: e.target, - target: this - }, e); - this.fire(e.type, e); - } -}); - -L.featureGroup = function (layers) { - return new L.FeatureGroup(layers); -}; diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js deleted file mode 100644 index 6cc89c6b185..00000000000 --- a/src/layer/GeoJSON.js +++ /dev/null @@ -1,286 +0,0 @@ -/* - * L.GeoJSON turns any GeoJSON data into a Leaflet layer. - */ - -L.GeoJSON = L.FeatureGroup.extend({ - - initialize: function (geojson, options) { - L.setOptions(this, options); - - this._layers = {}; - - if (geojson) { - this.addData(geojson); - } - }, - - addData: function (geojson) { - var features = L.Util.isArray(geojson) ? geojson : geojson.features, - i, len, feature; - - if (features) { - for (i = 0, len = features.length; i < len; i++) { - // Only add this if geometry or geometries are set and not null - feature = features[i]; - if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { - this.addData(features[i]); - } - } - return this; - } - - var options = this.options; - - if (options.filter && !options.filter(geojson)) { return; } - - var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options); - layer.feature = L.GeoJSON.asFeature(geojson); - - layer.defaultOptions = layer.options; - this.resetStyle(layer); - - if (options.onEachFeature) { - options.onEachFeature(geojson, layer); - } - - return this.addLayer(layer); - }, - - resetStyle: function (layer) { - var style = this.options.style; - if (style) { - // reset any custom styles - L.Util.extend(layer.options, layer.defaultOptions); - - this._setLayerStyle(layer, style); - } - }, - - setStyle: function (style) { - this.eachLayer(function (layer) { - this._setLayerStyle(layer, style); - }, this); - }, - - _setLayerStyle: function (layer, style) { - if (typeof style === 'function') { - style = style(layer.feature); - } - if (layer.setStyle) { - layer.setStyle(style); - } - } -}); - -L.extend(L.GeoJSON, { - geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) { - var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, - coords = geometry.coordinates, - layers = [], - latlng, latlngs, i, len; - - coordsToLatLng = coordsToLatLng || this.coordsToLatLng; - - switch (geometry.type) { - case 'Point': - latlng = coordsToLatLng(coords); - return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng); - - case 'MultiPoint': - for (i = 0, len = coords.length; i < len; i++) { - latlng = coordsToLatLng(coords[i]); - layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng)); - } - return new L.FeatureGroup(layers); - - case 'LineString': - latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng); - return new L.Polyline(latlngs, vectorOptions); - - case 'Polygon': - if (coords.length === 2 && !coords[1].length) { - throw new Error('Invalid GeoJSON object.'); - } - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.Polygon(latlngs, vectorOptions); - - case 'MultiLineString': - latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng); - return new L.MultiPolyline(latlngs, vectorOptions); - - case 'MultiPolygon': - latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng); - return new L.MultiPolygon(latlngs, vectorOptions); - - case 'GeometryCollection': - for (i = 0, len = geometry.geometries.length; i < len; i++) { - - layers.push(this.geometryToLayer({ - geometry: geometry.geometries[i], - type: 'Feature', - properties: geojson.properties - }, pointToLayer, coordsToLatLng, vectorOptions)); - } - return new L.FeatureGroup(layers); - - default: - throw new Error('Invalid GeoJSON object.'); - } - }, - - coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng - return new L.LatLng(coords[1], coords[0], coords[2]); - }, - - coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array - var latlng, i, len, - latlngs = []; - - for (i = 0, len = coords.length; i < len; i++) { - latlng = levelsDeep ? - this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) : - (coordsToLatLng || this.coordsToLatLng)(coords[i]); - - latlngs.push(latlng); - } - - return latlngs; - }, - - latLngToCoords: function (latlng) { - var coords = [latlng.lng, latlng.lat]; - - if (latlng.alt !== undefined) { - coords.push(latlng.alt); - } - return coords; - }, - - latLngsToCoords: function (latLngs) { - var coords = []; - - for (var i = 0, len = latLngs.length; i < len; i++) { - coords.push(L.GeoJSON.latLngToCoords(latLngs[i])); - } - - return coords; - }, - - getFeature: function (layer, newGeometry) { - return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry); - }, - - asFeature: function (geoJSON) { - if (geoJSON.type === 'Feature') { - return geoJSON; - } - - return { - type: 'Feature', - properties: {}, - geometry: geoJSON - }; - } -}); - -var PointToGeoJSON = { - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'Point', - coordinates: L.GeoJSON.latLngToCoords(this.getLatLng()) - }); - } -}; - -L.Marker.include(PointToGeoJSON); -L.Circle.include(PointToGeoJSON); -L.CircleMarker.include(PointToGeoJSON); - -L.Polyline.include({ - toGeoJSON: function () { - return L.GeoJSON.getFeature(this, { - type: 'LineString', - coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs()) - }); - } -}); - -L.Polygon.include({ - toGeoJSON: function () { - var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())], - i, len, hole; - - coords[0].push(coords[0][0]); - - if (this._holes) { - for (i = 0, len = this._holes.length; i < len; i++) { - hole = L.GeoJSON.latLngsToCoords(this._holes[i]); - hole.push(hole[0]); - coords.push(hole); - } - } - - return L.GeoJSON.getFeature(this, { - type: 'Polygon', - coordinates: coords - }); - } -}); - -(function () { - function multiToGeoJSON(type) { - return function () { - var coords = []; - - this.eachLayer(function (layer) { - coords.push(layer.toGeoJSON().geometry.coordinates); - }); - - return L.GeoJSON.getFeature(this, { - type: type, - coordinates: coords - }); - }; - } - - L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')}); - L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')}); - - L.LayerGroup.include({ - toGeoJSON: function () { - - var geometry = this.feature && this.feature.geometry, - jsons = [], - json; - - if (geometry && geometry.type === 'MultiPoint') { - return multiToGeoJSON('MultiPoint').call(this); - } - - var isGeometryCollection = geometry && geometry.type === 'GeometryCollection'; - - this.eachLayer(function (layer) { - if (layer.toGeoJSON) { - json = layer.toGeoJSON(); - jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json)); - } - }); - - if (isGeometryCollection) { - return L.GeoJSON.getFeature(this, { - geometries: jsons, - type: 'GeometryCollection' - }); - } - - return { - type: 'FeatureCollection', - features: jsons - }; - } - }); -}()); - -L.geoJson = function (geojson, options) { - return new L.GeoJSON(geojson, options); -}; diff --git a/src/layer/ImageOverlay.js b/src/layer/ImageOverlay.js deleted file mode 100644 index 0248fa7e09f..00000000000 --- a/src/layer/ImageOverlay.js +++ /dev/null @@ -1,141 +0,0 @@ -/* - * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds). - */ - -L.ImageOverlay = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - opacity: 1 - }, - - initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) - this._url = url; - this._bounds = L.latLngBounds(bounds); - - L.setOptions(this, options); - }, - - onAdd: function (map) { - this._map = map; - - if (!this._image) { - this._initImage(); - } - - map._panes.overlayPane.appendChild(this._image); - - map.on('viewreset', this._reset, this); - - if (map.options.zoomAnimation && L.Browser.any3d) { - map.on('zoomanim', this._animateZoom, this); - } - - this._reset(); - }, - - onRemove: function (map) { - map.getPanes().overlayPane.removeChild(this._image); - - map.off('viewreset', this._reset, this); - - if (map.options.zoomAnimation) { - map.off('zoomanim', this._animateZoom, this); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - this._updateOpacity(); - return this; - }, - - // TODO remove bringToFront/bringToBack duplication from TileLayer/Path - bringToFront: function () { - if (this._image) { - this._map._panes.overlayPane.appendChild(this._image); - } - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.overlayPane; - if (this._image) { - pane.insertBefore(this._image, pane.firstChild); - } - return this; - }, - - setUrl: function (url) { - this._url = url; - this._image.src = this._url; - }, - - getAttribution: function () { - return this.options.attribution; - }, - - _initImage: function () { - this._image = L.DomUtil.create('img', 'leaflet-image-layer'); - - if (this._map.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._image, 'leaflet-zoom-animated'); - } else { - L.DomUtil.addClass(this._image, 'leaflet-zoom-hide'); - } - - this._updateOpacity(); - - //TODO createImage util method to remove duplication - L.extend(this._image, { - galleryimg: 'no', - onselectstart: L.Util.falseFn, - onmousemove: L.Util.falseFn, - onload: L.bind(this._onImageLoad, this), - src: this._url - }); - }, - - _animateZoom: function (e) { - var map = this._map, - image = this._image, - scale = map.getZoomScale(e.zoom), - nw = this._bounds.getNorthWest(), - se = this._bounds.getSouthEast(), - - topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center), - size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft), - origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale))); - - image.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') '; - }, - - _reset: function () { - var image = this._image, - topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()), - size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft); - - L.DomUtil.setPosition(image, topLeft); - - image.style.width = size.x + 'px'; - image.style.height = size.y + 'px'; - }, - - _onImageLoad: function () { - this.fire('load'); - }, - - _updateOpacity: function () { - L.DomUtil.setOpacity(this._image, this.options.opacity); - } -}); - -L.imageOverlay = function (url, bounds, options) { - return new L.ImageOverlay(url, bounds, options); -}; diff --git a/src/layer/LayerGroup.js b/src/layer/LayerGroup.js deleted file mode 100644 index 396df1aa4eb..00000000000 --- a/src/layer/LayerGroup.js +++ /dev/null @@ -1,115 +0,0 @@ -/* - * L.LayerGroup is a class to combine several layers into one so that - * you can manipulate the group (e.g. add/remove it) as one layer. - */ - -L.LayerGroup = L.Class.extend({ - initialize: function (layers) { - this._layers = {}; - - var i, len; - - if (layers) { - for (i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - } - }, - - addLayer: function (layer) { - var id = this.getLayerId(layer); - - this._layers[id] = layer; - - if (this._map) { - this._map.addLayer(layer); - } - - return this; - }, - - removeLayer: function (layer) { - var id = layer in this._layers ? layer : this.getLayerId(layer); - - if (this._map && this._layers[id]) { - this._map.removeLayer(this._layers[id]); - } - - delete this._layers[id]; - - return this; - }, - - hasLayer: function (layer) { - if (!layer) { return false; } - - return (layer in this._layers || this.getLayerId(layer) in this._layers); - }, - - clearLayers: function () { - this.eachLayer(this.removeLayer, this); - return this; - }, - - invoke: function (methodName) { - var args = Array.prototype.slice.call(arguments, 1), - i, layer; - - for (i in this._layers) { - layer = this._layers[i]; - - if (layer[methodName]) { - layer[methodName].apply(layer, args); - } - } - - return this; - }, - - onAdd: function (map) { - this._map = map; - this.eachLayer(map.addLayer, map); - }, - - onRemove: function (map) { - this.eachLayer(map.removeLayer, map); - this._map = null; - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - - getLayer: function (id) { - return this._layers[id]; - }, - - getLayers: function () { - var layers = []; - - for (var i in this._layers) { - layers.push(this._layers[i]); - } - return layers; - }, - - setZIndex: function (zIndex) { - return this.invoke('setZIndex', zIndex); - }, - - getLayerId: function (layer) { - return L.stamp(layer); - } -}); - -L.layerGroup = function (layers) { - return new L.LayerGroup(layers); -}; diff --git a/src/layer/Popup.js b/src/layer/Popup.js deleted file mode 100644 index 290499ef8d3..00000000000 --- a/src/layer/Popup.js +++ /dev/null @@ -1,338 +0,0 @@ -/* - * L.Popup is used for displaying popups on the map. - */ - -L.Map.mergeOptions({ - closePopupOnClick: true -}); - -L.Popup = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - minWidth: 50, - maxWidth: 300, - // maxHeight: null, - autoPan: true, - closeButton: true, - offset: [0, 7], - autoPanPadding: [5, 5], - // autoPanPaddingTopLeft: null, - // autoPanPaddingBottomRight: null, - keepInView: false, - className: '', - zoomAnimation: true - }, - - initialize: function (options, source) { - L.setOptions(this, options); - - this._source = source; - this._animated = L.Browser.any3d && this.options.zoomAnimation; - this._isOpen = false; - }, - - onAdd: function (map) { - this._map = map; - - if (!this._container) { - this._initLayout(); - } - - var animFade = map.options.fadeAnimation; - - if (animFade) { - L.DomUtil.setOpacity(this._container, 0); - } - map._panes.popupPane.appendChild(this._container); - - map.on(this._getEvents(), this); - - this.update(); - - if (animFade) { - L.DomUtil.setOpacity(this._container, 1); - } - - this.fire('open'); - - map.fire('popupopen', {popup: this}); - - if (this._source) { - this._source.fire('popupopen', {popup: this}); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - openOn: function (map) { - map.openPopup(this); - return this; - }, - - onRemove: function (map) { - map._panes.popupPane.removeChild(this._container); - - L.Util.falseFn(this._container.offsetWidth); // force reflow - - map.off(this._getEvents(), this); - - if (map.options.fadeAnimation) { - L.DomUtil.setOpacity(this._container, 0); - } - - this._map = null; - - this.fire('close'); - - map.fire('popupclose', {popup: this}); - - if (this._source) { - this._source.fire('popupclose', {popup: this}); - } - }, - - getLatLng: function () { - return this._latlng; - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - if (this._map) { - this._updatePosition(); - this._adjustPan(); - } - return this; - }, - - getContent: function () { - return this._content; - }, - - setContent: function (content) { - this._content = content; - this.update(); - return this; - }, - - update: function () { - if (!this._map) { return; } - - this._container.style.visibility = 'hidden'; - - this._updateContent(); - this._updateLayout(); - this._updatePosition(); - - this._container.style.visibility = ''; - - this._adjustPan(); - }, - - _getEvents: function () { - var events = { - viewreset: this._updatePosition - }; - - if (this._animated) { - events.zoomanim = this._zoomAnimation; - } - if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) { - events.preclick = this._close; - } - if (this.options.keepInView) { - events.moveend = this._adjustPan; - } - - return events; - }, - - _close: function () { - if (this._map) { - this._map.closePopup(this); - } - }, - - _initLayout: function () { - var prefix = 'leaflet-popup', - containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' + - (this._animated ? 'animated' : 'hide'), - container = this._container = L.DomUtil.create('div', containerClass), - closeButton; - - if (this.options.closeButton) { - closeButton = this._closeButton = - L.DomUtil.create('a', prefix + '-close-button', container); - closeButton.href = '#close'; - closeButton.innerHTML = '×'; - L.DomEvent.disableClickPropagation(closeButton); - - L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this); - } - - var wrapper = this._wrapper = - L.DomUtil.create('div', prefix + '-content-wrapper', container); - L.DomEvent.disableClickPropagation(wrapper); - - this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper); - - L.DomEvent.disableScrollPropagation(this._contentNode); - L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation); - - this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container); - this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); - }, - - _updateContent: function () { - if (!this._content) { return; } - - if (typeof this._content === 'string') { - this._contentNode.innerHTML = this._content; - } else { - while (this._contentNode.hasChildNodes()) { - this._contentNode.removeChild(this._contentNode.firstChild); - } - this._contentNode.appendChild(this._content); - } - this.fire('contentupdate'); - }, - - _updateLayout: function () { - var container = this._contentNode, - style = container.style; - - style.width = ''; - style.whiteSpace = 'nowrap'; - - var width = container.offsetWidth; - width = Math.min(width, this.options.maxWidth); - width = Math.max(width, this.options.minWidth); - - style.width = (width + 1) + 'px'; - style.whiteSpace = ''; - - style.height = ''; - - var height = container.offsetHeight, - maxHeight = this.options.maxHeight, - scrolledClass = 'leaflet-popup-scrolled'; - - if (maxHeight && height > maxHeight) { - style.height = maxHeight + 'px'; - L.DomUtil.addClass(container, scrolledClass); - } else { - L.DomUtil.removeClass(container, scrolledClass); - } - - this._containerWidth = this._container.offsetWidth; - }, - - _updatePosition: function () { - if (!this._map) { return; } - - var pos = this._map.latLngToLayerPoint(this._latlng), - animated = this._animated, - offset = L.point(this.options.offset); - - if (animated) { - L.DomUtil.setPosition(this._container, pos); - } - - this._containerBottom = -offset.y - (animated ? 0 : pos.y); - this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x); - - // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = this._containerBottom + 'px'; - this._container.style.left = this._containerLeft + 'px'; - }, - - _zoomAnimation: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center); - - L.DomUtil.setPosition(this._container, pos); - }, - - _adjustPan: function () { - if (!this.options.autoPan) { return; } - - var map = this._map, - containerHeight = this._container.offsetHeight, - containerWidth = this._containerWidth, - - layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom); - - if (this._animated) { - layerPos._add(L.DomUtil.getPosition(this._container)); - } - - var containerPos = map.layerPointToContainerPoint(layerPos), - padding = L.point(this.options.autoPanPadding), - paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding), - paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding), - size = map.getSize(), - dx = 0, - dy = 0; - - if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right - dx = containerPos.x + containerWidth - size.x + paddingBR.x; - } - if (containerPos.x - dx - paddingTL.x < 0) { // left - dx = containerPos.x - paddingTL.x; - } - if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom - dy = containerPos.y + containerHeight - size.y + paddingBR.y; - } - if (containerPos.y - dy - paddingTL.y < 0) { // top - dy = containerPos.y - paddingTL.y; - } - - if (dx || dy) { - map - .fire('autopanstart') - .panBy([dx, dy]); - } - }, - - _onCloseButtonClick: function (e) { - this._close(); - L.DomEvent.stop(e); - } -}); - -L.popup = function (options, source) { - return new L.Popup(options, source); -}; - - -L.Map.include({ - openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object]) - this.closePopup(); - - if (!(popup instanceof L.Popup)) { - var content = popup; - - popup = new L.Popup(options) - .setLatLng(latlng) - .setContent(content); - } - popup._isOpen = true; - - this._popup = popup; - return this.addLayer(popup); - }, - - closePopup: function (popup) { - if (!popup || popup === this._popup) { - popup = this._popup; - this._popup = null; - } - if (popup) { - this.removeLayer(popup); - popup._isOpen = false; - } - return this; - } -}); diff --git a/src/layer/marker/DivIcon.js b/src/layer/marker/DivIcon.js deleted file mode 100644 index 8c9a151f9bd..00000000000 --- a/src/layer/marker/DivIcon.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon) - * to use with L.Marker. - */ - -L.DivIcon = L.Icon.extend({ - options: { - iconSize: [12, 12], // also can be set through CSS - /* - iconAnchor: (Point) - popupAnchor: (Point) - html: (String) - bgPos: (Point) - */ - className: 'leaflet-div-icon', - html: false - }, - - createIcon: function (oldIcon) { - var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), - options = this.options; - - if (options.html !== false) { - div.innerHTML = options.html; - } else { - div.innerHTML = ''; - } - - if (options.bgPos) { - div.style.backgroundPosition = - (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; - } - - this._setIconStyles(div, 'icon'); - return div; - }, - - createShadow: function () { - return null; - } -}); - -L.divIcon = function (options) { - return new L.DivIcon(options); -}; diff --git a/src/layer/marker/Icon.Default.js b/src/layer/marker/Icon.Default.js deleted file mode 100644 index 3174040c5dc..00000000000 --- a/src/layer/marker/Icon.Default.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * L.Icon.Default is the blue marker icon used by default in Leaflet. - */ - -L.Icon.Default = L.Icon.extend({ - - options: { - iconSize: [25, 41], - iconAnchor: [12, 41], - popupAnchor: [1, -34], - - shadowSize: [41, 41] - }, - - _getIconUrl: function (name) { - var key = name + 'Url'; - - if (this.options[key]) { - return this.options[key]; - } - - if (L.Browser.retina && name === 'icon') { - name += '-2x'; - } - - var path = L.Icon.Default.imagePath; - - if (!path) { - throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.'); - } - - return path + '/marker-' + name + '.png'; - } -}); - -L.Icon.Default.imagePath = (function () { - var scripts = document.getElementsByTagName('script'), - leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/; - - var i, len, src, matches, path; - - for (i = 0, len = scripts.length; i < len; i++) { - src = scripts[i].src; - matches = src.match(leafletRe); - - if (matches) { - path = src.split(leafletRe)[0]; - return (path ? path + '/' : '') + 'images'; - } - } -}()); diff --git a/src/layer/marker/Icon.js b/src/layer/marker/Icon.js deleted file mode 100644 index 705462ac5c7..00000000000 --- a/src/layer/marker/Icon.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * L.Icon is an image-based icon class that you can use with L.Marker for custom markers. - */ - -L.Icon = L.Class.extend({ - options: { - /* - iconUrl: (String) (required) - iconRetinaUrl: (String) (optional, used for retina devices if detected) - iconSize: (Point) (can be set through CSS) - iconAnchor: (Point) (centered by default, can be set in CSS with negative margins) - popupAnchor: (Point) (if not specified, popup opens in the anchor point) - shadowUrl: (String) (no shadow by default) - shadowRetinaUrl: (String) (optional, used for retina devices if detected) - shadowSize: (Point) - shadowAnchor: (Point) - */ - className: '' - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - createIcon: function (oldIcon) { - return this._createIcon('icon', oldIcon); - }, - - createShadow: function (oldIcon) { - return this._createIcon('shadow', oldIcon); - }, - - _createIcon: function (name, oldIcon) { - var src = this._getIconUrl(name); - - if (!src) { - if (name === 'icon') { - throw new Error('iconUrl not set in Icon options (see the docs).'); - } - return null; - } - - var img; - if (!oldIcon || oldIcon.tagName !== 'IMG') { - img = this._createImg(src); - } else { - img = this._createImg(src, oldIcon); - } - this._setIconStyles(img, name); - - return img; - }, - - _setIconStyles: function (img, name) { - var options = this.options, - size = L.point(options[name + 'Size']), - anchor; - - if (name === 'shadow') { - anchor = L.point(options.shadowAnchor || options.iconAnchor); - } else { - anchor = L.point(options.iconAnchor); - } - - if (!anchor && size) { - anchor = size.divideBy(2, true); - } - - img.className = 'leaflet-marker-' + name + ' ' + options.className; - - if (anchor) { - img.style.marginLeft = (-anchor.x) + 'px'; - img.style.marginTop = (-anchor.y) + 'px'; - } - - if (size) { - img.style.width = size.x + 'px'; - img.style.height = size.y + 'px'; - } - }, - - _createImg: function (src, el) { - el = el || document.createElement('img'); - el.src = src; - return el; - }, - - _getIconUrl: function (name) { - if (L.Browser.retina && this.options[name + 'RetinaUrl']) { - return this.options[name + 'RetinaUrl']; - } - return this.options[name + 'Url']; - } -}); - -L.icon = function (options) { - return new L.Icon(options); -}; diff --git a/src/layer/marker/Marker.Drag.js b/src/layer/marker/Marker.Drag.js deleted file mode 100644 index 812439f83b0..00000000000 --- a/src/layer/marker/Marker.Drag.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. - */ - -L.Handler.MarkerDrag = L.Handler.extend({ - initialize: function (marker) { - this._marker = marker; - }, - - addHooks: function () { - var icon = this._marker._icon; - if (!this._draggable) { - this._draggable = new L.Draggable(icon, icon); - } - - this._draggable - .on('dragstart', this._onDragStart, this) - .on('drag', this._onDrag, this) - .on('dragend', this._onDragEnd, this); - this._draggable.enable(); - L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable'); - }, - - removeHooks: function () { - this._draggable - .off('dragstart', this._onDragStart, this) - .off('drag', this._onDrag, this) - .off('dragend', this._onDragEnd, this); - - this._draggable.disable(); - L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable'); - }, - - moved: function () { - return this._draggable && this._draggable._moved; - }, - - _onDragStart: function () { - this._marker - .closePopup() - .fire('movestart') - .fire('dragstart'); - }, - - _onDrag: function () { - var marker = this._marker, - shadow = marker._shadow, - iconPos = L.DomUtil.getPosition(marker._icon), - latlng = marker._map.layerPointToLatLng(iconPos); - - // update shadow position - if (shadow) { - L.DomUtil.setPosition(shadow, iconPos); - } - - marker._latlng = latlng; - - marker - .fire('move', {latlng: latlng}) - .fire('drag'); - }, - - _onDragEnd: function (e) { - this._marker - .fire('moveend') - .fire('dragend', e); - } -}); diff --git a/src/layer/marker/Marker.Popup.js b/src/layer/marker/Marker.Popup.js deleted file mode 100644 index e414d1bbcaf..00000000000 --- a/src/layer/marker/Marker.Popup.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Popup extension to L.Marker, adding popup-related methods. - */ - -L.Marker.include({ - openPopup: function () { - if (this._popup && this._map && !this._map.hasLayer(this._popup)) { - this._popup.setLatLng(this._latlng); - this._map.openPopup(this._popup); - } - - return this; - }, - - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, - - togglePopup: function () { - if (this._popup) { - if (this._popup._isOpen) { - this.closePopup(); - } else { - this.openPopup(); - } - } - return this; - }, - - bindPopup: function (content, options) { - var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]); - - anchor = anchor.add(L.Popup.prototype.options.offset); - - if (options && options.offset) { - anchor = anchor.add(options.offset); - } - - options = L.extend({offset: anchor}, options); - - if (!this._popupHandlersAdded) { - this - .on('click', this.togglePopup, this) - .on('remove', this.closePopup, this) - .on('move', this._movePopup, this); - this._popupHandlersAdded = true; - } - - if (content instanceof L.Popup) { - L.setOptions(content, options); - this._popup = content; - } else { - this._popup = new L.Popup(options, this) - .setContent(content); - } - - return this; - }, - - setPopupContent: function (content) { - if (this._popup) { - this._popup.setContent(content); - } - return this; - }, - - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this.togglePopup, this) - .off('remove', this.closePopup, this) - .off('move', this._movePopup, this); - this._popupHandlersAdded = false; - } - return this; - }, - - getPopup: function () { - return this._popup; - }, - - _movePopup: function (e) { - this._popup.setLatLng(e.latlng); - } -}); diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js deleted file mode 100644 index d0a0f7d047b..00000000000 --- a/src/layer/marker/Marker.js +++ /dev/null @@ -1,318 +0,0 @@ -/* - * L.Marker is used to display clickable/draggable icons on the map. - */ - -L.Marker = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - icon: new L.Icon.Default(), - title: '', - alt: '', - clickable: true, - draggable: false, - keyboard: true, - zIndexOffset: 0, - opacity: 1, - riseOnHover: false, - riseOffset: 250 - }, - - initialize: function (latlng, options) { - L.setOptions(this, options); - this._latlng = L.latLng(latlng); - }, - - onAdd: function (map) { - this._map = map; - - map.on('viewreset', this.update, this); - - this._initIcon(); - this.update(); - this.fire('add'); - - if (map.options.zoomAnimation && map.options.markerZoomAnimation) { - map.on('zoomanim', this._animateZoom, this); - } - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - if (this.dragging) { - this.dragging.disable(); - } - - this._removeIcon(); - this._removeShadow(); - - this.fire('remove'); - - map.off({ - 'viewreset': this.update, - 'zoomanim': this._animateZoom - }, this); - - this._map = null; - }, - - getLatLng: function () { - return this._latlng; - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - - this.update(); - - return this.fire('move', { latlng: this._latlng }); - }, - - setZIndexOffset: function (offset) { - this.options.zIndexOffset = offset; - this.update(); - - return this; - }, - - setIcon: function (icon) { - - this.options.icon = icon; - - if (this._map) { - this._initIcon(); - this.update(); - } - - if (this._popup) { - this.bindPopup(this._popup); - } - - return this; - }, - - update: function () { - if (this._icon) { - var pos = this._map.latLngToLayerPoint(this._latlng).round(); - this._setPos(pos); - } - - return this; - }, - - _initIcon: function () { - var options = this.options, - map = this._map, - animation = (map.options.zoomAnimation && map.options.markerZoomAnimation), - classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide'; - - var icon = options.icon.createIcon(this._icon), - addIcon = false; - - // if we're not reusing the icon, remove the old one and init new one - if (icon !== this._icon) { - if (this._icon) { - this._removeIcon(); - } - addIcon = true; - - if (options.title) { - icon.title = options.title; - } - - if (options.alt) { - icon.alt = options.alt; - } - } - - L.DomUtil.addClass(icon, classToAdd); - - if (options.keyboard) { - icon.tabIndex = '0'; - } - - this._icon = icon; - - this._initInteraction(); - - if (options.riseOnHover) { - L.DomEvent - .on(icon, 'mouseover', this._bringToFront, this) - .on(icon, 'mouseout', this._resetZIndex, this); - } - - var newShadow = options.icon.createShadow(this._shadow), - addShadow = false; - - if (newShadow !== this._shadow) { - this._removeShadow(); - addShadow = true; - } - - if (newShadow) { - L.DomUtil.addClass(newShadow, classToAdd); - } - this._shadow = newShadow; - - - if (options.opacity < 1) { - this._updateOpacity(); - } - - - var panes = this._map._panes; - - if (addIcon) { - panes.markerPane.appendChild(this._icon); - } - - if (newShadow && addShadow) { - panes.shadowPane.appendChild(this._shadow); - } - }, - - _removeIcon: function () { - if (this.options.riseOnHover) { - L.DomEvent - .off(this._icon, 'mouseover', this._bringToFront) - .off(this._icon, 'mouseout', this._resetZIndex); - } - - this._map._panes.markerPane.removeChild(this._icon); - - this._icon = null; - }, - - _removeShadow: function () { - if (this._shadow) { - this._map._panes.shadowPane.removeChild(this._shadow); - } - this._shadow = null; - }, - - _setPos: function (pos) { - L.DomUtil.setPosition(this._icon, pos); - - if (this._shadow) { - L.DomUtil.setPosition(this._shadow, pos); - } - - this._zIndex = pos.y + this.options.zIndexOffset; - - this._resetZIndex(); - }, - - _updateZIndex: function (offset) { - this._icon.style.zIndex = this._zIndex + offset; - }, - - _animateZoom: function (opt) { - var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); - - this._setPos(pos); - }, - - _initInteraction: function () { - - if (!this.options.clickable) { return; } - - // TODO refactor into something shared with Map/Path/etc. to DRY it up - - var icon = this._icon, - events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu']; - - L.DomUtil.addClass(icon, 'leaflet-clickable'); - L.DomEvent.on(icon, 'click', this._onMouseClick, this); - L.DomEvent.on(icon, 'keypress', this._onKeyPress, this); - - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(icon, events[i], this._fireMouseEvent, this); - } - - if (L.Handler.MarkerDrag) { - this.dragging = new L.Handler.MarkerDrag(this); - - if (this.options.draggable) { - this.dragging.enable(); - } - } - }, - - _onMouseClick: function (e) { - var wasDragged = this.dragging && this.dragging.moved(); - - if (this.hasEventListeners(e.type) || wasDragged) { - L.DomEvent.stopPropagation(e); - } - - if (wasDragged) { return; } - - if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; } - - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); - }, - - _onKeyPress: function (e) { - if (e.keyCode === 13) { - this.fire('click', { - originalEvent: e, - latlng: this._latlng - }); - } - }, - - _fireMouseEvent: function (e) { - - this.fire(e.type, { - originalEvent: e, - latlng: this._latlng - }); - - // TODO proper custom event propagation - // this line will always be called if marker is in a FeatureGroup - if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousedown') { - L.DomEvent.stopPropagation(e); - } else { - L.DomEvent.preventDefault(e); - } - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - _updateOpacity: function () { - L.DomUtil.setOpacity(this._icon, this.options.opacity); - if (this._shadow) { - L.DomUtil.setOpacity(this._shadow, this.options.opacity); - } - }, - - _bringToFront: function () { - this._updateZIndex(this.options.riseOffset); - }, - - _resetZIndex: function () { - this._updateZIndex(0); - } -}); - -L.marker = function (latlng, options) { - return new L.Marker(latlng, options); -}; diff --git a/src/layer/tile/TileLayer.Anim.js b/src/layer/tile/TileLayer.Anim.js deleted file mode 100644 index 4610c092c19..00000000000 --- a/src/layer/tile/TileLayer.Anim.js +++ /dev/null @@ -1,105 +0,0 @@ -/* - Zoom animation logic for L.TileLayer. -*/ - -L.TileLayer.include({ - _animateZoom: function (e) { - if (!this._animating) { - this._animating = true; - this._prepareBgBuffer(); - } - - var bg = this._bgBuffer, - transform = L.DomUtil.TRANSFORM, - initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform], - scaleStr = L.DomUtil.getScaleString(e.scale, e.origin); - - bg.style[transform] = e.backwards ? - scaleStr + ' ' + initialTransform : - initialTransform + ' ' + scaleStr; - }, - - _endZoomAnim: function () { - var front = this._tileContainer, - bg = this._bgBuffer; - - front.style.visibility = ''; - front.parentNode.appendChild(front); // Bring to fore - - // force reflow - L.Util.falseFn(bg.offsetWidth); - - this._animating = false; - }, - - _clearBgBuffer: function () { - var map = this._map; - - if (map && !map._animatingZoom && !map.touchZoom._zooming) { - this._bgBuffer.innerHTML = ''; - this._bgBuffer.style[L.DomUtil.TRANSFORM] = ''; - } - }, - - _prepareBgBuffer: function () { - - var front = this._tileContainer, - bg = this._bgBuffer; - - // if foreground layer doesn't have many tiles but bg layer does, - // keep the existing bg layer and just zoom it some more - - var bgLoaded = this._getLoadedTilesPercentage(bg), - frontLoaded = this._getLoadedTilesPercentage(front); - - if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) { - - front.style.visibility = 'hidden'; - this._stopLoadingImages(front); - return; - } - - // prepare the buffer to become the front tile pane - bg.style.visibility = 'hidden'; - bg.style[L.DomUtil.TRANSFORM] = ''; - - // switch out the current layer to be the new bg layer (and vice-versa) - this._tileContainer = bg; - bg = this._bgBuffer = front; - - this._stopLoadingImages(bg); - - //prevent bg buffer from clearing right after zoom - clearTimeout(this._clearBgBufferTimer); - }, - - _getLoadedTilesPercentage: function (container) { - var tiles = container.getElementsByTagName('img'), - i, len, count = 0; - - for (i = 0, len = tiles.length; i < len; i++) { - if (tiles[i].complete) { - count++; - } - } - return count / len; - }, - - // stops loading all tiles in the background layer - _stopLoadingImages: function (container) { - var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')), - i, len, tile; - - for (i = 0, len = tiles.length; i < len; i++) { - tile = tiles[i]; - - if (!tile.complete) { - tile.onload = L.Util.falseFn; - tile.onerror = L.Util.falseFn; - tile.src = L.Util.emptyImageUrl; - - tile.parentNode.removeChild(tile); - } - } - } -}); diff --git a/src/layer/tile/TileLayer.Canvas.js b/src/layer/tile/TileLayer.Canvas.js deleted file mode 100644 index 21d2897769b..00000000000 --- a/src/layer/tile/TileLayer.Canvas.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * L.TileLayer.Canvas is a class that you can use as a base for creating - * dynamically drawn Canvas-based tile layers. - */ - -L.TileLayer.Canvas = L.TileLayer.extend({ - options: { - async: false - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - - for (var i in this._tiles) { - this._redrawTile(this._tiles[i]); - } - return this; - }, - - _redrawTile: function (tile) { - this.drawTile(tile, tile._tilePoint, this._map._zoom); - }, - - _createTileProto: function () { - var proto = this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile'); - proto.width = proto.height = this.options.tileSize; - }, - - _createTile: function () { - var tile = this._canvasProto.cloneNode(false); - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - return tile; - }, - - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile._tilePoint = tilePoint; - - this._redrawTile(tile); - - if (!this.options.async) { - this.tileDrawn(tile); - } - }, - - drawTile: function (/*tile, tilePoint*/) { - // override with rendering code - }, - - tileDrawn: function (tile) { - this._tileOnLoad.call(tile); - } -}); - - -L.tileLayer.canvas = function (options) { - return new L.TileLayer.Canvas(options); -}; diff --git a/src/layer/tile/TileLayer.WMS.js b/src/layer/tile/TileLayer.WMS.js deleted file mode 100644 index 7c895088a5b..00000000000 --- a/src/layer/tile/TileLayer.WMS.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * L.TileLayer.WMS is used for putting WMS tile layers on the map. - */ - -L.TileLayer.WMS = L.TileLayer.extend({ - - defaultWmsParams: { - service: 'WMS', - request: 'GetMap', - version: '1.1.1', - layers: '', - styles: '', - format: 'image/jpeg', - transparent: false - }, - - initialize: function (url, options) { // (String, Object) - - this._url = url; - - var wmsParams = L.extend({}, this.defaultWmsParams), - tileSize = options.tileSize || this.options.tileSize; - - if (options.detectRetina && L.Browser.retina) { - wmsParams.width = wmsParams.height = tileSize * 2; - } else { - wmsParams.width = wmsParams.height = tileSize; - } - - for (var i in options) { - // all keys that are not TileLayer options go to WMS params - if (!this.options.hasOwnProperty(i) && i !== 'crs') { - wmsParams[i] = options[i]; - } - } - - this.wmsParams = wmsParams; - - L.setOptions(this, options); - }, - - onAdd: function (map) { - - this._crs = this.options.crs || map.options.crs; - - this._wmsVersion = parseFloat(this.wmsParams.version); - - var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs'; - this.wmsParams[projectionKey] = this._crs.code; - - L.TileLayer.prototype.onAdd.call(this, map); - }, - - getTileUrl: function (tilePoint) { // (Point, Number) -> String - - var map = this._map, - tileSize = this.options.tileSize, - - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - - nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)), - se = this._crs.project(map.unproject(sePoint, tilePoint.z)), - bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ? - [se.y, nw.x, nw.y, se.x].join(',') : - [nw.x, se.y, se.x, nw.y].join(','), - - url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)}); - - return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox; - }, - - setParams: function (params, noRedraw) { - - L.extend(this.wmsParams, params); - - if (!noRedraw) { - this.redraw(); - } - - return this; - } -}); - -L.tileLayer.wms = function (url, options) { - return new L.TileLayer.WMS(url, options); -}; diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js deleted file mode 100644 index f37227c4ea7..00000000000 --- a/src/layer/tile/TileLayer.js +++ /dev/null @@ -1,599 +0,0 @@ -/* - * L.TileLayer is used for standard xyz-numbered tile layers. - */ - -L.TileLayer = L.Class.extend({ - includes: L.Mixin.Events, - - options: { - minZoom: 0, - maxZoom: 18, - tileSize: 256, - subdomains: 'abc', - errorTileUrl: '', - attribution: '', - zoomOffset: 0, - opacity: 1, - /* (undefined works too) - zIndex: null, - tms: false, - continuousWorld: false, - noWrap: false, - zoomReverse: false, - detectRetina: false, - reuseTiles: false, - bounds: false, - */ - unloadInvisibleTiles: L.Browser.mobile, - updateWhenIdle: L.Browser.mobile - }, - - initialize: function (url, options) { - options = L.setOptions(this, options); - - // detecting retina displays, adjusting tileSize and zoom levels - if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) { - - options.tileSize = Math.floor(options.tileSize / 2); - options.zoomOffset++; - - if (options.minZoom > 0) { - options.minZoom--; - } - this.options.maxZoom--; - } - - if (options.bounds) { - options.bounds = L.latLngBounds(options.bounds); - } - - this._url = url; - - var subdomains = this.options.subdomains; - - if (typeof subdomains === 'string') { - this.options.subdomains = subdomains.split(''); - } - }, - - onAdd: function (map) { - this._map = map; - this._animated = map._zoomAnimated; - - // create a container div for tiles - this._initContainer(); - - // create an image to clone for tiles - this._createTileProto(); - - // set up events - map.on({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.on({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); - map.on('move', this._limitedUpdate, this); - } - - this._reset(); - this._update(); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - this._container.parentNode.removeChild(this._container); - - map.off({ - 'viewreset': this._reset, - 'moveend': this._update - }, this); - - if (this._animated) { - map.off({ - 'zoomanim': this._animateZoom, - 'zoomend': this._endZoomAnim - }, this); - } - - if (!this.options.updateWhenIdle) { - map.off('move', this._limitedUpdate, this); - } - - this._container = null; - this._map = null; - }, - - bringToFront: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.appendChild(this._container); - this._setAutoZIndex(pane, Math.max); - } - - return this; - }, - - bringToBack: function () { - var pane = this._map._panes.tilePane; - - if (this._container) { - pane.insertBefore(this._container, pane.firstChild); - this._setAutoZIndex(pane, Math.min); - } - - return this; - }, - - getAttribution: function () { - return this.options.attribution; - }, - - getContainer: function () { - return this._container; - }, - - setOpacity: function (opacity) { - this.options.opacity = opacity; - - if (this._map) { - this._updateOpacity(); - } - - return this; - }, - - setZIndex: function (zIndex) { - this.options.zIndex = zIndex; - this._updateZIndex(); - - return this; - }, - - setUrl: function (url, noRedraw) { - this._url = url; - - if (!noRedraw) { - this.redraw(); - } - - return this; - }, - - redraw: function () { - if (this._map) { - this._reset({hard: true}); - this._update(); - } - return this; - }, - - _updateZIndex: function () { - if (this._container && this.options.zIndex !== undefined) { - this._container.style.zIndex = this.options.zIndex; - } - }, - - _setAutoZIndex: function (pane, compare) { - - var layers = pane.children, - edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min - zIndex, i, len; - - for (i = 0, len = layers.length; i < len; i++) { - - if (layers[i] !== this._container) { - zIndex = parseInt(layers[i].style.zIndex, 10); - - if (!isNaN(zIndex)) { - edgeZIndex = compare(edgeZIndex, zIndex); - } - } - } - - this.options.zIndex = this._container.style.zIndex = - (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1); - }, - - _updateOpacity: function () { - var i, - tiles = this._tiles; - - if (L.Browser.ielt9) { - for (i in tiles) { - L.DomUtil.setOpacity(tiles[i], this.options.opacity); - } - } else { - L.DomUtil.setOpacity(this._container, this.options.opacity); - } - }, - - _initContainer: function () { - var tilePane = this._map._panes.tilePane; - - if (!this._container) { - this._container = L.DomUtil.create('div', 'leaflet-layer'); - - this._updateZIndex(); - - if (this._animated) { - var className = 'leaflet-tile-container'; - - this._bgBuffer = L.DomUtil.create('div', className, this._container); - this._tileContainer = L.DomUtil.create('div', className, this._container); - - } else { - this._tileContainer = this._container; - } - - tilePane.appendChild(this._container); - - if (this.options.opacity < 1) { - this._updateOpacity(); - } - } - }, - - _reset: function (e) { - for (var key in this._tiles) { - this.fire('tileunload', {tile: this._tiles[key]}); - } - - this._tiles = {}; - this._tilesToLoad = 0; - - if (this.options.reuseTiles) { - this._unusedTiles = []; - } - - this._tileContainer.innerHTML = ''; - - if (this._animated && e && e.hard) { - this._clearBgBuffer(); - } - - this._initContainer(); - }, - - _getTileSize: function () { - var map = this._map, - zoom = map.getZoom() + this.options.zoomOffset, - zoomN = this.options.maxNativeZoom, - tileSize = this.options.tileSize; - - if (zoomN && zoom > zoomN) { - tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize); - } - - return tileSize; - }, - - _update: function () { - - if (!this._map) { return; } - - var bounds = this._map.getPixelBounds(), - zoom = this._map.getZoom(), - tileSize = this.options.tileSize; - - if (zoom > this.options.maxZoom || zoom < this.options.minZoom) { - return; - } - - var tileBounds = L.bounds( - bounds.min.divideBy(tileSize)._floor(), - bounds.max.divideBy(tileSize)._floor()); - - this._addTilesFromCenterOut(tileBounds); - - if (this.options.unloadInvisibleTiles || this.options.reuseTiles) { - this._removeOtherTiles(tileBounds); - } - }, - - _addTilesFromCenterOut: function (bounds) { - var queue = [], - center = bounds.getCenter(); - - var j, i, point; - - for (j = bounds.min.y; j <= bounds.max.y; j++) { - for (i = bounds.min.x; i <= bounds.max.x; i++) { - point = new L.Point(i, j); - - if (this._tileShouldBeLoaded(point)) { - queue.push(point); - } - } - } - - var tilesToLoad = queue.length; - - if (tilesToLoad === 0) { return; } - - // load tiles in order of their distance to center - queue.sort(function (a, b) { - return a.distanceTo(center) - b.distanceTo(center); - }); - - var fragment = document.createDocumentFragment(); - - // if its the first batch of tiles to load - if (!this._tilesToLoad) { - this.fire('loading'); - } - - this._tilesToLoad += tilesToLoad; - - for (i = 0; i < tilesToLoad; i++) { - this._addTile(queue[i], fragment); - } - - this._tileContainer.appendChild(fragment); - }, - - _tileShouldBeLoaded: function (tilePoint) { - if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) { - return false; // already loaded - } - - var options = this.options; - - if (!options.continuousWorld) { - var limit = this._getWrapTileNum(); - - // don't load if exceeds world bounds - if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) || - tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; } - } - - if (options.bounds) { - var tileSize = options.tileSize, - nwPoint = tilePoint.multiplyBy(tileSize), - sePoint = nwPoint.add([tileSize, tileSize]), - nw = this._map.unproject(nwPoint), - se = this._map.unproject(sePoint); - - // TODO temporary hack, will be removed after refactoring projections - // https://github.com/Leaflet/Leaflet/issues/1618 - if (!options.continuousWorld && !options.noWrap) { - nw = nw.wrap(); - se = se.wrap(); - } - - if (!options.bounds.intersects([nw, se])) { return false; } - } - - return true; - }, - - _removeOtherTiles: function (bounds) { - var kArr, x, y, key; - - for (key in this._tiles) { - kArr = key.split(':'); - x = parseInt(kArr[0], 10); - y = parseInt(kArr[1], 10); - - // remove tile if it's out of bounds - if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) { - this._removeTile(key); - } - } - }, - - _removeTile: function (key) { - var tile = this._tiles[key]; - - this.fire('tileunload', {tile: tile, url: tile.src}); - - if (this.options.reuseTiles) { - L.DomUtil.removeClass(tile, 'leaflet-tile-loaded'); - this._unusedTiles.push(tile); - - } else if (tile.parentNode === this._tileContainer) { - this._tileContainer.removeChild(tile); - } - - // for https://github.com/CloudMade/Leaflet/issues/137 - if (!L.Browser.android) { - tile.onload = null; - tile.src = L.Util.emptyImageUrl; - } - - delete this._tiles[key]; - }, - - _addTile: function (tilePoint, container) { - var tilePos = this._getTilePos(tilePoint); - - // get unused tile - or create a new tile - var tile = this._getTile(); - - /* - Chrome 20 layouts much faster with top/left (verify with timeline, frames) - Android 4 browser has display issues with top/left and requires transform instead - (other browsers don't currently care) - see debug/hacks/jitter.html for an example - */ - L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome); - - this._tiles[tilePoint.x + ':' + tilePoint.y] = tile; - - this._loadTile(tile, tilePoint); - - if (tile.parentNode !== this._tileContainer) { - container.appendChild(tile); - } - }, - - _getZoomForUrl: function () { - - var options = this.options, - zoom = this._map.getZoom(); - - if (options.zoomReverse) { - zoom = options.maxZoom - zoom; - } - - return zoom + options.zoomOffset; - }, - - _getTilePos: function (tilePoint) { - var origin = this._map.getPixelOrigin(), - tileSize = this.options.tileSize; - - return tilePoint.multiplyBy(tileSize).subtract(origin); - }, - - // image-specific code (override to implement e.g. Canvas or SVG tile layer) - - getTileUrl: function (tilePoint) { - return L.Util.template(this._url, L.extend({ - s: this._getSubdomain(tilePoint), - z: tilePoint.z, - x: tilePoint.x, - y: tilePoint.y - }, this.options)); - }, - - _getWrapTileNum: function () { - var crs = this._map.options.crs, - size = crs.getSize(this._map.getZoom()); - return size.divideBy(this._getTileSize())._floor(); - }, - - _adjustTilePoint: function (tilePoint) { - - var limit = this._getWrapTileNum(); - - // wrap tile coordinates - if (!this.options.continuousWorld && !this.options.noWrap) { - tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x; - } - - if (this.options.tms) { - tilePoint.y = limit.y - tilePoint.y - 1; - } - - tilePoint.z = this._getZoomForUrl(); - }, - - _getSubdomain: function (tilePoint) { - var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length; - return this.options.subdomains[index]; - }, - - _createTileProto: function () { - var img = this._tileImg = L.DomUtil.create('img', 'leaflet-tile'); - img.style.width = img.style.height = this.options.tileSize + 'px'; - img.galleryimg = 'no'; - }, - - _getTile: function () { - if (this.options.reuseTiles && this._unusedTiles.length > 0) { - var tile = this._unusedTiles.pop(); - this._resetTile(tile); - return tile; - } - return this._createTile(); - }, - - // Override if data stored on a tile needs to be cleaned up before reuse - _resetTile: function (/*tile*/) {}, - - _createTile: function () { - var tile = this._tileImg.cloneNode(false); - tile.onselectstart = tile.onmousemove = L.Util.falseFn; - - if (L.Browser.ielt9 && this.options.opacity !== undefined) { - L.DomUtil.setOpacity(tile, this.options.opacity); - } - // without this hack, tiles disappear after zoom on Chrome for Android - // https://github.com/Leaflet/Leaflet/issues/2078 - if (L.Browser.mobileWebkit3d) { - tile.style.WebkitBackfaceVisibility = 'hidden'; - } - return tile; - }, - - _loadTile: function (tile, tilePoint) { - tile._layer = this; - tile.onload = this._tileOnLoad; - tile.onerror = this._tileOnError; - - this._adjustTilePoint(tilePoint); - tile.src = this.getTileUrl(tilePoint); - - this.fire('tileloadstart', { - tile: tile, - url: tile.src - }); - }, - - _tileLoaded: function () { - this._tilesToLoad--; - - if (this._animated) { - L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated'); - } - - if (!this._tilesToLoad) { - this.fire('load'); - - if (this._animated) { - // clear scaled tiles after all new tiles are loaded (for performance) - clearTimeout(this._clearBgBufferTimer); - this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500); - } - } - }, - - _tileOnLoad: function () { - var layer = this._layer; - - //Only if we are loading an actual image - if (this.src !== L.Util.emptyImageUrl) { - L.DomUtil.addClass(this, 'leaflet-tile-loaded'); - - layer.fire('tileload', { - tile: this, - url: this.src - }); - } - - layer._tileLoaded(); - }, - - _tileOnError: function () { - var layer = this._layer; - - layer.fire('tileerror', { - tile: this, - url: this.src - }); - - var newUrl = layer.options.errorTileUrl; - if (newUrl) { - this.src = newUrl; - } - - layer._tileLoaded(); - } -}); - -L.tileLayer = function (url, options) { - return new L.TileLayer(url, options); -}; diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js deleted file mode 100644 index abdd8bcdd1d..00000000000 --- a/src/layer/vector/Circle.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * L.Circle is a circle overlay (with a certain radius in meters). - */ - -L.Circle = L.Path.extend({ - initialize: function (latlng, radius, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlng = L.latLng(latlng); - this._mRadius = radius; - }, - - options: { - fill: true - }, - - setLatLng: function (latlng) { - this._latlng = L.latLng(latlng); - return this.redraw(); - }, - - setRadius: function (radius) { - this._mRadius = radius; - return this.redraw(); - }, - - projectLatlngs: function () { - var lngRadius = this._getLngRadius(), - latlng = this._latlng, - pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]); - - this._point = this._map.latLngToLayerPoint(latlng); - this._radius = Math.max(this._point.x - pointLeft.x, 1); - }, - - getBounds: function () { - var lngRadius = this._getLngRadius(), - latRadius = (this._mRadius / 40075017) * 360, - latlng = this._latlng; - - return new L.LatLngBounds( - [latlng.lat - latRadius, latlng.lng - lngRadius], - [latlng.lat + latRadius, latlng.lng + lngRadius]); - }, - - getLatLng: function () { - return this._latlng; - }, - - getPathString: function () { - var p = this._point, - r = this._radius; - - if (this._checkIfEmpty()) { - return ''; - } - - if (L.Browser.svg) { - return 'M' + p.x + ',' + (p.y - r) + - 'A' + r + ',' + r + ',0,1,1,' + - (p.x - 0.1) + ',' + (p.y - r) + ' z'; - } else { - p._round(); - r = Math.round(r); - return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360); - } - }, - - getRadius: function () { - return this._mRadius; - }, - - // TODO Earth hardcoded, move into projection code! - - _getLatRadius: function () { - return (this._mRadius / 40075017) * 360; - }, - - _getLngRadius: function () { - return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); - }, - - _checkIfEmpty: function () { - if (!this._map) { - return false; - } - var vp = this._map._pathViewport, - r = this._radius, - p = this._point; - - return p.x - r > vp.max.x || p.y - r > vp.max.y || - p.x + r < vp.min.x || p.y + r < vp.min.y; - } -}); - -L.circle = function (latlng, radius, options) { - return new L.Circle(latlng, radius, options); -}; diff --git a/src/layer/vector/CircleMarker.js b/src/layer/vector/CircleMarker.js deleted file mode 100644 index 6b93df08e68..00000000000 --- a/src/layer/vector/CircleMarker.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * L.CircleMarker is a circle overlay with a permanent pixel radius. - */ - -L.CircleMarker = L.Circle.extend({ - options: { - radius: 10, - weight: 2 - }, - - initialize: function (latlng, options) { - L.Circle.prototype.initialize.call(this, latlng, null, options); - this._radius = this.options.radius; - }, - - projectLatlngs: function () { - this._point = this._map.latLngToLayerPoint(this._latlng); - }, - - _updateStyle : function () { - L.Circle.prototype._updateStyle.call(this); - this.setRadius(this.options.radius); - }, - - setLatLng: function (latlng) { - L.Circle.prototype.setLatLng.call(this, latlng); - if (this._popup && this._popup._isOpen) { - this._popup.setLatLng(latlng); - } - return this; - }, - - setRadius: function (radius) { - this.options.radius = this._radius = radius; - return this.redraw(); - }, - - getRadius: function () { - return this._radius; - } -}); - -L.circleMarker = function (latlng, options) { - return new L.CircleMarker(latlng, options); -}; diff --git a/src/layer/vector/MultiPoly.js b/src/layer/vector/MultiPoly.js deleted file mode 100644 index 8e88bc07767..00000000000 --- a/src/layer/vector/MultiPoly.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Contains L.MultiPolyline and L.MultiPolygon layers. - */ - -(function () { - function createMulti(Klass) { - - return L.FeatureGroup.extend({ - - initialize: function (latlngs, options) { - this._layers = {}; - this._options = options; - this.setLatLngs(latlngs); - }, - - setLatLngs: function (latlngs) { - var i = 0, - len = latlngs.length; - - this.eachLayer(function (layer) { - if (i < len) { - layer.setLatLngs(latlngs[i++]); - } else { - this.removeLayer(layer); - } - }, this); - - while (i < len) { - this.addLayer(new Klass(latlngs[i++], this._options)); - } - - return this; - }, - - getLatLngs: function () { - var latlngs = []; - - this.eachLayer(function (layer) { - latlngs.push(layer.getLatLngs()); - }); - - return latlngs; - } - }); - } - - L.MultiPolyline = createMulti(L.Polyline); - L.MultiPolygon = createMulti(L.Polygon); - - L.multiPolyline = function (latlngs, options) { - return new L.MultiPolyline(latlngs, options); - }; - - L.multiPolygon = function (latlngs, options) { - return new L.MultiPolygon(latlngs, options); - }; -}()); diff --git a/src/layer/vector/Path.Popup.js b/src/layer/vector/Path.Popup.js deleted file mode 100644 index b09620252ef..00000000000 --- a/src/layer/vector/Path.Popup.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods. - */ - -L.Path.include({ - - bindPopup: function (content, options) { - - if (content instanceof L.Popup) { - this._popup = content; - } else { - if (!this._popup || options) { - this._popup = new L.Popup(options, this); - } - this._popup.setContent(content); - } - - if (!this._popupHandlersAdded) { - this - .on('click', this._openPopup, this) - .on('remove', this.closePopup, this); - - this._popupHandlersAdded = true; - } - - return this; - }, - - unbindPopup: function () { - if (this._popup) { - this._popup = null; - this - .off('click', this._openPopup) - .off('remove', this.closePopup); - - this._popupHandlersAdded = false; - } - return this; - }, - - openPopup: function (latlng) { - - if (this._popup) { - // open the popup from one of the path's points if not specified - latlng = latlng || this._latlng || - this._latlngs[Math.floor(this._latlngs.length / 2)]; - - this._openPopup({latlng: latlng}); - } - - return this; - }, - - closePopup: function () { - if (this._popup) { - this._popup._close(); - } - return this; - }, - - _openPopup: function (e) { - this._popup.setLatLng(e.latlng); - this._map.openPopup(this._popup); - } -}); diff --git a/src/layer/vector/Path.SVG.js b/src/layer/vector/Path.SVG.js deleted file mode 100644 index 30c11ad7055..00000000000 --- a/src/layer/vector/Path.SVG.js +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Extends L.Path with SVG-specific rendering code. - */ - -L.Path.SVG_NS = 'http://www.w3.org/2000/svg'; - -L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect); - -L.Path = L.Path.extend({ - statics: { - SVG: L.Browser.svg - }, - - bringToFront: function () { - var root = this._map._pathRoot, - path = this._container; - - if (path && root.lastChild !== path) { - root.appendChild(path); - } - return this; - }, - - bringToBack: function () { - var root = this._map._pathRoot, - path = this._container, - first = root.firstChild; - - if (path && first !== path) { - root.insertBefore(path, first); - } - return this; - }, - - getPathString: function () { - // form path string here - }, - - _createElement: function (name) { - return document.createElementNS(L.Path.SVG_NS, name); - }, - - _initElements: function () { - this._map._initPathRoot(); - this._initPath(); - this._initStyle(); - }, - - _initPath: function () { - this._container = this._createElement('g'); - - this._path = this._createElement('path'); - - if (this.options.className) { - L.DomUtil.addClass(this._path, this.options.className); - } - - this._container.appendChild(this._path); - }, - - _initStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke-linejoin', 'round'); - this._path.setAttribute('stroke-linecap', 'round'); - } - if (this.options.fill) { - this._path.setAttribute('fill-rule', 'evenodd'); - } - if (this.options.pointerEvents) { - this._path.setAttribute('pointer-events', this.options.pointerEvents); - } - if (!this.options.clickable && !this.options.pointerEvents) { - this._path.setAttribute('pointer-events', 'none'); - } - this._updateStyle(); - }, - - _updateStyle: function () { - if (this.options.stroke) { - this._path.setAttribute('stroke', this.options.color); - this._path.setAttribute('stroke-opacity', this.options.opacity); - this._path.setAttribute('stroke-width', this.options.weight); - if (this.options.dashArray) { - this._path.setAttribute('stroke-dasharray', this.options.dashArray); - } else { - this._path.removeAttribute('stroke-dasharray'); - } - if (this.options.lineCap) { - this._path.setAttribute('stroke-linecap', this.options.lineCap); - } - if (this.options.lineJoin) { - this._path.setAttribute('stroke-linejoin', this.options.lineJoin); - } - } else { - this._path.setAttribute('stroke', 'none'); - } - if (this.options.fill) { - this._path.setAttribute('fill', this.options.fillColor || this.options.color); - this._path.setAttribute('fill-opacity', this.options.fillOpacity); - } else { - this._path.setAttribute('fill', 'none'); - } - }, - - _updatePath: function () { - var str = this.getPathString(); - if (!str) { - // fix webkit empty string parsing bug - str = 'M0 0'; - } - this._path.setAttribute('d', str); - }, - - // TODO remove duplication with L.Map - _initEvents: function () { - if (this.options.clickable) { - if (L.Browser.svg || !L.Browser.vml) { - L.DomUtil.addClass(this._path, 'leaflet-clickable'); - } - - L.DomEvent.on(this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseover', - 'mouseout', 'mousemove', 'contextmenu']; - for (var i = 0; i < events.length; i++) { - L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this); - } - } - }, - - _onMouseClick: function (e) { - if (this._map.dragging && this._map.dragging.moved()) { return; } - - this._fireMouseEvent(e); - }, - - _fireMouseEvent: function (e) { - if (!this.hasEventListeners(e.type)) { return; } - - var map = this._map, - containerPoint = map.mouseEventToContainerPoint(e), - layerPoint = map.containerPointToLayerPoint(containerPoint), - latlng = map.layerPointToLatLng(layerPoint); - - this.fire(e.type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); - - if (e.type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - if (e.type !== 'mousemove') { - L.DomEvent.stopPropagation(e); - } - } -}); - -L.Map.include({ - _initPathRoot: function () { - if (!this._pathRoot) { - this._pathRoot = L.Path.prototype._createElement('svg'); - this._panes.overlayPane.appendChild(this._pathRoot); - - if (this.options.zoomAnimation && L.Browser.any3d) { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated'); - - this.on({ - 'zoomanim': this._animatePathZoom, - 'zoomend': this._endPathZoom - }); - } else { - L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide'); - } - - this.on('moveend', this._updateSvgViewport); - this._updateSvgViewport(); - } - }, - - _animatePathZoom: function (e) { - var scale = this.getZoomScale(e.zoom), - offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min); - - this._pathRoot.style[L.DomUtil.TRANSFORM] = - L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') '; - - this._pathZooming = true; - }, - - _endPathZoom: function () { - this._pathZooming = false; - }, - - _updateSvgViewport: function () { - - if (this._pathZooming) { - // Do not update SVGs while a zoom animation is going on otherwise the animation will break. - // When the zoom animation ends we will be updated again anyway - // This fixes the case where you do a momentum move and zoom while the move is still ongoing. - return; - } - - this._updatePathViewport(); - - var vp = this._pathViewport, - min = vp.min, - max = vp.max, - width = max.x - min.x, - height = max.y - min.y, - root = this._pathRoot, - pane = this._panes.overlayPane; - - // Hack to make flicker on drag end on mobile webkit less irritating - if (L.Browser.mobileWebkit) { - pane.removeChild(root); - } - - L.DomUtil.setPosition(root, min); - root.setAttribute('width', width); - root.setAttribute('height', height); - root.setAttribute('viewBox', [min.x, min.y, width, height].join(' ')); - - if (L.Browser.mobileWebkit) { - pane.appendChild(root); - } - } -}); diff --git a/src/layer/vector/Path.VML.js b/src/layer/vector/Path.VML.js deleted file mode 100644 index 541060405c9..00000000000 --- a/src/layer/vector/Path.VML.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Vector rendering for IE6-8 through VML. - * Thanks to Dmitry Baranovsky and his Raphael library for inspiration! - */ - -L.Browser.vml = !L.Browser.svg && (function () { - try { - var div = document.createElement('div'); - div.innerHTML = ''; - - var shape = div.firstChild; - shape.style.behavior = 'url(#default#VML)'; - - return shape && (typeof shape.adj === 'object'); - - } catch (e) { - return false; - } -}()); - -L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({ - statics: { - VML: true, - CLIP_PADDING: 0.02 - }, - - _createElement: (function () { - try { - document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml'); - return function (name) { - return document.createElement(''); - }; - } catch (e) { - return function (name) { - return document.createElement( - '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">'); - }; - } - }()), - - _initPath: function () { - var container = this._container = this._createElement('shape'); - - L.DomUtil.addClass(container, 'leaflet-vml-shape' + - (this.options.className ? ' ' + this.options.className : '')); - - if (this.options.clickable) { - L.DomUtil.addClass(container, 'leaflet-clickable'); - } - - container.coordsize = '1 1'; - - this._path = this._createElement('path'); - container.appendChild(this._path); - - this._map._pathRoot.appendChild(container); - }, - - _initStyle: function () { - this._updateStyle(); - }, - - _updateStyle: function () { - var stroke = this._stroke, - fill = this._fill, - options = this.options, - container = this._container; - - container.stroked = options.stroke; - container.filled = options.fill; - - if (options.stroke) { - if (!stroke) { - stroke = this._stroke = this._createElement('stroke'); - stroke.endcap = 'round'; - container.appendChild(stroke); - } - stroke.weight = options.weight + 'px'; - stroke.color = options.color; - stroke.opacity = options.opacity; - - if (options.dashArray) { - stroke.dashStyle = L.Util.isArray(options.dashArray) ? - options.dashArray.join(' ') : - options.dashArray.replace(/( *, *)/g, ' '); - } else { - stroke.dashStyle = ''; - } - if (options.lineCap) { - stroke.endcap = options.lineCap.replace('butt', 'flat'); - } - if (options.lineJoin) { - stroke.joinstyle = options.lineJoin; - } - - } else if (stroke) { - container.removeChild(stroke); - this._stroke = null; - } - - if (options.fill) { - if (!fill) { - fill = this._fill = this._createElement('fill'); - container.appendChild(fill); - } - fill.color = options.fillColor || options.color; - fill.opacity = options.fillOpacity; - - } else if (fill) { - container.removeChild(fill); - this._fill = null; - } - }, - - _updatePath: function () { - var style = this._container.style; - - style.display = 'none'; - this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug - style.display = ''; - } -}); - -L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : { - _initPathRoot: function () { - if (this._pathRoot) { return; } - - var root = this._pathRoot = document.createElement('div'); - root.className = 'leaflet-vml-container'; - this._panes.overlayPane.appendChild(root); - - this.on('moveend', this._updatePathViewport); - this._updatePathViewport(); - } -}); diff --git a/src/layer/vector/Path.js b/src/layer/vector/Path.js deleted file mode 100644 index 47f7b0125c5..00000000000 --- a/src/layer/vector/Path.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc. - */ - -L.Path = L.Class.extend({ - includes: [L.Mixin.Events], - - statics: { - // how much to extend the clip area around the map view - // (relative to its size, e.g. 0.5 is half the screen in each direction) - // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is) - CLIP_PADDING: (function () { - var max = L.Browser.mobile ? 1280 : 2000, - target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2; - return Math.max(0, Math.min(0.5, target)); - })() - }, - - options: { - stroke: true, - color: '#0033ff', - dashArray: null, - lineCap: null, - lineJoin: null, - weight: 5, - opacity: 0.5, - - fill: false, - fillColor: null, //same as color by default - fillOpacity: 0.2, - - clickable: true - }, - - initialize: function (options) { - L.setOptions(this, options); - }, - - onAdd: function (map) { - this._map = map; - - if (!this._container) { - this._initElements(); - this._initEvents(); - } - - this.projectLatlngs(); - this._updatePath(); - - if (this._container) { - this._map._pathRoot.appendChild(this._container); - } - - this.fire('add'); - - map.on({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, - - addTo: function (map) { - map.addLayer(this); - return this; - }, - - onRemove: function (map) { - map._pathRoot.removeChild(this._container); - - // Need to fire remove event before we set _map to null as the event hooks might need the object - this.fire('remove'); - this._map = null; - - if (L.Browser.vml) { - this._container = null; - this._stroke = null; - this._fill = null; - } - - map.off({ - 'viewreset': this.projectLatlngs, - 'moveend': this._updatePath - }, this); - }, - - projectLatlngs: function () { - // do all projection stuff here - }, - - setStyle: function (style) { - L.setOptions(this, style); - - if (this._container) { - this._updateStyle(); - } - - return this; - }, - - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._updatePath(); - } - return this; - } -}); - -L.Map.include({ - _updatePathViewport: function () { - var p = L.Path.CLIP_PADDING, - size = this.getSize(), - panePos = L.DomUtil.getPosition(this._mapPane), - min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()), - max = min.add(size.multiplyBy(1 + p * 2)._round()); - - this._pathViewport = new L.Bounds(min, max); - } -}); diff --git a/src/layer/vector/Polygon.js b/src/layer/vector/Polygon.js deleted file mode 100644 index 5fd5dd40e19..00000000000 --- a/src/layer/vector/Polygon.js +++ /dev/null @@ -1,92 +0,0 @@ -/* - * L.Polygon is used to display polygons on a map. - */ - -L.Polygon = L.Polyline.extend({ - options: { - fill: true - }, - - initialize: function (latlngs, options) { - L.Polyline.prototype.initialize.call(this, latlngs, options); - this._initWithHoles(latlngs); - }, - - _initWithHoles: function (latlngs) { - var i, len, hole; - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._latlngs = this._convertLatLngs(latlngs[0]); - this._holes = latlngs.slice(1); - - for (i = 0, len = this._holes.length; i < len; i++) { - hole = this._holes[i] = this._convertLatLngs(this._holes[i]); - if (hole[0].equals(hole[hole.length - 1])) { - hole.pop(); - } - } - } - - // filter out last point if its equal to the first one - latlngs = this._latlngs; - - if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) { - latlngs.pop(); - } - }, - - projectLatlngs: function () { - L.Polyline.prototype.projectLatlngs.call(this); - - // project polygon holes points - // TODO move this logic to Polyline to get rid of duplication - this._holePoints = []; - - if (!this._holes) { return; } - - var i, j, len, len2; - - for (i = 0, len = this._holes.length; i < len; i++) { - this._holePoints[i] = []; - - for (j = 0, len2 = this._holes[i].length; j < len2; j++) { - this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]); - } - } - }, - - setLatLngs: function (latlngs) { - if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) { - this._initWithHoles(latlngs); - return this.redraw(); - } else { - return L.Polyline.prototype.setLatLngs.call(this, latlngs); - } - }, - - _clipPoints: function () { - var points = this._originalPoints, - newParts = []; - - this._parts = [points].concat(this._holePoints); - - if (this.options.noClip) { return; } - - for (var i = 0, len = this._parts.length; i < len; i++) { - var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport); - if (clipped.length) { - newParts.push(clipped); - } - } - - this._parts = newParts; - }, - - _getPathPartStr: function (points) { - var str = L.Polyline.prototype._getPathPartStr.call(this, points); - return str + (L.Browser.svg ? 'z' : 'x'); - } -}); - -L.polygon = function (latlngs, options) { - return new L.Polygon(latlngs, options); -}; diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js deleted file mode 100644 index 8cb836b5ff3..00000000000 --- a/src/layer/vector/Polyline.js +++ /dev/null @@ -1,164 +0,0 @@ -/* - * L.Polyline is used to display polylines on a map. - */ - -L.Polyline = L.Path.extend({ - initialize: function (latlngs, options) { - L.Path.prototype.initialize.call(this, options); - - this._latlngs = this._convertLatLngs(latlngs); - }, - - options: { - // how much to simplify the polyline on each zoom level - // more = better performance and smoother look, less = more accurate - smoothFactor: 1.0, - noClip: false - }, - - projectLatlngs: function () { - this._originalPoints = []; - - for (var i = 0, len = this._latlngs.length; i < len; i++) { - this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]); - } - }, - - getPathString: function () { - for (var i = 0, len = this._parts.length, str = ''; i < len; i++) { - str += this._getPathPartStr(this._parts[i]); - } - return str; - }, - - getLatLngs: function () { - return this._latlngs; - }, - - setLatLngs: function (latlngs) { - this._latlngs = this._convertLatLngs(latlngs); - return this.redraw(); - }, - - addLatLng: function (latlng) { - this._latlngs.push(L.latLng(latlng)); - return this.redraw(); - }, - - spliceLatLngs: function () { // (Number index, Number howMany) - var removed = [].splice.apply(this._latlngs, arguments); - this._convertLatLngs(this._latlngs, true); - this.redraw(); - return removed; - }, - - closestLayerPoint: function (p) { - var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null; - - for (var j = 0, jLen = parts.length; j < jLen; j++) { - var points = parts[j]; - for (var i = 1, len = points.length; i < len; i++) { - p1 = points[i - 1]; - p2 = points[i]; - var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true); - if (sqDist < minDistance) { - minDistance = sqDist; - minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2); - } - } - } - if (minPoint) { - minPoint.distance = Math.sqrt(minDistance); - } - return minPoint; - }, - - getBounds: function () { - return new L.LatLngBounds(this.getLatLngs()); - }, - - _convertLatLngs: function (latlngs, overwrite) { - var i, len, target = overwrite ? latlngs : []; - - for (i = 0, len = latlngs.length; i < len; i++) { - if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') { - return; - } - target[i] = L.latLng(latlngs[i]); - } - return target; - }, - - _initEvents: function () { - L.Path.prototype._initEvents.call(this); - }, - - _getPathPartStr: function (points) { - var round = L.Path.VML; - - for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) { - p = points[j]; - if (round) { - p._round(); - } - str += (j ? 'L' : 'M') + p.x + ' ' + p.y; - } - return str; - }, - - _clipPoints: function () { - var points = this._originalPoints, - len = points.length, - i, k, segment; - - if (this.options.noClip) { - this._parts = [points]; - return; - } - - this._parts = []; - - var parts = this._parts, - vp = this._map._pathViewport, - lu = L.LineUtil; - - for (i = 0, k = 0; i < len - 1; i++) { - segment = lu.clipSegment(points[i], points[i + 1], vp, i); - if (!segment) { - continue; - } - - parts[k] = parts[k] || []; - parts[k].push(segment[0]); - - // if segment goes out of screen, or it's the last one, it's the end of the line part - if ((segment[1] !== points[i + 1]) || (i === len - 2)) { - parts[k].push(segment[1]); - k++; - } - } - }, - - // simplify each clipped part of the polyline - _simplifyPoints: function () { - var parts = this._parts, - lu = L.LineUtil; - - for (var i = 0, len = parts.length; i < len; i++) { - parts[i] = lu.simplify(parts[i], this.options.smoothFactor); - } - }, - - _updatePath: function () { - if (!this._map) { return; } - - this._clipPoints(); - this._simplifyPoints(); - - L.Path.prototype._updatePath.call(this); - } -}); - -L.polyline = function (latlngs, options) { - return new L.Polyline(latlngs, options); -}; diff --git a/src/layer/vector/Rectangle.js b/src/layer/vector/Rectangle.js deleted file mode 100644 index 108f968011e..00000000000 --- a/src/layer/vector/Rectangle.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object. - */ - -L.Rectangle = L.Polygon.extend({ - initialize: function (latLngBounds, options) { - L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options); - }, - - setBounds: function (latLngBounds) { - this.setLatLngs(this._boundsToLatLngs(latLngBounds)); - }, - - _boundsToLatLngs: function (latLngBounds) { - latLngBounds = L.latLngBounds(latLngBounds); - return [ - latLngBounds.getSouthWest(), - latLngBounds.getNorthWest(), - latLngBounds.getNorthEast(), - latLngBounds.getSouthEast() - ]; - } -}); - -L.rectangle = function (latLngBounds, options) { - return new L.Rectangle(latLngBounds, options); -}; diff --git a/src/layer/vector/canvas/Circle.Canvas.js b/src/layer/vector/canvas/Circle.Canvas.js deleted file mode 100644 index 1128b7b098f..00000000000 --- a/src/layer/vector/canvas/Circle.Canvas.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Extends L.Circle with Canvas-specific code. - */ - -L.Circle.include(!L.Path.CANVAS ? {} : { - _drawPath: function () { - var p = this._point; - this._ctx.beginPath(); - this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false); - }, - - _containsPoint: function (p) { - var center = this._point, - w2 = this.options.stroke ? this.options.weight / 2 : 0; - - return (p.distanceTo(center) <= this._radius + w2); - } -}); diff --git a/src/layer/vector/canvas/CircleMarker.Canvas.js b/src/layer/vector/canvas/CircleMarker.Canvas.js deleted file mode 100644 index 627f7ed599b..00000000000 --- a/src/layer/vector/canvas/CircleMarker.Canvas.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * CircleMarker canvas specific drawing parts. - */ - -L.CircleMarker.include(!L.Path.CANVAS ? {} : { - _updateStyle: function () { - L.Path.prototype._updateStyle.call(this); - } -}); diff --git a/src/layer/vector/canvas/Path.Canvas.js b/src/layer/vector/canvas/Path.Canvas.js deleted file mode 100644 index 8d0380103ce..00000000000 --- a/src/layer/vector/canvas/Path.Canvas.js +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Vector rendering for all browsers that support canvas. - */ - -L.Browser.canvas = (function () { - return !!document.createElement('canvas').getContext; -}()); - -L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({ - statics: { - //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value - CANVAS: true, - SVG: false - }, - - redraw: function () { - if (this._map) { - this.projectLatlngs(); - this._requestUpdate(); - } - return this; - }, - - setStyle: function (style) { - L.setOptions(this, style); - - if (this._map) { - this._updateStyle(); - this._requestUpdate(); - } - return this; - }, - - onRemove: function (map) { - map - .off('viewreset', this.projectLatlngs, this) - .off('moveend', this._updatePath, this); - - if (this.options.clickable) { - this._map.off('click', this._onClick, this); - this._map.off('mousemove', this._onMouseMove, this); - } - - this._requestUpdate(); - - this._map = null; - }, - - _requestUpdate: function () { - if (this._map && !L.Path._updateRequest) { - L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map); - } - }, - - _fireMapMoveEnd: function () { - L.Path._updateRequest = null; - this.fire('moveend'); - }, - - _initElements: function () { - this._map._initPathRoot(); - this._ctx = this._map._canvasCtx; - }, - - _updateStyle: function () { - var options = this.options; - - if (options.stroke) { - this._ctx.lineWidth = options.weight; - this._ctx.strokeStyle = options.color; - } - if (options.fill) { - this._ctx.fillStyle = options.fillColor || options.color; - } - }, - - _drawPath: function () { - var i, j, len, len2, point, drawMethod; - - this._ctx.beginPath(); - - for (i = 0, len = this._parts.length; i < len; i++) { - for (j = 0, len2 = this._parts[i].length; j < len2; j++) { - point = this._parts[i][j]; - drawMethod = (j === 0 ? 'move' : 'line') + 'To'; - - this._ctx[drawMethod](point.x, point.y); - } - // TODO refactor ugly hack - if (this instanceof L.Polygon) { - this._ctx.closePath(); - } - } - }, - - _checkIfEmpty: function () { - return !this._parts.length; - }, - - _updatePath: function () { - if (this._checkIfEmpty()) { return; } - - var ctx = this._ctx, - options = this.options; - - this._drawPath(); - ctx.save(); - this._updateStyle(); - - if (options.fill) { - ctx.globalAlpha = options.fillOpacity; - ctx.fill(); - } - - if (options.stroke) { - ctx.globalAlpha = options.opacity; - ctx.stroke(); - } - - ctx.restore(); - - // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature - }, - - _initEvents: function () { - if (this.options.clickable) { - // TODO dblclick - this._map.on('mousemove', this._onMouseMove, this); - this._map.on('click', this._onClick, this); - } - }, - - _onClick: function (e) { - if (this._containsPoint(e.layerPoint)) { - this.fire('click', e); - } - }, - - _onMouseMove: function (e) { - if (!this._map || this._map._animatingZoom) { return; } - - // TODO don't do on each move - if (this._containsPoint(e.layerPoint)) { - this._ctx.canvas.style.cursor = 'pointer'; - this._mouseInside = true; - this.fire('mouseover', e); - - } else if (this._mouseInside) { - this._ctx.canvas.style.cursor = ''; - this._mouseInside = false; - this.fire('mouseout', e); - } - } -}); - -L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : { - _initPathRoot: function () { - var root = this._pathRoot, - ctx; - - if (!root) { - root = this._pathRoot = document.createElement('canvas'); - root.style.position = 'absolute'; - ctx = this._canvasCtx = root.getContext('2d'); - - ctx.lineCap = 'round'; - ctx.lineJoin = 'round'; - - this._panes.overlayPane.appendChild(root); - - if (this.options.zoomAnimation) { - this._pathRoot.className = 'leaflet-zoom-animated'; - this.on('zoomanim', this._animatePathZoom); - this.on('zoomend', this._endPathZoom); - } - this.on('moveend', this._updateCanvasViewport); - this._updateCanvasViewport(); - } - }, - - _updateCanvasViewport: function () { - // don't redraw while zooming. See _updateSvgViewport for more details - if (this._pathZooming) { return; } - this._updatePathViewport(); - - var vp = this._pathViewport, - min = vp.min, - size = vp.max.subtract(min), - root = this._pathRoot; - - //TODO check if this works properly on mobile webkit - L.DomUtil.setPosition(root, min); - root.width = size.x; - root.height = size.y; - root.getContext('2d').translate(-min.x, -min.y); - } -}); diff --git a/src/layer/vector/canvas/Polygon.Canvas.js b/src/layer/vector/canvas/Polygon.Canvas.js deleted file mode 100644 index 3451351108c..00000000000 --- a/src/layer/vector/canvas/Polygon.Canvas.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons. - */ - -L.Polygon.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p) { - var inside = false, - part, p1, p2, - i, j, k, - len, len2; - - // TODO optimization: check if within bounds first - - if (L.Polyline.prototype._containsPoint.call(this, p, true)) { - // click on polygon border - return true; - } - - // ray casting algorithm for detecting if point is in polygon - - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - p1 = part[j]; - p2 = part[k]; - - if (((p1.y > p.y) !== (p2.y > p.y)) && - (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { - inside = !inside; - } - } - } - - return inside; - } -}); diff --git a/src/layer/vector/canvas/Polyline.Canvas.js b/src/layer/vector/canvas/Polyline.Canvas.js deleted file mode 100644 index 7ecce3b6fd3..00000000000 --- a/src/layer/vector/canvas/Polyline.Canvas.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines. - */ - -L.Polyline.include(!L.Path.CANVAS ? {} : { - _containsPoint: function (p, closed) { - var i, j, k, len, len2, dist, part, - w = this.options.weight / 2; - - if (L.Browser.touch) { - w += 10; // polyline click tolerance on touch devices - } - - for (i = 0, len = this._parts.length; i < len; i++) { - part = this._parts[i]; - for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { - if (!closed && (j === 0)) { - continue; - } - - dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]); - - if (dist <= w) { - return true; - } - } - } - return false; - } -}); diff --git a/src/map/Map.js b/src/map/Map.js deleted file mode 100644 index b207019c5e8..00000000000 --- a/src/map/Map.js +++ /dev/null @@ -1,810 +0,0 @@ -/* - * L.Map is the central class of the API - it is used to create a map. - */ - -L.Map = L.Class.extend({ - - includes: L.Mixin.Events, - - options: { - crs: L.CRS.EPSG3857, - - /* - center: LatLng, - zoom: Number, - layers: Array, - */ - - fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23, - trackResize: true, - markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d - }, - - initialize: function (id, options) { // (HTMLElement or String, Object) - options = L.setOptions(this, options); - - - this._initContainer(id); - this._initLayout(); - - // hack for https://github.com/Leaflet/Leaflet/issues/1980 - this._onResize = L.bind(this._onResize, this); - - this._initEvents(); - - if (options.maxBounds) { - this.setMaxBounds(options.maxBounds); - } - - if (options.center && options.zoom !== undefined) { - this.setView(L.latLng(options.center), options.zoom, {reset: true}); - } - - this._handlers = []; - - this._layers = {}; - this._zoomBoundLayers = {}; - this._tileLayersNum = 0; - - this.callInitHooks(); - - this._addLayers(options.layers); - }, - - - // public methods that modify map state - - // replaced by animation-powered implementation in Map.PanAnimation.js - setView: function (center, zoom) { - zoom = zoom === undefined ? this.getZoom() : zoom; - this._resetView(L.latLng(center), this._limitZoom(zoom)); - return this; - }, - - setZoom: function (zoom, options) { - if (!this._loaded) { - this._zoom = this._limitZoom(zoom); - return this; - } - return this.setView(this.getCenter(), zoom, {zoom: options}); - }, - - zoomIn: function (delta, options) { - return this.setZoom(this._zoom + (delta || 1), options); - }, - - zoomOut: function (delta, options) { - return this.setZoom(this._zoom - (delta || 1), options); - }, - - setZoomAround: function (latlng, zoom, options) { - var scale = this.getZoomScale(zoom), - viewHalf = this.getSize().divideBy(2), - containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng), - - centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), - newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); - - return this.setView(newCenter, zoom, {zoom: options}); - }, - - fitBounds: function (bounds, options) { - - options = options || {}; - bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds); - - var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]), - paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]), - - zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)), - paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), - - swPoint = this.project(bounds.getSouthWest(), zoom), - nePoint = this.project(bounds.getNorthEast(), zoom), - center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); - - zoom = options && options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom; - - return this.setView(center, zoom, options); - }, - - fitWorld: function (options) { - return this.fitBounds([[-90, -180], [90, 180]], options); - }, - - panTo: function (center, options) { // (LatLng) - return this.setView(center, this._zoom, {pan: options}); - }, - - panBy: function (offset) { // (Point) - // replaced with animated panBy in Map.PanAnimation.js - this.fire('movestart'); - - this._rawPanBy(L.point(offset)); - - this.fire('move'); - return this.fire('moveend'); - }, - - setMaxBounds: function (bounds) { - bounds = L.latLngBounds(bounds); - - this.options.maxBounds = bounds; - - if (!bounds) { - return this.off('moveend', this._panInsideMaxBounds, this); - } - - if (this._loaded) { - this._panInsideMaxBounds(); - } - - return this.on('moveend', this._panInsideMaxBounds, this); - }, - - panInsideBounds: function (bounds, options) { - var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, bounds); - - if (center.equals(newCenter)) { return this; } - - return this.panTo(newCenter, options); - }, - - addLayer: function (layer) { - // TODO method is too big, refactor - - var id = L.stamp(layer); - - if (this._layers[id]) { return this; } - - this._layers[id] = layer; - - // TODO getMaxZoom, getMinZoom in ILayer (instead of options) - if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) { - this._zoomBoundLayers[id] = layer; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor!!! - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum++; - this._tileLayersToLoad++; - layer.on('load', this._onTileLayerLoad, this); - } - - if (this._loaded) { - this._layerAdd(layer); - } - - return this; - }, - - removeLayer: function (layer) { - var id = L.stamp(layer); - - if (!this._layers[id]) { return this; } - - if (this._loaded) { - layer.onRemove(this); - } - - delete this._layers[id]; - - if (this._loaded) { - this.fire('layerremove', {layer: layer}); - } - - if (this._zoomBoundLayers[id]) { - delete this._zoomBoundLayers[id]; - this._updateZoomLevels(); - } - - // TODO looks ugly, refactor - if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) { - this._tileLayersNum--; - this._tileLayersToLoad--; - layer.off('load', this._onTileLayerLoad, this); - } - - return this; - }, - - hasLayer: function (layer) { - if (!layer) { return false; } - - return (L.stamp(layer) in this._layers); - }, - - eachLayer: function (method, context) { - for (var i in this._layers) { - method.call(context, this._layers[i]); - } - return this; - }, - - invalidateSize: function (options) { - if (!this._loaded) { return this; } - - options = L.extend({ - animate: false, - pan: true - }, options === true ? {animate: true} : options); - - var oldSize = this.getSize(); - this._sizeChanged = true; - this._initialCenter = null; - - var newSize = this.getSize(), - oldCenter = oldSize.divideBy(2).round(), - newCenter = newSize.divideBy(2).round(), - offset = oldCenter.subtract(newCenter); - - if (!offset.x && !offset.y) { return this; } - - if (options.animate && options.pan) { - this.panBy(offset); - - } else { - if (options.pan) { - this._rawPanBy(offset); - } - - this.fire('move'); - - if (options.debounceMoveend) { - clearTimeout(this._sizeTimer); - this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200); - } else { - this.fire('moveend'); - } - } - - return this.fire('resize', { - oldSize: oldSize, - newSize: newSize - }); - }, - - // TODO handler.addTo - addHandler: function (name, HandlerClass) { - if (!HandlerClass) { return this; } - - var handler = this[name] = new HandlerClass(this); - - this._handlers.push(handler); - - if (this.options[name]) { - handler.enable(); - } - - return this; - }, - - remove: function () { - if (this._loaded) { - this.fire('unload'); - } - - this._initEvents('off'); - - try { - // throws error in IE6-8 - delete this._container._leaflet; - } catch (e) { - this._container._leaflet = undefined; - } - - this._clearPanes(); - if (this._clearControlPos) { - this._clearControlPos(); - } - - this._clearHandlers(); - - return this; - }, - - - // public methods for getting map state - - getCenter: function () { // (Boolean) -> LatLng - this._checkIfLoaded(); - - if (this._initialCenter && !this._moved()) { - return this._initialCenter; - } - return this.layerPointToLatLng(this._getCenterLayerPoint()); - }, - - getZoom: function () { - return this._zoom; - }, - - getBounds: function () { - var bounds = this.getPixelBounds(), - sw = this.unproject(bounds.getBottomLeft()), - ne = this.unproject(bounds.getTopRight()); - - return new L.LatLngBounds(sw, ne); - }, - - getMinZoom: function () { - return this.options.minZoom === undefined ? - (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) : - this.options.minZoom; - }, - - getMaxZoom: function () { - return this.options.maxZoom === undefined ? - (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : - this.options.maxZoom; - }, - - getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number - bounds = L.latLngBounds(bounds); - - var zoom = this.getMinZoom() - (inside ? 1 : 0), - maxZoom = this.getMaxZoom(), - size = this.getSize(), - - nw = bounds.getNorthWest(), - se = bounds.getSouthEast(), - - zoomNotFound = true, - boundsSize; - - padding = L.point(padding || [0, 0]); - - do { - zoom++; - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); - zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; - - } while (zoomNotFound && zoom <= maxZoom); - - if (zoomNotFound && inside) { - return null; - } - - return inside ? zoom : zoom - 1; - }, - - getSize: function () { - if (!this._size || this._sizeChanged) { - this._size = new L.Point( - this._container.clientWidth, - this._container.clientHeight); - - this._sizeChanged = false; - } - return this._size.clone(); - }, - - getPixelBounds: function () { - var topLeftPoint = this._getTopLeftPoint(); - return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); - }, - - getPixelOrigin: function () { - this._checkIfLoaded(); - return this._initialTopLeftPoint; - }, - - getPanes: function () { - return this._panes; - }, - - getContainer: function () { - return this._container; - }, - - - // TODO replace with universal implementation after refactoring projections - - getZoomScale: function (toZoom) { - var crs = this.options.crs; - return crs.scale(toZoom) / crs.scale(this._zoom); - }, - - getScaleZoom: function (scale) { - return this._zoom + (Math.log(scale) / Math.LN2); - }, - - - // conversion methods - - project: function (latlng, zoom) { // (LatLng[, Number]) -> Point - zoom = zoom === undefined ? this._zoom : zoom; - return this.options.crs.latLngToPoint(L.latLng(latlng), zoom); - }, - - unproject: function (point, zoom) { // (Point[, Number]) -> LatLng - zoom = zoom === undefined ? this._zoom : zoom; - return this.options.crs.pointToLatLng(L.point(point), zoom); - }, - - layerPointToLatLng: function (point) { // (Point) - var projectedPoint = L.point(point).add(this.getPixelOrigin()); - return this.unproject(projectedPoint); - }, - - latLngToLayerPoint: function (latlng) { // (LatLng) - var projectedPoint = this.project(L.latLng(latlng))._round(); - return projectedPoint._subtract(this.getPixelOrigin()); - }, - - containerPointToLayerPoint: function (point) { // (Point) - return L.point(point).subtract(this._getMapPanePos()); - }, - - layerPointToContainerPoint: function (point) { // (Point) - return L.point(point).add(this._getMapPanePos()); - }, - - containerPointToLatLng: function (point) { - var layerPoint = this.containerPointToLayerPoint(L.point(point)); - return this.layerPointToLatLng(layerPoint); - }, - - latLngToContainerPoint: function (latlng) { - return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng))); - }, - - mouseEventToContainerPoint: function (e) { // (MouseEvent) - return L.DomEvent.getMousePosition(e, this._container); - }, - - mouseEventToLayerPoint: function (e) { // (MouseEvent) - return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); - }, - - mouseEventToLatLng: function (e) { // (MouseEvent) - return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); - }, - - - // map initialization methods - - _initContainer: function (id) { - var container = this._container = L.DomUtil.get(id); - - if (!container) { - throw new Error('Map container not found.'); - } else if (container._leaflet) { - throw new Error('Map container is already initialized.'); - } - - container._leaflet = true; - }, - - _initLayout: function () { - var container = this._container; - - L.DomUtil.addClass(container, 'leaflet-container' + - (L.Browser.touch ? ' leaflet-touch' : '') + - (L.Browser.retina ? ' leaflet-retina' : '') + - (L.Browser.ielt9 ? ' leaflet-oldie' : '') + - (this.options.fadeAnimation ? ' leaflet-fade-anim' : '')); - - var position = L.DomUtil.getStyle(container, 'position'); - - if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { - container.style.position = 'relative'; - } - - this._initPanes(); - - if (this._initControlPos) { - this._initControlPos(); - } - }, - - _initPanes: function () { - var panes = this._panes = {}; - - this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container); - - this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane); - panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane); - panes.shadowPane = this._createPane('leaflet-shadow-pane'); - panes.overlayPane = this._createPane('leaflet-overlay-pane'); - panes.markerPane = this._createPane('leaflet-marker-pane'); - panes.popupPane = this._createPane('leaflet-popup-pane'); - - var zoomHide = ' leaflet-zoom-hide'; - - if (!this.options.markerZoomAnimation) { - L.DomUtil.addClass(panes.markerPane, zoomHide); - L.DomUtil.addClass(panes.shadowPane, zoomHide); - L.DomUtil.addClass(panes.popupPane, zoomHide); - } - }, - - _createPane: function (className, container) { - return L.DomUtil.create('div', className, container || this._panes.objectsPane); - }, - - _clearPanes: function () { - this._container.removeChild(this._mapPane); - }, - - _addLayers: function (layers) { - layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : []; - - for (var i = 0, len = layers.length; i < len; i++) { - this.addLayer(layers[i]); - } - }, - - - // private methods that modify map state - - _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) { - - var zoomChanged = (this._zoom !== zoom); - - if (!afterZoomAnim) { - this.fire('movestart'); - - if (zoomChanged) { - this.fire('zoomstart'); - } - } - - this._zoom = zoom; - this._initialCenter = center; - - this._initialTopLeftPoint = this._getNewTopLeftPoint(center); - - if (!preserveMapOffset) { - L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)); - } else { - this._initialTopLeftPoint._add(this._getMapPanePos()); - } - - this._tileLayersToLoad = this._tileLayersNum; - - var loading = !this._loaded; - this._loaded = true; - - if (loading) { - this.fire('load'); - this.eachLayer(this._layerAdd, this); - } - - this.fire('viewreset', {hard: !preserveMapOffset}); - - this.fire('move'); - - if (zoomChanged || afterZoomAnim) { - this.fire('zoomend'); - } - - this.fire('moveend', {hard: !preserveMapOffset}); - }, - - _rawPanBy: function (offset) { - L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); - }, - - _getZoomSpan: function () { - return this.getMaxZoom() - this.getMinZoom(); - }, - - _updateZoomLevels: function () { - var i, - minZoom = Infinity, - maxZoom = -Infinity, - oldZoomSpan = this._getZoomSpan(); - - for (i in this._zoomBoundLayers) { - var layer = this._zoomBoundLayers[i]; - if (!isNaN(layer.options.minZoom)) { - minZoom = Math.min(minZoom, layer.options.minZoom); - } - if (!isNaN(layer.options.maxZoom)) { - maxZoom = Math.max(maxZoom, layer.options.maxZoom); - } - } - - if (i === undefined) { // we have no tilelayers - this._layersMaxZoom = this._layersMinZoom = undefined; - } else { - this._layersMaxZoom = maxZoom; - this._layersMinZoom = minZoom; - } - - if (oldZoomSpan !== this._getZoomSpan()) { - this.fire('zoomlevelschange'); - } - }, - - _panInsideMaxBounds: function () { - this.panInsideBounds(this.options.maxBounds); - }, - - _checkIfLoaded: function () { - if (!this._loaded) { - throw new Error('Set map center and zoom first.'); - } - }, - - // map events - - _initEvents: function (onOff) { - if (!L.DomEvent) { return; } - - onOff = onOff || 'on'; - - L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this); - - var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter', - 'mouseleave', 'mousemove', 'contextmenu'], - i, len; - - for (i = 0, len = events.length; i < len; i++) { - L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this); - } - - if (this.options.trackResize) { - L.DomEvent[onOff](window, 'resize', this._onResize, this); - } - }, - - _onResize: function () { - L.Util.cancelAnimFrame(this._resizeRequest); - this._resizeRequest = L.Util.requestAnimFrame( - function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container); - }, - - _onMouseClick: function (e) { - if (!this._loaded || (!e._simulated && - ((this.dragging && this.dragging.moved()) || - (this.boxZoom && this.boxZoom.moved()))) || - L.DomEvent._skipped(e)) { return; } - - this.fire('preclick'); - this._fireMouseEvent(e); - }, - - _fireMouseEvent: function (e) { - if (!this._loaded || L.DomEvent._skipped(e)) { return; } - - var type = e.type; - - type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type)); - - if (!this.hasEventListeners(type)) { return; } - - if (type === 'contextmenu') { - L.DomEvent.preventDefault(e); - } - - var containerPoint = this.mouseEventToContainerPoint(e), - layerPoint = this.containerPointToLayerPoint(containerPoint), - latlng = this.layerPointToLatLng(layerPoint); - - this.fire(type, { - latlng: latlng, - layerPoint: layerPoint, - containerPoint: containerPoint, - originalEvent: e - }); - }, - - _onTileLayerLoad: function () { - this._tileLayersToLoad--; - if (this._tileLayersNum && !this._tileLayersToLoad) { - this.fire('tilelayersload'); - } - }, - - _clearHandlers: function () { - for (var i = 0, len = this._handlers.length; i < len; i++) { - this._handlers[i].disable(); - } - }, - - whenReady: function (callback, context) { - if (this._loaded) { - callback.call(context || this, this); - } else { - this.on('load', callback, context); - } - return this; - }, - - _layerAdd: function (layer) { - layer.onAdd(this); - this.fire('layeradd', {layer: layer}); - }, - - - // private methods for getting map state - - _getMapPanePos: function () { - return L.DomUtil.getPosition(this._mapPane); - }, - - _moved: function () { - var pos = this._getMapPanePos(); - return pos && !pos.equals([0, 0]); - }, - - _getTopLeftPoint: function () { - return this.getPixelOrigin().subtract(this._getMapPanePos()); - }, - - _getNewTopLeftPoint: function (center, zoom) { - var viewHalf = this.getSize()._divideBy(2); - // TODO round on display, not calculation to increase precision? - return this.project(center, zoom)._subtract(viewHalf)._round(); - }, - - _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) { - var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos()); - return this.project(latlng, newZoom)._subtract(topLeft); - }, - - // layer point of the current center - _getCenterLayerPoint: function () { - return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); - }, - - // offset of the specified place to the current center in pixels - _getCenterOffset: function (latlng) { - return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); - }, - - // adjust center for view to get inside bounds - _limitCenter: function (center, zoom, bounds) { - - if (!bounds) { return center; } - - var centerPoint = this.project(center, zoom), - viewHalf = this.getSize().divideBy(2), - viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), - offset = this._getBoundsOffset(viewBounds, bounds, zoom); - - return this.unproject(centerPoint.add(offset), zoom); - }, - - // adjust offset for view to get inside bounds - _limitOffset: function (offset, bounds) { - if (!bounds) { return offset; } - - var viewBounds = this.getPixelBounds(), - newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset)); - - return offset.add(this._getBoundsOffset(newBounds, bounds)); - }, - - // returns offset needed for pxBounds to get inside maxBounds at a specified zoom - _getBoundsOffset: function (pxBounds, maxBounds, zoom) { - var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min), - seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max), - - dx = this._rebound(nwOffset.x, -seOffset.x), - dy = this._rebound(nwOffset.y, -seOffset.y); - - return new L.Point(dx, dy); - }, - - _rebound: function (left, right) { - return left + right > 0 ? - Math.round(left - right) / 2 : - Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right)); - }, - - _limitZoom: function (zoom) { - var min = this.getMinZoom(), - max = this.getMaxZoom(); - - return Math.max(min, Math.min(max, zoom)); - } -}); - -L.map = function (id, options) { - return new L.Map(id, options); -}; diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js deleted file mode 100644 index 777ea7b9312..00000000000 --- a/src/map/anim/Map.PanAnimation.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Extends L.Map to handle panning animations. - */ - -L.Map.include({ - - setView: function (center, zoom, options) { - - zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); - center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds); - options = options || {}; - - if (this._panAnim) { - this._panAnim.stop(); - } - - if (this._loaded && !options.reset && options !== true) { - - if (options.animate !== undefined) { - options.zoom = L.extend({animate: options.animate}, options.zoom); - options.pan = L.extend({animate: options.animate}, options.pan); - } - - // try animating pan or zoom - var animated = (this._zoom !== zoom) ? - this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : - this._tryAnimatedPan(center, options.pan); - - if (animated) { - // prevent resize handler call, the view will refresh after animation anyway - clearTimeout(this._sizeTimer); - return this; - } - } - - // animation didn't start, just reset the map view - this._resetView(center, zoom); - - return this; - }, - - panBy: function (offset, options) { - offset = L.point(offset).round(); - options = options || {}; - - if (!offset.x && !offset.y) { - return this; - } - - if (!this._panAnim) { - this._panAnim = new L.PosAnimation(); - - this._panAnim.on({ - 'step': this._onPanTransitionStep, - 'end': this._onPanTransitionEnd - }, this); - } - - // don't fire movestart if animating inertia - if (!options.noMoveStart) { - this.fire('movestart'); - } - - // animate pan unless animate: false specified - if (options.animate !== false) { - L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); - - var newPos = this._getMapPanePos().subtract(offset); - this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); - } else { - this._rawPanBy(offset); - this.fire('move').fire('moveend'); - } - - return this; - }, - - _onPanTransitionStep: function () { - this.fire('move'); - }, - - _onPanTransitionEnd: function () { - L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim'); - this.fire('moveend'); - }, - - _tryAnimatedPan: function (center, options) { - // difference between the new and current centers in pixels - var offset = this._getCenterOffset(center)._floor(); - - // don't animate too far unless animate: true specified in options - if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } - - this.panBy(offset, options); - - return true; - } -}); diff --git a/src/map/anim/Map.ZoomAnimation.js b/src/map/anim/Map.ZoomAnimation.js deleted file mode 100644 index ead4fbd1a12..00000000000 --- a/src/map/anim/Map.ZoomAnimation.js +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Extends L.Map to handle zoom animations. - */ - -L.Map.mergeOptions({ - zoomAnimation: true, - zoomAnimationThreshold: 4 -}); - -if (L.DomUtil.TRANSITION) { - - L.Map.addInitHook(function () { - // don't animate on browsers without hardware-accelerated transitions or old Android/Opera - this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION && - L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera; - - // zoom transitions run with the same duration for all layers, so if one of transitionend events - // happens after starting zoom animation (propagating to the map pane), we know that it ended globally - if (this._zoomAnimated) { - L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this); - } - }); -} - -L.Map.include(!L.DomUtil.TRANSITION ? {} : { - - _catchTransitionEnd: function (e) { - if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { - this._onZoomTransitionEnd(); - } - }, - - _nothingToAnimate: function () { - return !this._container.getElementsByClassName('leaflet-zoom-animated').length; - }, - - _tryAnimatedZoom: function (center, zoom, options) { - - if (this._animatingZoom) { return true; } - - options = options || {}; - - // don't animate if disabled, not supported or zoom difference is too large - if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || - Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } - - // offset is the pixel coords of the zoom origin relative to the current center - var scale = this.getZoomScale(zoom), - offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale), - origin = this._getCenterLayerPoint()._add(offset); - - // don't animate if the zoom origin isn't within one screen from the current center, unless forced - if (options.animate !== true && !this.getSize().contains(offset)) { return false; } - - this - .fire('movestart') - .fire('zoomstart'); - - this._animateZoom(center, zoom, origin, scale, null, true); - - return true; - }, - - _animateZoom: function (center, zoom, origin, scale, delta, backwards) { - - this._animatingZoom = true; - - // put transform transition on all layers with leaflet-zoom-animated class - L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim'); - - // remember what center/zoom to set after animation - this._animateToCenter = center; - this._animateToZoom = zoom; - - // disable any dragging during animation - if (L.Draggable) { - L.Draggable._disabled = true; - } - - this.fire('zoomanim', { - center: center, - zoom: zoom, - origin: origin, - scale: scale, - delta: delta, - backwards: backwards - }); - }, - - _onZoomTransitionEnd: function () { - - this._animatingZoom = false; - - L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim'); - - this._resetView(this._animateToCenter, this._animateToZoom, true, true); - - if (L.Draggable) { - L.Draggable._disabled = false; - } - } -}); diff --git a/src/map/ext/Map.Geolocation.js b/src/map/ext/Map.Geolocation.js deleted file mode 100644 index 84f5487dfa9..00000000000 --- a/src/map/ext/Map.Geolocation.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Provides L.Map with convenient shortcuts for using browser geolocation features. - */ - -L.Map.include({ - _defaultLocateOptions: { - watch: false, - setView: false, - maxZoom: Infinity, - timeout: 10000, - maximumAge: 0, - enableHighAccuracy: false - }, - - locate: function (/*Object*/ options) { - - options = this._locateOptions = L.extend(this._defaultLocateOptions, options); - - if (!navigator.geolocation) { - this._handleGeolocationError({ - code: 0, - message: 'Geolocation not supported.' - }); - return this; - } - - var onResponse = L.bind(this._handleGeolocationResponse, this), - onError = L.bind(this._handleGeolocationError, this); - - if (options.watch) { - this._locationWatchId = - navigator.geolocation.watchPosition(onResponse, onError, options); - } else { - navigator.geolocation.getCurrentPosition(onResponse, onError, options); - } - return this; - }, - - stopLocate: function () { - if (navigator.geolocation) { - navigator.geolocation.clearWatch(this._locationWatchId); - } - if (this._locateOptions) { - this._locateOptions.setView = false; - } - return this; - }, - - _handleGeolocationError: function (error) { - var c = error.code, - message = error.message || - (c === 1 ? 'permission denied' : - (c === 2 ? 'position unavailable' : 'timeout')); - - if (this._locateOptions.setView && !this._loaded) { - this.fitWorld(); - } - - this.fire('locationerror', { - code: c, - message: 'Geolocation error: ' + message + '.' - }); - }, - - _handleGeolocationResponse: function (pos) { - var lat = pos.coords.latitude, - lng = pos.coords.longitude, - latlng = new L.LatLng(lat, lng), - - latAccuracy = 180 * pos.coords.accuracy / 40075017, - lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat), - - bounds = L.latLngBounds( - [lat - latAccuracy, lng - lngAccuracy], - [lat + latAccuracy, lng + lngAccuracy]), - - options = this._locateOptions; - - if (options.setView) { - var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom); - this.setView(latlng, zoom); - } - - var data = { - latlng: latlng, - bounds: bounds, - timestamp: pos.timestamp - }; - - for (var i in pos.coords) { - if (typeof pos.coords[i] === 'number') { - data[i] = pos.coords[i]; - } - } - - this.fire('locationfound', data); - } -}); diff --git a/src/map/handler/Map.BoxZoom.js b/src/map/handler/Map.BoxZoom.js deleted file mode 100644 index 7198854d6f5..00000000000 --- a/src/map/handler/Map.BoxZoom.js +++ /dev/null @@ -1,118 +0,0 @@ -/* - * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map - * (zoom to a selected bounding box), enabled by default. - */ - -L.Map.mergeOptions({ - boxZoom: true -}); - -L.Map.BoxZoom = L.Handler.extend({ - initialize: function (map) { - this._map = map; - this._container = map._container; - this._pane = map._panes.overlayPane; - this._moved = false; - }, - - addHooks: function () { - L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._container, 'mousedown', this._onMouseDown); - this._moved = false; - }, - - moved: function () { - return this._moved; - }, - - _onMouseDown: function (e) { - this._moved = false; - - if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; } - - L.DomUtil.disableTextSelection(); - L.DomUtil.disableImageDrag(); - - this._startLayerPoint = this._map.mouseEventToLayerPoint(e); - - L.DomEvent - .on(document, 'mousemove', this._onMouseMove, this) - .on(document, 'mouseup', this._onMouseUp, this) - .on(document, 'keydown', this._onKeyDown, this); - }, - - _onMouseMove: function (e) { - if (!this._moved) { - this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane); - L.DomUtil.setPosition(this._box, this._startLayerPoint); - - //TODO refactor: move cursor to styles - this._container.style.cursor = 'crosshair'; - this._map.fire('boxzoomstart'); - } - - var startPoint = this._startLayerPoint, - box = this._box, - - layerPoint = this._map.mouseEventToLayerPoint(e), - offset = layerPoint.subtract(startPoint), - - newPos = new L.Point( - Math.min(layerPoint.x, startPoint.x), - Math.min(layerPoint.y, startPoint.y)); - - L.DomUtil.setPosition(box, newPos); - - this._moved = true; - - // TODO refactor: remove hardcoded 4 pixels - box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px'; - box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px'; - }, - - _finish: function () { - if (this._moved) { - this._pane.removeChild(this._box); - this._container.style.cursor = ''; - } - - L.DomUtil.enableTextSelection(); - L.DomUtil.enableImageDrag(); - - L.DomEvent - .off(document, 'mousemove', this._onMouseMove) - .off(document, 'mouseup', this._onMouseUp) - .off(document, 'keydown', this._onKeyDown); - }, - - _onMouseUp: function (e) { - - this._finish(); - - var map = this._map, - layerPoint = map.mouseEventToLayerPoint(e); - - if (this._startLayerPoint.equals(layerPoint)) { return; } - - var bounds = new L.LatLngBounds( - map.layerPointToLatLng(this._startLayerPoint), - map.layerPointToLatLng(layerPoint)); - - map.fitBounds(bounds); - - map.fire('boxzoomend', { - boxZoomBounds: bounds - }); - }, - - _onKeyDown: function (e) { - if (e.keyCode === 27) { - this._finish(); - } - } -}); - -L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom); diff --git a/src/map/handler/Map.DoubleClickZoom.js b/src/map/handler/Map.DoubleClickZoom.js deleted file mode 100644 index 6399734ee7e..00000000000 --- a/src/map/handler/Map.DoubleClickZoom.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default. - */ - -L.Map.mergeOptions({ - doubleClickZoom: true -}); - -L.Map.DoubleClickZoom = L.Handler.extend({ - addHooks: function () { - this._map.on('dblclick', this._onDoubleClick, this); - }, - - removeHooks: function () { - this._map.off('dblclick', this._onDoubleClick, this); - }, - - _onDoubleClick: function (e) { - var map = this._map, - zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1); - - if (map.options.doubleClickZoom === 'center') { - map.setZoom(zoom); - } else { - map.setZoomAround(e.containerPoint, zoom); - } - } -}); - -L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom); diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js deleted file mode 100644 index af4eff67e6a..00000000000 --- a/src/map/handler/Map.Drag.js +++ /dev/null @@ -1,152 +0,0 @@ -/* - * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default. - */ - -L.Map.mergeOptions({ - dragging: true, - - inertia: !L.Browser.android23, - inertiaDeceleration: 3400, // px/s^2 - inertiaMaxSpeed: Infinity, // px/s - inertiaThreshold: L.Browser.touch ? 32 : 18, // ms - easeLinearity: 0.25, - - // TODO refactor, move to CRS - worldCopyJump: false -}); - -L.Map.Drag = L.Handler.extend({ - addHooks: function () { - if (!this._draggable) { - var map = this._map; - - this._draggable = new L.Draggable(map._mapPane, map._container); - - this._draggable.on({ - 'dragstart': this._onDragStart, - 'drag': this._onDrag, - 'dragend': this._onDragEnd - }, this); - - if (map.options.worldCopyJump) { - this._draggable.on('predrag', this._onPreDrag, this); - map.on('viewreset', this._onViewReset, this); - - map.whenReady(this._onViewReset, this); - } - } - this._draggable.enable(); - }, - - removeHooks: function () { - this._draggable.disable(); - }, - - moved: function () { - return this._draggable && this._draggable._moved; - }, - - _onDragStart: function () { - var map = this._map; - - if (map._panAnim) { - map._panAnim.stop(); - } - - map - .fire('movestart') - .fire('dragstart'); - - if (map.options.inertia) { - this._positions = []; - this._times = []; - } - }, - - _onDrag: function () { - if (this._map.options.inertia) { - var time = this._lastTime = +new Date(), - pos = this._lastPos = this._draggable._newPos; - - this._positions.push(pos); - this._times.push(time); - - if (time - this._times[0] > 200) { - this._positions.shift(); - this._times.shift(); - } - } - - this._map - .fire('move') - .fire('drag'); - }, - - _onViewReset: function () { - // TODO fix hardcoded Earth values - var pxCenter = this._map.getSize()._divideBy(2), - pxWorldCenter = this._map.latLngToLayerPoint([0, 0]); - - this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x; - this._worldWidth = this._map.project([0, 180]).x; - }, - - _onPreDrag: function () { - // TODO refactor to be able to adjust map pane position after zoom - var worldWidth = this._worldWidth, - halfWidth = Math.round(worldWidth / 2), - dx = this._initialWorldOffset, - x = this._draggable._newPos.x, - newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx, - newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx, - newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2; - - this._draggable._newPos.x = newX; - }, - - _onDragEnd: function (e) { - var map = this._map, - options = map.options, - delay = +new Date() - this._lastTime, - - noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0]; - - map.fire('dragend', e); - - if (noInertia) { - map.fire('moveend'); - - } else { - - var direction = this._lastPos.subtract(this._positions[0]), - duration = (this._lastTime + delay - this._times[0]) / 1000, - ease = options.easeLinearity, - - speedVector = direction.multiplyBy(ease / duration), - speed = speedVector.distanceTo([0, 0]), - - limitedSpeed = Math.min(options.inertiaMaxSpeed, speed), - limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed), - - decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease), - offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round(); - - if (!offset.x || !offset.y) { - map.fire('moveend'); - - } else { - offset = map._limitOffset(offset, map.options.maxBounds); - - L.Util.requestAnimFrame(function () { - map.panBy(offset, { - duration: decelerationDuration, - easeLinearity: ease, - noMoveStart: true - }); - }); - } - } - } -}); - -L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag); diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js deleted file mode 100644 index 3e63993c96c..00000000000 --- a/src/map/handler/Map.Keyboard.js +++ /dev/null @@ -1,150 +0,0 @@ -/* - * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default. - */ - -L.Map.mergeOptions({ - keyboard: true, - keyboardPanOffset: 80, - keyboardZoomOffset: 1 -}); - -L.Map.Keyboard = L.Handler.extend({ - - keyCodes: { - left: [37], - right: [39], - down: [40], - up: [38], - zoomIn: [187, 107, 61, 171], - zoomOut: [189, 109, 173] - }, - - initialize: function (map) { - this._map = map; - - this._setPanOffset(map.options.keyboardPanOffset); - this._setZoomOffset(map.options.keyboardZoomOffset); - }, - - addHooks: function () { - var container = this._map._container; - - // make the container focusable by tabbing - if (container.tabIndex === -1) { - container.tabIndex = '0'; - } - - L.DomEvent - .on(container, 'focus', this._onFocus, this) - .on(container, 'blur', this._onBlur, this) - .on(container, 'mousedown', this._onMouseDown, this); - - this._map - .on('focus', this._addHooks, this) - .on('blur', this._removeHooks, this); - }, - - removeHooks: function () { - this._removeHooks(); - - var container = this._map._container; - - L.DomEvent - .off(container, 'focus', this._onFocus, this) - .off(container, 'blur', this._onBlur, this) - .off(container, 'mousedown', this._onMouseDown, this); - - this._map - .off('focus', this._addHooks, this) - .off('blur', this._removeHooks, this); - }, - - _onMouseDown: function () { - if (this._focused) { return; } - - var body = document.body, - docEl = document.documentElement, - top = body.scrollTop || docEl.scrollTop, - left = body.scrollLeft || docEl.scrollLeft; - - this._map._container.focus(); - - window.scrollTo(left, top); - }, - - _onFocus: function () { - this._focused = true; - this._map.fire('focus'); - }, - - _onBlur: function () { - this._focused = false; - this._map.fire('blur'); - }, - - _setPanOffset: function (pan) { - var keys = this._panKeys = {}, - codes = this.keyCodes, - i, len; - - for (i = 0, len = codes.left.length; i < len; i++) { - keys[codes.left[i]] = [-1 * pan, 0]; - } - for (i = 0, len = codes.right.length; i < len; i++) { - keys[codes.right[i]] = [pan, 0]; - } - for (i = 0, len = codes.down.length; i < len; i++) { - keys[codes.down[i]] = [0, pan]; - } - for (i = 0, len = codes.up.length; i < len; i++) { - keys[codes.up[i]] = [0, -1 * pan]; - } - }, - - _setZoomOffset: function (zoom) { - var keys = this._zoomKeys = {}, - codes = this.keyCodes, - i, len; - - for (i = 0, len = codes.zoomIn.length; i < len; i++) { - keys[codes.zoomIn[i]] = zoom; - } - for (i = 0, len = codes.zoomOut.length; i < len; i++) { - keys[codes.zoomOut[i]] = -zoom; - } - }, - - _addHooks: function () { - L.DomEvent.on(document, 'keydown', this._onKeyDown, this); - }, - - _removeHooks: function () { - L.DomEvent.off(document, 'keydown', this._onKeyDown, this); - }, - - _onKeyDown: function (e) { - var key = e.keyCode, - map = this._map; - - if (key in this._panKeys) { - - if (map._panAnim && map._panAnim._inProgress) { return; } - - map.panBy(this._panKeys[key]); - - if (map.options.maxBounds) { - map.panInsideBounds(map.options.maxBounds); - } - - } else if (key in this._zoomKeys) { - map.setZoom(map.getZoom() + this._zoomKeys[key]); - - } else { - return; - } - - L.DomEvent.stop(e); - } -}); - -L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard); diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js deleted file mode 100644 index bb9cc8fd4f1..00000000000 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map. - */ - -L.Map.mergeOptions({ - scrollWheelZoom: true -}); - -L.Map.ScrollWheelZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this); - L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - this._delta = 0; - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll); - L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault); - }, - - _onWheelScroll: function (e) { - var delta = L.DomEvent.getWheelDelta(e); - - this._delta += delta; - this._lastMousePos = this._map.mouseEventToContainerPoint(e); - - if (!this._startTime) { - this._startTime = +new Date(); - } - - var left = Math.max(40 - (+new Date() - this._startTime), 0); - - clearTimeout(this._timer); - this._timer = setTimeout(L.bind(this._performZoom, this), left); - - L.DomEvent.preventDefault(e); - L.DomEvent.stopPropagation(e); - }, - - _performZoom: function () { - var map = this._map, - delta = this._delta, - zoom = map.getZoom(); - - delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta); - delta = Math.max(Math.min(delta, 4), -4); - delta = map._limitZoom(zoom + delta) - zoom; - - this._delta = 0; - this._startTime = null; - - if (!delta) { return; } - - if (map.options.scrollWheelZoom === 'center') { - map.setZoom(zoom + delta); - } else { - map.setZoomAround(this._lastMousePos, zoom + delta); - } - } -}); - -L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom); diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js deleted file mode 100644 index 7682daaa20a..00000000000 --- a/src/map/handler/Map.Tap.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * L.Map.Tap is used to enable mobile hacks like quick taps and long hold. - */ - -L.Map.mergeOptions({ - tap: true, - tapTolerance: 15 -}); - -L.Map.Tap = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this); - }, - - _onDown: function (e) { - if (!e.touches) { return; } - - L.DomEvent.preventDefault(e); - - this._fireClick = true; - - // don't simulate click or track longpress if more than 1 touch - if (e.touches.length > 1) { - this._fireClick = false; - clearTimeout(this._holdTimeout); - return; - } - - var first = e.touches[0], - el = first.target; - - this._startPos = this._newPos = new L.Point(first.clientX, first.clientY); - - // if touching a link, highlight it - if (el.tagName && el.tagName.toLowerCase() === 'a') { - L.DomUtil.addClass(el, 'leaflet-active'); - } - - // simulate long hold but setting a timeout - this._holdTimeout = setTimeout(L.bind(function () { - if (this._isTapValid()) { - this._fireClick = false; - this._onUp(); - this._simulateEvent('contextmenu', first); - } - }, this), 1000); - - L.DomEvent - .on(document, 'touchmove', this._onMove, this) - .on(document, 'touchend', this._onUp, this); - }, - - _onUp: function (e) { - clearTimeout(this._holdTimeout); - - L.DomEvent - .off(document, 'touchmove', this._onMove, this) - .off(document, 'touchend', this._onUp, this); - - if (this._fireClick && e && e.changedTouches) { - - var first = e.changedTouches[0], - el = first.target; - - if (el && el.tagName && el.tagName.toLowerCase() === 'a') { - L.DomUtil.removeClass(el, 'leaflet-active'); - } - - // simulate click if the touch didn't move too much - if (this._isTapValid()) { - this._simulateEvent('click', first); - } - } - }, - - _isTapValid: function () { - return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance; - }, - - _onMove: function (e) { - var first = e.touches[0]; - this._newPos = new L.Point(first.clientX, first.clientY); - }, - - _simulateEvent: function (type, e) { - var simulatedEvent = document.createEvent('MouseEvents'); - - simulatedEvent._simulated = true; - e.target._simulatedClick = true; - - simulatedEvent.initMouseEvent( - type, true, true, window, 1, - e.screenX, e.screenY, - e.clientX, e.clientY, - false, false, false, false, 0, null); - - e.target.dispatchEvent(simulatedEvent); - } -}); - -if (L.Browser.touch && !L.Browser.pointer) { - L.Map.addInitHook('addHandler', 'tap', L.Map.Tap); -} diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js deleted file mode 100644 index 7f9ea6628ad..00000000000 --- a/src/map/handler/Map.TouchZoom.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers. - */ - -L.Map.mergeOptions({ - touchZoom: L.Browser.touch && !L.Browser.android23, - bounceAtZoomLimits: true -}); - -L.Map.TouchZoom = L.Handler.extend({ - addHooks: function () { - L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - removeHooks: function () { - L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this); - }, - - _onTouchStart: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; } - - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]), - viewCenter = map._getCenterLayerPoint(); - - this._startCenter = p1.add(p2)._divideBy(2); - this._startDist = p1.distanceTo(p2); - - this._moved = false; - this._zooming = true; - - this._centerOffset = viewCenter.subtract(this._startCenter); - - if (map._panAnim) { - map._panAnim.stop(); - } - - L.DomEvent - .on(document, 'touchmove', this._onTouchMove, this) - .on(document, 'touchend', this._onTouchEnd, this); - - L.DomEvent.preventDefault(e); - }, - - _onTouchMove: function (e) { - var map = this._map; - - if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; } - - var p1 = map.mouseEventToLayerPoint(e.touches[0]), - p2 = map.mouseEventToLayerPoint(e.touches[1]); - - this._scale = p1.distanceTo(p2) / this._startDist; - this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter); - - if (this._scale === 1) { return; } - - if (!map.options.bounceAtZoomLimits) { - if ((map.getZoom() === map.getMinZoom() && this._scale < 1) || - (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; } - } - - if (!this._moved) { - L.DomUtil.addClass(map._mapPane, 'leaflet-touching'); - - map - .fire('movestart') - .fire('zoomstart'); - - this._moved = true; - } - - L.Util.cancelAnimFrame(this._animRequest); - this._animRequest = L.Util.requestAnimFrame( - this._updateOnMove, this, true, this._map._container); - - L.DomEvent.preventDefault(e); - }, - - _updateOnMove: function () { - var map = this._map, - origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - zoom = map.getScaleZoom(this._scale); - - map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta); - }, - - _onTouchEnd: function () { - if (!this._moved || !this._zooming) { - this._zooming = false; - return; - } - - var map = this._map; - - this._zooming = false; - L.DomUtil.removeClass(map._mapPane, 'leaflet-touching'); - L.Util.cancelAnimFrame(this._animRequest); - - L.DomEvent - .off(document, 'touchmove', this._onTouchMove) - .off(document, 'touchend', this._onTouchEnd); - - var origin = this._getScaleOrigin(), - center = map.layerPointToLatLng(origin), - - oldZoom = map.getZoom(), - floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom, - roundZoomDelta = (floatZoomDelta > 0 ? - Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)), - - zoom = map._limitZoom(oldZoom + roundZoomDelta), - scale = map.getZoomScale(zoom) / this._scale; - - map._animateZoom(center, zoom, origin, scale); - }, - - _getScaleOrigin: function () { - var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale); - return this._startCenter.add(centerOffset); - } -}); - -L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom); From 341d3697fb9dda03f8fb4cb605acb71a43fa6c39 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 26 Oct 2015 13:39:10 +0200 Subject: [PATCH 1925/2207] fix download link, close #3963 --- download.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download.md b/download.md index 534bc990628..b3d7b3f275e 100644 --- a/download.md +++ b/download.md @@ -12,7 +12,7 @@ bodyclass: download-page Description - Leaflet 0.7.7 + Leaflet 0.7.7 Stable version, released on November 18, 2013 and last updated on October 26, 2015. From ca43794128faef6caea56c91fef79bec814da141 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 26 Oct 2015 19:25:39 +0200 Subject: [PATCH 1926/2207] simplify bower setup, remove component Component is not an active project anymore, and bower no longer requires a version field in the config. --- build/bower.json => bower.json | 0 build/component.json | 19 ------------------- build/publish.sh | 4 ---- package.json | 2 -- 4 files changed, 25 deletions(-) rename build/bower.json => bower.json (100%) delete mode 100644 build/component.json diff --git a/build/bower.json b/bower.json similarity index 100% rename from build/bower.json rename to bower.json diff --git a/build/component.json b/build/component.json deleted file mode 100644 index 7b9d53b3d21..00000000000 --- a/build/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "leaflet", - "description": "JavaScript library for mobile-friendly interactive maps", - "scripts": [ - "dist/leaflet.js", - "dist/leaflet-src.js" - ], - "images":[ - "dist/images/layers-2x.png", - "dist/images/layers.png", - "dist/images/marker-icon-2x.png", - "dist/images/marker-icon.png", - "dist/images/marker-shadow.png" - ], - "styles":[ - "dist/leaflet.css" - ], - "main": "dist/leaflet-src.js" -} \ No newline at end of file diff --git a/build/publish.sh b/build/publish.sh index f91291c4a08..ede7e3595c3 100755 --- a/build/publish.sh +++ b/build/publish.sh @@ -11,10 +11,6 @@ git checkout -b build npm run build git add dist/leaflet-src.js dist/leaflet.js dist/leaflet-src.map -f -copyfiles -u 1 build/*.json ./ -tin -v $VERSION -git add component.json bower.json -f - git commit -m "v$VERSION" git tag v$VERSION -f diff --git a/package.json b/package.json index 3a30508947f..dcf1c01dc92 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "version": "1.0.0-beta.2", "description": "JavaScript library for mobile-friendly interactive maps", "devDependencies": { - "copyfiles": "0.2.1", "eslint": "^1.5.1", "eslint-config-mourner": "^1.0.0", "happen": "~0.2.0", @@ -18,7 +17,6 @@ "magic-string": "^0.7.0", "mocha": "~2.3.0", "phantomjs": "^1.9.18", - "tin": "^0.5.0", "uglify-js": "~2.4.23" }, "main": "dist/leaflet-src.js", From 1d9f270320e4c337d23732a5b45f478e257c3cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 29 Oct 2015 12:42:53 +0100 Subject: [PATCH 1927/2207] Integration plugins: JSF2Leaf --- plugins.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index a7f1eb33137..9f1b0984dc4 100644 --- a/plugins.md +++ b/plugins.md @@ -2785,7 +2785,6 @@ Ease your development integrating Leaflet into a development framework or automa Prateek Saxena - Leaflet map component @@ -2797,6 +2796,17 @@ Ease your development integrating Leaflet into a development framework or automa Prateek Saxena + + + JSF2Leaf + + + A JavaServer Faces wrapper for Leaflet. + + + Leonardo Ciocari + + From 772220070f0de84dc2adc12c3adb89b607cfa7d3 Mon Sep 17 00:00:00 2001 From: Haoyang Xu Date: Fri, 30 Oct 2015 20:50:28 +0800 Subject: [PATCH 1928/2207] init interaction regardless of new icon or not [issue #3976] previously interaction only get inited when not reusing icon, i.e. when addIcon flag is set to true. by taking the statement out of the if condition, interaction is inited whenever setIcon is called. --- src/layer/marker/Marker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/marker/Marker.js b/src/layer/marker/Marker.js index 836c36be4e2..e03a1392bb5 100644 --- a/src/layer/marker/Marker.js +++ b/src/layer/marker/Marker.js @@ -159,8 +159,8 @@ L.Marker = L.Layer.extend({ if (addIcon) { this.getPane().appendChild(this._icon); - this._initInteraction(); } + this._initInteraction(); if (newShadow && addShadow) { this.getPane('shadowPane').appendChild(this._shadow); } From 162190c5fa6ebff751e34fd41b37f353cbbc05ef Mon Sep 17 00:00:00 2001 From: simsibimsiwimsi Date: Sun, 8 Nov 2015 22:35:49 +0100 Subject: [PATCH 1929/2207] fixed check for maxZoom option to honor maxZoom 0 Checking if maxZoom is a number will work fine for {maxZoom: 0} where options.maxZoom evaluates to false. --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 2aa2418fa9e..18db3478a78 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -98,7 +98,7 @@ L.Map = L.Class.extend({ zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); - zoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom; + zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom; var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), From 3cfb1eff042eb21d15a055134d9426479f12bea8 Mon Sep 17 00:00:00 2001 From: simsibimsiwimsi Date: Sun, 8 Nov 2015 22:44:47 +0100 Subject: [PATCH 1930/2207] fixed check for maxZoom option to honor maxZoom 0 Checking if maxZoom is a number will work fine for {maxZoom: 0} where options.maxZoom evaluates to false. --- src/map/Map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/Map.js b/src/map/Map.js index 6495ae1d819..bccefdee971 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -100,7 +100,7 @@ L.Map = L.Evented.extend({ zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); - zoom = options.maxZoom ? Math.min(options.maxZoom, zoom) : zoom; + zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom; var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), From da57507494519a384ed618d3f387e1c09b2d50e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 9 Nov 2015 12:40:21 +0100 Subject: [PATCH 1931/2207] L.DomUtil.getPosition should return a fallback value (for VML in IE8) --- debug/map/zoompan.html | 11 +++++++++-- src/dom/DomUtil.js | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 542fea8ada1..681fc48ef0d 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -32,6 +32,7 @@
            (flyTo 20 sec)
            (fract. zoom)
            (setView, fract. zoom)
            +
            (fitBounds)
            (image overlay)
            @@ -48,7 +49,9 @@ lnd = [51.51, -0.12], sf = [37.77, -122.42], dc = [38.91, -77.04], - trd = [63.41, 10.41]; + trd = [63.41, 10.41], + madBounds = [[40.70, -4.19], [40.12, -3.31]], + mad = [40.40, -3.7]; var map = L.map('map').setView(dc, 10); @@ -56,11 +59,14 @@ attribution: '© OpenStreetMap contributors, © CartoDB' }).addTo(map); + var path = new L.Polyline([kyiv, trd, lnd, mad, dc, sf]).addTo(map); + var marker1 = L.marker(kyiv).addTo(map), marker2 = L.marker(lnd).addTo(map); marker3 = L.marker(dc).addTo(map), marker4 = L.marker(sf).addTo(map), - marker5 = L.marker(trd).addTo(map); + marker5 = L.marker(trd).addTo(map), + marker6 = L.marker(mad).addTo(map); var nullIslandKitten = L.imageOverlay('http://placekitten.com/g/300/400', [[-0.2,-0.15], [0.2, 0.15]]).addTo(map); @@ -70,6 +76,7 @@ document.getElementById('lnd').onclick = function () { map.flyTo(lnd, 9.25); }; document.getElementById('kyiv').onclick = function () { map.setView(kyiv, 9.25); }; document.getElementById('nul').onclick = function () { map.flyTo([0, 0], 10); }; + document.getElementById('mad').onclick = function () { map.fitBounds(madBounds); }; document.getElementById('stop').onclick = function () { map.stop(); }; function logEvent(e) { console.log(e.type); } diff --git a/src/dom/DomUtil.js b/src/dom/DomUtil.js index 19896602a67..8ed7c71ce0a 100644 --- a/src/dom/DomUtil.js +++ b/src/dom/DomUtil.js @@ -167,7 +167,7 @@ L.DomUtil = { // this method is only used for elements previously positioned using setPosition, // so it's safe to cache the position for performance - return el._leaflet_pos; + return el._leaflet_pos || new L.Point(0, 0); } }; From 7d355312368df19ca13a09fa7ca9b20c92c29493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 9 Nov 2015 14:27:49 +0100 Subject: [PATCH 1932/2207] Skip _updateLevels when out of min/max zoom (prevents IE8 exceptions) --- src/layer/tile/GridLayer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 5668a742e3d..8dd1fc4847d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -210,6 +210,8 @@ L.GridLayer = L.Layer.extend({ var zoom = this._tileZoom, maxZoom = this.options.maxZoom; + if (zoom === undefined) { return undefined; } + for (var z in this._levels) { if (this._levels[z].el.children.length || z === zoom) { this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); From ab64f04ac87f5f74482f7c8b470492101eb1e70f Mon Sep 17 00:00:00 2001 From: Torf Date: Wed, 11 Nov 2015 18:13:21 +0100 Subject: [PATCH 1933/2207] Fixed URLs for Leaflet.zoomhome plugin. --- plugins.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins.md b/plugins.md index 9f1b0984dc4..8535e0bf999 100644 --- a/plugins.md +++ b/plugins.md @@ -1794,10 +1794,10 @@ Change the way the user is moved around the map, by jumping to predefined/stored From a29fda6ed4b754f17ae34abd7d5db3aefe3484fc Mon Sep 17 00:00:00 2001 From: Tim Wisniewski Date: Thu, 12 Nov 2015 09:15:24 -0500 Subject: [PATCH 1935/2207] Add leaflet-choropleth https://github.com/timwis/leaflet-choropleth --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index 8da094c7aa8..ff1482efef4 100644 --- a/plugins.md +++ b/plugins.md @@ -946,6 +946,15 @@ These plugins provide new markers or news ways of converting abstract data into Alexey Gusev + + +
            - Leaflet.zoomhome + Leaflet.zoomhome - Zoom control with a home button for resetting the view (Demo) + Zoom control with a home button for resetting the view (Demo) Florian Brucker From 8cb0bd501cfb3115cb60a3da56c5876b0a04cf02 Mon Sep 17 00:00:00 2001 From: Torf Date: Wed, 11 Nov 2015 18:24:39 +0100 Subject: [PATCH 1934/2207] Fix URL for Leaflet.zoomhome author. --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index 8535e0bf999..8da094c7aa8 100644 --- a/plugins.md +++ b/plugins.md @@ -1800,7 +1800,7 @@ Change the way the user is moved around the map, by jumping to predefined/stored Zoom control with a home button for resetting the view (Demo) - Florian Brucker + Florian Brucker
            + leaflet-choropleth + + Extends L.geoJson to add a choropleth visualization (color scale based on value). Demo. + + Tim Wisniewski +
            From fd5411d74b7eb9821ad6581ac17fd6096d5f5ee7 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sat, 14 Nov 2015 20:41:53 +0100 Subject: [PATCH 1936/2207] Fix popup toggle on marker click (fix #3992) Issue was: - popup toggling is made on 'click' event - map listen to 'preclick' to close any open popup - at second user click, 'preclick' has been fired, then popup closed, so the popup toggling was reopening it - this was not an issue before 0d3448d494b4c6191f20282c679ecefa27bb3c50 because 'preclick' on the marker was not bubbled to the map - also the unittest covering this use case was too much coupled with the use case with calling marker.fire instead of simulating user click on the marker icon --- spec/suites/layer/PopupSpec.js | 17 +++++++++-------- src/layer/Popup.js | 2 ++ src/map/Map.js | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/spec/suites/layer/PopupSpec.js b/spec/suites/layer/PopupSpec.js index b3688c6140c..119550c5d38 100644 --- a/spec/suites/layer/PopupSpec.js +++ b/spec/suites/layer/PopupSpec.js @@ -6,10 +6,15 @@ describe('Popup', function () { c = document.createElement('div'); c.style.width = '400px'; c.style.height = '400px'; + document.body.appendChild(c); map = new L.Map(c); map.setView(new L.LatLng(55.8, 37.6), 6); }); + afterEach(function () { + document.body.removeChild(c); + }); + it("closes on map click when map has closePopupOnClick option", function () { map.options.closePopupOnClick = true; @@ -51,22 +56,18 @@ describe('Popup', function () { map.addLayer(marker); marker.bindPopup('Popup1'); - map.options.closePopupOnClick = true; + expect(map.hasLayer(marker._popup)).to.be(false); // toggle open popup - marker.fire('click', { - latlng: new L.LatLng(55.8, 37.6) - }); + happen.click(marker._icon); expect(map.hasLayer(marker._popup)).to.be(true); // toggle close popup - marker.fire('click', { - latlng: new L.LatLng(55.8, 37.6) - }); + happen.click(marker._icon); expect(map.hasLayer(marker._popup)).to.be(false); }); - it("it should use a popup with a fuction as content with a FeatureGroup", function () { + it("it should use a popup with a function as content with a FeatureGroup", function () { var marker1 = new L.Marker(new L.LatLng(55.8, 37.6)); var marker2 = new L.Marker(new L.LatLng(54.6, 38.2)); var group = new L.FeatureGroup([marker1, marker2]).addTo(map); diff --git a/src/layer/Popup.js b/src/layer/Popup.js index bfcbfe2e388..e52d8d954ed 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -57,6 +57,7 @@ L.Popup = L.Layer.extend({ if (this._source) { this._source.fire('popupopen', {popup: this}, true); + this._source.on('preclick', L.DomEvent.stopPropagation); } }, @@ -77,6 +78,7 @@ L.Popup = L.Layer.extend({ if (this._source) { this._source.fire('popupclose', {popup: this}, true); + this._source.off('preclick', L.DomEvent.stopPropagation); } }, diff --git a/src/map/Map.js b/src/map/Map.js index bccefdee971..0a4cd55b2e4 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -668,7 +668,6 @@ L.Map = L.Evented.extend({ _handleDOMEvent: function (e) { if (!this._loaded || L.DomEvent._skipped(e)) { return; } - // find the layer the event is propagating from and its parents var type = e.type === 'keypress' && e.keyCode === 13 ? 'click' : e.type; if (e.type === 'click') { @@ -690,6 +689,7 @@ L.Map = L.Evented.extend({ if (e._stopped) { return; } + // Find the layer the event is propagating from and its parents. targets = (targets || []).concat(this._findEventTargets(e, type)); if (!targets.length) { return; } From 92217bc9696c6fdf6ff5c463efa0011ca6204fa2 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 15 Nov 2015 17:47:25 +0100 Subject: [PATCH 1937/2207] Distinguish labelopen/close and popupopen/close events --- src/layer/Label.js | 20 ++++++++++++++++++++ src/layer/Popup.js | 20 ++++++++++++++++++++ src/layer/PopupBase.js | 12 ------------ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/layer/Label.js b/src/layer/Label.js index 572ef823b9b..15d0f4af86d 100644 --- a/src/layer/Label.js +++ b/src/layer/Label.js @@ -15,6 +15,26 @@ L.Label = L.PopupBase.extend({ zoomAnimation: true }, + onAdd: function (map) { + L.PopupBase.prototype.onAdd.call(this, map); + + map.fire('labelopen', {popup: this}); + + if (this._source) { + this._source.fire('labelopen', {popup: this}, true); + } + }, + + onRemove: function (map) { + L.PopupBase.prototype.onRemove.call(this, map); + + map.fire('labelclose', {popup: this}); + + if (this._source) { + this._source.fire('labelclose', {popup: this}, true); + } + }, + openOn: function (map) { map.openLabel(this); return this; diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 2a8320f020e..1050c38cb86 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -41,6 +41,26 @@ L.Popup = L.PopupBase.extend({ return events; }, + onAdd: function (map) { + L.PopupBase.prototype.onAdd.call(this, map); + + map.fire('popupopen', {popup: this}); + + if (this._source) { + this._source.fire('popupopen', {popup: this}, true); + } + }, + + onRemove: function (map) { + L.PopupBase.prototype.onRemove.call(this, map); + + map.fire('popupclose', {popup: this}); + + if (this._source) { + this._source.fire('popupclose', {popup: this}, true); + } + }, + openOn: function (map) { map.openPopup(this); return this; diff --git a/src/layer/PopupBase.js b/src/layer/PopupBase.js index 89dc28877ad..b2a8503f2e8 100644 --- a/src/layer/PopupBase.js +++ b/src/layer/PopupBase.js @@ -54,12 +54,6 @@ L.PopupBase = L.Layer.extend({ } this.bringToFront(); - - map.fire('popupopen', {popup: this}); - - if (this._source) { - this._source.fire('popupopen', {popup: this}, true); - } }, onRemove: function (map) { @@ -69,12 +63,6 @@ L.PopupBase = L.Layer.extend({ } else { L.DomUtil.remove(this._container); } - - map.fire('popupclose', {popup: this}); - - if (this._source) { - this._source.fire('popupclose', {popup: this}, true); - } }, getLatLng: function () { From 9d0b13b991d89039c1f2e79eb01b252f3d8b4f4b Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 15 Nov 2015 18:41:46 +0100 Subject: [PATCH 1938/2207] Add some basic unittests for L.Label --- debug/map/label.html | 15 +++- spec/index.html | 1 + spec/suites/layer/LabelSpec.js | 138 +++++++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 spec/suites/layer/LabelSpec.js diff --git a/debug/map/label.html b/debug/map/label.html index 1c999c94869..6f8d4505744 100644 --- a/debug/map/label.html +++ b/debug/map/label.html @@ -37,16 +37,23 @@ L.marker([41.206, 9.44]).addTo(map).bindLabel('click me, I have a popup', {static: true, clickable: true}).bindPopup('See?'); L.circleMarker([41.206, 9.48], {color: "Chocolate", radius: 12}).bindLabel( "Hello Left World", {direction: 'left'}).addTo(map); var icon = L.divIcon({ - className: 'my-div-icon', - html: "

            A div icon

            ", - iconSize: [50, 50], - labelAnchor: [20, 0] + className: 'my-div-icon', + html: '

            A div icon

            ', + iconSize: [50, 50], + labelAnchor: [20, 0] }); L.marker([41.22, 9.48], {icon: icon}).addTo(map).bindLabel('A div icon label following mouse', {followMouse: true, direction: 'auto'}); L.marker([41.23, 9.47], {icon: icon}).addTo(map).bindLabel('A div icon label'); L.marker([41.23, 9.42], {draggable: true}).addTo(map).bindLabel('Draggable marker label', {static: true}); L.marker([41.19, 9.45]).addTo(map).bindLabel('Clickable marker label', {static: true, clickable: true}).on('click', function () { alert('clicked!'); }); + var marker1 = L.marker([41.18, 9.45], {description: 'Marker 1'}); + var marker2 = L.marker([41.18, 9.46], {description: 'Marker 2'}); + var group = new L.FeatureGroup([marker1, marker2]).addTo(map); + group.bindLabel(function (layer) { + return 'Group label: ' + layer.options.description; + }); + diff --git a/spec/index.html b/spec/index.html index de4454e7c2f..8443e033cd9 100644 --- a/spec/index.html +++ b/spec/index.html @@ -62,6 +62,7 @@ + diff --git a/spec/suites/layer/LabelSpec.js b/spec/suites/layer/LabelSpec.js new file mode 100644 index 00000000000..db28b240135 --- /dev/null +++ b/spec/suites/layer/LabelSpec.js @@ -0,0 +1,138 @@ +describe('Label', function () { + + var c, map, p2ll, + center = [55.8, 37.6]; + + beforeEach(function () { + c = document.createElement('div'); + c.style.width = '400px'; + c.style.height = '400px'; + // Allow to use happen.at with determinist positions. + c.style.position = 'absolute'; + c.style.top = '0'; + c.style.left = '0'; + document.body.appendChild(c); + map = new L.Map(c); + map.setView(center, 6); + p2ll = function (x, y) { + return map.layerPointToLatLng([x, y]); + }; + }); + + afterEach(function () { + document.body.removeChild(c); + }); + + it("opens on marker mouseover and close on mouseout", function () { + var layer = new L.Marker(center).addTo(map); + + layer.bindLabel('Label'); + + happen.mouseover(layer._icon, {relatedTarget: map._container}); + + expect(map.hasLayer(layer._label)).to.be(true); + + happen.mouseout(layer._icon, {relatedTarget: map._container}); + expect(map.hasLayer(layer._label)).to.be(false); + }); + + it("stays open on marker when static", function () { + var layer = new L.Marker(center).addTo(map); + + layer.bindLabel('Label', {static: true}); + expect(map.hasLayer(layer._label)).to.be(true); + }); + + it("is removed when removing marker", function () { + var layer = new L.Marker(center).addTo(map); + + layer.bindLabel('Label', {static: true}); + expect(map.hasLayer(layer._label)).to.be(true); + layer.remove(); + expect(map.hasLayer(layer._label)).to.be(false); + }); + + it("can be make clickable", function () { + var layer = new L.Marker(center).addTo(map); + var spy = sinon.spy(); + layer.on('click', spy); + + layer.bindLabel('Label', {static: true, clickable: true}); + happen.click(layer._label._container); + expect(spy.calledOnce).to.be(true); + }); + + // Passes on Firefox, but fails on PhantomJS. + xit("can be forced on left direction", function () { + var layer = new L.Marker(center).addTo(map); + var spy = sinon.spy(); + layer.on('click', spy); + + layer.bindLabel('A long label that should be displayed on the left', {static: true, direction: 'left', clickable: true}); + expect(map.hasLayer(layer._label)).to.be(true); + happen.at('click', 150, 190); // Marker is on the map center, which is 400px large. + expect(spy.calledOnce).to.be(true); + }); + + it("it should use a label with a function as content with a FeatureGroup", function () { + var marker1 = new L.Marker(new L.LatLng(55.8, 37.6), {description: "I'm marker 1."}); + var marker2 = new L.Marker(new L.LatLng(54.6, 38.2), {description: "I'm marker 2."}); + var group = new L.FeatureGroup([marker1, marker2]).addTo(map); + + group.bindLabel(function (layer) { + return layer.options.description; + }); + + // toggle popup on marker1 + happen.mouseover(marker1._icon, {relatedTarget: map._container}); + expect(map.hasLayer(group._label)).to.be(true); + expect(group._label._container.innerHTML).to.be("I'm marker 1."); + + // toggle popup on marker2 + happen.mouseover(marker2._icon, {relatedTarget: map._container}); + expect(map.hasLayer(group._label)).to.be(true); + expect(group._label._container.innerHTML).to.be("I'm marker 2."); + }); + + it("opens on polygon mouseover and close on mouseout", function () { + var layer = new L.Polygon([[55.8, 37.6], [55.9, 37.6], [55.8, 37.5]]).addTo(map); + + layer.bindLabel('Label'); + + happen.mouseover(layer._path, {relatedTarget: map._container}); + + expect(map.hasLayer(layer._label)).to.be(true); + + happen.mouseout(layer._path, {relatedTarget: map._container}); + expect(map.hasLayer(layer._label)).to.be(false); + }); + + it("stays open on polygon when static", function () { + var layer = new L.Polygon([[55.8, 37.6], [55.9, 37.6], [55.8, 37.5]]).addTo(map); + + layer.bindLabel('Label', {static: true}); + expect(map.hasLayer(layer._label)).to.be(true); + }); + + it("opens on polyline mouseover and close on mouseout", function () { + var layer = new L.Polyline([[55.8, 37.6], [55.9, 37.6], [55.8, 37.5]]).addTo(map); + + layer.bindLabel('Label'); + + happen.mouseover(layer._path, {relatedTarget: map._container}); + + expect(map.hasLayer(layer._label)).to.be(true); + + happen.mouseout(layer._path, {relatedTarget: map._container}); + expect(map.hasLayer(layer._label)).to.be(false); + }); + + it("stays open on marker when static", function () { + var layer = new L.Polyline([[55.8, 37.6], [55.9, 37.6], [55.8, 37.5]]).addTo(map); + + layer.bindLabel('Label', {static: true}); + expect(map.hasLayer(layer._label)).to.be(true); + }); + +}); + From d8b7f6fcbe0284901a528bc3f6c1eeb7a1669b08 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 15 Nov 2015 19:15:14 +0100 Subject: [PATCH 1939/2207] L.Label: honour opacity option --- debug/map/label.html | 2 +- spec/suites/layer/LabelSpec.js | 14 ++++++++++++++ src/layer/Label.js | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/debug/map/label.html b/debug/map/label.html index 6f8d4505744..250222e3981 100644 --- a/debug/map/label.html +++ b/debug/map/label.html @@ -52,7 +52,7 @@ var group = new L.FeatureGroup([marker1, marker2]).addTo(map); group.bindLabel(function (layer) { return 'Group label: ' + layer.options.description; - }); + }, {opacity: 0.7}); diff --git a/spec/suites/layer/LabelSpec.js b/spec/suites/layer/LabelSpec.js index db28b240135..7ce0817d85f 100644 --- a/spec/suites/layer/LabelSpec.js +++ b/spec/suites/layer/LabelSpec.js @@ -74,6 +74,20 @@ describe('Label', function () { expect(spy.calledOnce).to.be(true); }); + it("honours opacity option", function () { + var layer = new L.Marker(center).addTo(map); + layer.bindLabel('Label', {static: true, opacity: 0.57}); + expect(layer._label._container.style.opacity).to.eql(0.57); + }); + + it("can change opacity with setOpacity", function () { + var layer = new L.Marker(center).addTo(map); + layer.bindLabel('Label', {static: true}); + expect(layer._label._container.style.opacity).to.eql(1); + layer._label.setOpacity(0.57); + expect(layer._label._container.style.opacity).to.eql(0.57); + }); + it("it should use a label with a function as content with a FeatureGroup", function () { var marker1 = new L.Marker(new L.LatLng(55.8, 37.6), {description: "I'm marker 1."}); var marker2 = new L.Marker(new L.LatLng(54.6, 38.2), {description: "I'm marker 2."}); diff --git a/src/layer/Label.js b/src/layer/Label.js index 15d0f4af86d..bf681fcb02b 100644 --- a/src/layer/Label.js +++ b/src/layer/Label.js @@ -11,12 +11,14 @@ L.Label = L.PopupBase.extend({ static: false, // Reserved word, use "permanent" instead? followMouse: false, clickable: false, + opacity: 1, // className: '', zoomAnimation: true }, onAdd: function (map) { L.PopupBase.prototype.onAdd.call(this, map); + this.setOpacity(this.options.opacity); map.fire('labelopen', {popup: this}); From 850ba7fe62b99eb7be09d00d0456cebdd0fc561f Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 15 Nov 2015 19:18:29 +0100 Subject: [PATCH 1940/2207] Move _setPosition from L.Popup to L.PopupBase so it can be inherited Idea is to make it easier for plugins to create custom popups or labels or whatever HTML element that would be bound to a map layer. --- src/layer/Popup.js | 20 -------------------- src/layer/PopupBase.js | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/layer/Popup.js b/src/layer/Popup.js index 1050c38cb86..3abffa433e5 100644 --- a/src/layer/Popup.js +++ b/src/layer/Popup.js @@ -98,26 +98,6 @@ L.Popup = L.PopupBase.extend({ this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer); }, - _updatePosition: function () { - if (!this._map) { return; } - - var pos = this._map.latLngToLayerPoint(this._latlng), - offset = L.point(this.options.offset); - - if (this._zoomAnimated) { - L.DomUtil.setPosition(this._container, pos); - } else { - offset = offset.add(pos); - } - - var bottom = this._containerBottom = -offset.y, - left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; - - // bottom position the popup in case the height of the popup changes (images loading etc) - this._container.style.bottom = bottom + 'px'; - this._container.style.left = left + 'px'; - }, - _updateLayout: function () { var container = this._contentNode, style = container.style; diff --git a/src/layer/PopupBase.js b/src/layer/PopupBase.js index b2a8503f2e8..691d1ee265d 100644 --- a/src/layer/PopupBase.js +++ b/src/layer/PopupBase.js @@ -151,6 +151,26 @@ L.PopupBase = L.Layer.extend({ node.appendChild(content); } this.fire('contentupdate'); + }, + + _updatePosition: function () { + if (!this._map) { return; } + + var pos = this._map.latLngToLayerPoint(this._latlng), + offset = L.point(this.options.offset); + + if (this._zoomAnimated) { + L.DomUtil.setPosition(this._container, pos); + } else { + offset = offset.add(pos); + } + + var bottom = this._containerBottom = -offset.y, + left = this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x; + + // bottom position the popup in case the height of the popup changes (images loading etc) + this._container.style.bottom = bottom + 'px'; + this._container.style.left = left + 'px'; } }); From 5fce8dda51fe66e0a238994e133388c1a74de306 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 15 Nov 2015 19:22:57 +0100 Subject: [PATCH 1941/2207] Fix bad Label description in deps.js --- build/deps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/deps.js b/build/deps.js index f266cd00ec0..ec5136d0cff 100644 --- a/build/deps.js +++ b/build/deps.js @@ -85,7 +85,7 @@ var deps = { 'layer/marker/Marker.Label.js' ], deps: ['Popup', 'Marker'], - desc: 'Used to display the map popup (used mostly for binding HTML data to markers and paths on click).' + desc: 'Used to display the map label (used mostly for binding short descriptions to markers and paths on mouseover).' }, LayerGroup: { From 4d61eafc688b84740e421b1c2724f69e46c417ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yunus=20Emre=20=C3=96ZKAYA?= Date: Mon, 16 Nov 2015 14:45:34 +0200 Subject: [PATCH 1942/2207] Add new plugin: Leaflet.GeoJSONAutocomplete --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index ff1482efef4..cb94ccb81f5 100644 --- a/plugins.md +++ b/plugins.md @@ -1469,6 +1469,15 @@ Plugins that search for overlays and enhance how to display information about th Yohan Boniface + + + Leaflet.GeoJSONAutocomplete + + Leaflet Autocomplete For Remote Searching with GeoJSON Services. + + Yunus Emre ÖZKAYA + + From b6d95e5d7caee6b06f55c28537f909374ad04123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yunus=20Emre=20=C3=96ZKAYA?= Date: Mon, 16 Nov 2015 15:16:05 +0200 Subject: [PATCH 1943/2207] Update plugins.md --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index cb94ccb81f5..6d581bd9c32 100644 --- a/plugins.md +++ b/plugins.md @@ -1475,7 +1475,7 @@ Plugins that search for overlays and enhance how to display information about th Leaflet Autocomplete For Remote Searching with GeoJSON Services. - Yunus Emre ÖZKAYA + Yunus Emre Özkaya From 4fee80ba9bbbac26cdee25454c531900bee1a2e8 Mon Sep 17 00:00:00 2001 From: Miguel Andrade Date: Tue, 17 Nov 2015 20:15:56 +0000 Subject: [PATCH 1944/2207] Add ember-leaflet to plugins.md I believe that [ember-leaflet](http://www.ember-leaflet.com/) is worth adding to the list. --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 6d581bd9c32..02f3dfb98d4 100644 --- a/plugins.md +++ b/plugins.md @@ -2825,6 +2825,17 @@ Ease your development integrating Leaflet into a development framework or automa Leonardo Ciocari + + + ember-leaflet + + + Easy and declarative mapping for Ember.js using Leaflet. + + + Miguel Andrade + + From 7a1496ea4d97a6f08b33f60b72e26897b946f1f1 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 18 Nov 2015 13:26:01 +0100 Subject: [PATCH 1945/2207] Do not set layer.options a reference to layer.defaultOptions (fix #3990) git bisect point at ad9d0f8c7fbb080fa628f302bddb52e6c035c9d2 --- spec/suites/layer/GeoJSONSpec.js | 24 ++++++++++++++++++++++++ src/layer/GeoJSON.js | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 7544db9f173..4223d03e6f8 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -1,4 +1,5 @@ describe("L.GeoJSON", function () { + describe("addData", function () { var geoJSON = { type: 'Feature', @@ -31,6 +32,29 @@ describe("L.GeoJSON", function () { expect(layer.getLayers().length).to.eql(0); }); }); + + describe('resetStyle', function () { + + it('should reset init options', function () { + var feature = { + type: 'Feature', + geometry: { + type: 'LineString', + coordinates:[[-2.35, 51.38], [-2.38, 51.38]] + } + }; + var geojson = L.geoJson(feature, {weight: 7, color: 'chocolate'}); + geojson.setStyle({weight: 22, color: 'coral'}); + var layer = geojson.getLayers()[0]; + expect(layer.options.weight).to.be(22); + expect(layer.options.color).to.be('coral'); + geojson.resetStyle(layer); + expect(layer.options.weight).to.be(7); + expect(layer.options.color).to.be('chocolate'); + }); + + }); + }); describe("L.Marker#toGeoJSON", function () { diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 3951338a7df..4e14324a76c 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -51,7 +51,7 @@ L.GeoJSON = L.FeatureGroup.extend({ resetStyle: function (layer) { // reset any custom styles - layer.options = layer.defaultOptions; + layer.options = L.Util.extend({}, layer.defaultOptions); this._setLayerStyle(layer, this.options.style); return this; }, From 7973da4650231e66b9259d7f49ffec39625a1c13 Mon Sep 17 00:00:00 2001 From: Andrew Harvey Date: Thu, 19 Nov 2015 17:34:34 +1100 Subject: [PATCH 1946/2207] fix maxNativeZoom wording e.g. If my tile source only goes up to z15 but I want users to zoom into z17, then I set maxNativeZoom=15, maxZoom=17, and for all zoom levels higher than maxNativeZoom, tiles from maxNativeZoom will be loaded and auto-scaled. --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index 1073296b5dd..d83260fa1c7 100644 --- a/reference.html +++ b/reference.html @@ -1846,7 +1846,7 @@

            Options

            maxNativeZoom Number null - Maximum zoom number the tiles source has available. If it is specified, the tiles on all zoom levels higher than maxNativeZoom will be loaded from maxZoom level and auto-scaled. + Maximum zoom number the tiles source has available. If it is specified, the tiles on all zoom levels higher than maxNativeZoom will be loaded from maxNativeZoom level and auto-scaled. tileSize From c9597c3b6a99caab61cf89fe1dde94ebe2036c3c Mon Sep 17 00:00:00 2001 From: ghybs Date: Thu, 19 Nov 2015 15:56:31 +0400 Subject: [PATCH 1947/2207] Added Leaflet.Photo and FeatureGroup.SubGroup Added "Leaflet.Photo" to "Overlay display > Markers & renderers" and "Leaflet.FeatureGroup.SubGroup" to "Overlay Display > Clustering/Decluttering". --- plugins.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins.md b/plugins.md index 6d581bd9c32..b13eed39f65 100644 --- a/plugins.md +++ b/plugins.md @@ -928,6 +928,15 @@ These plugins provide new markers or news ways of converting abstract data into Filip Zavadil + + + Leaflet.Photo + + Plugin to show geotagged photos on a Leaflet map. Demo. + + Bjorn Sandvik + + Leaflet.curve @@ -1102,6 +1111,15 @@ When you are displaying a lot of data, these plugins will make your map look cle EPP + + + Leaflet.FeatureGroup.SubGroup + + A simple plugin to create Feature Groups that add their child layers into a parent group. Typical usage is to switch them through L.Control.Layers to dynamically add/remove groups of markers from Leaflet.markercluster. Demo. + + ghybs + + ### Heatmaps From 1fc70efd401a84eb481cc39b4b527ec70d589f56 Mon Sep 17 00:00:00 2001 From: ghybs Date: Thu, 19 Nov 2015 16:02:15 +0400 Subject: [PATCH 1948/2207] =?UTF-8?q?Corrected=20spelling=20of=20Bj=C3=B8r?= =?UTF-8?q?n=20Sandvik?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced "Bjorn" by "Bjørn" --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index b13eed39f65..ec16611914e 100644 --- a/plugins.md +++ b/plugins.md @@ -934,7 +934,7 @@ These plugins provide new markers or news ways of converting abstract data into Plugin to show geotagged photos on a Leaflet map. Demo. - Bjorn Sandvik + Bjørn Sandvik From e2fbe19683502fd4b08cb09edded8c4dbd004c89 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Sun, 22 Nov 2015 19:40:17 +0100 Subject: [PATCH 1949/2207] Fix GridLayer pixelBounds computation Map size does not change from one zoom to another, so we dont need to scale it. Without this change, we are creating more or less 4x tiles when zooming in. There are still cases where we are requesting a bit more tiles than what I would expect, but I see it also happens on 0.7.3 --- spec/suites/layer/tile/GridLayerSpec.js | 42 +++++++++++++++++++++++++ src/layer/tile/GridLayer.js | 9 +++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index c67430bd2d3..a79b9941607 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -106,6 +106,48 @@ describe('GridLayer', function () { }); }); + describe('#createTile', function () { + + beforeEach(function () { + // Simpler sizes to test. + div.style.width = '512px'; + div.style.height = '512px'; + }); + + afterEach(function () { + div.style.width = '800px'; + div.style.height = '600px'; + }); + + // Passes on Firefox, but fails on phantomJS: done is never called. + xit('only creates tiles for visible area on zoom in', function (done) { + map.remove(); + map = L.map(div); + map.setView([0, 0], 10); + + var grid = L.gridLayer(), + count = 0, + loadCount = 0; + grid.createTile = function (coords) { + count++; + return document.createElement('div'); + }; + var onLoad = function (e) { + expect(count).to.eql(4); + count = 0; + loadCount++; + if (loadCount === 1) { // On layer add. + map.zoomIn(); + } else { // On zoom in. + done(); + } + }; + grid.on('load', onLoad); + map.addLayer(grid); + }); + + }); + describe("#onAdd", function () { it('is called after zoomend on first map load', function () { var layer = L.gridLayer().addTo(map); diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 8dd1fc4847d..01090d3486a 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -426,11 +426,10 @@ L.GridLayer = L.Layer.extend({ this._resetView(); }, - _getTiledPixelBounds: function (center, zoom, tileZoom) { + _getTiledPixelBounds: function (center) { var map = this._map, - scale = map.getZoomScale(zoom, tileZoom), - pixelCenter = map.project(center, tileZoom).floor(), - halfSize = map.getSize().divideBy(scale * 2); + pixelCenter = map.project(center, this._tileZoom).floor(), + halfSize = map.getSize().divideBy(2); return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); }, @@ -444,7 +443,7 @@ L.GridLayer = L.Layer.extend({ if (center === undefined) { center = map.getCenter(); } if (this._tileZoom === undefined) { return; } // if out of minzoom/maxzoom - var pixelBounds = this._getTiledPixelBounds(center, zoom, this._tileZoom), + var pixelBounds = this._getTiledPixelBounds(center), tileRange = this._pxBoundsToTileRange(pixelBounds), tileCenter = tileRange.getCenter(), queue = []; From 3a2331d6c12f03d29492021473460ace75cc4ef4 Mon Sep 17 00:00:00 2001 From: Alex Fedosov Date: Mon, 23 Nov 2015 19:05:39 +0600 Subject: [PATCH 1950/2207] round new map position before animating pan --- src/map/anim/Map.PanAnimation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 411baf731e4..5b6fdd2f89d 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -69,7 +69,7 @@ L.Map.include({ if (options.animate !== false) { L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim'); - var newPos = this._getMapPanePos().subtract(offset); + var newPos = this._getMapPanePos().subtract(offset).round(); this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); } else { this._rawPanBy(offset); From 5d3f5739f125f4dd7f7bacf4f01cb13e3b8f7a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 23 Nov 2015 14:52:23 +0100 Subject: [PATCH 1951/2207] Add plugin Leaflet.Icon.Glyph --- plugins.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index ec16611914e..c0cbe36c4e3 100644 --- a/plugins.md +++ b/plugins.md @@ -825,7 +825,17 @@ These plugins provide new markers or news ways of converting abstract data into James Seppi - + + + Leaflet.Icon.Glyph + + Use icon font glyphs in your markers (from Font Awesome, Material Design Icons, Glyphicons, + Metro UI icons, Elusive, and other icon fonts). (demo) + + Iván Sánchez Ortega + + + Leaflet.LineExtremities From 5bc678048139576d2e419644805b46384c85942d Mon Sep 17 00:00:00 2001 From: ghybs Date: Mon, 23 Nov 2015 21:12:01 +0400 Subject: [PATCH 1952/2207] Added TileLayer.Fallback plugin Added Leaflet.TileLayer.Fallback plugin into "Tile & image layers > Tile Load" section. Following issue / feature request #3127. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index c0cbe36c4e3..fe148159946 100644 --- a/plugins.md +++ b/plugins.md @@ -454,6 +454,15 @@ The following plugins change the way that tile layers are loaded into the map. Eric Brelsford + + + Leaflet.TileLayer.Fallback + + Replaces missing Tiles (HTTP 404 Not Found Error) by scaled up equivalent Tiles from lower zooms. + + ghybs + + From e93953a9cfd0dcf7c17bde073d66aab059e8a3e0 Mon Sep 17 00:00:00 2001 From: Matt Barker Date: Wed, 25 Nov 2015 16:08:17 +0000 Subject: [PATCH 1953/2207] Added link to leaflet-wikipedia https://github.com/MatthewBarker/leaflet-wikipedia --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index fe148159946..f81711cf391 100644 --- a/plugins.md +++ b/plugins.md @@ -733,6 +733,17 @@ Load overlay data from third-party-services. See also [basemap providers](#basem Kr1 + + + Leaflet-Wikipedia + + + A leaflet plugin to display Wikipedia API entries on a map layer. + + + Matthew Barker + + From 2f89fc20584c9532b343d643c4b5e46fd4c6682c Mon Sep 17 00:00:00 2001 From: ghybs Date: Fri, 27 Nov 2015 14:31:33 +0400 Subject: [PATCH 1954/2207] Replace links to google groups with ones to Stack Overflow Following discussion in PR #3886, proposition to switch to SO instead of Google Groups. GIS is still mentioned though (besides Stack Overflow) on bottom of Overview page, as the community is also active there (but less material than is SO as of today). --- _layouts/v2.html | 2 +- index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/v2.html b/_layouts/v2.html index ac42cc8f56c..ed303745d53 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -113,7 +113,7 @@

            an open-source JavaScript library
            for mobile-friendly in diff --git a/reference.html b/reference.html index 42e1fd51f85..d9a13161494 100644 --- a/reference.html +++ b/reference.html @@ -6,6 +6,11 @@

            API Reference

            +

            This reference reflects Leaflet 1.0.

            + +

            Docs for 0.7 are available here. +Docs for 0.6 are available in the source form (see instructions for running docs).

            +

            Map

            @@ -125,7 +130,6 @@

            Misc


            -

            This reference reflects Leaflet 1.0.

            Map

            From c213d783460a625598c65daea11d92dfafeefd8e Mon Sep 17 00:00:00 2001 From: Morton Fox Date: Sun, 13 Dec 2015 01:06:14 -0500 Subject: [PATCH 1971/2207] Fix features link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15e55b74bc6..e3df9ba03f0 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ and push the limits of what's possible with online maps! [Vladimir Agafonkin]: http://agafonkin.com/en [contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors - [features]: http://leafletjs.com/features.html + [features]: http://leafletjs.com/#features [plugins]: http://leafletjs.com/plugins.html [well-documented]: http://leafletjs.com/reference.html "Leaflet API reference" [source code]: https://github.com/Leaflet/Leaflet "Leaflet GitHub repository" From b6c87c3fa8b328b0d4464fa413d6a66f1182d152 Mon Sep 17 00:00:00 2001 From: perliedman Date: Mon, 14 Dec 2015 13:40:44 +0100 Subject: [PATCH 1972/2207] Make sure to always reset _enforcingBounds. Even in case of early exit or exception. Fixes #3938. --- src/map/Map.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 04eb1071a5d..cac888c0c4b 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -177,14 +177,17 @@ L.Map = L.Evented.extend({ panInsideBounds: function (bounds, options) { this._enforcingBounds = true; - var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); + try { + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); - if (center.equals(newCenter)) { return this; } + if (center.equals(newCenter)) { return this; } - this.panTo(newCenter, options); - this._enforcingBounds = false; - return this; + this.panTo(newCenter, options); + return this; + } finally { + this._enforcingBounds = false; + } }, invalidateSize: function (options) { From 2919d8b7bf6bac91a1880bcd47fedf217faf8ef2 Mon Sep 17 00:00:00 2001 From: perliedman Date: Mon, 14 Dec 2015 14:19:17 +0100 Subject: [PATCH 1973/2207] src/layer/marker/DivIcon.js Cast bgPos to L.Point. Fixes #4067 --- src/layer/marker/DivIcon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layer/marker/DivIcon.js b/src/layer/marker/DivIcon.js index c1e1cdd380d..79301d154c2 100644 --- a/src/layer/marker/DivIcon.js +++ b/src/layer/marker/DivIcon.js @@ -23,7 +23,8 @@ L.DivIcon = L.Icon.extend({ div.innerHTML = options.html !== false ? options.html : ''; if (options.bgPos) { - div.style.backgroundPosition = (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px'; + var bgPos = L.point(options.bgPos); + div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px'; } this._setIconStyles(div, 'icon'); From 9d1c59b5cd7203ffd96b697e197ede4d54109148 Mon Sep 17 00:00:00 2001 From: Jesper Baasch-Larsen Date: Tue, 15 Dec 2015 14:13:52 +0100 Subject: [PATCH 1974/2207] use _tileCoordsToKey everywhere --- src/layer/tile/GridLayer.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 01090d3486a..4a15de35be8 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -293,9 +293,11 @@ L.GridLayer = L.Layer.extend({ _retainParent: function (x, y, z, minZoom) { var x2 = Math.floor(x / 2), y2 = Math.floor(y / 2), - z2 = z - 1; + z2 = z - 1, + coords2 = new L.Point(+x2, +y2); + coords2.z = +z2; - var key = x2 + ':' + y2 + ':' + z2, + var key = this._tileCoordsToKey(coords2), tile = this._tiles[key]; if (tile && tile.active) { @@ -318,7 +320,10 @@ L.GridLayer = L.Layer.extend({ for (var i = 2 * x; i < 2 * x + 2; i++) { for (var j = 2 * y; j < 2 * y + 2; j++) { - var key = i + ':' + j + ':' + (z + 1), + var coords = new L.Point(i, j); + coords.z = z + 1; + + var key = this._tileCoordsToKey(coords), tile = this._tiles[key]; if (tile && tile.active) { From 5522af0a624d0d4a80f7b65a38c7166a970dbf02 Mon Sep 17 00:00:00 2001 From: Peter Richardson Date: Wed, 16 Dec 2015 19:41:40 -0500 Subject: [PATCH 1975/2207] de-intercap "Mapbox" --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e3df9ba03f0..35d339ed772 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Leaflet Leaflet is an open source JavaScript library for **mobile-friendly interactive maps**. -It is developed by [Vladimir Agafonkin][] of [MapBox][] with a team of dedicated [contributors][]. +It is developed by [Vladimir Agafonkin][] of [Mapbox][] with a team of dedicated [contributors][]. Weighing just about 30 KB of gzipped JS code, it has all the [features][] most developers ever need for online maps. Leaflet is designed with *simplicity*, *performance* and *usability* in mind. @@ -31,4 +31,4 @@ and push the limits of what's possible with online maps! [contribute]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md "A guide to contributing to Leaflet" [official website]: http://leafletjs.com [download page]: http://leafletjs.com/download.html - [MapBox]: https://mapbox.com + [Mapbox]: https://mapbox.com From 8a0719f16c2d9dbd4f8b8e3fbc4fc79aa501076c Mon Sep 17 00:00:00 2001 From: Thomas Coats Date: Thu, 17 Dec 2015 21:34:35 +1300 Subject: [PATCH 1976/2207] Fire tileunload for all unloading of tiles --- debug/map/grid.html | 1 + src/layer/tile/GridLayer.js | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/debug/map/grid.html b/debug/map/grid.html index 234fc05ca3c..1e757743f25 100644 --- a/debug/map/grid.html +++ b/debug/map/grid.html @@ -38,6 +38,7 @@ grid.on('loading', function() { console.log('loading'); }); grid.on('load', function() { console.log('load'); }); + grid.on('tileunload', function(tile) { console.log('tileunload ' + tile.coords.x + ',' + tile.coords.y + ',' + tile.coords.z); }); var map = L.map('map') .setView([50.5, 30.51], 10) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 01090d3486a..88b9fce5a08 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -41,6 +41,7 @@ L.GridLayer = L.Layer.extend({ }, onRemove: function (map) { + this._removeAllTiles(); L.DomUtil.remove(this._container); map._removeZoomLimit(this); this._container = null; @@ -217,6 +218,7 @@ L.GridLayer = L.Layer.extend({ this._levels[z].el.style.zIndex = maxZoom - Math.abs(zoom - z); } else { L.DomUtil.remove(this._levels[z].el); + this._removeTilesAtZoom(z); delete this._levels[z]; } } @@ -273,6 +275,15 @@ L.GridLayer = L.Layer.extend({ } }, + _removeTilesAtZoom: function (zoom) { + for (var key in this._tiles) { + if (this._tiles[key].coords.z !== zoom) { + continue; + } + this._removeTile(key); + } + }, + _removeAllTiles: function () { for (var key in this._tiles) { this._removeTile(key); From 64484d5c745fef0b4f1f076dec8cbd851d68c8de Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 11 Nov 2015 23:08:32 +0100 Subject: [PATCH 1977/2207] Fix event target fallbacking to map after marker drag (fix #3971) --- src/map/Map.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 04eb1071a5d..c116d96a8e1 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -647,10 +647,16 @@ L.Map = L.Evented.extend({ var targets = [], target, isHover = type === 'mouseout' || type === 'mouseover', - src = e.target || e.srcElement; + src = e.target || e.srcElement, + dragging = false; while (src) { target = this._targets[L.stamp(src)]; + if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) { + // Prevent firing click after you just dragged an object. + dragging = true; + break; + } if (target && target.listens(type, true)) { if (isHover && !L.DomEvent._isExternalTarget(src, e)) { break; } targets.push(target); @@ -659,7 +665,7 @@ L.Map = L.Evented.extend({ if (src === this._container) { break; } src = src.parentNode; } - if (!targets.length && !isHover && L.DomEvent._isExternalTarget(src, e)) { + if (!targets.length && !dragging && !isHover && L.DomEvent._isExternalTarget(src, e)) { targets = [this]; } return targets; @@ -699,9 +705,6 @@ L.Map = L.Evented.extend({ L.DomEvent.preventDefault(e); } - // prevents firing click after you just dragged an object - if ((e.type === 'click' || e.type === 'preclick') && !e._simulated && this._draggableMoved(target)) { return; } - var data = { originalEvent: e }; From 5e6ef5ce123d24161d904585bf69655312caea72 Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Fri, 25 Dec 2015 13:57:24 +0100 Subject: [PATCH 1978/2207] Consistent GeoJSON casing I've made the choice to: - switch API and method to upper case version (GeoJSON, geoJSON, toGeoJSON) - keep internal variable all lower case (geojson), because we usually do not uppercase variables Fix #2444 --- spec/suites/layer/GeoJSONSpec.js | 20 ++++++++++---------- src/layer/GeoJSON.js | 12 +++++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/spec/suites/layer/GeoJSONSpec.js b/spec/suites/layer/GeoJSONSpec.js index 4223d03e6f8..2d094ded2fd 100644 --- a/spec/suites/layer/GeoJSONSpec.js +++ b/spec/suites/layer/GeoJSONSpec.js @@ -1,14 +1,14 @@ describe("L.GeoJSON", function () { describe("addData", function () { - var geoJSON = { + var geojson = { type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [20, 10, 5] } - }, geoJSONEmpty = { + }, geojsonEmpty = { type: 'Feature', properties: {}, geometry: null @@ -16,19 +16,19 @@ describe("L.GeoJSON", function () { it("sets feature property on member layers", function () { var layer = new L.GeoJSON(); - layer.addData(geoJSON); - expect(layer.getLayers()[0].feature).to.eql(geoJSON); + layer.addData(geojson); + expect(layer.getLayers()[0].feature).to.eql(geojson); }); it("normalizes a geometry to a Feature", function () { var layer = new L.GeoJSON(); - layer.addData(geoJSON.geometry); - expect(layer.getLayers()[0].feature).to.eql(geoJSON); + layer.addData(geojson.geometry); + expect(layer.getLayers()[0].feature).to.eql(geojson); }); it("accepts geojson with null geometry", function () { var layer = new L.GeoJSON(); - layer.addData(geoJSONEmpty); + layer.addData(geojsonEmpty); expect(layer.getLayers().length).to.eql(0); }); }); @@ -43,7 +43,7 @@ describe("L.GeoJSON", function () { coordinates:[[-2.35, 51.38], [-2.38, 51.38]] } }; - var geojson = L.geoJson(feature, {weight: 7, color: 'chocolate'}); + var geojson = L.geoJSON(feature, {weight: 7, color: 'chocolate'}); geojson.setStyle({weight: 22, color: 'coral'}); var layer = geojson.getLayers()[0]; expect(layer.options.weight).to.be(22); @@ -327,7 +327,7 @@ describe("L.LayerGroup#toGeoJSON", function () { }] }; - expect(L.geoJson(json).toGeoJSON()).to.eql(json); + expect(L.geoJSON(json).toGeoJSON()).to.eql(json); }); it('roundtrips MiltiPoint features', function () { @@ -345,7 +345,7 @@ describe("L.LayerGroup#toGeoJSON", function () { }] }; - expect(L.geoJson(json).toGeoJSON()).to.eql(json); + expect(L.geoJSON(json).toGeoJSON()).to.eql(json); }); it("omits layers which do not implement toGeoJSON", function () { diff --git a/src/layer/GeoJSON.js b/src/layer/GeoJSON.js index 4e14324a76c..32c47429e56 100644 --- a/src/layer/GeoJSON.js +++ b/src/layer/GeoJSON.js @@ -173,15 +173,15 @@ L.extend(L.GeoJSON, { L.GeoJSON.asFeature(newGeometry); }, - asFeature: function (geoJSON) { - if (geoJSON.type === 'Feature') { - return geoJSON; + asFeature: function (geojson) { + if (geojson.type === 'Feature') { + return geojson; } return { type: 'Feature', properties: {}, - geometry: geoJSON + geometry: geojson }; } }); @@ -273,6 +273,8 @@ L.LayerGroup.include({ } }); -L.geoJson = function (geojson, options) { +L.geoJSON = function (geojson, options) { return new L.GeoJSON(geojson, options); }; +// Backward compatibility. +L.geoJson = L.geoJSON; From b5d3dcf2ab026f2d18d52788cf735c554b2dfcca Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Mon, 28 Dec 2015 05:45:31 +0100 Subject: [PATCH 1979/2207] retina url fix --- src/layer/tile/TileLayer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js index db35008a71f..4f43a583c00 100644 --- a/src/layer/tile/TileLayer.js +++ b/src/layer/tile/TileLayer.js @@ -76,7 +76,7 @@ L.TileLayer = L.GridLayer.extend({ getTileUrl: function (coords) { return L.Util.template(this._url, L.extend({ - r: this.options.detectRetina && L.Browser.retina && this.options.maxZoom > 0 ? '@2x' : '', + r: L.Browser.retina ? '@2x' : '', s: this._getSubdomain(coords), x: coords.x, y: this.options.tms ? this._globalTileRange.max.y - coords.y : coords.y, From 2b64978c9ee97b210ef4c7c9d5d47d0ca7eb117f Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Mon, 28 Dec 2015 15:00:20 +0100 Subject: [PATCH 1980/2207] Don't use try-finally --- src/map/Map.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index cac888c0c4b..3ccbb9b5517 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -177,17 +177,15 @@ L.Map = L.Evented.extend({ panInsideBounds: function (bounds, options) { this._enforcingBounds = true; - try { - var center = this.getCenter(), - newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); - - if (center.equals(newCenter)) { return this; } + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, L.latLngBounds(bounds)); + if (!center.equals(newCenter)) { this.panTo(newCenter, options); - return this; - } finally { - this._enforcingBounds = false; } + + this._enforcingBounds = false; + return this; }, invalidateSize: function (options) { From c185cb59c4d838c66cd2daef2272acf31628a4f4 Mon Sep 17 00:00:00 2001 From: Robert Plummer Date: Mon, 28 Dec 2015 11:57:47 -0500 Subject: [PATCH 1981/2207] prevent all click events from being removed from map if path doesn't have a click event --- src/layer/vector/canvas/Path.Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/canvas/Path.Canvas.js b/src/layer/vector/canvas/Path.Canvas.js index 778d8afbcb4..9b3427d9fd4 100644 --- a/src/layer/vector/canvas/Path.Canvas.js +++ b/src/layer/vector/canvas/Path.Canvas.js @@ -37,7 +37,7 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : .off('moveend', this._updatePath, this); if (this.options.clickable) { - this._map.off('click', this._onClick, this); + this._map.off('click', this._onClick || function() {}, this); this._map.off('mousemove', this._onMouseMove, this); } From f55bf723ab72cd642a5ede8db9e67cf1d72f117e Mon Sep 17 00:00:00 2001 From: Robert Plummer Date: Mon, 28 Dec 2015 13:08:20 -0500 Subject: [PATCH 1982/2207] move check so as not to create a function --- src/layer/vector/canvas/Path.Canvas.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/vector/canvas/Path.Canvas.js b/src/layer/vector/canvas/Path.Canvas.js index 9b3427d9fd4..291263b8e77 100644 --- a/src/layer/vector/canvas/Path.Canvas.js +++ b/src/layer/vector/canvas/Path.Canvas.js @@ -36,8 +36,8 @@ L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : .off('viewreset', this.projectLatlngs, this) .off('moveend', this._updatePath, this); - if (this.options.clickable) { - this._map.off('click', this._onClick || function() {}, this); + if (this.options.clickable && this._onClick !== undefined) { + this._map.off('click', this._onClick, this); this._map.off('mousemove', this._onMouseMove, this); } From 832b43ac587553372264046a98f769beb06d4b6f Mon Sep 17 00:00:00 2001 From: Per Liedman Date: Mon, 28 Dec 2015 20:53:26 +0100 Subject: [PATCH 1983/2207] Use all projected coords when calculating Polyline's pixel bounds. Close #3968. Close #4020. --- src/layer/vector/Polyline.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/layer/vector/Polyline.js b/src/layer/vector/Polyline.js index 14afad2feb0..bcb7ff798ee 100644 --- a/src/layer/vector/Polyline.js +++ b/src/layer/vector/Polyline.js @@ -129,23 +129,22 @@ L.Polyline = L.Path.extend({ }, _project: function () { + var pxBounds = new L.Bounds(); this._rings = []; - this._projectLatlngs(this._latlngs, this._rings); + this._projectLatlngs(this._latlngs, this._rings, pxBounds); - // project bounds as well to use later for Canvas hit detection/etc. var w = this._clickTolerance(), - p = new L.Point(w, -w); + p = new L.Point(w, w); if (this._bounds.isValid()) { - this._pxBounds = new L.Bounds( - this._map.latLngToLayerPoint(this._bounds.getSouthWest())._subtract(p), - this._map.latLngToLayerPoint(this._bounds.getNorthEast())._add(p)); + pxBounds.min._subtract(p); + pxBounds.max._add(p); + this._pxBounds = pxBounds; } }, // recursively turns latlngs into a set of rings with projected coordinates - _projectLatlngs: function (latlngs, result) { - + _projectLatlngs: function (latlngs, result, projectedBounds) { var flat = latlngs[0] instanceof L.LatLng, len = latlngs.length, i, ring; @@ -154,11 +153,12 @@ L.Polyline = L.Path.extend({ ring = []; for (i = 0; i < len; i++) { ring[i] = this._map.latLngToLayerPoint(latlngs[i]); + projectedBounds.extend(ring[i]); } result.push(ring); } else { for (i = 0; i < len; i++) { - this._projectLatlngs(latlngs[i], result); + this._projectLatlngs(latlngs[i], result, projectedBounds); } } }, From 75589f367b65995346289b1e6985ab9505691e29 Mon Sep 17 00:00:00 2001 From: Duncan Date: Sun, 3 Jan 2016 15:09:37 +0100 Subject: [PATCH 1984/2207] Optimize PNG images with ZopfliPNG and pngquant --- dist/images/layers-2x.png | Bin 2898 -> 1259 bytes dist/images/layers.png | Bin 1502 -> 699 bytes dist/images/marker-icon-2x.png | Bin 4033 -> 2586 bytes dist/images/marker-icon.png | Bin 1747 -> 1466 bytes dist/images/marker-shadow.png | Bin 797 -> 621 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/images/layers-2x.png b/dist/images/layers-2x.png index a2cf7f9efef65d2e021f382f47ef50d51d51a0df..200c333dca9652ac4cba004d609e5af4eee168c1 100644 GIT binary patch delta 1250 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 U2QaUVo&W#<07*qoM6N<$g2RbKz5oCK delta 1495 zcmV;|1t|Kv1>Osg8Gi-<005~MzCV_|S*E^l&Yo9;Xs000GBNkl!>2O#u)-K)t-b7_ z4;_qQVO+!wMxifbbbXMOZa$PzSqGbO(wN3ZhpEBbgrat>S~Xe|bN~GIP~y~S)o#Dn z?>Xmle&?LuA3`a`e%7T+mk0oKb#?8_k?aT5+uK{?cDvsNfK)2=Lq|u)#QzHF?(Qyb zY-~K^a=Dt#W`8pPV0CpB>2x|AjYe;Fc6L7h&!E1(zLV9})u*ghYw33S?Ck9Fgo=++wEZ(=B3H#x{g#TB~MOH_MSa^c4|)`Ns{=6hK6>J$8)^2 zw3OYbQA&$)x!mgjU^1EhAcSN$>dVW^nk>r$u~@866o1A1j-Xq&ZZo_Fkad)d~E z^7(wNq9`qtQX>EmLe>lh!w}E&<6CWKW@etrvi#%e)2E}GK-aEatEjE5J>zn@4)Z*} zX^WbsRjjS8ozQjt;C3Zp80Igd(fB*dvU6J!Bk6Q{bbNgL=DBm{=E&{ax8L%5y>AGD zVA@h9!++Y^TC=LE^#ESpBtYjlZp>&jh6y3cMqy!LA(u=he`Vcn_jgXGb4d^cy&x)z z;>qQ5Z|S=31VDCy007Z-{h+FT)INYo#%4dX9ik_aH*K}R)TU}i} ze(cyW;`Mr8f$`5uCX={#?;bUq%>xX>w4XnJevw3@(UX+Ys{s5dGZ9oU=UWT zb=_xfZVr)1gt9C<$n$*rg$oy+kvn(pv;w#apnhd#1@U+s<>lo#a^whj{>9)?N)eC8 zAtgtbeTH zIIfuIdD!iCWV2aBqfrdC8xVVVc)>hc<_H~FX%NQCOLV0;P zYHDg=G#U$VGCVw7OD^UcnH-d5xs+0RnSW49A&O!#fXf`moeBg3oFEAPg7w0}0uqS?91aKS z>+9DiP}g;gjg4VyY6?D|4}u_UgiqeTe?Oxr$}a#umn7-=rrTQ-#X11r2!en>AQ0d< zuC&mjbUKZvPoE+X2mk;^Mn+IsSqYcRwO&3=(^g}#*znxk90l;PBuRf3Vt@bZJrYHc z0C=AeBKmy3#j2{RmV%bcAKzn;9E(OHU-}Cg%w4y z9Ke@Gqw#Ps7_=4_7gud(m(6BpB9X|WY&JU%;8RJG=C`xk_0J%RVjCgkE1S)hsjI7N zVHm~;0F+WS9*+-BPfwdErBI!cB!ylUXHUN%Q4~1X*U3L xOOmAS7Gq!kI#Cpz0KNu50em7!(xbil{tcM#ah;kQ-Ddy*002ovPDHLkV1o7#%!2>` diff --git a/dist/images/marker-icon-2x.png b/dist/images/marker-icon-2x.png index 0015b6495fa458ad39d51cb4b913430016f48d33..e4abba3b511d14752426e8cbadae03c1e5fe15fb 100644 GIT binary patch literal 2586 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 UQO-*oc+)|Q_08}VdXD6O0C*xx%>V!Z literal 4033 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 aoPPlVyRC(T@#}&B0000Ae>~ikp;( z1g?5(x=rHN+|+?RbDcsRP;%+PO&U`S8+2#@pdK_JBi;G}&XlPikV;i2U5#dyG}>Dx zrsf4b15_9osKde28ns27Gh;ZAunJ&49%?M$LYczF1gc;J(2wJEFjHZ-~}1d<>Y9S~?SVPmej2tI9J~cwdK}P>TaZjpob@aDGISbRTET6O7Qog47vWRgOj{ z)JFgrhie;@UKz@#_ISoIx;R8scO0z0GuJzvV$h_}ZsNPf6ET-71}+O{|qoY>h$!CRL8H721I^4gp(XOJxOl5p0qg z&|aGkf=FoVR@5KmFQjX{0Jf_PEnd=1*S8b$Gkz$)Os);m#R|;GgSPEVj(YzuzQgSP$i#+9IV@h09IT%PyO5#6cuq%V( t^=eX^zr>4pB=AH0R_{Cr4hf|+uK!=tGwpSvHk$wd002ovPDHLkV1gv07})>- delta 785 zcmV+s1Md9o1f2$u8Gi-<005|90QLX?0^~_VK~z}7?U-AS(=ZT)$l;9Os4txR8dx@uJ8hXT%8MQwS)4FvQ@{juiSwS^OV6l>pcY|%3&<7AL!SYq zkUYeDfL%^Ns)nE#>i0pR^J~2K~ahRLR#?Jko}&dLtG% z<6QlYG^mO3{Xh^o%DkR9@I1E33pI#nwFYGLL;@#8lV7tcs3skl7= P015yANkvXXu0mjf!i;JG From d362c5cf7f1e68eae8a97ac8b5ef97e3a6cd9bae Mon Sep 17 00:00:00 2001 From: Masashi Takeshita Date: Tue, 5 Jan 2016 22:10:51 +0900 Subject: [PATCH 1985/2207] Update plugins.md Add plugin Leaflet.ZoomLabel --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 33d8ca20681..fe73e0c8ff4 100644 --- a/plugins.md +++ b/plugins.md @@ -1809,6 +1809,17 @@ Change the way the user can interactively move around the map. Mike O'Toole + + + Leaflet.ZoomLabel + + + A simple zoom label control. + + + Masashi Takeshita + + From 7f67924a4adbb07d67eb0b4bfee18fb4179f1121 Mon Sep 17 00:00:00 2001 From: ghybs Date: Thu, 7 Jan 2016 09:35:13 +0400 Subject: [PATCH 1986/2207] Plugins.md corrected link to Search & popups --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index fe73e0c8ff4..326335f75c5 100644 --- a/plugins.md +++ b/plugins.md @@ -1287,7 +1287,7 @@ The following plugins enable users to interact with overlay data: edit geometrie * [Edit geometries](#edit-geometries) * [Time & elevation](#time--elevation) -* [Search & popups](#ge#search--popups) +* [Search & popups](#search--popups) * [Area/overlay selection](#areaoverlay-selection) ### Edit geometries From 077ba0cbdf015ac4cc1207343d6053a0a00f5e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 Jan 2016 10:49:40 +0100 Subject: [PATCH 1987/2207] Point to 0.7.x docs by default --- _layouts/v2.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/v2.html b/_layouts/v2.html index ed303745d53..87058321c32 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -73,7 +73,7 @@

            an open-source JavaScript library
            for mobile-friendly in {% if page.title == 'Documentation' %} Docs {% else %} - Docs + Docs {% endif %}
          • From 6a283294fa582fba16b2cbe641cb9bb6dd2ef13a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 Jan 2016 13:27:48 +0100 Subject: [PATCH 1988/2207] Extra test case for #4093 --- debug/tests/tile-events.html | 89 ++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 debug/tests/tile-events.html diff --git a/debug/tests/tile-events.html b/debug/tests/tile-events.html new file mode 100644 index 00000000000..ebe7f99820a --- /dev/null +++ b/debug/tests/tile-events.html @@ -0,0 +1,89 @@ + + + + Leaflet debug page + + + + + + + + + + + + + +

            Keep track of how many tileload/tileunload events are being fired. The counts should always match. See #4093

            + +
            + + +
            StartLoadErrorUnload +
            +
            + +

            start = unload + visible on screen

            + + + + From 228d357239cf3d87dcaa9200830fcf3da36ed081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 Jan 2016 14:45:34 +0100 Subject: [PATCH 1989/2207] Work around precision issues in circle radius, fixes #2425 --- src/layer/vector/Circle.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index eb46df84405..9c9c1d8fd89 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -47,6 +47,10 @@ L.Circle = L.CircleMarker.extend({ lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) / (Math.cos(lat * d) * Math.cos(lat2 * d))) / d; + if (isNaN(lngR) || lngR === 0) { + lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425 + } + this._point = p.subtract(map.getPixelOrigin()); this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1); this._radiusY = Math.max(Math.round(p.y - top.y), 1); From 136abe30cc238a3f487d979662a038d0c6aa0c4a Mon Sep 17 00:00:00 2001 From: Bevan Hunt Date: Sat, 9 Jan 2016 18:19:50 -0800 Subject: [PATCH 1990/2207] add meteor-leaflet to frameworks --- plugins.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/plugins.md b/plugins.md index 77826489af4..0d96913004a 100644 --- a/plugins.md +++ b/plugins.md @@ -273,7 +273,7 @@ Plugins for loading basemaps or GIS raster layers in common (albeit non-default) Geobricks - + @@ -1621,7 +1621,7 @@ These plugins help users select either overlays or areas in the map. Iván Sánchez Ortega, MazeMap - + @@ -2169,7 +2169,7 @@ Show the geographical coordinates under the mouse cursor in different ways. Stefano Cudini - + @@ -2256,14 +2256,14 @@ These plugins extend Leaflet event handling. MazeMap - + Leaflet.VisualClick Adds visual feedback when user clicks/taps the map (demo). - Useful when further action is delayed by server requests, or implementation of Leaflet.singleclick. + Useful when further action is delayed by server requests, or implementation of Leaflet.singleclick. Or just because it looks cool :) Only tested with Leaflet 1.0.0-beta1. @@ -2609,7 +2609,7 @@ The following plugins use external services to calculate driving or walking rout Leaflet Routing Machine - Control for route search with via points, displaying itinerary and alternative routes. Uses + Control for route search with via points, displaying itinerary and alternative routes. Uses OSRM by default, but also supports GraphHopper, Mapbox Directions API and more. @@ -2635,7 +2635,7 @@ The following plugins use external services to calculate driving or walking rout Motion Intelligence GmbH - + Leaflet RouteBoxer @@ -2934,6 +2934,16 @@ Ease your development integrating Leaflet into a development framework or automa Miguel Andrade + + + meteor-leaflet + + + Provides a Meteor package to quickly build real-time cross-platform map apps. + + + Bevan Hunt + From 387a34e0a428554be3d5949afb4c9d0f59864a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Sun, 10 Jan 2016 15:18:21 +0100 Subject: [PATCH 1991/2207] Fix missing in plugins.md --- plugins.md | 87 ++++++++++++++++++++---------------------------------- 1 file changed, 32 insertions(+), 55 deletions(-) diff --git a/plugins.md b/plugins.md index 0d96913004a..ae04f251b71 100644 --- a/plugins.md +++ b/plugins.md @@ -2797,22 +2797,18 @@ Ease your development integrating Leaflet into a development framework or automa Leaflet Yeoman Generator - - + Yeoman generator that scaffolds out a basic Leaflet map application. - - + Moritz Klack react-leaflet - - + React components for Leaflet maps. - - + Paul Le Cam @@ -2828,11 +2824,9 @@ Ease your development integrating Leaflet into a development framework or automa Leaflet LayerConfig - - + Provide a json file or service response with a configuration of layers and markers to automatically set up a Leaflet client. - - + Alexander Nossum @@ -2848,102 +2842,85 @@ Ease your development integrating Leaflet into a development framework or automa Leaflet ZoomLevel CSS Class - - + Add zoom level css class to map element for easy style updates based on zoom levels - - + Dag Jomar Mersland famous-map - - + Integrate Leaflet in applications made with the famo.us web framework. - - + Hein Rutjes Angular Leaflet directive - - + Integrate Leaflet in applications made with the AngularJS web framework. - - + David Rubert Tiny Leaflet Directive - - + Tiny LeafletJS map directive for your AngularJS apps. - - + Martin Tesař - - - <leaflet-map> - - - Integrate Leaflet in applications made with the Polymer >= 1.0 web component framework. - - - Hendrik Brummermann, - Prateek Saxena - - - Leaflet map component + <leaflet-map> + + Integrate Leaflet in applications made with the Polymer >= 1.0 web component framework. + + Hendrik Brummermann, + Prateek Saxena + + + Leaflet map component + Integrate Leaflet in applications made with the Polymer 0.5 web framework. - - + Prateek Saxena JSF2Leaf - - + A JavaServer Faces wrapper for Leaflet. - - + Leonardo Ciocari ember-leaflet - - + Easy and declarative mapping for Ember.js using Leaflet. - - + Miguel Andrade meteor-leaflet - - + Provides a Meteor package to quickly build real-time cross-platform map apps. - - + Bevan Hunt + From 9e923ba00dc06dd78b7e40f4f5d6075eec5d421d Mon Sep 17 00:00:00 2001 From: Grant Harris Date: Mon, 11 Jan 2016 14:00:45 -0800 Subject: [PATCH 1992/2207] Add L.AngularControl to plugin list --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index ae04f251b71..39406b89a3f 100644 --- a/plugins.md +++ b/plugins.md @@ -2875,6 +2875,15 @@ Ease your development integrating Leaflet into a development framework or automa Martin Tesař + + + Leaflet Angular Control + + Insert and use Angularized HTML code in your Leaflet map as a Leaflet control. + + Grant Harris + + <leaflet-map> From 3fefd7c91783261141fe199226f0793f400ce32f Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 13 Jan 2016 12:53:28 +0200 Subject: [PATCH 1993/2207] add contributor covenant code of conduct --- CONTRIBUTING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54ccf74052c..56a996e00ee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,7 @@ Contributing to Leaflet 2. [Reporting Bugs](#reporting-bugs) 3. [Contributing Code](#contributing-code) 4. [Improving Documentation](#improving-documentation) + 5. [Code of Conduct](#code-of-conduct) ## Getting Involved @@ -150,6 +151,15 @@ If you need to update documentation according to a new feature that only appeare you need to make changes to the `gh-pages-master` branch instead of `gh-pages`. It will get merged into the latter when released as stable. +## Code of Conduct + +Everyone is invited to participate in the Leaflet community and related projects: +we want to create a welcoming and friendly environment. +Harassment of participants or other unethical and unprofessional behavior will not be tolerated in our spaces. +The [Contributor Covenant](http://contributor-covenant.org/version/1/3/0/) +applies to all projects under the Leaflet organization. +Report any issues to agafonkin@gmail.com. + ## Thank You Not only does your contribution to Leaflet and its community earn our gratitude, but it also makes you AWESOME. From dde24042d2e0b326cfed13b11891fa4420e5e4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 13 Jan 2016 14:29:46 +0100 Subject: [PATCH 1994/2207] Implement L.Browser.edge --- src/core/Browser.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/Browser.js b/src/core/Browser.js index e5ab98b6ac2..a8ede18eba2 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -30,6 +30,7 @@ L.Browser = { ie: ie, ielt9: ie && !document.addEventListener, + edge: 'msLaunchUri' in navigator && !('documentMode' in document), webkit: webkit, gecko: gecko, android: ua.indexOf('android') !== -1, From 25648b8f35c7ea42d90843ac4439d7f5fdc93ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 7 Jan 2016 13:25:52 +0100 Subject: [PATCH 1995/2207] Possible fix for #4127, assume dblclick DOM event exists in touch-capable browsers --- src/dom/DomEvent.DoubleTap.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index d3ec09ecb79..5be9097ae97 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -57,18 +57,27 @@ L.extend(L.DomEvent, { obj[pre + touchstart + id] = onTouchStart; obj[pre + touchend + id] = onTouchEnd; + obj[pre + 'dblclick' + id] = handler; obj.addEventListener(touchstart, onTouchStart, false); obj.addEventListener(touchend, onTouchEnd, false); + + // On some platforms (notably, chrome on win10 + touchscreen + mouse), + // the browser doesn't fire touchend/pointerup events but does fire native dblclicks + obj.addEventListener('dblclick', handler, false); + return this; }, removeDoubleTapListener: function (obj, id) { var pre = '_leaflet_', - touchend = obj[pre + this._touchend + id]; + touchstart = obj[pre + this._touchstart + id], + touchend = obj[pre + this._touchend + id], + dblclick = obj[pre + 'dblclick' + id]; - obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false); + obj.removeEventListener(this._touchstart, touchstart, false); obj.removeEventListener(this._touchend, touchend, false); + obj.removeEventListener('dblclick', dblclick, false); return this; } From ce0b28950479b4d36937869539c7ad1570a940a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 8 Jan 2016 13:07:01 +0100 Subject: [PATCH 1996/2207] Test webpage for dblclick/dbltap performance --- debug/tests/doubleclick-events-slowdown.html | 72 ++++++++++++++++++++ src/dom/DomEvent.DoubleTap.js | 3 +- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 debug/tests/doubleclick-events-slowdown.html diff --git a/debug/tests/doubleclick-events-slowdown.html b/debug/tests/doubleclick-events-slowdown.html new file mode 100644 index 00000000000..2c282117067 --- /dev/null +++ b/debug/tests/doubleclick-events-slowdown.html @@ -0,0 +1,72 @@ + + + + Leaflet debug page + + + + + + + + + + + + +

            This test is meant for testing the performance of doubleclick event handler in IE. See #4127 and #2820

            + +
            +
            + + + + diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index 5be9097ae97..f4d5598963f 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -63,7 +63,8 @@ L.extend(L.DomEvent, { obj.addEventListener(touchend, onTouchEnd, false); // On some platforms (notably, chrome on win10 + touchscreen + mouse), - // the browser doesn't fire touchend/pointerup events but does fire native dblclicks + // the browser doesn't fire touchend/pointerup events but does fire + // native dblclicks. See #4127. obj.addEventListener('dblclick', handler, false); return this; From 11ebda22d53ce27a93b9a641b45ea7dac25655ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 13 Jan 2016 14:44:33 +0100 Subject: [PATCH 1997/2207] Work around MS Edge duplicated dblclick on DomEvent.DoubleTap --- src/dom/DomEvent.DoubleTap.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js index f4d5598963f..6bccce48e48 100644 --- a/src/dom/DomEvent.DoubleTap.js +++ b/src/dom/DomEvent.DoubleTap.js @@ -65,7 +65,9 @@ L.extend(L.DomEvent, { // On some platforms (notably, chrome on win10 + touchscreen + mouse), // the browser doesn't fire touchend/pointerup events but does fire // native dblclicks. See #4127. - obj.addEventListener('dblclick', handler, false); + if (!L.Browser.edge) { + obj.addEventListener('dblclick', handler, false); + } return this; }, @@ -78,7 +80,9 @@ L.extend(L.DomEvent, { obj.removeEventListener(this._touchstart, touchstart, false); obj.removeEventListener(this._touchend, touchend, false); - obj.removeEventListener('dblclick', dblclick, false); + if (!L.Browser.edge) { + obj.removeEventListener('dblclick', dblclick, false); + } return this; } From ce6e278e993e9f12917d8bab897185aac48d67d6 Mon Sep 17 00:00:00 2001 From: Panu Ranta Date: Thu, 14 Jan 2016 21:08:01 +0200 Subject: [PATCH 1998/2207] Removed reference to non-existing layer motorways layer was removed in f18d503776d01fd9ec146e7ebb5a911aff38b258 --- examples/layers-control.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/layers-control.md b/examples/layers-control.md index 8f653d802a7..91e72da0e59 100644 --- a/examples/layers-control.md +++ b/examples/layers-control.md @@ -57,7 +57,7 @@ Now, all that's left to do is to create a [Layers Control](../reference.html#con
            L.control.layers(baseMaps, overlayMaps).addTo(map);
            -Note that we added `grayscale`, `motorways` and `cities` layers to the map but didn't add `streets`. The layers control is smart enough to detect what layers we've already added and have corresponding checkboxes and radioboxes set. +Note that we added `grayscale` and `cities` layers to the map but didn't add `streets`. The layers control is smart enough to detect what layers we've already added and have corresponding checkboxes and radioboxes set. Also note that when using multiple base layers, only one of them should be added to the map at instantiation, but all of them should be present in the base layers object when creating the layers control. From d7c71aaaf5fba820e56f10d76f6df1ce3c368513 Mon Sep 17 00:00:00 2001 From: Prayag Verma Date: Sat, 16 Jan 2016 07:42:01 +0530 Subject: [PATCH 1999/2207] Update year range to 2016 --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 13f6bcf2540..9a246c9d3c8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2015, Vladimir Agafonkin +Copyright (c) 2010-2016, Vladimir Agafonkin Copyright (c) 2010-2011, CloudMade All rights reserved. From 65ccc2b36c11101028a1db25331f88419cadb3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 8 Jun 2015 17:47:08 +0200 Subject: [PATCH 2000/2207] Fractional zoom controls. --- debug/map/zoom-delta.html | 107 +++++++++++++++++++ spec/suites/map/MapSpec.js | 136 +++++++++++++++++++++++++ src/map/Map.js | 49 ++++++--- src/map/anim/Map.FlyTo.js | 2 +- src/map/anim/Map.PanAnimation.js | 2 +- src/map/handler/Map.DoubleClickZoom.js | 3 +- src/map/handler/Map.Drag.js | 2 +- src/map/handler/Map.Keyboard.js | 11 +- src/map/handler/Map.ScrollWheelZoom.js | 4 +- src/map/handler/Map.TouchZoom.js | 9 +- 10 files changed, 293 insertions(+), 32 deletions(-) create mode 100644 debug/map/zoom-delta.html diff --git a/debug/map/zoom-delta.html b/debug/map/zoom-delta.html new file mode 100644 index 00000000000..ee449a6cbf0 --- /dev/null +++ b/debug/map/zoom-delta.html @@ -0,0 +1,107 @@ + + + + Leaflet debug page + + + + + + + + + + + + + +

            Zoom delta test.

            + +

            Zooming with touch zoom, box zoom or flyTo then map.stop() must make the zoom level snap to the value of the zoomSnap option. Zoom interactions (keyboard, mouse wheel, zoom control buttons must change the zoom by the amount in the zoomDelta option.

            + +
            + + + +
            + +
            + Snap: 0.25. Delta: 0.5. +
            + +
            +
            + Snap: 0 (off). Delta: 0.25. +
            + +
            + + + + diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 71db179d00f..3346fe2d058 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -624,6 +624,142 @@ describe("Map", function () { map.setView([0, 0], 0); map.once('zoomend', callback).flyTo(newCenter, newZoom); }); + }); + + describe('#zoomIn and #zoomOut', function () { + var center = L.latLng(22, 33); + beforeEach(function () { + map.setView(center, 10); + }); + + it('zoomIn zooms by 1 zoom level by default', function (done) { + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(11); + expect(map.getCenter()).to.eql(center); + done(); + }); + map.zoomIn(null, {animate: false}); + }); + + it('zoomOut zooms by 1 zoom level by default', function (done) { + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(9); + expect(map.getCenter()).to.eql(center); + done(); + }); + map.zoomOut(null, {animate: false}); + }); + + it('zoomIn ignores the zoomDelta option on non-any3d browsers', function (done) { + L.Browser.any3d = false; + map.options.zoomSnap = 0.25; + map.options.zoomDelta = 0.25; + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(11); + expect(map.getCenter()).to.eql(center); + done(); + }); + map.zoomIn(null, {animate: false}); + }); + + it('zoomIn respects the zoomDelta option on any3d browsers', function (done) { + L.Browser.any3d = true; + map.options.zoomSnap = 0.25; + map.options.zoomDelta = 0.25; + map.setView(center, 10); + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(10.25); + expect(map.getCenter()).to.eql(center); + done(); + }); + map.zoomIn(null, {animate: false}); + }); + + it('zoomOut respects the zoomDelta option on any3d browsers', function (done) { + L.Browser.any3d = true; + map.options.zoomSnap = 0.25; + map.options.zoomDelta = 0.25; + map.setView(center, 10); + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(9.75); + expect(map.getCenter()).to.eql(center); + done(); + }); + map.zoomOut(null, {animate: false}); + }); + + it('zoomIn snaps to zoomSnap on any3d browsers', function (done) { + map.options.zoomSnap = 0.25; + map.setView(center, 10); + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(10.25); + expect(map.getCenter()).to.eql(center); + done(); + }); + L.Browser.any3d = true; + map.zoomIn(0.22, {animate: false}); + }); + + it('zoomOut snaps to zoomSnap on any3d browsers', function (done) { + map.options.zoomSnap = 0.25; + map.setView(center, 10); + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(9.75); + expect(map.getCenter()).to.eql(center); + done(); + }); + L.Browser.any3d = true; + map.zoomOut(0.22, {animate: false}); + }); + }); + + describe('#fitBounds', function () { + var center = L.latLng(22, 33), + bounds = L.latLngBounds(L.latLng(1, 102), L.latLng(11, 122)), + boundsCenter = bounds.getCenter(); + + beforeEach(function () { + // fitBounds needs a map container with non-null area + var container = map.getContainer(); + container.style.width = container.style.height = "100px"; + document.body.appendChild(container); + map.setView(center, 10); + }); + + afterEach(function() { + document.body.removeChild(map.getContainer()); + }); + + it('Snaps zoom level to integer by default', function (done) { + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(2); + expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); + done(); + }); + map.fitBounds(bounds, {animate: false}); + }); + + it('Snaps zoom to zoomSnap on any3d browsers', function (done) { + map.options.zoomSnap = 0.25; + L.Browser.any3d = true; + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(2.75); + expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); + done(); + }); + map.fitBounds(bounds, {animate: false}); + }); + + it('Ignores zoomSnap on non-any3d browsers', function (done) { + map.options.zoomSnap = 0.25; + L.Browser.any3d = false; + map.once('zoomend', function() { + expect(map.getZoom()).to.eql(2); + expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); + done(); + }); + map.fitBounds(bounds, {animate: false}); + }); }); diff --git a/src/map/Map.js b/src/map/Map.js index 4a288e50b4c..327a59e70ab 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -17,7 +17,9 @@ L.Map = L.Evented.extend({ trackResize: true, markerZoomAnimation: true, maxBoundsViscosity: 0.0, - transform3DLimit: 8388608 // Precision limit of a 32-bit float + transform3DLimit: 8388608, // Precision limit of a 32-bit float + zoomSnap: 1, + zoomDelta: 1 }, initialize: function (id, options) { // (HTMLElement or String, Object) @@ -72,11 +74,13 @@ L.Map = L.Evented.extend({ }, zoomIn: function (delta, options) { - return this.setZoom(this._zoom + (delta || 1), options); + delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom + delta, options); }, zoomOut: function (delta, options) { - return this.setZoom(this._zoom - (delta || 1), options); + delta = delta || (L.Browser.any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom - delta, options); }, setZoomAround: function (latlng, zoom, options) { @@ -232,11 +236,8 @@ L.Map = L.Evented.extend({ }, stop: function () { - L.Util.cancelAnimFrame(this._flyToFrame); - if (this._panAnim) { - this._panAnim.stop(); - } - return this; + this.setZoom(this._limitZoom(this._zoom)); + return this._stop(); }, // TODO handler.addTo @@ -331,9 +332,10 @@ L.Map = L.Evented.extend({ getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number bounds = L.latLngBounds(bounds); - var zoom = this.getMinZoom() - (inside ? 1 : 0), + var zoom, maxZoom = this.getMaxZoom(), size = this.getSize(), + snap = L.Browser.any3d ? this.options.zoomSnap : 1, nw = bounds.getNorthWest(), se = bounds.getSouthEast(), @@ -343,8 +345,17 @@ L.Map = L.Evented.extend({ padding = L.point(padding || [0, 0]); + if (snap <= 0) { + zoom = this.getZoom(); + boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); + var scale = Math.min(size.x / boundsSize.x , size.y / boundsSize.y); + return this.getScaleZoom(scale, zoom); + } + + zoom = this.getMinZoom() - (inside ? snap : 0); + do { - zoom++; + zoom += snap; boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding).floor(); zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; @@ -354,7 +365,7 @@ L.Map = L.Evented.extend({ return null; } - return inside ? zoom : zoom - 1; + return inside ? zoom : zoom - snap; }, getSize: function () { @@ -582,6 +593,14 @@ L.Map = L.Evented.extend({ return this.fire('moveend'); }, + _stop: function() { + L.Util.cancelAnimFrame(this._flyToFrame); + if (this._panAnim) { + this._panAnim.stop(); + } + return this; + }, + _rawPanBy: function (offset) { L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); }, @@ -837,9 +856,11 @@ L.Map = L.Evented.extend({ _limitZoom: function (zoom) { var min = this.getMinZoom(), - max = this.getMaxZoom(); - if (!L.Browser.any3d) { zoom = Math.round(zoom); } - + max = this.getMaxZoom(), + snap = L.Browser.any3d ? this.options.zoomSnap : 1; + if (snap) { + zoom = Math.round(zoom / snap) * snap; + } return Math.max(min, Math.min(max, zoom)); } }); diff --git a/src/map/anim/Map.FlyTo.js b/src/map/anim/Map.FlyTo.js index a238919f9f3..a0077d1fcfe 100644 --- a/src/map/anim/Map.FlyTo.js +++ b/src/map/anim/Map.FlyTo.js @@ -7,7 +7,7 @@ L.Map.include({ return this.setView(targetCenter, targetZoom, options); } - this.stop(); + this._stop(); var from = this.project(this.getCenter()), to = this.project(targetCenter), diff --git a/src/map/anim/Map.PanAnimation.js b/src/map/anim/Map.PanAnimation.js index 5b6fdd2f89d..552f7c5786b 100644 --- a/src/map/anim/Map.PanAnimation.js +++ b/src/map/anim/Map.PanAnimation.js @@ -10,7 +10,7 @@ L.Map.include({ center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds); options = options || {}; - this.stop(); + this._stop(); if (this._loaded && !options.reset && options !== true) { diff --git a/src/map/handler/Map.DoubleClickZoom.js b/src/map/handler/Map.DoubleClickZoom.js index 8f38140696a..1af4baae229 100644 --- a/src/map/handler/Map.DoubleClickZoom.js +++ b/src/map/handler/Map.DoubleClickZoom.js @@ -18,7 +18,8 @@ L.Map.DoubleClickZoom = L.Handler.extend({ _onDoubleClick: function (e) { var map = this._map, oldZoom = map.getZoom(), - zoom = e.originalEvent.shiftKey ? Math.ceil(oldZoom) - 1 : Math.floor(oldZoom) + 1; + delta = map.options.zoomDelta, + zoom = e.originalEvent.shiftKey ? oldZoom - delta : oldZoom + delta; if (map.options.doubleClickZoom === 'center') { map.setZoom(zoom); diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 44cf40ea2b0..3d9cc1664f6 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -54,7 +54,7 @@ L.Map.Drag = L.Handler.extend({ }, _onDown: function () { - this._map.stop(); + this._map._stop(); }, _onDragStart: function () { diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 7a4e7ccdac1..27aaad12105 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -4,8 +4,7 @@ L.Map.mergeOptions({ keyboard: true, - keyboardPanOffset: 80, - keyboardZoomOffset: 1 + keyboardPanDelta: 80 }); L.Map.Keyboard = L.Handler.extend({ @@ -22,8 +21,8 @@ L.Map.Keyboard = L.Handler.extend({ initialize: function (map) { this._map = map; - this._setPanOffset(map.options.keyboardPanOffset); - this._setZoomOffset(map.options.keyboardZoomOffset); + this._setPanDelta(map.options.keyboardPanDelta); + this._setZoomDelta(map.options.zoomDelta); }, addHooks: function () { @@ -84,7 +83,7 @@ L.Map.Keyboard = L.Handler.extend({ this._map.fire('blur'); }, - _setPanOffset: function (pan) { + _setPanDelta: function (pan) { var keys = this._panKeys = {}, codes = this.keyCodes, i, len; @@ -103,7 +102,7 @@ L.Map.Keyboard = L.Handler.extend({ } }, - _setZoomOffset: function (zoom) { + _setZoomDelta: function (zoom) { var keys = this._zoomKeys = {}, codes = this.keyCodes, i, len; diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index bb8d94eb284..a04ab5d987c 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -40,10 +40,10 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ _performZoom: function () { var map = this._map, - delta = this._delta, + delta = this._delta * this._map.options.zoomDelta, zoom = map.getZoom(); - map.stop(); // stop panning and fly animations if any + map._stop(); // stop panning and fly animations if any // map the delta with a sigmoid function to -4..4 range leaning on -1..1 var d2 = Math.ceil(4 * Math.log(2 / (1 + Math.exp(-Math.abs(delta / 200)))) / Math.LN2); diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index f142e1a42b9..b773acdc3bb 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -36,7 +36,7 @@ L.Map.TouchZoom = L.Handler.extend({ this._moved = false; this._zooming = true; - map.stop(); + map._stop(); L.DomEvent .on(document, 'touchmove', this._onTouchMove, this) @@ -97,11 +97,8 @@ L.Map.TouchZoom = L.Handler.extend({ .off(document, 'touchmove', this._onTouchMove) .off(document, 'touchend', this._onTouchEnd); - var zoom = this._zoom; - zoom = this._map._limitZoom(zoom - this._startZoom > 0 ? Math.ceil(zoom) : Math.floor(zoom)); - - - this._map._animateZoom(this._center, zoom, true, true); + // Pinch shall update GridLayers' levels only when snapzoom is off. + this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.snapZoom); } }); From 3fde3c0390e03c6d0187ede1c9418c3c57fd1765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Jun 2015 09:58:44 +0200 Subject: [PATCH 2001/2207] Got rid of the loop in Map.getBoundsZoom --- src/map/Map.js | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/src/map/Map.js b/src/map/Map.js index 327a59e70ab..62af92084d7 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -331,41 +331,25 @@ L.Map = L.Evented.extend({ getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number bounds = L.latLngBounds(bounds); + padding = L.point(padding || [0, 0]); - var zoom, - maxZoom = this.getMaxZoom(), - size = this.getSize(), - snap = L.Browser.any3d ? this.options.zoomSnap : 1, - + var zoom = this.getZoom(), + min = this.getMinZoom(), + max = this.getMaxZoom(), nw = bounds.getNorthWest(), se = bounds.getSouthEast(), + size = this.getSize(), + boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding), + snap = L.Browser.any3d ? this.options.zoomSnap : 1; - zoomNotFound = true, - boundsSize; - - padding = L.point(padding || [0, 0]); - - if (snap <= 0) { - zoom = this.getZoom(); - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding); - var scale = Math.min(size.x / boundsSize.x , size.y / boundsSize.y); - return this.getScaleZoom(scale, zoom); - } - - zoom = this.getMinZoom() - (inside ? snap : 0); - - do { - zoom += snap; - boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding).floor(); - zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y; - - } while (zoomNotFound && zoom <= maxZoom); + var scale = Math.min(size.x / boundsSize.x, size.y / boundsSize.y); + zoom = this.getScaleZoom(scale, zoom); - if (zoomNotFound && inside) { - return null; + if (snap) { + zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap; } - return inside ? zoom : zoom - snap; + return Math.max(min, Math.min(max, zoom)); }, getSize: function () { From 5c0ad75b44b2d65e3d05bfe42a1baea56df579c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 16 Jul 2015 09:32:06 +0200 Subject: [PATCH 2002/2207] Zoom control shall use the map's zoomDelta option. --- src/control/Control.Zoom.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/control/Control.Zoom.js b/src/control/Control.Zoom.js index 629f81dbcc6..c972a856880 100644 --- a/src/control/Control.Zoom.js +++ b/src/control/Control.Zoom.js @@ -45,13 +45,13 @@ L.Control.Zoom = L.Control.extend({ _zoomIn: function (e) { if (!this._disabled) { - this._map.zoomIn(e.shiftKey ? 3 : 1); + this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); } }, _zoomOut: function (e) { if (!this._disabled) { - this._map.zoomOut(e.shiftKey ? 3 : 1); + this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); } }, From afd795995969f17ad7eea839fd892ce812641f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 28 Sep 2015 12:22:48 +0200 Subject: [PATCH 2003/2207] Make linter happy. --- spec/suites/map/MapSpec.js | 22 +++++++++++----------- src/map/Map.js | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 3346fe2d058..57e26de8f00 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -633,7 +633,7 @@ describe("Map", function () { }); it('zoomIn zooms by 1 zoom level by default', function (done) { - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(11); expect(map.getCenter()).to.eql(center); done(); @@ -642,7 +642,7 @@ describe("Map", function () { }); it('zoomOut zooms by 1 zoom level by default', function (done) { - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(9); expect(map.getCenter()).to.eql(center); done(); @@ -654,7 +654,7 @@ describe("Map", function () { L.Browser.any3d = false; map.options.zoomSnap = 0.25; map.options.zoomDelta = 0.25; - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(11); expect(map.getCenter()).to.eql(center); done(); @@ -667,7 +667,7 @@ describe("Map", function () { map.options.zoomSnap = 0.25; map.options.zoomDelta = 0.25; map.setView(center, 10); - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(10.25); expect(map.getCenter()).to.eql(center); done(); @@ -680,7 +680,7 @@ describe("Map", function () { map.options.zoomSnap = 0.25; map.options.zoomDelta = 0.25; map.setView(center, 10); - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(9.75); expect(map.getCenter()).to.eql(center); done(); @@ -691,7 +691,7 @@ describe("Map", function () { it('zoomIn snaps to zoomSnap on any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.setView(center, 10); - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(10.25); expect(map.getCenter()).to.eql(center); done(); @@ -703,7 +703,7 @@ describe("Map", function () { it('zoomOut snaps to zoomSnap on any3d browsers', function (done) { map.options.zoomSnap = 0.25; map.setView(center, 10); - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(9.75); expect(map.getCenter()).to.eql(center); done(); @@ -726,12 +726,12 @@ describe("Map", function () { map.setView(center, 10); }); - afterEach(function() { + afterEach(function () { document.body.removeChild(map.getContainer()); }); it('Snaps zoom level to integer by default', function (done) { - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(2); expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); done(); @@ -742,7 +742,7 @@ describe("Map", function () { it('Snaps zoom to zoomSnap on any3d browsers', function (done) { map.options.zoomSnap = 0.25; L.Browser.any3d = true; - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(2.75); expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); done(); @@ -753,7 +753,7 @@ describe("Map", function () { it('Ignores zoomSnap on non-any3d browsers', function (done) { map.options.zoomSnap = 0.25; L.Browser.any3d = false; - map.once('zoomend', function() { + map.once('zoomend', function () { expect(map.getZoom()).to.eql(2); expect(map.getCenter().equals(boundsCenter, 0.05)).to.eql(true); done(); diff --git a/src/map/Map.js b/src/map/Map.js index 62af92084d7..8a5d5f8dafe 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -577,7 +577,7 @@ L.Map = L.Evented.extend({ return this.fire('moveend'); }, - _stop: function() { + _stop: function () { L.Util.cancelAnimFrame(this._flyToFrame); if (this._panAnim) { this._panAnim.stop(); From 12f8eb8b84d3310fca05322682d69527b666c1dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 18 Jan 2016 10:27:29 +0100 Subject: [PATCH 2004/2207] Fix conflict with wheel events from #3653 --- src/map/handler/Map.ScrollWheelZoom.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index a04ab5d987c..d6f17406400 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -40,14 +40,14 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ _performZoom: function () { var map = this._map, - delta = this._delta * this._map.options.zoomDelta, zoom = map.getZoom(); map._stop(); // stop panning and fly animations if any // map the delta with a sigmoid function to -4..4 range leaning on -1..1 - var d2 = Math.ceil(4 * Math.log(2 / (1 + Math.exp(-Math.abs(delta / 200)))) / Math.LN2); - delta = map._limitZoom(zoom + (delta > 0 ? d2 : -d2)) - zoom; + var d2 = Math.ceil(4 * Math.log(2 / (1 + Math.exp(-Math.abs(this._delta / 200)))) / Math.LN2), + d3 = d2 * this._map.options.zoomDelta, + delta = map._limitZoom(zoom + (this._delta > 0 ? d3 : -d3)) - zoom; this._delta = 0; this._startTime = null; From db016b7a30e6c05950aed0766ee9d1bb763ca540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 18 Jan 2016 10:58:52 +0100 Subject: [PATCH 2005/2207] Partial revert of e2fbe196, fixes #4145 --- src/layer/tile/GridLayer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index 1707eab548a..c4b62136f9b 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -444,8 +444,9 @@ L.GridLayer = L.Layer.extend({ _getTiledPixelBounds: function (center) { var map = this._map, + scale = map.getZoomScale(map.getZoom(), this._tileZoom), pixelCenter = map.project(center, this._tileZoom).floor(), - halfSize = map.getSize().divideBy(2); + halfSize = map.getSize().divideBy(scale * 2); return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize)); }, From f43950e3fa09e20fb9ce1560d31e1ed581639d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 18 Jan 2016 18:08:57 +0100 Subject: [PATCH 2006/2207] Renaming parameters (just for legibility) --- src/map/handler/Map.Keyboard.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/map/handler/Map.Keyboard.js b/src/map/handler/Map.Keyboard.js index 27aaad12105..d82a152ebd4 100644 --- a/src/map/handler/Map.Keyboard.js +++ b/src/map/handler/Map.Keyboard.js @@ -83,35 +83,35 @@ L.Map.Keyboard = L.Handler.extend({ this._map.fire('blur'); }, - _setPanDelta: function (pan) { + _setPanDelta: function (panDelta) { var keys = this._panKeys = {}, codes = this.keyCodes, i, len; for (i = 0, len = codes.left.length; i < len; i++) { - keys[codes.left[i]] = [-1 * pan, 0]; + keys[codes.left[i]] = [-1 * panDelta, 0]; } for (i = 0, len = codes.right.length; i < len; i++) { - keys[codes.right[i]] = [pan, 0]; + keys[codes.right[i]] = [panDelta, 0]; } for (i = 0, len = codes.down.length; i < len; i++) { - keys[codes.down[i]] = [0, pan]; + keys[codes.down[i]] = [0, panDelta]; } for (i = 0, len = codes.up.length; i < len; i++) { - keys[codes.up[i]] = [0, -1 * pan]; + keys[codes.up[i]] = [0, -1 * panDelta]; } }, - _setZoomDelta: function (zoom) { + _setZoomDelta: function (zoomDelta) { var keys = this._zoomKeys = {}, codes = this.keyCodes, i, len; for (i = 0, len = codes.zoomIn.length; i < len; i++) { - keys[codes.zoomIn[i]] = zoom; + keys[codes.zoomIn[i]] = zoomDelta; } for (i = 0, len = codes.zoomOut.length; i < len; i++) { - keys[codes.zoomOut[i]] = -zoom; + keys[codes.zoomOut[i]] = -zoomDelta; } }, From f890b4984d970fe875754f973ce4f0304f05d03f Mon Sep 17 00:00:00 2001 From: Martin Raifer Date: Tue, 19 Jan 2016 15:41:52 +0100 Subject: [PATCH 2007/2207] Fix link to "map.createPane" method --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index d9a13161494..ac276fe5bf5 100644 --- a/reference.html +++ b/reference.html @@ -1329,7 +1329,7 @@

            Properties

            Map Panes

            -

            Panes are DOM elements used to control the ordering of layers on the map. You can access panes with map.getPane or map.getPanesmethods. New panes can be created with the map.createPane method.

            +

            Panes are DOM elements used to control the ordering of layers on the map. You can access panes with map.getPane or map.getPanesmethods. New panes can be created with the map.createPane method.

            Every map has the following panes that differ only in zIndex.

            From 95c1834be1305feca9e2ca6b23e23bcfdd1e97d6 Mon Sep 17 00:00:00 2001 From: Rubens Pinheiro Date: Wed, 20 Jan 2016 11:17:11 -0300 Subject: [PATCH 2008/2207] Add Leaflet.AntPath plugin --- plugins.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins.md b/plugins.md index 39406b89a3f..93da504206b 100644 --- a/plugins.md +++ b/plugins.md @@ -782,6 +782,16 @@ The following plugins provide new ways of displaying overlay data information. These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also know these as symbolizers. + + + + +
            PluginDescriptionMaintainer
            + Leaflet.AntPath + + Leaflet.AntPath put a flux animation (like ants walking) into a Polyline. + (demo) + + Rubens Pinheiro +
            Leaflet.ellipse From d165e267a52d0e604a3be130b123545d0ac391d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 20 Jan 2016 15:23:03 +0100 Subject: [PATCH 2009/2207] Moved Leaflet.AntPath plugin from renderers to animations section --- plugins.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins.md b/plugins.md index 93da504206b..4250478b93b 100644 --- a/plugins.md +++ b/plugins.md @@ -782,16 +782,6 @@ The following plugins provide new ways of displaying overlay data information. These plugins provide new markers or news ways of converting abstract data into images in your screen. Leaflet users versed in GIS also know these as symbolizers. - - - -
            PluginDescriptionMaintainer
            - Leaflet.AntPath - - Leaflet.AntPath put a flux animation (like ants walking) into a Polyline. - (demo) - - Rubens Pinheiro -
            Leaflet.ellipse @@ -1087,7 +1077,16 @@ These plugins animate markers or some geometries. See also [geometries with time MazeMap
            +
            + Leaflet.AntPath + + Leaflet.AntPath put a flux animation (like ants walking) into a Polyline. + (demo) + + Rubens Pinheiro +
            From ca902c672de790dea68d352144f443c7c9f7a459 Mon Sep 17 00:00:00 2001 From: Xisco Guaita Date: Thu, 21 Jan 2016 18:45:45 +0100 Subject: [PATCH 2010/2207] Add Leaflet.MapCenterCoord plugin A Leaflet control to display the coordinates of the map center, especially useful on touch/mobile devices http://xguaita.github.io/Leaflet.MapCenterCoord/ --- plugins.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins.md b/plugins.md index 4250478b93b..c3db07b1729 100644 --- a/plugins.md +++ b/plugins.md @@ -2179,6 +2179,17 @@ Show the geographical coordinates under the mouse cursor in different ways. Stefano Cudini + + + Leaflet.MapCenterCoord + + + A Leaflet control to display the coordinates of the map center, especially useful on touch/mobile devices. (Doc & demos) + + + Xisco Guaita + + From 29ddd07178eed206fa58b55cd0ef2d6902a7165e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 21 Jan 2016 19:33:41 +0100 Subject: [PATCH 2011/2207] Update plugin guide to prevent some new common pitfalls --- PLUGIN-GUIDE.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index 82f2c62c366..2a4c95d0576 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -17,6 +17,7 @@ This guide lists a number of best practices for publishing a Leaflet plugin that - [Plugin API](#plugin-api) 3. [Publishing on NPM](#publishing-on-npm) 4. [Module Loaders](#module-loaders) +5. [Adding to the plugins list](#adding-to-the-plugins-list) ## Presentation @@ -107,9 +108,10 @@ and putting a space after the `function` keyword. Never expose global variables in your plugin.
            If you have a new class, put it directly in the `L` namespace (`L.MyPlugin`).
            If you inherit one of the existing classes, make it a sub-property (`L.TileLayer.Banana`).
            +Every class should have a factory function in camelCase, e.g. (`L.tileLayer.banana`).
            If you want to add new methods to existing Leaflet classes, you can do it like this: `L.Marker.include({myPlugin: …})`. -Function, method and property names should be in `camelCase`.
            +Function, method, property and factory names should be in `camelCase`.
            Class names should be in `CapitalizedCamelCase`. If you have a lot of arguments in your function, consider accepting an options object instead @@ -152,6 +154,21 @@ Here is an example of a `package.json` file for a Leaflet plugin. } ``` +If possible, do not commit your minified files (e.g. `dist`) to a repo; this can +lead to confussion when trying to debug the wrong file. Instead, use `npm` to +trigger a build/minification just before publishing your package with a +[`prepublish` script](https://docs.npmjs.com/misc/scripts#common-uses), for example: + +```json +{ + "name": "my-leaflet-plugin", + ... + "scripts": { + "prepublish": "grunt build" + } +} +``` + ## Module Loaders Module loaders such as [RequireJS](http://requirejs.org/) and [Browserify](http://browserify.org/) implement module systems like AMD (Asynchronous Module Definition) and CommonJS to allow developers to modularize and load their code. @@ -184,3 +201,17 @@ You can add support for AMD/CommonJS loaders to your Leaflet plugin by following ``` Now your plugin is available as an AMD and CommonJS module and can used used in module loaders like Browserify and RequireJS. + + +## Adding to the plugins list + +Once your plugin is published, it is a good idea to add it to the [Leaflet plugins list](http://leafletjs.com/plugins.html). To do so: + +* [Fork](https://help.github.com/articles/fork-a-repo/) the Leaflet repo. +* Clone your repo locally, and switch to the [`gh-pages` branch](https://github.com/Leaflet/Leaflet/tree/gh-pages). +* In the `plugins.md` file, find the section your plugin should go in, and add a table row with information and links about your plugin. +* Commit the code to your fork. +* [Open a pull request](https://help.github.com/articles/creating-a-pull-request/) from your `gh-pages` branch to Leaflet's `gh-pages` branch. + +Once the pull request is done, a Leaflet maintainer will have a quick look at your +plugin and, if everything looks right, your plugin will appear in the list shortly thereafter. From bd0ffc4910c47277a27b78a8c0590116e5e740aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 22 Jan 2016 12:35:47 +0100 Subject: [PATCH 2012/2207] Add note about .gitignore/.npmignore to plugin guide --- PLUGIN-GUIDE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PLUGIN-GUIDE.md b/PLUGIN-GUIDE.md index 2a4c95d0576..9712350ad74 100644 --- a/PLUGIN-GUIDE.md +++ b/PLUGIN-GUIDE.md @@ -169,6 +169,11 @@ trigger a build/minification just before publishing your package with a } ``` +You can then use the [`.gitignore`](https://help.github.com/articles/ignoring-files/) +file to make sure the minified files are not versioned, and an +[empty `.npmignore`](https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package) +to ensure that they are published to NPM. + ## Module Loaders Module loaders such as [RequireJS](http://requirejs.org/) and [Browserify](http://browserify.org/) implement module systems like AMD (Asynchronous Module Definition) and CommonJS to allow developers to modularize and load their code. From 86e1dd667163ffd6832f97c2c2e5f3005f7487ca Mon Sep 17 00:00:00 2001 From: Lyzi Diamond Date: Tue, 26 Jan 2016 22:13:32 -0800 Subject: [PATCH 2013/2207] update mapbox token --- _layouts/v2.html | 2 +- examples/choropleth-example.html | 2 +- examples/geojson-example.html | 2 +- examples/layers-control-example.html | 2 +- examples/mobile-example.html | 2 +- examples/quick-start-example.html | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_layouts/v2.html b/_layouts/v2.html index ed303745d53..7addfb92c75 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -40,7 +40,7 @@ {% if page.css %}{% endif %} diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 034e629303d..3f1d39644dd 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -74,3 +74,6 @@ happen.drag = function (fromX, fromY, toX, toY, then, duration) { if (then) { then(); } }, duration || 100); }; + +// We'll want to skip a couple of things when in PhantomJS :-/ +it.skipInPhantom = L.Browser.any3d ? it : it.skip; diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index e536f808c7f..e34c3d7e471 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -416,9 +416,6 @@ describe('GridLayer', function () { describe("number of 256px tiles loaded in synchronous animated grid @800x600px", function () { - // We'll want to skip a couple of things when in PhantomJS :-/ - it.skipInPhantom = L.Browser.any3d ? it : it.skip; - var clock, grid, counts; beforeEach(function () { @@ -464,6 +461,24 @@ describe('GridLayer', function () { console.log(ev.type + ': ', ev.coords, grid._loading, counts, ' pending: ', pending); } + + // animationFrame helper, just runs requestAnimFrame() a given number of times + function runFrames(n) { + return _runFrames(n)(); + } + + function _runFrames(n) { + if (n) { + return function () { + clock.tick(40); // 40msec/frame ~= 25fps + map.fire('_frame'); + L.Util.requestAnimFrame(_runFrames(n - 1)); + }; + } else { + return L.Util.falseFn; + } + } + // NOTE: This test has different behaviour in PhantomJS and graphical // browsers due to CSS animations! it.skipInPhantom("Loads 32, unloads 16 tiles zooming in 10-11", function (done) { @@ -616,6 +631,40 @@ describe('GridLayer', function () { clock.tick(250); }); + // NOTE: This test has different behaviour in PhantomJS and graphical + // browsers due to CSS animations! + it.skipInPhantom("Loads 290, unloads 275 tiles on MAD-TRD flyTo()", function (done) { + + this.timeout(10000); // This test takes longer than usual due to frames + + var mad = [40.40, -3.7], trd = [63.41, 10.41]; + + grid.on('load', function () { + expect(counts.tileloadstart).to.be(12); + expect(counts.tileload).to.be(12); + expect(counts.tileunload).to.be(0); + grid.off('load'); + + map.on('zoomend', function () { + expect(counts.tileloadstart).to.be(290); + expect(counts.tileunload).to.be(275); + expect(counts.tileload).to.be(290); + expect(grid._container.querySelectorAll('div').length).to.be(16); // 15 + container + done(); + }); + + map.flyTo(trd, 12, {animate: true}); + +// map.on('_frame', function () { +// console.log('frame', counts); +// }); + + runFrames(500); + }); + + map.addLayer(grid).setView(mad, 12); + clock.tick(250); + }); }); diff --git a/spec/suites/layer/tile/TileLayerSpec.js b/spec/suites/layer/tile/TileLayerSpec.js index e69de29bb2d..535b2094944 100644 --- a/spec/suites/layer/tile/TileLayerSpec.js +++ b/spec/suites/layer/tile/TileLayerSpec.js @@ -0,0 +1,292 @@ + + +describe('TileLayer', function () { + + var div, map; + + // Placekitten via http://placekitten.com/attribution.html + // Image licensed under CC-by-sa by http://flickr.com/photos/lachlanrogers/ + + var placeKitten = "data:image/jpeg;base64," + + "/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBF" + + "RyB2NjIpLCBxdWFsaXR5ID0gNjUK/9sAQwALCAgKCAcLCgkKDQwLDREcEhEPDxEiGRoUHCkkKyooJCcn" + + "LTJANy0wPTAnJzhMOT1DRUhJSCs2T1VORlRAR0hF/9sAQwEMDQ0RDxEhEhIhRS4nLkVFRUVFRUVFRUVF" + + "RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF/8AAEQgBAAEAAwEiAAIRAQMRAf/E" + + "AB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUS" + + "ITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV" + + "VldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TF" + + "xsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgME" + + "BQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1Lw" + + "FWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKD" + + "hIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp" + + "6vLz9PX29/j5+v/aAAwDAQACEQMRAD8Azy+KN+aqtNzUkTZrjubkjkiozJxUzrlc1mzy7DimIWdg2azZ" + + "sBvrU7T56mq0jZNUkFyeBAw680+VABUUMgFOkfmgREo2tkVdhbcKrLg9atwACkwQkiEjFVnjKng8VoED" + + "FRFVPWkmMroxxg0mwdatCEEcU5IcnBouBU3Ljmqssm1uDWjcW3B2ms6S3YN81UmhMaXWRfeqM42NkVoN" + + "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" + + "qQzPJJgDeASMHuOx+lAH/9k="; + + beforeEach(function () { + div = document.createElement('div'); + div.style.width = '800px'; + div.style.height = '600px'; + div.style.visibility = 'hidden'; + + document.body.appendChild(div); + + map = L.map(div); + }); + + afterEach(function () { + document.body.removeChild(div); + }); + + function kittenLayerFactory(options) { + return L.tileLayer(placeKitten, options || {}); + } + + describe("number of kittens loaded", function () { + + var clock, kittenLayer, counts; + + // animationFrame helper, just runs requestAnimFrame() a given number of times + function runFrames(n) { + return _runFrames(n)(); + } + + function _runFrames(n) { + if (n) { + return function () { + clock.tick(40); // 40msec/frame ~= 25fps + map.fire('_frame'); + L.Util.requestAnimFrame(_runFrames(n - 1)); + }; + } else { + return L.Util.falseFn; + } + } + + beforeEach(function () { + clock = sinon.useFakeTimers(); + + kittenLayer = kittenLayerFactory(); + + counts = { + tileload: 0, + tileerror: 0, + tileloadstart: 0, + tileunload: 0 + }; + + kittenLayer.on('tileload tileunload tileerror tileloadstart', function (ev) { +// console.log(ev.type); + counts[ev.type]++; + }); +// grid.on('tileunload', function (ev) { +// console.log(ev.type, ev.coords, counts); +// }); + + map.options.fadeAnimation = false; + map.options.zoomAnimation = false; + }); + + afterEach(function () { + clock.restore(); + kittenLayer.off(); + kittenLayer = undefined; + counts = undefined; + }); + + it("Loads 8 kittens zoom 1", function (done) { + + kittenLayer.on('load', function () { + expect(counts.tileloadstart).to.be(8); + expect(counts.tileload).to.be(8); + expect(counts.tileunload).to.be(0); + expect(kittenLayer._container.querySelectorAll('img').length).to.be(8); + done(); + }); + + map.addLayer(kittenLayer).setView([0, 0], 1); + clock.tick(250); + }); + + + // NOTE: This test has different behaviour in PhantomJS and graphical + // browsers due to CSS animations! + it.skipInPhantom("Loads 290, unloads 275 kittens on MAD-TRD flyTo()", function (done) { + + this.timeout(10000); // This test takes longer than usual due to frames + + var mad = [40.40, -3.7], trd = [63.41, 10.41]; + + kittenLayer.on('load', function () { + expect(counts.tileloadstart).to.be(12); + expect(counts.tileload).to.be(12); + expect(counts.tileunload).to.be(0); + kittenLayer.off('load'); + + map.on('zoomend', function () { + expect(counts.tileloadstart).to.be(290); + expect(counts.tileunload).to.be(275); + + // image tiles take time, so then might not be fully loaded yet. + expect(counts.tileload).to.be.lessThan(counts.tileloadstart + 1); + expect(counts.tileload).to.be.greaterThan(counts.tileunload); + expect(kittenLayer._container.querySelectorAll('img').length).to.be(15); + done(); + }); + + map.flyTo(trd, 12, {animate: true}); + + // map.on('_frame', function () { + // console.log('frame', counts); + // }); + + runFrames(500); + }); + + map.addLayer(kittenLayer).setView(mad, 12); + clock.tick(250); + }); + + }); + + +}); + From e7fd00254ea9daad0e2771c3b3f017c11c4d5032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 5 Feb 2016 16:45:08 +0100 Subject: [PATCH 2027/2207] Updated tile-events debugging page --- debug/tests/tile-events.html | 37 ++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/debug/tests/tile-events.html b/debug/tests/tile-events.html index 1b25731ab62..f0524f5a4b6 100644 --- a/debug/tests/tile-events.html +++ b/debug/tests/tile-events.html @@ -35,6 +35,7 @@ + - +
            Start Load Error @@ -42,12 +43,21 @@ Visible Grid load
            - - - - - + Grid + + + + + + +
            Positron + + + + + +

            start = unload + visible on screen

            @@ -79,11 +89,14 @@ var map = L.map('map', mapopts); + var positron = L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors, © CartoDB' + }).addTo(map); + var grid = L.gridLayer({ attribution: 'Grid Layer', // tileSize: L.point(150, 80) - tileSize: L.point(256, 256), - bounds: L.latLngBounds([-89, -90], [89, 90]) + tileSize: L.point(256, 256) }); grid.createTile = function (coords/*, done*/) { @@ -109,8 +122,12 @@ }; grid.on('tileload tileunload tileerror tileloadstart load', function(ev){ - document.getElementById(ev.type).innerHTML = ++counts[ev.type]; - document.getElementById('visible').innerHTML = document.querySelectorAll('.leaflet-tile').length + document.getElementById('grid-' + ev.type).innerHTML = ++counts[ev.type]; + document.getElementById('grid-visible').innerHTML = grid._container.querySelectorAll('.leaflet-tile').length; }); + + positron.on('tileload tileunload tileerror tileloadstart load', function(ev){ + document.getElementById('positron-' + ev.type).innerHTML = ++counts[ev.type]; + document.getElementById('positron-visible').innerHTML = positron._container.querySelectorAll('.leaflet-tile').length; }); map.addLayer(grid); From 39d7388a2fd9615f6bc22569b0448b1e953e938b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 5 Feb 2016 17:07:03 +0100 Subject: [PATCH 2028/2207] Revert back to "prune tiles every tileready" behaviour --- debug/map/zoompan.html | 5 +++++ debug/tests/tile-events.html | 33 +++++++++++++++++++++++++++++---- src/layer/tile/GridLayer.js | 2 +- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 2da8d80684f..5ad290b0f02 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -41,6 +41,7 @@ on move on moveend on zoomend + on grid load
          • diff --git a/debug/tests/tile-events.html b/debug/tests/tile-events.html index f0524f5a4b6..3066c13fe4d 100644 --- a/debug/tests/tile-events.html +++ b/debug/tests/tile-events.html @@ -76,7 +76,7 @@ var mapopts = { center: [35, -122], zoom : 5.7, - fadeAnimation: false + fadeAnimation: true }; var kyiv = [50.5, 30.5], @@ -91,7 +91,7 @@ var positron = L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors, © CartoDB' - }).addTo(map); + }) var grid = L.gridLayer({ attribution: 'Grid Layer', @@ -127,10 +127,35 @@ positron.on('tileload tileunload tileerror tileloadstart load', function(ev){ document.getElementById('positron-' + ev.type).innerHTML = ++counts[ev.type]; - document.getElementById('positron-visible').innerHTML = positron._container.querySelectorAll('.leaflet-tile').length; +// document.getElementById('positron-visible').innerHTML = positron._container.querySelectorAll('.leaflet-tile').length; }); - map.addLayer(grid); +// positron.createTile = function (coords, done) { +// var tile = document.createElement('img'); +// +// L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile)); +// L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile)); +// +// if (this.options.crossOrigin) { +// tile.crossOrigin = ''; +// } +// +// /* +// Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons +// http://www.w3.org/TR/WCAG20-TECHS/H67 +// */ +// tile.alt = ''; +// +// var url = this.getTileUrl(coords); +// setTimeout(function() { +// tile.src = url; +// }, 50 + Math.random() * 3950); +// +// return tile; +// }, + + map.addLayer(positron); +// map.addLayer(grid); document.getElementById('dc').onclick = function () { map.flyTo(dc, 10); }; diff --git a/src/layer/tile/GridLayer.js b/src/layer/tile/GridLayer.js index d2e83a7180a..6f83232c34d 100644 --- a/src/layer/tile/GridLayer.js +++ b/src/layer/tile/GridLayer.js @@ -654,7 +654,7 @@ L.GridLayer = L.Layer.extend({ this._fadeFrame = L.Util.requestAnimFrame(this._updateOpacity, this); } else { tile.active = true; -// this._pruneTiles(); + this._pruneTiles(); } L.DomUtil.addClass(tile.el, 'leaflet-tile-loaded'); From 51149b79e7c5feef8b029051ef92295cfa153d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 8 Feb 2016 12:46:34 +0100 Subject: [PATCH 2029/2207] Fix counters on tile-events debug page --- debug/tests/tile-events.html | 62 +++++++++++++----------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/debug/tests/tile-events.html b/debug/tests/tile-events.html index 3066c13fe4d..af9814de80b 100644 --- a/debug/tests/tile-events.html +++ b/debug/tests/tile-events.html @@ -17,6 +17,12 @@ width: auto; } + .redTile { + border: red 1px solid; + line-height: 256px; + text-align: center; + } + table { border-collapse: collapse; } @@ -29,7 +35,7 @@ -

            Keep track of how many tileload/tileunload events are being fired. The counts should always match. See #4093

            +

            Keep track of how many tileload/tileunload events are being fired. The counts should always match. See #4093, #4193

            @@ -100,20 +106,21 @@ }); grid.createTile = function (coords/*, done*/) { - var tile = document.createElement('div'); + var tile = L.DomUtil.create('div', 'redTile'); tile.innerHTML = [coords.x, coords.y, coords.z].join(', '); - tile.style.border = '2px solid red'; -// tile.style.background = 'white'; - - // test async -// setTimeout(function () { -// done(null, tile); -// }, Math.random() * 100); return tile; }; - var counts = { + var gridCounts = { + tileload: 0, + tileerror: 0, + tileloadstart: 0, + tileunload: 0, + load: 0 + }; + + var positronCounts = { tileload: 0, tileerror: 0, tileloadstart: 0, @@ -122,40 +129,17 @@ }; grid.on('tileload tileunload tileerror tileloadstart load', function(ev){ - document.getElementById('grid-' + ev.type).innerHTML = ++counts[ev.type]; - document.getElementById('grid-visible').innerHTML = grid._container.querySelectorAll('.leaflet-tile').length; }); + document.getElementById('grid-' + ev.type).innerHTML = ++gridCounts[ev.type]; + document.getElementById('grid-visible').innerHTML = grid._container.querySelectorAll('.leaflet-tile').length; + }); positron.on('tileload tileunload tileerror tileloadstart load', function(ev){ - document.getElementById('positron-' + ev.type).innerHTML = ++counts[ev.type]; -// document.getElementById('positron-visible').innerHTML = positron._container.querySelectorAll('.leaflet-tile').length; + document.getElementById('positron-' + ev.type).innerHTML = ++positronCounts[ev.type]; + document.getElementById('positron-visible').innerHTML = positron._container.querySelectorAll('.leaflet-tile').length; }); -// positron.createTile = function (coords, done) { -// var tile = document.createElement('img'); -// -// L.DomEvent.on(tile, 'load', L.bind(this._tileOnLoad, this, done, tile)); -// L.DomEvent.on(tile, 'error', L.bind(this._tileOnError, this, done, tile)); -// -// if (this.options.crossOrigin) { -// tile.crossOrigin = ''; -// } -// -// /* -// Alt tag is set to empty string to keep screen readers from reading URL and for compliance reasons -// http://www.w3.org/TR/WCAG20-TECHS/H67 -// */ -// tile.alt = ''; -// -// var url = this.getTileUrl(coords); -// setTimeout(function() { -// tile.src = url; -// }, 50 + Math.random() * 3950); -// -// return tile; -// }, - map.addLayer(positron); -// map.addLayer(grid); + map.addLayer(grid); document.getElementById('dc').onclick = function () { map.flyTo(dc, 10); }; From 3fc511d219c6a7c8ac03759804a3381d4fe1f28d Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Mon, 8 Feb 2016 17:04:30 +0100 Subject: [PATCH 2030/2207] added zoomSnap for examples --- debug/map/zoompan.html | 4 +++- debug/tests/tile-bounds.html | 5 +++-- debug/tests/tile-events.html | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/debug/map/zoompan.html b/debug/map/zoompan.html index 5ad290b0f02..be9a22f17b7 100644 --- a/debug/map/zoompan.html +++ b/debug/map/zoompan.html @@ -54,7 +54,9 @@ madBounds = [[40.70, -4.19], [40.12, -3.31]], mad = [40.40, -3.7]; - var map = L.map('map').setView(dc, 10); + var map = L.map('map', { + zoomSnap: 0.25 + }).setView(dc, 10); var positron = L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors, © CartoDB' diff --git a/debug/tests/tile-bounds.html b/debug/tests/tile-bounds.html index acf9558fe75..ce0ff778b2d 100644 --- a/debug/tests/tile-bounds.html +++ b/debug/tests/tile-bounds.html @@ -30,8 +30,9 @@ + + + +
            +
            +
            + +
            +
            +
            (flyTo)
            +
            (setView, 5 sec)
            +
            (flyTo 20 sec)
            +
            (fract. zoom)
            +
            (setView, fract. zoom)
            +
            (fitBounds)
            +
            (image overlay)
            +
            +
            + + + + + + + + +
            on movestart
            on zoomstart
            on move
            on moveend
            on zoomend
            on grid load
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            eventGridPositron
            tileloadstart
            tileload
            tileerror
            tileunload
            visible
            load
            +
            + + + + From a5506e9f8ec4b1e6c009111ccf3794a2a860ec83 Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Mon, 8 Feb 2016 23:22:59 +0100 Subject: [PATCH 2033/2207] added resetCounter, indenting for tile-debug --- debug/map/tile-debug.html | 180 +++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 88 deletions(-) diff --git a/debug/map/tile-debug.html b/debug/map/tile-debug.html index 4ee21a3714d..d90de94f6f1 100644 --- a/debug/map/tile-debug.html +++ b/debug/map/tile-debug.html @@ -1,14 +1,14 @@ - Leaflet tile debug + Leaflet tile debug - + - + - - + - - + +
            @@ -70,16 +71,16 @@
            -
            -
            (flyTo)
            -
            (setView, 5 sec)
            -
            (flyTo 20 sec)
            -
            (fract. zoom)
            -
            (setView, fract. zoom)
            -
            (fitBounds)
            -
            (image overlay)
            -
            -
            +
            +
            (flyTo)
            +
            (setView)
            +
            (flyTo)
            +
            (fract. zoom)
            +
            (setView, fract. zoom)
            +
            (fitBounds)
            +
            (image overlay)
            +
            +
            @@ -122,57 +123,46 @@ - +
            on movestart
            loadgrid load
            +
            - + var marker1 = L.marker(kyiv).addTo(map), + marker2 = L.marker(lnd).addTo(map); + marker3 = L.marker(dc).addTo(map), + marker4 = L.marker(sf).addTo(map), + marker5 = L.marker(trd).addTo(map), + marker6 = L.marker(mad).addTo(map); + + var nullIslandKitten = L.imageOverlay('http://placekitten.com/300/400?image=6', [[-0.2,-0.15], [0.2, 0.15]]).addTo(map); + + document.getElementById('dc').onclick = function () { map.flyTo(dc, 10); }; + document.getElementById('sf').onclick = function () { map.setView(sf, 10, {duration: 40, animate: true}); }; + document.getElementById('trd').onclick = function () { map.flyTo(trd, 10, {duration: 40}); }; + document.getElementById('lnd').onclick = function () { map.flyTo(lnd, 9.25, {duration: 40}); }; + document.getElementById('kyiv').onclick = function () { map.setView(kyiv, 9.25, {duration: 40}); }; + document.getElementById('mad').onclick = function () { map.fitBounds(madBounds); }; + document.getElementById('nul').onclick = function () { map.flyTo([0, 0], 10, {duration: 40}); }; + document.getElementById('stop').onclick = function () { map.stop(); }; + + document.getElementById('reset').onclick = function () { + resetCounter(); + } + + function attachMoveEvent(name) { + map.on(name, function(){ + document.getElementById(name).innerHTML = map.getCenter() + ' z' + map.getZoom(); + }); + } + + attachMoveEvent('movestart'); + attachMoveEvent('zoomstart'); + attachMoveEvent('move'); + attachMoveEvent('moveend'); + attachMoveEvent('zoomend'); + + positron.on('load', function(){ + document.getElementById('load').innerHTML = map.getCenter() + ' z' + map.getZoom(); + }); + + function resetCounter() { + var fields = ['tileload', 'tileerror', 'tileloadstart', 'tileunload', 'load', 'visible']; + + for (var i = 0; i < fields.length; i++) { + gridCounts[fields[i]] = 0; + positronCounts[fields[i]] = 0; + document.getElementById('positron-' + fields[i]).innerHTML = 0; + document.getElementById('grid-' + fields[i]).innerHTML = 0; + } + }; + From 68d52deadac53bc5d495099e2b85cb8325a2d9ac Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Tue, 9 Feb 2016 00:00:04 +0100 Subject: [PATCH 2034/2207] styling fixes --- debug/map/tile-debug.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/debug/map/tile-debug.html b/debug/map/tile-debug.html index d90de94f6f1..99488c63eca 100644 --- a/debug/map/tile-debug.html +++ b/debug/map/tile-debug.html @@ -54,6 +54,9 @@ top: 10px; bottom: 0; } + #zoomtable td { + height: 40px; + } .diag { margin-bottom: 20px; } @@ -82,8 +85,8 @@
            - - +
            on movestart
            + From 8dee2d35914096b4f8879c308ecf50f47e6c3800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 9 Feb 2016 09:56:33 +0100 Subject: [PATCH 2035/2207] Fix for #4208 with extra unit tests --- spec/suites/map/MapSpec.js | 48 ++++++++++++++++++++++++++++++++++++++ src/map/Map.js | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/spec/suites/map/MapSpec.js b/spec/suites/map/MapSpec.js index 57e26de8f00..593feff23ba 100644 --- a/spec/suites/map/MapSpec.js +++ b/spec/suites/map/MapSpec.js @@ -763,6 +763,43 @@ describe("Map", function () { }); + + describe('#fitBounds after layers set', function () { + var center = L.latLng(22, 33), + bounds = L.latLngBounds(L.latLng(1, 102), L.latLng(11, 122)), + boundsCenter = bounds.getCenter(); + + beforeEach(function () { + // fitBounds needs a map container with non-null area + var container = map.getContainer(); + container.style.width = container.style.height = "100px"; + document.body.appendChild(container); + }); + + afterEach(function () { + document.body.removeChild(map.getContainer()); + }); + + it('Snaps to a number after adding tile layer', function (done) { + L.Browser.any3d = true; + map.addLayer(L.tileLayer('file:///dev/null')); + expect(map.getZoom()).to.be(undefined); + map.fitBounds(bounds); + expect(map.getZoom()).to.be(2); + done(); + }); + + it('Snaps to a number after adding marker', function (done) { + L.Browser.any3d = true; + map.addLayer(L.marker(center)); + expect(map.getZoom()).to.be(undefined); + map.fitBounds(bounds); + expect(map.getZoom()).to.be(2); + done(); + }); + + }); + describe('#DOM events', function () { var c, map; @@ -927,4 +964,15 @@ describe("Map", function () { expect(Math.round(map.getZoomScale(scale, fromZoom) * 100) / 100).to.eql(toZoom); }); }); + + describe('#getZoom', function () { + it("returns undefined if map not initialized", function () { + expect(map.getZoom()).to.be(undefined); + }); + + it("returns undefined if map not initialized but layers added", function () { + map.addLayer(L.tileLayer('file:///dev/null')); + expect(map.getZoom()).to.be(undefined); + }); + }); }); diff --git a/src/map/Map.js b/src/map/Map.js index 5ea9df192c7..c87183cab99 100644 --- a/src/map/Map.js +++ b/src/map/Map.js @@ -333,7 +333,7 @@ L.Map = L.Evented.extend({ bounds = L.latLngBounds(bounds); padding = L.point(padding || [0, 0]); - var zoom = this.getZoom(), + var zoom = this.getZoom() || 0, min = this.getMinZoom(), max = this.getMaxZoom(), nw = bounds.getNorthWest(), From c40aba27bc534d610213d343f1230dfdddbade9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 9 Feb 2016 11:05:18 +0100 Subject: [PATCH 2036/2207] Branch L.Renderer.updateTransform when not L.Browser.any3d, fixes #4211 --- src/layer/vector/Renderer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/layer/vector/Renderer.js b/src/layer/vector/Renderer.js index 11495cbe2ea..ba400c80509 100644 --- a/src/layer/vector/Renderer.js +++ b/src/layer/vector/Renderer.js @@ -63,7 +63,11 @@ L.Renderer = L.Layer.extend({ topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset); - L.DomUtil.setTransform(this._container, topLeftOffset, scale); + if (L.Browser.any3d) { + L.DomUtil.setTransform(this._container, topLeftOffset, scale); + } else { + L.DomUtil.setPosition(this._container, topLeftOffset); + } }, _reset: function () { From 63970e9b6c4cf9c4c5d0e9ea1464ab71162a9c1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 9 Feb 2016 15:43:03 +0100 Subject: [PATCH 2037/2207] Better cleanup of L.Control.Layers, fixes #4213 (plus unit tests) --- spec/suites/control/Control.LayersSpec.js | 18 ++++++++++++++++++ src/control/Control.Layers.js | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/spec/suites/control/Control.LayersSpec.js b/spec/suites/control/Control.LayersSpec.js index 04d745cc515..8de0f015c83 100644 --- a/spec/suites/control/Control.LayersSpec.js +++ b/spec/suites/control/Control.LayersSpec.js @@ -70,4 +70,22 @@ describe("Control.Layers", function () { expect(spy.called).to.not.be.ok(); }); }); + + describe("is removed cleanly", function () { + beforeEach(function () { + map.setView([0, 0], 14); + }); + + it("and layers in the control can still be removed", function () { + var baseLayer = L.tileLayer('').addTo(map); + var layersCtrl = L.control.layers({'Base': baseLayer}).addTo(map); + map.removeControl(layersCtrl); + + expect(function () { + map.removeLayer(baseLayer); + }).to.not.throwException(); + + }); + }); + }); diff --git a/src/control/Control.Layers.js b/src/control/Control.Layers.js index df32c711151..90ff518a6d1 100644 --- a/src/control/Control.Layers.js +++ b/src/control/Control.Layers.js @@ -38,6 +38,10 @@ L.Control.Layers = L.Control.extend({ onRemove: function () { this._map.off('zoomend', this._checkDisabledLayers, this); + + for (var id in this._layers) { + this._layers[id].layer.off('add remove', this._onLayerChange, this); + } }, addBaseLayer: function (layer, name) { From f8303c39d16baab3a5d37f0c1e48e8938d7f152f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Feb 2016 10:31:03 +0100 Subject: [PATCH 2038/2207] Added Leaflet for R (as a dataviz plugin) --- plugins.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/plugins.md b/plugins.md index 92271491adf..aa7f973c281 100644 --- a/plugins.md +++ b/plugins.md @@ -969,7 +969,7 @@ These plugins provide new markers or news ways of converting abstract data into @@ -1304,6 +1304,15 @@ Powerful multi-purpose libraries for data visualization. Atle Frenvik Sveen + + +
            on movestart
            on zoomstart
            on move
            on moveend
            leaflet-icon-pulse - Renders pulsing icon using CSS3. It can be used for location marker. + Renders pulsing icon using CSS3. It can be used for location marker. mapshakers/ Filip Zavadil @@ -979,7 +979,7 @@ These plugins provide new markers or news ways of converting abstract data into leaflet-mapkey-icon - Set of cartographic font icons based on mapkeyicons. + Set of cartographic font icons based on mapkeyicons. mapshakers/ Filip Zavadil @@ -998,7 +998,7 @@ These plugins provide new markers or news ways of converting abstract data into Leaflet.curve - A Leaflet plugin for drawing Bézier curves and other complex shapes. Demo. + A Leaflet plugin for drawing Bézier curves and other complex shapes. Demo. elfalem
            + Leaflet for R + + Allows using Leaflet from within R programs, a programming language popular for statistical analysis and data mining. + + RStudio team +
            From e8e6dae652107510146e5fc5e61ebb9342cba8ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Wed, 10 Feb 2016 11:14:59 +0100 Subject: [PATCH 2039/2207] Do not kill SlimerJS when running unit tests on win32 --- build/build.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/build.js b/build/build.js index 8c6cf8104e4..4cd0bcc429d 100644 --- a/build/build.js +++ b/build/build.js @@ -172,7 +172,6 @@ exports.test = function(complete, fail) { var child = require('child_process').execFileSync( require('slimerjs').path ); - var child = require('child_process').exec('killall'); console.log('Running tests with both PhantomJS and SlimerJS'); testConfig.browsers.push('SlimerJS'); autoSlimer = true; @@ -213,7 +212,7 @@ exports.test = function(complete, fail) { var server = new karma.Server(testConfig, function(exitCode) { // Work around https://github.com/karma-runner/karma-slimerjs-launcher/issues/1 - if (autoSlimer) { // Only if we were able to run slimerjs and killall + if (autoSlimer && require('os').platform() !== 'win32' ) { // Kill process only in linux/osx, as win32 seems to work fine var slimerjsPids = require('child_process').execSync('ps -Af | grep slimerjs | grep xulrunner | awk \'{print $2}\'').toString(); slimerjsPids = slimerjsPids.trim().split('\n'); for (var i=0; i Date: Wed, 10 Feb 2016 20:38:26 +0100 Subject: [PATCH 2040/2207] Added leaflet-tracksymbol to plugin page. --- plugins.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins.md b/plugins.md index aa7f973c281..21837aa33fe 100644 --- a/plugins.md +++ b/plugins.md @@ -1021,6 +1021,15 @@ These plugins provide new markers or news ways of converting abstract data into Tim Wisniewski + + + leaflet-tracksymbol + + This marker provides a tracksymbol with orientation, velocity-vector and configurable shape. + + Tim Leerhoff + + From 3517a6272909f0932a99395e649b78a29facb949 Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Fri, 12 Feb 2016 00:48:49 +0100 Subject: [PATCH 2041/2207] fix fractional scroll zoom calculation --- src/map/handler/Map.ScrollWheelZoom.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/map/handler/Map.ScrollWheelZoom.js b/src/map/handler/Map.ScrollWheelZoom.js index 55a3afbcedc..b216bc12eb8 100644 --- a/src/map/handler/Map.ScrollWheelZoom.js +++ b/src/map/handler/Map.ScrollWheelZoom.js @@ -41,14 +41,15 @@ L.Map.ScrollWheelZoom = L.Handler.extend({ _performZoom: function () { var map = this._map, - zoom = map.getZoom(); + zoom = map.getZoom(), + snap = this._map.options.zoomSnap || 0; map._stop(); // stop panning and fly animations if any // map the delta with a sigmoid function to -4..4 range leaning on -1..1 var d2 = this._delta / (this._map.options.wheelPxPerZoomLevel * 4), d3 = 4 * Math.log(2 / (1 + Math.exp(-Math.abs(d2)))) / Math.LN2, - d4 = Math.max(d3, this._map.options.zoomSnap || 0), + d4 = snap ? Math.ceil(d3 / snap) * snap : d3, delta = map._limitZoom(zoom + (this._delta > 0 ? d4 : -d4)) - zoom; this._delta = 0; From 3c87804f42f020000a05c516ec6a0742deab579b Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Fri, 12 Feb 2016 02:12:05 +0100 Subject: [PATCH 2042/2207] added gridLoadData --- debug/map/tile-debug.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/debug/map/tile-debug.html b/debug/map/tile-debug.html index 99488c63eca..53f81820e89 100644 --- a/debug/map/tile-debug.html +++ b/debug/map/tile-debug.html @@ -145,12 +145,14 @@ mad = [40.40, -3.7]; var map = L.map('map', { - zoomSnap: 0, + // zoomSnap: 0, + // zoomAnimation: false, fadeAnimation: false }).setView(dc, 10); var gridCounts = {}, - positronCounts = {}; + positronCounts = {}, + gridLoadData = {}; resetCounter(); @@ -165,7 +167,12 @@ grid.createTile = function (coords) { var tile = L.DomUtil.create('div', 'grid'); - tile.innerHTML = [coords.x, coords.y, coords.z].join(', '); + var indexStr = [coords.x, coords.y, coords.z].join(', '); + if (!(indexStr in gridLoadData)) { + gridLoadData[indexStr] = 0; + } + tile.innerHTML = ++gridLoadData[indexStr]; + tile.style.backgroundColor = 'rgba(255,0,0,' + gridLoadData[indexStr] / 10 + ')'; return tile; }; From 7dd71b83f4f7907b1b128c8e7e1d7c76b8be4993 Mon Sep 17 00:00:00 2001 From: Zsolt Ero Date: Fri, 12 Feb 2016 03:14:12 +0100 Subject: [PATCH 2043/2207] workaround flyTo bug --- debug/map/tile-debug.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/debug/map/tile-debug.html b/debug/map/tile-debug.html index 53f81820e89..eee12958862 100644 --- a/debug/map/tile-debug.html +++ b/debug/map/tile-debug.html @@ -148,7 +148,7 @@ // zoomSnap: 0, // zoomAnimation: false, fadeAnimation: false - }).setView(dc, 10); + }).setView(dc, 16); var gridCounts = {}, positronCounts = {}, @@ -172,7 +172,14 @@ gridLoadData[indexStr] = 0; } tile.innerHTML = ++gridLoadData[indexStr]; - tile.style.backgroundColor = 'rgba(255,0,0,' + gridLoadData[indexStr] / 10 + ')'; + + // double tile loading alert + // if (gridLoadData[indexStr] > 1) { + // alert(indexStr); + // } + + // more tile loadings -> more red grid tile + tile.style.backgroundColor = 'rgba(255,0,0,' + (gridLoadData[indexStr] - 1) / 5 + ')'; return tile; }; @@ -198,7 +205,7 @@ var nullIslandKitten = L.imageOverlay('http://placekitten.com/300/400?image=6', [[-0.2,-0.15], [0.2, 0.15]]).addTo(map); - document.getElementById('dc').onclick = function () { map.flyTo(dc, 10); }; + document.getElementById('dc').onclick = function () { map.flyTo(dc, 7, {duration: 40}); }; document.getElementById('sf').onclick = function () { map.setView(sf, 10, {duration: 40, animate: true}); }; document.getElementById('trd').onclick = function () { map.flyTo(trd, 10, {duration: 40}); }; document.getElementById('lnd').onclick = function () { map.flyTo(lnd, 9.25, {duration: 40}); }; From 6404447ce9525b2faf35918e8d59e9b87cceb029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 12 Feb 2016 09:28:01 +0100 Subject: [PATCH 2044/2207] Use {{layout.root}} instead of {{root}} because Jekyll 3. --- _layouts/post.html | 2 +- _layouts/v2.html | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/_layouts/post.html b/_layouts/post.html index 67efba622d4..264befe908b 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -1,6 +1,6 @@ --- +root: "../../../" layout: v2 -root: ../../../ post: true bodyclass: post-page --- diff --git a/_layouts/v2.html b/_layouts/v2.html index 7addfb92c75..76383f7ba2b 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -21,17 +21,17 @@ {% capture root %}{% if page.root %}{{ page.root }}{% else %}{{ post.root }}{% endif %}{% endcapture %} - + - - + + - - + + @@ -51,7 +51,7 @@ -

            Leaflet

            +

            Leaflet

            an open-source JavaScript library
            for mobile-friendly interactive maps

            @@ -111,9 +111,9 @@

            an open-source JavaScript library
            for mobile-friendly in

        - + From 5994d8cc28f6b71951040ece05821330a1fe7179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 12 Feb 2016 09:38:36 +0100 Subject: [PATCH 2045/2207] "capture root" magic because Jekyll 3. --- _layouts/tutorial.html | 4 ++-- _layouts/v2.html | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/_layouts/tutorial.html b/_layouts/tutorial.html index fecfeb48773..5e9bf15a691 100644 --- a/_layouts/tutorial.html +++ b/_layouts/tutorial.html @@ -1,9 +1,9 @@ --- +root: "../" layout: v2 -root: ../ tutorial: true ---

        ← Tutorials

        -{{ content }} +{{ content }} \ No newline at end of file diff --git a/_layouts/v2.html b/_layouts/v2.html index 76383f7ba2b..acba47eba63 100644 --- a/_layouts/v2.html +++ b/_layouts/v2.html @@ -19,19 +19,19 @@ - {% capture root %}{% if page.root %}{{ page.root }}{% else %}{{ post.root }}{% endif %}{% endcapture %} + {% capture root %}{% if page.root %}{{ page.root }}{% else %}{{ layout.root }}{% endif %}{% endcapture %} - + - - + + - - + + @@ -51,7 +51,7 @@ -

        Leaflet

        +

        Leaflet

        an open-source JavaScript library
        for mobile-friendly interactive maps

        @@ -111,9 +111,9 @@

        an open-source JavaScript library
        for mobile-friendly in - + From 609cee1821fd98c803d3a133403a7ddeb0e9a0a0 Mon Sep 17 00:00:00 2001 From: Prayag Verma Date: Sun, 14 Feb 2016 13:52:33 +0530 Subject: [PATCH 2046/2207] Fix a typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `presense` → `presence` --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index c1e1d1103aa..b5c60324b3b 100644 --- a/reference.html +++ b/reference.html @@ -1677,7 +1677,7 @@ closeButton Boolean true - Controls the presense of a close button in the popup. + Controls the presence of a close button in the popup. offset From d8c51ad7e238a4e5e4aa339731d02f8a93692c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 15 Feb 2016 10:19:13 +0100 Subject: [PATCH 2047/2207] Throw error on NaN circle radius, #4235 --- src/layer/vector/Circle.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index abdd8bcdd1d..386605d2bc5 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -6,6 +6,8 @@ L.Circle = L.Path.extend({ initialize: function (latlng, radius, options) { L.Path.prototype.initialize.call(this, options); + if (isNaN(radius)) { throw new Error('Circle radius cannot be NaN'); } + this._latlng = L.latLng(latlng); this._mRadius = radius; }, From 2730a3e3cf7190a3d55a34446ef24bd581c8d1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 15 Feb 2016 10:15:36 +0100 Subject: [PATCH 2048/2207] Throw error on NaN circle radius, #4235 --- src/layer/vector/Circle.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index 9c9c1d8fd89..8c6a368a938 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -8,6 +8,9 @@ L.Circle = L.CircleMarker.extend({ initialize: function (latlng, options) { L.setOptions(this, options); this._latlng = L.latLng(latlng); + + if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); } + this._mRadius = this.options.radius; }, From cf23143b00754a5b0e73fcc7bbcef0d7a9029474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Sun, 14 Feb 2016 16:09:15 +0100 Subject: [PATCH 2049/2207] Added an example on map panes, based on https://stackoverflow.com/questions/35377829/leaflet-js-tilelayer-visible-above-geojson-layer-geojson-interactivity-issue/35378935#35378935https://stackoverflow.com/questions/35377829/leaflet-js-tilelayer-visible-above-geojson-layer-geojson-interactivity-issue/35378935#35378935 --- docs/images/labels-pane.png | Bin 0 -> 153407 bytes examples.md | 12 +++ examples/eu-countries.js | 79 +++++++++++++++++++ examples/map-panes-example.html | 46 +++++++++++ examples/map-panes.md | 132 ++++++++++++++++++++++++++++++++ 5 files changed, 269 insertions(+) create mode 100644 docs/images/labels-pane.png create mode 100644 examples/eu-countries.js create mode 100644 examples/map-panes-example.html create mode 100644 examples/map-panes.md diff --git a/docs/images/labels-pane.png b/docs/images/labels-pane.png new file mode 100644 index 0000000000000000000000000000000000000000..504cfa785c389fc29454b20878fa70cfac754698 GIT binary patch literal 153407 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%0A>N&|>V}|hEbx!uvCF#b)LS%AX*&uHH7hj`r zbu?&=q#ZgStnasTGo}fW)(bsiB%^96$>{NhRHp9O z-!IGQAw2Xc`NVJ((F9PUBj-s02h=?X;zYk+RtO7 zZME7RW}ptUn6RipfJog+r_)g7oA1$yP5Z5e#a<&C+L7>bgYi&G7Jrj*KTEMneM$_| z%X6c8V?!gx4Hqf~^0RkUYG1f!yKSGK@!;W5i7gS+rKMJ{I1LA<#rX` zyKjOKn7f{>ViIvek1NHjgP~IFna6)^R>cFH%NCilBZMrY^d1a9x`^t=y3HlA-U zm^WO95Um#Q?^{Dd2dmdy&Z4THk06k@4Sc&dR}P|NxLGIdF#mU(XVq2iFO_pl#Q$CE z%lhMhoo^T>ocC&Oz69Cp_!)03ZO{QEmNgN(E{_UIa2#Yx?X$&(&#r&n^qAjslyqG= zpBF}r{x$4C(>b}!bUpv>v=ll>$FIPA_+1WEhgg9e?<9Y=#^O9q?py7)kzl+;_-f9@ zSFz=8zg)yo|tW>miEUcHK-f zKqi#|#P9X@F(%{n!ib|bV@SG$cR!{~?wwk!A*hrO?i5T2A|LB%rDxP>;oHeEu z8T<00wNe!`j?Jv&xz26-gbe6-Pt|oGqQ4W-Z3pF0;Nb0&@#|g9AKnRkyjycy=ku9v z2}XYicm^$l{3kc#sTU*;Y@Jmp=v5?-AR6r7*RrI|t&UAHi_fqwH zufSOn2)XPa*S$`Pm4zOH**0Q_`1Vy=JxG(B*&{$QZ%vGgzJb<-ADtbYR_SN#T_Hda5< zczs3=ImuS9Tde?tm%;xoQPo*nLw-J$a)Mnx7?G#AQCQ&Tl1FaOkP)x2ynDw732Ys|*H{Q5r)^I|Nm!|W21rgCtm)y<|_wZr6GtR)mzN;F|$}s*? z*k3lhy~bVC^(@oz(WM?INcFEw3jZPu+x2e=C14yl(+rp9a?VcUnzPEt)q|a9EuzNn zoMrglr$wS?*kW4#5LeQOl?%Cc&)y5LL2tf8oq7*rC&h5vpI*GKiD$z1L!+$lkm;zxq0t;Z+1ztTuycdD6sa?L3G|9M=gw_>TN@Qd}Y3q-mdalda!LBQ6?R zjLpdja9&uwnw^^J)bp^0 zYO{uJn2XH>$}Yd%eK+5`PQfP(6*ZM>?=xdoO&sx=g4QL%GoKdQwL!Tg+E_B-Dj2{y z{d&C#Y;@Z|KmQ@ZFgU*!oOz6v(Ts-&2Tk5zm%cE~pq3E@waXD0E8!T|2KO1hEe=CO zyKR;=l({f76Y(Ga5xpw%qX1+djcqay@F=L*%X(0~$Dg#$2Z>x=9l8poQ+m;d9AF@t z+*>-i-Ax9?kUbE)sgbcvxpHFLrvw9@%iXr!JqR5~C^vyu18fI4NqF7E$kKPm8I7_V zM!2!es4sR+Q^@bp>nQ0tGqBbh%v(s#h_N`i?w-@n#nt#9HMdk>I5RZ^YEgvyP^5jf zT<3#7^YS?*j`7S?YxSmsOd(5vVl=1LcP8aPnHJW6K5octWkR<{5eIk{f{ZWdWnaem z9Nj`K!`7bkeRfVDOkHV)lk-{a?V`|G+X){;bidbSh%AA+p7KJC`CHG1@TG{YJeQ*6 zpUd%PKl7D|HTofosghd5WLT&KC}n6G4rNhkuJ2Oam9W#^<=w`c{R))Z`ukrIBo$X# z+sHA`=(@yNlpIkziS_^wO1awfK&KcqY`$?cvjjPm#0Q5p3C8Sg-R9WhuR9*kH@^mz!e3dlA@bK7g#9ux8F%J7Ojf%=C( zqwjak?3SCv7NQ-DM``3r>S7n?*LjUc3c>|`-LnoEHLnoH46qKG({8$Hsr*f>yg`z` z4e9iWufK-`R#3M3p@h7{Mar4`!1d5rfr@Q!u2=;`1n$;Mq$no-h zJ+0BBNifv4)zvjH(|B#9UD}rkIUT*Zs#iiVN5&@@ps$*HwpfnxT)1KTy0Wr_J1nTn zC^;bY?W+pjUqob>)@0m0UEQrJNt4qGi=2+_I>o>d&_RNRrrKZ(W4%;WxV2e}hMcl^ zkL|%9XrDM@XYfy?j*3QnQaVMXsHTOKu8*^TU48kC-7RpXeb{WS_EkiJ6RTeV4#!b~z z5h}Va6&B!kbuJw}aDOfp&TKgGK(XOsUBq3l^*XBs9g1J=%V%+HJ#@XzSnfDI49IAU zwh5(a7$_hKRF{->`&DpO{*R_>jH>MW`zO~-uE|Z-RFiGnwr$(?FWa`wsmZo&*JMBU z|KeHezPo4Lwa(uA?yo)obl{G}K|Z-7j6a;uz>g=_)(Dk z?{PG7ZhD@dL5HhDh%Tr*TV?>(S2U3$YU-eIO(n>TqsEeKvZ{;eE2|#Bs*t9xyR`Zv zk_=V1wX?cWX|`$G7SHN~(=RFh6e~2sOxZ+t%hc8qSvtep7LU=)c+t;P`!5wSP-<}E z8#g`2z;U_t+W3BiDN2`3X>Wn+qJ9v1aeoqxvrj!7Q;WBZ&4OA12UHV%bcuYYX~vw) zn7PyrsIAOhAX(NVKZ@pbjk>c6VGd3q6PBmrI@5a$37*y zm$Zsd1qMLYK$ROApVBhVXsRz>BosAyNt007m$v+^)qqTiJimY-lyW#QT#28+?7Oi7 zDxzFnUC4~F0nN4bX)XHUj>-(si=C`2qtH`zHQ@Kuxf2P_{A3Vx7&zWx4={v8Cp5iT zL>SZmk*;=iTy(j&iT6w_18P= zPX>t(hR}dq8YN)oGN{Use$cm(I0`*CA=Jje8Y5lHP(7f!gtF6+pu6cG={SnPLMhC1 zRvv%nWRLGUqJ~0s%9wAQnN?#Wt2G3GI6$^P#r&-d&D|yJ*0;GRlVWXTa^kxVL&@YI zHC4ZnMrHSs1#ASkxB9Wy{)xoF@y@-}ugQ=?xUgx-b2pGYUNm-gePY+yr9vUkT3Bv3 zOI2&=TXzh3NJng9=t#-$kKNXEm&MWRn-(gWM7b+;hnti7&&Lu=O*6G+3A06P>uc`W z9AB5_?Tip_d-Yru_q{640#PwNid^0;o`iSZZ(Su;{A`NcM0X&om&gLZR3mkK)@)Qi zWxEoW^rswr3b;%VGLZP6J!wjEdddo?`e~s>oAi9Jmb7A?qpFCk=(kIhfpdK>uApVT zr&a3OuB_v>AJp3x=O+{6<5pL5Hr&6cX>UC?cyp((pTPPqPUrPro+3eP<4R7K@ROM2 zYZ|SFwx%M|Ecz@~@6iUbFYgc9C~y=A-rTPvTsz+*q-p7&db3-zFFPb()0fU86`D!8 zd_HG?JA3^6YHhwgrW#Erz=fWZp2QO?MJ zwZ+TM6Z2nrn1DDbM)P_wzwA}()=2faAW&DO-RrqG)2lCO;Dhj1%cHH%Yfzv1wy&nv zgx&!iU%QC5uBrXi*iHB#7cqZ);HJZ|7~gZaj8;;i;CkW`KoTI%{CNg;-C^4f5?a+^ zlQqW?6$yOfqp^rw1>1>YYUcQW8G?y|sD56)rZ^_p)-6&t&NW2_6?qAiB}zB+>iZMF z>W`sf!9u0v@X15m1yxlRPn~l-2sS%)n>89bQdMwL)qKvX`2l1O=3i3CZD@3b0_HNE z7%H%adEC=W8*>x&Rm-{Y@-o)HE-&%P$VBi_2FT{tUPA-cwW;Ywj;Fvojc(83?~CJ z$Bn|P;MX6~rt;!yXGI5_PE_ooG0$LF=mDQ+!&tP?7C(6C9I)?V*zgQLh%M!s#}AbE zj}CYQXzs7R8|K?X8d;wV>2vim^?!#1HtAy*maDbtw@s6`*!$8S zr~7B`#)f)?uWSr*RtH;xJ%1L`bUI2{Sb0dghgXJ%Y;3xQ0zJz4G}Nr@rWfn3G&jNu zyGaZIyW$t4lIO7{x{r2i?rXiTdFE?;0U;Wz`x4GK+9n%Rt#`)iZ!q1#uc1&xq07f| z&XVxoWtM3%97vOfKMay-R7X+2i4ljcB2Gu(v9$~dYef0kzFbX*hj&%Qf5qw@seMQqQ5DZb+^XB{P{wEZjI^kCgQ(lI+mpMP5riW&_&EwX4;95 z+Y=}~9PCIY&|wu%4JF-Uw*PF&m*e!IZVtOIv(6Jv}%whRoecCC8mlN&;_jVZUH*)rCesll^i^&79jo&6e5&JZ1)C0)6`|V!Nw*fc zcYBqakDPcIpBm~&!)2{9K66rCc#agtk%CVvky-TwSw&v#D=M7_r>Fje;LKg|pE=$3 zcoHA;EJdH}34@;r09JRc`lnN6M!q78Ehq}|jaN_r+xI1fjFJR+Zky!}1$NToCiUn6 zZ}oMn5nFvoniBBu#4xC0^B2Yj0lGQ76Bw6}b^fUAL!Tg{DZ1qmq0(vwevuM|_?PmZ zrOk(Hv7#lTabWsV_RKFJ{4T@Sy`8w$i^xD3W@-!fh^>82mnfr#~oJ7Ht2x z+1Di+v`Oa$Lg_j3?TyEKUgf|;R6dJ9MNHp+cafZGnC={=-u>sH7};00YfJGkz%{<% za8#p={fcZ2mpItZ%_)k#-0zLvYO+??dT*sTuPH<9cN>B43_W&qSG&t9NUz=c3|V|O zS!(abtx+eUYV_!_L(&x)`2v)K`}Z7yoSD3v2C z28ZQJMPS%qeKi=nUD!S(a$#Jz1lwp$yXT!SKz<&MI16DB092g!ub*i|6Ap@&m|~e> zVq?eloF`PAQRq{@pXu5vKic6r+&RAZ>84DKHHY!J%1lSq2ld`#-`;RqvjQt#C-zoh zsWLhXZ*m67<&TVu4y=-Wu!=UM<06gOr1KJv+JB9Tj~MY6XV%5E&(C-~pAsWcbTZZ- zUJ?+w_;LyyxW~2SYizfHr2ZU?5}xP;TFwD_@Te+cAy|Z;>s-+&>QJHw{}m`HO@j;s zvL+Zu3=H~)L`fozK}OF|GtM~k;&vsQ3h+?K(by!$r!4j5zgo&!bx}DesxQyyxrVd- zeeO`uXW0RJsV3*D8VM!+G7v3iA#NBGyHUDforSRX#Q*s|y=!a7Bjwn}r%WhxNI~!2 z2DyE@tnISRQ1REQ?lizJ6wVaBwT{*0m*%r)#9Lqds9tV_422rRuPoF6T@lO7m{dWZ zKZDV4L)6uiv5!6C7{9tYlpr{{@VMupia17ZnesVHH2dQcS+?v00>DL5n^Gb842JR4O500Yg0|3GZ5FWKzi;SAbU8KCJcK&caL6f9lbSoXmpTX&`CZa#I0pr&v z8W3Q_J4nPRY27%SXxb4ezC2x0ps)^u8h4a#YhJnHM3>G--{Sg9JN;1NwIN~=n17BA z1l>whvr*Ij0JKq!8gQV&1zP9(9Sp_fuVF1gPZ*p4BUHC8*_O79(*_WLaI1_eOCCQZ z3S?6_#7-aG>5TK)!WPl?R!ibh=aAQlR^4oWvk+0!+%Ji3a)!s{a}KO-QX<-168 z{k+zjMoeAN!H2y3l9^c;>+x=E<^2gC+ErxaI^*Q@ppqDyDq2%eHt?-8lkhK=>Y5w; z42#dfU_s3171Wh6wP-d*T8cp$xjaSLQdktv?eSSX{yU7AC&n(B$ZN8bXgtLCu`=3V zEul8*NN#gC=qRs#{_D+PGRXI2GK94^=s0o!$&RO|IYNuz_y=e3M)!JoSyxW1o|^!usDhe^HkkQDaG5 z+M*s}J)c%Eq&&oeMHa-$-~Gux_y#?&!T!KXT1C}wevrbFpS<$3pEH06Tm}vBPe{t? zUg*IfpA>avZNQDKi^zr)w11(oS*4txK#b=UE+jon^AEG_3lnR%d1&j2Iu)uwRh^-r zouHtF7c95^PAkKd^5Z*^A9CI)C&PWT!YV559o|!jt$)F{$OZdnDOyLs34nIkdu&McT~mMy^Bu z#W&mn8Z=*Waa^!E^9NIFeT@0SnPe6I^m%X)W{ z|K=pBFSC(&-&b<4yiS%fYuMO$lf9mJ?)ED6y6+3Nf|T+w{XXAWDpOjUTKPWS{rtS& zYQMafvsZ1;wa(ezk4MeKc+rDU#t8v-MWwfe`RN~+n7_5{F~;-ynRn%*HoPbdmN-KT zx5`I#xYl`qx=-_e>>2!l7sTwc- z(g=MRLKgj_pN2W)n+bq&Pxwv3Bya$P=T49JO2L#>VOy#*#azBieor;?#mFFzCE!*y zJhUMFoiNqi@r5M=5gU-1GCsI3JU`7?*Cei`2?-#F=RYAjB~P}ogg@vGD1F>>T~O*PWyNDpzHauO7W=0;CTZ1S(hWny!#(h znr;H_GJp(~UsGQEYVO01iUO5iVC^Wqg!+!d4Uwocda&?3;Mi893u7@akSpi1;^8Af zWN-`j?M+?e)`?6fPI>5i7(yicH*|iAGBTQXFTGQ;M&yC|INpbi*4j2}$oGI8V``}H-{8&khHL%VpaQx&qwung=Dwd zVYJ*np8CJNsqOgpZ?)0%MbLBUMhHys=E@5f2RD=TstnTKkNaL+WikKaqUz=DSP~pF z<;^$OsDYJFYjZQ+T3-3Ec?o8ap;h)Vly0ZgdkmuU`xykta!}sVk)nNQq8lWgw5^2p z?ErEt0z1@TX|T!V6*Ay@o2K?uloCCGG^*qj1jb%525IYFj)==)?@A$W&VX3KF%9ri zl!qR_4Xg?oG*npp<9m!;QNC>sq0oV1fz=8e8aoXm-n~6VAf%NS8y<1@zV-|IU}83g z=PvU@zXbq@`M7WD7IsM8j}MovoI~P#w9Urp1v$qTdq@mjz#mrO4H}|tm+$3NAE0`S zjj8suC{f>J%@Lo~ULO}~zH51nI@5Zw|2t+Hhy0(~KqIW78lk=-q(z5rR_ft*$n%Vh zaj8hsC^Ec=D=z21gu#l$--w6m8~*H-IPSqEH*Cr4NTv1_27LY%j@%BAA#T7cR_JG zI6IY67yPj#>+uDu;w|UHYV>{j^;?X zK^pP6_n+KWQ&KFA)E~k}#niO;k(-t#*e$*PwgXsAooM$P`Y_GPATrn@AQrl1S(<)% zoDRpwQlPlQLl0m?!2)R}@P_sfKQ2Uw6*@OFHv(l~Sgef6Q47&@6{zpoq!03Clx&54>K`=>%fVhB78$Hwa2-+HVB zQckkXHtP~kLq(GpTgOF3$UJ0!{D+GaP3?0d>0xFt4KWpbYZaKcgP)ZlWV61_dPuey zSFin4-J2Fyh;!}2`&o0lxuc-1Y=AfVmq^Bu9gOp$k)Hjz6KcanHj4@y_6rHGfWNR_ z-BZ%i4~MDrBY2GuZC+6b^a1qsN5>9{fnZ8OLPuoPzEgXEpA=8R&7-B&gK!v!W=v5t>83N=SnRry}mjQNTUHZ>tXA(&0wA9M!`w>fK(W=-|5+e-ZPJ4oY*(DQYXbx6_j_C!1A6TIVe)gB3PMha&K*fL*W_B{xe@5~(VgCc!EbeAh z*0fC+q8v|U-2T0z`+6R_mYJ*v`YP>uAb|O?anv4?VF$jBPp<9W!_ z6J4IdiU19AE+!r<_*Q3U^dn=VXw7x5Y(%q2vV{F`R!Fk!JT}Dk9>!)TYrAm69lwjQ zmm;2?k~{TYW5@lhivw4?x|(thI%=lTSCx)nIIq<2Kl|p`5!KY03ZP6r(HPti#yhC`4llV#FQOG zdxz)?Xi3!L{VPFC5dqYdC~GNIfbmNq+p+gw+5ExZ&8gu3E@rDyZptw#r`zmK0t@J_ z3|v}?2(!_<5<%l;AfjXO{){P2LY>riZ>c#y*f7$l0P6$uH;ks#_d3epmq0Jp9e)yE zz?FsauJf?c@qqx?FCMRb&aIYx-^TR5cH>&V_KrhD5;-~7;+F6~K3%q#|5IV`SCoXE zg*y}(kF$Ng!td=aT_)5*T*kY+e+6MVd*7<5zkT}`$gtm0+2b&Lebs)OvMxy>XK7`{ zr|orL%C&8 z5h~M=gz@79S^$a6L1*ePSY8L%>!<*kq|hecNGuXnV?ySK8ER)EDrkS@7G zfp`FNN`j3h8_l@llO|cqn`RB#7k*ejTSdp!X0NXO(e%#&+}zIkJ@;E9EEFKD0QmF5 zjkn0=4j3@uE`ss1g>zYy@uaIXfWjdh*#a!INs1B7xPOCtnwJ2U1C3Nb2AaIGF{?ao zr~sS^M~mOHvu8=X`Kzx%uZ!v~6+SW7XH4 zfH%!_q&P;_pP)ui#v$ppPTBhrJ__Ir{-(LA+fw-D9*^`+T0sqauO@e9)hdkZ^ zde%61NnfL-sm=Z)bTYf=H$VvK5a_!yC**AAYj;M! z>F*C+Ox!m`XW6`+Pie__Sd5F&jQ{4an!-KjJGp`)+%Q{{37a9Zbe1- zZpAB$$bEomUz~2sUuH;PJ8i3pex0wME&sQ^M=7g?S=4x5q3lQ$%>ik=NBirZpw7}R zMXk7`8|>q`Q*%hWYlnslWCd-r&&O*ZNEo z8|LPK|Ja5?lraEaTae35;P;Y0S=y90Gi6m?5VIh1J#?W36xFFjf`GY7;g`M8`M>tV zpP(^(i76X6J>{Y^j#302Duu@%*aVxZ$^LM>Ie46S2{G|ygp8wuEL0&%o4a$ORr_^y zr?RR4uHsH4RG0Sku_4j>a2Yv;)@E?L84xymBluQiYF+j>It(-hsX}-zAKfeyD}9D< z)Hy{gO&YeAQpLF4 z-78v4HKz%E*&-lQw;@euJ!JGi*fl#AGpF(Z$pxNZwhW z`mcuQa|~*Gau`85t_u$Py6QqFBd4qHDi#qz*shxdOI-qIdtgM!>dHykr$|t(1ZBfm zOz`8NfumysUDaFvfHemkzB*!E9EN^w{;SnD!~p;3&n^M;6I&SFv{`Nw@wekB2RgOV ztLrAHB%_}T5>y9SqigrlK{(LPr6rmlO%)0j-)?o2TVdT50(gUSghGQh+LS-%q2m?v z03_cm@9*mw$rE*5{vNEwotC5p(M}(&tHc%+_y_^P`(&_P0^!pHb(%B-mftKpP$K?9 zD`)l57>TO#@#t<0IKk^ERgh&3kcF&uSRw+k&WuFZs}#?M&|)Gf1{i}2ZU#YFkZVbD z5mKgE(Dhey%#2lV8=HUeuKEV4jQb&TSpTCjEM~hLw0%=Mx$!x+j(Su7gVGpG#Il;5 z!L5kB2G3puE z3jYu}Tihw%G0yELY~`bY^YV)Ku)Xd9(8Io8$KG$}V49K$g!5-?8s#wcN57Wkoeq_` zzmi3PG{k;Pz*~WHq@ai>s5}Im8=kPMmw0WVRjgqH?stT458x)ECH3{8>+^Vi9N%u% zUG}b*hIl`|`>58J@w3U~$?k|#++m}wvWwg-uKtSh5|@-g9>_zdA3^{dGKOpOYrGl$ zZiGgD(-c7PgS&@qSbOMScD<9+`Q}_vB6lfD;ZoSwYk+>JKbABd6))rPWuvC&o?~Rd zliSK;(>m{I9ZYgh99fjXqOpxh#8pFdX;^)k{B?NV@}m<7!*Mh2R@JK`6vMC9qQivC z@Zg}6CmrAp)M>uqd>R;FW4qyu@5r-Tr__sMNZDyoMjBG$fdM)DqST6ZdzZgzD!2lx zPi|Ucz@r5CmgcXb^TZ-#548Rt3*dHBNZi3)D4!lWFKdH z3=kIOmAW~AUhSS=NZwoDEOr%0r5T!bIVet(Bp@sB87*{Zp`ysm}Bpsf7J3Ghxy!0!|8CKJ(}pW4AX|G(bcT`&St?Ax=Y; z9a;m*+A)0$CxY^?fdN*uam)=(hbfA9*X@NZG$4#V%61C4>$;>&0Bf|z5Xr#2G82|H}A9MHd%{fLLdq@zmescB5LR_37 zQSbnmso z&M@{PuIt`(fjpkEuj?i6#+-ih`lY#cxrjed1t5Rw_fM^5T*&4NZ=Oe z`O`$F?n~NgS_I6T zl1>DD6(5=@b5gt?A_mHqt>jcVf+LpAv8v>$ChD>K{qbc2l!CA*6}X`ys2VBBMvSIu z@klEuL%mvbY2691f5_&ONpy!!wi=4oM%N1ZQl&WASl1_~Z$Yh2noawsM5tTI9zPU8ep14mu&lH25F4~hxdN0%Dx}v1;ee!kgn^Fon(Ak}Mn+<^J%``#<}k!kWD)k;$KL|Dg~-+NeCMcjfohJvcH z;K*UB_aB2+zUPtsTAsUHBvw0}r%#wK-w`C3a45PX*Z=wpEf-S3L?2paQv7bge!YinFt zh;J*uI3_8}#x3H8j5ShJRGirNOv(_$CJA5>)@}3A+>Q8J>r*bzL@@jmG@KbwIZ{`sZ`bbLaG6);><#r*$5&)^Io|fg!+K0I`bd z0w{27BdRE8WlSzW@mx}fbVBt_pYOA3L@%qxn9;(+FjHVgo4?sW63lV zpy7Jo7Gs)9=khYqF>$58=+B3NmX5U_cR2zKnye!LEe2thlJLMGHp7UHmW2%CqiK=M zC*u$_E(saX|Cfa@cc->G(bbd7b#`8fuezt2YU*r|V#MHWz>0f%(I6=?`}liDUD(3m z+sm5uLp?q>U=IEMkM?%%n~iDs~p+cLyMa+~rrd&#O|Z!OZZ z@Y-!%yGI_2E!fXm|2ks;8>slwP15@1*sLs+grU^5nPW~_#7{P51xfw&p_4X7xjt7S zoAkb)g}4KpZfzVxOy)~ft5O&f=SDPWbxxp!<5nq^hqNmA$s0zjA}XmvBIU zy!gMye-9B`9za^Q5%cu`FoR{>hJuzYr|<1>N&Hab76Lj{k%8c#;8xf`+w-2SwW4tV zj}!bOWOkNb(SI`rKA)av9?M{fs3M;SVW`Hld5O-2>PKO=2f@T7thbZsyg#uLO!w`x zuEts(6uE6g3jp*b%JG!r4&@6idU(7@VbZ?u3{(U5%iT{#!eDX=2sv? z*#`wB)C<=9+<+d#*tMPF=Fc1$mJ)#&%w_l6Oc)L5AgQ88r)abZEJsNLk%-SRUPQn- z@XRRIa2;C#^H<#n2&_`tAgK;5!3_;;=5a?EXDbTQdT$>z2@n?iReDnebAnfN!BH7D z!&J#KWQXK50GCtfQcrFvC+gYMO}orJx(zLyEl-RTV+l9Fn!YgH;vok7W9BiAAg6Q3 zG-!SJ?)m9A7ItkSS7Ke^9t5DgQ2Z=0&6WAj0hCZYYJCK-LFg;eLMu&7JBj5Zs z-;KGUpIJX7;;Xcr1QTZk00jQ=FR_TkI|nsZc@-g&0KkwP8bZ*YK9ZVU!BW^L4U>Mx zp42dzG!QEjisx$#SC03M7-&n>#;oR9=0-EB!o6J#OQwMzN0mf<8N9f-km_+CMU&%; zVCXr=Y~A~#VLWLI6OBCW6j4@q3hPK?6|LedKkqWEK6&h~Pme?V{Gv^^z5dw_xnEUv zau)a>VO^k)^ZfH@`&whCz8cASYP`dRnHBPl=m)yN#$G_GT0AGv%d|K!j7C#2oI zr0FC$W9%eDvusodfHVIRj0cN}^e1M?;6DFn_-+zbFaV|xDe4AU`gD|J^q&A_K5{q? zf-cMIkSXaPn+l7~Sev>4IIq6%?H!9t8mH2ns={qRFS!|O;G57XWyv?hJ zZYTeqZBVuiZ?&<`GD^T|P90fbRpRJK6G%T#B?YsV24OQA#--F0u+|5KF*eVFWSNyy zj?sw_JyhKxz+fMv2M#b7VZs6>FdpME+q2GN^(V_u?=S6`db&OCynwdTA`30phyzN5 zm!(bzz0|@ly3q0S3rIsV;`m zDeF%Bl#yfK1FJ0N`0rLX|8}|1^ZMb+`LTD>vMq!40nvjngMeO6xsOK)G!O&!KC4ht zfzTY9rcO5+d$dDU-R0RuY0Lqt4Kd>=8xT$pX=@nHjt6R5U-q-FfiTC4hcGFNI zM0-E8aj$#sj-jADxOlgGt|7jJlP9L zy?V|?&987UF5&V5RCMz`%~c|8d0~!6PbW5Z#^*a1;2kXpnPh&9`Z&aQNL-!J9Q&#? znia(=W8(q+^(TM2n{`Q?gq*ru;|CWms6d|+B?P{( zUauA}EyZHwph4PZF=2#xCvX(gU}EPRvknsrmX%my)KgTC=$pgsB`9aC2pyGbz(NHG zVdl6^O}2i$_SSZL?5?r6N{OnP4t)lNp_2cnsL5KczSsovJmPhm!V8*_@B13syah=p!5{;(`fjp7JvZ}2H-p%{(-;0p@9Fjp4lfm zGqKXjV0jkh&s({hxYn&}#u})p8)J>#8Qo)Le#-EOIB9V;AN16-&1;W+*RH>wu6`>U zeKCz0rgH-6d9MDqmMTCyP?AJ0HpaaxaaHzrkf1?UuT%%8)iHXDeFi(OT1FNdC3khx zuU$`}xuoPMr6rcj*HKAIiW=DX+VMHk(+Evh)ilmYX*&q5>~)xA`|bB!U&{A6lxcnI57@nXSxi=Q>F6^%xgl`YGP@B z!Jzfm?7ajK=7)(G~Sd4OVT*%v$6zRfZI^=Q2s^QF?)J$=rN_dap|X` z1Z>~s{0FP1>y(m}?4-Sr&mr+wUAk)qUaqMX&f5WL8#|!gW9VLb-2@Z1 z0jtkFv{Q~a3l%p4lI?nRd13B#&&n>o?klJF-RJ6lF1qR>ov9?GA07DhL;wQ)9@loh z;znUkTt{ME)SFmqoSuUIM}R-dL^?~5(W;DAYqe%eQG5HtPW}Mj^Onk=G6rUpuaS7$ zQhHD{p<)jC+j}vhga8jn6u4SwP-FeaaKOn$7?^P*t9|@`)urv| zV(>eqKU>k)yPxmP5ZCopEhl<}=yH{A{o{s8frzA>6xVrG2#|+^Y;LiybZMKa->NaK z+tp{;2ptH@^Pm$CrTCfPV{x}^5tzbl?P;u9HGYUZyg&#E3r~`JrWlx1-K+Y>jWi5r zFKiRoeA`)mYV^`dH?IX*TSzr)v=7%O+L;-FvVDdJ(kJI|-ggwc$7$-8`m4$E})ZaZDWtudo#jM*HB<8j$K z`!SyS+Y;#{NpZb?ws_swtCec=HLiDq%^GfX8Xk#Ke6@i$fwY zhhOB<&zupc9LAG`_Fn7hm@;?}62rklBe4c@PRUb~kTN9hY_;rLx@^Wiv1-oa={nQw zMGUWAGUg%{P%~!sziYsiA>N$Dn(#HpJLycCS&bS{)JH@E6>#B9IV%QqsuC;ctRpp-}hJiGi0!sPc?i-)VZFbpZcS7XZ zCzxn}kql@cqvok*I6?~qSEzW9DMR-fA!CZQ^O1CEor)Eh5hCEK%_eFjaiPc4AHJ8fa2%2Zm9mu9we+>EXD zwwLo%JFvyVE&?XR_?9 zIEMD1g|siDai@7kwmxJ9Se$nj`T`cPgYEc{^{QNcz4pg|lY+#);L2Jb?_P61i6Nz~ z#&Ur_Q~(-1A(=&So!38G7SG#=;Ay+tp;T3WwsuM>t7~hWz6s{-_jz_VWPU#*+_=wn zfeTEN*On2`XG|1>9eQzT`9vgHM)@tHBr0WBqS7Phd&s~5XB32>f^w*dN6x+{gGXeb zKGxs!yLB7ZV1+s^F>@TvFcn1=ki^_tl_EXrA$y7mR?vUJS65$`2d#?)`*&o74$ihY z4lft`wx$y^Xn?$bcFaT#xrJ#;K8}89i!?&~mJD?Xhj(eDigVkZbIBGt@U=Q*S8LX6 zwERwmom;M%7A~D&0}|ho(#P#Y(!>Y#>Pd5|`TQ3Dk(Qn>yM4VpwSF=4@zLRM9j#~Q zCfYy?f)SP^Y-CkQh=e?CeaTBJU`*uBvl!~M#2bNnhu$ZUJatSIyFYXkmr_WDvHp@? z=&1|%ZH_Fv$2m}eGot-x!?M{DZA3UO;T*&YJ<*)0t23*+GAMz0tvUSlegVtMJj(O~I%nK`A&VZMzQrnh>q=HO)C%vxV$#sV6FJ2ITeoG_em5!Qutg8>6^nn`aC;;Q=F&fnfQ&WmzbF z6V^s{-_ia<0scB`W1=4)k603p#ONlD{2i8=$VY?*Xz(;t&>P$E@P@&G{xp186j4U5W8H>kj*k=YV8n1Kx;^}&V#V_6@Lu{2r6g=+rdX52-H)NGDC^vZZuBiXsviSSggbKCdU`h_HVc3 zLjsUP&!-9GmM5#}rxCrO{V0-@z{%gd;5D0;04V)95ow{;UZU5|?~`hBOUp+sQbva= zFT)tVUOeA{pQF#4$HNJ~7oADa5x;Zu38peQsFc=@8#E$R8y8i0GGjD`gAdb_Ty#F) zAbT7bfuuGe{d$=>|54%d39CF$i)~zCOx?pCn+)}6o|#}zJiRV}qj=s`IuN|(Op9gB zoi0nd=l%Gy5b{nn*dMhyuCP62`tg2&6d+>pd&n+Z-o0cf%{hztJzC5l#9(c{p9GZU{SgUd)m3d%7?>rQRtAiCLB zK6FvtW>3|K9ua8KnBL(H|5s_sJSmNo;nyE-x{?H+$=J$Oi8-4#l(&M8dJ*U_r{oh9 zpt!QM=iSb^_-@xin~=QJy2XOR$}EM)qC>IJ7Y@?QG;D9Rzh6@MXJe->t}%CndqN#(TcF+p#}52spG#~#NkDeQzEKR z0DT6=cE0|GeC!1ilgXm;_7o9x2mlpEMn4$vPt$frXU;Y>-mq_(I+-0H(vpd4C|c>O zTK7JM%>Hi}(W+F?3-(v$&Z*>W!ncgmB7OuX9IQb-GKP9yCZutS)s$&;WCA+jb8L`Co859ol2EhbnfEkt%_!XI+ghtKZJeSt5bc z^-oT6^9bY(F9T&9GHQPb1k1##f!A7IKmS2^fE|xjL&4ZXKP5dLf<)ZK-WGR$ZcS53 z%`UkJ6h>sjY(N&iTmMQG@@!M}pQ}#HacaALw)P)|7NiSg$_&dwtG~lu;*{LR#8gU%bgp z%d@yIDaiV9j3t4$z>&7w|Ll(9m#cyr^&VG5sArH;X8Oo!GYDwv(bp(_@=mUWr+D=P0+V zer1M*rn>_dQcxZ$fCWu4qKe#?Q80ySHk=4^cOJwFn8!%^tyxRdIhSZI;vO#*-&0?3 z$JjILd+h3K2BPBvG*vyWk&HYn(#{t2+lY;~j!07mPVCmaetiV6|F|hMXg>L2pNM~w zB^d@|rAQbWswt0rtsa5{g1bo9-`uK`AsEkW{h5@4Hl|!X*Et*&`KUUDvVF`1skl3Y zp0E06FNJ=HG;7juPm3Bg)SLz@hPn8!lXjrQ4513>DU??nV%Jt0 zcgm`;;2z$*tJJ!FJMN8JVteFuavf|M9So7ixX%osMiMouT=?luhSp3nnwyyT|Ni zFR;s_k=nC&Bf9*M?_;;Qw!7Q+>rX}R)(7q#;c(uU*C!dq?t9n8-%+gn!Kf5%x5XcF zyuBWquWnag>mR5{mqetFb)O%T=S#hJe|xXSA8vHEde}ZY^)@V>%&3R+qwPuC>=OU0 z^Nafa0Qcr*X$ZZr5r8i~*AeC6!C;16nNk(%6j{e8LR zCJ(P9zw%!$W>HKAHtf=-#V@~eDI|%Z>*9pl7KN{CZixE*qwr@?5PEe@AOICHKF`&; zTq$DGLM^@KjXL4<1lxNK+s}q7b)-=Ti))=2Y2^?FjzGjPS}b_#$X~Es2X$b5{;d%j zL&TBf`RA0P1bDW%R+PJ6?U&0UP%nO+Z)~8tZP(s-^9|P}`}3Bqb(opP3IO7`Uq^-s zuDc#9YHPjh3MVZ;o*yWJV<%rE=Y9qx(|=yllt9)>@fCX)H7fAp6gy3m|& z%l!%2>Yp7Le@UXZ&y_`2$cObl(`dK7WRMA#41qphIEs$ag2(zENrb7>$Lg+KAc!yN z`pR&w#~(u!zem1pOni$lO=G)gt?t*X!2ZA`LcE8Bydf2WimfJ(J2kp)_Q8DyH%;#8 zbiP1B?tgz9Kj?Cm71LG{4~uUGEx@M{>TJUU{jqus*A@~A3R0F>=O0O-kJXp(gwcb` zrcz{nXS10-#;?8RUyGwdW=?jP9-;#Bg(!`h{X}!M6LYEuVyKDyu+Uw%dwT_m35Zqa z{c@LQpC=q3MEEV;VQ!zh0qBCB9g&tI*sH~6JxqaWe&eccn3|A9%BthJxMJ;;y{Wq2 zDP0cy&*fb;#!SbiVNS+21TZx_$DEu|w1J?>{#^<}i)G?b?uS%jQdSey_fUU2MnJd0 zS3dqlbQQ{m0x0{Ua_w1oy*G&my>rnx>sKX0{|aPeH$gH0?j*U7Mt$M42-(+9E=C-z zsL5f~e%Py0{(bp!kN9bPW*A^KJY|4?0dBsntU=g_I{RUb7y%X4Z;g6y6J;VGui{Ma z^E2F|A9JY+@8+L2()O`5z;0i+HY=qVguI{l0Rta|S6uiOwQJv;DfSiK_VSc+%Rve6?#{L*uo{neh`bH_0CbhIQ1Eo~^!2m_Obe z@ms#u&zbT6j*%ZNEz|Pp(K@A(yGuA`LjuH`E}&(IaCMH5m|~#jyWz$~`1^_(E{RcJ z+#Gbw5o>}jqQVkmfCX)2@Lx$Ek^bBrjF3U5@nTHR8&)*o{N%@ZeW{PmC&A~9*fpLo zHTm#%qByDHr(ik5${~4RzW$z@3J-Y$X3S{o$E&R%?6gCw&uIY&6VLa!5Y-LChW}wt z>NuLLmMK<}lC1l(Sj+u-|6SBhL;#ZCqJUR!u>AkA0En$6J+ey8OD(QZBG%@Xr%buZ zToUNn&_V_lH|e?J@3z^LZhiqhjCZ8mFKAdl$fb9%W8_H-PBYjru78$2YWOvmpPbKU z{F)Q&sKHK(l_#N^y_~_m0y)`4ju^evwZ+uCCx1Y6+ezng;3#wa*}s zV1cxUS_&!DP!!VN+>So2%uoluTZ~G?t1B;uz2ID**L|2e&Gx#QQC#E>OV)BqeY{wD z1V7TD#>CWqK=_-}kRu9@2Wmh!N;~v?U`A;w7PBVZhrI3!d|*E#r>~rL13s-?2cMXnf(WPz4TV3NYQL4yHX2F2;#(b14YugKRc=fL zSg1muxzhL0PqKHan~62HH$+EBdD5o|`uy(nF>lPsx_X_|e5gHNl(XOMl<>3_3+ zvE>=AtUQ70J?z$IL&aFWpIgwMFH5gaAS#M@Oh=PdAnA?PefOuyT%OG1)=M6D&xB2oM%}NMrk2SGHaR|RjqSe+|E6m7 zUO{b&t`X6N8z4xXrbJ;P!m-~OcIJTULf$vgfJMQw374kR!DV=Om6L^4G^8x5M1R@RO$t`Eb1 zd}KYS!(Ngl@z%jk^vX0gFpbgwGcwf)q8rL4|3rx)vkrub8uuvL$q zAl@MgpvP%1Z>~szo?v6syKUOCY9>pk;ffm>Oj!(fJXLW`6Os=i`|RFJ`>+T*E4^N%6l$&M#N1?j7ELJA)>a^%H5QH- zS-5U>Zvi~kbv-jX7!R#%LbR(U_F|qHtooi~d*t1UR!6X-R8+&;NK~;i{L=SJG^sjR zPO@;2-)Zk&h`PRNP-#gdkrroaPK7jj!?FK6G%x&r}@rDPp#kNrVG{aA8v%4>PP>%Gj)Q z%;(qpl%SYjf`4m*!=`1C=%%lfO|Pq{ijC6}YA5Vl)}a?ziSR-e&BKOG zQkc?fQAAFzxG#x1Hon($$0maZOf!N5LM8p`s-j74aweU1iL42t#{i79SlX=QEZ8F^ zL!_`wS|o$WVoJ;R2Amt2q-R;V-(<|UEFZB-)Rz$8Ow%p0`P$Qfs->@C3oW#|3d8MP@M zqXNx0a$xX)j z!c{|qE$!9;5JY}{e3aLp%ssnZf!dut@?;+~M3OMhIRL8Rh^Yn3TUZvVXo7o)$&};PiLdE3oC~uQ%zzA<;VdZreoC>T=%TbHtjA6Rq zQTzbq*2$?UnzVZ=44wBccj^lCnbfzO0%9I#tEo9&yT$4Ar9Zu9kF8>sp2*>unQWy` zZ3RB_4UM}D2>>>vXx~E#-28L^kke#eQt2kaCdcoGH@7Mz03{4g?6oi@FO#!oi?%u z1T%Zz>-I-ob6!`au2I<1tB!RpJ528xNb6K!9bbe%)dm64%5{If!XO+sQ&l4?@sk*7YuB( z!>X`E;iXWQ%DCbe-(1_iUmdj;*Ez5b2z_H_=Hb+mH7^-TIT%lL8sgbPUl+y(tPMOj zF9+%8;F)@gQ-B!V{_Z7Xcr{fq(8PxAL)Dh}8nnbrmRf_0~)oCy_ZT}^l2%FOi1eOk|9@N#Lhw9+>f$`J+V3MjtR zr$GS3$R07M$ebDMVR;$SC>I9g7~ZzAh<^QB-2waXec4g)gv9YWQK3-KWcG`xu*&h; z9(ToSzFK)W*4XxV{`7{2m90;p(XeGJx=^pu@*9}69Dur~u6_K6vPIZb_FXGpO$`zt zm7@RaWf9Bo!z3a2uCc&_!}VX#54fXY-y%unxb!^g-g>V1|5TT4$SgRyt(R-u8jVX>^ z?EFF&4xn@s2dCmObuu?GRozmGOp#$cQG@h!BZr10HiJ>2kI0XEdB3cCjCtBuugHC@M1gYvJuPBqK zRK#s=RT)+smPowGNG)tg|7Auv)Ia8hp2@?n_O4k=w+hVcisJ2Uq%;6cWvO-(pwFcmQ};7@6gi_U#pAj4_ERabFztd~UzH+?BV zBF%3|W9+n&EgpH+tqj=?GY7vmB3oWD@ZKoji1oRDJe`#K85uNRrf6C?5!@GuYCFaV zkBv10KV$Iik@+uVSx2MRl^!o2z(?W2|rmhFTSVN{Rcb`^Ue zFs&8qo=KKEbVq{35CrF`^bx3H2@zEg2gslq{xH_gNAhWO1)Dm8;)>Jn2}J5Km}Dfw zCYJlMDWK9wWJHZM_edPP*l5I-9Saxgz&ErZ4`)X1dc*od46$jUxviND;;29IqVQrQDM}w>g#qLo8$Yb;OB9=*zrJl;jv!e8D`;E>KzQ;Ge0UTr=qHcjM1^Ur5AgoyCB}`fi*Z3LMi>- zkSj%)iXGKhSZP68fs+;meVFSsD_ATq5Rn@o3F{#o!BGSdjEI(QW`;0CGre?aTA82H zTp9l8raW%~TQww)4(to706kMQ1YeeSQG*cJM>}uOCuobKSR_C;ChpR2K|e@oQI5}M zn@Ldt7Vz@&cp2r>Gl^_swj3g*2rD)z^$``3qQ3zK`MY%>w6apmxaH>Y=bGu#YiUkP zYcZ5V8Td8LkUZKXA*CL?`3`6~<``>v#HBFX3mK@zZ!Tze=LcA2&RAZ@fLB$x-=@+_ zj`~jUx3}FhW4tq>jt;}ukgcY|I`8uJ`Yzy(uGKtsmW3BYf?gN_%0$zqyKn<2o8tIZ(ZwaS60Dp`X|XPw;{ks@ zCiwP;qhyRCTV9 zAQLjS@6{8>hHCYZr-P8ZM9MRfM{!^;yEJ}$F~#T}JlfTHT< z&TK{7@)W1j{d0Fm=Q%mF8W%?$#UF49_CgQ3M zzZ4aPO%Nt>EKKI*YBgqt)2?@Tt{A4^*s&K2)R7AOdX_v$*7$^VxNc=4anl4Wq@#cL1sf*kHZ3J1WgS?5VXy1N`QR4Iey4RGi?FK07=^Q(8Q^XRfsHwcY zW?nmxyY(-URa&0|wa5XVH*=M%d>sM~GqDjf$%LG$oMsC!qR7=hMjK%=f(%cU?eUNR zta6Uzk5SMB6~qdv)=h@YK+pxyR`e_&Nh5QrUm^(Zyh;^Mnb$DbCQYOk*gj+w^;v#) zsWE2nCkEzU(PzI@$FR|>vnFGy%w|Do_N~zOipJ_g>en{J*pO=qJS%}ZVd1BHS_I!R z&If(I|KU~r;K*Qns%fUew}7g{`wK(nx{k+-F5BC87ifZbRp`@d@MuH=f7*e>|N&T)i*U_ zY;DftSFUBbSOjG~ou?h+nJUeO+cT5_oecE8^p%CAM%Y@9?KvJIuZ#32eogYR`iAl= zdhwvCh1MeoF}b*!LGT_Hn6LxK*cZ+0L(S|}JPOBCgTqg$-OsUIUnvskb@eEU6ciPV ztE$X0vdHeSK_D>3jI(^a;;g>@AA|c9ER+anTE|{bWo~ZX%VmNT2KGO`cSN5L7BEgj zgG9*B?D}uegr?1ThA=W6Prz*9>>-m7=kGQ)H6NYp+%prvVNZ3oeBPWwmk$*HKO>dB z++p#V_1^dG4jS}KtIabIA2JV0*q9;4Yohu<=fPo3GKrl+)@pHRh9a+eM#j z@q?l7cl}A?e%yp6F&(KT%zWZVtX`YjfJ%?2BgisHzT-pHa`m6uc_;r@ zLNLcLTyn4&UGIP~(&p1dsb9yhMefR>dXLYn_SRwbWd1hyma7)}oUf%0qR#s@fn48v zbDAZaUTl31pNPE7{sLG)7_rx(3DU)K?T)0Or|A!?E_h0yap~gY&Bqh(=lS-JU#cqS zTuuiL7ZMRAQ1|EV1;Q3@6F$M<4EABv+=qwoYcxppbf48e;7tu1h9|kjI)lFdEpWar z7STL!BnfDJr!oQDO%qFOe6%nyB+fKv6rjFYMj4wju?$I6Sge3vx7CpJzND1Y=^aDo zN|$#FR*v72Ss_^7^!}>8!-~%JdYkz+UF1=DhPaW@(AmSXEIx;o<|pWRUDLUik#_>` zUENDC{nF9WIp)&!u-VX_xMe1?`z(tcael27XKxrT0|(el0aB-n8QU&lN;lCH9v| z)xtV~&tXK@i6#R5BQZ_oHm_=g29~C}VDcgw01(D_l6LWVyQ{RE`wuay^(VhB*2;A^_mLO zmKt=v_PZ}1uscuQWbti8jb$}oiuwjA(ao)R^XSJ<&FlN`EM8-kAjZQN_U6oWo&t+d zpxf#r<-4(X6I0heFRm7aTpjz2ugABqXn}6;>(5Q^rx9OSM~aWTWP#?liJ!ADUGI6P zqIJ1!7S~a+Dvg+KvaHGt+2F%vtvQE>nDT-_TLbj>3a}3{h)+)c#6$DuA2zPt&Ath? z%Xzz*VW~>N6_izIN77=$1Yw7$t1gPp52MO-A$U~MK*;p|hzcuHPf6v!sVv2s>gwD5)Ah7l@7YkR!|eCy%+Rf@tevsv zM#SlI5FUC>#Py3(sMr4US)+8ocP6`qD&wb)PK(z^O0-T30wL>8pZ7Jt8dYN^?izlM zc5MVq29V&9d=ats+Tbx+Os;oZzCv2sl7o6p2|{G|h_v{7Sd%7o6(&?kef3KLn^-k0 z)n^zizzoWCwQME56CUYT|Byh8Y)8t@jOgQ!k@eCz=hXD)y_b!u_{nH zpOk5$qlNQPX9=gom z(4j0@E^2CvyT&6ThFf+GM@YCk4(;Pz%z#$Sx|`>*`vp}AC$Dk|aDQ5?YM9S?^XUX^ zq>J^AozdI-`^J@0JDM@nc;gWT*a8D)9WS?uL2`4oENxneLRyM7eTUJ(KW$wNaImq( zr6uhuEUHwx9`7dN+8K-K+CLda7x=%;2Vu)9kt4R?-9e(%DvO`(OmxxO%8OcDV2E5_x~uD$8WtxMNB9#Dd< zZ^iAnWX^rgQcdfmqIrH91$tOac}O9^+7TD~%EVh8JLFWCbyB~OX9M8qnonq!`w-#y+&?UBB~ z{9`pl3JeT&HKOq)jD(dQ!iuu1qSkD&nYh|K+iONd8z(vw0viqvj==o$MC5zkpB1bF zBj#<+_=vYf$<*ct0*)-H#U^C5i*p(2ktz+~f9}Q8%HE4Fg8leB*we1_t`!0(>XOX? zjdj!fLEnF{w!r=3)wpTeH)wi@{uZv+07g7S+vXsr-;#By{NCMuQ8jsAB%Y2DLJDmb zuf^Whc*Z)RJppc0x2<}?p%#?3@~EpmTgQD@*FN0DCPY@kvLjnXv6qO!)-M6*wW`C8 zOsnHgOhf-M%V^C?0FJUay}P&P+~rh{MVHZIKC`tyq5$q+ae6x(WY}1|LaCI*Zu{|1 z18I|k)}9d%^fLN%)op*A<0I~^mQh03Zh!hMmcPyD@|BCFbco*XVC?hdr1$?=fMap^ zshLs9^?DzT+@GreVm(D;N8_~s%HfHi?uJrFx%a+SIP4}-P zNB|?bX2K3-(na2y{F@Ep{$vi~nP~M2Lvo%ZzQV50hPE0YfHZ*9?`YGw$o)x~=~ITO zQb8V;5mO^_zk~Dg6sJFi<)G(j{x;be0w8h*|K0aD0H7AwV{4qiRmeq;3}MoNyWMpq zZ`+3)-ZqLTURbbSiE2}_+x}UnMT9v%dNFbWSUP3Y zq6J_^P+NsqvBeaVtGRvk;&#E(%9MM#=u-LC?tQIQ7tr!{hzTqClv8oN%gAw!?g92E zjY|kwy9zeXa;~g~O;MTR(Ckklxm@ez66j9<-pW*LdN_Pr1#H)FLyBB2vNYhNqobv! zrY7VwTKPi~NON}hC+|^;W3%&Sxc*V$x%k&&LkpVy@vsH^nMP9!Hb4uOR2f?5}#6iNHL;dMm&HWT! z{nG8xXP0I-FUUWw^DOIA@nSUKHnZ;i9y5*6eXluxLmu`(E(|x28^fWZhhuTDb%&O# zU(UuaMin2%j59?|DTzO*^7F_phA1kevJ=Z)?nd$7#KM)ajT9~@jYwF!Y91}0DZSqS zx>_2g#70U~OiJ`R9K$wrQP~N%jnHm70%_`cC%#3H)^ZCm2yg%Z;%*w(?XSY!_K+j; zX|h?wFzMx2z)}%4H9tz)2-K-I#N=~xpOQkgQ3lb}{M;C<(8iY!0fxa}`BV8+R+RFM z8U3Oa+0ymm&d-4;P2&uq5Ofn_Jd@afGw_JnDT*QS;uR^q<$(b0y?8c|60>T3^x!BX z?R~p{zl`>i32s3-M&2nhswyf9s}wSX5b_ROr5b-53uzWeVQo@e#O_w9S77F_BMux) z5dBAhAcfTskY&|~-<%?!>dZ3sbq_PN4`P5hnJ6|3$oU4?1IL2wAtmA_6O{l__S6z;H%f z!dZBc_^?=*_8K&Zd~5E3xrhR=laP^Q;25xU;23F`l5r9)qhuJK>>CI&T8cQ-ih#XE zf!$vz&DauV2|a4oW~2o+T3GnX+mtN1_FfV*+PG0AmS21 zzW*F)q~Qs8UYPocmG~tLj&iq$IHee3HfJa%phsgQ3mOE97z_cq@F+)0(So_+OR*z zvZUi9+`jw~4NF*PUR;#=%PKW5N6Q{aW-1nM8eAeJihS#qzt|5cVwhq&V7O&-M44cF z^)iSpQ_XB8{PtKYcSr}Vi&>I%On5iuZF(rf1F%GGX zl|=o`2^2=o?P$6h5_e2J%#ob)@JA@$n+;J!jcC66YzF0>j^IVWNTJRUF60L&X(`Qk z{ZLzEB3Gs@indc;Prd0_kibolnOa*Gq4-JoVQ9=s7Dc?XOJ$VO75}~DL8J6RL*{%o z6uMlciL<%7;y4@$NpS*}QY~~PgnHHGJBB4|XsW~)pCDlc@UX-XfnY}z!S~mXX(x-w z&~YCXdSkB4=^fBsD)^&gYc`FKb`u3d3W)+h1iW{aoVQn0RC7@<5K<=CFbNH(NpVi% z1yD^XAd4y`90a|#m5>>y&ZEEtl|44H4*U|er8FQ$-o1m?>98CjkwO)7tEv;jSCxw_ zNB4D!i@6<1=tOq;BPV|T7yThi0m`4<>Wv!-VP{J3ehZa(%Y!gwT&MMf041Eu|982l zVNWvO8 zW{Awh76CB&82~4?gc(~iRlF_gDXDH&QLIL^n3tp#Ev?w9xrQz%XL|(dgWblrY1uKT z&!-)le(hnU^n-#MTzAULU(oNsDxH~0lyK`QI(;|#@3Uzq-p7u~KSiT}0|U8d=k1A5 zM9gj0M4>+|&jeJH@^p~N(c45g*{F47clJ&*E- zwz5o`7`fh|AyVUPgn!p^B-K(x@3FbOe5WNn0KfDXaY- z_7_Fl+Y(bJwYti$l~{NhlsEtUR|lEUhvJ!Q6#;*Ht_7`)UjB&%xqW_5RFBj`FBT*& zDvMaON-jbi8ot0}>E|qg09hRVkdo50$~=coK=}b zWrq@Fj$GsYosn}_XUYShz+@wskd&^B0K4H{36Mmd6138a)QGThFxA!BHj z<{-A*3gc!>4(6Qh1zsK0E@9$QlB^fIG6pX?L_fNsfl09x__(1RS*RW+BG}@#1W(rQ zx>01AkxYQslc>Q0SS?X8zyXMKXjCl|2DjQUUG$NV!wK9#A-5giUQ8)nK#bE?USD7kMHON5Q`hil#eh1en zK}~5L`N7W6D*>BD)AUFCuU6aR7QHYjFW8Kq+6-*5@3X9Qqs;Col!_{s2I;ADWCe?bhWK1k=J2ixo_NV1j_e+XCga8~uWlmhuV1yf%N zqDrkmjYD4TV8R}CW^~=2noqGf+PhwyNRRyv1 z_i8X6@R0oZ`Hk<;f%y*3m7`Wn))8xCdBlJ$4H{DB8la$^CTT(@9cFz&bJ;E_ja9iu zM7bAp+R3u=5uDf_4AH5JmmJ(*H4NnWPfvn@;MMZ5!7+7sN6739#L5_FZ|O$wVX0eJ z4_mUOjKZ-U2zWOMyD>N(J$wKyZV7gi9~R?`o8y3BTNxtG{7vw~hyeA)%Kr*Y-b2I(RR>O{m`0mZx`NRe^V!hU^ils$9k7%5{4U(Bd5WqUAP z+j!7`(k7e*$C$q*$}D^71Eq2^FPE&8D}@r^XUo5n%~x~0ZfGy^EEjCuCx$sKat5A zR|7t`#ey{~vY2Fk|7C3hQld&!>U<<4Chcl&M`0>mNzlY5NK`n`ieLcjE@qw_IJ743 zm=^@5cKsf4%z>Tn#uRs{o&?mbvQ1X8vh%_T|CXz5;-Q5C1J3V##{)WL$|Te@z_vg3 zbAQb{w+1{4#REq&bng;Ap~3La6RMs9{Loq$!wTi$93a=9QKdTWQru9 z6S!np^<|4HsfHahk%~!GJVBa>#bbz}1I5&7v&IJN;=}R+<(uh$MIa*v5Af?NDq(~U z96dp^>S2+R_G6O)BT%J`0C5;QNY%Bf>~#T*mVg#N z9RabDD_wx+U?{~q@vb*lv(Nx=r#;nM`9vs7Eph7KVNau|qq_XUi zD#vkm5h`9bxiglY;C8^OD#fXfQK+X##vDY8AcVR#4KoQi0r=Z=U0xFdHCLdPT z*vg@uw>^}bQ=~^y$y#q&t660ij-S*8<7+HpEn^SFTmYN3Y3pf?gA%gcwA9e9taoKy zAAC(ls(;+ivr56HHR&K2&l-XbyFCX+bi_*BVaWv3${|{*=(!buB4!x>>(X2ZB`T7v z>6dpHqRe2UZe2^}MQbOUu%?RI39Ja?m~@R!&u#S+f9w9zkV@%Kno-=~-Q=FGUz=6u z4gYGO0TDo;lrN}}%kQ*3SJ3cdBBk~~wu)F9I7}9LY`fjWVc6?fSW8V$#ZVdc2vbUB z)wgkOugCdxxcrqaVDk5}Wn=EWWJ(7NbY=)vX^bT9S3JEWq+%$FzhoEmg+iA-P>gyH zhll910+GEZMvWKC7DCTFNxP+I4Ci{{7oySFPC(>}rXf6NmRDvZ>?NHV;J`Y0#xQe+ z1eiP3ZhU~(BG5=KqpGMmhal~TtwH#qt*4Y(i`ugCkXZN-zqzOrQV9re5`hwbQeDa= zo$*8g{L<=|C!#FkxKnQY4e9B0Z9-SFzMPL z1&=1A2=#6J#K+Vi|Dm$Ive1jND?!I9-}@8h4kaa@t&1+RJWx^XA%F%G)gLU3eO`sC zUgpaUKuqHVC(apMRv$_rK@VOhuIwmnwA>K&l8b;zg zaBe~CTav8z+pou7kK6pObX5Wu|J0VhGusZnug;*$ntcsgj@A?|*9x>;8<3IJKN!#hZp@Wk%Wo(AM4(wc=R2MsWtSgNVH(psIcCceQTE-!fIc)#zCWMBVT1N2xfVF@5F z26Q$lH$Y|SA9|yf9sXozVDI>A^#|yQdc|vZw-E6M_eUKKS?8OaT04{nmnnl zfL>kkCwseSHxZc*zR zHoDoEdutJ7tOK0oJ4lkJ~RlZhfbb5P}N z1q!bVl-TY<8GcAnA7QZxk~(BG(uT4Vi{WIHYp0)>hnWBbRTkFboKPaEz_!*U?CGrj zeQM(PXbYHn3A82VXbzmcPOVu8K>{3-_$fa+(-{aGphnlH<6I5F0iW(cxVdCH3@cQ3 z58s`1b&+Ad2b5Kufl`#tcvFn}S6Gh6YWj*}x776~_0<98dux51-Y=R#2$Os6;^5kM~^E7*$Jc?PYg94PtPB@0-bGaZU#&t#*8$)+$vn}7*GhNmJ&n@HCz zyg~-Rh`MYT;&uInsDOgTgQ)+3u~*%7)M{-IO|-t8U0~GzmmB$qZ_VJg{UMj9r1HZB z$;#m$Yk+>X(o>3(x_0i|K<0rJ>k>boXzJT{=+aW{d)3ONseG=sLDTX)@LFDJ3~#(d zhT$WB^hbPJN=>gPWvv7Xxvb~cZT;iG9H29*u;zRt_Jegh6aZ#dU*L8$)%(%sb138Z z^G5k;GU}MnZ*Xxuaoc<6Z=XnT0 z?tktIdU{{?MHmt~zWhEL)ay0_tZW)N3p$?{jE9Hex-IOyGM4QDXjtlND>xSxWkNte zJ6BWii&IZcV!HfZBNoVqhdK|K+*&dd%%abGl}XIslu^tS23mt?ADcDE=6zxiZTeTt zF54cyThO1}axx!R;RD1UvHJr~E)TqUUWUF^!dlaLQ(r(Xsw;^B^1fx&h?JhM_?UMU zCdeb6&C~oAhHtyPqyBD>7ed5_igL+5;dvU}1Q#)A*aVjnsM*MX46_*2$tu@GDZWPf z=^a;d9NtZ}mbU;?eqI5kP;EA#9BMNHCKWFP#%cdRLE>? zo-9uyr|f7G&vknFI2m;k@NivQHbsZwZw$c-g;tzt*~J}JWL9|_?fJ(PsBpRE?OI6SIk_<$U6wYYSYW;GK>{*T~ zPrPn*y+!N!>=Hm8y_%J?XQZ^0ty=w~HQy-Ed9QtOuz21=tI2qsOh?Qvn$*5-QfOwT znBg^$m$EMl41n|`aNVZLnBI|ZLbk*^S76U5Qi!U&N?GlGzI*{EX|=Qn_1z{MYfK-? zC`t7y`h%UV{vSJ+08qq>`>**WYgW3m_;gY)o%PUrWz^V`lqGO}KSma+tQwI1CiZ*8&QVOfzOXp@? z8UW#Tw6#)Rcmo6=f2X=9Y=Wn1=)wEucNyG(6yEdW<1nLF( z{?-c+Bwi58Z$j)hYrsBAo*}vzeIX(!TFxd0Gq9(E%9Au9i>GHj>HniC(^8R9f(C(% zeO>_zfQVU|N05)NB`WyV3g&Nkvf<(Z)Js68%7^=1f>yA0(541Gt5UgYZU%$h7qger z^QQs|1%Z?~9+^%A;@-tlrbaoWXh5IcK7-$ME~u_BDt5_!tIl(xgorjhGkgBL_qWg8 z@${}{2zmJ8dABf3aWQ!|74=!>dL~v=61uyUv@|2S)&8~A{6gT<=SjCd@9pbX*V|2( zK*Y4Pn!3G((>#KXTh-Pd%i931Sb4QvEdrl!-fKfT;%9o#%@CqfX6<2a`L~Dw!4S1J z?Du6yMxY_vu0H>V@Yc>J+|e|@9vyXsomt#Kk-%4JYQx-o%0^?HF*4;l^p~FF#q(Gg z^4Rn#i}Ncyqq(-+D?_gD?wa*5Qiqj`qN1_LSbY$3{krYyW`{yLXS2JuQ@F(IEN7A> zqVMMrR&EwIRd{@No6pg7M$Q)B-J#z*9Er;ll3gtlO$OqadVSf+z0URL@$Q@Ng&X-L z&!4aT8TI$~9HP~>qSu?{c+vgpCkzdBElzo4(U1~kQb;D7BizFNR?BCRgd`Bhb_o&K zq=fVN%iXp~LD!YuTwe|ra8bz!&At>R%WZeq>dVDdQGtDyp_g2P6B}6vZH}$o15+0! zNNi%nbMP4*E{&(i8rFoRuzOHS4s9VbnWmocQ3^TePV!vjUjf4kl>h@y2@%3){%5Dj zN3Ctwjb1)>l$h#oC!RkTMQQAelG$Ub6hykb)l;`mK4Xu?6++P%{V2B#O5_nYyX|JT z=}0%8x!&9TU60>;ImI0m(*45n^`<_f_fb<;c*p)&C)KBSfN@ zirMn7{^)>yX6xEJNjH`E;Ti7iU6fy89#^wJx@e~4_&s~xSu_q zxNbXtQz4HDb;gM0yX8qS4MilFuD_Tql<@tmEG24xy85}w_xb5}O_#&5ZnpQU(~4u) zox?5$CVoM+rDlNQOUD%iGgcsE+G};5oaYM?$88$*g%#1wBBT&YRuCFmM#P5UPt3U_ z+H(t^z(V?3_rV3!Sli(}bdelhI9f@hqXFb0l{G_fhO&@N$E=RDZ9bQABol;LuquzK z2LApQ3^Q$)ou3dqZqnGu`nU4z)sCj5PzcwT&VBzLa^iLnekxp|=Iz90y$}c5u-@K< zyzxehzAQ9nxCqOOkx~1yP09p7tAQ1UM0S>LU;n*kR<9^Ja$S{kEyg!)jf8X2;Jj0R zn3L3a{;v?N#ik|@LFRilR@!2_`Rhv8(aCAm*qv7Qt=(g?}z(mmP$u4*b;6MHlwkOARNX?`K0BG0mixH(o3yUNQarekVW&lV zvdhb4SUpOR*rlc-Vz8*@G=bI-)WBN;ZRTn*(H(EsYq$E=LA$0c{#I}RJSMNMwRw6U znXOmqD|(@#YOs}5OR>z~;2)2-jLzh_0vV2IO z*w8R+x$CYtJx3@{S8@8$Xiji*f?9PuaXxT47RW({PP_S=7T{!}r~s=wevAi_hu3r# zu)O-8?83|$h-$u`w*|p~KZTNN3rXv#v;|BFs&u4QrIn(3%MEYvguKAmVM+CexI9d? z@Q9LS$RwQk+8_R9x1gZL=6mSfLOUx|`$$z#06IZEIi`;+AOI0i?KL!36C587elB)) zkvSO)$?xuKG!L>y^vcAFvpXiXE(etz;aK~aSRujAHD4g^0yI*yEzrIHh^6motN7(R zd|SX`u8>Rjxo@8X3)4zY3ggcsAuXnwR(bI2Y&&bt~;Y$b{c-r(iuHkzFk-ux$ z2PSkc3$TA(u~)wlb~tXmBH+Qs;1h8DI(e1TIhx4{MyWGBcT)qE*aR@ij1FJry1X8r z`x1h6Kx5_I&NE>kr9F@yl`DxwgtEz^gIftXMR6%`#Luch3u@g9q(TwpIQifT!t%yqFj(9bqS#kkHZg zhk@9dc~2!Y(@neKR;{Moic<`Pa0h}x{boicj5L1wcxGokJFCvFO!hE56h=Qumx(B3 zUZ3c%^r@ILWN?4S)zmKb5%bW3OzbFwU-BC4lt?t~=|WfxSS};0Cjsf_>I_Y8^@$Ww zn;H%t=P`P*8(;eeMHU*Er2~k7e8sR~vjJCmqkw$kohPmfP<@VVM`z5Ooas06f)_7e zeSJiPOq5Xl#o2)eZcR7U=DX*q5!-LEI8XZOpJ|1|Qjzt{+9(G$9Y zLfpPgZtd?@U0KOb!*G3u0f0gRhouI;wf=I1fv^KKcUpn(m9eB2TK(p=s1rnj-n*B- zW&2b~R6+)_{f2D!Ndq2#JXaZ8TK0vu`|r<8+ULaz^mjvKt$kgSA<3n-M!jjs+=Yx?;%}i&F$i`>OMo{@Bs(V#1cu& z%x15Je0aWWEGXiyur#6p!M#RA%1G>=ln#1n6pe*PziVh*#SPZn!Q?O+uz?8|8=9CM z7;E+)y;n13$Tgw3H|<;Ll$5|oeuATxBAZ=+OJ8;-#cz!IfT6L z0g}MLk8<6&b+{3K&lTg0UslydxV@7}Ty6-ttvBNJh2z$2aN^zmd`kz^$X?*n!9~`v z+YiUw+u|vHYSqh3`x-+`85{T{hl#;UA*~AKf8Bdwz{ME*2|f=Wm2z8zEC3dGSiO70 z=naDuO^tosF}Sc>ZZTQ1VAvnazzZ+JrYWO&1q;@>OQq2NfvMJyy$Lw*neeEYO*O*u z`jjN{c258o=I5^$$?%(&ZBjPiwy`oPd0s)nd zYDS6xK>k3NtEVn*>qHJ%{S7T^fj5lc&+;~$_*d69K`EY;P&n6()fZj6l-1E zIkiOtuS4CB7w%gn{ie+Hi$SEEB*xfu^v_XNs!C-?WDXxMZ?VEKK-5*+iN!i+04h)v z(PBI|j8m#XNIQ|nhXN!s88q8I$pemjr{H;k!(#q6J#gChw-$%_c$SdIgVx;8=Qs9M zub;5E#Ppf$PQ+qeV7s-q#lz`R?Z7X2@OYkq@HLI~z8x*Oe67x|ADka>7xkA}c5+eF z%1pgo#ByKpOY5Dl(h&Fqs2AKF6hw7iDhCx>`-`_d8 z{uZG_&%)Ht?A@Vez<>iLqG@EK4X#451!UH149^S71;&#T@v{))8F#_%;m;){DU9IC zrsip|2HrIDo|POnaDo&g$W_w1@dAJXU2mV)ja z|ChQMqn#wn9b*99>}|cZ0}VPnLVpWKCbq--^e`?-eGWtHa4Ck@?P#+sjQ&aELE!AnDVrbZv+}L@< z4W)OF?=du`ZHzo_pXt z>;F;GTkAyowhKPLNzXTB0!=QOe*(T(?8&VFkdH&Wc|4FiR&*W0JHKL+q;j5q=D4h7 zErWcE9U@?XD-!qZ?%&=Xg~Ff=eqkB^9R=qA7!&|*n3biQ#|*yTRUHrojp;6X%}&gE z9+z65=yHdZ&_^UMB3y&EB~c=zf+~;Q5z+$FQKjaBe!2L-!1oipQUbFhdz*1j0@5AuleWa;A0}CR}L;vh?5mSovm^9zDs4{q%{ZQDc2?lHNYN>oYC3|BNPRBGM`iwr7J0ECiT$vcXN}%lY5oz{-WkK9z*BhNgA%vjj)D12 zC02j+-?FBkbwv$Rg&73Jr@0c8p-GxMjrg(Xg$?&4Pe;D;qm94hnphOZrA&Y=J%yJ1 zg=`?lsLXg`QbH=H3ynipO4_zP)5aUcRy~O_*6;qyc8m>2RxSt-C{i9|qpW=QNJ0g` z$J20TH8~mSw>$^5Duxc8-OubQ+&pq)CK~@_O-09n21rSTnuGkkrK#4lF9vf8V$!=KQvY@3B8C;Od-gZJfKB2Z$`LOcwBu26IweAdg2^K~^ zUWM%P`@$R+JZ~~eNRI}VfURg}r0`UMrw0p3f>`I-=OdNUkVC=bn56fnUl4#?h#8EU z%x*K@?uc{&4lsMUJ5#FkRk6&%4iB8d>37%TOT`G!Y!L?jK<3S#sH$^O&iO%jg#C9> zLqLNd#tfy^p6*;M{|@dRDbwwZmqVX{Ml&+QC^l)k(^=BChjSV&S`?f6uNNIIhrfR~ zw7tE9!?0zLM=ml}UL-?A6T+!x=T5jGyABxU!8S<@Ks*;6DAR7WIz3e0Y669{1jgs2 z@LYtZfkDk3m=zW9*st$*DxDKooo$X+LBztQ+10RiaL5+%d7R8;OE0_PS#G7G!4f~r zAp@Nd$^&o(#XM+;C0TY*9_ydj7zuDY9a2)>c?d&^*Cgo6daC`MVR^M3qCb#Vg;fN< zjT3}!X0+l1hV(*fB@YVfVWvfE#Dp`=eWFvFJ3kYZ+ZHKexF0c<5=r9_fK6)9YOJ;` z?Co5xc&NE%GMh`82sXI*H1p--)X&0`cy8(5Wjw8+*027!rp#QcW^bLq4+QQrjoe0cx69~?W#{@JX5o*hMrt$dF{-^gNeq8dWvlVI_TvZ z&C7j%^z?MJd1B_g&~}gtZxmhpxBYbO9+lm%&AYX7zW(P?mk41o{mI&p2u8{YJMORq ze&1d`XsFjsM85oWyx*y0Wp~0}(fptks$^DFZh4HgJ-5v?6J#kqrHOxkuXbSNEQm1k zupbQ~92q}fiho*6+Z$=}v0jk@uRJ3+WAp2YYO-8bjzYxeAR=jB< z2CdyqwtJ8XtGqmXUr%MPW)~>!Vm+#8_W>)j3PdPzV+*An7ti2IYzT=mYFw_%m}dXx zrp{uBHTv&|9{0MHF4(#95d)(1W(50fF6QO>omOCiX{KPz`czG|g_QucpE~<<=&e(>xZn3{{7TtQR>~qO*C`L~R^cpIQxcV3{}n}b!#^~l`YXNJr#5{nP1f>r0CtTzCBzWy5W9_Qel<~AOI^h< zcul(`i&EJPU}6^()>~lh2fpnm?c=#u*bM@K0q6UlYt7(9{;0;G8>6NVTBz`vMdY6? zVkirK*xAsb~-IeD8Dc?c>S?iK{3k1a)o8(luF) zumw`(G)qxjuSHwa+r=JFe`{&C*Psk`?1*JUGUsJgZ!h3_D#1)-%qbdVCp9pXG`(FH zo2Q*-V1T|N#SrNOMJ{e{Nxcfmmxq6eX_@z<#xxYG>Xba_mrlW*Pzbv(QU zVWR9nb%{d4SUNZEg1gjt>#TPXQc1AUUCj_OXguP~eRJR(_+(M-Sf;MRpJd>xIxw7ste7wf1=; zIlizN8|<)5*l8o%ag9p}^?fhgC&E=X5E9#1?*anurswzGk`(NPyI;K+7Fe!~BuS!(r)&X7 zke&mg>#ms@nS*V0WROw1f9!xgR?t?s9{RI+X_gfDk*5Pcf&FdeB~Km#kr0LoLL3%l z%1Hu)0s;IZM%g=V62(^VYp!n~y%*Fn{YEy@Sg0=b6g|_smAX$h1rTLP*tO1g&mA_? z{a@UM|CSKpG5Nl&QG>rAvyG)#G>Wfh6WP974j+pRCKKm=aAiWY8i@v+7q1dwu|QV? zN$U(;^DXFUrr-;YTQ6XE*~LL44*dQW{k`EN;`79?{m}TOnVD&3?gceT<(W|{rlm@Q zFw@ta)O9~xr8OXsE4m^HW$0+JFE)?~oZSn~{x6fG%J<)Fh(j743i=feN!NlQ_bGI< zDMEiqZeuOrI26y*@QSl&Fw~ZI)@{>Ii5EZ2iLVQD(KV{0gNSizR)#q!a-^Fw$Y@ec zn7lg`at_5ZmP$&O1akbU3L1fY2;1}e)$VeiRMQ*XzgpXK%bju|#5IB2wFpYeB@8Mj z+ErG1ouE_+vddu}N!mkbloHRkrbcvvfA*Z~_rm(ierHXFQb}*d>?BIC@-yXf{QTB+ zVd>+NN%SoYL4MWlW-&F9H0MA?j2mr#%bvK0ag>7a6sE8Dh8KW7eTJ-ntqvP#NT&!t zr6z=plEdM4JzxR$R?0z~oo2I0vqfy!-=AF!!vHz5odNlbtZ!eXRmAuCxZkEmUD<^N z4qL?Ftq^7s?+Z4D9wn<3rES3T1|Mnvg(*6yrGTAL23}_+Gkk~;Jah8JI4#M>U>${y zS3?_>m9&h}5F^picjilUg%D(d=z@QTM``yGO8?$7_Cu9c-W8RBgG@|1I^flxQ-USX z_D<%`#|}itRG*3qMeiA89o6Tn=+w@*JxwxA-SLY}E_0LRP=tEmCCUP`wrbuyw4)Lc{YX#a zgtS0|!*XMQfrW*I(bnS4gg_;z%yX>euJz&UrRNRJ|DDdIHl;h&e3~bbdKMhmExgkst4Gp8}nECt`Q*GxPJ~RGQoJr)uYVnzZp-AsCB59V)m?X}v zNv{eDI@%+Mr-}rPaTb>mFsD#r{#rVNLhK+$+cwE6tf?y%AU@c~%&~N^wIRZQ8SZB8 z-eFTK$8$KdIlnT{8W`Z;(xlbb@5My^k{yaE6t!vf)Nf%y_7{4`+>0EDUeGE)x?10q;S>avzNZ%$31!KJMp>^$x~TUaBr5w^pjRd%qYIEmdKu#&wiB4D%5P3?~>@a)eX*Rmm;8+K9neg4Yvk5yqZ5<@K2 zlbQP$g|zR-^@a9_Q<`mE`Lk}n07nW&iaa6gUy0bb=;9HG&eGn;Ta=limFHUxT;Z(8 z@Fd{%N~Y6I@ch9&Hqg~#va0Dbz_*7Q^}DPnq5uMzs39J())txNot#bR5MriQoZ0na zrYMFNbc>V^$nTc5C9UnaQcC5Bq!PZxXf9#uq)HxBKo3Cq@Qxo@d5RD*Snz|m!v zVa0Y2cMn$PB&;8fNA9iqtNENv*bz{6iNujH5F;5Tju`6Mhy-}|ahZ`&tOW_;i&a`} zu##teuuDE~J`Lkn(o>siDf?y{nH80k%#T3tvPMgqfZ=Gzdp_Jm7Kg&jk&wqaVPtUQ z#d^XrEk;BX(M7=7SfhbVphVos zWQywgjCTG@hKd=XwA0jL*hT9KVX)!tRyqp)PG|e;b1LY%``!gk9QYpt=Fmclf9xISi&DS7l!DWt}zb@8|RVh>~LgPq?(_cwwx(^D1}R6j1R z5&c{|5SRb#7Vb9$^zRf@fql_ zWirjeyE`6?=S6rd4{BPAwzA5pODl3OI8JIxGJ{nGuDzIujUHl6tk|{J^i#YGKe1k1 zQ7<#90piH@OTLao?!;6+f`2ad#ZzwV=b}f?N_xmbax+KFt%%IYNkyp z1S7p-7`3jp=DssUaXiJoLv^?`mlWMbj4-_NO}u0#j{>VoLvtF>?sq3Ha0bI5soPxz8j>hzy~xy!H%9_S9)0qf}2 za%FGN1=TgH-HPa}tt)t)LF5AmCmAxe zCsbZ$55*}SphmYuNSP@j9(B%HSO(LdM=HTNP@Xc8esF*DwlXeMu%Su$SD9&&~6%9cdG; zOxiN0j>2vlO?L-34j+PQ2GwV@fW-xIV?@Zn6q~jKMf{4iAb1dCV_AAM?P>~M-HKlY z_TB}5+AHNkE)uGYumy8A2waIdsYc??#r~pGy#SlCS9isYYiLSNfb=CyXc1@Hbw}+T z)f_uZ__+@*;9=F^-0RUMX>Z3K++)&QTTn=5Mmf2-$Vj~#za5VvBQ`}oV)U7RutZB) zzro?7`=j}09uF+NSt}U(&eU|9EptH0J;USU$!(wGR%C-$i-k@AyO;W32wD#Uzd8s&!5dH9$2oQN)Z z#M7~d7O&&?O(Uvq3~`!h78}$$GQstR_T0&3PcJLWKW~xONUZk8@We5uIZ#*fIIi+*}=&HCMm0R+&8IXa644kqmDZLa->1ZN4 zWejFhvc8+Gr#MDPa2B)~dru_?jnRy}seZ3So;VqylwEM`ZTicYo|R=}*XELJ-FLr3 z=>Gr+WZu`Nk`Memtu5^fh6M*iay?Y1F^!j*qF2*rw$ZA(n67gCiZj{FqwFxF`LB;)?fu_`|6A9A{nv?WGa=?!CAh#~Mm`wB z)(ezwI>N|iUFO&oA(!XGBpYu1`pxMin|VF&Ex}|nh(B$0yW=auCTFKrbx6P}>BLVo z!N*#ISKp&)4<8|DXfXwwk##6Imh^!2Fa{CM+2F+AJof8#me+kggj@AOrw!iMdy%G2 zo~I7S(iXZosacuQ-$~6kguCu_${oIimlin?WJI&k?x!Qs9={>Z`)XsH-#6C!;Wj#) znw8H%K{ojZWnx;BK?nb4YvwDBvC!sMmQ}GCK##CI6-}4&d1hn8p zU;aNwegaG&NoDl+k3<{Zn5`xw9DFv=S$`TJ%9;?j%*(Yg=#hczz$ElfUs!)9EIs|B zV@TJ7ouiM*PWkocSaY*G4*E2`9F7`ODreB0n6A9z>13v%Ry#iVl(|AmKrehh-lA5J zS@f4|_P5NXTEK8Dlqsl7CnrKsIxrK}M@;{Ge@y4R*+au5{2JLgGO9pUz~iFzxF!;3 zt?d=`^!4?0K_NK+A321jdDFM|FR-k3%vg0~!W*Kko+OziL;@ zI0=OLSYVU5H`2hk!LdQibk_=A?7is&fz8@Y?i+oU9d$Q^mK(P^)wrGXnSj zzSU^xU3b*=o$DOx98NystDb7DN3PGmseTX`tJH=G*i*4S!%v{O;+o)F-}VxhY@DHG z77BN${Q+P@Dm%b2(Kzz`z*R|A6qwa&e83n*9^##ySpiqMhVPbeDK(-k@2ta&vQ*2{%h?G@MrNN0TJ$%&fj=k95;>hWL|E8AOyKws0;_MG{%1Fmw+sQXM1ubB`zl~flviJ$;O!r2-| zupP)4=k;jb25n&;OsIUC*=R2jm7S>rzpNYAX(xCrEyK$VAK&g8{V&yaeo-!{Mf(_W zKmu#Q2iz_vG4VPDHb3z#((UPBqv=;G=U0|NLS?(gIagg?>5VTb@oq&nwDlyWa~Q^6 zPl||7;4ZlnSKYB3NXZrNC4}L|9V|7b*r9bnVw%{t7;O9RM%T=0DqA9~*E`V+ zzp&Rnm1e*(w74~kIcNt6WUaZa0s_r63)fKdj#%^X;i>%vD_LKs5Lf^@i&d)b9Y@LS z=}$~F9c!)z7lld*X<65;`CTW5*hWqRyVJK4?Jzd8rT zA)(ZprPV8(mOLMyeL!3zo$aw>PU$~Sq5`xrPAYs4_Z;;#vR(rkittc;{JzadCzHyb zxBa0Cm)2ExLPR!VWUl*jR8p3yIEc`?wv_9sUpXYaYE_7BXInYyqOQ|7pfR%Alvw0o z9ZgFmwrSV)`gr|y4>USldMsVEx$w7q75gx1D<&o0kGpNyLn0*LOcwdyP?$!vKZs_nARh>^8w zx~~)&^)UD}nVeyhN3nqtReH-tWpxFXh?ST9{&t>+;zDNWac2`<)9iZVS7s3l>2DCi zFG@LyOEq`h48$&knN-gTb7!+KGOoMF7muoZndSLM(Opyh1oPxYqTCx#_`rt`7Z*Fn zqZY+r6D{75VQ0smCLFY|#|g3h`6w`mHf72{FNbb;*LZ8(@Vn=9@O4WbEvs}e`IRT= zZ(Uu3R6~2n7?w*?YL$WwRdba)RS8Z+r;;$@=lrTjVXZtz#=Ynh^y zvi9=N)J;o9b1xYY{?E4dV^Dz%@&fkw8?bpAn{=>0e#QS&O}`KjQszWTw_mjFvAQ(i z#9eUp<1PM6Jb;{d?2L<%lv}ClKIi1*6R9-)tuhw9t8edlY$jg)J9KaP%$y~oJs$MP z)aQCQjFC^y{Ba|!3xpZekzCl`KxOYO%K-fR>}hH zdkw*bje>h})u&=h9jMy!9~fG)hwURg6Aawv=|W`{s3vXueg~feRtHsqgdSBg1d(QG zXW!uyz{f=Thmo=&?++#5gt@bU)@rC3#wGPN<@cOOS)N7GNe0oq7kC-WAKxqcf^JgpH7HPv>Ft$d6EXy=klsk zOGOG-f3qUHq~>F%+eguT#RQ;n1)vq_|6}ymD#|u;{OuF)hx^4B%f0IqwLs9 z$0d^nUi%ob9_GvOIqGgR^pqscPKFUQa6kn%K*yCI z9L2WX6ldo0_ccG9RVO1;0gcV5SwIz-5w9dawA4+es?nG01umcU@2_Bl3h)(-O|G!H zvRKy_6K+fLJC;Yq-;#5^wU7};f5$^!{eT31e}z4|?tT4%YrLncX_3aEL6&0G(Ub)h z2b@OEk2y`mNNwG$G*%Op<^6Eg4&W%L$uC!a(vdy}B) zuWwa+s4Qc0#$IKqgWz<`1FS-M^!Jqd@21F;d`F|-h_F-0?no>>3Okw8P`#x>xcx>0 z)r6|+{++o)b~Uua(LH+m@yq|n!$+rIz+yN1K~@nG7b8p6Uo~n)+oLJR>q5Ltk%xY%@51l9 zUnfL7#(Nklp#vG=U;>L_Sm)t3UWR6>El<-518z5ctq-mm{T~yRHakDYDun`&hMhS& zz3y{Fw<6Jezg%uNrZ5IPMK|ULk5-?C+>E!sGzbs5VmxM*ZOHM$mhzu9=3R(} z_iwwm$^z+7XTp^OoJXvkp8T9p^JFH;>b32OvRqgsXQn_uv0_3!|56AgyR%yg)rU7p zz@HGHs{m_vDl$pUUtX1$4_lnIy{pNjfFj$ja~mHFAarqn^q$8&?f(ABQd(^4=ET zot)%EKQ%R{UWQBMYA*GLk2r+BIcG*<@o=pe;oivqop^*7<2-jmpDk@| z%LKgJxF-FJ3ht+`X2+GG9jo>SMGOK2M#jD&CPIGdf^Tm(eOggS_In#aYk%K%>3p1e zNKe=Ce+m=vI*pR(^3rGC7`SGXhWEtXds*y>+B&X)07lS9e+RV@PtimresDqwmzZ@t zb)4n2Her7>d)b-W^QxW(+!q4Ljp)EVCsyPKAgVI;@ExA){)qP5DaVD#!|9Cy|Ml9w zg+&R^7o}@5K+rYYb}Tfp$6-Et)C!Duhgj^(k;nH#{I}UkTTj`kavj=Ov@eLet2~Dd z6(ICx5Xj+dV%wF^Qe1I`v(YzOU@vxTMzYt0X!-)+yAyqPrXu$o^l2uDIiNr8#OD@G z+ghlZg{yO2>s0^I!AcBcq;Kt}L)jG+r(okEe_X1$e%^E8aHGVISw7olMS^CNxRk9a z$wKwv#65uL@a;TFEcq1>uorEWQ0jiVv@pF4mTJFq{oLAmI)2JuH89ZSGU-PqnqYZz zoLeBRdCr*eIvDr18LBBk*eU#)7L48lj~6_*6p*z(LDzPMEb=X5TvWRj{Kw4L^NR^`Yj50L=&HA# zS?bFfpD7aouK%W{B~I0`LTxl(BsoT`U_tmm@&fBmBGDZ7|Biw{^})0fm`uH*!qz5g z6b&^Oa9Z7W%lVT&q|6a}1Fz8~>_)ZC34eIUC*_Zfu&?d$j6a&Cp3Qddh!3o2&cBeE zFlLvvx970YO)K5*Z=EVLIAXs^aKz1lGZ6VZiVSW2?db>w)I3~M!(=Gfs$)NKnZplM zBUnL4*z`6+GQkIZvY|vz&g5`8_HwcKI6T^Ty{T^`_1`2-aS2BpyithD9nNU9Z8;1A z_t9l^nyri*(nVnae}=EGGw=*vZXI$^U|Ruz+_k1!PJR$fo3(69TPQjp+2~i&(lXpU zUU?IRK^VS;D%mX9$x>m0f5DqnG@vPryjwoLolzPV@p1~|^-y3n1MZam{RVz{3`^VJ z)99>EN(}rUclDj96LeR6XPXx^bvhn-HxV%CK6jk5_NYvFyzbN1W3p;zt3tfqRO*PiTH6i z@Bjimc@?9p4^r4qpNlpno+y|UU0%Q8zhdqttj4U@{Dbr5C;7o`r$6^DIzF=P@yW_p z!dqCb_xl!-aq-?>8v{6zvsBXKwtDfy#Es%)@P7;%0q`Nc{sEx{1i+`icQKoMu!c=u zY{j9-y#o~qyE&~PsmZU(&(xjRbl?7=lGE_eFFfYB%wFg+N7{nhqsZ6DH1TOc!2+!0hjoInh5HD-vGQ2rF?7&18(=IH~5cW6|Kaf)jkBsAmV1 zIMi0X*Zc3J<6}f+QnVAG2ww=wE_f!b4(oR>m&gcth%O@!#y7*cu?2(ZmXMT==Sja< z!F$iUxE2MLOxk5zj>4~AM|X{+e!JZWFx-DGk997V&h8_e@|~7kf3e!^->x{cdfn`o zyBv(Cak=mVlA*a*;99N%Fgl&!of*EC=xC@N(4K-#F%~^Ct1DU$mrOq4$LDP6*TZPWLX>9DOdC@2A^g^#*HN z#$e3Hg_8vP>{v?ZrrJI?!9-#M!=v+^Y2MEBy2wIh{Z%~DFo}g-FB7Xc4nZ*VI3!c? zxWfSt-HB_=VN7(=AU1ii8M)37%k%=IpC$U~E!|G1o3Di>{L+?>A@=m9W=}KC-6h2M zn9VRI=*X7#6}s&W&$3Lwqh3rTb0(hU#p8NoCk|IuD8j*bw8(3|jQjZ#SV#|y{Q>np zC52rCybk50VJjk{y-#HQN3)^%KAqs~On}D~RQrAWHE#+Py*gO_*NP=;N$Ho?1V7Y^76Y}egsxe*oH-}pe6_ssA$%I2^(co_A{DywKtPA$zX;$E(JId4E2@b+#=UlmKb zs4Xs^g8PS+(nQW@u~?`v?F)OEm+A6LN~*2oPfAK;Oq@cEp67E4pp1x9Fn?09S+|hO zAv_!*Mid~k16`?-CQdO%(>#!X_@)OtkuSn!RTpc|K(*8&Le?%8+qe8Sw~AQRa-U2G?UAVn!zOf>Fq`k0>f z!MCIx`YJ|~#>n`@KcZ<{^m(Kg#%OT(;F?6aq<3;-Zl!n|RTEfXw`ELWB;kAg6ZB1? z(retGrp}qp&KZLl^L}i`>wn~vLgv$)-KlA&a?InOa6E9+wjvYK*xDGzz+IhI z_jmG*KV5w)z=!WLIRLs$B#`<~AWcZEzD5vzf}Xj#tJK5K`3~NoIISG!@3_VN?EUfA zrfv|Yx#E@ayBHvvEiqJOrN>UB5zl6&MH|gFFfYB(kx)ZdrS*khoGpqJT}tOmK@O#< z8l@}tn~6{DOS2F-^tzkuWtzIsJYu{89WeD20??6VB!4uXf`>UyB|K=OLEEpYJp4g= z8h##~_yx>|tZ@}`$uW$0Cz#bn;yRiM*jNBqOJYJ>fRHZcg`58_OVWcWNq=h7Po~x@ z@DgbFIAW*$1J4DyK-4T+Tf$3n+k+kZ4@XHD6=iQXFEpd0=8Tn$W<;^+W5}h1xcp!Z z<4apM`Gc;;n6^3!z1u&rs)F^0*q_Y+7}|So3jSB^{*a6?7U$2~+dXrw=%SG;>=Jmr zJKk`~v#?)~f$f5L$8=}08$D|928 za~P>LwWcl2gy&gb50qT=_|boxHVp8&E~&{f{}ehSciwSsuS)+<4LeC$?Z-FBdMPIh zVi;=dIAujxEt&LR&-J-^h|lvXTkkiC#a_~R+umLQHBsr*msv2*8@{+F5DYg?VJk_) zs}P0V^j`gQ>dP5ES^)e|&KE?^D00CF@X}A%7+?Aud&$b~FFtXJ@QtZdWcR=GxMU3Y ziWa-l=DX5C2<|Qk7OHuLdh+_BE{QKU+?xc;7uPnQQn4H6IqJ_m|62r!sA&9Yr-gwO z4PC%OlqrYRD-`OOTM?^Ua+O%18e?9@mYPGE;gq>1M$5#ZXONe%Sa1{!{uyXU9Nk9@ z(sM-uCUa@z2FIs};BdzAp+RHjD!oUJV66tNuo>J*IQl(Z^;a%fE+e?OcBMQkSg7E<;5bIS zU~0Xo1hgm_Dkg~Yu*g5;@G_89mO;ddn-)CRDHz)mqL+pSRJNH~+~p zX0y|FF9wb+N*hco!54$zWdgXfKRH_T1kgJY_d-xoo7#M_AdpVJ>p&G^m`tr;&m#y0 z6}9A|Njj$&yl}J?(w=2OPPj0Vv(a}up#rJ={j00sYi~6uxCYXWF)4c(-*N5#3w`1Y zfa8;)_T06JC!CN6_{xc3){cwCsF4$E7!_KXD0|Rt;6lw@l{{Qq3(TbC25Y#IR&0A5 zsdR3Lhq-o^H~2GA9OYTdK64Bookh^>n_I{uYG_e*+)H?^go8Tfb5 zS8fbR8cJ8biJ#N z#4I!=M&0KcDH+q?u-amB1!7Polfs0RF6tU!ely%#>&`{OH#_Y)7o=eQ^&gkUA)oVEE~Og{Oc_L2GD zO3(MCRLkCfX5OyzWhRG>rn%XRh{x`6MIoT`p<<9&WOLF4_1<%4c;Y|Ha~&5Ysx zbnW7<$-wXBO;cCfcMX(Rj@Vt)QT%jK*;ajdt>AvX*66*~AM#x{6yusNb-5)EEP_*b zYF-L>+*4)bLJorm7NR4um(rk}=5lzSw-o{=CdS^cV*S(ipo1r4gkClb8fFQb8|04J zuCx6d+H=}Y#|=}uTzFVI?5EVf6Wb-IYA^z+E!`Zm?ChxZ@m~pGV5xiUh%VVG>_qBE z6%I`uW{P8(nHDZG80JW=ME$&3UPr15guRZnVAw^FKP&LO1A*Q9LGk0th{RGKvV7up zWD<2cGtrO086{X@P}zT2Q>N`BO~D3JT2kQEZr`xNtzwJ_EK0HABMOk9Y9+JLSft{E z=&Z#xBs0ptKQgtKkB%pdW=?aAoz{u})OendeIY@O5o5Qcm`W80fG6Qa!k=29<$iT8 z9QlI}IFk$qk7{!EH`aSxG8PhfE5`fU^S~TC@ddo*^mOJ|B_a@oRPtiEoGv%qTI}=gM(qXOODuVzhm(7#KthnFKYRR;6=4aJd%1RVT zETaY86^k>+4dB5bN#ymK{ttSDq=ElV*2l}s2uO+dq3wxw8Ap}JG=V#mQ;I|COQIVj zpisJWr6nyV?SRXv}s$(zi7liXzP z_uPB%!EvKYo52T*+E}@Sl)bYvxiXSxO2&+!Vjwx1=@RBN}@+2y{Yx zyc^&-VrLm~uo@UnT4}$3T|AoEgo-s$n1yGu3nVO_MvvcR1NT$SaZK&7fYe#+Xi?>v zN6vh2=D+7J|6O^d6ZJrE5MQ_DEEYLyAGNb_RQ-gDFt&epa#Z%lZ11T0UKLf+1Oa9w zj;Eu0LF$-(l)l+jBTZgRYowB#mIDPS==-`z;i8+Ibm;xp;mBm}2r@48gPQ5yjb39b z>3N>W!k>g*-%wX)lRI_uwU|jqhP`!ZC{>g9I!)_cKvV8*BxOyzKw=6N|7m&TyB0Y|GnViVxxOlH?Zw` zY`;*d;B#30bk2_~z7%TjVk=E|U5DNnF2gfUq`$mNMHimt`K0wdlhV&Jqpl!AUwJUV zvfb!YN;~R>@X@G}UrD@AOh2$ z>67<>m-<3p8M7wLy@>j8iFR+$Y;{8v`mcFkhcL&NeI>uIO!9;pT6E$YtpwlMsbX#f z

        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
        txnmvZXw(2=<=qgL_ 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 literal 0 HcmV?d00001 diff --git a/examples.md b/examples.md index 3e5e7cdb935..4aae0f0127c 100644 --- a/examples.md +++ b/examples.md @@ -50,6 +50,17 @@ A case study of creating a colorful interactive [choropleth map](http://en.wikip A tutorial on how to manage groups of layers and use the layer switching control. +*** + +The following tutorials use features available **only in Leaflet 1.0**: + +*** +[][8] + +### [Working with map panes][8] + +How the default map panes work to display overlays on top of tiles, and how to override that. + AZ2P3t-oQ9yZoQ5{N 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

        _hbxl?5mz)Ed*;x@)_9KNl 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 BKw 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 ?#LrxDh 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%0Acw7sK)u@m?_Be{owu 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

        +}).addTo(mymap);
        Make sure all the code is called after the `div` and `leaflet.js` inclusion. That's it! You have a working Leaflet map now. @@ -65,11 +65,11 @@ It's worth noting that Leaflet is provider-agnostic, meaning that it doesn't enf ### Markers, circles and polygons -
        +
        Besides tile layers, you can easily add other things to your map, including markers, polylines, polygons, circles, and popups. Let's add a marker: - var marker = L.marker([51.5, -0.09]).addTo(map); + var marker = L.marker([51.5, -0.09]).addTo(mymap); Adding a circle is the same (except for specifying the radius in meters as a second argument), but lets you control how it looks by passing options as the last argument when creating the object: @@ -77,7 +77,7 @@ Adding a circle is the same (except for specifying the radius in meters as a sec color: 'red', fillColor: '#f03', fillOpacity: 0.5 - }).addTo(map); + }).addTo(mymap); Adding a polygon is as easy: @@ -85,12 +85,12 @@ Adding a polygon is as easy: [51.509, -0.08], [51.503, -0.06], [51.51, -0.047] - ]).addTo(map); + ]).addTo(mymap); ### Working with popups -
        +
        Popups are usually used when you want to attach some information to a particular object on a map. Leaflet has a very handy shortcut for this: @@ -105,7 +105,7 @@ You can also use popups as layers (when you need something more than attaching a var popup = L.popup() .setLatLng([51.5, -0.09]) .setContent("I am a standalone popup.") - .openOn(map); + .openOn(mymap); Here we use `openOn` instead of `addTo` because it handles automatic closing of a previously opened popup when opening a new one which is good for usability. @@ -118,7 +118,7 @@ Every time something happens in Leaflet, e.g. user clicks on a marker or map zoo alert("You clicked the map at " + e.latlng); } - map.on('click', onMapClick); + mymap.on('click', onMapClick); Each object has its own set of events --- see [documentation](../reference.html) for details. The first argument of the listener function is an event object --- it contains useful information about the event that happened. For example, map click event object (`e` in the example above) has `latlng` property which is a location at which the click occured. @@ -130,10 +130,10 @@ Let's improve our example by using a popup instead of an alert: popup .setLatLng(e.latlng) .setContent("You clicked the map at " + e.latlng.toString()) - .openOn(map); + .openOn(mymap); } - map.on('click', onMapClick); + mymap.on('click', onMapClick); Try clicking on the map and you will see the coordinates in a popup. View the full example → @@ -141,24 +141,24 @@ Now you've learned Leaflet basics and can start building map apps straight away! From a32017f8904c9f3718dc5a27403678e96194ebe5 Mon Sep 17 00:00:00 2001 From: Bjorn Sandvik Date: Mon, 7 Mar 2016 12:53:50 +0100 Subject: [PATCH 2080/2207] Stop drag propagation, fixes #4249 --- src/dom/Draggable.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index 0056e8d02bb..a4faa1ed782 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -60,6 +60,8 @@ L.Draggable = L.Evented.extend({ if (this._moving) { return; } + L.DomEvent.stopPropagation(e); + this.fire('down'); var first = e.touches ? e.touches[0] : e; From 98e87d3d94d8706f14fc329d8191c6d83f97e424 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 7 Mar 2016 23:12:39 +0200 Subject: [PATCH 2081/2207] Revert "Stop drag propagation, fixes #4249" This reverts commit a32017f8904c9f3718dc5a27403678e96194ebe5. --- src/dom/Draggable.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dom/Draggable.js b/src/dom/Draggable.js index a4faa1ed782..0056e8d02bb 100644 --- a/src/dom/Draggable.js +++ b/src/dom/Draggable.js @@ -60,8 +60,6 @@ L.Draggable = L.Evented.extend({ if (this._moving) { return; } - L.DomEvent.stopPropagation(e); - this.fire('down'); var first = e.touches ? e.touches[0] : e; From 8aa32484b46a3b0fdaf2f5586a282ea5f99f28ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 8 Mar 2016 16:58:36 +0100 Subject: [PATCH 2082/2207] Port #4173 to master --- src/layer/vector/Canvas.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/layer/vector/Canvas.js b/src/layer/vector/Canvas.js index f61fcf483a8..935f3df60d5 100644 --- a/src/layer/vector/Canvas.js +++ b/src/layer/vector/Canvas.js @@ -74,6 +74,11 @@ L.Canvas = L.Renderer.extend({ }, _updateStyle: function (layer) { + + if (layer.options.dashArray) { + layer.options._dashArray = layer.options.dashArray.split(',').map(Number); + } + this._requestRedraw(layer); }, @@ -133,6 +138,8 @@ L.Canvas = L.Renderer.extend({ ctx.beginPath(); + ctx.setLineDash(layer.options && layer.options._dashArray || []); + for (i = 0; i < len; i++) { for (j = 0, len2 = parts[i].length; j < len2; j++) { p = parts[i][j]; From 2147c4c879732a3994c4cf9efaa5180bf4e2e090 Mon Sep 17 00:00:00 2001 From: Chris Whong Date: Tue, 8 Mar 2016 16:21:54 -0500 Subject: [PATCH 2083/2207] Add demo link for leaflet-globe-minimap plugin --- plugins.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins.md b/plugins.md index cfd2efdfcb6..cde08db1707 100644 --- a/plugins.md +++ b/plugins.md @@ -2106,7 +2106,7 @@ Display two maps at once. One of them might be a different size and zoom level, Leaflet.GlobeMiniMap - Simple minimap control that places a 3D Globe in the corner of your map, centered on the same location as the main map. + Simple minimap control that places a 3D Globe in the corner of your map, centered on the same location as the main map (demo). Chris Whong From 66f6843bcd0e97b3c7e3c90c89a0b957dcd0bbb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Couesnon?= Date: Thu, 10 Mar 2016 18:54:00 +0100 Subject: [PATCH 2084/2207] Fix #4313 : correct simulated click handling in L.Path --- src/layer/vector/Path.SVG.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/vector/Path.SVG.js b/src/layer/vector/Path.SVG.js index f53063679d8..9734e660b34 100644 --- a/src/layer/vector/Path.SVG.js +++ b/src/layer/vector/Path.SVG.js @@ -129,7 +129,7 @@ L.Path = L.Path.extend({ }, _onMouseClick: function (e) { - if (this._map.dragging && this._map.dragging.moved()) { return; } + if (!e._simulated && this._map.dragging && this._map.dragging.moved()) { return; } this._fireMouseEvent(e); }, From 1fc7d37ec197dee6d500f037c9227cc708bf11f1 Mon Sep 17 00:00:00 2001 From: Bouchoucha Jordan Date: Fri, 11 Mar 2016 13:50:53 +0100 Subject: [PATCH 2085/2207] Update quick-start.md (small correction) When you need to make sure that the map container has a defined height with : #mapclass { height: 180px; } that's not working. Because we did this before :
        Rename "mapclass" to "mapid". It's more clear for beginner who can just copy/paste code. --- examples/quick-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/quick-start.md b/examples/quick-start.md index 7683645a05a..bc0da67598f 100644 --- a/examples/quick-start.md +++ b/examples/quick-start.md @@ -31,7 +31,7 @@ Before writing any code for the map, you need to do the following preparation st * Make sure the map container has a defined height, for example by setting it in CSS: -
        #mapclass { height: 180px; }
        +
        #mapid { height: 180px; }
        Now you're ready to initialize the map and do some stuff with it. From 5f7c2e07d6ea4c389cc8e7b975945ccfbf4bcac5 Mon Sep 17 00:00:00 2001 From: mouradeolive Date: Tue, 15 Mar 2016 13:55:46 +0100 Subject: [PATCH 2086/2207] fixing this._times.length undefined in Map.Drag.js Update Map.Drag.js Update Map.Drag.js --- src/map/handler/Map.Drag.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/map/handler/Map.Drag.js b/src/map/handler/Map.Drag.js index 3d9cc1664f6..346775d7b74 100644 --- a/src/map/handler/Map.Drag.js +++ b/src/map/handler/Map.Drag.js @@ -38,6 +38,8 @@ L.Map.Drag = L.Handler.extend({ } L.DomUtil.addClass(this._map._container, 'leaflet-grab'); this._draggable.enable(); + this._positions = []; + this._times = []; }, removeHooks: function () { From 8da61993d2b42e83d53e95e3b45a67aa79f6a4fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Thu, 17 Mar 2016 14:46:15 +0100 Subject: [PATCH 2087/2207] Added four prosthetic-hand tests, checking mouse&touch drag events and touch-zoom --- package.json | 1 + spec/.eslintrc | 3 +- spec/index.html | 6 ++ spec/karma.conf.js | 1 + spec/spec.hintrc.js | 2 +- spec/suites/SpecHelper.js | 8 +- spec/suites/layer/tile/GridLayerSpec.js | 2 +- spec/suites/map/handler/Map.DragSpec.js | 76 ++++++++++++++++++ spec/suites/map/handler/Map.TouchZoomSpec.js | 83 ++++++++++++++++++++ src/core/Browser.js | 2 +- src/map/handler/Map.TouchZoom.js | 6 +- 11 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 spec/suites/map/handler/Map.TouchZoomSpec.js diff --git a/package.json b/package.json index 908973f657d..76cf192721f 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "magic-string": "^0.7.0", "mocha": "~2.3.0", "phantomjs-prebuilt": "^2.1.4", + "prosthetic-hand": "^1.2.0", "uglify-js": "~2.4.23" }, "main": "dist/leaflet-src.js", diff --git a/spec/.eslintrc b/spec/.eslintrc index 97bd9a1cb2e..7d186a25cdf 100644 --- a/spec/.eslintrc +++ b/spec/.eslintrc @@ -12,6 +12,7 @@ "globals": { "expect": false, "sinon": false, - "happen": false + "happen": false, + "Hand": false } } diff --git a/spec/index.html b/spec/index.html index de4454e7c2f..9c158556a1e 100644 --- a/spec/index.html +++ b/spec/index.html @@ -11,9 +11,14 @@ + + @@ -84,6 +89,7 @@ + diff --git a/spec/karma.conf.js b/spec/karma.conf.js index b48792e40d3..d73fe0467d9 100644 --- a/spec/karma.conf.js +++ b/spec/karma.conf.js @@ -9,6 +9,7 @@ module.exports = function (config) { ].concat(libSources, [ "spec/after.js", "node_modules/happen/happen.js", + "node_modules/prosthetic-hand/dist/prosthetic-hand.js", "spec/suites/SpecHelper.js", "spec/suites/**/*.js", {pattern: "dist/images/*.png", included: false} diff --git a/spec/spec.hintrc.js b/spec/spec.hintrc.js index 3dc6f04421f..f565701a741 100644 --- a/spec/spec.hintrc.js +++ b/spec/spec.hintrc.js @@ -1,7 +1,7 @@ { "browser": true, "node": true, - "predef": ["define", "L", "expect", "describe", "it", "sinon", "happen", "beforeEach", "afterEach"], + "predef": ["define", "L", "expect", "describe", "it", "sinon", "happen", "beforeEach", "afterEach", "Hand"], "strict": false, "bitwise": true, "camelcase": true, diff --git a/spec/suites/SpecHelper.js b/spec/suites/SpecHelper.js index 3f1d39644dd..5e4d4e43776 100644 --- a/spec/suites/SpecHelper.js +++ b/spec/suites/SpecHelper.js @@ -75,5 +75,11 @@ happen.drag = function (fromX, fromY, toX, toY, then, duration) { }, duration || 100); }; -// We'll want to skip a couple of things when in PhantomJS :-/ +// We'll want to skip a couple of things when in PhantomJS, due to lack of CSS animations it.skipInPhantom = L.Browser.any3d ? it : it.skip; + +// A couple of tests need the browser to be touch-capable +it.skipIfNotTouch = window.TouchEvent ? it : it.skip; + +// A couple of tests need the browser to be pointer-capable +it.skipIfNotEdge = window.PointerEvent ? it : it.skip; diff --git a/spec/suites/layer/tile/GridLayerSpec.js b/spec/suites/layer/tile/GridLayerSpec.js index e34c3d7e471..fdbe25481a6 100644 --- a/spec/suites/layer/tile/GridLayerSpec.js +++ b/spec/suites/layer/tile/GridLayerSpec.js @@ -124,7 +124,7 @@ describe('GridLayer', function () { }); // Passes on Firefox, but fails on phantomJS: done is never called. - xit('only creates tiles for visible area on zoom in', function (done) { + it.skipInPhantom('only creates tiles for visible area on zoom in', function (done) { map.remove(); map = L.map(div); map.setView([0, 0], 10); diff --git a/spec/suites/map/handler/Map.DragSpec.js b/spec/suites/map/handler/Map.DragSpec.js index 38f9771996b..d7dbac4b5f2 100644 --- a/spec/suites/map/handler/Map.DragSpec.js +++ b/spec/suites/map/handler/Map.DragSpec.js @@ -35,4 +35,80 @@ describe("Map.Drag", function () { expect(map.dragging.enabled()).to.be(true); }); }); + + + describe("mouse events", function () { + it("change the center of the map", function (done) { + var container = document.createElement('div'); + container.style.width = container.style.height = '600px'; + container.style.top = container.style.left = 0; + container.style.position = 'absolute'; +// container.style.background = '#808080'; + + document.body.appendChild(container); + + var map = new L.Map(container, { + dragging: true, + inertia: false + }); + map.setView([0, 0], 1); + + var hand = new Hand({timing: 'fastframe'}); + var mouse = hand.growFinger('mouse'); + + // We move 5 pixels first to overcome the 3-pixel threshold of + // L.Draggable. + mouse.wait(100).moveTo(200, 200, 0) + .down().moveBy(5, 0, 20).moveBy(256, 32, 200).up(); + + setTimeout(function () { + var center = map.getCenter(); + var zoom = map.getZoom(); + document.body.removeChild(container); + expect(center.lat).to.be.within(21.9430, 21.9431); + expect(center.lng).to.be(-180); + expect(zoom).to.be(1); + + done(); + }, 100); + }); + }); + + describe("touch events", function () { + it.skipIfNotTouch("change the center of the map", function (done) { + var container = document.createElement('div'); + container.style.width = container.style.height = '600px'; + container.style.top = container.style.left = 0; + container.style.position = 'absolute'; +// container.style.background = '#808080'; + + document.body.appendChild(container); + + var map = new L.Map(container, { + dragging: true, + inertia: false + }); + map.setView([0, 0], 1); + + var hand = new Hand({timing: 'fastframe'}); + var toucher = hand.growFinger('touch'); + + // We move 5 pixels first to overcome the 3-pixel threshold of + // L.Draggable. + toucher.wait(100).moveTo(200, 200, 0) + .down().moveBy(5, 0, 20).moveBy(256, 32, 200).up(); + + setTimeout(function () { + var center = map.getCenter(); + var zoom = map.getZoom(); + document.body.removeChild(container); + expect(center.lat).to.be.within(21.9430, 21.9431); + expect(center.lng).to.be(-180); + expect(zoom).to.be(1); + + done(); + }, 100); + }); + }); + }); diff --git a/spec/suites/map/handler/Map.TouchZoomSpec.js b/spec/suites/map/handler/Map.TouchZoomSpec.js new file mode 100644 index 00000000000..44a05b51ba9 --- /dev/null +++ b/spec/suites/map/handler/Map.TouchZoomSpec.js @@ -0,0 +1,83 @@ +describe("Map.TouchZoom", function () { + it.skipIfNotTouch("Increases zoom when pinching out", function (done) { + var container = document.createElement('div'); + container.style.width = container.style.height = '600px'; + container.style.top = container.style.left = 0; + container.style.position = 'absolute'; + document.body.appendChild(container); + + var map = new L.Map(container, { + touchZoom: true, + inertia: false, + zoomAnimation: false // If true, the test has to wait extra 250msec + }); + map.setView([0, 0], 1); + + var hand = new Hand({timing: 'fastframe'}); + var f1 = hand.growFinger('touch'); + var f2 = hand.growFinger('touch'); + +// L.DomEvent.on(document, 'prostheticHandStop', function () { + setTimeout(function () { + var center = map.getCenter(); + var zoom = map.getZoom(); + document.body.removeChild(container); + expect(center.lat).to.be(0); + expect(center.lng).to.be(0); + + // Initial zoom 1, initial distance 50px, final distance 450px + expect(zoom).to.be(4); + + done(); + }, 100); + + hand.sync(5); + f1.wait(100).moveTo(275, 300, 0) + .down().moveBy(-200, 0, 500).up(100); + f2.wait(100).moveTo(325, 300, 0) + .down().moveBy(200, 0, 500).up(100); + }); + + + it.skipIfNotTouch("Decreases zoom when pinching in", function (done) { + var container = document.createElement('div'); + container.style.width = container.style.height = '600px'; + container.style.top = container.style.left = 0; + container.style.position = 'absolute'; + document.body.appendChild(container); + + var map = new L.Map(container, { + touchZoom: true, + inertia: false, + zoomAnimation: false // If true, the test has to wait extra 250msec + }); + map.setView([0, 0], 4); + + var hand = new Hand({timing: 'fastframe'}); + var f1 = hand.growFinger('touch'); + var f2 = hand.growFinger('touch'); + +// L.DomEvent.on(document, 'prostheticHandStop', function () { + setTimeout(function () { + var center = map.getCenter(); + var zoom = map.getZoom(); + document.body.removeChild(container); + expect(center.lat).to.be(0); + expect(center.lng).to.be(0); + + // Initial zoom 4, initial distance 450px, final distance 50px + expect(zoom).to.be(1); + + done(); + }, 100); + + hand.sync(5); + f1.wait(100).moveTo(75, 300, 0) + .down().moveBy(200, 0, 500).up(100); + f2.wait(100).moveTo(525, 300, 0) + .down().moveBy(-200, 0, 500).up(100); + }); + + + +}); diff --git a/src/core/Browser.js b/src/core/Browser.js index 937e76301f1..7fb54c7a977 100644 --- a/src/core/Browser.js +++ b/src/core/Browser.js @@ -24,7 +24,7 @@ gecko3d = 'MozPerspective' in doc.style, opera12 = 'OTransition' in doc.style; - var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window || + var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch)); L.Browser = { diff --git a/src/map/handler/Map.TouchZoom.js b/src/map/handler/Map.TouchZoom.js index daaa86c7757..ddc9789daa3 100644 --- a/src/map/handler/Map.TouchZoom.js +++ b/src/map/handler/Map.TouchZoom.js @@ -98,7 +98,11 @@ L.Map.TouchZoom = L.Handler.extend({ .off(document, 'touchend', this._onTouchEnd); // Pinch updates GridLayers' levels only when snapZoom is off, so snapZoom becomes noUpdate. - this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.snapZoom); + if (this._map.options.zoomAnimation) { + this._map._animateZoom(this._center, this._map._limitZoom(this._zoom), true, this._map.options.snapZoom); + } else { + this._map._resetView(this._center, this._map._limitZoom(this._zoom)); + } } }); From bb2bcd69b6b54982665f41872b641e5240eae615 Mon Sep 17 00:00:00 2001 From: Lucas Moura de Oliveira Date: Fri, 18 Mar 2016 15:29:35 +0100 Subject: [PATCH 2088/2207] Fixing a typo Replaced ',' with ' )' --- reference.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.html b/reference.html index b5c60324b3b..138db926105 100644 --- a/reference.html +++ b/reference.html @@ -804,7 +804,7 @@

        Methods for Layers and Controls

        addLayer( - <ILayer> layer, + <ILayer> layer ) this From 3814292288f433a28a070fb2487560c9805a93a3 Mon Sep 17 00:00:00 2001 From: Maxime Opsommer Date: Fri, 18 Mar 2016 16:23:20 +0100 Subject: [PATCH 2089/2207] Fixing some syntaxes erros --- reference.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reference.html b/reference.html index 138db926105..29274835753 100644 --- a/reference.html +++ b/reference.html @@ -211,7 +211,7 @@

        Map State Options

        maxBounds LatLngBounds null - When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view. To set the restriction dynamically, use setMaxBounds method + When this option is set, the map restricts the view to the given geographical bounds, bouncing the user back when he tries to pan outside the view. To set the restriction dynamically, use setMaxBounds method. crs @@ -1905,7 +1905,7 @@

        Options

        zoomReverse Boolean false - If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom) + If set to true, the zoom number used in tile URLs will be reversed (maxZoom - zoom instead of zoom). opacity @@ -3517,7 +3517,7 @@

        Methods

        Number - Returns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia + Returns the distance (in meters) to the given LatLng calculated using the Haversine formula. See description on wikipedia. equals( @@ -5304,7 +5304,7 @@

        Methods

        <HTMLElement> element? )
        Number - Schedules fn to be executed when the browser repaints. When immediate is set, fn is called immediately if the browser doesn't have native support for requestAnimationFrame, otherwise it's delayed. Returns an id that can be used to cancel the request + Schedules fn to be executed when the browser repaints. When immediate is set, fn is called immediately if the browser doesn't have native support for requestAnimationFrame, otherwise it's delayed. Returns an id that can be used to cancel the request. cancelAnimFrame( @@ -5848,7 +5848,7 @@

        Methods

        this - Run an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default) + Runs an animation of a given element to a new position, optionally setting duration in seconds (0.25 by default) and easing linearity factor (3rd argument of the cubic bezier curve, 0.5 by default). @@ -5883,7 +5883,7 @@

        Events

        Draggable

        -

        A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging. Only works for elements that were positioned with DomUtil#setPosition

        +

        A class for making DOM elements draggable (including touch support). Used internally for map and marker dragging. Only works for elements that were positioned with DomUtil#setPosition.

        var draggable = new L.Draggable(elementToDrag);
         draggable.enable();
        
        From d5e78e22531f64b4bcf024b08413a525d8139fa1 Mon Sep 17 00:00:00 2001
        From: Jan Pieter Waagmeester 
        Date: Mon, 21 Mar 2016 11:51:24 +0100
        Subject: [PATCH 2090/2207] Support {-y} in tile layer urls (Fixes #4284)
        
        ---
         src/layer/tile/TileLayer.js | 5 ++++-
         1 file changed, 4 insertions(+), 1 deletion(-)
        
        diff --git a/src/layer/tile/TileLayer.js b/src/layer/tile/TileLayer.js
        index 4f43a583c00..5b166b94f25 100644
        --- a/src/layer/tile/TileLayer.js
        +++ b/src/layer/tile/TileLayer.js
        @@ -75,11 +75,14 @@ L.TileLayer = L.GridLayer.extend({
         	},
         
         	getTileUrl: function (coords) {
        +		var invertedY = this._globalTileRange.max.y - coords.y;
        +
         		return L.Util.template(this._url, L.extend({
         			r: L.Browser.retina ? '@2x' : '',
         			s: this._getSubdomain(coords),
         			x: coords.x,
        -			y: this.options.tms ? this._globalTileRange.max.y - coords.y : coords.y,
        +			y: this.options.tms ? invertedY : coords.y,
        +			'-y': invertedY,
         			z: this._getZoomForUrl()
         		}, this.options));
         	},
        
        From d420e5eda82a0a4753da05df5e1404a4e0096c40 Mon Sep 17 00:00:00 2001
        From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= 
        Date: Sun, 20 Mar 2016 21:18:46 +0100
        Subject: [PATCH 2091/2207] prosthetic-hand blog post
        
        ---
         ...2016-03-20-debugging-touch-interactions.md | 101 ++++++++++++++++++
         .../2016-03-20-prosthetic-hand-zooming.gif    | Bin 0 -> 3913380 bytes
         2 files changed, 101 insertions(+)
         create mode 100644 _posts/2016-03-20-debugging-touch-interactions.md
         create mode 100644 docs/images/2016-03-20-prosthetic-hand-zooming.gif
        
        diff --git a/_posts/2016-03-20-debugging-touch-interactions.md b/_posts/2016-03-20-debugging-touch-interactions.md
        new file mode 100644
        index 00000000000..3282e7bf639
        --- /dev/null
        +++ b/_posts/2016-03-20-debugging-touch-interactions.md
        @@ -0,0 +1,101 @@
        +---
        +layout: post
        +title: Debugging touch interactions
        +description: To debug Leaflet, sometimes you need to create a new tool.
        +author: Iván Sánchez
        +authorsite: http://ivan.sanchezortega.es
        +---
        +
        +
        +Most of the time, fixing bugs in the Leaflet code is a breeze. The code is simple, easy to read (for the most part) and well structured. Code conventions and unit tests make it easy for newcomers to try some modifications to the core code. During the past few months we've sent a few simple bug reports to the folks at [Your First PR](https://yourfirstpr.github.io/) - we love to see first-timers contributing fixes to Leaflet!
        +
        +
        +Some of the difficulties of maintaining/developing a javascript library like Leaflet is making sure that everything works on every major browser out there. A technique that works on Firefox on a Ubuntu desktop might result in glitches in Safari on a Macbook; something that works in Edge on Windows 10 might break completely in Chrome on Android.
        +
        +Fortunately, all of the browser-specific hacks in Leaflet can be easily seen by looking at the [references to `L.Browser`](https://github.com/search?q=Browser+repo%3ALeaflet%2FLeaflet+language%3AJavaScript+extension%3Ajs+path%3A%2Fsrc&ref=searchresults&type=Code&utf8=%E2%9C%93) in the code.
        +
        +This can lead to somewhat [undesirable code](https://github.com/Leaflet/Leaflet/blob/master/src/dom/DomEvent.DoubleTap.js#L65) sometimes:
        +
        +
            // On some platforms (notably, chrome on win10 + touchscreen + mouse),
        +    // the browser doesn't fire touchend/pointerup events but does fire
        +    // native dblclicks. See #4127.
        +    if (!L.Browser.edge) {
        +    	obj.addEventListener('dblclick', handler, false);
        +    }
        +
        + +I've been told more than a few times by browser developers that browser sniffing is wrong, and that feature detection is right. I mean, detecting 3D CSS transforms and HTML5 `